00001
00002
00003
00004
00005
00006
00008 #include <fstream>
00009 #include <cassert>
00010 #include "MessageService/MsgService.h"
00011 #include "MinosObjectMap/MomNavigator.h"
00012 #include "JobControl/JobCModuleRegistry.h"
00013 #include "CandNtupleSR/NtpSRRecord.h"
00014 #include "NueAna/NuePID.h"
00015 #include "NueAna/FillPIDFromText.h"
00016
00017 JOBMODULE(FillPIDFromText, "FillPIDFromText",
00018 "fills pid info from a text file");
00019 CVSID("$Id:");
00020
00021
00022 TxtEntry::TxtEntry():
00023 run(0),
00024 subrun(0),
00025 snarl(0),
00026 event(0)
00027 {}
00028
00029 TxtEntry::TxtEntry(int r, int sbr, int s, int e):
00030 run(r),
00031 subrun(sbr),
00032 snarl(s),
00033 event(e)
00034 {}
00035
00036 TxtEntry::TxtEntry(int r, int sbr, int s, int e, int f, int rsn):
00037 run(r),
00038 subrun(sbr),
00039 snarl(s),
00040 event(e),
00041 flav(f),
00042 res(rsn)
00043 {}
00044
00045 TxtEntry::TxtEntry(int r, int sbr, int s, int e, float l):
00046 run(r),
00047 subrun(sbr),
00048 snarl(s),
00049 event(e),
00050 like(l)
00051 {}
00052
00053
00054 TxtEntry::~TxtEntry()
00055 {}
00056 FillPIDFromText::FillPIDFromText():
00057 counter(0),
00058 fTextFile(),
00059 fDecider(NuePIDHeader::kUnknown),
00060 elist(),
00061 kSelRes(-1),
00062 kSelFlav(-1)
00063
00064 {}
00065
00066
00067
00068 FillPIDFromText::~FillPIDFromText()
00069 {}
00070
00071
00072
00073 void FillPIDFromText::BeginJob()
00074 {
00075 ReadTextFile();
00076 }
00077
00078
00079
00080 JobCResult FillPIDFromText::Reco(MomNavigator* mom)
00081 {
00082 if(counter%1000==0){
00083 MSG("FillPIDFromText",Msg::kInfo)<<"On entry "<<counter<<endl;
00084 }
00085 counter++;
00086
00087
00088 if(elist.size()==0){
00089 MSG("FillPIDFromText",Msg::kError)<<"No entries in elist, abort"<<endl;
00090 assert(0);
00091 }
00092
00093
00094 NtpSRRecord *sr = static_cast<NtpSRRecord *>(mom->GetFragment("NtpSRRecord"));
00095 if(!sr){
00096 MSG("FillPIDFromText",Msg::kError)<<"Couldn't get a NtpSRRecord from mom"<<endl;
00097 return JobCResult::kFailed;
00098 }
00099
00100 VldContext vc=sr->GetHeader().GetVldContext();
00101
00102 Int_t dec=-1;
00103 Float_t likelihood=1;
00104
00105 int evtn=sr->evthdr.nevent;
00106 if(evtn==0){
00107
00108
00109
00110 NuePIDHeader h(vc);
00111 h.SetSnarl(sr->GetHeader().GetSnarl());
00112 h.SetRun(sr->GetHeader().GetRun());
00113 h.SetSubRun(sr->GetHeader().GetSubRun());
00114 h.SetEventNo(-1);
00115 h.SetEvents(evtn);
00116 h.SetDecider(fDecider);
00117
00118
00119 NuePID *pid=new NuePID(h);
00120
00121
00122
00123 TxtEntry test(h.GetRun(),h.GetSubRun(),h.GetSnarl(),0);
00124 std::set<TxtEntry>::iterator t=elist.find(test);
00125 if(t==elist.end()){
00126
00127 pid->IsNue=-1;
00128 pid->likelihood=1;
00129 }
00130 else{
00131
00132
00133 if(fDecider==6) {
00134 Int_t decflav=-1;
00135 Int_t decres=-1;
00136 if(kSelFlav==-1){decflav=1;}
00137 else if((*t).flav==kSelFlav&&kSelFlav>-1){decflav =1;}
00138 if(kSelRes==-1){decres=1;}
00139 else if((*t).res==kSelRes&&kSelRes>-1){decres = 1;}
00140
00141 if(decflav==-1||decres==-1){dec=-1;}
00142 else {dec=1;}
00143 }
00144 if(fDecider==7) {likelihood=(*t).like; dec=1;}
00145 MSG("FillPIDFromText",Msg::kDebug) << (*t).run
00146 << (*t).subrun << " " << (*t).snarl << " "
00147 << (*t).event << " " << (*t).flav << " " << (*t).res
00148 << " " << dec << endl;
00149 pid->IsNue=dec;
00150 pid->likelihood=likelihood;
00151 }
00152 MSG("FillPIDFromText",Msg::kDebug)<<"PID decision: "<<pid->IsNue<<endl;
00153
00154 mom->AdoptFragment(pid);
00155 return JobCResult::kPassed;
00156 }
00157
00158
00159 for(int i=0;i<evtn;i++){
00160
00161 NuePIDHeader h(vc);
00162 h.SetSnarl(sr->GetHeader().GetSnarl());
00163 h.SetRun(sr->GetHeader().GetRun());
00164 h.SetSubRun(sr->GetHeader().GetSubRun());
00165 h.SetEventNo(i);
00166 h.SetEvents(evtn);
00167 h.SetDecider(fDecider);
00168
00169
00170 NuePID *pid=new NuePID(h);
00171
00172
00173 TxtEntry test(h.GetRun(),h.GetSubRun(),h.GetSnarl(),h.GetEventNo());
00174 std::set<TxtEntry>::iterator t=elist.find(test);
00175 if(t==elist.end()){
00176
00177 pid->IsNue=-1;
00178 pid->likelihood=1;
00179 }
00180 else{
00181 if(fDecider==6) {
00182 Int_t decflav=-1;
00183 Int_t decres=-1;
00184 if(kSelFlav==-1){decflav=1;}
00185 else if((*t).flav==kSelFlav&&kSelFlav>-1){decflav =1;}
00186 if(kSelRes==-1){decres=1;}
00187 else if((*t).res==kSelRes&&kSelRes>-1){decres = 1;}
00188
00189 if(decflav==-1||decres==-1){dec=-1;}
00190 else {dec=1;}
00191 }
00192 if(fDecider==7) {likelihood=(*t).like; dec=1;}
00193 MSG("FillPIDFromText",Msg::kDebug)<< (*t).run
00194 << (*t).subrun << " " << (*t).snarl << " "
00195 << (*t).event << " " << (*t).flav << " " << (*t).res
00196 << " " << dec << endl;
00197
00198 pid->IsNue=dec;
00199 pid->likelihood=likelihood;
00200 }
00201 MSG("FillPIDFromText",Msg::kDebug)<<"PID decision: "<<pid->IsNue<<endl;
00202
00203 mom->AdoptFragment(pid);
00204 }
00205
00206 return JobCResult::kPassed;
00207 }
00208
00209
00210
00211 const Registry& FillPIDFromText::DefaultConfig() const
00212 {
00213
00214
00215
00216 static Registry r;
00217
00218
00219 std::string name = this->GetName();
00220 name += ".config.default";
00221 r.SetName(name.c_str());
00222
00223
00224 r.UnLockValues();
00225 r.Set("TextFile","pid.txt");
00226 r.Set("Decider",0);
00227 r.Set("SelRes",-1);
00228 r.Set("SelFlav",-1);
00229
00230 r.LockValues();
00231
00232 return r;
00233 }
00234
00235
00236
00237 void FillPIDFromText::Config(const Registry& r)
00238 {
00239
00240
00241
00242 const char* tmps;
00243
00244 if (r.Get("TextFile",tmps)) { fTextFile = (string)(tmps); }
00245 int d;
00246 if (r.Get("Decider",d)) { fDecider = (NuePIDHeader::Decider_t)(d); }
00247 if (r.Get("SelRes",d)) { kSelRes = d; }
00248 if (r.Get("SelFlav",d)) { kSelFlav = d; }
00249 }
00250
00251
00252
00253 void FillPIDFromText::ReadTextFile()
00254 {
00255
00256 int nread=0;
00257 std::ifstream in(fTextFile.c_str());
00258 if(!in){
00259 MSG("FilPIDFromText",Msg::kError)<<"Could not open "<<fTextFile<<endl;
00260 return;
00261 }
00262
00263 int run, subrun, snarl, event, flav, res;
00264 float like;
00265 in>>run;
00266 while(!in.eof()){
00267 nread++;
00268 in>>subrun>>snarl>>event;
00269 if(fDecider==6) {in >> flav >> res;
00270 MSG("FillPIDFromText",Msg::kDebug)<< run << " "
00271 << subrun << " " << snarl << " "
00272 << event << " " << flav << " " << res << endl;}
00273 if(fDecider==7) in >> like;
00274
00275 TxtEntry *a;
00276 if (fDecider==6) { TxtEntry t(run,subrun,snarl,event, flav,res);a=&t;}
00277 else if (fDecider==7) { TxtEntry t(run,subrun,snarl,event, like);a=&t;}
00278 else{ TxtEntry t(run,subrun,snarl,event);a=&t;}
00279
00280 elist.insert(*a);
00281 in>>run;
00282 }
00283
00284 MSG("FillPIDFromText",Msg::kDebug)<<"Read in "<<nread<<" entries "<<endl;
00285 MSG("FillPIDFromText",Msg::kDebug)<<"elist has "<<elist.size()<<" entries "<<endl;
00286 }
00287