00001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00002 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionSeedFinder.h"
00003
00004 #include "MagneticField/Engine/interface/MagneticField.h"
00005
00006 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00007 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00008
00009 #include "RecoTracker/TkDetLayers/interface/GeometricSearchTracker.h"
00010 #include "RecoTracker/TkNavigation/interface/StartingLayerFinder.h"
00011 #include "RecoTracker/TkNavigation/interface/LayerCollector.h"
00012
00013
00014 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00015 #include "RecoTracker/Record/interface/TrackerRecoGeometryRecord.h"
00016 #include "RecoTracker/Record/interface/CkfComponentsRecord.h"
00017
00018 ConversionSeedFinder::ConversionSeedFinder(const edm::ParameterSet& config ):
00019 conf_(config),
00020 theUpdator_()
00021 {
00022
00023 LogDebug("ConversionSeedFinder") << " CTOR " << "\n";
00024
00025
00026 }
00027
00028
00029
00030 void ConversionSeedFinder::setEvent(const edm::Event& evt ) {
00031
00032 theMeasurementTracker_->update(evt);
00033 theTrackerGeom_= this->getMeasurementTracker()->geomTracker();
00034
00035 }
00036
00037 void ConversionSeedFinder::setEventSetup(const edm::EventSetup& es ) {
00038 es.get<TrackerRecoGeometryRecord>().get( theGeomSearchTracker_);
00039 es.get<IdealMagneticFieldRecord>().get( theMF_ );
00040
00041
00042 edm::ESHandle<MeasurementTracker> measurementTrackerHandle;
00043 es.get<CkfComponentsRecord>().get(measurementTrackerHandle);
00044 theMeasurementTracker_ = measurementTrackerHandle.product();
00045
00046
00047 }
00048
00049
00050 void ConversionSeedFinder::findLayers() const {
00051
00052
00053 int charge;
00054
00055
00056 GlobalPoint vertex(0.,0.,0.);
00057 charge=-1;
00058 FreeTrajectoryState theStraightLineFTS = trackStateFromClusters(charge, vertex, alongMomentum, 1.);
00059
00060 findLayers( theStraightLineFTS );
00061
00062
00063 }
00064
00065 FreeTrajectoryState ConversionSeedFinder::trackStateFromClusters( int charge, const GlobalPoint & theOrigin,
00066 PropagationDirection dir, float scaleFactor) const {
00067
00068
00069
00070 double caloEnergy = theSCenergy_ * scaleFactor ;
00071
00072 GlobalVector radiusCalo = theSCPosition_ - theOrigin ;
00073
00074 GlobalVector momentumWithoutCurvature = radiusCalo.unit() * caloEnergy;
00075
00076
00077 GlobalTrajectoryParameters gtp;
00078 if(dir == alongMomentum) {
00079 gtp = GlobalTrajectoryParameters(theOrigin, momentumWithoutCurvature, charge, &(*theMF_) ) ;
00080 } else {
00081 gtp = GlobalTrajectoryParameters(theSCPosition_, momentumWithoutCurvature, charge, &(*theMF_) ) ;
00082 }
00083
00084
00085
00086
00087
00088
00089 float dpos = 0.4/sqrt(theSCenergy_);
00090 dpos *= 2.;
00091 float dphi = dpos/theSCPosition_.perp();
00092
00093
00094 float theta1 = theSCPosition_.theta();
00095 float theta2 = atan2(double(theSCPosition_.perp()), theSCPosition_.z()-5.5);
00096 float dtheta = theta1 - theta2;
00097 AlgebraicSymMatrix m(5,1) ;
00098 m[0][0] = 1.; m[1][1] = dpos*dpos ; m[2][2] = dpos*dpos ;
00099 m[3][3] = dphi*dphi ; m[4][4] = dtheta * dtheta ;
00100
00101 FreeTrajectoryState fts(gtp, CurvilinearTrajectoryError(m)) ;
00102
00103 return fts ;
00104
00105
00106 }
00107
00108 void ConversionSeedFinder::findLayers(const FreeTrajectoryState & traj) const {
00109
00110
00111
00112 theLayerList_.clear();
00113
00114
00115 StraightLinePropagator prop( &(*theMF_), alongMomentum);
00116
00117 StartingLayerFinder starter(&prop, this->getMeasurementTracker() );
00118
00119 LayerCollector collector(&prop, &starter, 5., 5.);
00120
00121 theLayerList_ = collector.allLayers(traj);
00122
00123
00124 for(unsigned int i = 0; i < theLayerList_.size(); ++i) {
00125 printLayer(i);
00126 }
00127
00128
00129 }
00130
00131
00132 void ConversionSeedFinder::printLayer(int i) const {
00133 const DetLayer * layer = theLayerList_[i];
00134 if (layer->location() == GeomDetEnumerators::barrel ) {
00135 const BarrelDetLayer * barrelLayer = dynamic_cast<const BarrelDetLayer*>(layer);
00136 float r = barrelLayer->specificSurface().radius();
00137
00138
00139 } else {
00140 const ForwardDetLayer * forwardLayer = dynamic_cast<const ForwardDetLayer*>(layer);
00141 float z = fabs(forwardLayer->surface().position().z());
00142
00143 }
00144 }
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155