00001 #include "NueAna/NueExpBuilder.h"
00002 #include "NueAna/NueStandard.h"
00003 #include "TRandom3.h"
00004 #include "NueAna/NueAnaTools/NueConvention.h"
00005 #include "TMath.h"
00006
00007 NueExpBuilder::NueExpBuilder(){
00008 outSet = false;
00009 fReweight = false;
00010 fBaseline = 735;
00011 fDeltaMSquare = 0.0027;
00012 fUe3Square = 0.025;
00013 fTheta23 = TMath::Pi()/4;
00014
00015 fSeed = -10;
00016 cutSet = "Default";
00017 }
00018
00019 void NueExpBuilder::AddFiles(std::string infiles)
00020 {
00021 files.push_back(infiles);
00022 }
00023
00024 void NueExpBuilder::SetOutputFile(std::string file)
00025 {
00026 outSet = true;
00027 outFile = file;
00028 }
00029
00030 void NueExpBuilder::SetDeltaMSquare(double dm2) { fDeltaMSquare = dm2; fReweight = true;}
00031 void NueExpBuilder::SetUe3Square(double dUe32) { fUe3Square = dUe32; fReweight = true;}
00032 void NueExpBuilder::SetTheta23(double t23) { fTheta23 = t23; fReweight = true;}
00033 void NueExpBuilder::SetBaseline(double bl) { fBaseline = bl; fReweight = true;}
00034
00035 void NueExpBuilder::SetMaxProb(double max) {fMaxProb = max;}
00036 double NueExpBuilder::GetMaxProb() {return fMaxProb;}
00037
00038 void NueExpBuilder::SetMeanNumberOfEvents(double num) {fMeanNumber = num;}
00039 void NueExpBuilder::SetNumberOfEvents(int num) {fNumberOfEvents = num; }
00040
00041 void NueExpBuilder::GenerateExperiment(int nExp)
00042 {
00043 NueRecord *nr = new NueRecord();
00044 NuePOT *np = new NuePOT();
00045 NuePOT *total = new NuePOT();
00046
00047 TChain *chain = new TChain("ana_nue");
00048
00049 for(unsigned int i = 0; i < files.size(); i++)
00050 {
00051 chain->Add(files[i].c_str());
00052 }
00053
00054 chain->SetBranchAddress("NueRecord",&nr);
00055 chain->SetBranchStatus("fHeader*",1);
00056 chain->SetBranchStatus("fHeader.fVld*",1);
00057 chain->SetBranchStatus("fluxweight*", 1);
00058 chain->SetBranchStatus("mctrue*", 1);
00059
00060 chain->SetBranchStatus("dtree*", 0);
00061 chain->SetBranchStatus("mcnnv*", 0);
00062 chain->SetBranchStatus("timing*", 0);
00063 chain->SetBranchStatus("cdi*", 0);
00064 chain->SetBranchStatus("mri*", 0);
00065 chain->SetBranchStatus("mri*", 0);
00066 chain->SetBranchStatus("treepid*", 0);
00067 chain->SetBranchStatus("highhit*", 0);
00068 chain->SetBranchStatus("mstvar*", 0);
00069 chain->SetBranchStatus("fracvars*", 0);
00070 chain->SetBranchStatus("shield*", 0);
00071 chain->SetBranchStatus("angcluster*", 0);
00072 chain->SetBranchStatus("shwfit*", 0);
00073 chain->SetBranchStatus("hitcalc*", 0);
00074 chain->SetBranchStatus("anainfo*", 0);
00075 chain->SetBranchStatus("mda*", 0);
00076 chain->SetBranchStatus("srshower*", 0);
00077 chain->SetBranchStatus("srtrack*", 0);
00078
00079 std::vector<double> weights;
00080 double max = 0;
00081
00082 Int_t n = chain->GetEntries();
00083
00084 for(int i = 0; i < n; i++){
00085 chain->GetEvent(i);
00086 if(i%10000 == 0) std::cout<<"On call "<<i<<"/"<<n<<std::endl;
00087 double weight =1.0;
00088
00089 if(EvaluateCuts(nr)){
00090 weight *= NueStandard::GetRPWBeamWeight(nr);
00091
00092 if(fReweight && nr->mctrue.nuFlavor > -100)
00093 {
00094 int nuFlavor = nr->mctrue.nuFlavor;
00095 int nonOsc = nr->mctrue.nonOscNuFlavor;
00096 float energy = nr->mctrue.nuEnergy;
00097
00098 Float_t newWeight = NueConvention::Oscillate(nuFlavor, nonOsc, energy, 735, fDeltaMSquare, fTheta23, fUe3Square);
00099
00100 nr->mctrue.Ue3Squared = fUe3Square;
00101 nr->mctrue.DeltamSquared23 = fDeltaMSquare;
00102 nr->mctrue.Theta23 = fTheta23;
00103 nr->mctrue.fOscProb = newWeight;
00104 weight *= newWeight;
00105 }else{ weight *= nr->mctrue.fOscProb; }
00106 }else{weight = 0.0;}
00107
00108 weights.push_back(weight);
00109 if(weight > fMaxProb)
00110 std::cout<<"MaxWeight too small "<<weight<<" "<<fMaxProb<<std::endl;
00111 if(weight > max) max = weight;
00112 }
00113 std::cout<<"Maximum weight: "<<max<<std::endl;
00114
00115
00116 TChain *schain = new TChain("ana_nue");
00117 schain->SetBranchAddress("NueRecord",&nr);
00118
00119 TChain *pchain = new TChain("pottree");
00120 pchain->SetBranchAddress("NuePOT", &np);
00121
00122 TRandom3 fRand;
00123
00124 if(fSeed > -1) fRand.SetSeed(fSeed);
00125
00126
00127 for(unsigned int i = 0; i < files.size(); i++)
00128 {
00129 pchain->Add(files[i].c_str());
00130 schain->Add(files[i].c_str());
00131 }
00132
00133
00134 for(int i = 0; i < nExp; i++){
00135
00136
00137 fNumberOfEvents = fRand.Poisson(fMeanNumber);
00138
00139 char suffix[10];
00140 sprintf(suffix, "Exp%d", i);
00141
00142 std::string outName = outFile + std::string(suffix) + ".root";
00143
00144 TFile *save = new TFile(outName.c_str(),"RECREATE");
00145 TTree *tree = new TTree("ana_nue","ana_nue");
00146 TTree::SetBranchStyle(1);
00147 TBranch* br = tree->Branch("NueRecord","NueRecord", &nr );
00148 br->SetAutoDelete(kFALSE);
00149
00150 int count = 0;
00151 int calls = 0;
00152 std::vector<int> pos;
00153
00154 while( count < fNumberOfEvents){
00155 int entry = (int) fRand.Uniform(n);
00156 double weight = weights[entry];
00157 calls++;
00158
00159 if(calls%200 == 0) std::cout<<"On call "<<calls<<"/"<<count<<std::endl;
00160
00161 double prob = fRand.Uniform(fMaxProb);
00162 if(prob <= weight){
00163 chain->GetEntry(entry);
00164 tree->Fill();
00165 count++;
00166 }
00167 }
00168
00169 std::cout<<"Finished "<<suffix<<" with "<<count <<" events after "<<calls<<std::endl;
00170
00171 TTree *ptree = new TTree("pottree","pottree");
00172 TBranch* br2 = ptree->Branch("NuePOT","NuePOT", &total );
00173 br2->SetAutoDelete(kFALSE);
00174 pchain->GetEntry(0);
00175 total->beamtype = np->beamtype;
00176 total->pot = fTargetPOT;
00177 ptree->Fill();
00178
00179 save->cd();
00180 tree->Write();
00181 ptree->Write();
00182 save->Close();
00183
00184
00185
00186
00187 }
00188 }
00189
00190 void NueExpBuilder::SetCuts(std::string type, int level)
00191 {
00192 cutSet = type;
00193 cutLevel = level;
00194 }
00195
00196 bool NueExpBuilder::EvaluateCuts(NueRecord *nr)
00197 {
00198 if(cutSet == "Default") return true;
00199
00200 if(cutSet == "Fiducial")
00201 return NueStandard::IsInFid(nr);
00202
00203 if(cutSet == "Standard"){
00204 bool ret;
00205 switch(cutLevel){
00206 case 0: return NueStandard::PassesSelection(nr, Selection::kDataQual);
00207 case 1: return NueStandard::PassesSelection(nr, Selection::kFid);
00208 case 2:
00209 ret = NueStandard::PassesSelection(nr, Selection::kFid);
00210 ret = ret && NueStandard::PassesNonHEPreSelection(nr);
00211 return ret;
00212 case 3: return NueStandard::PassesSelection(nr, Selection::kPre);
00213 }
00214 }
00215 if(cutSet == "MRE" || cutSet == "MRCC"){
00216 bool dq = NueStandard::PassesSelection(nr, Selection::kDataQual);
00217 bool mrefid = NueStandard::PassesMREFiducial(nr);
00218 bool mrepre = NueStandard::PassesMREPreSelection(nr) && mrefid && dq;
00219 bool ret;
00220 switch(cutLevel){
00221 case 0: return mrefid && dq;
00222 case 1: return mrepre;
00223 case 2:
00224 return NueStandard::PassesSelection(nr, Selection::kFid) && mrepre;
00225 case 3:
00226 ret = NueStandard::PassesSelection(nr, Selection::kFid);
00227 ret = ret && NueStandard::PassesNonHEPreSelection(nr);
00228 return ret && mrepre;
00229 case 4:
00230 return NueStandard::PassesSelection(nr, Selection::kPre) && mrepre;
00231 }
00232 }
00233 if(cutSet == "Presel")
00234 return NueStandard::PassesSelection(nr, Selection::kPre);
00235
00236 if(cutSet == "PreselNoHE")
00237 return NueStandard::PassesNonHEPreSelection(nr);
00238
00239 if(cutSet == "Systematic"){
00240
00241
00242 if(!NueStandard::IsInFid(nr)) return false;
00243
00244 switch(cutLevel){
00245 case 0: return NueStandard::PassesSysPreSelection(nr);
00246 case 1: return NueStandard::PassesSysPreSelectionNoHE(nr);
00247 }
00248 }
00249
00250
00251 if(cutSet == "CC")
00252 return NueStandard::PassesSelection(nr, Selection::kCC);
00253
00254
00255
00256
00257 std::cout<<"Invalid Cut Level for "<<cutSet<<": "<<cutLevel<<std::endl;
00258 return false;
00259 }