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
 
template<>
bool configureAnyPropagation (G4ErrorMode &mode, Plane const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
 
template<>
bool configureAnyPropagation (G4ErrorMode &mode, Cylinder const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
 
 Geant4ePropagator (const MagneticField *field=0, std::string particleName="mu", PropagationDirection dir=alongMomentum)
 
template<>
std::string getSurfaceType (Cylinder const &c) const
 
template<>
std::string getSurfaceType (Plane const &c) const
 
const MagneticFieldmagneticField () const override
 
std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const FreeTrajectoryState &, const Plane &) const override
 
std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const FreeTrajectoryState &, const Cylinder &) const override
 
std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const TrajectoryStateOnSurface &, const Plane &) const override
 
std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const TrajectoryStateOnSurface &, const Cylinder &) const override
 
template<>
Geant4ePropagator::ErrorTargetPair transformToG4SurfaceTarget (const Plane &pDest, bool moveTargetToEndOfSurface) const
 
template<>
Geant4ePropagator::ErrorTargetPair transformToG4SurfaceTarget (const Cylinder &pDest, bool moveTargetToEndOfSurface) const
 
 ~Geant4ePropagator () override
 
- Public Member Functions inherited from Propagator
template<typename STA , typename SUR >
TrajectoryStateOnSurface propagate (STA const &state, SUR const &surface) const
 
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
 
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const FreeTrajectoryState &, const Surface &) const final
 
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath (const TrajectoryStateOnSurface &tsos, const Surface &sur) 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 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<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<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<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

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

Definition at line 83 of file Geant4ePropagator.h.

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

Definition at line 82 of file Geant4ePropagator.h.

Constructor & Destructor Documentation

Geant4ePropagator::Geant4ePropagator ( const MagneticField field = 0,
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.

References ensureGeant4eIsInitilized(), and LogDebug.

Referenced by clone().

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 }
#define LogDebug(id)
Propagator(PropagationDirection dir=alongMomentum)
Definition: Propagator.h:46
std::string theParticleName
const MagneticField * theField
G4ErrorPropagatorManager * theG4eManager
G4ErrorPropagatorData * theG4eData
void ensureGeant4eIsInitilized(bool forceInit) const
Geant4ePropagator::~Geant4ePropagator ( )
override

Destructor.

Definition at line 54 of file Geant4ePropagator.cc.

References LogDebug.

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 }
#define LogDebug(id)

Member Function Documentation

Geant4ePropagator* Geant4ePropagator::clone ( void  ) const
inlineoverridevirtual

Implements Propagator.

Definition at line 77 of file Geant4ePropagator.h.

References Geant4ePropagator().

77 { return new Geant4ePropagator(*this); }
Geant4ePropagator(const MagneticField *field=0, std::string particleName="mu", PropagationDirection dir=alongMomentum)
template<class SurfaceType >
bool Geant4ePropagator::configureAnyPropagation ( G4ErrorMode &  mode,
SurfaceType const &  pDest,
GlobalPoint const &  cmsInitPos,
GlobalVector const &  cmsInitMom 
) const
private

Referenced by configurePropagation().

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

Definition at line 160 of file Geant4ePropagator.cc.

References Plane::localZ(), and LogDebug.

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 }
#define LogDebug(id)
template<>
bool Geant4ePropagator::configureAnyPropagation ( G4ErrorMode &  mode,
Cylinder const &  pDest,
GlobalPoint const &  cmsInitPos,
GlobalVector const &  cmsInitMom 
) const

Definition at line 180 of file Geant4ePropagator.cc.

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

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 }
#define LogDebug(id)
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.

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

Referenced by propagateGeneric().

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 }
#define LogDebug(id)
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
bool configureAnyPropagation(G4ErrorMode &mode, SurfaceType const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
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.

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().

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 }
#define LogDebug(id)
float localZ(const GlobalPoint &gp) const
Definition: Plane.h:45
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.

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().

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 }
#define LogDebug(id)
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.

References LogDebug, and theG4eManager.

Referenced by Geant4ePropagator().

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 }
#define LogDebug(id)
G4ErrorPropagatorManager * theG4eManager
std::string Geant4ePropagator::generateParticleName ( int  charge) const
private

Definition at line 144 of file Geant4ePropagator.cc.

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

Referenced by propagateGeneric().

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 }
#define LogDebug(id)
std::string theParticleName
template<>
std::string Geant4ePropagator::getSurfaceType ( Cylinder const &  c) const

Definition at line 135 of file Geant4ePropagator.cc.

135  {
136  return "Cylinder";
137 }
template<>
std::string Geant4ePropagator::getSurfaceType ( Plane const &  c) const

Definition at line 140 of file Geant4ePropagator.cc.

140  {
141  return "Plane";
142 }
template<class SurfaceType >
std::string Geant4ePropagator::getSurfaceType ( SurfaceType const &  surface) const
private
const MagneticField* Geant4ePropagator::magneticField ( ) const
inlineoverridevirtual

Implements Propagator.

Definition at line 79 of file Geant4ePropagator.h.

References theField.

79 { return theField; }
const MagneticField * theField
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.

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().

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 }
#define LogDebug(id)
std::pair< TrajectoryStateOnSurface, double > TsosPP
const double GeV
Definition: MathUtil.h:16
const GlobalTrajectoryParameters & parameters() const
double g4doubleToCmsDouble(const G4double &d)
CLHEP::Hep3Vector globalVectorToHep3Vector(const GlobalVector &p)
bool configurePropagation(G4ErrorMode &mode, SurfaceType const &pDest, GlobalPoint const &cmsInitPos, GlobalVector const &cmsInitMom) const
TrackCharge charge() const
const MagneticField * theField
const CurvilinearTrajectoryError & curvilinearError() const
G4ErrorPropagatorManager * theG4eManager
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
AlgebraicSymMatrix55 g4ErrorTrajErrToAlgebraicSymMatrix55(const G4ErrorTrajErr &e, const int q)
G4ErrorPropagatorData * theG4eData
void debugReportTrackState(std::string const &currentContext, GlobalPoint const &cmsInitPos, CLHEP::Hep3Vector const &g4InitPos, GlobalVector const &cmsInitMom, CLHEP::Hep3Vector const &g4InitMom, const SurfaceType &pDest) const
GlobalPoint hepPoint3DToGlobalPoint(const HepGeom::Point3D< double > &r)
std::pair< bool, std::shared_ptr< G4ErrorTarget > > ErrorTargetPair
double f[11][100]
GlobalVector momentum() const
GlobalPoint position() const
ErrorTargetPair transformToG4SurfaceTarget(const SurfaceType &pDest, bool moveTargetToEndOfSurface) const
GlobalVector hep3VectorToGlobalVector(const CLHEP::Hep3Vector &p)
const AlgebraicSymMatrix55 & matrix() const
const MagneticField & magneticField() const
G4ErrorTrajErr algebraicSymMatrix55ToG4ErrorTrajErr(const AlgebraicSymMatrix55 &e, const int q)
std::string generateParticleName(int charge) const
CLHEP::Hep3Vector globalPointToHep3Vector(const GlobalPoint &r)
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.

References propagateGeneric().

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 }
std::pair< TrajectoryStateOnSurface, double > propagateGeneric(const FreeTrajectoryState &ftsStart, const SurfaceType &pDest) const
std::pair< TrajectoryStateOnSurface, double > Geant4ePropagator::propagateWithPath ( const FreeTrajectoryState ftsStart,
const Cylinder cDest 
) const
overridevirtual

Implements Propagator.

Definition at line 419 of file Geant4ePropagator.cc.

References propagateGeneric().

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 }
std::pair< TrajectoryStateOnSurface, double > propagateGeneric(const FreeTrajectoryState &ftsStart, const SurfaceType &pDest) const
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.

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

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 }
FreeTrajectoryState const * freeState(bool withErrors=true) const
std::pair< TrajectoryStateOnSurface, double > propagateGeneric(const FreeTrajectoryState &ftsStart, const SurfaceType &pDest) const
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.

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

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 }
FreeTrajectoryState const * freeState(bool withErrors=true) const
std::pair< TrajectoryStateOnSurface, double > propagateGeneric(const FreeTrajectoryState &ftsStart, const SurfaceType &pDest) const
template<>
Geant4ePropagator::ErrorTargetPair Geant4ePropagator::transformToG4SurfaceTarget ( const Plane pDest,
bool  moveTargetToEndOfSurface 
) const

Definition at line 96 of file Geant4ePropagator.cc.

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

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 }
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:81
Local3DVector LocalVector
Definition: LocalVector.h:12
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
HepGeom::Normal3D< double > globalVectorToHepNormal3D(const GlobalVector &p)
std::pair< bool, std::shared_ptr< G4ErrorTarget > > ErrorTargetPair
Vector3DBase unit() const
Definition: Vector3DBase.h:54
HepGeom::Point3D< double > globalPointToHepPoint3D(const GlobalPoint &r)
template<class SurfaceType >
ErrorTargetPair Geant4ePropagator::transformToG4SurfaceTarget ( const SurfaceType &  pDest,
bool  moveTargetToEndOfSurface 
) const
private

Referenced by propagateGeneric().

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

Definition at line 115 of file Geant4ePropagator.cc.

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

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 }
#define LogDebug(id)
CLHEP::HepRotation tkRotationFToHepRotation(const TkRotation< float > &tkr)
Scalar radius() const
Radius of the cylinder.
Definition: Cylinder.h:64
std::pair< bool, std::shared_ptr< G4ErrorTarget > > ErrorTargetPair
const RotationType & rotation() const
const PositionType & position() const
CLHEP::Hep3Vector globalPointToHep3Vector(const GlobalPoint &r)

Member Data Documentation

const MagneticField* Geant4ePropagator::theField
private

Definition at line 86 of file Geant4ePropagator.h.

Referenced by magneticField(), and propagateGeneric().

G4ErrorPropagatorData* Geant4ePropagator::theG4eData
private

Definition at line 93 of file Geant4ePropagator.h.

Referenced by propagateGeneric().

G4ErrorPropagatorManager* Geant4ePropagator::theG4eManager
private

Definition at line 92 of file Geant4ePropagator.h.

Referenced by ensureGeant4eIsInitilized(), and propagateGeneric().

std::string Geant4ePropagator::theParticleName
private

Definition at line 89 of file Geant4ePropagator.h.

Referenced by generateParticleName().