diff --git a/TrackPropagation/Geant4e/test/BuildFile.xml b/TrackPropagation/Geant4e/test/BuildFile.xml index bbb8d20816632..64fc209e94979 100644 --- a/TrackPropagation/Geant4e/test/BuildFile.xml +++ b/TrackPropagation/Geant4e/test/BuildFile.xml @@ -11,7 +11,7 @@ - + diff --git a/TrackPropagation/Geant4e/test/SimpleGeant4ePropagatorTest.cc b/TrackPropagation/Geant4e/test/SimpleGeant4ePropagatorTest.cc new file mode 100644 index 0000000000000..cf41917dff3d8 --- /dev/null +++ b/TrackPropagation/Geant4e/test/SimpleGeant4ePropagatorTest.cc @@ -0,0 +1,137 @@ +#include "FWCore/Framework/interface/one/EDAnalyzer.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/MakerMacros.h" //For define_fwk_module + +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/InputTag.h" + +//- Timing +//#include "Utilities/Timing/interface/TimingReport.h" + +#include "Geometry/Records/interface/IdealGeometryRecord.h" + +//- Magnetic field +#include "MagneticField/Engine/interface/MagneticField.h" +#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" +#include "SimG4Core/MagneticField/interface/Field.h" +#include "SimG4Core/MagneticField/interface/FieldBuilder.h" + +//- Propagator +#include "TrackPropagation/Geant4e/interface/ConvertFromToCLHEP.h" +#include "TrackPropagation/Geant4e/interface/Geant4ePropagator.h" +#include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h" +#include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h" + +#include "DataFormats/GeometryVector/interface/GlobalPoint.h" +#include "DataFormats/GeometryVector/interface/GlobalVector.h" +#include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h" +#include "MagneticField/VolumeGeometry/interface/MagVolumeOutsideValidity.h" +#include "DataFormats/GeometrySurface/interface/PlaneBuilder.h" + +//- Geant4 +#include "G4TransportationManager.hh" + +class SimpleGeant4ePropagatorTest final : public edm::one::EDAnalyzer<> { +public: + explicit SimpleGeant4ePropagatorTest(const edm::ParameterSet &); + ~SimpleGeant4ePropagatorTest() override {} + + void analyze(const edm::Event &, const edm::EventSetup &) override; + +protected: + // tokens + const edm::ESGetToken magFieldToken; + + Propagator *thePropagator; +}; + +SimpleGeant4ePropagatorTest::SimpleGeant4ePropagatorTest(const edm::ParameterSet &iConfig) + : magFieldToken(esConsumes()), thePropagator(nullptr) {} + +namespace { + Surface::RotationType rotation(const GlobalVector &zDir) { + GlobalVector zAxis = zDir.unit(); + GlobalVector yAxis(zAxis.y(), -zAxis.x(), 0); + GlobalVector xAxis = yAxis.cross(zAxis); + return Surface::RotationType(xAxis, yAxis, zAxis); + } +} // namespace + +void SimpleGeant4ePropagatorTest::analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) { + using namespace edm; + + std::cout << "Starting G4e test..." << std::endl; + + /////////////////////////////////////// + // Construct Magnetic Field + const ESHandle bField = iSetup.getHandle(magFieldToken); + if (bField.isValid()) + std::cout << "G4e -- Magnetic field is valid. Value in (0,0,0): " << bField->inTesla(GlobalPoint(0, 0, 0)).mag() + << " Tesla " << std::endl; + else + LogError("Geant4e") << "G4e -- NO valid Magnetic field" << std::endl; + + // Initialise the propagator + if (!thePropagator) + thePropagator = new Geant4ePropagator(bField.product()); + + if (thePropagator) + std::cout << "Propagator built!" << std::endl; + else + LogError("Geant4e") << "Could not build propagator!" << std::endl; + + GlobalVector p3T(10., 10., 2.); + std::cout << "*** Phi (rad): " << p3T.phi() << " - Phi(deg)" << p3T.phi().degrees(); + std::cout << "Track P.: " << p3T << "\nTrack P.: PT=" << p3T.perp() << "\tEta=" << p3T.eta() + << "\tPhi=" << p3T.phi().degrees() << "--> Rad: Phi=" << p3T.phi() << std::endl; + + GlobalPoint r3T(0., 0., 0.); + std::cout << "Init point: " << r3T << "\nInit point Ro=" << r3T.perp() << "\tEta=" << r3T.eta() + << "\tPhi=" << r3T.phi().degrees() << std::endl; + + //- Charge + int charge = 1; + std::cout << "Track charge = " << charge << std::endl; + + //- Initial covariance matrix is unity 10-6 + ROOT::Math::SMatrixIdentity id; + AlgebraicSymMatrix55 C(id); + C *= 0.01; + CurvilinearTrajectoryError covT(C); + + PlaneBuilder pb; + Surface::RotationType rot = rotation(p3T); + // Define end planes + for (float d = 50.; d < 700.; d += 50.) { + float propDistance = d; // 100 cm + std::cout << "G4e -- Extrapolatation distance " << d << " cm" << std::endl; + GlobalPoint targetPos = r3T + propDistance * p3T.unit(); + auto endPlane = pb.plane(targetPos, rot); + + //- Build FreeTrajectoryState + GlobalTrajectoryParameters trackPars(r3T, p3T, charge, &*bField); + FreeTrajectoryState ftsTrack(trackPars, covT); + + // Propagate: Need to explicetely + TrajectoryStateOnSurface tSOSDest = thePropagator->propagate(ftsTrack, *endPlane); + if (!tSOSDest.isValid()) { + std::cout << "TSOS not valid? Propagation failed...." << std::endl; + continue; + } + + auto posExtrap = tSOSDest.freeState()->position(); + auto momExtrap = tSOSDest.freeState()->momentum(); + std::cout << "G4e -- Extrapolated position:" << posExtrap << " cm\n" + << "G4e -- (Rho, eta, phi): (" << posExtrap.perp() << " cm, " << posExtrap.eta() << ", " + << posExtrap.phi() << ')' << std::endl; + std::cout << "G4e -- Extrapolated momentum:" << momExtrap << " GeV\n" + << "G4e -- (pt, eta, phi): (" << momExtrap.perp() << " cm, " << momExtrap.eta() << ", " + << momExtrap.phi() << ')' << std::endl; + } +} + +// define this as a plug-in +DEFINE_FWK_MODULE(SimpleGeant4ePropagatorTest); diff --git a/TrackPropagation/Geant4e/test/simpleTestPropagator_cfg.py b/TrackPropagation/Geant4e/test/simpleTestPropagator_cfg.py new file mode 100644 index 0000000000000..1e3fff012cfb0 --- /dev/null +++ b/TrackPropagation/Geant4e/test/simpleTestPropagator_cfg.py @@ -0,0 +1,107 @@ +import FWCore.ParameterSet.Config as cms + +from Configuration.Eras.Era_Run3_cff import Run3 + +#process = cms.Process("PROPAGATORTEST") +process = cms.Process("PROPAGATORTEST",Run3) + + + + ##################################################################### + # Message Logger #################################################### + # +process.load("FWCore.MessageService.MessageLogger_cfi") +process.load('Configuration.StandardSequences.Services_cff') +process.load('Configuration.StandardSequences.GeometryDB_cff') +process.load("Configuration.EventContent.EventContent_cff") +process.load("Configuration.StandardSequences.Reconstruction_cff") +process.load('Configuration.StandardSequences.MagneticField_38T_cff') +process.load('Configuration.StandardSequences.EndOfProcess_cff') +process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") + +from Configuration.AlCa.GlobalTag import GlobalTag +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run1_mc', '') +process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2022_realistic', '') + +process.load("FWCore.MessageService.MessageLogger_cfi") + +# MessageLogger customizations +process.MessageLogger.cerr.enable = False +process.MessageLogger.cout.enable = True +labels = ["propTest", "geopro"] # Python module's label +messageLogger = dict() +for category in labels: + main_key = '%sMessageLogger'%(category) + category_key = 'Geant4e' # C++ EDProducer type + messageLogger[main_key] = dict( + filename = '%s_%s.log' % ("debugG4e", category), + threshold = 'DEBUG', + default = dict(limit=0) + ) + messageLogger[main_key][category_key] = dict(limit=-1) + # First create defaults + setattr(process.MessageLogger.files, category, dict()) + # Then modify them + setattr(process.MessageLogger.files, category, messageLogger[main_key]) + +process.source = cms.Source("EmptySource") +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(1) +) + +## Set up geometry +process.geopro = cms.EDProducer("GeometryProducer", + GeoFromDD4hep= cms.bool(True), +# GeoFromDD4hep= cms.bool(False), + UseMagneticField = cms.bool(True), + UseSensitiveDetectors = cms.bool(False), + MagneticField = cms.PSet( + UseLocalMagFieldManager = cms.bool(False), + Verbosity = cms.bool(False), + ConfGlobalMFM = cms.PSet( + Volume = cms.string('OCMS'), + OCMS = cms.PSet( + Stepper = cms.string('G4TDormandPrince45'), + Type = cms.string('CMSIMField'), + StepperParam = cms.PSet( + VacRegions = cms.vstring(), +# VacRegions = cms.vstring('DefaultRegionForTheWorld','BeamPipeVacuum','BeamPipeOutside'), + EnergyThTracker = cms.double(0.2), ## in GeV + RmaxTracker = cms.double(8000), ## in mm + ZmaxTracker = cms.double(11000), ## in mm + MaximumEpsilonStep = cms.untracked.double(0.01), + DeltaOneStep = cms.double(0.001), ## in mm + DeltaOneStepTracker = cms.double(1e-4),## in mm + MaximumLoopCounts = cms.untracked.double(1000.0), + DeltaChord = cms.double(0.002), ## in mm + DeltaChordTracker = cms.double(0.001), ## in mm + MinStep = cms.double(0.1), ## in mm + DeltaIntersectionAndOneStep = cms.untracked.double(-1.0), + DeltaIntersection = cms.double(0.0001), ## in mm + DeltaIntersectionTracker = cms.double(1e-6),## in mm + MaxStep = cms.double(150.), ## in cm + MinimumEpsilonStep = cms.untracked.double(1e-05), + EnergyThSimple = cms.double(0.015), ## in GeV + DeltaChordSimple = cms.double(0.1), ## in mm + DeltaOneStepSimple = cms.double(0.1), ## in mm + DeltaIntersectionSimple = cms.double(0.01), ## in mm + MaxStepSimple = cms.double(50.), ## in cm + ) + ) + ), + delta = cms.double(1.0) + ), + ) + + + + + ##################################################################### + # Extrapolator ###################################################### + # +process.propTest = cms.EDAnalyzer("SimpleGeant4ePropagatorTest", +) + + +process.g4TestPath = cms.Path( process.geopro*process.propTest ) +process.schedule = cms.Schedule( process.g4TestPath )