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
00017
00018
00019 using namespace std;
00020
00021 const float MultipleScatteringParametrisation::x0ToSigma = 0.0136;
00022
00023
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
00060
00061
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
00071
00072
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
00091
00092
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 }