CMS 3D CMS Logo

MultipleScatteringParametrisation.cc

Go to the documentation of this file.
00001 
00002 #include <vector>
00003 #include "RecoTracker/TkMSParametrization/interface/MultipleScatteringParametrisation.h"
00004 #include "TrackingTools/DetLayers/interface/DetLayer.h"
00005 #include "RecoTracker/TkMSParametrization/interface/PixelRecoPointRZ.h"
00006 #include "RecoTracker/TkMSParametrization/interface/PixelRecoLineRZ.h"
00007 
00008 template <class T> T sqr( T t) {return t*t;}
00009 
00010 #include "RecoTracker/TkMSParametrization/interface/MSLayersKeeper.h"
00011 #include "RecoTracker/TkMSParametrization/interface/MSLayersKeeperX0AtEta.h"
00012 #include "RecoTracker/TkMSParametrization/interface/MSLayersKeeperX0Averaged.h"
00013 #include "RecoTracker/TkMSParametrization/interface/MSLayersKeeperX0DetLayer.h"
00014 #include "RecoTracker/TkMSParametrization/interface/MSLayersAtAngle.h"
00015 
00016 //#include "Utilities/Notification/interface/TimingReport.h"
00017 //#include "RecoTracker/TkMSParametrization/interface/PixelRecoUtilities.h"
00018 
00019 using namespace std;
00020 
00021 const float MultipleScatteringParametrisation::x0ToSigma = 0.0136;
00022 
00023 //using namespace PixelRecoUtilities;
00024 //----------------------------------------------------------------------
00025 MultipleScatteringParametrisation::
00026 MultipleScatteringParametrisation( const DetLayer* layer,const edm::EventSetup &iSetup, X0Source x0Source)
00027  
00028 {
00029   switch (x0Source) {
00030   case useX0AtEta: { 
00031     static MSLayersKeeperX0AtEta x0AtEta; 
00032     theLayerKeeper = &x0AtEta;
00033     break;
00034   }
00035   case useX0DataAveraged: {
00036     static MSLayersKeeperX0Averaged x0Averaged;
00037     theLayerKeeper = &x0Averaged;
00038     break;
00039   }
00040 
00041   case useDetLayer: {
00042     static MSLayersKeeperX0DetLayer x0DetLayer;
00043     theLayerKeeper = &x0DetLayer;
00044     break;
00045   }
00046   default:
00047     cout << "** MultipleScatteringParametrisation ** wrong x0Source"<<endl;
00048     return;
00049   }
00050   theLayerKeeper->init(iSetup);
00051   if (!layer) return;
00052   theLayer = theLayerKeeper->layer(layer);
00053 } 
00054 
00055 //----------------------------------------------------------------------
00056 float MultipleScatteringParametrisation::operator()(
00057     float pT, float cotTheta) const
00058 {
00059 //   static TimingReport::Item * theTimer =
00060 //      initTiming("MultScattering from vertex",5);
00061 //   TimeMe tm( *theTimer, false);
00062   float sumX0D = theLayer.sumX0D(cotTheta); 
00063   return x0ToSigma * sumX0D /pT;
00064 }
00065 
00066 //----------------------------------------------------------------------
00067 float MultipleScatteringParametrisation::operator()(
00068   float pT, float cotTheta, const PixelRecoPointRZ & pointI) const
00069 {
00070 //   static TimingReport::Item * theTimer =
00071 //       initTiming("MultScattering 1p constraint",5);
00072 //   TimeMe tm( *theTimer, false);
00073 
00074   PixelRecoLineRZ lineIO(pointI,cotTheta);
00075   PixelRecoPointRZ pointO = theLayer.crossing(lineIO).first;
00076 
00077   const MSLayersAtAngle & layersAtEta = theLayerKeeper->layers(cotTheta);
00078   
00079   float sumX0D = layersAtEta.sumX0D(pointI, pointO);
00080   return x0ToSigma * sumX0D /pT;
00081 }
00082 
00083 //----------------------------------------------------------------------
00084 float MultipleScatteringParametrisation::operator()(
00085     float pT,
00086     const PixelRecoPointRZ & pointI,
00087     const PixelRecoPointRZ & pointO,
00088     Consecutive consecutive) const
00089 {   
00090 //   static TimingReport::Item * theTimer =
00091 //       initTiming("MultScattering 2p constraint",5);
00092 //   TimeMe tm( *theTimer, false);
00093 
00094 
00095   PixelRecoLineRZ lineIO(pointI, pointO);
00096   PixelRecoPointRZ pointM = theLayer.crossing(lineIO).first;
00097   float cotTheta = lineIO.cotLine();
00098 
00099   if (consecutive==useConsecutive) {
00100     float dist = fabs(  (pointO.r()-pointM.r())
00101                       * (pointM.r()-pointI.r())
00102                       / (pointO.r()-pointI.r()) );
00103     return  x0ToSigma * sqrt(theLayer.x0(cotTheta)) * dist /pT;
00104   } else {
00105     const MSLayersAtAngle & layersAtEta = theLayerKeeper->layers(cotTheta);
00106     float sumX0D = layersAtEta.sumX0D(pointI, pointM, pointO);
00107     return x0ToSigma * sumX0D /pT;
00108   }
00109 }

Generated on Tue Jun 9 17:45:52 2009 for CMSSW by  doxygen 1.5.4