00001 #ifndef TRAJECTORYMANAGER_H
00002 #define TRAJECTORYMANAGER_H
00003
00004
00005 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
00006 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
00007
00008
00009 #include "FastSimulation/MaterialEffects/interface/MaterialEffects.h"
00010
00034 #include <vector>
00035 #include <map>
00036
00037 class Pythia6Decays;
00038 class TrackerInteractionGeometry;
00039 class TrackerLayer;
00040 class ParticlePropagator;
00041 class FSimEvent;
00042
00043 class RandomEngine;
00044 class TrajectoryStateOnSurface;
00045 class DetLayer;
00046 class GeomDet;
00047 class GeomDetUnit;
00048 class MagneticField;
00049 class MagneticFieldMap;
00050 class GeometricSearchTracker;
00051 class TrackerGeometry;
00052
00053 namespace edm {
00054 class ParameterSet;
00055 }
00056
00057 class TrajectoryManager
00058
00059 {
00060 public:
00061
00063 TrajectoryManager() {;}
00064
00066 TrajectoryManager(FSimEvent* aSimEvent,
00067 const edm::ParameterSet& matEff,
00068 const edm::ParameterSet& simHits,
00069 const edm::ParameterSet& decays,
00070 const RandomEngine* engine);
00071
00073 ~TrajectoryManager();
00074
00076 void reconstruct();
00077
00079 void createPSimHits(const TrackerLayer& layer,
00080 const ParticlePropagator& P_before,
00081 std::map<double,PSimHit>& theHitMap,
00082 int trackID, int partID);
00083
00085 void propagateToCalorimeters(ParticlePropagator& PP,
00086 int fsimi);
00087
00088
00091 bool propagateToLayer(ParticlePropagator& PP,unsigned layer);
00092
00094 const TrackerInteractionGeometry* theGeometry();
00095
00097 void initializeRecoGeometry(const GeometricSearchTracker* geomSearchTracker,
00098 const TrackerInteractionGeometry* interactionGeometry,
00099 const MagneticFieldMap* aFieldMap);
00100
00102 void initializeTrackerGeometry(const TrackerGeometry* geomTracker);
00103
00104
00105 void loadSimHits(edm::PSimHitContainer & c) const;
00106
00107 private:
00108
00110 void updateWithDaughters(ParticlePropagator& PP, int fsimi);
00111
00113 void initializeLayerMap();
00114
00116 TrajectoryStateOnSurface makeTrajectoryState( const DetLayer* layer,
00117 const ParticlePropagator& pp,
00118 const MagneticField* field) const;
00119
00121 void makePSimHits( const GeomDet* det, const TrajectoryStateOnSurface& ts,
00122 std::map<double,PSimHit>& theHitMap,
00123 int tkID, float el, float thick, int pID);
00125 std::pair<double,PSimHit> makeSinglePSimHit( const GeomDetUnit& det,
00126 const TrajectoryStateOnSurface& ts,
00127 int tkID, float el, float thick, int pID) const;
00128
00130 const DetLayer* detLayer( const TrackerLayer& layer, float zpos) const;
00131
00132 private:
00133
00134 FSimEvent* mySimEvent;
00135
00136 const TrackerInteractionGeometry* _theGeometry;
00137 const MagneticFieldMap* _theFieldMap;
00138
00139 MaterialEffects* theMaterialEffects;
00140
00141 Pythia6Decays* myDecayEngine;
00142 double distCut;
00143
00144 double pTmin;
00145 bool firstLoop;
00146 std::map<unsigned,std::map<double,PSimHit> > thePSimHits;
00147
00148 const TrackerGeometry* theGeomTracker;
00149 const GeometricSearchTracker* theGeomSearchTracker;
00150 std::vector<const DetLayer*> theLayerMap;
00151 int theNegLayerOffset;
00152
00153
00154
00155 const RandomEngine* random;
00156
00157 };
00158 #endif