00001 #ifndef muparenthelper_cxx
00002 #define muparenthelper_cxx
00003 #include "StandardNtuple/NtpStRecord.h"
00004 #include "MCNtuple/NtpMCRecord.h"
00005 #include "MCNtuple/NtpMCTruth.h"
00006 #include "MCNtuple/NtpMCStdHep.h"
00007 #include "MCNtuple/NtpMCFluxInfo.h"
00008 #include "AnalysisNtuples/ANtpTruthInfoBeam.h"
00009 #include "MCReweight/MuParentHelper.h"
00010 #include "MCReweight/NuParent.h"
00011 #include <iostream>
00012 #include "TString.h"
00013 #include "TClonesArray.h"
00014
00015 Int_t GEANTtoPDG(Int_t);
00016
00017 using namespace std;
00018
00019
00020 MuParentHelper::MuParentHelper()
00021 {
00022 fok = false;
00023 fFile = NULL;
00024 fTree = NULL;
00025 fusemini = true;
00026 char *dir = getenv("GNUMIAUX");
00027 if(dir!=NULL) fdir = dir;
00028 else fdir = ".";
00029 if(OpenFile()) {
00030 SetAddresses();
00031 SetVectorEntries();
00032 }
00033 }
00034
00035
00036 MuParentHelper::~MuParentHelper()
00037 {
00038 CloseFile();
00039 }
00040
00041
00042 Bool_t MuParentHelper::SetFileDir(std::string dir, bool usemini)
00043 {
00044 fdir = dir;
00045 fusemini=usemini;
00046 if(OpenFile()) {
00047 SetAddresses();
00048 SetVectorEntries();
00049 return true;
00050 }
00051 return false;
00052 }
00053
00054
00055 Bool_t MuParentHelper::OpenFile()
00056 {
00057 if(fFile) {
00058 fFile->Close();
00059 delete fFile;
00060 }
00061 char name[256];
00062 char slash = '/';
00063 TString st(fdir.c_str());
00064 st.Remove(0,st.Last(slash)+1);
00065 if(fusemini){
00066 sprintf(name,"%s/mupiTreeMini_%s.root",fdir.c_str(),st.Data());
00067 }
00068 else{
00069 sprintf(name,"%s/mupiTree_%s.root",fdir.c_str(),st.Data());
00070 }
00071 cout << name << endl;
00072 fFile = new TFile(name,"READ");
00073 if(fFile->IsOpen() && !fFile->IsZombie()){
00074 fTree = (TTree*) fFile->Get("mupitree");
00075 fok = true;
00076 return true;
00077 }
00078 return false;
00079 }
00080
00081
00082 void MuParentHelper::SetAddresses()
00083 {
00084 if(!fok) return;
00085 fTree->SetBranchAddress("run",&fRunNum);
00086 fTree->SetBranchAddress("evtno",&fEvtNum);
00087 fTree->SetBranchAddress("tvx",&fX);
00088 fTree->SetBranchAddress("tvy",&fY);
00089 fTree->SetBranchAddress("tvz",&fZ);
00090 fTree->SetBranchAddress("tpx",&fPX);
00091 fTree->SetBranchAddress("tpy",&fPY);
00092 fTree->SetBranchAddress("tpz",&fPZ);
00093 fTree->SetBranchAddress("tptype",&fPID);
00094 fTree->SetBranchAddress("tgen",&fGen);
00095 if(!fusemini){
00096 fTree->SetBranchAddress("Ndxdz",&fNdxdz);
00097 fTree->SetBranchAddress("Ndydz",&fNdydz);
00098 fTree->SetBranchAddress("Npz",&fNpz);
00099 fTree->SetBranchAddress("Nenergy",&fNenergy);
00100 fTree->SetBranchAddress("Ndxdznea",&fNdxdznear);
00101 fTree->SetBranchAddress("Ndydznea",&fNdydznear);
00102 fTree->SetBranchAddress("Nenergyn",&fNenergynear);
00103 fTree->SetBranchAddress("Nwtnear",&fNwtnear);
00104 fTree->SetBranchAddress("Ndxdzfar",&fNdxdzfar);
00105 fTree->SetBranchAddress("Ndydzfar",&fNdydzfar);
00106 fTree->SetBranchAddress("Nenergyf",&fNenergyfar);
00107 fTree->SetBranchAddress("Nwtfar",&fNwtfar);
00108 fTree->SetBranchAddress("Norig",&fNorig);
00109 fTree->SetBranchAddress("Ndecay",&fNdecay);
00110 fTree->SetBranchAddress("Ntype",&fNtype);
00111 fTree->SetBranchAddress("Vx",&fVx);
00112 fTree->SetBranchAddress("Vy",&fVy);
00113 fTree->SetBranchAddress("Vz",&fVz);
00114 fTree->SetBranchAddress("pdpx",&fPdpx);
00115 fTree->SetBranchAddress("pdpy",&fPdpy);
00116 fTree->SetBranchAddress("pdpz",&fPdpz);
00117 fTree->SetBranchAddress("ppdxdz",&fPpdxdz);
00118 fTree->SetBranchAddress("ppdydz",&fPpdydz);
00119 fTree->SetBranchAddress("pppz",&fPppz);
00120 fTree->SetBranchAddress("ppenergy",&fPpenergy);
00121 fTree->SetBranchAddress("ppmedium",&fPpmedium);
00122 fTree->SetBranchAddress("ptype",&fPtype);
00123 fTree->SetBranchAddress("ppvx",&fPpvx);
00124 fTree->SetBranchAddress("ppvy",&fPpvy);
00125 fTree->SetBranchAddress("ppvz",&fPpvz);
00126 fTree->SetBranchAddress("muparpx",&fMuparpx);
00127 fTree->SetBranchAddress("muparpy",&fMuparpy);
00128 fTree->SetBranchAddress("muparpz",&fMuparpz);
00129 fTree->SetBranchAddress("mupare",&fMupare);
00130 fTree->SetBranchAddress("Necm",&fNecm);
00131 fTree->SetBranchAddress("Nimpwt",&fNimpwt);
00132 fTree->SetBranchAddress("xpoint",&fXpoint);
00133 fTree->SetBranchAddress("ypoint",&fYpoint);
00134 fTree->SetBranchAddress("zpoint",&fZpoint);
00135 }
00136
00137 fTree->SetBranchAddress("mu_tvx",&fMuX);
00138 fTree->SetBranchAddress("mu_tvy",&fMuY);
00139 fTree->SetBranchAddress("mu_tvz",&fMuZ);
00140 fTree->SetBranchAddress("mu_tpx",&fMuPX);
00141 fTree->SetBranchAddress("mu_tpy",&fMuPY);
00142 fTree->SetBranchAddress("mu_tpz",&fMuPZ);
00143 fTree->SetBranchAddress("mu_tptype",&fMuPID);
00144 fTree->SetBranchAddress("mu_tgen",&fMuGen);
00145 if(!fusemini){
00146 fTree->SetBranchAddress("mu_Ndxdz",&fMuNdxdz);
00147 fTree->SetBranchAddress("mu_Ndydz",&fMuNdydz);
00148 fTree->SetBranchAddress("mu_Npz",&fMuNpz);
00149 fTree->SetBranchAddress("mu_Nenergy",&fMuNenergy);
00150 fTree->SetBranchAddress("mu_Ndxdznea",&fMuNdxdznear);
00151 fTree->SetBranchAddress("mu_Ndydznea",&fMuNdydznear);
00152 fTree->SetBranchAddress("mu_Nenergyn",&fMuNenergynear);
00153 fTree->SetBranchAddress("mu_Nwtnear",&fMuNwtnear);
00154 fTree->SetBranchAddress("mu_Ndxdzfar",&fMuNdxdzfar);
00155 fTree->SetBranchAddress("mu_Ndydzfar",&fMuNdydzfar);
00156 fTree->SetBranchAddress("mu_Nenergyf",&fMuNenergyfar);
00157 fTree->SetBranchAddress("mu_Nwtfar",&fMuNwtfar);
00158 fTree->SetBranchAddress("mu_Norig",&fMuNorig);
00159 fTree->SetBranchAddress("mu_Ndecay",&fMuNdecay);
00160 fTree->SetBranchAddress("mu_Ntype",&fMuNtype);
00161 fTree->SetBranchAddress("mu_Vx",&fMuVx);
00162 fTree->SetBranchAddress("mu_Vy",&fMuVy);
00163 fTree->SetBranchAddress("mu_Vz",&fMuVz);
00164 fTree->SetBranchAddress("mu_pdpx",&fMuPdpx);
00165 fTree->SetBranchAddress("mu_pdpy",&fMuPdpy);
00166 fTree->SetBranchAddress("mu_pdpz",&fMuPdpz);
00167 fTree->SetBranchAddress("mu_ppdxdz",&fMuPpdxdz);
00168 fTree->SetBranchAddress("mu_ppdydz",&fMuPpdydz);
00169 fTree->SetBranchAddress("mu_pppz",&fMuPppz);
00170 fTree->SetBranchAddress("mu_ppenergy",&fMuPpenergy);
00171 fTree->SetBranchAddress("mu_ppmedium",&fMuPpmedium);
00172 fTree->SetBranchAddress("mu_ptype",&fMuPtype);
00173 fTree->SetBranchAddress("mu_ppvx",&fMuPpvx);
00174 fTree->SetBranchAddress("mu_ppvy",&fMuPpvy);
00175 fTree->SetBranchAddress("mu_ppvz",&fMuPpvz);
00176 fTree->SetBranchAddress("mu_muparpx",&fMuMuparpx);
00177 fTree->SetBranchAddress("mu_muparpy",&fMuMuparpy);
00178 fTree->SetBranchAddress("mu_muparpz",&fMuMuparpz);
00179 fTree->SetBranchAddress("mu_mupare",&fMuMupare);
00180 fTree->SetBranchAddress("mu_Necm",&fMuNecm);
00181 fTree->SetBranchAddress("mu_Nimpwt",&fMuNimpwt);
00182 fTree->SetBranchAddress("mu_xpoint",&fMuXpoint);
00183 fTree->SetBranchAddress("mu_ypoint",&fMuYpoint);
00184 fTree->SetBranchAddress("mu_zpoint",&fMuZpoint);
00185 }
00186 }
00187
00188
00189 void MuParentHelper::SetVectorEntries()
00190 {
00191 if(!fok) return;
00192 map<Int_t,map<Int_t,Int_t> >::iterator beg = fVec.begin();
00193 map<Int_t,map<Int_t,Int_t> >::iterator end = fVec.end();
00194 while(beg!=end){
00195 beg->second.clear();
00196 }
00197 fVec.clear();
00198 Int_t nentries = fTree->GetEntries();
00199 for(int i=0;i<nentries;i++){
00200 fTree->GetEntry(i);
00201 fVec[fRunNum][fEvtNum] = i;
00202 }
00203 }
00204
00205
00206 void MuParentHelper::CloseFile()
00207 {
00208 if(fFile) {
00209 fFile->Close();
00210 delete fFile;
00211 }
00212 fok = false;
00213 }
00214
00215
00216 void MuParentHelper::GetMuParent(Int_t runnum, Int_t evtnum,
00217 Float_t mu_tpx, Float_t mu_tpy,
00218 Float_t mu_tpz, NuParent &par)
00219 {
00220 const std::map<Int_t,std::map<Int_t,Int_t> >::const_iterator run_it = fVec.find(runnum);
00221 if(run_it == fVec.end())
00222 {
00223
00224 return;
00225 }
00226
00227 const std::map<Int_t,Int_t> &evt_map = run_it -> second;
00228 const std::map<Int_t,Int_t>::const_iterator evt_it = evt_map.find(evtnum);
00229 if(evt_it == evt_map.end())
00230 {
00231
00232 return;
00233 }
00234
00235 const int entry = evt_it -> second;
00236
00237 fTree->GetEntry(entry);
00238 if(runnum==fRunNum && evtnum==fEvtNum &&
00239 2.*TMath::Abs(mu_tpx-fMuPX)/(mu_tpx+fMuPX)<1e-4 &&
00240 2.*TMath::Abs(mu_tpy-fMuPY)/(mu_tpy+fMuPY)<1e-4 &&
00241 2.*TMath::Abs(mu_tpz-fMuPZ)/(mu_tpz+fMuPZ)<1e-4) {
00242
00243 if(fPID!=0 && fGen!=0) {
00244
00245
00246 par.SetX(fX);
00247 par.SetY(fY);
00248 par.SetZ(fZ);
00249 par.SetPx(fPX);
00250 par.SetPy(fPY);
00251 par.SetPz(fPZ);
00252 par.SetPID(GEANTtoPDG(fPID));
00253 par.SetGen(fGen);
00254 }
00255 else {
00256
00257
00258 par.SetX(fMuX);
00259 par.SetY(fMuY);
00260 par.SetZ(fMuZ);
00261 par.SetPx(fMuPX);
00262 par.SetPy(fMuPY);
00263 par.SetPz(fMuPZ);
00264 par.SetPID(GEANTtoPDG(fMuPID));
00265 par.SetGen(fMuGen);
00266 }
00267 }
00268 else {
00269
00270
00271 par.SetX(0);
00272 par.SetY(0);
00273 par.SetZ(0);
00274 par.SetPx(0);
00275 par.SetPy(0);
00276 par.SetPz(0);
00277 par.SetPID(0);
00278 par.SetGen(0);
00279 }
00280 }
00281
00282
00283 void MuParentHelper::GetMuParent(NtpMCRecord *rec,int mcevent,
00284 NuParent &par)
00285 {
00286 TClonesArray& mcarray = *(rec->mc);
00287 NtpMCTruth *mc = static_cast<NtpMCTruth*>(mcarray[mcevent]);
00288 Int_t runnum = mc->flux.fluxrun;
00289 Int_t evtnum = mc->flux.fluxevtno;
00290 Float_t mu_tpx = mc->flux.tpx;
00291 Float_t mu_tpy = mc->flux.tpy;
00292 Float_t mu_tpz = mc->flux.tpz;
00293 this->GetMuParent(runnum,evtnum,mu_tpx,mu_tpy,mu_tpz,par);
00294 }
00295
00296
00297 void MuParentHelper::GetMuParent(NtpStRecord *rec,int mcevent,
00298 NuParent &par)
00299 {
00300 TClonesArray& mcarray = *(rec->mc);
00301 NtpMCTruth *mc = static_cast<NtpMCTruth*>(mcarray[mcevent]);
00302 Int_t runnum = mc->flux.fluxrun;
00303 Int_t evtnum = mc->flux.fluxevtno;
00304 Float_t mu_tpx = mc->flux.tpx;
00305 Float_t mu_tpy = mc->flux.tpy;
00306 Float_t mu_tpz = mc->flux.tpz;
00307 this->GetMuParent(runnum,evtnum,mu_tpx,mu_tpy,mu_tpz,par);
00308 }
00309
00310
00311 void MuParentHelper::FillANtpTruth(NtpMCRecord *rec,int mcevent,
00312 ANtpTruthInfoBeam &ntpBeam)
00313 {
00314 NuParent parent;
00315 this->GetMuParent(rec,mcevent,parent);
00316 ntpBeam.parentX = parent.GetX();
00317 ntpBeam.parentY = parent.GetY();
00318 ntpBeam.parentZ = parent.GetZ();
00319 ntpBeam.parentPX = parent.GetPx();
00320 ntpBeam.parentPY = parent.GetPy();
00321 ntpBeam.parentPZ = parent.GetPz();
00322 ntpBeam.parentPID = parent.GetPID();
00323 ntpBeam.parentGen = parent.GetGen();
00324 }
00325
00326
00327 void MuParentHelper::FillANtpTruth(NtpStRecord *rec,int mcevent,
00328 ANtpTruthInfoBeam &ntpBeam)
00329 {
00330 NuParent parent;
00331 this->GetMuParent(rec,mcevent,parent);
00332 ntpBeam.parentX = parent.GetX();
00333 ntpBeam.parentY = parent.GetY();
00334 ntpBeam.parentZ = parent.GetZ();
00335 ntpBeam.parentPX = parent.GetPx();
00336 ntpBeam.parentPY = parent.GetPy();
00337 ntpBeam.parentPZ = parent.GetPz();
00338 ntpBeam.parentPID = parent.GetPID();
00339 ntpBeam.parentGen = parent.GetGen();
00340 }
00341
00342
00343 Int_t GEANTtoPDG(Int_t gCode)
00344 {
00345 if(gCode==1) return 22;
00346 if(gCode==2) return -11;
00347 if(gCode==3) return 11;
00348 if(gCode==4) return 14;
00349 if(gCode==5) return -13;
00350 if(gCode==6) return 13;
00351 if(gCode==7) return 111;
00352 if(gCode==8) return 211;
00353 if(gCode==9) return -211;
00354 if(gCode==10) return 130;
00355 if(gCode==11) return 321;
00356 if(gCode==12) return -321;
00357 if(gCode==13) return 2112;
00358 if(gCode==14) return 2212;
00359 if(gCode==15) return -2212;
00360 if(gCode==16) return 310;
00361 if(gCode==17) return 221;
00362 if(gCode==18) return 3122;
00363 if(gCode==19) return 3222;
00364 if(gCode==20) return 3212;
00365 if(gCode==21) return 3112;
00366 if(gCode==22) return 3322;
00367 if(gCode==23) return 3312;
00368 if(gCode==24) return 3332;
00369 if(gCode==25) return -2112;
00370 if(gCode==26) return -3122;
00371 if(gCode==27) return -3112;
00372 if(gCode==28) return -3212;
00373 if(gCode==29) return -3112;
00374 if(gCode==30) return -3322;
00375 if(gCode==31) return -3312;
00376 if(gCode==32) return -3332;
00377 if(gCode==33) return -15;
00378 if(gCode==34) return 15;
00379 if(gCode==35) return 411;
00380 if(gCode==36) return -411;
00381 if(gCode==37) return 421;
00382 if(gCode==38) return -421;
00383 if(gCode==39) return 431;
00384 if(gCode==40) return -431;
00385 if(gCode==41) return 4122;
00386 if(gCode==42) return 24;
00387 if(gCode==43) return -24;
00388 if(gCode==44) return 23;
00389 return 0;
00390 }
00391
00392
00393 void MuParentHelper::GetMuParent(NtpMCFluxInfo *mufi, NtpMCFluxInfo &fi)
00394 {
00395 GetMuParent(mufi->fluxrun,mufi->fluxevtno,mufi->tpx,mufi->tpy,mufi->tpz,fi);
00396
00397 }
00398
00399
00400 void MuParentHelper::GetMuParent(Int_t runnum, Int_t evtnum,
00401 Float_t mu_tpx, Float_t mu_tpy,
00402 Float_t mu_tpz, NtpMCFluxInfo &fi)
00403 {
00404 const std::map<Int_t,std::map<Int_t,Int_t> >::const_iterator run_it = fVec.find(runnum);
00405 if(run_it == fVec.end())
00406 {
00407
00408 return;
00409 }
00410
00411 const std::map<Int_t,Int_t> &evt_map = run_it -> second;
00412 const std::map<Int_t,Int_t>::const_iterator evt_it = evt_map.find(evtnum);
00413 if(evt_it == evt_map.end())
00414 {
00415
00416 return;
00417 }
00418
00419 const int entry = evt_it -> second;
00420
00421 fTree->GetEntry(entry);
00422 if(runnum==fRunNum && evtnum==fEvtNum &&
00423 2.*TMath::Abs(mu_tpx-fMuPX)/(mu_tpx+fMuPX)<1e-4 &&
00424 2.*TMath::Abs(mu_tpy-fMuPY)/(mu_tpy+fMuPY)<1e-4 &&
00425 2.*TMath::Abs(mu_tpz-fMuPZ)/(mu_tpz+fMuPZ)<1e-4) {
00426
00427 if(fPID!=0 && fGen!=0) {
00428
00429
00430 fi.index=-1;
00431 fi.fluxrun=runnum;
00432 fi.fluxevtno=evtnum;
00433 fi.ndxdz=fNdxdz;
00434 fi.ndydz=fNdydz;
00435 fi.npz=fNpz;
00436 fi.nenergy=fNenergy;
00437 fi.ndxdznear=fNdxdznear;
00438 fi.ndydznear=fNdydznear;
00439 fi.nenergynear=fNenergynear;
00440 fi.nwtnear=fNwtnear;
00441 fi.ndxdzfar=fNdxdzfar;
00442 fi.ndydzfar=fNdydzfar;
00443 fi.nenergyfar=fNenergyfar;
00444 fi.nwtfar=fNwtfar;
00445 fi.norig=fNorig;
00446 fi.ndecay=fNdecay;
00447 fi.ntype=fNtype;
00448 fi.vx=fVx;
00449 fi.vy=fVy;
00450 fi.vz=fVz;
00451 fi.pdpx=fPdpx;
00452 fi.pdpy=fPdpy;
00453 fi.pdpz=fPdpz;
00454 fi.ppdxdz=fPpdxdz;
00455 fi.ppdydz=fPpdydz;
00456 fi.pppz=fPppz;
00457 fi.ppenergy=fPpenergy;
00458 fi.ppmedium=fPpmedium;
00459 fi.ptype=fPtype;
00460 fi.ppvx=fPpvx;
00461 fi.ppvy=fPpvy;
00462 fi.ppvz=fPpvz;
00463 fi.muparpx=fMuparpx;
00464 fi.muparpy=fMuparpy;
00465 fi.muparpz=fMuparpz;
00466 fi.mupare=fMupare;
00467 fi.necm=fNecm;
00468 fi.nimpwt=fNimpwt;
00469 fi.xpoint=fXpoint;
00470 fi.ypoint=fYpoint;
00471 fi.zpoint=fZpoint;
00472 fi.tvx=fX;
00473 fi.tvy=fY;
00474 fi.tvz=fZ;
00475 fi.tpx=fPX;
00476 fi.tpy=fPY;
00477 fi.tpz=fPZ;
00478 fi.tptype=GEANTtoPDG(fPID);
00479 fi.tgen=fGen;
00480 }
00481 else {
00482
00483
00484 fi.index=-1;
00485 fi.fluxrun=runnum;
00486 fi.fluxevtno=evtnum;
00487 fi.ndxdz=fMuNdxdz;
00488 fi.ndydz=fMuNdydz;
00489 fi.npz=fMuNpz;
00490 fi.nenergy=fMuNenergy;
00491 fi.ndxdznear=fMuNdxdznear;
00492 fi.ndydznear=fMuNdydznear;
00493 fi.nenergynear=fMuNenergynear;
00494 fi.nwtnear=fMuNwtnear;
00495 fi.ndxdzfar=fMuNdxdzfar;
00496 fi.ndydzfar=fMuNdydzfar;
00497 fi.nenergyfar=fMuNenergyfar;
00498 fi.nwtfar=fMuNwtfar;
00499 fi.norig=fMuNorig;
00500 fi.ndecay=fMuNdecay;
00501 fi.ntype=fMuNtype;
00502 fi.vx=fMuVx;
00503 fi.vy=fMuVy;
00504 fi.vz=fMuVz;
00505 fi.pdpx=fMuPdpx;
00506 fi.pdpy=fMuPdpy;
00507 fi.pdpz=fMuPdpz;
00508 fi.ppdxdz=fMuPpdxdz;
00509 fi.ppdydz=fMuPpdydz;
00510 fi.pppz=fMuPppz;
00511 fi.ppenergy=fMuPpenergy;
00512 fi.ppmedium=fMuPpmedium;
00513 fi.ptype=fMuPtype;
00514 fi.ppvx=fMuPpvx;
00515 fi.ppvy=fMuPpvy;
00516 fi.ppvz=fMuPpvz;
00517 fi.muparpx=fMuMuparpx;
00518 fi.muparpy=fMuMuparpy;
00519 fi.muparpz=fMuMuparpz;
00520 fi.mupare=fMuMupare;
00521 fi.necm=fMuNecm;
00522 fi.nimpwt=fMuNimpwt;
00523 fi.xpoint=fMuXpoint;
00524 fi.ypoint=fMuYpoint;
00525 fi.zpoint=fMuZpoint;
00526 fi.tvx=fMuX;
00527 fi.tvy=fMuY;
00528 fi.tvz=fMuZ;
00529 fi.tpx=fMuPX;
00530 fi.tpy=fMuPY;
00531 fi.tpz=fMuPZ;
00532 fi.tptype=GEANTtoPDG(fMuPID);
00533 fi.tgen=fMuGen;
00534 }
00535 }
00536 else {
00537
00538
00539 fi.index=-1;
00540 fi.fluxrun=runnum;
00541 fi.fluxevtno=evtnum;
00542 fi.ndxdz=0.;
00543 fi.ndydz=0.;
00544 fi.npz=0.;
00545 fi.nenergy=0.;
00546 fi.ndxdznear=0.;
00547 fi.ndydznear=0.;
00548 fi.nenergynear=0.;
00549 fi.nwtnear=0.;
00550 fi.ndxdzfar=0.;
00551 fi.ndydzfar=0.;
00552 fi.nenergyfar=0.;
00553 fi.nwtfar=0.;
00554 fi.norig=0;
00555 fi.ndecay=0;
00556 fi.ntype=0;
00557 fi.vx=0.;
00558 fi.vy=0.;
00559 fi.vz=0.;
00560 fi.pdpx=0.;
00561 fi.pdpy=0.;
00562 fi.pdpz=0.;
00563 fi.ppdxdz=0.;
00564 fi.ppdydz=0.;
00565 fi.pppz=0.;
00566 fi.ppenergy=0.;
00567 fi.ppmedium=0;
00568 fi.ptype=0;
00569 fi.ppvx=0.;
00570 fi.ppvy=0.;
00571 fi.ppvz=0.;
00572 fi.muparpx=0.;
00573 fi.muparpy=0.;
00574 fi.muparpz=0.;
00575 fi.mupare=0.;
00576 fi.necm=0.;
00577 fi.nimpwt=0.;
00578 fi.xpoint=0.;
00579 fi.ypoint=0.;
00580 fi.zpoint=0.;
00581 fi.tvx=0.;
00582 fi.tvy=0.;
00583 fi.tvz=0.;
00584 fi.tpx=0.;
00585 fi.tpy=0.;
00586 fi.tpz=0.;
00587 fi.tptype=0;
00588 fi.tgen=0;
00589 }
00590 }
00591
00592
00593 void MuParentHelper::GetMuDaughter(NtpMCFluxInfo *oldfi,
00594 NtpMCFluxInfo &newfi, int desirednu)
00595 {
00596 Int_t runnum = oldfi->fluxrun;
00597 Int_t evtnum = oldfi->fluxevtno;
00598 Float_t tpx = oldfi->tpx;
00599 Float_t tpy = oldfi->tpy;
00600 Float_t tpz = oldfi->tpz;
00601 this->GetMuDaughter(runnum,evtnum,tpx,tpy,tpz,newfi,desirednu);
00602 }
00603
00604
00605 void MuParentHelper::GetMuDaughter(Int_t runnum, Int_t evtnum,
00606 Float_t tpx, Float_t tpy,
00607 Float_t tpz, NtpMCFluxInfo &fi, int desirednu)
00608 {
00609 const std::map<Int_t,std::map<Int_t,Int_t> >::const_iterator run_it = fVec.find(runnum);
00610 if(run_it == fVec.end())
00611 {
00612
00613 return;
00614 }
00615
00616 const std::map<Int_t,Int_t> &evt_map = run_it -> second;
00617 const std::map<Int_t,Int_t>::const_iterator evt_it = evt_map.find(evtnum);
00618 if(evt_it == evt_map.end())
00619 {
00620
00621 return;
00622 }
00623
00624 const int entry = evt_it -> second;
00625
00626 bool foundit=false;
00627
00628 fTree->GetEntry(entry);
00629 if(fMuNtype==desirednu&&runnum==fRunNum&&evtnum==fEvtNum){
00630 foundit=true;
00631 }
00632 else{
00633 fTree->GetEntry(entry-1);
00634 if(fMuNtype==desirednu&&runnum==fRunNum&&evtnum==fEvtNum){
00635 foundit=true;
00636 }
00637 else{
00638 fTree->GetEntry(entry+1);
00639 if(fMuNtype==desirednu&&runnum==fRunNum&&evtnum==fEvtNum){
00640 foundit=true;
00641 }
00642 else{
00643 foundit=false;
00644 }
00645 }
00646 }
00647
00648 if(runnum==fRunNum && evtnum==fEvtNum &&
00649 2.*TMath::Abs(tpx-fPX)/(tpx+fPX)<1e-4 &&
00650 2.*TMath::Abs(tpy-fPY)/(tpy+fPY)<1e-4 &&
00651 2.*TMath::Abs(tpz-fPZ)/(tpz+fPZ)<1e-4) {
00652
00653 if(fPID!=0 && fGen!=0 && foundit) {
00654
00655
00656 fi.index=-1;
00657 fi.fluxrun=runnum;
00658 fi.fluxevtno=evtnum;
00659 fi.ndxdz=fMuNdxdz;
00660 fi.ndydz=fMuNdydz;
00661 fi.npz=fMuNpz;
00662 fi.nenergy=fMuNenergy;
00663 fi.ndxdznear=fMuNdxdznear;
00664 fi.ndydznear=fMuNdydznear;
00665 fi.nenergynear=fMuNenergynear;
00666 fi.nwtnear=fMuNwtnear;
00667 fi.ndxdzfar=fMuNdxdzfar;
00668 fi.ndydzfar=fMuNdydzfar;
00669 fi.nenergyfar=fMuNenergyfar;
00670 fi.nwtfar=fMuNwtfar;
00671 fi.norig=fMuNorig;
00672 fi.ndecay=fMuNdecay;
00673 fi.ntype=fMuNtype;
00674 fi.vx=fMuVx;
00675 fi.vy=fMuVy;
00676 fi.vz=fMuVz;
00677 fi.pdpx=fMuPdpx;
00678 fi.pdpy=fMuPdpy;
00679 fi.pdpz=fMuPdpz;
00680 fi.ppdxdz=fMuPpdxdz;
00681 fi.ppdydz=fMuPpdydz;
00682 fi.pppz=fMuPppz;
00683 fi.ppenergy=fMuPpenergy;
00684 fi.ppmedium=fMuPpmedium;
00685 fi.ptype=fMuPtype;
00686 fi.ppvx=fMuPpvx;
00687 fi.ppvy=fMuPpvy;
00688 fi.ppvz=fMuPpvz;
00689 fi.muparpx=fMuMuparpx;
00690 fi.muparpy=fMuMuparpy;
00691 fi.muparpz=fMuMuparpz;
00692 fi.mupare=fMuMupare;
00693 fi.necm=fMuNecm;
00694 fi.nimpwt=fMuNimpwt;
00695 fi.xpoint=fMuXpoint;
00696 fi.ypoint=fMuYpoint;
00697 fi.zpoint=fMuZpoint;
00698 fi.tvx=fMuX;
00699 fi.tvy=fMuY;
00700 fi.tvz=fMuZ;
00701 fi.tpx=fMuPX;
00702 fi.tpy=fMuPY;
00703 fi.tpz=fMuPZ;
00704 fi.tptype=GEANTtoPDG(fPID);
00705 fi.tgen=fMuGen;
00706 }
00707 else {
00708
00709
00710 fi.index=-1;
00711 fi.fluxrun=runnum;
00712 fi.fluxevtno=evtnum;
00713 fi.ndxdz=0.;
00714 fi.ndydz=0.;
00715 fi.npz=0.;
00716 fi.nenergy=0.;
00717 fi.ndxdznear=0.;
00718 fi.ndydznear=0.;
00719 fi.nenergynear=0.;
00720 fi.nwtnear=0.;
00721 fi.ndxdzfar=0.;
00722 fi.ndydzfar=0.;
00723 fi.nenergyfar=0.;
00724 fi.nwtfar=0.;
00725 fi.norig=0;
00726 fi.ndecay=0;
00727 fi.ntype=0;
00728 fi.vx=0.;
00729 fi.vy=0.;
00730 fi.vz=0.;
00731 fi.pdpx=0.;
00732 fi.pdpy=0.;
00733 fi.pdpz=0.;
00734 fi.ppdxdz=0.;
00735 fi.ppdydz=0.;
00736 fi.pppz=0.;
00737 fi.ppenergy=0.;
00738 fi.ppmedium=0;
00739 fi.ptype=0;
00740 fi.ppvx=0.;
00741 fi.ppvy=0.;
00742 fi.ppvz=0.;
00743 fi.muparpx=0.;
00744 fi.muparpy=0.;
00745 fi.muparpz=0.;
00746 fi.mupare=0.;
00747 fi.necm=0.;
00748 fi.nimpwt=0.;
00749 fi.xpoint=0.;
00750 fi.ypoint=0.;
00751 fi.zpoint=0.;
00752 fi.tvx=0.;
00753 fi.tvy=0.;
00754 fi.tvz=0.;
00755 fi.tpx=0.;
00756 fi.tpy=0.;
00757 fi.tpz=0.;
00758 fi.tptype=0;
00759 fi.tgen=0;
00760 }
00761 }
00762 else {
00763
00764
00765 fi.index=-1;
00766 fi.fluxrun=runnum;
00767 fi.fluxevtno=evtnum;
00768 fi.ndxdz=0.;
00769 fi.ndydz=0.;
00770 fi.npz=0.;
00771 fi.nenergy=0.;
00772 fi.ndxdznear=0.;
00773 fi.ndydznear=0.;
00774 fi.nenergynear=0.;
00775 fi.nwtnear=0.;
00776 fi.ndxdzfar=0.;
00777 fi.ndydzfar=0.;
00778 fi.nenergyfar=0.;
00779 fi.nwtfar=0.;
00780 fi.norig=0;
00781 fi.ndecay=0;
00782 fi.ntype=0;
00783 fi.vx=0.;
00784 fi.vy=0.;
00785 fi.vz=0.;
00786 fi.pdpx=0.;
00787 fi.pdpy=0.;
00788 fi.pdpz=0.;
00789 fi.ppdxdz=0.;
00790 fi.ppdydz=0.;
00791 fi.pppz=0.;
00792 fi.ppenergy=0.;
00793 fi.ppmedium=0;
00794 fi.ptype=0;
00795 fi.ppvx=0.;
00796 fi.ppvy=0.;
00797 fi.ppvz=0.;
00798 fi.muparpx=0.;
00799 fi.muparpy=0.;
00800 fi.muparpz=0.;
00801 fi.mupare=0.;
00802 fi.necm=0.;
00803 fi.nimpwt=0.;
00804 fi.xpoint=0.;
00805 fi.ypoint=0.;
00806 fi.zpoint=0.;
00807 fi.tvx=0.;
00808 fi.tvy=0.;
00809 fi.tvz=0.;
00810 fi.tpx=0.;
00811 fi.tpy=0.;
00812 fi.tpz=0.;
00813 fi.tptype=0;
00814 fi.tgen=0;
00815 }
00816 }
00817
00818
00819
00820
00821
00822 #endif