00001 #include "NueAna/Extrapolation/NueSystematic.h"
00002 #include "NueAna/Extrapolation/Background.h"
00003 #include "NueAna/NueAnaTools/NueConvention.h"
00004 #include "NueAna/NueStandard.h"
00005 #include "MCReweight/ReweightHelpers.h"
00006 #include "MCReweight/MCReweight.h"
00007 #include "Registry/Registry.h"
00008 #include <stdlib.h>
00009 #include <string>
00010 #include <iostream>
00011 #include "TFile.h"
00012 #include "TH1D.h"
00013 #include "TMath.h"
00014
00015 SKZPWeightCalculator* NueSystematic::skzp = 0;
00016
00017 NueSystematic::NueSystematic(std::string name) :
00018
00019 skzpcfg("DetXs"),
00020 fTempDouble(-9999)
00021 {
00022 sprintf(fName,"%s",name.c_str());
00023 this->Init();
00024 }
00025
00026 NueSystematic::~NueSystematic()
00027 {
00028 fSysList.clear();
00029
00030
00031 }
00032
00033 void NueSystematic::Init()
00034 {
00035 fTheta12 = 0.59365;
00036 fTheta23 = 0.785398;
00037 fTheta13 = 0.19885;
00038
00039 fDeltaMSq12 = 8.0e-5;
00040 fDeltaMSq23 = 2.43e-3;
00041
00042 fDeltaCP = 0;
00043 fMassHierarchy = 1;
00044
00045 if(skzp == 0){
00046 skzp = new SKZPWeightCalculator(skzpcfg, true);
00047 }
00048
00049 }
00050
00051 void NueSystematic::SetSKZPParams(std::string cfg)
00052 {
00053 skzpcfg = cfg;
00054 }
00055
00056 std::string NueSystematic::GetSKZPParams()
00057 {
00058 return skzpcfg;
00059 }
00060
00061 void NueSystematic::SetOscParams(Double_t theta12,Double_t theta23,Double_t theta13,
00062 Double_t deltam12,Double_t deltam23,Double_t deltaCP,
00063 Int_t massH)
00064 {
00065 fTheta12 = theta12; fTheta23 = theta23; fTheta13 = theta13;
00066 fDeltaMSq12 = deltam12; fDeltaMSq23 = deltam23;
00067 fDeltaCP = deltaCP; fMassHierarchy = massH;
00068
00069 Double_t par[9] = {0};
00070 par[OscPar::kL] = 735.0;
00071 par[OscPar::kTh23] = fTheta23;
00072 par[OscPar::kTh12] = fTheta12;
00073 par[OscPar::kTh13] = fTheta13;
00074 par[OscPar::kDeltaM23] = massH*fDeltaMSq23;
00075 par[OscPar::kDeltaM12] = fDeltaMSq12;
00076 par[OscPar::kDensity] = 2.75;
00077 par[OscPar::kDelta] = deltaCP;
00078 par[OscPar::kNuAntiNu] = 1;
00079 fOscCalc.SetOscParam(par);
00080 }
00081
00082 void NueSystematic::SetOscParams(double *par)
00083 {
00084
00085 fOscCalc.SetOscParam(par);
00086 }
00087
00088
00089 void NueSystematic::GetOscParams(Double_t &theta12,Double_t &theta23,Double_t &theta13,
00090 Double_t &deltam12,Double_t &deltam23,Double_t &deltaCP,
00091 Int_t &massH)
00092 {
00093 fTheta12 = theta12; fTheta23 = theta23; fTheta13 = theta13;
00094 fDeltaMSq12 = deltam12; fDeltaMSq23 = deltam23;
00095 fDeltaCP = deltaCP; fMassHierarchy = massH;
00096
00097 Double_t par[10];
00098 fOscCalc.GetOscParam(par);
00099
00100 par[OscPar::kL] = 735.0;
00101 theta23 = par[OscPar::kTh23];
00102 theta12 = par[OscPar::kTh12];
00103 theta13 = par[OscPar::kTh13];
00104 deltam23 = par[OscPar::kDeltaM23];
00105 deltam12 = par[OscPar::kDeltaM12];
00106 deltaCP = par[OscPar::kDelta];
00107
00108 massH = 1;
00109 if(deltam23 < 0){ massH = -1; deltam23 = -deltam23;}
00110 }
00111
00112 Double_t NueSystematic::GetSysValue(Systematic::Systematic_t sys)
00113 {
00114 std::map<Systematic::Systematic_t,Double_t>::iterator beg = fSysList.begin();
00115 std::map<Systematic::Systematic_t,Double_t>::iterator end = fSysList.end();
00116 while (beg!=end) {
00117 if(beg->first==sys) return beg->second;
00118 beg++;
00119 }
00120 return Systematic::GetDefaultValue(sys);
00121 }
00122
00123 void NueSystematic::SetSysValue(Systematic::Systematic_t sys, Double_t val)
00124 {
00125 std::map<Systematic::Systematic_t,Double_t>::iterator beg = fSysList.begin();
00126 std::map<Systematic::Systematic_t,Double_t>::iterator end = fSysList.end();
00127
00128 while (beg!=end) {
00129 if(beg->first==sys){ beg->second = val; return; }
00130 beg++;
00131 }
00132 }
00133
00134 Double_t NueSystematic::UpdateRecord(NueRecord *rec,Selection::Selection_t sel)
00135 {
00136 Double_t totWeight = 1;
00137 Double_t enShift = 0;
00138 Double_t pidShift = 0;
00139 Double_t trkLength = 0;
00140 Double_t trkLike = 0;
00141 double shwEnShift = 0;
00142
00143 std::map<Systematic::Systematic_t,Double_t>::iterator beg = fSysList.begin();
00144 std::map<Systematic::Systematic_t,Double_t>::iterator end = fSysList.end();
00145 while (beg!=end) {
00146 Systematic::Systematic_t sys = beg->first;
00147 Double_t val = beg->second;
00148 switch (sys) {
00149 case Systematic::kNorm : totWeight *= this->DoNormCalc(rec,val);
00150 case Systematic::kEMCalib : enShift += this->DoCalibShift(rec,sys,val); break;
00151 case Systematic::kHadCalib : enShift += this->DoCalibShift(rec,sys,val); break;
00152 case Systematic::kRelCalib : enShift += this->DoCalibShift(rec,sys,val); break;
00153 case Systematic::kMA_QE : totWeight *= this->DoNeugenCalc(rec,sys,val); break;
00154 case Systematic::kMA_RES : totWeight *= this->DoNeugenCalc(rec,sys,val); break;
00155 case Systematic::kKNO : totWeight *= this->DoNeugenCalc(rec,sys,val); break;
00156 case Systematic::kTrkLike : trkLike += val; break;
00157 case Systematic::kTrkPlane : trkLength += val; break;
00158 case Systematic::kPIDShift : pidShift += val; break;
00159 case Systematic::kSKZP : totWeight *= this->DoSKZPCalc(rec,val); break;
00160 case Systematic::kOscProb : totWeight *= this->DoOscCalc(rec,val); break;
00161 case Systematic::kShwDev : totWeight *= this->DoShwDevCalc(rec,val,sel); break;
00162 case Systematic::kTauProd : totWeight *= this->DoTauProd(rec,val); break;
00163 case Systematic::kPIDSkew : totWeight *= this->DoPIDSkew(rec,val,sel); break;
00164 case Systematic::kNCScale : totWeight *= this->DoNCScale(rec,val, sel); break;
00165 case Systematic::kCCShwE : shwEnShift += this->DoCCShwEnergyScale(rec,val,sel); break;
00166 default: break;
00167 }
00168 beg++;
00169
00170 }
00171
00172 rec->srevent.phNueGeV *= 1+enShift;
00173 rec->srshower.phCCGeV *= 1+shwEnShift;
00174
00175 rec->subshowervars.pid += pidShift;
00176 rec->ann.pid_30inp += pidShift;
00177 rec->ann.pid_6inp += pidShift;
00178 rec->ann.pid_11inp += pidShift;
00179 rec->ann.pid_11inp_daikon04 += pidShift;
00180 rec->mcnnv.mcnn_var1 += pidShift;
00181
00182
00183
00184
00185 rec->srtrack.endPlane += Int_t(trkLength);
00186 rec->srtrack.trklikePlanes += Int_t(trkLike);
00187
00188 return totWeight*rec->fluxweights.totbeamweight;
00189 }
00190
00191 Double_t NueSystematic::UpdateRecord(NueRecord *rec,Selection::Selection_t sel,
00192 Background::Background_t bg)
00193 {
00194 Double_t totWeight = 1;
00195 Double_t enShift = 0;
00196 Double_t pidShift = 0;
00197 Double_t trkLength = 0;
00198 Double_t trkLike = 0;
00199 double shwEnShift = 0;
00200
00201
00202 Double_t OscSysVal = this->GetSysValue(Systematic::kOscProb);
00203 this->SetSysValue(Systematic::kOscProb, 0);
00204
00205 std::map<Systematic::Systematic_t,Double_t>::iterator beg = fSysList.begin();
00206 std::map<Systematic::Systematic_t,Double_t>::iterator end = fSysList.end();
00207 while (beg!=end) {
00208 Systematic::Systematic_t sys = beg->first;
00209 Double_t val = beg->second;
00210 switch (sys) {
00211 case Systematic::kNorm : totWeight *= this->DoNormCalc(rec,val);
00212 case Systematic::kEMCalib : enShift += this->DoCalibShift(rec,sys,val); break;
00213 case Systematic::kHadCalib : enShift += this->DoCalibShift(rec,sys,val); break;
00214 case Systematic::kRelCalib : enShift += this->DoCalibShift(rec,sys,val); break;
00215 case Systematic::kMA_QE : totWeight *= this->DoNeugenCalc(rec,sys,val);
00216 break;
00217 case Systematic::kMA_RES : totWeight *= this->DoNeugenCalc(rec,sys,val);
00218 break;
00219 case Systematic::kKNO : totWeight *= this->DoNeugenCalc(rec,sys,val); break;
00220 case Systematic::kTrkLike : trkLike += val; break;
00221 case Systematic::kTrkPlane : trkLength += val; break;
00222 case Systematic::kPIDShift : pidShift += val; break;
00223 case Systematic::kSKZP : totWeight *= this->DoSKZPCalc(rec,val); break;
00224 case Systematic::kOscProb : totWeight *= this->DoOscCalc(rec,val); break;
00225 case Systematic::kShwDev : totWeight *= this->DoShwDevCalc(rec,val,sel); break;
00226 case Systematic::kTauProd : totWeight *= this->DoTauProd(rec,val); break;
00227 case Systematic::kPIDSkew : totWeight *= this->DoPIDSkew(rec,val,sel); break;
00228 case Systematic::kNCScale : totWeight *= this->DoNCScale(rec,val, sel); break;
00229 case Systematic::kCCShwE : shwEnShift += this->DoCCShwEnergyScale(rec,val,sel); break;
00230 default: break;
00231 }
00232 beg++;
00233 }
00234
00235 this->SetSysValue(Systematic::kOscProb, OscSysVal);
00236
00237 totWeight *= this->GetAppearanceWeight(rec, bg);
00238
00239 rec->srevent.phNueGeV *= 1+enShift;
00240 rec->srshower.phCCGeV *= 1+shwEnShift;
00241 rec->subshowervars.pid += pidShift;
00242 rec->ann.pid_30inp += pidShift;
00243 rec->ann.pid_6inp += pidShift;
00244 rec->ann.pid_11inp += pidShift;
00245 rec->ann.pid_11inp_daikon04 += pidShift;
00246 rec->mcnnv.mcnn_var1 += pidShift;
00247
00248
00249
00250
00251 rec->srtrack.endPlane += Int_t(trkLength);
00252 rec->srtrack.trklikePlanes += Int_t(trkLike);
00253
00254 return totWeight*rec->fluxweights.totbeamweight;
00255 }
00256
00257
00258 Double_t NueSystematic::GetAppearanceWeight(NueRecord *rec, Background::Background_t bg)
00259 {
00260 if(bg == Background::kNueCC || bg == Background::kNuTauCC) rec->mctrue.nonOscNuFlavor = 14;
00261 if(bg == Background::kNueCC) rec->mctrue.nuFlavor = 12;
00262 if(bg == Background::kNuTauCC) rec->mctrue.nuFlavor = 16;
00263 if(bg == Background::kNuTauCC) rec->mctrue.resonanceCode = 1001;
00264 if(rec->mctrue.nonOscNuFlavor < 0) rec->mctrue.nuFlavor *= -1;
00265 std::map<Systematic::Systematic_t,Double_t>::iterator beg = fSysList.begin();
00266 std::map<Systematic::Systematic_t,Double_t>::iterator end = fSysList.end();
00267
00268 double totWeight = 1.0;
00269
00270 while (beg!=end) {
00271 Systematic::Systematic_t sys = beg->first;
00272 Double_t val = beg->second;
00273 switch (sys) {
00274 case Systematic::kOscProb : totWeight *= this->DoOscCalc(rec,val); break;
00275 case Systematic::kTauProd : totWeight *= this->DoTauProd(rec,val); break;
00276 default: break;
00277 }
00278 beg++;
00279 }
00280
00281 return totWeight;
00282 }
00283
00284 Double_t NueSystematic::DoSKZPCalc(NueRecord *record,Double_t val)
00285 {
00286
00287
00288
00289 double baseweight = record->fluxweights.totskzpweight;
00290 if(val < -999){
00291 if(baseweight <= 0) return 0;
00292 else return 1.0/baseweight;
00293 }
00294 else{
00295 if(val != 0 ) {
00296 if(record->mctrue.nuFlavor<-9998) return 1;
00297 float energy = record->mctrue.nuEnergy;
00298 int inu = record->mctrue.nonOscNuFlavor;
00299
00300 Detector::Detector_t det = record->GetHeader().GetVldContext().GetDetector();
00301
00302
00303
00304
00305
00306 double err = 1.0;
00307
00308 if(TMath::Abs(inu) == 14){
00309 err = skzp->GetFluxError(det,2,inu,energy,SKZPWeightCalculator::kTotalErrorAfterTune);
00310 err -= 1.0;
00311 }
00312 if(TMath::Abs(inu) == 12){
00313 err = skzp->GetFluxError(det,2,inu,energy,SKZPWeightCalculator::kHadProdAfterTune);
00314 err = TMath::Sqrt((err - 1)*(err - 1) + 0.0177*0.0177);
00315 }
00316
00317 double weight = 1.0 + err*val;
00318
00319 return weight;
00320 }
00321 }
00322
00323 return 1;
00324 }
00325
00326 Double_t NueSystematic::DoOscCalc(NueRecord *record,Double_t val)
00327 {
00328 Double_t osc_prob = 1;
00329 if(record->mctrue.nuFlavor<-9998) return osc_prob;
00330 Double_t L = 735.0;
00331 if(record->GetHeader().GetVldContext().GetDetector()==Detector::kNear){
00332 L = 1.0; return 1.0;
00333 }
00334
00335 fOscCalc.SetOscParam(OscPar::kNuAntiNu, 1);
00336 if(record->mctrue.nonOscNuFlavor < 0) fOscCalc.SetOscParam(OscPar::kNuAntiNu, -1);
00337 double ue32 = TMath::Sin(fTheta13);
00338 ue32 *= ue32;
00339
00340
00341 if( int(val+0.5) ==1 ) {
00342 osc_prob = fOscCalc.Oscillate(record->mctrue.nuFlavor,
00343 record->mctrue.nonOscNuFlavor,
00344 record->mctrue.nuEnergy);
00345 }
00346 else if( int(val+0.5) == 2 )
00347 osc_prob = fOscCalc.Oscillate(record->mctrue.nuFlavor,
00348 record->mctrue.nonOscNuFlavor,
00349 record->mctrue.nuEnergy);
00350
00351 return osc_prob;
00352 }
00353
00354 Double_t NueSystematic::DoShwDevCalc(NueRecord *record,Double_t val, Selection::Selection_t sel)
00355 {
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380 if(sel == Selection::kCC) return 1;
00381
00382 if(int(val+0.5)==1) {
00383
00384
00385 const int NSEL = 10;
00386 static vector<TH1D*> ND_NC;
00387 static vector<TH1D*> ND_NUMU;
00388 static vector<TH1D*> ND_BNUE;
00389
00390 static vector<TH1D*> FD_NC;
00391 static vector<TH1D*> FD_NUMU;
00392 static vector<TH1D*> FD_BNUE;
00393 static vector<TH1D*> FD_NUE;
00394 static vector<TH1D*> FD_NUTAU;
00395
00396 if(ND_NC.size() == 0){
00397
00398 for(int i = 0; i < NSEL; i++){
00399 TH1D* dum = 0;
00400 ND_NC.push_back(dum);
00401 ND_NUMU.push_back(dum);
00402 ND_BNUE.push_back(dum);
00403 FD_NC.push_back(dum);
00404 FD_NUMU.push_back(dum);
00405 FD_BNUE.push_back(dum);
00406 FD_NUE.push_back(dum);
00407 FD_NUTAU.push_back(dum);
00408 }
00409
00410 const int NDET = 2;
00411 const int NUC = 5;
00412 const int NCUT = 4;
00413 string det[2] = {"Near", "Far"};
00414 string nuC[5] = {"numu", "nc", "bnue", "nue", "nutau"};
00415
00416 string name[NCUT] = {"Fid", "Presel", "ANN", "SSPID"};
00417
00418 TFile Input("NueAna/data/CarrotDaikonWeights.root", "READ");
00419 TH1D* temp;
00420 TH1D* temp2;
00421
00422 for(int i = 0; i < NDET; i++){
00423 for(int j = 0; j < NUC; j++){
00424 if(i < 1 && j >= 3) continue;
00425 for(int k = 0; k < NCUT; k++){
00426 TString id = det[i]+nuC[j]+name[k];
00427 Input.GetObject(id, temp);
00428 if(temp != 0){
00429 temp2 = (TH1D*) temp->Clone("ratio");
00430 temp2->SetDirectory(0);
00431
00432 int iSel = (int) Selection::StringToEnum(name[k].c_str());
00433
00434 if(i+1 ==Detector::kFar ){
00435 if(j==1) FD_NC[iSel] = temp2;
00436 if(j==0) FD_NUMU[iSel] = temp2;
00437 if(j==4) FD_NUTAU[iSel] = temp2;
00438 if(j==2) FD_BNUE[iSel] = temp2;
00439 if(j==3) FD_NUE[iSel] = temp2;
00440 }
00441 if(i+1 ==Detector::kNear ){
00442 if(j==1) ND_NC[iSel] = temp2;
00443 if(j==0) ND_NUMU[iSel] = temp2;
00444 if(j==2) ND_BNUE[iSel] = temp2;
00445 }
00446 }
00447 else
00448 cout<<"Unable to Load: "<<id<<endl;
00449 }
00450 }
00451 }
00452 }
00453
00454 Background::Background_t bg =
00455 Background::TranslateFromMC(record->mctrue.interactionType,
00456 record->mctrue.nuFlavor,
00457 record->mctrue.nonOscNuFlavor);
00458
00459 Double_t recoEnergy = record->srevent.phNueGeV;
00460
00461 TH1D* temp = 0;
00462 int iSel = (int) sel;
00463
00464 if(record->GetHeader().GetVldContext().GetDetector()==Detector::kFar){
00465 if(bg==Background::kNC) temp = FD_NC[iSel];
00466 if(bg==Background::kNuMuCC) temp = FD_NUMU[iSel];
00467 if(bg==Background::kNuTauCC) temp = FD_NUTAU[iSel];
00468 if(bg==Background::kBNueCC) temp = FD_BNUE[iSel];
00469 if(bg==Background::kNueCC) temp = FD_NUE[iSel];
00470 }
00471 if(record->GetHeader().GetVldContext().GetDetector()==Detector::kNear){
00472 if(bg==Background::kNC) temp = ND_NC[iSel];
00473 if(bg==Background::kNuMuCC) temp = ND_NUMU[iSel];
00474 if(bg==Background::kBNueCC) temp = ND_BNUE[iSel];
00475 }
00476
00477 if(temp == 0) cout<<"Massive loading error "<<bg<<" "<<record->GetHeader().GetVldContext().GetDetector()<<endl;
00478 for(int i=0;i<temp->GetNbinsX();i++){
00479 if(recoEnergy>=temp->GetBinLowEdge(i) && recoEnergy< temp->GetBinLowEdge(i+1)) {
00480 return temp->GetBinContent(i);
00481 }
00482 }
00483
00484 return 1;
00485 }
00486 if(int(val+0.5)==2){
00487
00488 Double_t weight = this->DoNeugenCalc(record,Systematic::kShwDev,4);
00489 if(record->xsecweights.xsecweight>0) weight/=record->xsecweights.xsecweight;
00490 return weight;
00491 }
00492 if(int(val+0.5)==3){
00493
00494 Double_t piZeroEnergy[8] = {0.0,0.75,1.5,2.25,3.0,3.75,4.5,100};
00495 Double_t weight[8] = {1.19675,1.06378,2.00025,1.91159,
00496 1.61631,1.2359,1.84444,1.00};
00497 Double_t pi0E = record->shi.epi0;
00498 for(int i=0;i<7;i++){
00499 if(pi0E>=piZeroEnergy[i] && pi0E<piZeroEnergy[i+1])
00500 return weight[i];
00501 }
00502 }
00503 return 1;
00504 }
00505
00506
00507 Double_t NueSystematic::DoNeugenCalc(NueRecord *record,
00508 Systematic::Systematic_t sys,Double_t val)
00509 {
00510
00511 MCReweight *mcr = &MCReweight::Instance();
00512
00513
00514 static double oldVal = -999;
00515 bool reset = false;
00516 Registry rwtconfig;
00517
00518 if(val != oldVal){
00519 rwtconfig.UnLockValues();
00520 rwtconfig.UnLockKeys();
00521
00522
00523 rwtconfig.Set("neugen:use_scale_factors",1);
00524 if(sys==Systematic::kMA_QE) rwtconfig.Set("neugen:ma_qe",val);
00525 else if(sys==Systematic::kMA_RES) rwtconfig.Set("neugen:ma_res",val);
00526 else if(sys==Systematic::kKNO) rwtconfig.Set("neugen:scale_kno_all",val);
00527 else if(sys==Systematic::kShwDev) {
00528 rwtconfig.Set("neugen:config_no",int(val+0.5));
00529 rwtconfig.Set("neugen:config_name","MODBYRS");
00530 }
00531 rwtconfig.LockValues();
00532 rwtconfig.LockKeys();
00533 reset = true;
00534 oldVal = val;
00535 }
00536
00537 MCEventInfo ei;
00538 ei.UseStoredXSec(true);
00539 ei.nuE = record->mctrue.nuEnergy;
00540 ei.nuPx = record->mctrue.nuDCosX*ei.nuE;
00541 ei.nuPy = record->mctrue.nuDCosY*ei.nuE;
00542 ei.nuPz = record->mctrue.nuDCosZ*ei.nuE;
00543 ei.tarE = record->mctrue.targetEnergy;
00544 ei.tarPx = record->mctrue.targetPX;
00545 ei.tarPx = record->mctrue.targetPY;
00546 ei.tarPx = record->mctrue.targetPZ;
00547 ei.y = record->mctrue.hadronicY;
00548 ei.x = record->mctrue.bjorkenX;
00549 ei.q2 = record->mctrue.q2;
00550 ei.w2 = record->mctrue.w2;
00551 ei.iaction = record->mctrue.interactionType;
00552 ei.inu = record->mctrue.nuFlavor;
00553 ei.iresonance = record->mctrue.resonanceCode;
00554 ei.initial_state = record->mctrue.initialState;
00555 ei.nucleus = ReweightHelpers::
00556 FindNucleusNumber(int(record->mctrue.atomicNumber),
00557 int(record->mctrue.atomicWeight));
00558 ei.had_fs = abs(record->mctrue.hadronicFinalState);
00559 ei.stdXSec = record->xsecweights.xsecweight;
00560
00561
00562
00563
00564 if(ei.inu<-9998 ||
00565 (ei.iresonance==1003 && TMath::Abs(ei.had_fs)<200) ) return 1;
00566 NuParent *nuparent = 0;
00567
00568 double weight = 1.0;
00569
00570 if(reset) weight = mcr->ComputeWeight(&ei,nuparent,&rwtconfig);
00571 else weight = mcr->ComputeWeight(&ei,nuparent);
00572
00573 return weight;
00574 }
00575
00576 Double_t NueSystematic::DoCalibShift(NueRecord *record,
00577 Systematic::Systematic_t sys,Double_t val)
00578 {
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599 Double_t cor_em_frac = 0.0;
00600
00601 if(record->mctrue.fNueClass != 0){
00602 double EMen = record->shi.emenergy - record->shi.epi0;
00603 cor_em_frac = EMen/(record->mctrue.nuEnergy);
00604 }
00605
00606 if(sys==Systematic::kEMCalib)
00607 return cor_em_frac*val;
00608 else if(sys==Systematic::kHadCalib)
00609 return (1-cor_em_frac)*val;
00610 else if(sys==Systematic::kRelCalib) {
00611 if(record->GetHeader().GetVldContext().GetDetector()!=2) return 0;
00612 return val;
00613 }
00614 return 0;
00615 }
00616
00617 Double_t NueSystematic::DoTauProd(NueRecord *record,Double_t val)
00618 {
00619
00620
00621 double scale = 0.5;
00622
00623 if(record->mctrue.interactionType==1 &&
00624 TMath::Abs(record->mctrue.nuFlavor)==16){
00625
00626 if(record->mctrue.resonanceCode == 1001) scale = 0.5;
00627 if(record->mctrue.resonanceCode == 1002) scale = 0.5;
00628 if(record->mctrue.resonanceCode == 1003) scale = 0.1;
00629 return 1 + scale*val;
00630 }
00631 return 1;
00632 }
00633
00634 Double_t NueSystematic::DoPIDSkew(NueRecord *record,Double_t val,
00635 Selection::Selection_t sel)
00636 {
00637 double pid = NueStandard::GetPIDValue(record, sel);
00638
00639 if(pid > -1000)
00640 {
00641 return (1 + pid*val);
00642 }
00643
00644 return 1;
00645 }
00646
00647 Double_t NueSystematic::DoNormCalc(NueRecord *record,Double_t val)
00648 {
00649 if(record->GetHeader().GetVldContext().GetDetector()==2) return val;
00650 return 1;
00651 }
00652
00653 Double_t NueSystematic::DoNCScale(NueRecord *record,
00654 Double_t val,
00655 Selection::Selection_t sel)
00656 {
00657 if(sel != Selection::kCC) return 1;
00658 if(record->mctrue.fNueClass == 0) return val;
00659 return 1;
00660 }
00661
00662 Double_t NueSystematic::DoCCShwEnergyScale(NueRecord * ,
00663 Double_t val,
00664 Selection::Selection_t sel)
00665 {
00666 if(sel != Selection::kCC) return 0;
00667 return val;
00668 }
00669
00670 void NueSystematic::MakeBranches(TTree *tree)
00671 {
00672 TBranch *branch = 0;
00673 if((branch = tree->GetBranch("SysName"))) branch->SetAddress(fName);
00674 else tree->Branch("SysName",fName,"SysName/C");
00675
00676 std::map<Systematic::Systematic_t,Double_t>::iterator beg = fSysList.begin();
00677 std::map<Systematic::Systematic_t,Double_t>::iterator end = fSysList.end();
00678 Int_t max_sys_index = 0;
00679 while(strcmp(Systematic::AsString(Systematic::ESystematic(max_sys_index)),
00680 "?Unknown?")!=0) {
00681
00682
00683
00684 if (beg!=end && beg->first==max_sys_index) {
00685
00686 if((branch = tree->GetBranch(Systematic::AsString(beg->first)))) {
00687 branch->SetAddress(&(beg->second));
00688 }
00689 else {
00690 char leafname[256]; sprintf(leafname,"%s/D",Systematic::AsString(beg->first));
00691 tree->Branch(Systematic::AsString(beg->first),&(beg->second),leafname);
00692 }
00693 beg++;
00694 }
00695 else {
00696 if((branch =
00697 tree->GetBranch(Systematic::AsString(Systematic::ESystematic(max_sys_index))))) {
00698 branch->SetAddress(&fTempDouble);
00699 }
00700 else {
00701 char leafname[256];
00702 sprintf(leafname,"%s/D",
00703 Systematic::AsString(Systematic::ESystematic(max_sys_index)));
00704 tree->Branch(Systematic::AsString(Systematic::ESystematic(max_sys_index)),
00705 &fTempDouble,leafname);
00706 }
00707 }
00708 max_sys_index++;
00709 }
00710
00711 if((branch = tree->GetBranch("Theta12"))) branch->SetAddress(&fTheta12);
00712 else tree->Branch("Theta12",&fTheta12,"Theta12/D");
00713 if((branch = tree->GetBranch("Theta23"))) branch->SetAddress(&fTheta23);
00714 else tree->Branch("Theta23",&fTheta23,"Theta23/D");
00715 if((branch = tree->GetBranch("Theta13"))) branch->SetAddress(&fTheta13);
00716 else tree->Branch("Theta13",&fTheta13,"Theta13/D");
00717 if((branch = tree->GetBranch("DeltaMSq23"))) branch->SetAddress(&fDeltaMSq23);
00718 else tree->Branch("DeltaMSq23",&fDeltaMSq23,"DeltaMSq23/D");
00719 if((branch = tree->GetBranch("DeltaMSq12"))) branch->SetAddress(&fDeltaMSq12);
00720 else tree->Branch("DeltaMSq12",&fDeltaMSq12,"DeltaMSq12/D");
00721 if((branch = tree->GetBranch("DeltaCP"))) branch->SetAddress(&fDeltaCP);
00722 else tree->Branch("DeltaCP",&fDeltaCP,"DeltaCP/D");
00723 if((branch = tree->GetBranch("MassHierarchy"))) branch->SetAddress(&fMassHierarchy);
00724 else tree->Branch("MassHierarchy",&fMassHierarchy,"MassHierarchy/I");
00725 }