00001 #include "EnergyResolution.h"
00002
00003 #include <cmath>
00004
00005
00006
00007 Double_t EnergyResolution::GetResolution(Double_t trkmomentum, Double_t trkmomentumerr, Double_t shwenergy, Double_t shwenergyerr, Bool_t rangecurve, Bool_t containedvertex, Detector::Detector_t detector, ReleaseType::Release_t release)
00008 {
00009 Double_t muon_resolution = MuonResolution(trkmomentum, trkmomentumerr,
00010 rangecurve, containedvertex, detector, release );
00011
00012 Double_t shower_resolution = ShowerResolution(shwenergy, shwenergyerr,
00013 detector, release );
00014
00015 return sqrt( muon_resolution*muon_resolution + shower_resolution*shower_resolution );
00016 }
00017
00018
00019
00020 Double_t EnergyResolution::ShowerResolution(Double_t shwenergy, Double_t shwenergyerr, Detector::Detector_t detector, ReleaseType::Release_t release)
00021 {
00022
00023 if( (release&ReleaseType::kDogwood)==(ReleaseType::kDogwood) ){
00024 if( detector == Detector::kNear ) return ShowerResolutionDogwoodNear(shwenergy, shwenergyerr);
00025 if( detector == Detector::kFar ) return ShowerResolutionDogwoodFar(shwenergy, shwenergyerr);
00026 }
00027
00028
00029 else if( (release&ReleaseType::kCedar)==(ReleaseType::kCedar) ){
00030 if( detector == Detector::kNear ) return ShowerResolutionCedar(shwenergy, shwenergyerr);
00031 if( detector == Detector::kFar ) return ShowerResolutionCedar(shwenergy, shwenergyerr);
00032 }
00033
00034
00035 return 0.0;
00036 }
00037
00038
00039
00040 Double_t EnergyResolution::MuonResolution(Double_t trkmomentum, Double_t trkmomentumerr, Bool_t rangecurve, Bool_t containedvertex, Detector::Detector_t detector, ReleaseType::Release_t release)
00041 {
00042
00043 if( (release&ReleaseType::kDogwood)==(ReleaseType::kDogwood) ){
00044 if( detector == Detector::kNear ) return MuonResolutionDogwoodNear(trkmomentum,trkmomentumerr,
00045 rangecurve,containedvertex);
00046 if( detector == Detector::kFar ) return MuonResolutionDogwoodFar(trkmomentum,trkmomentumerr,
00047 rangecurve,containedvertex);
00048 }
00049
00050
00051 else if( (release&ReleaseType::kCedar)==(ReleaseType::kCedar) ){
00052 if( detector == Detector::kNear ) return MuonResolutionCedar(trkmomentum,trkmomentumerr,
00053 rangecurve,containedvertex);
00054 if( detector == Detector::kFar ) return MuonResolutionCedar(trkmomentum,trkmomentumerr,
00055 rangecurve,containedvertex);
00056 }
00057
00058
00059 return 0.0;
00060 }
00061
00062
00063
00064
00065
00066 Double_t EnergyResolution::MuonResolutionDogwoodNear( Double_t trkmomentum, Double_t trkmomentumerr, Bool_t rangecurve, Bool_t containedvertex )
00067 {
00068 return MuonResolutionCedar(trkmomentum, trkmomentumerr, rangecurve, containedvertex);
00069 }
00070
00071 Double_t EnergyResolution::MuonResolutionDogwoodFar( Double_t trkmomentum, Double_t trkmomentumerr, Bool_t rangecurve, Bool_t containedvertex )
00072 {
00073 return MuonResolutionCedar(trkmomentum, trkmomentumerr, rangecurve, containedvertex);
00074 }
00075
00076 Double_t EnergyResolution::MuonResolutionCedar( Double_t trkmomentum, Double_t trkmomentumerr, Bool_t rangecurve, Bool_t containedvertex )
00077 {
00078 if( containedvertex ){
00079
00080
00081 if( rangecurve ){
00082 Double_t trkmomentum_input = trkmomentum;
00083 if( trkmomentum_input<0.0 ) trkmomentum_input = 0.0;
00084
00085 Double_t fRange0 = 0.0;
00086 Double_t fRange1 = 0.0467;
00087 Double_t fRange2 = 0.0700;
00088
00089 Double_t rangesigma0 = fRange0;
00090 Double_t rangesigma1 = fRange1*sqrt(trkmomentum_input);
00091 Double_t rangesigma2 = fRange2*trkmomentum_input;
00092
00093 return sqrt( rangesigma0*rangesigma0 + rangesigma1*rangesigma1 + rangesigma2*rangesigma2 );
00094 }
00095
00096
00097 else{
00098 Double_t trkmomentumerr_input = trkmomentumerr;
00099 if( trkmomentumerr_input<0.0 ) trkmomentumerr_input = 0.0;
00100
00101 Double_t fCurve0 = 0.0;
00102 Double_t fCurve1 = 1.237;
00103 Double_t fCurve2 = 1.198;
00104
00105 Double_t curvesigma0 = fCurve0;
00106 Double_t curvesigma1 = fCurve1*sqrt(trkmomentumerr_input);
00107 Double_t curvesigma2 = fCurve2*trkmomentumerr_input;
00108
00109 return sqrt( curvesigma0*curvesigma0 + curvesigma1*curvesigma1 + curvesigma2*curvesigma2 );
00110 }
00111 }
00112
00113
00114 return 0.0;
00115 }
00116
00117
00118
00119
00120
00121 Double_t EnergyResolution::ShowerResolutionDogwoodNear( Double_t shwenergy, Double_t shwenergyerr )
00122 {
00123 return ShowerResolutionCedar(shwenergy, shwenergyerr);
00124 }
00125
00126 Double_t EnergyResolution::ShowerResolutionDogwoodFar( Double_t shwenergy, Double_t shwenergyerr )
00127 {
00128 return ShowerResolutionCedar(shwenergy, shwenergyerr);
00129 }
00130
00131 Double_t EnergyResolution::ShowerResolutionCedar( Double_t shwenergy, Double_t shwenergyerr )
00132 {
00133 Double_t shwenergy_input = shwenergy;
00134 if( shwenergy_input<0.0 ) shwenergy_input = 0.0;
00135
00136 Double_t shwenergyerr_input = shwenergyerr;
00137 if( shwenergyerr_input<0.0 ) shwenergyerr_input = 0.0;
00138
00139 Double_t fShw0 = 0.190;
00140 Double_t fShw1 = 0.509;
00141 Double_t fShw2 = 0.0;
00142
00143 Double_t shwsigma0 = fShw0;
00144 Double_t shwsigma1 = fShw1*sqrt(shwenergy_input);
00145 Double_t shwsigma2 = fShw2*shwenergy_input;
00146
00147 return sqrt( shwsigma0*shwsigma0 + shwsigma1*shwsigma1 + shwsigma2*shwsigma2 );
00148 }