Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

EnergyResolution.cxx

Go to the documentation of this file.
00001 #include "EnergyResolution.h"  
00002 
00003 #include <cmath>
00004 
00005 // neutrino energy resolution
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 // shower energy resolution
00019 // ========================
00020 Double_t EnergyResolution::ShowerResolution(Double_t shwenergy, Double_t shwenergyerr, Detector::Detector_t detector, ReleaseType::Release_t release)
00021 {
00022   // dogwood resolution
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   // cedar resolution
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   // default to zero
00035   return 0.0;
00036 }
00037 
00038 // muon momentum resolution
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   // dogwood resolution
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   // cedar resolution
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   // default to zero
00059   return 0.0;
00060 }
00061   
00062 
00063 // muon momentum resolution (cedar/dogwood, near/far)
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     // momentum from range
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;    // Emu = 0  : sigma   -> 0 GeV
00086       Double_t fRange1 = 0.0467;
00087       Double_t fRange2 = 0.0700; // Emu >> 0 : sigma/E -> 7%
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     // momentum from curvature
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   // default to zero
00114   return 0.0;
00115 }
00116 
00117 
00118 // shower energy resolution (cedar/dogwood, near/far)
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;  // Eshw = 0  : sigma   -> 190 MeV
00140   Double_t fShw1 = 0.509;  // Eshw >> 0 : sigma/E -> 51%/sqrt(E) 
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 }  

Generated on Mon Feb 15 11:06:38 2010 for loon by  doxygen 1.3.9.1