CMS 3D CMS Logo

List of all members | Public Member Functions | Private Types | Private Member Functions | Private Attributes
Geant4ePropagator Class Reference

#include <Geant4ePropagator.h>

Inheritance diagram for Geant4ePropagator:
Propagator

Public Member Functions

Geant4ePropagatorclone () const override
 
 Geant4ePropagator (const MagneticField *field=nullptr, std::string particleName="mu", PropagationDirection dir=alongMomentum)
 
const MagneticFieldmagneticField () const override
 
std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const FreeTrajectoryState &, const Cylinder &) const override
 
std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const FreeTrajectoryState &, const Plane &) const override
 
std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const TrajectoryStateOnSurface &, const Cylinder &) const override
 
std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const TrajectoryStateOnSurface &, const Plane &) const override
 
 ~Geant4ePropagator () override
 
- Public Member Functions inherited from Propagator
virtual FreeTrajectoryState propagate (const FreeTrajectoryState &ftsStart, const GlobalPoint &pDest) const final
 
virtual FreeTrajectoryState propagate (const FreeTrajectoryState &ftsStart, const GlobalPoint &pDest1, const GlobalPoint &pDest2) const final
 
virtual FreeTrajectoryState propagate (const FreeTrajectoryState &ftsStart, const reco::BeamSpot &beamSpot) const final
 
template<typename STA , typename SUR >
TrajectoryStateOnSurface propagate (STA const &state, SUR const &surface) const
 
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const FreeTrajectoryState &, const Surface &) const final
 
virtual std::pair< FreeTrajectoryState, double > propagateWithPath (const FreeTrajectoryState &ftsStart, const GlobalPoint &pDest) const
 
virtual std::pair< FreeTrajectoryState, double > propagateWithPath (const FreeTrajectoryState &ftsStart, const GlobalPoint &pDest1, const GlobalPoint &pDest2) const
 Propagate to PCA to a line (given by 2 points) given a starting point. More...
 
virtual std::pair< FreeTrajectoryState, double > propagateWithPath (const FreeTrajectoryState &ftsStart, const reco::BeamSpot &beamSpot) const
 Propagate to PCA to a line (given by beamSpot position and slope) given a starting point. More...
 
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const TrajectoryStateOnSurface &tsos, const Surface &sur) const final
 
virtual PropagationDirection propagationDirection () const final
 
 Propagator (PropagationDirection dir=alongMomentum)
 
virtual bool setMaxDirectionChange (float phiMax)
 
virtual void setPropagationDirection (PropagationDirection dir)
 
virtual ~Propagator ()
 

Private Types

typedef std::pair< bool, std::shared_ptr< G4ErrorTarget > > ErrorTargetPair
 
typedef std::pair< TrajectoryStateOnSurface, double > TsosPP
 

Private Member Functions

template<>
bool configureAnyPropagation (G4ErrorMode &mode, Cylinder const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
 
template<>
bool configureAnyPropagation (G4ErrorMode &mode, Plane const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
 
template<class SurfaceType >
bool configureAnyPropagation (G4ErrorMode &mode, SurfaceType const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
 
template<class SurfaceType >
bool configurePropagation (G4ErrorMode &mode, SurfaceType const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
 
void debugReportPlaneSetup (GlobalPoint const &posPlane, HepGeom::Point3D< double > const &surfPos, GlobalVector const &normalPlane, HepGeom::Normal3D< double > const &surfNorm, const Plane &pDest) const
 
template<class SurfaceType >
void debugReportTrackState (std::string const &currentContext, GlobalPoint const &cmsInitPos, CLHEP::Hep3Vector const &g4InitPos, GlobalVector const &cmsInitMom, CLHEP::Hep3Vector const &g4InitMom, const SurfaceType &pDest) const
 
void ensureGeant4eIsInitilized (bool forceInit) const
 
std::string generateParticleName (int charge) const
 
template<>
std::string getSurfaceType (Cylinder const &c) const
 
template<>
std::string getSurfaceType (Plane const &c) const
 
template<class SurfaceType >
std::string getSurfaceType (SurfaceType const &surface) const
 
template<class SurfaceType >
std::pair< TrajectoryStateOnSurface, double > propagateGeneric (const FreeTrajectoryState &ftsStart, const SurfaceType &pDest) const
 
template<>
Geant4ePropagator::ErrorTargetPair transformToG4SurfaceTarget (const Cylinder &pDest, bool moveTargetToEndOfSurface) const
 
template<>
Geant4ePropagator::ErrorTargetPair transformToG4SurfaceTarget (const Plane &pDest, bool moveTargetToEndOfSurface) const
 
template<class SurfaceType >
ErrorTargetPair transformToG4SurfaceTarget (const SurfaceType &pDest, bool moveTargetToEndOfSurface) const
 

Private Attributes

const MagneticFieldtheField
 
G4ErrorPropagatorData * theG4eData
 
G4ErrorPropagatorManager * theG4eManager
 
std::string theParticleName
 

Detailed Description

Propagator based on the Geant4e package. Uses the Propagator class in the TrackingTools/GeomPropagators package to define the interface. See that class for more details.

Definition at line 20 of file Geant4ePropagator.h.

Member Typedef Documentation

◆ ErrorTargetPair

typedef std::pair<bool, std::shared_ptr<G4ErrorTarget> > Geant4ePropagator::ErrorTargetPair
private

Definition at line 83 of file Geant4ePropagator.h.

◆ TsosPP

typedef std::pair<TrajectoryStateOnSurface, double> Geant4ePropagator::TsosPP
private

Definition at line 82 of file Geant4ePropagator.h.

Constructor & Destructor Documentation

◆ Geant4ePropagator()

Geant4ePropagator::Geant4ePropagator ( const MagneticField field = nullptr,
std::string  particleName = "mu",
PropagationDirection  dir = alongMomentum 
)

Constructor. Takes as arguments:

  • The magnetic field
  • The particle name whose properties will be used in the propagation. Without the charge, i.e. "mu", "pi", ...
  • The propagation direction. It may be: alongMomentum, oppositeToMomentum

Constructor.

Definition at line 39 of file Geant4ePropagator.cc.

40  : Propagator(dir),
41  theField(field),
43  theG4eManager(G4ErrorPropagatorManager::GetErrorPropagatorManager()),
44  theG4eData(G4ErrorPropagatorData::GetErrorPropagatorData()) {
45  LogDebug("Geant4e") << "Geant4e Propagator initialized";
46 
47  // has to be called here, doing it later will not load the G4 physics list
48  // properly when using the G4 ES Producer. Reason: unclear
50 }

References ensureGeant4eIsInitilized(), and LogDebug.

Referenced by clone().

◆ ~Geant4ePropagator()

Geant4ePropagator::~Geant4ePropagator ( )
override

Destructor.

Definition at line 54 of file Geant4ePropagator.cc.

54  {
55  LogDebug("Geant4e") << "Geant4ePropagator::~Geant4ePropagator()" << std::endl;
56 
57  // don't close the g4 Geometry here, because the propagator might have been
58  // cloned
59  // but there is only one, globally-shared Geometry
60 }

References LogDebug.

Member Function Documentation

◆ clone()

Geant4ePropagator* Geant4ePropagator::clone ( void  ) const
inlineoverridevirtual

Implements Propagator.

Definition at line 77 of file Geant4ePropagator.h.

77 { return new Geant4ePropagator(*this); }

References Geant4ePropagator().

◆ configureAnyPropagation() [1/3]

template<>
bool Geant4ePropagator::configureAnyPropagation ( G4ErrorMode &  mode,
Cylinder const &  pDest,
GlobalPoint const &  cmsInitPos,
GlobalVector const &  cmsInitMom 
) const
private

Definition at line 180 of file Geant4ePropagator.cc.

183  {
184  //------------------------------------
185  // For cylinder assume outside is backwards, inside is along
186  // General use for particles from collisions
187  LocalPoint lpos = pDest.toLocal(cmsInitPos);
188  Surface::Side theSide = pDest.side(lpos, 0);
189  if (theSide == SurfaceOrientation::positiveSide) { // outside cylinder
190  mode = G4ErrorMode_PropBackwards;
191  LogDebug("Geant4e") << "G4e - Propagator mode is \'backwards\' indirect "
192  "via the Any direction";
193  } else { // inside cylinder
194  mode = G4ErrorMode_PropForwards;
195  LogDebug("Geant4e") << "G4e - Propagator mode is \'forwards\' indirect "
196  "via the Any direction";
197  }
198 
199  return true;
200 }

References LogDebug, ALCARECOPromptCalibProdSiPixelAli0T_cff::mode, SurfaceOrientation::positiveSide, Cylinder::side(), and GloballyPositioned< T >::toLocal().

◆ configureAnyPropagation() [2/3]

template<>
bool Geant4ePropagator::configureAnyPropagation ( G4ErrorMode &  mode,
Plane const &  pDest,
GlobalPoint const &  cmsInitPos,
GlobalVector const &  cmsInitMom 
) const
private

Definition at line 160 of file Geant4ePropagator.cc.

163  {
164  if (pDest.localZ(cmsInitPos) * pDest.localZ(cmsInitMom) < 0) {
165  mode = G4ErrorMode_PropForwards;
166  LogDebug("Geant4e") << "G4e - Propagator mode is \'forwards\' indirect "
167  "via the Any direction"
168  << std::endl;
169  } else {
170  mode = G4ErrorMode_PropBackwards;
171  LogDebug("Geant4e") << "G4e - Propagator mode is \'backwards\' indirect "
172  "via the Any direction"
173  << std::endl;
174  }
175 
176  return true;
177 }

References Plane::localZ(), LogDebug, and ALCARECOPromptCalibProdSiPixelAli0T_cff::mode.

◆ configureAnyPropagation() [3/3]

template<class SurfaceType >
bool Geant4ePropagator::configureAnyPropagation ( G4ErrorMode &  mode,
SurfaceType const &  pDest,
GlobalPoint const &  cmsInitPos,
GlobalVector const &  cmsInitMom 
) const
private

Referenced by configurePropagation().

◆ configurePropagation()

template<class SurfaceType >
bool Geant4ePropagator::configurePropagation ( G4ErrorMode &  mode,
SurfaceType const &  pDest,
GlobalPoint const &  cmsInitPos,
GlobalVector const &  cmsInitMom 
) const
private

Definition at line 203 of file Geant4ePropagator.cc.

206  {
208  mode = G4ErrorMode_PropBackwards;
209  LogDebug("Geant4e") << "G4e - Propagator mode is \'backwards\' " << std::endl;
210  } else if (propagationDirection() == alongMomentum) {
211  mode = G4ErrorMode_PropForwards;
212  LogDebug("Geant4e") << "G4e - Propagator mode is \'forwards\'" << std::endl;
213  } else if (propagationDirection() == anyDirection) {
214  if (configureAnyPropagation(mode, pDest, cmsInitPos, cmsInitMom) == false)
215  return false;
216  } else {
217  edm::LogError("Geant4e") << "G4e - Unsupported propagation mode";
218  return false;
219  }
220  return true;
221 }

References alongMomentum, anyDirection, configureAnyPropagation(), LogDebug, ALCARECOPromptCalibProdSiPixelAli0T_cff::mode, oppositeToMomentum, and Propagator::propagationDirection().

Referenced by propagateGeneric().

◆ debugReportPlaneSetup()

void Geant4ePropagator::debugReportPlaneSetup ( GlobalPoint const &  posPlane,
HepGeom::Point3D< double > const &  surfPos,
GlobalVector const &  normalPlane,
HepGeom::Normal3D< double > const &  surfNorm,
const Plane pDest 
) const
private

Definition at line 442 of file Geant4ePropagator.cc.

446  {
447  LogDebug("Geant4e") << "G4e - Destination CMS plane position:" << posPlane << "cm\n"
448  << "G4e - (Ro, eta, phi): (" << posPlane.perp() << " cm, " << posPlane.eta()
449  << ", " << posPlane.phi().degrees() << " deg)\n"
450  << "G4e - Destination G4 plane position: " << surfPos << " mm, Ro = " << surfPos.perp()
451  << " mm";
452  LogDebug("Geant4e") << "G4e - Destination CMS plane normal : " << normalPlane << "\n"
453  << "G4e - Destination G4 plane normal : " << normalPlane;
454  LogDebug("Geant4e") << "G4e - Distance from plane position to plane: " << pDest.localZ(posPlane) << " cm";
455 }

References Geom::Phi< T1, Range >::degrees(), PV3DBase< T, PVType, FrameType >::eta(), Plane::localZ(), LogDebug, PV3DBase< T, PVType, FrameType >::perp(), and PV3DBase< T, PVType, FrameType >::phi().

◆ debugReportTrackState()

template<class SurfaceType >
void Geant4ePropagator::debugReportTrackState ( std::string const &  currentContext,
GlobalPoint const &  cmsInitPos,
CLHEP::Hep3Vector const &  g4InitPos,
GlobalVector const &  cmsInitMom,
CLHEP::Hep3Vector const &  g4InitMom,
const SurfaceType &  pDest 
) const
private

Definition at line 458 of file Geant4ePropagator.cc.

463  {
464  LogDebug("Geant4e") << "G3 -- Current Context: " << currentContext;
465  LogDebug("Geant4e") << "G4e - CMS point position:" << cmsInitPos << "cm\n"
466  << "G4e - (Ro, eta, phi): (" << cmsInitPos.perp() << " cm, " << cmsInitPos.eta()
467  << ", " << cmsInitPos.phi().degrees() << " deg)\n"
468  << "G4e - G4 point position: " << g4InitPos << " mm, Ro = " << g4InitPos.perp() << " mm";
469  LogDebug("Geant4e") << "G4e - CMS momentum :" << cmsInitMom << "GeV\n"
470  << " pt: " << cmsInitMom.perp() << "G4e - G4 momentum : " << g4InitMom << " MeV";
471 }

References Geom::Phi< T1, Range >::degrees(), PV3DBase< T, PVType, FrameType >::eta(), LogDebug, PV3DBase< T, PVType, FrameType >::perp(), and PV3DBase< T, PVType, FrameType >::phi().

Referenced by propagateGeneric().

◆ ensureGeant4eIsInitilized()

void Geant4ePropagator::ensureGeant4eIsInitilized ( bool  forceInit) const
private

Propagate from a free state (e.g. position and momentum in in global cartesian coordinates) to a plane.

Definition at line 70 of file Geant4ePropagator.cc.

70  {
71  LogDebug("Geant4e") << "ensureGeant4eIsInitilized called" << std::endl;
72  if ((G4ErrorPropagatorData::GetErrorPropagatorData()->GetState() == G4ErrorState_PreInit) || forceInit) {
73  LogDebug("Geant4e") << "Initializing G4 propagator" << std::endl;
74 
75  G4UImanager::GetUIpointer()->ApplyCommand("/exerror/setField -10. kilogauss");
76 
77  theG4eManager->InitGeant4e();
78 
79  const G4Field *field = G4TransportationManager::GetTransportationManager()->GetFieldManager()->GetDetectorField();
80  if (field == nullptr) {
81  edm::LogError("Geant4e") << "No G4 magnetic field defined";
82  }
83  LogDebug("Geant4e") << "G4 propagator initialized" << std::endl;
84  } else {
85  LogDebug("Geant4e") << "G4 not in preinit state: " << G4ErrorPropagatorData::GetErrorPropagatorData()->GetState()
86  << std::endl;
87  }
88 
89  // example code uses
90  // G4UImanager::GetUIpointer()->ApplyCommand("/geant4e/limits/stepLength 100
91  // mm");
92  G4UImanager::GetUIpointer()->ApplyCommand("/geant4e/limits/stepLength 10.0 mm");
93 }

References LogDebug, and theG4eManager.

Referenced by Geant4ePropagator().

◆ generateParticleName()

std::string Geant4ePropagator::generateParticleName ( int  charge) const
private

Definition at line 144 of file Geant4ePropagator.cc.

144  {
146 
147  if (charge > 0) {
148  particleName += "+";
149  }
150  if (charge < 0) {
151  particleName += "-";
152  }
153 
154  LogDebug("Geant4e") << "G4e - Particle name: " << particleName;
155 
156  return particleName;
157 }

References ALCARECOTkAlJpsiMuMu_cff::charge, LogDebug, HiggsValidation_cfi::particleName, AlCaHLTBitMon_QueryRunRegistry::string, and theParticleName.

Referenced by propagateGeneric().

◆ getSurfaceType() [1/3]

template<>
std::string Geant4ePropagator::getSurfaceType ( Cylinder const &  c) const
private

Definition at line 135 of file Geant4ePropagator.cc.

135  {
136  return "Cylinder";
137 }

◆ getSurfaceType() [2/3]

template<>
std::string Geant4ePropagator::getSurfaceType ( Plane const &  c) const
private

Definition at line 140 of file Geant4ePropagator.cc.

140  {
141  return "Plane";
142 }

◆ getSurfaceType() [3/3]

template<class SurfaceType >
std::string Geant4ePropagator::getSurfaceType ( SurfaceType const &  surface) const
private

◆ magneticField()

const MagneticField* Geant4ePropagator::magneticField ( ) const
inlineoverridevirtual

Implements Propagator.

Definition at line 79 of file Geant4ePropagator.h.

79 { return theField; }

References theField.

◆ propagateGeneric()

template<class SurfaceType >
std::pair< TrajectoryStateOnSurface, double > Geant4ePropagator::propagateGeneric ( const FreeTrajectoryState ftsStart,
const SurfaceType &  pDest 
) const
private

Definition at line 224 of file Geant4ePropagator.cc.

225  {
227  // Construct the target surface
228  //
229  //* Set the target surface
230 
231  ErrorTargetPair g4eTarget_center = transformToG4SurfaceTarget(pDest, false);
232 
233  // * Get the starting point and direction and convert them to
234  // CLHEP::Hep3Vector
235  // for G4. CMS uses cm and GeV while Geant4 uses mm and MeV
236  GlobalPoint cmsInitPos = ftsStart.position();
237  GlobalVector cmsInitMom = ftsStart.momentum();
238  bool flipped = false;
240  // flip the momentum vector as Geant4 will not do this
241  // on it's own in a backward propagation
242  cmsInitMom = -cmsInitMom;
243  flipped = true;
244  }
245 
246  // Set the mode of propagation according to the propagation direction
247  G4ErrorMode mode = G4ErrorMode_PropForwards;
248  if (!configurePropagation(mode, pDest, cmsInitPos, cmsInitMom))
249  return TsosPP(TrajectoryStateOnSurface(), 0.0f);
250 
251  // re-check propagation direction chosen in case of AnyDirection
252  if (mode == G4ErrorMode_PropBackwards && !flipped)
253  cmsInitMom = -cmsInitMom;
254 
255  CLHEP::Hep3Vector g4InitPos = TrackPropagation::globalPointToHep3Vector(cmsInitPos);
256  CLHEP::Hep3Vector g4InitMom = TrackPropagation::globalVectorToHep3Vector(cmsInitMom * GeV);
257 
258  debugReportTrackState("intitial", cmsInitPos, g4InitPos, cmsInitMom, g4InitMom, pDest);
259 
260  // Set the mode of propagation according to the propagation direction
261  // G4ErrorMode mode = G4ErrorMode_PropForwards;
262 
263  // if (!configurePropagation(mode, pDest, cmsInitPos, cmsInitMom))
264  // return TsosPP(TrajectoryStateOnSurface(), 0.0f);
265 
267  // Set the error and trajectories, and finally propagate
268  //
269  G4ErrorTrajErr g4error(5, 1);
270  if (ftsStart.hasError()) {
272  initErr = ftsStart.curvilinearError();
273  g4error = TrackPropagation::algebraicSymMatrix55ToG4ErrorTrajErr(initErr, ftsStart.charge());
274  LogDebug("Geant4e") << "CMS - Error matrix: " << std::endl << initErr.matrix();
275  } else {
276  LogDebug("Geant4e") << "No error matrix available" << std::endl;
277  return TsosPP(TrajectoryStateOnSurface(), 0.0f);
278  }
279 
280  LogDebug("Geant4e") << "G4e - Error matrix: " << std::endl << g4error;
281 
282  // in CMSSW, the state errors are deflated when performing the backward
283  // propagation
284  if (mode == G4ErrorMode_PropForwards) {
285  G4ErrorPropagatorData::GetErrorPropagatorData()->SetStage(G4ErrorStage_Inflation);
286  } else if (mode == G4ErrorMode_PropBackwards) {
287  G4ErrorPropagatorData::GetErrorPropagatorData()->SetStage(G4ErrorStage_Deflation);
288  }
289 
290  G4ErrorFreeTrajState g4eTrajState(generateParticleName(ftsStart.charge()), g4InitPos, g4InitMom, g4error);
291  LogDebug("Geant4e") << "G4e - Traj. State: " << (g4eTrajState);
292 
294  // Propagate
295  int iterations = 0;
296  double finalPathLength = 0;
297 
298  HepGeom::Point3D<double> finalRecoPos;
299 
300  G4ErrorPropagatorData::GetErrorPropagatorData()->SetMode(mode);
301 
302  theG4eData->SetTarget(g4eTarget_center.second.get());
303  LogDebug("Geant4e") << "Running Propagation to the RECO surface" << std::endl;
304 
305  theG4eManager->InitTrackPropagation();
306 
307  bool continuePropagation = true;
308  while (continuePropagation) {
309  iterations++;
310  LogDebug("Geant4e") << std::endl << "step count " << iterations << " step length " << finalPathLength;
311 
312  const int ierr = theG4eManager->PropagateOneStep(&g4eTrajState, mode);
313 
314  if (ierr != 0) {
315  // propagation failed, return invalid track state
316  return TsosPP(TrajectoryStateOnSurface(), 0.0f);
317  }
318 
319  const float thisPathLength = TrackPropagation::g4doubleToCmsDouble(g4eTrajState.GetG4Track()->GetStepLength());
320 
321  LogDebug("Geant4e") << "step Length was " << thisPathLength << " cm, current global position: "
322  << TrackPropagation::hepPoint3DToGlobalPoint(g4eTrajState.GetPosition()) << std::endl;
323 
324  finalPathLength += thisPathLength;
325 
326  // if (std::fabs(finalPathLength) > 10000.0f)
327  if (std::fabs(finalPathLength) > 200.0f) {
328  LogDebug("Geant4e") << "ERROR: Quitting propagation: path length mega large" << std::endl;
329  theG4eManager->GetPropagator()->InvokePostUserTrackingAction(g4eTrajState.GetG4Track());
330  continuePropagation = false;
331  LogDebug("Geant4e") << "WARNING: Quitting propagation: max path length "
332  "exceeded, returning invalid state"
333  << std::endl;
334 
335  // reached maximum path length, bail out
336  return TsosPP(TrajectoryStateOnSurface(), 0.0f);
337  }
338 
339  if (theG4eManager->GetPropagator()->CheckIfLastStep(g4eTrajState.GetG4Track())) {
340  theG4eManager->GetPropagator()->InvokePostUserTrackingAction(g4eTrajState.GetG4Track());
341  continuePropagation = false;
342  }
343  }
344 
345  // CMSSW Tracking convention, backward propagations have negative path length
347  finalPathLength = -finalPathLength;
348 
349  // store the correct location for the hit on the RECO surface
350  LogDebug("Geant4e") << "Position on the RECO surface" << g4eTrajState.GetPosition() << std::endl;
351  finalRecoPos = g4eTrajState.GetPosition();
352 
353  theG4eManager->EventTermination();
354 
355  LogDebug("Geant4e") << "Final position of the Track :" << g4eTrajState.GetPosition() << std::endl;
356 
358  // Retrieve the state in the end from Geant4e, convert them to CMS vectors
359  // and points, and build global trajectory parameters.
360  // CMS uses cm and GeV while Geant4 uses mm and MeV
361  //
362  const HepGeom::Vector3D<double> momEnd = g4eTrajState.GetMomentum();
363 
364  // use the hit on the the RECO plane as the final position to be d'accor with
365  // the RecHit measurements
366  const GlobalPoint posEndGV = TrackPropagation::hepPoint3DToGlobalPoint(finalRecoPos);
368 
369  debugReportTrackState("final", posEndGV, finalRecoPos, momEndGV, momEnd, pDest);
370 
371  // Get the error covariance matrix from Geant4e. It comes in curvilinear
372  // coordinates so use the appropiate CMS class
373  G4ErrorTrajErr g4errorEnd = g4eTrajState.GetError();
374 
375  CurvilinearTrajectoryError curvError(
377 
378  if (mode == G4ErrorMode_PropBackwards) {
380  posEndGV, momEndGV, ftsStart.parameters().charge(), &ftsStart.parameters().magneticField());
381 
382  // flip the momentum direction because it has been flipped before running
383  // G4's backwards prop
384  momEndGV = -momEndGV;
385  }
386 
387  LogDebug("Geant4e") << "G4e - Error matrix after propagation: " << std::endl << g4errorEnd;
388 
389  LogDebug("Geant4e") << "CMS - Error matrix after propagation: " << std::endl << curvError.matrix();
390 
391  GlobalTrajectoryParameters tParsDest(posEndGV, momEndGV, ftsStart.charge(), theField);
392 
394 
397 
398  return TsosPP(TrajectoryStateOnSurface(tParsDest, curvError, pDest, side), finalPathLength);
399 }

References SurfaceSideDefinition::afterSurface, TrackPropagation::algebraicSymMatrix55ToG4ErrorTrajErr(), alongMomentum, SurfaceSideDefinition::beforeSurface, FreeTrajectoryState::charge(), GlobalTrajectoryParameters::charge(), configurePropagation(), FreeTrajectoryState::curvilinearError(), debugReportTrackState(), f, TrackPropagation::g4doubleToCmsDouble(), TrackPropagation::g4ErrorTrajErrToAlgebraicSymMatrix55(), generateParticleName(), GeV, TrackPropagation::globalPointToHep3Vector(), TrackPropagation::globalVectorToHep3Vector(), FreeTrajectoryState::hasError(), TrackPropagation::hep3VectorToGlobalVector(), TrackPropagation::hepPoint3DToGlobalPoint(), LogDebug, GlobalTrajectoryParameters::magneticField(), CurvilinearTrajectoryError::matrix(), ALCARECOPromptCalibProdSiPixelAli0T_cff::mode, FreeTrajectoryState::momentum(), oppositeToMomentum, FreeTrajectoryState::parameters(), FreeTrajectoryState::position(), Propagator::propagationDirection(), theField, theG4eData, theG4eManager, and transformToG4SurfaceTarget().

Referenced by propagateWithPath().

◆ propagateWithPath() [1/4]

std::pair< TrajectoryStateOnSurface, double > Geant4ePropagator::propagateWithPath ( const FreeTrajectoryState ftsStart,
const Cylinder cDest 
) const
overridevirtual

Implements Propagator.

Definition at line 419 of file Geant4ePropagator.cc.

420  {
421  // Finally build the pair<...> that needs to be returned where the second
422  // parameter is the exact path length.
423  return propagateGeneric(ftsStart, cDest);
424 }

References propagateGeneric().

◆ propagateWithPath() [2/4]

std::pair< TrajectoryStateOnSurface, double > Geant4ePropagator::propagateWithPath ( const FreeTrajectoryState ftsStart,
const Plane pDest 
) const
overridevirtual

Propagate from a free state (e.g. position and momentum in in global cartesian coordinates) to a surface. Propagate from a state on surface (e.g. position and momentum in in global cartesian coordinates associated with a layer) to a surface. The methods propagateWithPath() are identical to the corresponding methods propagate() in what concerns the resulting TrajectoryStateOnSurface, but they provide in addition the exact path length along the trajectory. All of these method calls are internally mapped to

The methods propagateWithPath() are identical to the corresponding methods propagate() in what concerns the resulting TrajectoryStateOnSurface, but they provide in addition the exact path length along the trajectory.

Implements Propagator.

Definition at line 411 of file Geant4ePropagator.cc.

412  {
413  // Finally build the pair<...> that needs to be returned where the second
414  // parameter is the exact path length. Currently calculated with a stepping
415  // action that adds up the length of every step
416  return propagateGeneric(ftsStart, pDest);
417 }

References propagateGeneric().

◆ propagateWithPath() [3/4]

std::pair< TrajectoryStateOnSurface, double > Geant4ePropagator::propagateWithPath ( const TrajectoryStateOnSurface tsosStart,
const Cylinder cDest 
) const
overridevirtual

Reimplemented from Propagator.

Definition at line 434 of file Geant4ePropagator.cc.

435  {
436  const FreeTrajectoryState ftsStart = *tsosStart.freeState();
437  // Finally build the pair<...> that needs to be returned where the second
438  // parameter is the exact path length.
439  return propagateGeneric(ftsStart, cDest);
440 }

References TrajectoryStateOnSurface::freeState(), and propagateGeneric().

◆ propagateWithPath() [4/4]

std::pair< TrajectoryStateOnSurface, double > Geant4ePropagator::propagateWithPath ( const TrajectoryStateOnSurface tsosStart,
const Plane pDest 
) const
overridevirtual

Reimplemented from Propagator.

Definition at line 426 of file Geant4ePropagator.cc.

427  {
428  // Finally build the pair<...> that needs to be returned where the second
429  // parameter is the exact path length.
430  const FreeTrajectoryState ftsStart = *tsosStart.freeState();
431  return propagateGeneric(ftsStart, pDest);
432 }

References TrajectoryStateOnSurface::freeState(), and propagateGeneric().

◆ transformToG4SurfaceTarget() [1/3]

template<>
Geant4ePropagator::ErrorTargetPair Geant4ePropagator::transformToG4SurfaceTarget ( const Cylinder pDest,
bool  moveTargetToEndOfSurface 
) const
private

Definition at line 115 of file Geant4ePropagator.cc.

116  {
117  // Get Cylinder parameters.
118  // CMS uses cm and GeV while Geant4 uses mm and MeV.
119  // - Radius
120  G4float radCyl = pDest.radius() * cm;
121  // - Position: PositionType & GlobalPoint are Basic3DPoint<float,GlobalTag>
122  G4ThreeVector posCyl = TrackPropagation::globalPointToHep3Vector(pDest.position());
123  // - Rotation: Type in CMSSW is RotationType == TkRotation<T>, T=float
124  G4RotationMatrix rotCyl = TrackPropagation::tkRotationFToHepRotation(pDest.rotation());
125 
126  // DEBUG
128  LogDebug("Geant4e") << "G4e - TkRotation" << rotation;
129  LogDebug("Geant4e") << "G4e - G4Rotation" << rotCyl << "mm";
130 
131  return ErrorTargetPair(!moveTargetToEndOfSurface, std::make_shared<G4ErrorCylSurfaceTarget>(radCyl, posCyl, rotCyl));
132 }

References TrackPropagation::globalPointToHep3Vector(), LogDebug, GloballyPositioned< T >::position(), Cylinder::radius(), idealTransformation::rotation, GloballyPositioned< T >::rotation(), and TrackPropagation::tkRotationFToHepRotation().

◆ transformToG4SurfaceTarget() [2/3]

template<>
Geant4ePropagator::ErrorTargetPair Geant4ePropagator::transformToG4SurfaceTarget ( const Plane pDest,
bool  moveTargetToEndOfSurface 
) const
private

Definition at line 96 of file Geant4ePropagator.cc.

97  {
98  //* Get position and normal (orientation) of the destination plane
99  GlobalPoint posPlane = pDest.toGlobal(LocalPoint(0, 0, 0));
100  GlobalVector normalPlane = pDest.toGlobal(LocalVector(0, 0, 1.));
101  normalPlane = normalPlane.unit();
102 
103  //* Transform this into HepGeom::Point3D<double> and
104  // HepGeom::Normal3D<double> that define a plane for
105  // Geant4e.
106  // CMS uses cm and GeV while Geant4 uses mm and MeV
107  HepGeom::Point3D<double> surfPos = TrackPropagation::globalPointToHepPoint3D(posPlane);
108  HepGeom::Normal3D<double> surfNorm = TrackPropagation::globalVectorToHepNormal3D(normalPlane);
109 
110  //* Set the target surface
111  return ErrorTargetPair(false, std::make_shared<G4ErrorPlaneSurfaceTarget>(surfNorm, surfPos));
112 }

References TrackPropagation::globalPointToHepPoint3D(), TrackPropagation::globalVectorToHepNormal3D(), Surface::toGlobal(), and Vector3DBase< T, FrameTag >::unit().

◆ transformToG4SurfaceTarget() [3/3]

template<class SurfaceType >
ErrorTargetPair Geant4ePropagator::transformToG4SurfaceTarget ( const SurfaceType &  pDest,
bool  moveTargetToEndOfSurface 
) const
private

Referenced by propagateGeneric().

Member Data Documentation

◆ theField

const MagneticField* Geant4ePropagator::theField
private

Definition at line 86 of file Geant4ePropagator.h.

Referenced by magneticField(), and propagateGeneric().

◆ theG4eData

G4ErrorPropagatorData* Geant4ePropagator::theG4eData
private

Definition at line 93 of file Geant4ePropagator.h.

Referenced by propagateGeneric().

◆ theG4eManager

G4ErrorPropagatorManager* Geant4ePropagator::theG4eManager
private

Definition at line 92 of file Geant4ePropagator.h.

Referenced by ensureGeant4eIsInitilized(), and propagateGeneric().

◆ theParticleName

std::string Geant4ePropagator::theParticleName
private

Definition at line 89 of file Geant4ePropagator.h.

Referenced by generateParticleName().

Vector3DBase
Definition: Vector3DBase.h:8
Geant4ePropagator::configurePropagation
bool configurePropagation(G4ErrorMode &mode, SurfaceType const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
Definition: Geant4ePropagator.cc:203
TkRotation< float >
FreeTrajectoryState::momentum
GlobalVector momentum() const
Definition: FreeTrajectoryState.h:68
Geant4ePropagator::transformToG4SurfaceTarget
ErrorTargetPair transformToG4SurfaceTarget(const SurfaceType &pDest, bool moveTargetToEndOfSurface) const
TrackPropagation::hep3VectorToGlobalVector
GlobalVector hep3VectorToGlobalVector(const CLHEP::Hep3Vector &p)
Definition: ConvertFromToCLHEP.h:69
anyDirection
Definition: PropagationDirection.h:4
Cylinder::radius
Scalar radius() const
Radius of the cylinder.
Definition: Cylinder.h:64
FreeTrajectoryState::hasError
bool hasError() const
Definition: FreeTrajectoryState.h:77
Geant4ePropagator::debugReportTrackState
void debugReportTrackState(std::string const &currentContext, GlobalPoint const &cmsInitPos, CLHEP::Hep3Vector const &g4InitPos, GlobalVector const &cmsInitMom, CLHEP::Hep3Vector const &g4InitMom, const SurfaceType &pDest) const
Definition: Geant4ePropagator.cc:458
TrackPropagation::hepPoint3DToGlobalPoint
GlobalPoint hepPoint3DToGlobalPoint(const HepGeom::Point3D< double > &r)
Definition: ConvertFromToCLHEP.h:38
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
FreeTrajectoryState::charge
TrackCharge charge() const
Definition: FreeTrajectoryState.h:69
ALCARECOPromptCalibProdSiPixelAli0T_cff.mode
mode
Definition: ALCARECOPromptCalibProdSiPixelAli0T_cff.py:96
GlobalTrajectoryParameters::charge
TrackCharge charge() const
Definition: GlobalTrajectoryParameters.h:72
oppositeToMomentum
Definition: PropagationDirection.h:4
SurfaceSideDefinition::SurfaceSide
SurfaceSide
Definition: SurfaceSideDefinition.h:8
SurfaceSideDefinition::afterSurface
Definition: SurfaceSideDefinition.h:8
TrackPropagation::g4ErrorTrajErrToAlgebraicSymMatrix55
AlgebraicSymMatrix55 g4ErrorTrajErrToAlgebraicSymMatrix55(const G4ErrorTrajErr &e, const int q)
Definition: ConvertFromToCLHEP.h:106
FreeTrajectoryState::position
GlobalPoint position() const
Definition: FreeTrajectoryState.h:67
align::LocalPoint
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
Geant4ePropagator::theParticleName
std::string theParticleName
Definition: Geant4ePropagator.h:89
Geant4ePropagator::theField
const MagneticField * theField
Definition: Geant4ePropagator.h:86
TrajectoryStateOnSurface
Definition: TrajectoryStateOnSurface.h:16
Vector3DBase::unit
Vector3DBase unit() const
Definition: Vector3DBase.h:54
TrajectoryStateOnSurface::freeState
FreeTrajectoryState const * freeState(bool withErrors=true) const
Definition: TrajectoryStateOnSurface.h:58
CurvilinearTrajectoryError
Definition: CurvilinearTrajectoryError.h:27
Geant4ePropagator::theG4eManager
G4ErrorPropagatorManager * theG4eManager
Definition: Geant4ePropagator.h:92
Geant4ePropagator::theG4eData
G4ErrorPropagatorData * theG4eData
Definition: Geant4ePropagator.h:93
FreeTrajectoryState::curvilinearError
const CurvilinearTrajectoryError & curvilinearError() const
Definition: FreeTrajectoryState.h:89
SurfaceSideDefinition::beforeSurface
Definition: SurfaceSideDefinition.h:8
TrackPropagation::g4doubleToCmsDouble
double g4doubleToCmsDouble(const G4double &d)
Definition: ConvertFromToCLHEP.h:45
Propagator::propagationDirection
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
Surface::toGlobal
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:79
TrackPropagation::globalVectorToHepNormal3D
HepGeom::Normal3D< double > globalVectorToHepNormal3D(const GlobalVector &p)
Definition: ConvertFromToCLHEP.h:50
TrackPropagation::globalPointToHepPoint3D
HepGeom::Point3D< double > globalPointToHepPoint3D(const GlobalPoint &r)
Definition: ConvertFromToCLHEP.h:30
HiggsValidation_cfi.particleName
particleName
Definition: HiggsValidation_cfi.py:7
GlobalTrajectoryParameters
Definition: GlobalTrajectoryParameters.h:15
Geant4ePropagator::configureAnyPropagation
bool configureAnyPropagation(G4ErrorMode &mode, SurfaceType const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
Point3DBase< float, LocalTag >
Geant4ePropagator::ensureGeant4eIsInitilized
void ensureGeant4eIsInitilized(bool forceInit) const
Definition: Geant4ePropagator.cc:70
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
TrackPropagation::globalPointToHep3Vector
CLHEP::Hep3Vector globalPointToHep3Vector(const GlobalPoint &r)
Definition: ConvertFromToCLHEP.h:75
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:670
idealTransformation.rotation
dictionary rotation
Definition: idealTransformation.py:1
edm::LogError
Definition: MessageLogger.h:183
GeV
const double GeV
Definition: MathUtil.h:16
Plane::localZ
float localZ(const GlobalPoint &gp) const
Definition: Plane.h:45
LocalVector
Local3DVector LocalVector
Definition: LocalVector.h:12
FreeTrajectoryState::parameters
const GlobalTrajectoryParameters & parameters() const
Definition: FreeTrajectoryState.h:79
TrackPropagation::globalVectorToHep3Vector
CLHEP::Hep3Vector globalVectorToHep3Vector(const GlobalVector &p)
Definition: ConvertFromToCLHEP.h:63
Geant4ePropagator::generateParticleName
std::string generateParticleName(int charge) const
Definition: Geant4ePropagator.cc:144
Geant4ePropagator::ErrorTargetPair
std::pair< bool, std::shared_ptr< G4ErrorTarget > > ErrorTargetPair
Definition: Geant4ePropagator.h:83
SurfaceOrientation::Side
Side
Definition: Surface.h:18
GloballyPositioned::position
const PositionType & position() const
Definition: GloballyPositioned.h:36
Geant4ePropagator::Geant4ePropagator
Geant4ePropagator(const MagneticField *field=nullptr, std::string particleName="mu", PropagationDirection dir=alongMomentum)
Definition: Geant4ePropagator.cc:39
FreeTrajectoryState
Definition: FreeTrajectoryState.h:27
TrackPropagation::tkRotationFToHepRotation
CLHEP::HepRotation tkRotationFToHepRotation(const TkRotation< float > &tkr)
Definition: ConvertFromToCLHEP.h:90
TrackPropagation::algebraicSymMatrix55ToG4ErrorTrajErr
G4ErrorTrajErr algebraicSymMatrix55ToG4ErrorTrajErr(const AlgebraicSymMatrix55 &e, const int q)
Definition: ConvertFromToCLHEP.h:126
SurfaceOrientation::positiveSide
Definition: Surface.h:18
GlobalTrajectoryParameters::magneticField
const MagneticField & magneticField() const
Definition: GlobalTrajectoryParameters.h:106
Geant4ePropagator::TsosPP
std::pair< TrajectoryStateOnSurface, double > TsosPP
Definition: Geant4ePropagator.h:82
GloballyPositioned::rotation
const RotationType & rotation() const
Definition: GloballyPositioned.h:38
Geant4ePropagator::propagateGeneric
std::pair< TrajectoryStateOnSurface, double > propagateGeneric(const FreeTrajectoryState &ftsStart, const SurfaceType &pDest) const
Definition: Geant4ePropagator.cc:224
alongMomentum
Definition: PropagationDirection.h:4
CurvilinearTrajectoryError::matrix
const AlgebraicSymMatrix55 & matrix() const
Definition: CurvilinearTrajectoryError.h:61
DeadROC_duringRun.dir
dir
Definition: DeadROC_duringRun.py:23
Propagator::Propagator
Propagator(PropagationDirection dir=alongMomentum)
Definition: Propagator.h:46