00001
00002
00003
00004
00005
00006
00008 #include <iostream>
00009 #include <fstream>
00010 #include <cmath>
00011 #include "TMath.h"
00012 #include "NueAna/NueRecord.h"
00013 #include "NueAna/Reweight/NueReweight.h"
00014 #include "NueAna/NueAnaTools/NueConvention.h"
00015 #include "MessageService/MsgService.h"
00016 #include "MinosObjectMap/MomNavigator.h"
00017 #include "JobControl/JobCModuleRegistry.h"
00018 #include "Conventions/Detector.h"
00019 #include "MCReweight/NeugenWeightCalculator.h"
00020 #include "MCReweight/MCReweight.h"
00021 #include "MCReweight/ReweightHelpers.h"
00022 #include "Registry/Registry.h"
00023
00024 JOBMODULE(NueReweight, "NueReweight",
00025 "nue reweighting");
00026 CVSID("$Id: NueReweight.cxx,v 1.8 2008/11/19 18:22:51 rhatcher Exp $");
00027 ClassImp(NueReweight)
00028
00029
00030
00031 NueReweight::NueReweight():
00032 mcr(MCReweight::Instance()),
00033 counter(0),
00034 rand(0),
00035 firstevent(true)
00036 {
00037 MSG("NueReweight",Msg::kDebug)<<"Making a NueReweight"<<endl;
00038 rw = new NueRW();
00039
00040
00041 NeugenWeightCalculator *n=new NeugenWeightCalculator();
00042 mcr.AddWeightCalculator(n);
00043 }
00044
00045
00046
00047 NueReweight::~NueReweight()
00048 {
00049 MSG("NueReweight",Msg::kDebug)<<"Killing a NueReweight"<<endl;
00050 if(rw){
00051 delete rw;
00052 rw=0;
00053 }
00054 }
00055
00056
00057
00058 void NueReweight::EndJob()
00059 {
00060 MSG("NueReweight",Msg::kDebug)<<"End Job"<<endl;
00061 }
00062
00063
00064
00065 JobCResult NueReweight::Reco(MomNavigator* mom)
00066 {
00067
00068
00069
00070 rw->randrow=rand;
00071 counter++;
00072 TObject *obj=0;
00073 TIter objiter = mom->FragmentIter();
00074 int objcount=0;
00075 while((obj=objiter.Next())){
00076 const char *cn=obj->ClassName();
00077
00078
00079 if(strcmp(cn,"NueRecord")!=0){
00080 continue;
00081 }
00082 objcount++;
00083 NueRecord *nr = dynamic_cast<NueRecord *>(obj);
00084 if(firstevent){
00085 MSG("NueReweight",Msg::kDebug)<<"this is the first event"<<endl;
00086 rw->Reset();
00087 rw->fRun = nr->GetHeader().GetRun();
00088 rw->fSubRun = nr->GetHeader().GetSubRun();
00089 rw->fDet=nr->GetHeader().GetVldContext().GetDetector();
00090 int iflv = (int)((rw->fRun%100000-rw->fRun%1000)/10000);
00091 MSG("NueReweight",Msg::kDebug)<<"run is "<<rw->fRun
00092 <<" run%100000 is "<<rw->fRun%100000
00093 <<" run%1000 is "<<rw->fRun%1000<<endl;
00094
00095 MSG("NueReweight",Msg::kDebug)<<"iflv is "<<iflv<<endl;
00096 if(iflv==0){
00097 rw->fFileType = NueRW::kBEAM;
00098 }
00099 else if(iflv==1){
00100 rw->fFileType = NueRW::kNUE;
00101 }
00102 else if(iflv==3){
00103 rw->fFileType = NueRW::kTAU;
00104 }
00105 else{
00106 rw->fFileType = NueRW::kUnknown;
00107 }
00108 rw->randrow=rand;
00109 ReadRandom();
00110
00111
00112
00113
00114
00115
00116 rwtconfig.UnLockValues();
00117 rwtconfig.UnLockKeys();
00118 rwtconfig.Set("neugen:use_scale_factors",1);
00119 rwtconfig.Set("neugen:ma_qe",rw->qel_ma);
00120 rwtconfig.Set("neugen:ma_res",rw->res_ma);
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 rwtconfig.Set("neugen:kno_r112",rw->kno_r112);
00134 rwtconfig.Set("neugen:kno_r122",rw->kno_r122);
00135 rwtconfig.Set("neugen:kno_r132",rw->kno_r132);
00136 rwtconfig.Set("neugen:kno_r142",rw->kno_r142);
00137 rwtconfig.Set("neugen:kno_r113",rw->kno_r113);
00138 rwtconfig.Set("neugen:kno_r123",rw->kno_r123);
00139 rwtconfig.Set("neugen:kno_r133",rw->kno_r133);
00140 rwtconfig.Set("neugen:kno_r143",rw->kno_r143);
00141 rwtconfig.LockValues();
00142 rwtconfig.LockKeys();
00143
00144 firstevent=false;
00145 MSG("NueReweight",Msg::kDebug)<<"Set rw->randrow to "<<rw->randrow<<endl;
00146 }
00147 if(objcount==1){
00148 rw->nsnarls++;
00149 }
00150 rw->nevents++;
00151 rw->nacc++;
00152
00153
00154
00155 Registry evreg;
00156 ReweightHelpers::EventRegistryFilla(&(nr->mctrue),evreg);
00157
00158
00159 float reweight = mcr.ComputeWeight(&evreg,&rwtconfig);
00160
00161 MSG("NueReweight",Msg::kDebug)<<"Reweight is "<<reweight<<endl;
00162
00163 MSG("NueReweight",Msg::kDebug)<<"*********************"<<endl;
00164
00165 MSG("NueReweight",Msg::kDebug)<<"*********************"<<endl;
00166
00167
00168
00169
00170 float oscprob = 1.;
00171 if(nr->GetHeader().GetVldContext().GetDetector()==Detector::kFar){
00172 float theta23 = TMath::ASin(sqrt(rw->ss2th))/2.;
00173 oscprob = NueConvention::Oscillate(&(nr->mctrue),735.,
00174 rw->dm2,theta23,rw->UE32);
00175 MSG("NueReweight",Msg::kDebug)<<"dm2 is "<<rw->dm2<<" theta23 is "<<theta23
00176 <<" ue32 is "<<rw->UE32<<endl;
00177 }
00178 MSG("NueReweight",Msg::kDebug)<<"oscprob is "<<oscprob<<endl;
00179 int ebin=rw->FindEBin(nr->srevent.energyGeV);
00180 float scale=reweight*oscprob;
00181
00182 int iaction = nr->mctrue.interactionType;
00183 int inu = nr->mctrue.nuFlavor;
00184 int inunoosc = nr->mctrue.nonOscNuFlavor;
00185
00186 if(iaction==0){
00187
00188 rw->nnc+=scale;
00189 rw->nbg+=scale;
00190 rw->nncE[ebin]+=scale;
00191 rw->nbgE[ebin]+=scale;
00192 }
00193 else{
00194 if(abs(inu)==12){
00195 if(abs(inunoosc)==12){
00196 rw->nnueb+=scale;
00197 rw->nbg+=scale;
00198 rw->nnuebE[ebin]+=scale;
00199 rw->nbgE[ebin]+=scale;
00200 }
00201 else if(abs(inunoosc)==14){
00202 rw->nsig+=scale;
00203 rw->nsigE[ebin]+=scale;
00204 }
00205 }
00206 else if(abs(inu)==14){
00207 rw->nnumu+=scale;
00208 rw->nbg+=scale;
00209 rw->nnumuE[ebin]+=scale;
00210 rw->nbgE[ebin]+=scale;
00211 }
00212 else if(abs(inu)==16){
00213 rw->nnutau+=scale;
00214 rw->nbg+=scale;
00215 rw->nnutauE[ebin]+=scale;
00216 rw->nbgE[ebin]+=scale;
00217 }
00218 }
00219 }
00220
00221
00222
00223 return JobCResult::kPassed;
00224 }
00225
00226
00227
00228 const Registry& NueReweight::DefaultConfig() const
00229 {
00230 static Registry r;
00231
00232
00233 std::string name = this->GetName();
00234 name += ".config.default";
00235 r.SetName(name.c_str());
00236
00237
00238 r.UnLockValues();
00239 r.Set("RandNumber", 0);
00240 r.LockValues();
00241
00242 return r;
00243 }
00244
00245
00246
00247 void NueReweight::Config(const Registry& r)
00248 {
00249 int tmpi;
00250
00251 if (r.Get("RandNumber",tmpi)) { rand = tmpi; }
00252 }
00253
00254
00255
00256
00257 int NueReweight::ReadRandom()
00258 {
00259 const Int_t NCOLS=25;
00260
00261 string fname(getenv("SRT_PRIVATE_CONTEXT"));
00262
00263
00264 fname+=("/NueAna/data/biguniformnumbers.txt");
00265 ifstream in(fname.c_str());
00266 if(!in){
00267 MSG("NueReweight",Msg::kError)<<"Could not open random number file in priviate area"<<endl
00268 <<"Tried: "<<fname<<endl;
00269 fname=getenv("SRT_PUBLIC_CONTEXT");
00270
00271 fname+=("/NueAna/data/biguniformnumbers.txt");
00272 MSG("NueReweight",Msg::kError)<<"Will now try: "<<fname<<endl;
00273 in.open(fname.c_str());
00274 if(!in){
00275 MSG("NueReweight",Msg::kError)<<"Could not open a random number file"<<endl;
00276 return -1;
00277 }
00278 }
00279
00280 float rands[NCOLS];
00281 int counter=0;
00282 in>>rands[0];
00283 while(!in.eof()){
00284 for(int i=1;i<NCOLS;i++){
00285 in>>rands[i];
00286 }
00287 if(counter==rw->randrow){
00288 break;
00289 }
00290 counter++;
00291 in>>rands[0];
00292 }
00293
00294 if(counter<rw->randrow){
00295 MSG("NueReweight",Msg::kError)<<"Couldn't get row "<<rw->randrow<<" from "<<fname<<endl;
00296 return -1;
00297 }
00298
00299 rw->qel_ma=fabs(rands[0]);
00300 rw->res_ma=fabs(rands[1]);
00301 rw->coh_ma=fabs(rands[2]);
00302 rw->qel_fa0=-1.*fabs(rands[3]);
00303 rw->qel_eta=fabs(rands[4]);
00304 rw->res_omega=fabs(rands[5]);
00305 rw->res_z=fabs(rands[6]);
00306 rw->coh_r0=fabs(rands[7]);
00307 rw->coh_rei=fabs(rands[8]);
00308 rw->kno_a1=fabs(rands[9]);
00309 rw->kno_a2=fabs(rands[10]);
00310 rw->kno_a3=fabs(rands[11]);
00311 rw->kno_a4=fabs(rands[12]);
00312 rw->kno_b=fabs(rands[13]);
00313
00314
00315 rw->kno_r112=fabs(rands[14]);
00316 rw->kno_r122=fabs(rands[14]);
00317 rw->kno_r132=fabs(rands[14]);
00318 rw->kno_r142=fabs(rands[14]);
00319 rw->kno_r113=fabs(rands[14]);
00320 rw->kno_r123=fabs(rands[14]);
00321 rw->kno_r133=fabs(rands[14]);
00322 rw->kno_r143=fabs(rands[14]);
00323 rw->dm2=fabs(rands[22]);
00324 if(rands[23]>1){
00325 rw->ss2th=1.-(rands[23]-1.);
00326 }
00327 else{
00328 rw->ss2th=fabs(rands[23]);
00329 }
00330 rw->UE32=fabs(rands[24]);
00331 return 0;
00332 }
00333
00334
00335
00336 void NueReweight::Reset()
00337 {
00338 counter=0;
00339 rand=0;
00340 firstevent=true;
00341 rw->Reset();
00342 rwtconfig.UnLockKeys();
00343 rwtconfig.UnLockValues();
00344 rwtconfig.Clear();
00345 rwtconfig.LockKeys();
00346 rwtconfig.LockValues();
00347 return;
00348 }
00349
00350
00352