CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
TrajectoryManager Class Reference

#include <TrajectoryManager.h>

Public Types

typedef ROOT::Math::AxisAngle Rotation
 

Public Member Functions

void createPSimHits (const TrackerLayer &layer, const ParticlePropagator &P_before, std::map< double, PSimHit > &theHitMap, int trackID, int partID, const TrackerTopology *tTopo)
 Create a vector of PSimHits. More...
 
void initializeRecoGeometry (const GeometricSearchTracker *geomSearchTracker, const TrackerInteractionGeometry *interactionGeometry, const MagneticFieldMap *aFieldMap)
 Initialize the Reconstruction Geometry. More...
 
void initializeTrackerGeometry (const TrackerGeometry *geomTracker)
 Initialize the full Tracker Geometry. More...
 
void loadSimHits (edm::PSimHitContainer &c) const
 
void propagateToCalorimeters (ParticlePropagator &PP, int fsimi, RandomEngineAndDistribution const *)
 Propagate the particle through the calorimeters. More...
 
bool propagateToLayer (ParticlePropagator &PP, unsigned layer)
 
void reconstruct (const TrackerTopology *tTopo, RandomEngineAndDistribution const *)
 Does the real job. More...
 
const TrackerInteractionGeometrytheGeometry ()
 Returns the pointer to geometry. More...
 
 TrajectoryManager ()
 Default Constructor. More...
 
 TrajectoryManager (FSimEvent *aSimEvent, const edm::ParameterSet &matEff, const edm::ParameterSet &simHits, const edm::ParameterSet &decays)
 Constructor from a FSimEvent. More...
 
 ~TrajectoryManager ()
 Default Destructor. More...
 

Private Member Functions

const DetLayerdetLayer (const TrackerLayer &layer, float zpos) const
 Returns the DetLayer pointer corresponding to the FAMOS layer. More...
 
void initializeLayerMap ()
 Initialize correspondence map between Famos interaction geometry and tracker reco geometry. More...
 
void makePSimHits (const GeomDet *det, const TrajectoryStateOnSurface &ts, std::map< double, PSimHit > &theHitMap, int tkID, float el, float thick, int pID, const TrackerTopology *tTopo)
 and there More...
 
std::pair< double, PSimHitmakeSinglePSimHit (const GeomDetUnit &det, const TrajectoryStateOnSurface &ts, int tkID, float el, float thick, int pID, const TrackerTopology *tTopo) const
 and there More...
 
TrajectoryStateOnSurface makeTrajectoryState (const DetLayer *layer, const ParticlePropagator &pp, const MagneticField *field) const
 Teddy, you must put comments there. More...
 
void moveAllDaughters (int fsimi, const Rotation &r, double rescale)
 Move, rescale and rotate all daughters after propagation, material effects and decay of the mother. More...
 
void updateWithDaughters (ParticlePropagator &PP, int fsimi, RandomEngineAndDistribution const *)
 Decay the particle and update the SimEvent with daughters. More...
 

Private Attributes

const MagneticFieldMap_theFieldMap
 
const TrackerInteractionGeometry_theGeometry
 
std::string decayer
 
double distCut
 
bool firstLoop
 
PythiaDecaysmyDecayEngine
 
FSimEventmySimEvent
 
double pTmin
 
const GeometricSearchTrackertheGeomSearchTracker
 
const TrackerGeometrytheGeomTracker
 
std::vector< const DetLayer * > theLayerMap
 
MaterialEffectstheMaterialEffects
 
int theNegLayerOffset
 
std::map< unsigned, std::map
< double, PSimHit > > 
thePSimHits
 
bool use_hardcoded
 

Detailed Description

Definition at line 59 of file TrajectoryManager.h.

Member Typedef Documentation

typedef ROOT::Math::AxisAngle TrajectoryManager::Rotation

Definition at line 64 of file TrajectoryManager.h.

Constructor & Destructor Documentation

TrajectoryManager::TrajectoryManager ( )
inline

Default Constructor.

Definition at line 67 of file TrajectoryManager.h.

67 {;}
TrajectoryManager::TrajectoryManager ( FSimEvent aSimEvent,
const edm::ParameterSet matEff,
const edm::ParameterSet simHits,
const edm::ParameterSet decays 
)

Constructor from a FSimEvent.

Definition at line 46 of file TrajectoryManager.cc.

References gather_cfg::cout, decayer, distCut, firstLoop, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), myDecayEngine, pTmin, AlCaHLTBitMon_QueryRunRegistry::string, theMaterialEffects, and use_hardcoded.

49  :
50  mySimEvent(aSimEvent),
51  _theGeometry(0),
52  _theFieldMap(0),
54  myDecayEngine(0),
55  theGeomTracker(0),
57  theLayerMap(56, static_cast<const DetLayer*>(0)), // reserve space for layers here
59  // myHistos(0),
60  use_hardcoded(1)
61 
62 {
63  //std::cout << "TrajectoryManager.cc 1 use_hardcoded = " << use_hardcoded << std::endl;
64  use_hardcoded = matEff.getParameter<bool>("use_hardcoded_geometry");
65 
66  // Initialize Bthe stable particle decay engine
67  if ( decays.getParameter<bool>("ActivateDecays") && ( decays.getParameter<std::string>("Decayer") == "pythia6" || decays.getParameter<std::string>("Decayer") == "pythia8" ) ) {
68  decayer = decays.getParameter<std::string>("Decayer");
70  distCut = decays.getParameter<double>("DistCut");
71  } else if (! ( decays.getParameter<std::string>("Decayer") == "pythia6" || decays.getParameter<std::string>("Decayer") == "pythia8" ) )
72  std::cout << "No valid decayer has been selected! No decay performed..." << std::endl;
73  // Initialize the Material Effects updator, if needed
74  if ( matEff.getParameter<bool>("PairProduction") ||
75  matEff.getParameter<bool>("Bremsstrahlung") ||
76  matEff.getParameter<bool>("MuonBremsstrahlung") ||
77  matEff.getParameter<bool>("EnergyLoss") ||
78  matEff.getParameter<bool>("MultipleScattering") ||
79  matEff.getParameter<bool>("NuclearInteraction")
80  )
81  theMaterialEffects = new MaterialEffects(matEff);
82 
83  // Save SimHits according to Optiom
84  // Only the hits from first half loop is saved
85  firstLoop = simHits.getUntrackedParameter<bool>("firstLoop",true);
86  // Only if pT>pTmin are the hits saved
87  pTmin = simHits.getUntrackedParameter<double>("pTmin",0.5);
88 
89  /*
90  // Get the Famos Histos pointer
91  myHistos = Histos::instance();
92 
93  // Initialize a few histograms
94 
95  myHistos->book("h302",1210,-121.,121.,1210,-121.,121.);
96  myHistos->book("h300",1210,-121.,121.,1210,-121.,121.);
97  myHistos->book("h301",1200,-300.,300.,1210,-121.,121.);
98  myHistos->book("h303",1200,-300.,300.,1210,-121.,121.);
99  */
100 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
PythiaDecays * myDecayEngine
const MagneticFieldMap * _theFieldMap
const TrackerGeometry * theGeomTracker
const GeometricSearchTracker * theGeomSearchTracker
const TrackerInteractionGeometry * _theGeometry
MaterialEffects * theMaterialEffects
std::vector< const DetLayer * > theLayerMap
tuple cout
Definition: gather_cfg.py:121
TrajectoryManager::~TrajectoryManager ( )

Default Destructor.

Definition at line 133 of file TrajectoryManager.cc.

References myDecayEngine, and theMaterialEffects.

133  {
134 
135  if ( myDecayEngine ) delete myDecayEngine;
137 
138  //Write the histograms
139  /*
140  myHistos->put("histos.root");
141  if ( myHistos ) delete myHistos;
142  */
143 }
PythiaDecays * myDecayEngine
MaterialEffects * theMaterialEffects

Member Function Documentation

void TrajectoryManager::createPSimHits ( const TrackerLayer layer,
const ParticlePropagator P_before,
std::map< double, PSimHit > &  theHitMap,
int  trackID,
int  partID,
const TrackerTopology tTopo 
)

Create a vector of PSimHits.

Definition at line 552 of file TrajectoryManager.cc.

References anyDirection, GeometricSearchDet::compatibleDets(), detLayer(), MaterialEffects::energyLoss(), BaseParticlePropagator::getMagneticField(), i, makePSimHits(), makeTrajectoryState(), theMaterialEffects, MaterialEffects::thickness(), and RawParticle::Z().

Referenced by reconstruct().

555  {
556 
557  // Propagate the particle coordinates to the closest tracker detector(s)
558  // in this layer and create the PSimHit(s)
559 
560  // const MagneticField& mf = MagneticFieldMap::instance()->magneticField();
561  // This solution is actually much faster !
562  LocalMagneticField mf(PP.getMagneticField());
563  AnalyticalPropagator alongProp(&mf, anyDirection);
565 
566 // std::cout << "PP.X() = " << PP.X() << std::endl;
567 // std::cout << "PP.Y() = " << PP.Y() << std::endl;
568 // std::cout << "PP.Z() = " << PP.Z() << std::endl;
569 
571  const DetLayer* tkLayer = detLayer(layer,PP.Z());
572 
573  TrajectoryStateOnSurface trajState = makeTrajectoryState( tkLayer, PP, &mf);
574  float thickness = theMaterialEffects ? theMaterialEffects->thickness() : 0.;
575  float eloss = theMaterialEffects ? theMaterialEffects->energyLoss() : 0.;
576 
577  // Find, in the corresponding layers, the detectors compatible
578  // with the current track
579  std::vector<DetWithState> compat
580  = tkLayer->compatibleDets( trajState, alongProp, est);
581 
582  // And create the corresponding PSimHits
583  std::map<double,PSimHit> theTrackHits;
584  for (std::vector<DetWithState>::const_iterator i=compat.begin(); i!=compat.end(); i++) {
585  // Correct Eloss for last 3 rings of TEC (thick sensors, 0.05 cm)
586  // Disgusting fudge factor !
587  makePSimHits( i->first, i->second, theHitMap, trackID, eloss, thickness, partID,tTopo);
588  }
589 
590 }
int i
Definition: DBlmapReader.cc:9
const DetLayer * detLayer(const TrackerLayer &layer, float zpos) const
Returns the DetLayer pointer corresponding to the FAMOS layer.
void makePSimHits(const GeomDet *det, const TrajectoryStateOnSurface &ts, std::map< double, PSimHit > &theHitMap, int tkID, float el, float thick, int pID, const TrackerTopology *tTopo)
and there
TrajectoryStateOnSurface makeTrajectoryState(const DetLayer *layer, const ParticlePropagator &pp, const MagneticField *field) const
Teddy, you must put comments there.
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
MaterialEffects * theMaterialEffects
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
double energyLoss() const
Return the energy loss by ionization in the current layer.
double thickness() const
Return the thickness of the current layer.
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
const DetLayer * TrajectoryManager::detLayer ( const TrackerLayer layer,
float  zpos 
) const
private

Returns the DetLayer pointer corresponding to the FAMOS layer.

Definition at line 925 of file TrajectoryManager.cc.

References TrackerLayer::forward(), TrackerLayer::layerNumber(), theLayerMap, and theNegLayerOffset.

Referenced by createPSimHits().

926 {
927  if (zpos > 0 || !layer.forward() ) return theLayerMap[layer.layerNumber()];
928  else return theLayerMap[layer.layerNumber()+theNegLayerOffset];
929 }
unsigned int layerNumber() const
Returns the layer number.
Definition: TrackerLayer.h:82
bool forward() const
Is the layer forward ?
Definition: TrackerLayer.h:70
std::vector< const DetLayer * > theLayerMap
void TrajectoryManager::initializeLayerMap ( )
private

Initialize correspondence map between Famos interaction geometry and tracker reco geometry.

ATTENTION: HARD CODED LOGIC! If Famos layer numbering changes this logic needs to be adapted to the new numbering!

Definition at line 817 of file TrajectoryManager.cc.

References _theGeometry, GeometricSearchTracker::barrelLayers(), TrackerInteractionGeometry::cylinderBegin(), TrackerInteractionGeometry::cylinderEnd(), newFWLiteAna::found, i, LogDebug, GeometricSearchTracker::negForwardLayers(), GeometricSearchTracker::posForwardLayers(), theGeomSearchTracker, theLayerMap, and theNegLayerOffset.

Referenced by initializeRecoGeometry().

818 {
819 
820 // These are the BoundSurface&, the BoundDisk* and the BoundCylinder* for that layer
821 // const BoundSurface& theSurface = layer.surface();
822 // BoundDisk* theDisk = layer.disk(); // non zero for endcaps
823 // BoundCylinder* theCylinder = layer.cylinder(); // non zero for barrel
824 // int theLayer = layer.layerNumber(); // 1->3 PixB, 4->5 PixD,
825 // // 6->9 TIB, 10->12 TID,
826 // // 13->18 TOB, 19->27 TEC
827 
830 
831  const std::vector< const BarrelDetLayer*>& barrelLayers =
833  LogDebug("FastTracking") << "Barrel DetLayer dump: ";
834  for (auto bl=barrelLayers.begin();
835  bl != barrelLayers.end(); ++bl) {
836  LogDebug("FastTracking")<< "radius " << (**bl).specificSurface().radius();
837  }
838 
839  const std::vector< const ForwardDetLayer*>& posForwardLayers =
841  LogDebug("FastTracking") << "Positive Forward DetLayer dump: ";
842  for (auto fl=posForwardLayers.begin();
843  fl != posForwardLayers.end(); ++fl) {
844  LogDebug("FastTracking") << "Z pos "
845  << (**fl).surface().position().z()
846  << " radii "
847  << (**fl).specificSurface().innerRadius()
848  << ", "
849  << (**fl).specificSurface().outerRadius();
850  }
851 
852  const float rTolerance = 1.5;
853  const float zTolerance = 3.;
854 
855  LogDebug("FastTracking")<< "Dump of TrackerInteractionGeometry cylinders:";
856  for( std::list<TrackerLayer>::const_iterator i=_theGeometry->cylinderBegin();
857  i!=_theGeometry->cylinderEnd(); ++i) {
858  const BoundCylinder* cyl = i->cylinder();
859  const BoundDisk* disk = i->disk();
860 
861  LogDebug("FastTracking") << "Famos Layer no " << i->layerNumber()
862  << " is sensitive? " << i->sensitive()
863  << " pos " << i->surface().position();
864  if (!i->sensitive()) continue;
865 
866  if (cyl != 0) {
867  LogDebug("FastTracking") << " cylinder radius " << cyl->radius();
868  bool found = false;
869  for (auto
870  bl=barrelLayers.begin(); bl != barrelLayers.end(); ++bl) {
871 
872  if (fabs( cyl->radius() - (**bl).specificSurface().radius()) < rTolerance) {
873  theLayerMap[i->layerNumber()] = *bl;
874  found = true;
875  LogDebug("FastTracking")<< "Corresponding DetLayer found with radius "
876  << (**bl).specificSurface().radius();
877  break;
878  }
879  }
880  if (!found) {
881  edm::LogWarning("FastTracking") << " Trajectory manager FAILED to find a corresponding DetLayer!";
882  }
883  }
884  else {
885  LogDebug("FastTracking") << " disk radii " << disk->innerRadius()
886  << ", " << disk->outerRadius();
887  bool found = false;
888  for (auto fl=posForwardLayers.begin();
889  fl != posForwardLayers.end(); ++fl) {
890 
891  if (fabs( disk->position().z() - (**fl).surface().position().z()) < zTolerance) {
892  theLayerMap[i->layerNumber()] = *fl;
893  found = true;
894  LogDebug("FastTracking") << "Corresponding DetLayer found with Z pos "
895  << (**fl).surface().position().z()
896  << " and radii "
897  << (**fl).specificSurface().innerRadius()
898  << ", "
899  << (**fl).specificSurface().outerRadius();
900  break;
901  }
902  }
903  if (!found) {
904  edm::LogWarning("FastTracking") << "FAILED to find a corresponding DetLayer!";
905  }
906  }
907  }
908 
909  // Put the negative layers in the same map but with an offset
910  const std::vector< const ForwardDetLayer*>& negForwardLayers = theGeomSearchTracker->negForwardLayers();
911  for (auto nl=negForwardLayers.begin();
912  nl != negForwardLayers.end(); ++nl) {
913  for (int i=0; i<=theNegLayerOffset; i++) {
914  if (theLayerMap[i] == 0) continue;
915  if ( fabs( (**nl).surface().position().z() +theLayerMap[i]-> surface().position().z()) < zTolerance) {
917  break;
918  }
919  }
920  }
921 
922 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
std::vector< ForwardDetLayer const * > const & posForwardLayers() const
const GeometricSearchTracker * theGeomSearchTracker
std::list< TrackerLayer >::const_iterator cylinderEnd() const
Returns the last pointer in the cylinder list.
const TrackerInteractionGeometry * _theGeometry
std::vector< ForwardDetLayer const * > const & negForwardLayers() const
std::list< TrackerLayer >::const_iterator cylinderBegin() const
Returns the first pointer in the cylinder list.
std::vector< const DetLayer * > theLayerMap
std::vector< BarrelDetLayer const * > const & barrelLayers() const
void TrajectoryManager::initializeRecoGeometry ( const GeometricSearchTracker geomSearchTracker,
const TrackerInteractionGeometry interactionGeometry,
const MagneticFieldMap aFieldMap 
)

Initialize the Reconstruction Geometry.

Definition at line 103 of file TrajectoryManager.cc.

References _theFieldMap, _theGeometry, initializeLayerMap(), and theGeomSearchTracker.

Referenced by FamosManager::setupGeometryAndField().

106 {
107 
108  // Initialize the reco tracker geometry
109  theGeomSearchTracker = geomSearchTracker;
110 
111  // Initialize the simplified tracker geometry
112  _theGeometry = interactionGeometry;
113 
115 
116  // Initialize the magnetic field
117  _theFieldMap = aFieldMap;
118 
119 }
void initializeLayerMap()
Initialize correspondence map between Famos interaction geometry and tracker reco geometry...
const MagneticFieldMap * _theFieldMap
const GeometricSearchTracker * theGeomSearchTracker
const TrackerInteractionGeometry * _theGeometry
void TrajectoryManager::initializeTrackerGeometry ( const TrackerGeometry geomTracker)

Initialize the full Tracker Geometry.

Definition at line 122 of file TrajectoryManager.cc.

References theGeomTracker.

Referenced by FamosManager::setupGeometryAndField().

122  {
123 
124  theGeomTracker = geomTracker;
125 
126 }
const TrackerGeometry * theGeomTracker
void TrajectoryManager::loadSimHits ( edm::PSimHitContainer c) const

Definition at line 932 of file TrajectoryManager.cc.

References begin, end, and thePSimHits.

933 {
934 
935  std::map<unsigned,std::map<double,PSimHit> >::const_iterator itrack = thePSimHits.begin();
936  std::map<unsigned,std::map<double,PSimHit> >::const_iterator itrackEnd = thePSimHits.end();
937  for ( ; itrack != itrackEnd; ++itrack ) {
938  std::map<double,PSimHit>::const_iterator it = (itrack->second).begin();
939  std::map<double,PSimHit>::const_iterator itEnd = (itrack->second).end();
940  for( ; it!= itEnd; ++it) {
941  /*
942  DetId theDetUnitId((it->second).detUnitId());
943  const GeomDet* theDet = theGeomTracker->idToDet(theDetUnitId);
944  std::cout << "Track/z/r after : "
945  << (it->second).trackId() << " "
946  << theDet->surface().toGlobal((it->second).localPosition()).z() << " "
947  << theDet->surface().toGlobal((it->second).localPosition()).perp() << std::endl;
948  */
949  // Keep only those hits that are on the physical volume of a module
950  // (The other hits have been assigned a negative <double> value.
951  if ( it->first > 0. ) c.push_back(it->second);
952  }
953  }
954 
955 }
#define end
Definition: vmac.h:37
std::map< unsigned, std::map< double, PSimHit > > thePSimHits
#define begin
Definition: vmac.h:30
void TrajectoryManager::makePSimHits ( const GeomDet det,
const TrajectoryStateOnSurface ts,
std::map< double, PSimHit > &  theHitMap,
int  tkID,
float  el,
float  thick,
int  pID,
const TrackerTopology tTopo 
)
private

and there

Definition at line 605 of file TrajectoryManager.cc.

References AlCaHLTBitMon_QueryRunRegistry::comp, GeomDet::components(), i, and makeSinglePSimHit().

Referenced by createPSimHits().

610 {
611 
612  std::vector< const GeomDet*> comp = det->components();
613  if (!comp.empty()) {
614  for (std::vector< const GeomDet*>::const_iterator i = comp.begin();
615  i != comp.end(); i++) {
616  auto du = (*i);
617  if (du->isLeaf()) // not even needed (or it should iterate if really not leaf)
618  theHitMap.insert(theHitMap.end(),makeSinglePSimHit( *du, ts, tkID, el, thick, pID,tTopo));
619  }
620  }
621  else {
622  auto du = (det);
623  theHitMap.insert(theHitMap.end(),makeSinglePSimHit( *du, ts, tkID, el, thick, pID,tTopo));
624  }
625 
626 }
int i
Definition: DBlmapReader.cc:9
std::pair< double, PSimHit > makeSinglePSimHit(const GeomDetUnit &det, const TrajectoryStateOnSurface &ts, int tkID, float el, float thick, int pID, const TrackerTopology *tTopo) const
and there
virtual std::vector< const GeomDet * > components() const
Returns direct components, if any.
Definition: GeomDet.h:86
std::pair< double, PSimHit > TrajectoryManager::makeSinglePSimHit ( const GeomDetUnit det,
const TrajectoryStateOnSurface ts,
int  tkID,
float  el,
float  thick,
int  pID,
const TrackerTopology tTopo 
) const
private

and there

Definition at line 629 of file TrajectoryManager.cc.

References anyDirection, PV3DBase< T, PVType, FrameType >::basicVector(), Surface::bounds(), FSimTrack::closestDaughterId(), gather_cfg::cout, cond::rpcobgas::detid, cmsRelvalreport::exit, GeomDet::geographicalId(), TrajectoryStateOnSurface::globalMomentum(), TrajectoryStateOnSurface::globalPosition(), FSimTrack::id(), listHistos::IP, Bounds::length(), TrajectoryStateOnSurface::localMomentum(), TrajectoryStateOnSurface::localPosition(), PV3DBase< T, PVType, FrameType >::mag(), FSimTrack::mother(), mySimEvent, FSimTrack::noMother(), cmsHarvester::path, FSimVertex::position(), TrackerTopology::pxbLayer(), TrackerTopology::pxfDisk(), DetId::rawId(), GeomDet::surface(), TrackerTopology::tecRing(), TrackerTopology::tecWheel(), TrackerTopology::tibLayer(), TrackerTopology::tidRing(), TrackerTopology::tidWheel(), TrackerTopology::tobLayer(), TrackerTopology::tobStereo(), Surface::toGlobal(), GeomDet::toLocal(), FBaseSimEvent::track(), TrajectoryStateOnSurface::transverseCurvature(), Vector3DBase< T, FrameTag >::unit(), FSimTrack::vertex(), Bounds::width(), hit::x, hit::y, detailsBasic3DVector::z, PV3DBase< T, PVType, FrameType >::z(), and hit::z.

Referenced by makePSimHits().

633 {
634 
635  const float onSurfaceTolarance = 0.01; // 10 microns
636 
637  LocalPoint lpos;
638  LocalVector lmom;
639  if ( fabs( det.toLocal(ts.globalPosition()).z()) < onSurfaceTolarance) {
640  lpos = ts.localPosition();
641  lmom = ts.localMomentum();
642  }
643  else {
646  ts.transverseCurvature(),
647  anyDirection);
648  std::pair<bool,double> path = crossing.pathLength(det.surface());
649  if (!path.first) {
650  // edm::LogWarning("FastTracking") << "TrajectoryManager ERROR: crossing with det failed, skipping PSimHit";
651  return std::pair<double,PSimHit>(0.,PSimHit());
652  }
653  lpos = det.toLocal( GlobalPoint( crossing.position(path.second)));
654  lmom = det.toLocal( GlobalVector( crossing.direction(path.second)));
655  lmom = lmom.unit() * ts.localMomentum().mag();
656  }
657 
658  // The module (half) thickness
659  const BoundPlane& theDetPlane = det.surface();
660  float halfThick = 0.5*theDetPlane.bounds().thickness();
661  // The Energy loss rescaled to the module thickness
662  float eloss = el;
663  if ( thick > 0. ) {
664  // Total thickness is in radiation lengths, 1 radlen = 9.36 cm
665  // Sensitive module thickness is about 30 microns larger than
666  // the module thickness itself
667  eloss *= (2.* halfThick - 0.003) / (9.36 * thick);
668  }
669  // The entry and exit points, and the time of flight
670  float pZ = lmom.z();
671  LocalPoint entry = lpos + (-halfThick/pZ) * lmom;
672  LocalPoint exit = lpos + halfThick/pZ * lmom;
673  float tof = ts.globalPosition().mag() / 30. ; // in nanoseconds, FIXME: very approximate
674 
675  // If a hadron suffered a nuclear interaction, just assign the hits of the closest
676  // daughter to the mother's track. The same applies to a charged particle decay into
677  // another charged particle.
678  int localTkID = tkID;
679  if ( !mySimEvent->track(tkID).noMother() && mySimEvent->track(tkID).mother().closestDaughterId() == tkID )
680  localTkID = mySimEvent->track(tkID).mother().id();
681 
682  // FIXME: fix the track ID and the particle ID
683  PSimHit hit( entry, exit, lmom.mag(), tof, eloss, pID,
684  det.geographicalId().rawId(), localTkID,
685  lmom.theta(),
686  lmom.phi());
687 
688  // Check that the PSimHit is physically on the module!
689  unsigned subdet = DetId(hit.detUnitId()).subdetId();
690  double boundX = theDetPlane.bounds().width()/2.;
691  double boundY = theDetPlane.bounds().length()/2.;
692 
693  // Special treatment for TID and TEC trapeziodal modules
694  if ( subdet == 4 || subdet == 6 )
695  boundX *= 1. - hit.localPosition().y()/theDetPlane.position().perp();
696 
697 #ifdef FAMOS_DEBUG
698  unsigned detid = DetId(hit.detUnitId()).rawId();
699  unsigned stereo = 0;
700  unsigned theLayer = 0;
701  unsigned theRing = 0;
702  switch (subdet) {
703  case 1:
704  {
705 
706  theLayer = tTopo->pxbLayer(detid);
707  std::cout << "\tPixel Barrel Layer " << theLayer << std::endl;
708  stereo = 1;
709  break;
710  }
711  case 2:
712  {
713 
714  theLayer = tTopo->pxfDisk(detid);
715  std::cout << "\tPixel Forward Disk " << theLayer << std::endl;
716  stereo = 1;
717  break;
718  }
719  case 3:
720  {
721 
722  theLayer = tTopo->tibLayer(detid);
723  std::cout << "\tTIB Layer " << theLayer << std::endl;
724  stereo = module.stereo();
725  break;
726  }
727  case 4:
728  {
729 
730  theLayer = tTopo->tidWheel(detid);
731  theRing = tTopo->tidRing(detid);
732  unsigned int theSide = module.side();
733  if ( theSide == 1 )
734  std::cout << "\tTID Petal Back " << std::endl;
735  else
736  std::cout << "\tTID Petal Front" << std::endl;
737  std::cout << "\tTID Layer " << theLayer << std::endl;
738  std::cout << "\tTID Ring " << theRing << std::endl;
739  stereo = module.stereo();
740  break;
741  }
742  case 5:
743  {
744 
745  theLayer = tTopo->tobLayer(detid);
746  stereo = tTopo->tobStereo(detid);
747  std::cout << "\tTOB Layer " << theLayer << std::endl;
748  break;
749  }
750  case 6:
751  {
752 
753  theLayer = tTopo->tecWheel(detid);
754  theRing = tTopo->tecRing(detid);
755  unsigned int theSide = module.petal()[0];
756  if ( theSide == 1 )
757  std::cout << "\tTEC Petal Back " << std::endl;
758  else
759  std::cout << "\tTEC Petal Front" << std::endl;
760  std::cout << "\tTEC Layer " << theLayer << std::endl;
761  std::cout << "\tTEC Ring " << theRing << std::endl;
762  stereo = module.stereo();
763  break;
764  }
765  default:
766  {
767  stereo = 0;
768  break;
769  }
770  }
771 
772  std::cout << "Thickness = " << 2.*halfThick-0.003 << "; " << thick * 9.36 << std::endl
773  << "Length = " << det.surface().bounds().length() << std::endl
774  << "Width = " << det.surface().bounds().width() << std::endl;
775 
776  std::cout << "Hit position = "
777  << hit.localPosition().x() << " "
778  << hit.localPosition().y() << " "
779  << hit.localPosition().z() << std::endl;
780 #endif
781 
782  // Check if the hit is on the physical volume of the module
783  // (It happens that it is not, in the case of double sided modules,
784  // because the envelope of the gluedDet is larger than each of
785  // the mono and the stereo modules)
786 
787  double dist = 0.;
788  GlobalPoint IP (mySimEvent->track(localTkID).vertex().position().x(),
789  mySimEvent->track(localTkID).vertex().position().y(),
790  mySimEvent->track(localTkID).vertex().position().z());
791 
792  dist = ( fabs(hit.localPosition().x()) > boundX ||
793  fabs(hit.localPosition().y()) > boundY ) ?
794  // Will be used later as a flag to reject the PSimHit!
795  -( det.surface().toGlobal(hit.localPosition()) - IP ).mag2()
796  :
797  // These hits are kept!
798  ( det.surface().toGlobal(hit.localPosition()) - IP ).mag2();
799 
800  // Fill Histos (~poor man event display)
801  /*
802  GlobalPoint gpos( det.toGlobal(hit.localPosition()));
803 // std::cout << "gpos.x() = " << gpos.x() << std::endl;
804 // std::cout << "gpos.y() = " << gpos.y() << std::endl;
805 
806  myHistos->fill("h300",gpos.x(),gpos.y());
807  if ( sin(gpos.phi()) > 0. )
808  myHistos->fill("h301",gpos.z(),gpos.perp());
809  else
810  myHistos->fill("h301",gpos.z(),-gpos.perp());
811  */
812  return std::pair<double,PSimHit>(dist,hit);
813 
814 }
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:114
virtual float length() const =0
unsigned int tibLayer(const DetId &id) const
unsigned int tidRing(const DetId &id) const
unsigned int pxfDisk(const DetId &id) const
unsigned int tecRing(const DetId &id) const
ring id
uint32_t tobStereo(const DetId &id) const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
GlobalPoint globalPosition() const
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:67
const Bounds & bounds() const
Definition: Surface.h:128
unsigned int tidWheel(const DetId &id) const
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:40
float float float z
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
LocalVector localMomentum() const
T mag() const
Definition: PV3DBase.h:67
tuple path
else: Piece not in the list, fine.
const math::XYZTLorentzVector & position() const
Temporary (until CMSSW moves to Mathcore) - No ! Actually very useful.
Definition: FSimVertex.h:49
T z() const
Definition: PV3DBase.h:64
tuple IP
Definition: listHistos.py:76
int closestDaughterId() const
Get the index of the closest charged daughter.
Definition: FSimTrack.h:187
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:77
const FSimVertex & vertex() const
Origin vertex.
unsigned int pxbLayer(const DetId &id) const
Vector3DBase unit() const
Definition: Vector3DBase.h:57
Definition: DetId.h:18
GlobalVector globalMomentum() const
int id() const
the index in FBaseSimEvent and other vectors
Definition: FSimTrack.h:86
bool noMother() const
no mother particle
tuple cout
Definition: gather_cfg.py:121
virtual float width() const =0
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:56
unsigned int tecWheel(const DetId &id) const
Definition: vlib.h:208
const FSimTrack & mother() const
mother
unsigned int tobLayer(const DetId &id) const
Global3DVector GlobalVector
Definition: GlobalVector.h:10
FSimTrack & track(int id) const
Return track with given Id.
TrajectoryStateOnSurface TrajectoryManager::makeTrajectoryState ( const DetLayer layer,
const ParticlePropagator pp,
const MagneticField field 
) const
private

Teddy, you must put comments there.

Definition at line 593 of file TrajectoryManager.cc.

References RawParticle::charge(), GeometricSearchDet::surface(), Surface::tangentPlane(), RawParticle::X(), RawParticle::Y(), and RawParticle::Z().

Referenced by createPSimHits().

596 {
597  GlobalPoint pos( pp.X(), pp.Y(), pp.Z());
598  GlobalVector mom( pp.Px(), pp.Py(), pp.Pz());
601  (GlobalTrajectoryParameters( pos, mom, TrackCharge( pp.charge()), field), *plane);
602 }
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
int TrackCharge
Definition: TrackCharge.h:4
double Y() const
y of vertex
Definition: RawParticle.h:275
double Z() const
z of vertex
Definition: RawParticle.h:276
double charge() const
get the MEASURED charge
Definition: RawParticle.h:282
virtual ReferenceCountingPointer< TangentPlane > tangentPlane(const GlobalPoint &) const =0
double X() const
x of vertex
Definition: RawParticle.h:274
void TrajectoryManager::moveAllDaughters ( int  fsimi,
const Rotation r,
double  rescale 
)
private

Move, rescale and rotate all daughters after propagation, material effects and decay of the mother.

Definition at line 533 of file TrajectoryManager.cc.

References FSimTrack::daughter(), FSimTrack::id(), FSimTrack::momentum(), mySimEvent, FSimTrack::nDaughters(), FSimTrack::setMomentum(), mathSSE::sqrt(), and FBaseSimEvent::track().

Referenced by updateWithDaughters().

533  {
534 
535  //
536  for ( unsigned idaugh=0; idaugh < (unsigned)(mySimEvent->track(fsimi).nDaughters()); ++idaugh) {
537  // Initial momentum of the daughter
538  XYZTLorentzVector daughMomentum (mySimEvent->track(fsimi).daughter(idaugh).momentum());
539  // Rotate and rescale
540  XYZVector newMomentum (r * daughMomentum.Vect());
541  newMomentum *= rescale;
542  double newEnergy = std::sqrt(newMomentum.mag2() + daughMomentum.mag2());
543  // Set the new momentum
544  mySimEvent->track(fsimi).setMomentum(XYZTLorentzVector(newMomentum.X(),newMomentum.Y(),newMomentum.Z(),newEnergy));
545  // Watch out : recursive call to get all grand-daughters
546  int fsimDaug = mySimEvent->track(fsimi).daughter(idaugh).id();
547  moveAllDaughters(fsimDaug,r,rescale);
548  }
549 }
const XYZTLorentzVector & momentum() const
Temporary (until move of SimTrack to Mathcore) - No! Actually very useful.
Definition: FSimTrack.h:190
void moveAllDaughters(int fsimi, const Rotation &r, double rescale)
Move, rescale and rotate all daughters after propagation, material effects and decay of the mother...
const FSimTrack & daughter(int i) const
Ith daughter.
int nDaughters() const
Number of daughters.
math::XYZVector XYZVector
T sqrt(T t)
Definition: SSEVec.h:48
int id() const
the index in FBaseSimEvent and other vectors
Definition: FSimTrack.h:86
void setMomentum(const math::XYZTLorentzVector &newMomentum)
Reset the momentum (to be used with care)
Definition: FSimTrack.h:193
math::XYZTLorentzVector XYZTLorentzVector
Definition: RawParticle.h:15
FSimTrack & track(int id) const
Return track with given Id.
void TrajectoryManager::propagateToCalorimeters ( ParticlePropagator PP,
int  fsimi,
RandomEngineAndDistribution const *  random 
)

Propagate the particle through the calorimeters.

Definition at line 378 of file TrajectoryManager.cc.

References BaseParticlePropagator::getSuccess(), BaseParticlePropagator::hasDecayed(), RawParticle::momentum(), mySimEvent, FSimTrack::notYetToEndVertex(), BaseParticlePropagator::propagateToEcalEntrance(), BaseParticlePropagator::propagateToHcalEntrance(), BaseParticlePropagator::propagateToPreshowerLayer1(), BaseParticlePropagator::propagateToPreshowerLayer2(), BaseParticlePropagator::propagateToVFcalEntrance(), FSimTrack::setEcal(), FSimTrack::setHcal(), FSimTrack::setLayer1(), FSimTrack::setLayer2(), SimTrack::setTkMomentum(), SimTrack::setTkPosition(), FSimTrack::setVFcal(), FBaseSimEvent::track(), updateWithDaughters(), and RawParticle::vertex().

Referenced by reconstruct().

378  {
379 
380  FSimTrack& myTrack = mySimEvent->track(fsimi);
381 
382  // Set the position and momentum at the end of the tracker volume
383  myTrack.setTkPosition(PP.vertex().Vect());
384  myTrack.setTkMomentum(PP.momentum());
385 
386  // Propagate to Preshower Layer 1
387  PP.propagateToPreshowerLayer1(false);
388  if ( PP.hasDecayed() ) {
389  updateWithDaughters(PP, fsimi, random);
390  return;
391  }
392  if ( myTrack.notYetToEndVertex(PP.vertex()) && PP.getSuccess() > 0 )
393  myTrack.setLayer1(PP,PP.getSuccess());
394 
395  // Propagate to Preshower Layer 2
396  PP.propagateToPreshowerLayer2(false);
397  if ( PP.hasDecayed() ) {
398  updateWithDaughters(PP, fsimi, random);
399  return;
400  }
401  if ( myTrack.notYetToEndVertex(PP.vertex()) && PP.getSuccess() > 0 )
402  myTrack.setLayer2(PP,PP.getSuccess());
403 
404  // Propagate to Ecal Endcap
405  PP.propagateToEcalEntrance(false);
406  if ( PP.hasDecayed() ) {
407  updateWithDaughters(PP, fsimi, random);
408  return;
409  }
410  if ( myTrack.notYetToEndVertex(PP.vertex()) )
411  myTrack.setEcal(PP,PP.getSuccess());
412 
413  // Propagate to HCAL entrance
414  PP.propagateToHcalEntrance(false);
415  if ( PP.hasDecayed() ) {
416  updateWithDaughters(PP,fsimi, random);
417  return;
418  }
419  if ( myTrack.notYetToEndVertex(PP.vertex()) )
420  myTrack.setHcal(PP,PP.getSuccess());
421 
422  // Propagate to VFCAL entrance
423  PP.propagateToVFcalEntrance(false);
424  if ( PP.hasDecayed() ) {
425  updateWithDaughters(PP,fsimi, random);
426  return;
427  }
428  if ( myTrack.notYetToEndVertex(PP.vertex()) )
429  myTrack.setVFcal(PP,PP.getSuccess());
430 
431 }
bool hasDecayed() const
Has the particle decayed while propagated ?
bool propagateToPreshowerLayer1(bool first=true)
void setEcal(const RawParticle &pp, int success)
Set the ecal variables.
Definition: FSimTrack.cc:69
int getSuccess() const
Has propagation been performed and was barrel or endcap reached ?
void setLayer2(const RawParticle &pp, int success)
Set the preshower layer2 variables.
Definition: FSimTrack.cc:62
TRandom random
Definition: MVATrainer.cc:138
bool notYetToEndVertex(const XYZTLorentzVector &pos) const
Compare the end vertex position with another position.
Definition: FSimTrack.cc:33
bool propagateToVFcalEntrance(bool first=true)
void setLayer1(const RawParticle &pp, int success)
Set the preshower layer1 variables.
Definition: FSimTrack.cc:55
const XYZTLorentzVector & momentum() const
the momentum fourvector
Definition: RawParticle.h:286
bool propagateToEcalEntrance(bool first=true)
const XYZTLorentzVector & vertex() const
the vertex fourvector
Definition: RawParticle.h:285
void setTkPosition(const math::XYZVectorD &pos)
Definition: SimTrack.h:40
bool propagateToHcalEntrance(bool first=true)
void setTkMomentum(const math::XYZTLorentzVectorD &mom)
Definition: SimTrack.h:42
void setVFcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition: FSimTrack.cc:83
void setHcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition: FSimTrack.cc:76
void updateWithDaughters(ParticlePropagator &PP, int fsimi, RandomEngineAndDistribution const *)
Decay the particle and update the SimEvent with daughters.
bool propagateToPreshowerLayer2(bool first=true)
FSimTrack & track(int id) const
Return track with given Id.
bool TrajectoryManager::propagateToLayer ( ParticlePropagator PP,
unsigned  layer 
)

Propagate a particle to a given tracker layer (for electron pixel matching mostly)

Definition at line 434 of file TrajectoryManager.cc.

References _theGeometry, TrackerInteractionGeometry::cylinderBegin(), TrackerInteractionGeometry::cylinderEnd(), run_regression::done, BaseParticlePropagator::getSuccess(), BaseParticlePropagator::onFiducial(), ParticlePropagator::propagateToBoundSurface(), and ParticlePropagator::setPropagationConditions().

434  {
435 
436  std::list<TrackerLayer>::const_iterator cyliter;
437  bool done = false;
438 
439  // Get the geometry elements
440  cyliter = _theGeometry->cylinderBegin();
441 
442  // Find the layer to propagate to.
443  for ( ; cyliter != _theGeometry->cylinderEnd() ; ++cyliter ) {
444 
445  if ( layer != cyliter->layerNumber() ) continue;
446 
447  PP.setPropagationConditions(*cyliter);
448 
449  done =
450  PP.propagateToBoundSurface(*cyliter) &&
451  PP.getSuccess() > 0 &&
452  PP.onFiducial();
453 
454  break;
455 
456  }
457 
458  return done;
459 
460 }
std::list< TrackerLayer >::const_iterator cylinderEnd() const
Returns the last pointer in the cylinder list.
int getSuccess() const
Has propagation been performed and was barrel or endcap reached ?
bool propagateToBoundSurface(const TrackerLayer &)
const TrackerInteractionGeometry * _theGeometry
void setPropagationConditions(const TrackerLayer &, bool firstLoop=true)
std::list< TrackerLayer >::const_iterator cylinderBegin() const
Returns the first pointer in the cylinder list.
bool onFiducial() const
Is the vertex on some material ?
void TrajectoryManager::reconstruct ( const TrackerTopology tTopo,
RandomEngineAndDistribution const *  random 
)

Does the real job.

Definition at line 146 of file TrajectoryManager.cc.

References _theFieldMap, _theGeometry, BaseRawParticleFilter::accept(), FBaseSimEvent::addSimVertex(), createPSimHits(), TrackerInteractionGeometry::cylinderBegin(), TrackerInteractionGeometry::cylinderEnd(), FSimVertexType::END_VERTEX, FBaseSimEvent::filter(), firstLoop, MaterialEffects::interact(), cmsHarvester::loop, mySimEvent, FSimTrack::nDaughters(), FSimTrack::notYetToEndVertex(), FSimEvent::nTracks(), propagateToCalorimeters(), pTmin, random, MaterialEffects::save(), FSimTrack::setPropagate(), jetcorrextractor::sign(), summarizeEdmComparisonLogfiles::success, theGeomTracker, theMaterialEffects, thePSimHits, FBaseSimEvent::track(), CoreSimTrack::type(), updateWithDaughters(), and use_hardcoded.

Referenced by FamosManager::reconstruct().

147 {
148 
149  // Clear the hits of the previous event
150  // thePSimHits->clear();
151  thePSimHits.clear();
152 
153  // The new event
154  XYZTLorentzVector myBeamPipe = XYZTLorentzVector(0.,2.5, 9999999.,0.);
155 
156  std::list<TrackerLayer>::const_iterator cyliter;
157 
158  // bool debug = mySimEvent->id().event() == 8;
159 
160  // Loop over the particles (watch out: increasing upper limit!)
161  for( int fsimi=0; fsimi < (int) mySimEvent->nTracks(); ++fsimi) {
162  // If the particle has decayed inside the beampipe, or decays
163  // immediately, there is nothing to do
164  //if ( debug ) std::cout << mySimEvent->track(fsimi) << std::endl;
165  //if ( debug ) std::cout << "Not yet at end vertex ? " << mySimEvent->track(fsimi).notYetToEndVertex(myBeamPipe) << std::endl;
166  if( !mySimEvent->track(fsimi).notYetToEndVertex(myBeamPipe) ) continue;
167  mySimEvent->track(fsimi).setPropagate();
168 
169  // Get the geometry elements
170  cyliter = _theGeometry->cylinderBegin();
171  // Prepare the propagation
173  //The real work starts here
174  int success = 1;
175  int sign = +1;
176  int loop = 0;
177  int cyl = 0;
178 
179  // Find the initial cylinder to propagate to.
180  for ( ; cyliter != _theGeometry->cylinderEnd() ; ++cyliter ) {
181 
182  PP.setPropagationConditions(*cyliter);
183  if ( PP.inside() && !PP.onSurface() ) break;
184  ++cyl;
185 
186  }
187 
188  // The particle has a pseudo-rapidity (position or momentum direction)
189  // in excess of 3.0. Just simply go to the last tracker layer
190  // without bothering with all the details of the propagation and
191  // material effects.
192  // 08/02/06 - pv: increase protection from 0.99 (eta=2.9932) to 0.9998 (eta=4.9517)
193  // to simulate material effects at large eta
194  // if above 0.99: propagate to the last tracker cylinder where the material is concentrated!
195  double ppcos2T = PP.cos2Theta();
196  double ppcos2V = PP.cos2ThetaV();
197 
198  if(use_hardcoded){
199  if ( ( ppcos2T > 0.99 && ppcos2T < 0.9998 ) && ( cyl == 0 || ( ppcos2V > 0.99 && ppcos2V < 0.9998 ) ) ){
200  if ( cyliter != _theGeometry->cylinderEnd() ) {
201  cyliter = _theGeometry->cylinderEnd();
202  --cyliter;
203  }
204  // if above 0.9998: don't propagate at all (only to the calorimeters directly)
205  } else if ( ppcos2T > 0.9998 && ( cyl == 0 || ppcos2V > 0.9998 ) ) {
206  cyliter = _theGeometry->cylinderEnd();
207  }
208  }
209  else {
210  if ( ppcos2T > 0.9998 && ( cyl == 0 || ppcos2V > 0.9998 ) ) {
211  cyliter = _theGeometry->cylinderEnd();
212  }
213  }
214 
215  // Loop over the cylinders
216  while ( cyliter != _theGeometry->cylinderEnd() &&
217  loop<100 && // No more than 100 loops
218  mySimEvent->track(fsimi).notYetToEndVertex(PP.vertex())) { // The particle decayed
219 
220  // Skip layers with no material (kept just for historical reasons)
221  if ( cyliter->surface().mediumProperties().radLen() < 1E-10 ) {
222  ++cyliter; ++cyl;
223  continue;
224  }
225 
226  // Pathological cases:
227  // To prevent from interacting twice in a row with the same layer
228  // bool escapeBarrel = (PP.getSuccess() == -1 && success == 1);
229  bool escapeBarrel = PP.getSuccess() == -1;
230  bool escapeEndcap = (PP.getSuccess() == -2 && success == 1);
231  // To break the loop
232  bool fullPropagation =
233  (PP.getSuccess() <= 0 && success==0) || escapeEndcap;
234 
235  if ( escapeBarrel ) {
236  ++cyliter; ++cyl;
237  while (cyliter != _theGeometry->cylinderEnd() && cyliter->forward() ) {
238  sign=1; ++cyliter; ++cyl;
239  }
240 
241  if ( cyliter == _theGeometry->cylinderEnd() ) {
242  --cyliter; --cyl; fullPropagation=true;
243  }
244 
245  }
246 
247  // Define the propagation conditions
248  PP.setPropagationConditions(*cyliter,!fullPropagation);
249  if ( escapeEndcap ) PP.increaseRCyl(0.0005);
250 
251  // Remember last propagation outcome
252  success = PP.getSuccess();
253 
254  // Propagation was not successful :
255  // Change the sign of the cylinder increment and count the loops
256  if ( !PP.propagateToBoundSurface(*cyliter) ||
257  PP.getSuccess()<=0) {
258  sign = -sign;
259  ++loop;
260  }
261 
262  // The particle may have decayed on its way... in which the daughters
263  // have to be added to the event record
264  if ( PP.hasDecayed() || (!mySimEvent->track(fsimi).nDaughters() && PP.PDGcTau()<1E-3 ) ) {
265  updateWithDaughters(PP, fsimi, random);
266  break;
267  }
268 
269  // Exit by the endcaps or innermost cylinder :
270  // Positive cylinder increment
271  if ( PP.getSuccess()==2 || cyliter==_theGeometry->cylinderBegin() )
272  sign = +1;
273 
274  // Successful propagation to a cylinder, with some Material :
275  if( PP.getSuccess() > 0 && PP.onFiducial() ) {
276 
277  bool saveHit =
278  ( (loop==0 && sign>0) || !firstLoop ) && // Save only first half loop
279  PP.charge()!=0. && // Consider only charged particles
280  cyliter->sensitive() && // Consider only sensitive layers
281  PP.Perp2()>pTmin*pTmin; // Consider only pT > pTmin
282 
283  // Material effects are simulated there
284  if ( theMaterialEffects )
285  theMaterialEffects->interact(*mySimEvent,*cyliter,PP,fsimi, random);
286 
287  // There is a PP.setXYZT=(0,0,0,0) if bremss fails
288  saveHit &= PP.E()>1E-6;
289 
290  if ( saveHit ) {
291  // Consider only active layers
292  if ( cyliter->sensitive() ) {
293  // Add information to the FSimTrack (not yet available)
294  // myTrack.addSimHit(PP,layer);
295 
296  // Return one or two (for overlap regions) PSimHits in the full
297  // tracker geometry
298  if ( theGeomTracker )
299  createPSimHits(*cyliter, PP, thePSimHits[fsimi], fsimi,mySimEvent->track(fsimi).type(), tTopo);
300 
301  /*
302  myHistos->fill("h302",PP.X() ,PP.Y());
303  if ( sin(PP.vertex().Phi()) > 0. )
304  myHistos->fill("h303",PP.Z(),PP.R());
305  else
306  myHistos->fill("h303",PP.Z(),-PP.R());
307  */
308 
309  }
310  }
311 
312  // Fill Histos (~poor man event display)
313  /*
314  myHistos->fill("h300",PP.x(),PP.y());
315  if ( sin(PP.vertex().phi()) > 0. )
316  myHistos->fill("h301",PP.z(),sqrt(PP.vertex().Perp2()));
317  else
318  myHistos->fill("h301",PP.z(),-sqrt(PP.vertex().Perp2()));
319  */
320 
321  //The particle may have lost its energy in the material
322  if ( mySimEvent->track(fsimi).notYetToEndVertex(PP.vertex()) &&
323  !mySimEvent->filter().accept(PP) )
325 
326  }
327 
328  // Stop here if the particle has reached an end
329  if ( mySimEvent->track(fsimi).notYetToEndVertex(PP.vertex()) ) {
330 
331  // Otherwise increment the cylinder iterator
332  // do {
333  if (sign==1) {++cyliter;++cyl;}
334  else {--cyliter;--cyl;}
335 
336  // Check if the last surface has been reached
337  if( cyliter==_theGeometry->cylinderEnd()) {
338 
339  // Try to propagate to the ECAL in half a loop
340  // Note: Layer1 = ECAL Barrel entrance, or Preshower
341  // entrance, or ECAL Endcap entrance (in the corner)
342  PP.propagateToEcal();
343  // PP.propagateToPreshowerLayer1();
344 
345  // If it is not possible, try go back to the last cylinder
346  if(PP.getSuccess()==0) {
347  --cyliter; --cyl; sign = -sign;
348  PP.setPropagationConditions(*cyliter);
349  PP.propagateToBoundSurface(*cyliter);
350 
351  // If there is definitely no way, leave it here.
352  if(PP.getSuccess()<0) {++cyliter; ++cyl;}
353 
354  }
355 
356  // Check if the particle has decayed on the way to ECAL
357  if ( PP.hasDecayed() )
358  updateWithDaughters(PP, fsimi, random);
359 
360  }
361  }
362 
363  }
364 
365  // Propagate all particles without a end vertex to the Preshower,
366  // theECAL and the HCAL.
367  if ( mySimEvent->track(fsimi).notYetToEndVertex(PP.vertex()) )
368  propagateToCalorimeters(PP, fsimi, random);
369 
370  }
371 
372  // Save the information from Nuclear Interaction Generation
374 
375 }
int addSimVertex(const XYZTLorentzVector &decayVertex, int im=-1, FSimVertexType::VertexType type=FSimVertexType::ANY)
Add a new vertex to the Event and to the various lists.
void propagateToCalorimeters(ParticlePropagator &PP, int fsimi, RandomEngineAndDistribution const *)
Propagate the particle through the calorimeters.
void createPSimHits(const TrackerLayer &layer, const ParticlePropagator &P_before, std::map< double, PSimHit > &theHitMap, int trackID, int partID, const TrackerTopology *tTopo)
Create a vector of PSimHits.
const MagneticFieldMap * _theFieldMap
const TrackerGeometry * theGeomTracker
double sign(double x)
std::list< TrackerLayer >::const_iterator cylinderEnd() const
Returns the last pointer in the cylinder list.
void setPropagate()
The particle has been propgated through the tracker.
Definition: FSimTrack.cc:49
int nDaughters() const
Number of daughters.
int loop
CMSSW
TRandom random
Definition: MVATrainer.cc:138
bool notYetToEndVertex(const XYZTLorentzVector &pos) const
Compare the end vertex position with another position.
Definition: FSimTrack.cc:33
const TrackerInteractionGeometry * _theGeometry
MaterialEffects * theMaterialEffects
void save()
Save nuclear interaction information.
unsigned int nTracks() const
Number of tracks.
Definition: FSimEvent.cc:42
std::map< unsigned, std::map< double, PSimHit > > thePSimHits
bool accept(const RawParticle &p) const
void interact(FSimEvent &simEvent, const TrackerLayer &layer, ParticlePropagator &PP, unsigned i, RandomEngineAndDistribution const *)
std::list< TrackerLayer >::const_iterator cylinderBegin() const
Returns the first pointer in the cylinder list.
int type() const
particle type (HEP PDT convension)
Definition: CoreSimTrack.h:25
const KineParticleFilter & filter() const
void updateWithDaughters(ParticlePropagator &PP, int fsimi, RandomEngineAndDistribution const *)
Decay the particle and update the SimEvent with daughters.
math::XYZTLorentzVector XYZTLorentzVector
Definition: RawParticle.h:15
FSimTrack & track(int id) const
Return track with given Id.
const TrackerInteractionGeometry * TrajectoryManager::theGeometry ( )

Returns the pointer to geometry.

Definition at line 129 of file TrajectoryManager.cc.

References _theGeometry.

129  {
130  return _theGeometry;
131 }
const TrackerInteractionGeometry * _theGeometry
void TrajectoryManager::updateWithDaughters ( ParticlePropagator PP,
int  fsimi,
RandomEngineAndDistribution const *  random 
)
private

Decay the particle and update the SimEvent with daughters.

Definition at line 463 of file TrajectoryManager.cc.

References FBaseSimEvent::addSimTrack(), FBaseSimEvent::addSimVertex(), angle(), RawParticle::charge(), FSimVertexType::DECAY_VERTEX, decayer, distCut, FSimTrack::endVertex(), FSimVertex::id(), FSimTrack::momentum(), RawParticle::momentum(), moveAllDaughters(), myDecayEngine, mySimEvent, FSimTrack::nDaughters(), PythiaDecays::particleDaughtersPy6(), PythiaDecays::particleDaughtersPy8(), alignCSCRings::r, FSimTrack::setClosestDaughterId(), FSimVertex::setPosition(), mathSSE::sqrt(), RandomEngineAndDistribution::theEngine(), FBaseSimEvent::track(), FBaseSimEvent::vertex(), and RawParticle::vertex().

Referenced by propagateToCalorimeters(), and reconstruct().

463  {
464 
465  // The particle was already decayed in the GenEvent, but still the particle was
466  // allowed to propagate (for magnetic field bending, for material effects, etc...)
467  // Just modify the momentum of the daughters in that case
468  unsigned nDaugh = mySimEvent->track(fsimi).nDaughters();
469  if ( nDaugh ) {
470 
471  // Move the vertex
472  unsigned vertexId = mySimEvent->track(fsimi).endVertex().id();
473  mySimEvent->vertex(vertexId).setPosition(PP.vertex());
474 
475  // Before-propagation and after-propagation momentum and vertex position
476  XYZTLorentzVector momentumBefore = mySimEvent->track(fsimi).momentum();
477  XYZTLorentzVector momentumAfter = PP.momentum();
478  double magBefore = std::sqrt(momentumBefore.Vect().mag2());
479  double magAfter = std::sqrt(momentumAfter.Vect().mag2());
480  // Rotation to be applied
481  XYZVector axis = momentumBefore.Vect().Cross(momentumAfter.Vect());
482  double angle = std::acos(momentumBefore.Vect().Dot(momentumAfter.Vect())/(magAfter*magBefore));
483  Rotation r(axis,angle);
484  // Rescaling to be applied
485  double rescale = magAfter/magBefore;
486 
487  // Move, rescale and rotate daugthers, grand-daughters, etc.
488  moveAllDaughters(fsimi,r,rescale);
489 
490  // The particle is not decayed in the GenEvent, decay it with PYTHIA
491  } else {
492 
493  // Decays are not activated : do nothing
494  if ( !myDecayEngine ) return;
495 
496  // Invoke PYDECY (Pythia6) or Pythia8 to decay the particle and get the daughters
497  const DaughterParticleList& daughters = (decayer == "pythia6") ? myDecayEngine->particleDaughtersPy6(PP, &random->theEngine()) :
498  myDecayEngine->particleDaughtersPy8(PP, &random->theEngine());
499 
500  // Update the FSimEvent with an end vertex and with the daughters
501  if ( daughters.size() ) {
502  double distMin = 1E99;
503  int theClosestChargedDaughterId = -1;
504  DaughterParticleIterator daughter = daughters.begin();
505 
506  int ivertex = mySimEvent->addSimVertex(daughter->vertex(),fsimi,
508 
509  if ( ivertex != -1 ) {
510  for ( ; daughter != daughters.end(); ++daughter) {
511  int theDaughterId = mySimEvent->addSimTrack(&(*daughter), ivertex);
512  // Find the closest charged daughter (if charged mother)
513  if ( PP.charge() * daughter->charge() > 1E-10 ) {
514  double dist = (daughter->Vect().Unit().Cross(PP.Vect().Unit())).R();
515  if ( dist < distCut && dist < distMin ) {
516  distMin = dist;
517  theClosestChargedDaughterId = theDaughterId;
518  }
519  }
520  }
521  }
522  // Attach mother and closest daughter sp as to cheat tracking ;-)
523  if ( theClosestChargedDaughterId >=0 )
524  mySimEvent->track(fsimi).setClosestDaughterId(theClosestChargedDaughterId);
525  }
526 
527  }
528 
529 }
int id() const
the index in FBaseSimEvent
Definition: FSimVertex.h:44
int addSimVertex(const XYZTLorentzVector &decayVertex, int im=-1, FSimVertexType::VertexType type=FSimVertexType::ANY)
Add a new vertex to the Event and to the various lists.
PythiaDecays * myDecayEngine
int addSimTrack(const RawParticle *p, int iv, int ig=-1, const HepMC::GenVertex *ev=0)
Add a new track to the Event and to the various lists.
const FSimVertex & endVertex() const
end vertex
const DaughterParticleList & particleDaughtersPy6(ParticlePropagator &particle, CLHEP::HepRandomEngine *)
void setPosition(const math::XYZTLorentzVector &newPosition)
Reset the position (to be used with care)
Definition: FSimVertex.h:52
const XYZTLorentzVector & momentum() const
Temporary (until move of SimTrack to Mathcore) - No! Actually very useful.
Definition: FSimTrack.h:190
void moveAllDaughters(int fsimi, const Rotation &r, double rescale)
Move, rescale and rotate all daughters after propagation, material effects and decay of the mother...
int nDaughters() const
Number of daughters.
DaughterParticleList::const_iterator DaughterParticleIterator
Definition: PythiaDecays.h:29
void setClosestDaughterId(int id)
Set the index of the closest charged daughter.
Definition: FSimTrack.h:184
TRandom random
Definition: MVATrainer.cc:138
ROOT::Math::AxisAngle Rotation
FSimVertex & vertex(int id) const
Return vertex with given Id.
const DaughterParticleList & particleDaughtersPy8(ParticlePropagator &particle, CLHEP::HepRandomEngine *)
Definition: PythiaDecays.cc:66
const XYZTLorentzVector & momentum() const
the momentum fourvector
Definition: RawParticle.h:286
math::XYZVector XYZVector
T sqrt(T t)
Definition: SSEVec.h:48
double charge() const
get the MEASURED charge
Definition: RawParticle.h:282
const XYZTLorentzVector & vertex() const
the vertex fourvector
Definition: RawParticle.h:285
math::XYZTLorentzVector XYZTLorentzVector
Definition: RawParticle.h:15
std::vector< RawParticle > DaughterParticleList
Definition: PythiaDecays.h:28
FSimTrack & track(int id) const
Return track with given Id.
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11

Member Data Documentation

const MagneticFieldMap* TrajectoryManager::_theFieldMap
private

Definition at line 143 of file TrajectoryManager.h.

Referenced by initializeRecoGeometry(), and reconstruct().

const TrackerInteractionGeometry* TrajectoryManager::_theGeometry
private
std::string TrajectoryManager::decayer
private

Definition at line 148 of file TrajectoryManager.h.

Referenced by TrajectoryManager(), and updateWithDaughters().

double TrajectoryManager::distCut
private

Definition at line 149 of file TrajectoryManager.h.

Referenced by TrajectoryManager(), and updateWithDaughters().

bool TrajectoryManager::firstLoop
private

Definition at line 152 of file TrajectoryManager.h.

Referenced by reconstruct(), and TrajectoryManager().

PythiaDecays* TrajectoryManager::myDecayEngine
private

Definition at line 147 of file TrajectoryManager.h.

Referenced by TrajectoryManager(), updateWithDaughters(), and ~TrajectoryManager().

FSimEvent* TrajectoryManager::mySimEvent
private
double TrajectoryManager::pTmin
private

Definition at line 151 of file TrajectoryManager.h.

Referenced by reconstruct(), and TrajectoryManager().

const GeometricSearchTracker* TrajectoryManager::theGeomSearchTracker
private

Definition at line 156 of file TrajectoryManager.h.

Referenced by initializeLayerMap(), and initializeRecoGeometry().

const TrackerGeometry* TrajectoryManager::theGeomTracker
private

Definition at line 155 of file TrajectoryManager.h.

Referenced by initializeTrackerGeometry(), and reconstruct().

std::vector<const DetLayer*> TrajectoryManager::theLayerMap
private

Definition at line 157 of file TrajectoryManager.h.

Referenced by detLayer(), and initializeLayerMap().

MaterialEffects* TrajectoryManager::theMaterialEffects
private
int TrajectoryManager::theNegLayerOffset
private

Definition at line 158 of file TrajectoryManager.h.

Referenced by detLayer(), and initializeLayerMap().

std::map<unsigned,std::map<double,PSimHit> > TrajectoryManager::thePSimHits
private

Definition at line 153 of file TrajectoryManager.h.

Referenced by loadSimHits(), and reconstruct().

bool TrajectoryManager::use_hardcoded
private

Definition at line 162 of file TrajectoryManager.h.

Referenced by reconstruct(), and TrajectoryManager().