CMS 3D CMS Logo

ConversionSeedFinder.cc

Go to the documentation of this file.
00001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00002 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionSeedFinder.h"
00003 // Field
00004 #include "MagneticField/Engine/interface/MagneticField.h"
00005 // Geometry
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   //List the DetLayers crossed by a straight line from the centre of the 
00055   //detector to the supercluster position
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   // now create error matrix
00088   // dpos = 4mm/sqrt(E), dtheta = move vertex by 1sigma
00089   float dpos = 0.4/sqrt(theSCenergy_);
00090   dpos *= 2.;
00091   float dphi = dpos/theSCPosition_.perp();
00092   //  float dp = 0.03 * sqrt(theCaloEnergy);
00093   //  float dp = theCaloEnergy / sqrt(12.); // for fun
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     //    std::cout   <<  " barrel layer radius " << r << " " << barrelLayer->specificSurface().bounds().length()/2. << "\n";
00138 
00139   } else {
00140     const ForwardDetLayer * forwardLayer = dynamic_cast<const ForwardDetLayer*>(layer);
00141     float z =  fabs(forwardLayer->surface().position().z());
00142     //    std::cout   << " forward layer position " << z << " " << forwardLayer->specificSurface().innerRadius() << " " << forwardLayer->specificSurface().outerRadius() << "\n";
00143   }
00144 }
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 

Generated on Tue Jun 9 17:43:26 2009 for CMSSW by  doxygen 1.5.4