00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 #include "DataUtil/EnergyCorrections.h"
00131
00132 #include "Calibrator/Calibrator.h"
00133 #include "MessageService/MsgService.h"
00134 #include <cmath>
00135 #include <iostream>
00136 #include <sstream>
00137
00138 CVSID( " $Id: EnergyCorrections.cxx,v 1.25 2009/12/02 15:07:14 xbhuang Exp $");
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00180
00181
00182 float EnergyCorrections::FullyCorrectShowerEnergy(float E,
00183 const CandShowerHandle::ShowerType_t& st,
00184 VldContext vc,
00185 ReleaseType::Release_t release,
00186 EnergyCorrections::WhichCorrection_t whichCor)
00187 {
00188
00189
00190 float eCor=EnergyCorrections::CalibrationGroupEnergyCorrections(E,vc,release,whichCor);
00191
00192
00193 ReleaseType::Release_t recoVers = ReleaseType::GetRecoInfo(release);
00194
00195
00196 if (ReleaseType::IsBirch(release)) {
00197 int mode=1;
00198 if (whichCor==EnergyCorrections::kVersion2)
00199 mode=2;
00200 if (vc.GetDetector()==Detector::kNear)
00201 return EnergyCorrections::CorrectShowerEnergyNear_Birch(eCor,st,mode);
00202 else if (vc.GetDetector()==Detector::kFar)
00203 return EnergyCorrections::CorrectShowerEnergyFar_Birch(eCor,st,mode);
00204
00205 }
00206 else if (ReleaseType::IsCedar(release)) {
00207
00208 if (recoVers >= ReleaseType::kR1_24_3) {
00209 if (vc.GetDetector()==Detector::kNear)
00210 return EnergyCorrections::ShowerEnergyCorrectionNearCedarPhyBhcurve(eCor,st,whichCor);
00211 else if (vc.GetDetector()==Detector::kFar)
00212 return EnergyCorrections::ShowerEnergyCorrectionFarCedarPhyBhcurve(eCor,st,whichCor);
00213
00214 }
00215 else {
00216 if (vc.GetDetector()==Detector::kNear)
00217 return EnergyCorrections::ShowerEnergyCorrectionNearCedar(eCor,st,whichCor);
00218 else if (vc.GetDetector()==Detector::kFar)
00219 return EnergyCorrections::ShowerEnergyCorrectionFarCedar(eCor,st,whichCor);
00220 }
00221
00222 }
00223 else if (ReleaseType::IsDogwood(release)) {
00224 if (vc.GetDetector()==Detector::kNear)
00225 return EnergyCorrections::ShowerEnergyCorrectionNearDogwood(eCor,st,whichCor);
00226 else if (vc.GetDetector()==Detector::kFar)
00227 return EnergyCorrections::ShowerEnergyCorrectionFarDogwood(eCor,st,whichCor);
00228 }
00229
00230 return E;
00231 }
00232
00233
00234
00236
00237
00238
00239
00248
00249
00250 float EnergyCorrections::FullyCorrectMomentumFromRange(float p,
00251 VldContext vc,
00252 ReleaseType::Release_t release,
00253 EnergyCorrections::WhichCorrection_t whichCor)
00254 {
00255 float pcor=p;
00256 if (ReleaseType::IsBirch(release)) {
00257 pcor=EnergyCorrections::MomentumRangeCorrectionBirch(p,vc,whichCor);
00258 }
00259 else if (ReleaseType::IsCedar(release)) {
00260 pcor=EnergyCorrections::MomentumRangeCorrectionCedar(p,vc,whichCor);
00261 }
00262 return pcor;
00263
00264 }
00265
00266 float EnergyCorrections::FullyCorrectEnergyFromRange(float E,
00267 VldContext vc,
00268 ReleaseType::Release_t release,
00269 EnergyCorrections::WhichCorrection_t whichCor)
00270 {
00271 if (ReleaseType::IsBirch(release)) {
00272 const float m=0.1057;
00273 float p = sqrt(E*E -m*m);
00274 float pcor = EnergyCorrections::FullyCorrectMomentumFromRange(p,vc,release,whichCor);
00275 return sqrt(pcor*pcor +m*m);
00276 }
00277 else if (ReleaseType::IsCedar(release)) {
00278 return EnergyCorrections::EnergyRangeCorrectionCedar(E,vc,whichCor);
00279 }
00280 return E;
00281 }
00282
00283 float EnergyCorrections::FullyCorrectSignedMomentumFromCurvature(float p,
00284 VldContext vc,
00285 ReleaseType::Release_t release,
00286 EnergyCorrections::WhichCorrection_t whichCor)
00287 {
00288 float pcor=p;
00289 if (ReleaseType::IsBirch(release)) {
00290 pcor=EnergyCorrections::SignedMomentumCurvatureCorrectionBirch(p,vc,whichCor);
00291 }
00292 else if (ReleaseType::IsCedar(release)) {
00293 pcor=EnergyCorrections::SignedMomentumCurvatureCorrectionCedar(p,vc,whichCor);
00294 }
00295 return pcor;
00296
00297 }
00298
00299
00300
00328
00344
00345
00346
00347 namespace EnergyCorrections {
00348
00349 static const float cgffBirchDataFD=1.018;
00350
00351
00352
00353 static const float cgffCedarPhyDataFD=0.9988;
00354 static const float cgffCedarPhyDataND=1.0039;
00355 static const float cgffCedarR1_24_1MCFD=(0.001737/0.001786);
00356 static const float cgffCedarR1_24_1MCND=(0.001759/0.001792);
00357
00358
00359
00360 static const float cgffCedarPhyDataFDOld=0.996;
00361 static const float cgffCedarPhyDataNDOld=1.003;
00362 static const float cgffCedarR1_24_1MCFDOld=0.986;
00363 static const float cgffCedarR1_24_1MCNDOld=0.994;
00364
00365
00366
00367 static const float cgffCedarR1_24_2MCFD=cgffCedarR1_24_1MCFD*(0.001786/0.001737);
00368 static const float cgffCedarR1_24_2MCND=cgffCedarR1_24_1MCND*(0.001792/0.001759);
00369
00370 static const float cgffCedarPhyDaikonND=1;
00371 static const float cgffCedarPhyDaikonFD=1;
00372
00373
00374 static const float cgffDogwood1DataFD=1.0;
00375 static const float cgffDogwood1DataND=1.0;
00376 static const float cgffDogwood1DaikonFD=1.0;
00377 static const float cgffDogwood1DaikonND=1.0;
00378 }
00379
00380 float EnergyCorrections::CalibrationGroupEnergyCorrections(float E,
00381 VldContext vc,
00382 ReleaseType::Release_t release,
00383 EnergyCorrections::WhichCorrection_t whichCor)
00384 {
00385
00386
00387 float retval = E;
00388
00389 MAXMSG("DataUtil",Msg::kInfo,1)
00390 << "CalibrationGroupEnergyCorrections:: Using Release Type: "
00391 << ReleaseType::AsString(release) << "\tusing correction version: "
00392 << whichCor << "\n";
00393
00394 static Calibrator* customCalibrator = 0;
00395 if (customCalibrator ==0 ) {
00396
00397
00398
00399
00400 MsgService::Instance()->GetStream("Calib")->SetLogLevel(Msg::kFatal);
00401 customCalibrator = Calibrator::CreateCustomCalibrator();
00402
00403
00404
00405
00406 customCalibrator->Set("Thermometer=SimpleCalScheme "
00407 "PeCalibrator=SimpleCalScheme "
00408 "LinCalibrator=SimpleCalScheme "
00409 "StripCalibrator=SimpleCalScheme "
00410 "AttenCalibrator=SimpleCalScheme "
00411 "MIPCalibrator=SimpleCalScheme "
00412 "TimeCalibrator=SimpleCalScheme ");
00413 MsgService::Instance()->GetStream("Calib")->SetLogLevel(Msg::kWarning);
00414 }
00415
00416
00417
00418
00419 ReleaseType::Release_t recoVers = ReleaseType::GetRecoInfo(release);
00420
00421
00422
00423 if ( ReleaseType::IsBirch(release)
00424 && vc.GetSimFlag()==SimFlag::kData
00425 && vc.GetDetector()==Detector::kFar )
00426 {
00427 MAXMSG("DataUtil",Msg::kInfo,1)
00428 << "EnergyCorrections -- Applying Birch Far Detector Factor ( "
00429 << EnergyCorrections::cgffBirchDataFD << ")\n";
00430 retval = retval*EnergyCorrections::cgffBirchDataFD;
00431 }
00432
00433
00434
00435 if (ReleaseType::IsCedar(release) && whichCor!=EnergyCorrections::kNoCalGroup) {
00436
00437
00438
00439
00440
00441
00442 if ( ReleaseType::IsCedar(release)
00443 && ReleaseType::IsDaikon(release)
00444 && (recoVers < ReleaseType::kR1_24_2 || recoVers == ReleaseType::kR1_24_Cal )
00445 && vc.GetSimFlag()==SimFlag::kMC)
00446 {
00447
00448
00449 MAXMSG("DataUtil",Msg::kInfo,1)
00450 << "EnergyCorrections -- Applying Infamous MC Drift Bug Correction\n";
00451
00452 customCalibrator->Reset(vc);
00453 float drift = customCalibrator->GetDriftCorrected(1.0,PlexStripEndId());
00454 retval = retval / (drift*drift);
00455 }
00456
00457
00458
00459
00460
00461
00462 if (!(whichCor==EnergyCorrections::kVersion1 || whichCor==EnergyCorrections::kVersion2)) {
00463
00464 if (vc.GetSimFlag()==SimFlag::kMC) {
00465
00466
00467
00468
00469 if (ReleaseType::IsCedar(release) && recoVers<=ReleaseType::kR1_24_1) {
00470
00471
00472 if (whichCor==kVersion3) {
00473
00474 if (vc.GetDetector()==Detector::kFar) {
00475 MAXMSG("DataUtil",Msg::kInfo,1)
00476 << "EnergyCorrections -- Applying R_1_24_1 (Summer 2007) Far MC Correction Factor"
00477 << " (" << EnergyCorrections::cgffCedarR1_24_1MCFDOld << ")\n";
00478 retval*=EnergyCorrections::cgffCedarR1_24_1MCFDOld;
00479 }
00480 else if (vc.GetDetector()==Detector::kNear) {
00481 MAXMSG("DataUtil",Msg::kInfo,1)
00482 << "EnergyCorrections -- Applying R_1_24_1 (Summer 2007) Near MC Correction Factor"
00483 << " (" << EnergyCorrections::cgffCedarR1_24_1MCNDOld << ")\n";
00484 retval*=EnergyCorrections::cgffCedarR1_24_1MCNDOld;
00485 }
00486 }
00487 else {
00488
00489 if (vc.GetDetector()==Detector::kFar) {
00490 MAXMSG("DataUtil",Msg::kInfo,1)
00491 << "EnergyCorrections -- Applying R_1_24_1 (Fall 2007) Far MC Correction Factor"
00492 << " (" << EnergyCorrections::cgffCedarR1_24_1MCFD << ")\n";
00493 retval*=EnergyCorrections::cgffCedarR1_24_1MCFD;
00494 }
00495 else if (vc.GetDetector()==Detector::kNear) {
00496 MAXMSG("DataUtil",Msg::kInfo,1)
00497 << "EnergyCorrections -- Applying R_1_24_1 (Fall 2007) Near MC Correction Factor"
00498 << " (" << EnergyCorrections::cgffCedarR1_24_1MCND << ")\n";
00499 retval*=EnergyCorrections::cgffCedarR1_24_1MCND;
00500 }
00501
00502 }
00503 }
00504 else if (ReleaseType::IsCedar(release) && recoVers>=ReleaseType::kR1_24_2)
00505 {
00506
00507
00508 if (vc.GetDetector()==Detector::kFar) {
00509 MAXMSG("DataUtil",Msg::kInfo,1)
00510 << "EnergyCorrections -- Applying R_1_24_2 (Fall 2007) Far MC Correction Factor"
00511 << " (" << EnergyCorrections::cgffCedarR1_24_2MCFD << ")\n";
00512 retval*=EnergyCorrections::cgffCedarR1_24_2MCFD;
00513 }
00514 else if (vc.GetDetector()==Detector::kNear) {
00515 MAXMSG("DataUtil",Msg::kInfo,1)
00516 << "EnergyCorrections -- Applying R_1_24_2 (Fall 2007) Near MC Correction Factor"
00517 << " (" << EnergyCorrections::cgffCedarR1_24_2MCND << ")\n";
00518 retval*=EnergyCorrections::cgffCedarR1_24_2MCND;
00519 }
00520 }
00521 }
00522 else if (vc.GetSimFlag()==SimFlag::kData) {
00523
00524
00525
00526 if (whichCor==kVersion3) {
00527
00528 if (recoVers>=ReleaseType::kCedarPhy) {
00529 if (vc.GetDetector()==Detector::kFar) {
00530 MAXMSG("DataUtil",Msg::kInfo,1)
00531 << "EnergyCorrections -- Applying CedarPhy (Summer 2007) Far Correction Factor"
00532 << " (" << EnergyCorrections::cgffCedarPhyDataFDOld << ")\n";
00533 retval*=EnergyCorrections::cgffCedarPhyDataFDOld;
00534 }
00535 else if (vc.GetDetector()==Detector::kNear) {
00536 MAXMSG("DataUtil",Msg::kInfo,1)
00537 << "EnergyCorrections -- Applying CedarPhy (Summer 2007) Near Correction Factor"
00538 << " (" << EnergyCorrections::cgffCedarPhyDataNDOld << ")\n";
00539 retval*=EnergyCorrections::cgffCedarPhyDataNDOld;
00540 }
00541 }
00542 }
00543 else {
00544
00545 if (recoVers>=ReleaseType::kCedarPhy) {
00546 if (vc.GetDetector()==Detector::kFar) {
00547 MAXMSG("DataUtil",Msg::kInfo,1)
00548 << "EnergyCorrections -- Applying CedarPhy (Fall 2007) Far Correction Factor"
00549 << " (" << EnergyCorrections::cgffCedarPhyDataFD << ")\n";
00550 retval*=EnergyCorrections::cgffCedarPhyDataFD;
00551 }
00552 else if (vc.GetDetector()==Detector::kNear) {
00553 MAXMSG("DataUtil",Msg::kInfo,1)
00554 << "EnergyCorrections -- Applying CedarPhy (Fall 2007) Near Correction Factor"
00555 << " (" << EnergyCorrections::cgffCedarPhyDataND << ")\n";
00556 retval*=EnergyCorrections::cgffCedarPhyDataND;
00557 }
00558 }
00559 }
00560 }
00561 }
00562 }
00563
00564 return retval;
00565
00566 }
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577 float EnergyCorrections::ShowerEnergyConversionDogwood(float E, VldContext vc)
00578 {
00579
00580
00581
00582 float eCor=E;
00583 if (vc.GetDetector()==Detector::kFar) {
00584
00585 if (vc.GetSimFlag()==SimFlag::kData) {
00586 eCor*=EnergyCorrections::cgffDogwood1DataFD;
00587 }
00588 else if (vc.GetSimFlag()==SimFlag::kMC) {
00589 eCor*=EnergyCorrections::cgffDogwood1DaikonFD;
00590 }
00591
00592 eCor=EnergyCorrections::ShowerEnergyCorrectionFarDogwood(eCor,CandShowerHandle::kCC,EnergyCorrections::kDefault);
00593 }
00594 else if (vc.GetDetector()==Detector::kNear) {
00595
00596 if (vc.GetSimFlag()==SimFlag::kData) {
00597 eCor*=EnergyCorrections::cgffDogwood1DataND;
00598 }
00599 else if (vc.GetSimFlag()==SimFlag::kMC) {
00600 eCor*=EnergyCorrections::cgffDogwood1DaikonND;
00601 }
00602
00603 eCor=EnergyCorrections::ShowerEnergyCorrectionNearDogwood(eCor,CandShowerHandle::kCC,EnergyCorrections::kDefault);
00604 }
00605
00606 return eCor;
00607
00608 }
00609
00610
00611
00612
00613
00614
00615 float EnergyCorrections::WeightedShowerEnergyConversionDogwood(float E, VldContext vc)
00616 {
00617
00618
00619
00620 float eCor=E;
00621 if (vc.GetDetector()==Detector::kFar) {
00622
00623 if (vc.GetSimFlag()==SimFlag::kData) {
00624 eCor*=EnergyCorrections::cgffDogwood1DataFD;
00625 }
00626 else if (vc.GetSimFlag()==SimFlag::kMC) {
00627 eCor*=EnergyCorrections::cgffDogwood1DaikonFD;
00628 }
00629
00630 eCor=EnergyCorrections::ShowerEnergyCorrectionFarDogwood(eCor,CandShowerHandle::kWtCC,EnergyCorrections::kDefault);
00631 }
00632 else if (vc.GetDetector()==Detector::kNear) {
00633
00634 if (vc.GetSimFlag()==SimFlag::kData) {
00635 eCor*=EnergyCorrections::cgffDogwood1DataND;
00636 }
00637 else if (vc.GetSimFlag()==SimFlag::kMC) {
00638 eCor*=EnergyCorrections::cgffDogwood1DaikonND;
00639 }
00640
00641 eCor=EnergyCorrections::ShowerEnergyCorrectionNearDogwood(eCor,CandShowerHandle::kWtCC,EnergyCorrections::kDefault);
00642 }
00643
00644 return eCor;
00645
00646 }
00647
00648
00649
00650
00651
00652
00653
00654 namespace EnergyCorrections {
00655 static CorrectionVersion_t fVersion = EnergyCorrections::kUnknown;
00656 static Short_t fSubVersion = 0;
00657 }
00658
00659 void EnergyCorrections::SetCorrectionVersion(const CorrectionVersion_t& ver,
00660 Short_t subver)
00661 {
00662 fVersion=ver;
00663 fSubVersion=subver;
00664 }
00665
00666 std::string EnergyCorrections::GetCorrectionAsString()
00667 {
00668 std::string s;
00669 switch(fVersion){
00670 case kBirch:
00671 s+="BIRCH"; break;
00672 case kCedar:
00673 s+="CEDAR"; break;
00674 case kUnknown:
00675 default:
00676 s+="???";
00677 break;
00678 }
00679 std::ostringstream os; os<<"-v"<<fSubVersion<<std::ends;
00680 s+=os.str();
00681
00682 return s;
00683 }
00684
00685 void EnergyCorrections::WarnUnknownVersion(const char* caller_routine)
00686 {
00687 static Short_t nwarn=0;
00688 if (nwarn<=9) {
00689 std::cerr<<"Energy Corrections: In "<<caller_routine
00690 <<"Energy Corrections: Warning, unknown correction version "
00691 <<GetCorrectionAsString()
00692 <<"Energy Corrections: Defaulting to Birch era corrections.\n"
00693 <<"Energy Corrections: Please Call SetCorrectionVersion() in the future.\n"
00694 <<std::endl;
00695 nwarn++;
00696 }
00697 if (nwarn==9) {
00698 std::cerr<<"Energy Corrections: last message of this type..."<<std::endl;
00699 }
00700
00701 }
00702
00703 EnergyCorrections::CorrectionVersion_t EnergyCorrections::VersionFromFilename(const char* name)
00704 {
00705 CorrectionVersion_t ver = kUnknown;
00706 std::string s=name;
00707
00708 if (s.find("R1_18")!=std::string::npos) {
00709 ver=EnergyCorrections::kBirch;
00710 }
00711 else if (s.find("cedar")!=std::string::npos) {
00712 ver=EnergyCorrections::kCedar;
00713 }
00714 return ver;
00715 }
00716
00717
00718
00719 float EnergyCorrections::CorrectMomentumFromRange(float p, bool isdata,
00720 Detector::Detector_t det)
00721 {
00722 float pcor=p;
00723 switch(fVersion){
00724 case kCedar:
00725 pcor=CorrectMomentumFromRange_Cedar(p,isdata,det);
00726 break;
00727 case kBirch:
00728 pcor=CorrectMomentumFromRange_Birch(p,isdata,det);
00729 break;
00730 case kUnknown:
00731 default:
00732 WarnUnknownVersion("CorrectMomentumFromRange()");
00733 pcor=CorrectMomentumFromRange_Birch(p,isdata,det);
00734 break;
00735 }
00736 return pcor;
00737 }
00738
00739 float EnergyCorrections::CorrectSignedMomentumFromCurvature(float p,
00740 bool isdata ,
00741 Detector::Detector_t det )
00742 {
00743
00744 float pcor=p;
00745 switch(fVersion){
00746 case kCedar:
00747 pcor=CorrectSignedMomentumFromCurvature_Cedar(p,isdata,det);
00748 break;
00749 case kBirch:
00750 pcor=CorrectSignedMomentumFromCurvature_Birch(p,isdata,det);
00751 break;
00752 case kUnknown:
00753 default:
00754 WarnUnknownVersion("CorrectSignedMomentumFromCurvature()");
00755 pcor=CorrectSignedMomentumFromCurvature_Birch(p,isdata,det);
00756 break;
00757 }
00758 return pcor;
00759 }
00760
00761
00762 float EnergyCorrections::CorrectEnergyFromRange(float E, bool isdata, Detector::Detector_t det)
00763 {
00764 const float m=0.1057;
00765 float p = sqrt(E*E -m*m);
00766 float pcor = CorrectMomentumFromRange(p,isdata,det);
00767 return sqrt(pcor*pcor +m*m);
00768 }
00769
00770
00771 float EnergyCorrections::CorrectShowerEnergyNear(float E, const CandShowerHandle::ShowerType_t& st, int mode, bool isdata )
00772 {
00773
00774
00775 float ecor=E;
00776 switch(fVersion){
00777 case kCedar:
00778 ecor=CorrectShowerEnergyNear_Cedar(E,st,mode,isdata);
00779 break;
00780 case kBirch:
00781 ecor=CorrectShowerEnergyNear_Birch(E,st,mode,isdata);
00782 break;
00783 case kUnknown:
00784 default:
00785 WarnUnknownVersion("CorrectShowerEnergyNear()");
00786 ecor=CorrectShowerEnergyNear_Birch(E,st,mode,isdata);
00787 break;
00788 }
00789 return ecor;
00790 }
00791
00792
00793
00794 float EnergyCorrections::CorrectShowerEnergyFar(float E, const CandShowerHandle::ShowerType_t& st, int mode, bool isdata)
00795 {
00796
00797
00798 float ecor=E;
00799 switch(fVersion){
00800 case kCedar:
00801 ecor=CorrectShowerEnergyFar_Cedar(E,st,mode,isdata);
00802 break;
00803 case kBirch:
00804 if (isdata) {
00805
00806
00807
00808
00809 const float mip_scale_correction=1.018;
00810 E*=mip_scale_correction;
00811 }
00812 ecor=CorrectShowerEnergyFar_Birch(E,st,mode,isdata);
00813 break;
00814 case kUnknown:
00815 default:
00816 WarnUnknownVersion("CorrectShowerEnergyFar()");
00817 if (isdata) {
00818
00819
00820
00821
00822 const float mip_scale_correction=1.018;
00823 E*=mip_scale_correction;
00824 }
00825 ecor=CorrectShowerEnergyFar_Birch(E,st,mode,isdata);
00826 break;
00827 }
00828 return ecor;
00829
00830 }
00831
00832 float EnergyCorrections::CorrectShowerEnergy(float E,
00833 const Detector::Detector_t& det,
00834 const CandShowerHandle::ShowerType_t& st,
00835 int mode, bool isdata)
00836 {
00837
00838 float ecor=E;
00839 if (det==Detector::kNear) {
00840 ecor = CorrectShowerEnergyNear(E,st,mode,isdata);
00841 }
00842 else if (det==Detector::kFar) {
00843 ecor = CorrectShowerEnergyFar(E,st,mode,isdata);
00844 }
00845
00846 return ecor;
00847 }
00848
00849
00851 float EnergyCorrections::CorrectMomentumFromRange_Birch(float p, bool isdata,
00852 Detector::Detector_t det)
00853 {
00854 static const float c[4]={1.01334,0.05563,-0.05346,0.01205};
00855
00856
00857 if (isdata){
00858
00859
00860 float dcor=1;
00861 if (det==Detector::kNear) dcor=(7.85*2.563)/(7.87*2.54);
00862 else if (det==Detector::kFar) dcor=(7.85*2.558)/(7.87*2.54);
00863
00864 p*=dcor;
00865 }
00866
00867 float pcor=p/(c[0] + c[1]*log(p) + c[2]*pow(log(p), 2) + c[3]*pow(log(p),3));
00868 return pcor;
00869 }
00870
00871 float EnergyCorrections::CorrectSignedMomentumFromCurvature_Birch(float p, bool , Detector::Detector_t )
00872 {
00873
00874
00875 float pcor=p;
00876 if (pcor!=0) {
00877
00878
00879 float C = (1.01+0.1*fabs(1/p))/(1.01-0.1*(1/p));
00880 pcor*=(1.0/C);
00881 }
00882 return pcor;
00883 }
00884
00885 float EnergyCorrections::CorrectShowerEnergyNear_Birch(float E, const CandShowerHandle::ShowerType_t& st, int mode, bool )
00886 {
00887
00888
00889 float ecor=E;
00890 if (st==CandShowerHandle::kCC){
00891 if (mode==1){
00892
00893 ecor=E/1.18;
00894 }
00895 else if (mode==2){
00896
00897 ecor=((E/1.05)*(1.-0.35*exp(-0.18*E/1.06)));
00898 }
00899 }
00900 else if (st==CandShowerHandle::kWtCC){
00901 if (mode==1){
00902
00903 ecor=((E)*(1.+0.50*exp(-1.00*E)));
00904 }
00905 else if (mode==2){
00906
00907 ecor=E/1.03;
00908 }
00909 }
00910 return ecor;
00911 }
00912
00913 float EnergyCorrections::CorrectShowerEnergyFar_Birch(float E, const CandShowerHandle::ShowerType_t& st, int mode, bool )
00914 {
00915
00916 float ecor=E;
00917 if (st==CandShowerHandle::kCC){
00918 if (mode==1){
00919
00920 ecor=((E)*(1.-0.12*exp(-0.12*E)));
00921 }
00922 else if (mode==2){
00923
00924
00925 ecor=E*(0.99-0.035*E*exp(-0.25*E));
00926 }
00927 }
00928 else if (st==CandShowerHandle::kWtCC){
00929 if (mode==1){
00930
00931 ecor=((E)*(1.+0.18*exp(-0.35*E)));
00932 }
00933 else if (mode==2){
00934
00935 E=ecor;
00936 }
00937 }
00938 return ecor;
00939 }
00940
00941
00943
00944 float EnergyCorrections::CorrectMomentumFromRange_Cedar(float p, bool , Detector::Detector_t )
00945 {
00946 return p;
00947 }
00948
00949 float EnergyCorrections::CorrectSignedMomentumFromCurvature_Cedar(float p, bool , Detector::Detector_t )
00950 {
00951 return p;
00952 }
00953
00954 float EnergyCorrections::CorrectShowerEnergyNear_Cedar(float E, const CandShowerHandle::ShowerType_t& st , int , bool )
00955 {
00956 float ecor=E;
00957 if (st==CandShowerHandle::kCC){
00958 ecor = ecor*(0.921+0.231*exp(-ecor*1.63));
00959 }
00960 else if (st==CandShowerHandle::kWtCC){
00961 ecor = ecor*(0.924+0.235*exp(-ecor*1.63));
00962 }
00963 return ecor;
00964 }
00965
00966 float EnergyCorrections::CorrectShowerEnergyFar_Cedar(float E, const CandShowerHandle::ShowerType_t& st , int , bool )
00967 {
00968 float ecor=E;
00969 if (st==CandShowerHandle::kCC){
00970 ecor = ecor*(0.950+0.277*exp(-ecor*1.64));
00971 }
00972 else if (st==CandShowerHandle::kWtCC){
00973 ecor = ecor*(0.957+0.271*exp(-ecor*1.64));
00974 }
00975 return ecor;
00976 }
00977
00979
00980 float EnergyCorrections::ShowerEnergyCorrectionNearDogwood(float energy,
00981 const CandShowerHandle::ShowerType_t& st,
00982 EnergyCorrections::WhichCorrection_t whichCor)
00983 {
00984 switch(whichCor) {
00985 case EnergyCorrections::kVersion4:
00986 return EnergyCorrections::MasakiNearJune30_2009(energy,st);
00987 case EnergyCorrections::kDefault:
00988 default:
00989 return EnergyCorrections::MasakiNearJune30_2009(energy,st);
00990 }
00991 return energy;
00992 }
00993
00994 float EnergyCorrections::ShowerEnergyCorrectionFarDogwood(float energy,
00995 const CandShowerHandle::ShowerType_t& st,
00996 EnergyCorrections::WhichCorrection_t whichCor)
00997 {
00998 switch(whichCor) {
00999 case EnergyCorrections::kVersion4:
01000 return EnergyCorrections::MasakiFarJune30_2009(energy,st);
01001 case EnergyCorrections::kDefault:
01002 default:
01003 return EnergyCorrections::MasakiFarJune30_2009(energy,st);
01004 }
01005 return energy;
01006 }
01007
01008 float EnergyCorrections::ShowerEnergyCorrectionNearDogwood0(float energy,
01009 const CandShowerHandle::ShowerType_t& st,
01010 EnergyCorrections::WhichCorrection_t whichCor)
01011 {
01012 switch(whichCor) {
01013 case EnergyCorrections::kVersion4:
01014 return EnergyCorrections::MasakiNear_forDogwood0(energy,st);
01015 case EnergyCorrections::kDefault:
01016 default:
01017 return EnergyCorrections::MasakiNear_forDogwood0(energy,st);
01018 }
01019 return energy;
01020 }
01021
01022 float EnergyCorrections::ShowerEnergyCorrectionFarDogwood0(float energy,
01023 const CandShowerHandle::ShowerType_t& st,
01024 EnergyCorrections::WhichCorrection_t whichCor)
01025 {
01026 switch(whichCor) {
01027 case EnergyCorrections::kVersion4:
01028 return EnergyCorrections::MasakiFar_forDogwood0(energy,st);
01029 case EnergyCorrections::kDefault:
01030 default:
01031 return EnergyCorrections::MasakiFar_forDogwood0(energy,st);
01032 }
01033 return energy;
01034 }
01035
01036
01037
01038
01039
01040
01041 float EnergyCorrections::ShowerEnergyCorrectionNearCedarPhyBhcurve(float energy,
01042 const CandShowerHandle::ShowerType_t& st,
01043 EnergyCorrections::WhichCorrection_t whichCor)
01044 {
01045 switch(whichCor) {
01046 case EnergyCorrections::kVersion4:
01047 return EnergyCorrections::MasakiNearMay17thScaled(energy,st);
01048 case EnergyCorrections::kDefault:
01049 default:
01050 return EnergyCorrections::MasakiNearDec15th(energy,st);
01051 }
01052 return energy;
01053 }
01054
01055 float EnergyCorrections::ShowerEnergyCorrectionFarCedarPhyBhcurve(float energy,
01056 const CandShowerHandle::ShowerType_t& st,
01057 EnergyCorrections::WhichCorrection_t whichCor)
01058 {
01059 switch(whichCor) {
01060 case EnergyCorrections::kVersion4:
01061 return EnergyCorrections::MasakiFarMay17thScaled(energy,st);
01062 case EnergyCorrections::kDefault:
01063 default:
01064 return EnergyCorrections::MasakiFarDec15th(energy,st);
01065 }
01066 return energy;
01067 }
01068
01069
01070
01071 float EnergyCorrections::ShowerEnergyCorrectionNearCedar(float energy,
01072 const CandShowerHandle::ShowerType_t& st,
01073 EnergyCorrections::WhichCorrection_t whichCor)
01074 {
01075 switch(whichCor) {
01076 case EnergyCorrections::kVersion2:
01077 return EnergyCorrections::CorrectShowerEnergyNear_Cedar(energy,st);
01078 case EnergyCorrections::kVersion1:
01079 return EnergyCorrections::MasakiNearMay17th(energy,st);
01080 case EnergyCorrections::kVersion3:
01081 case EnergyCorrections::kDefault:
01082 default:
01083 return EnergyCorrections::MasakiNearMay17thScaled(energy,st);
01084 }
01085 return energy;
01086 }
01087
01088 float EnergyCorrections::ShowerEnergyCorrectionFarCedar(float energy,
01089 const CandShowerHandle::ShowerType_t& st,
01090 EnergyCorrections::WhichCorrection_t whichCor)
01091 {
01092 switch(whichCor) {
01093 case EnergyCorrections::kVersion2:
01094 return EnergyCorrections::CorrectShowerEnergyFar_Cedar(energy,st);
01095 case EnergyCorrections::kVersion1:
01096 return EnergyCorrections::MasakiFarMay17th(energy,st);
01097 case EnergyCorrections::kVersion3:
01098 case EnergyCorrections::kDefault:
01099 default:
01100 return EnergyCorrections::MasakiFarMay17thScaled(energy,st);
01101 }
01102 return energy;
01103 }
01104
01106
01108
01109 float EnergyCorrections::MasakiNearJune30_2009(float energy,
01110 const CandShowerHandle::ShowerType_t& st)
01111 {
01112 MAXMSG("DataUtil",Msg::kInfo,1)
01113 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Near Detector from DocDB XXXX_v4\n";
01114 float recoE=energy;
01115 float le = log10(fmin(fmax(energy,0.3),20));
01116 float we=0;
01117 if (st==CandShowerHandle::kCC){
01118 recoE = energy*(0.96922+0.175773*le -0.0684406*(2.*pow(le,2)-1)+0.00940122*(4.*pow(le,3)-3.*le));
01119 }
01120
01121 else if (st==CandShowerHandle::kWtCC) {
01122 we = fmin(fmax(energy,0.3),20);
01123 recoE = energy*(0.96922+0.175773*le -0.0684406*(2.*pow(le,2)-1)+0.00940122*(4.*pow(le,3)-3.*le));
01124 }
01125 return recoE;
01126 }
01127
01128
01129 float EnergyCorrections::MasakiFarJune30_2009(float energy,
01130 const CandShowerHandle::ShowerType_t& st)
01131 {
01132 MAXMSG("DataUtil",Msg::kInfo,1)
01133 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Far Detector from DocDB XXXX_v4\n";
01134 float recoE=energy;
01135 float le = log10(fmin(fmax(energy,0.3),20));
01136 float we=0;
01137 if (st==CandShowerHandle::kCC){
01138 recoE = energy*(1.01397 + 0.0646697*le -0.0258817*(2.*pow(le,2)-1) + 0.00117583*(4.*pow(le,3)-3.*le));
01139 }
01140
01141 else if (st==CandShowerHandle::kWtCC) {
01142 we = fmin(fmax(energy,0.3),20);
01143 recoE= energy*(1.01397 + 0.0646697*le -0.0258817*(2.*pow(le,2)-1) + 0.00117583*(4.*pow(le,3)-3.*le));
01144 }
01145 return recoE;
01146 }
01147
01148
01149 float EnergyCorrections::MasakiNear_forDogwood0(float energy,
01150 const CandShowerHandle::ShowerType_t& st)
01151 {
01152 MAXMSG("DataUtil",Msg::kInfo,1)
01153 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Near Detector Dogwood0\n";
01154 float recoE=energy;
01155 float le = log10(fmin(fmax(energy,0.3),20));
01156 float we=0;
01157 if (st==CandShowerHandle::kCC){
01158 recoE = energy*(0.978739 + 0.156093*le + -0.0608388*(2.*pow(le,2)-1) + 0.00818386*(4.*pow(le,3)-3.*le));
01159 }
01160
01161 else if (st==CandShowerHandle::kWtCC) {
01162 we = fmin(fmax(energy,0.3),20);
01163 recoE = energy*(0.978739 + 0.156093*le + -0.0608388*(2.*pow(le,2)-1) + 0.00818386*(4.*pow(le,3)-3.*le));
01164 }
01165 return recoE;
01166 }
01167
01168 float EnergyCorrections::MasakiFar_forDogwood0(float energy,
01169 const CandShowerHandle::ShowerType_t& st)
01170 {
01171 MAXMSG("DataUtil",Msg::kInfo,1)
01172 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Far Detector Dogwood0\n";
01173 float recoE=energy;
01174 float le = log10(fmin(fmax(energy,0.3),20));
01175 float we=0;
01176 if (st==CandShowerHandle::kCC){
01177 recoE = energy*(1.02473 + 0.0429276*le + -0.016319*(2.*pow(le,2)-1) + -0.000380156*(4.*pow(le,3)-3.*le));
01178 }
01179
01180 else if (st==CandShowerHandle::kWtCC) {
01181 we = fmin(fmax(energy,0.3),20);
01182 recoE= energy*(1.02473 + 0.0429276*le + -0.016319*(2.*pow(le,2)-1) + -0.000380156*(4.*pow(le,3)-3.*le));
01183 }
01184 return recoE;
01185 }
01186
01187
01188
01189
01190 float EnergyCorrections::MasakiNearDec15th(float energy,
01191 const CandShowerHandle::ShowerType_t& st)
01192 {
01193
01194 MAXMSG("DataUtil",Msg::kInfo,1)
01195 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Near Detector from DocDB 3895_v4\n";
01196 float recoE=energy;
01197 float le = log10(fmin(fmax(energy,0.3),20));
01198 float we=0;
01199 if (st==CandShowerHandle::kCC){
01200 recoE = energy*(1.10973-0.248714*le +0.116769*(2.*pow(le,2)-1)-0.0200268*(4.*pow(le,3)-3.*le));
01201 }
01202 else if (st==CandShowerHandle::kWtCC) {
01203 we = fmin(fmax(energy,0.3),20);
01204 recoE= energy*(0.999461-0.00334628*we+0.0000563316*pow(we,2)+0.35232*TMath::Exp(-we*1.76594));
01205 }
01206 return recoE;
01207 }
01208
01209 float EnergyCorrections::MasakiFarDec15th(float energy,
01210 const CandShowerHandle::ShowerType_t& st)
01211 {
01212
01213 MAXMSG("DataUtil",Msg::kInfo,1)
01214 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Far Detector from DocDB 3895_v4\n";
01215 float recoE=energy;
01216 float le = log10(fmin(fmax(energy,0.3),20));
01217 float we=0;
01218 if (st==CandShowerHandle::kCC){
01219 recoE = energy*( 1.15566-0.286445*le+ 0.122705*(2.*pow(le,2)-1)-0.0183855*(4.*pow(le,3)-3.*le));
01220 }
01221 else if (st==CandShowerHandle::kWtCC) {
01222 we = fmin(fmax(energy,0.3),20);
01223 recoE= energy*(0.971346+0.00314063*we-0.000135242*pow(we,2)+0.626512*TMath::Exp(-we*3.26053));
01224 }
01225 return recoE;
01226 }
01227
01228
01229
01230 float EnergyCorrections::MasakiNearDec15thScaled(float energy,
01231 const CandShowerHandle::ShowerType_t& st)
01232 {
01233
01234 MAXMSG("DataUtil",Msg::kInfo,1)
01235 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Near Detector from DocDB 3895_v4\n";
01236 float tempE=energy/EnergyCorrections::cgffCedarPhyDaikonND;
01237 float recoE=tempE;
01238 float le = log10(fmin(fmax(tempE,0.3),20));
01239 float we=0;
01240 if (st==CandShowerHandle::kCC){
01241 recoE = tempE*(1.10973-0.248714*le +0.116769*(2.*pow(le,2)-1)-0.0200268*(4.*pow(le,3)-3.*le));
01242 }
01243 else if (st==CandShowerHandle::kWtCC) {
01244 we = fmin(fmax(energy,0.3),20);
01245 recoE= energy*(0.999461-0.00334628*we+0.0000563316*pow(we,2)+0.35232*TMath::Exp(-we*1.76594));
01246 }
01247 return recoE;
01248 }
01249
01250 float EnergyCorrections::MasakiFarDec15thScaled(float energy,
01251 const CandShowerHandle::ShowerType_t& st)
01252 {
01253
01254 MAXMSG("DataUtil",Msg::kInfo,1)
01255 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Far Detector from DocDB 3895_v4\n";
01256 float tempE=energy/EnergyCorrections::cgffCedarPhyDaikonFD;
01257 float recoE=tempE;
01258 float le = log10(fmin(fmax(tempE,0.3),20));
01259 float we=0;
01260 if (st==CandShowerHandle::kCC){
01261 recoE = tempE*( 1.15566-0.286445*le+ 0.122705*(2.*pow(le,2)-1)-0.0183855*(4.*pow(le,3)-3.*le));
01262 }
01263 else if (st==CandShowerHandle::kWtCC) {
01264 we = fmin(fmax(energy,0.3),20);
01265 recoE= energy*(0.971346+0.00314063*we-0.000135242*pow(we,2)+0.626512*TMath::Exp(-we*3.26053));
01266 }
01267 return recoE;
01268 }
01269
01270
01271 float EnergyCorrections::MasakiNearMay17th(float energy,
01272 const CandShowerHandle::ShowerType_t& st)
01273 {
01274
01275 MAXMSG("DataUtil",Msg::kInfo,1)
01276 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Near Detector from DocDB 3077_v3\n";
01277 float recoE=energy;
01278 float le = log10(fmax(energy,0.2));
01279 if (st==CandShowerHandle::kCC){
01280 recoE = energy*(1.078984-0.249843*le+0.134518*(2.*pow(le,2)-1)-0.025613*(4.*pow(le,3)-3.*le));
01281 }
01282 else if (st==CandShowerHandle::kWtCC) {
01283 recoE= energy*(1.070553-0.207148*le+0.0943124*(2.*pow(le,2)-1)-0.0153231*(4.*pow(le,3)-3.*le));
01284 }
01285 return recoE;
01286 }
01287
01288 float EnergyCorrections::MasakiFarMay17th(float energy,
01289 const CandShowerHandle::ShowerType_t& st)
01290 {
01291
01292 MAXMSG("DataUtil",Msg::kInfo,1)
01293 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Far Detector from DocDB 3077_v3\n";
01294 float recoE=energy;
01295
01296 float le = log10(fmax(energy,0.2));
01297 if (st==CandShowerHandle::kCC){
01298 recoE = energy*(1.113584-0.299139*le+0.145169*(2.*pow(le,2)-1)-0.0232853*(4.*pow(le,3)-3.*le));
01299 }
01300 else if (st==CandShowerHandle::kWtCC){
01301 recoE= energy*(1.052872-0.19185*le+0.102449*(2.*pow(le,2)-1)-0.0182317*(4.*pow(le,3)-3.*le));
01302 }
01303 return recoE;
01304 }
01305
01306
01307
01308 float EnergyCorrections::MasakiNearMay17thScaled(float energy,
01309 const CandShowerHandle::ShowerType_t& st)
01310 {
01311
01312 MAXMSG("DataUtil",Msg::kInfo,1)
01313 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Near Detector from DocDB 3077_v3 -- Scaled by Appropriate CG factor for uncalibrated data he used\n";
01314 float tempE=energy/EnergyCorrections::cgffCedarR1_24_1MCND;
01315 float recoE=tempE;
01316 float le = log10(fmax(tempE,0.2));
01317 if (st==CandShowerHandle::kCC){
01318 recoE = tempE*(1.078984-0.249843*le+0.134518*(2.*pow(le,2)-1)-0.025613*(4.*pow(le,3)-3.*le));
01319 }
01320 else if (st==CandShowerHandle::kWtCC) {
01321 recoE= tempE*(1.070553-0.207148*le+0.0943124*(2.*pow(le,2)-1)-0.0153231*(4.*pow(le,3)-3.*le));
01322 }
01323 return recoE;
01324 }
01325
01326
01327 float EnergyCorrections::MasakiFarMay17thScaled(float energy,
01328 const CandShowerHandle::ShowerType_t& st)
01329 {
01330
01331 MAXMSG("DataUtil",Msg::kInfo,1)
01332 << "EnergyCorrections -- Applying Masaki (Reco to True) Correction for Far Detector from DocDB 3077_v3 -- Scaled by Appropriate CG factor for uncalibrated data he used\n";
01333 float tempE=energy/EnergyCorrections::cgffCedarR1_24_1MCFD;
01334 float recoE=tempE;
01335
01336 float le = log10(fmax(tempE,0.2));
01337 if (st==CandShowerHandle::kCC){
01338 recoE = tempE*(1.113584-0.299139*le+0.145169*(2.*pow(le,2)-1)-0.0232853*(4.*pow(le,3)-3.*le));
01339 }
01340 else if (st==CandShowerHandle::kWtCC){
01341 recoE= tempE*(1.052872-0.19185*le+0.102449*(2.*pow(le,2)-1)-0.0182317*(4.*pow(le,3)-3.*le));
01342 }
01343 return recoE;
01344 }
01346
01348 float EnergyCorrections::MomentumRangeCorrectionBirch(float p, VldContext vc, EnergyCorrections::WhichCorrection_t )
01349 {
01350 static const float c[4]={1.01334,0.05563,-0.05346,0.01205};
01351
01352
01353 if (vc.GetSimFlag()==SimFlag::kData){
01354
01355
01356 float dcor=1;
01357 if (vc.GetDetector()==Detector::kNear) dcor=(7.85*2.563)/(7.87*2.54);
01358 else if (vc.GetDetector()==Detector::kFar) dcor=(7.85*2.558)/(7.87*2.54);
01359
01360 p*=dcor;
01361 }
01362
01363 float pcor=p/(c[0] + c[1]*log(p) + c[2]*pow(log(p), 2) + c[3]*pow(log(p),3));
01364 return pcor;
01365 }
01366
01367 float EnergyCorrections::SignedMomentumCurvatureCorrectionBirch(float p, VldContext , WhichCorrection_t ){
01368
01369
01370 float pcor=p;
01371 if (pcor!=0) {
01372
01373
01374 float C = (1.01+0.1*fabs(1/p))/(1.01-0.1*(1/p));
01375 pcor*=(1.0/C);
01376 }
01377 return pcor;
01378 }
01379
01380
01382 float EnergyCorrections::MomentumRangeCorrectionCedar(float p, VldContext vc, WhichCorrection_t whichCor)
01383 {
01384
01385 const float m=0.1057;
01386 float E = sqrt(p*p+m*m);
01387 float eCor = EnergyCorrections::EnergyRangeCorrectionCedar(E,vc,whichCor);
01388 return sqrt(eCor*eCor-m*m);
01389 }
01390
01391 float EnergyCorrections::EnergyRangeCorrectionCedar(float E, VldContext vc, WhichCorrection_t )
01392 {
01393 MAXMSG("DataUtil",Msg::kInfo,1)
01394 << "EnergyCorrections -- Applying Energy from Range Correction for Cedar (1.018*E)-0.009 for ND Data and (1.010*E)-0.009 for everything else.\n";
01395 float eCor=E;
01396 if (vc.GetSimFlag()==SimFlag::kData && vc.GetDetector()==Detector::kNear) {
01397 eCor=(1.018*E)-0.009;
01398 }
01399 else {
01400 eCor=(1.010*E)-0.009;
01401 }
01402
01403 return eCor;
01404 }
01405
01406 float EnergyCorrections::SignedMomentumCurvatureCorrectionCedar(float p, VldContext , WhichCorrection_t )
01407 {
01408 MAXMSG("DataUtil",Msg::kInfo,1)
01409 << "EnergyCorrections -- Not applying momentum from curvature correction for Cedar\n";
01410 return p;
01411 }
01412