20 #include "G4ErrorCylSurfaceTarget.hh"
21 #include "G4ErrorFreeTrajState.hh"
22 #include "G4ErrorPlaneSurfaceTarget.hh"
23 #include "G4ErrorPropagatorData.hh"
24 #include "G4ErrorRunManagerHelper.hh"
25 #include "G4EventManager.hh"
27 #include "G4FieldManager.hh"
28 #include "G4GeometryTolerance.hh"
29 #include "G4SteppingControl.hh"
30 #include "G4TransportationManager.hh"
32 #include "G4UImanager.hh"
35 #include "CLHEP/Units/GlobalSystemOfUnits.h"
43 theG4eManager(G4ErrorPropagatorManager::GetErrorPropagatorManager()),
44 theG4eData(G4ErrorPropagatorData::GetErrorPropagatorData()) {
45 LogDebug(
"Geant4e") <<
"Geant4e Propagator initialized";
55 LogDebug(
"Geant4e") <<
"Geant4ePropagator::~Geant4ePropagator()" << std::endl;
71 LogDebug(
"Geant4e") <<
"ensureGeant4eIsInitilized called" << std::endl;
72 if ((G4ErrorPropagatorData::GetErrorPropagatorData()->GetState() == G4ErrorState_PreInit) || forceInit) {
73 LogDebug(
"Geant4e") <<
"Initializing G4 propagator" << std::endl;
75 G4UImanager::GetUIpointer()->ApplyCommand(
"/exerror/setField -10. kilogauss");
79 const G4Field *field = G4TransportationManager::GetTransportationManager()->GetFieldManager()->GetDetectorField();
80 if (field ==
nullptr) {
83 LogDebug(
"Geant4e") <<
"G4 propagator initialized" << std::endl;
85 LogDebug(
"Geant4e") <<
"G4 not in preinit state: " << G4ErrorPropagatorData::GetErrorPropagatorData()->GetState()
92 G4UImanager::GetUIpointer()->ApplyCommand(
"/geant4e/limits/stepLength 10.0 mm");
97 bool moveTargetToEndOfSurface)
const {
101 normalPlane = normalPlane.
unit();
111 return ErrorTargetPair(
false, std::make_shared<G4ErrorPlaneSurfaceTarget>(surfNorm, surfPos));
116 bool moveTargetToEndOfSurface)
const {
120 G4float radCyl = pDest.
radius() * cm;
129 LogDebug(
"Geant4e") <<
"G4e - G4Rotation" << rotCyl <<
"mm";
131 return ErrorTargetPair(!moveTargetToEndOfSurface, std::make_shared<G4ErrorCylSurfaceTarget>(radCyl, posCyl, rotCyl));
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"
170 mode = G4ErrorMode_PropBackwards;
171 LogDebug(
"Geant4e") <<
"G4e - Propagator mode is \'backwards\' indirect "
172 "via the Any direction"
190 mode = G4ErrorMode_PropBackwards;
191 LogDebug(
"Geant4e") <<
"G4e - Propagator mode is \'backwards\' indirect "
192 "via the Any direction";
194 mode = G4ErrorMode_PropForwards;
195 LogDebug(
"Geant4e") <<
"G4e - Propagator mode is \'forwards\' indirect "
196 "via the Any direction";
202 template <
class SurfaceType>
204 SurfaceType
const &pDest,
208 mode = G4ErrorMode_PropBackwards;
209 LogDebug(
"Geant4e") <<
"G4e - Propagator mode is \'backwards\' " << std::endl;
211 mode = G4ErrorMode_PropForwards;
212 LogDebug(
"Geant4e") <<
"G4e - Propagator mode is \'forwards\'" << std::endl;
217 edm::LogError(
"Geant4e") <<
"G4e - Unsupported propagation mode";
223 template <
class SurfaceType>
225 const SurfaceType &pDest)
const {
238 bool flipped =
false;
242 cmsInitMom = -cmsInitMom;
247 G4ErrorMode
mode = G4ErrorMode_PropForwards;
252 if (
mode == G4ErrorMode_PropBackwards && !flipped)
253 cmsInitMom = -cmsInitMom;
269 G4ErrorTrajErr g4error(5, 1);
274 LogDebug(
"Geant4e") <<
"CMS - Error matrix: " << std::endl << initErr.
matrix();
276 LogDebug(
"Geant4e") <<
"No error matrix available" << std::endl;
280 LogDebug(
"Geant4e") <<
"G4e - Error matrix: " << std::endl << g4error;
284 if (
mode == G4ErrorMode_PropForwards) {
285 G4ErrorPropagatorData::GetErrorPropagatorData()->SetStage(G4ErrorStage_Inflation);
286 }
else if (
mode == G4ErrorMode_PropBackwards) {
287 G4ErrorPropagatorData::GetErrorPropagatorData()->SetStage(G4ErrorStage_Deflation);
291 LogDebug(
"Geant4e") <<
"G4e - Traj. State: " << (g4eTrajState);
296 double finalPathLength = 0;
298 HepGeom::Point3D<double> finalRecoPos;
300 G4ErrorPropagatorData::GetErrorPropagatorData()->SetMode(
mode);
302 theG4eData->SetTarget(g4eTarget_center.second.get());
303 LogDebug(
"Geant4e") <<
"Running Propagation to the RECO surface" << std::endl;
307 bool continuePropagation =
true;
308 while (continuePropagation) {
310 LogDebug(
"Geant4e") << std::endl <<
"step count " << iterations <<
" step length " << finalPathLength;
321 LogDebug(
"Geant4e") <<
"step Length was " << thisPathLength <<
" cm, current global position: "
324 finalPathLength += thisPathLength;
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"
339 if (
theG4eManager->GetPropagator()->CheckIfLastStep(g4eTrajState.GetG4Track())) {
340 theG4eManager->GetPropagator()->InvokePostUserTrackingAction(g4eTrajState.GetG4Track());
341 continuePropagation =
false;
347 finalPathLength = -finalPathLength;
350 LogDebug(
"Geant4e") <<
"Position on the RECO surface" << g4eTrajState.GetPosition() << std::endl;
351 finalRecoPos = g4eTrajState.GetPosition();
355 LogDebug(
"Geant4e") <<
"Final position of the Track :" << g4eTrajState.GetPosition() << std::endl;
362 const HepGeom::Vector3D<double> momEnd = g4eTrajState.GetMomentum();
373 G4ErrorTrajErr g4errorEnd = g4eTrajState.GetError();
378 if (
mode == G4ErrorMode_PropBackwards) {
384 momEndGV = -momEndGV;
387 LogDebug(
"Geant4e") <<
"G4e - Error matrix after propagation: " << std::endl << g4errorEnd;
389 LogDebug(
"Geant4e") <<
"CMS - Error matrix after propagation: " << std::endl << curvError.
matrix();
412 const Plane &pDest)
const {
443 HepGeom::Point3D<double>
const &surfPos,
445 HepGeom::Normal3D<double>
const &surfNorm,
446 const Plane &pDest)
const {
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()
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";
457 template <
class SurfaceType>
460 CLHEP::Hep3Vector
const &g4InitPos,
462 CLHEP::Hep3Vector
const &g4InitMom,
463 const SurfaceType &pDest)
const {
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";