35 #include "TParticlePDG.h"
36 #include "TObjArray.h"
37 #include "TObjString.h"
56 fAnalysis(fAna), fDecay(decay), fGlobParams(params), fNLists(11),
fVerbose(0),
57 fEmin(0.), fPmin(0.), fEcm(Ecm), fESel(0), fPSel(0)
60 int pdgcodes[] = { -11, 11, -13, 13, 211, -211, 321, -321, 2212, -2212, 22};
61 TString pdgnames[] = {
"ElectronPlus",
"ElectronMinus",
"MuonPlus",
"MuonMinus",
"PionPlus",
"PionMinus",
"KaonPlus",
"KaonMinus",
"ProtonPlus",
"ProtonMinus",
"Neutral"};
67 for (
int i=0;
i<11;++
i)
74 SetPid(
"All",
"PidAlgoEmcBayes;PidAlgoDrc;PidAlgoDisc;PidAlgoStt;PidAlgoMdtHardCuts;PidAlgoSciT;PidAlgoRich;PidAlgoFtof");
98 TObjArray *tok = s.Tokenize(delim);
99 int N = tok->GetEntries();
101 for (
int i=0;
i<N;++
i)
103 TString st = ((TObjString*)tok->At(
i))->String();
104 st.ReplaceAll(
"\t",
"");
105 st = st.Strip(TString::kBoth);
106 if (st !=
"") toks.push_back(st);
136 for (
int i=0;
i<ndec;++
i)
140 subdec[
i].ReplaceAll(
"->",
">");
143 if ( dectoks.size()!=2 || !TDatabasePDG::Instance()->GetParticle(dectoks[0]) ) {cout <<
"[PndSimpleCombiner] **** ERROR : Invalid decay pattern '"<<subdec[
i].Data()<<
"'"<<endl;
return false;}
146 TString curstr = dectoks[0]+
" "+dectoks[1];
150 if (dectoks.size()>11) {cout <<
"[PndSimpleCombiner] **** ERROR : Exceeding max number of daughters (10): '"<<subdec[
i].Data()<<
"'"<<endl;
return false;}
161 for (
size_t j=1;j<dectoks.size();++j)
163 if (dectoks[j]==
"nocc") { cc =
false;
continue; }
165 if (!TDatabasePDG::Instance()->GetParticle(dectoks[j])) {cout <<
"[PndSimpleCombiner] **** ERROR : Unknown particle '"<<dectoks[j].Data()<<
"'"<<endl;
return false;}
168 int dpdg = TDatabasePDG::Instance()->GetParticle(dectoks[j])->PdgCode();
170 if (
fPdgIdxMap.find(dpdg) ==
fPdgIdxMap.end() ) {cout <<
"[PndSimpleCombiner] **** ERROR : Undefined list '"<<dectoks[j].Data()<<
"'"<<endl;
return false;}
171 if ( dpdg == info.
mpdg ) {cout <<
"[PndSimpleCombiner] **** ERROR : Invalid recursion in '"<<subdec[
i].Data()<<
"'"<<endl;
return false;}
173 info.
dpdg.push_back(dpdg);
199 for (
size_t j=0;j<info.
dpdg.size();++j)
202 if (apdg==-999999 ||
fPdgIdxMap.find(apdg) ==
fPdgIdxMap.end() ) {cout <<
"[PndSimpleCombiner] **** ERROR : No list for PDG code "<<apdg<<endl;
return false;}
203 ainfo.
dpdg.push_back(apdg);
213 for (
size_t j=0;j<info.
dpdg.size();++j)
216 if (apdg==-999999 ||
fPdgIdxMap.find(apdg) ==
fPdgIdxMap.end() ) {cout <<
"[PndSimpleCombiner] **** ERROR : No list for PDG code "<<apdg<<endl;
return false;}
234 for (
size_t i=0;
i<parm.size();++
i)
236 if (parm[
i]==
"ebrem")
246 if (pair.size()!=2) {cout <<
"[PndSimpleCombiner] **** WARNING : Invalid parameter setting '"<<parm[
i]<<
"' ignored"<<endl;
continue;}
255 double window = pair[1].Atof();
263 double mean = TDatabasePDG::Instance()->GetParticle(info.
mpdg)->Mass();
265 if (info.
mpdg/10 == 8888) { mean =
fEcm;}
268 info.
mwinlo = mean - window/2;
269 info.
mwinhi = mean + window/2;
283 else if (pair[0].BeginsWith(
"mwin"))
286 pair[0] = pair[0](5,pair[0].Length()-6);
288 if (!TDatabasePDG::Instance()->GetParticle(pair[0])) {cout <<
"[PndSimpleCombiner] **** WARNING : Unknown particle type '"<<pair[0]<<
"'"<<endl;
continue;}
290 int pdg = TDatabasePDG::Instance()->GetParticle(pair[0])->PdgCode();
291 if (
fPdgIdxMap.find(pdg) ==
fPdgIdxMap.end()) {cout <<
"[PndSimpleCombiner] **** WARNING : Unknown particle list '"<<pair[0]<<
"'"<<endl;
continue;}
294 double mean = TDatabasePDG::Instance()->GetParticle(pdg)->Mass(), window = 0;
295 if (pdg/10 == 8888) { mean =
fEcm; }
298 if (pair[1].Contains(
"|"))
300 double lower =
TString((pair[1])(0,pair[1].Index(
"|"))).Atof();
301 double upper =
TString((pair[1])(pair[1].Index(
"|")+1,1000)).Atof();
303 mean = (upper+lower)/2.;
304 window = upper-lower;
306 if (mean<0 || window <=0) {cout <<
"[PndSimpleCombiner] **** WARNING : Invalid mass window defintion '"<<parm[
i]<<
"'"<<endl;
continue;}
308 else window = pair[1].Atof();
314 if (abs(info.
mpdg) == abs(pdg))
318 info.
mwinlo = mean - window/2;
319 info.
mwinhi = mean + window/2;
335 if (pair[0] ==
"pid")
SetPid(pair[1]);
343 if (pair[0] ==
"algo")
SetPid(
"",pair[1]);
346 if (pair[0] ==
"algomu")
SetPidMuon(
"",pair[1]);
347 if (pair[0] ==
"algopi")
SetPidPion(
"",pair[1]);
348 if (pair[0] ==
"algok")
SetPidKaon(
"",pair[1]);
413 bool filled[11] = {0};
416 for (
int i=0;
i<
n;++
i)
420 for (
int j=0;j<info.
ndaug;++j)
422 int lidx = info.
didx[j];
424 if (lidx>10 || filled[lidx])
continue;
437 filled[laidx] =
true;
459 int sum=0, nminus=0, nplus=0;
461 for (
size_t i=0;
i<vpdg.size();++
i)
466 if (vpdg[i]>0) nplus++;
470 return (sum==0 && nplus==nminus);
477 if (TDatabasePDG::Instance()->GetParticle(pdg))
479 if (!TDatabasePDG::Instance()->GetParticle(pdg)->AntiParticle())
return pdg;
480 else return TDatabasePDG::Instance()->GetParticle(pdg)->AntiParticle()->PdgCode();
490 cout <<
"\n------------------------------------------"<<endl<<
"[PndSimpleCombiner] **** Configuration"<<endl<<
"------------------------------------------"<<endl;
492 cout <<
"E_cm = "<<
fEcm<<endl<<endl;
493 cout <<
"Neutrals E_min = "<<
fEmin<<endl;
494 cout <<
"Charged p_min = "<<
fPmin<<endl<<endl;
499 for (
int i=0;
i<
n;++
i)
502 cout <<
"Decay "<<
i<<
" : " << TDatabasePDG::Instance()->GetParticle(info.
mpdg)->GetName()<<
"("<<info.
mpdg<<
"/"<<info.
midx<<
") -> ";
503 for (
size_t j=0;j<info.
dpdg.size();++j) cout << TDatabasePDG::Instance()->GetParticle(info.
dpdg[j])->GetName()<<
"("<<info.
dpdg[j]<<
"/"<<info.
didx[j]<<
") ";
505 cout <<
" // daucc: "<<info.
daucc;
506 cout <<
" // mass window: ";
507 if (info.
mwin>0) cout <<
" ["<<info.
mwinlo<<
" ; "<<info.
mwinhi<<
"] = "<<info.
mwin<<
" GeV/cē <<endl;
else if (info.mwin<0) cout <<" *** skipped due to missing Ecm setting *** "<<endl;
else cout <<"none"<<endl;
cout <<endl;
}
cout <<endl;
for (int i=0;i<10;++i)
{
printf("%-16s : %s, %s\n",fIdxListNameMap[i].Data(),fIdxPidCritMap[i].Data(),fIdxPidAlgoMap[i].Data());
}
cout <<"\n------------------------------------------\n\n"<<endl;
}
// -------------------------------------------------------------------------
// The central routine doing the combinatorics
// Needs to be called after every PndAnalysis::GetEvent
void PndSimpleCombiner::Combine()
{
// fill list of final state particles
FillGenericLists();
// loop through list definitions and produce composites
int n = fDecayInfoArray.size();
for (int i=0;i<n;++i)
{
SCDecayInfo info = fDecayInfoArray[i];
CombineList(fList[info.midx], info.mpdg, info.didx);
// do we need to add the cc FS?
if (info.daucc)
{
// create index list with cc daughters
std::vector<int> aidx;
for (size_t j=0;j<info.didx.size();++j)
{
int apdg = AntiPdg(info.dpdg[j]);
aidx.push_back(fPdgIdxMap[apdg]);
}
// create temporary list with the cc combinatorics
RhoCandList l;
CombineList(l, info.mpdg, aidx);
// append it to the original list
fList[info.midx].Append(l);
}
// if there is a mass selector connected, apply it
if (info.msel) fList[info.midx].Select(info.msel);
}
}
// -------------------------------------------------------------------------
// create a list based on indices
int PndSimpleCombiner::CombineList(RhoCandList &l, int mpdg, std::vector<int> &idx)
{
l.Cleanup();
int nd = idx.size();
switch (nd)
{
case 2: l.Combine(fList[idx[0]], fList[idx[1]], mpdg); break;
case 3: l.Combine(fList[idx[0]], fList[idx[1]], fList[idx[2]], mpdg); break;
case 4: l.Combine(fList[idx[0]], fList[idx[1]], fList[idx[2]], fList[idx[3]], mpdg); break;
case 5: l.Combine(fList[idx[0]], fList[idx[1]], fList[idx[2]], fList[idx[3]], fList[idx[4]], mpdg); break;
case 6: l.Combine(fList[idx[0]], fList[idx[1]], fList[idx[2]], fList[idx[3]], fList[idx[4]], fList[idx[5]], mpdg); break;
case 7: l.Combine(fList[idx[0]], fList[idx[1]], fList[idx[2]], fList[idx[3]], fList[idx[4]], fList[idx[5]], fList[idx[6]], mpdg); break;
case 8: l.Combine(fList[idx[0]], fList[idx[1]], fList[idx[2]], fList[idx[3]], fList[idx[4]], fList[idx[5]], fList[idx[6]], fList[idx[7]], mpdg); break;
case 9: l.Combine(fList[idx[0]], fList[idx[1]], fList[idx[2]], fList[idx[3]], fList[idx[4]], fList[idx[5]], fList[idx[6]], fList[idx[7]], fList[idx[8]], mpdg); break;
case 10:l.Combine(fList[idx[0]], fList[idx[1]], fList[idx[2]], fList[idx[3]], fList[idx[4]], fList[idx[5]], fList[idx[6]], fList[idx[7]], fList[idx[8]], fList[idx[9]], mpdg); break;
}
return l.GetLength();
}
// -------------------------------------------------------------------------
// access lists by name, pdg or index
bool PndSimpleCombiner::GetList(RhoCandList &l, TString comp)
{
if (!TDatabasePDG::Instance()->GetParticle(comp)) return false;
return GetList(l, TDatabasePDG::Instance()->GetParticle(comp)->PdgCode());
}
// -------------------------------------------------------------------------
bool PndSimpleCombiner::GetList(RhoCandList &l, int pdg)
{
l.Cleanup();
if (fPdgIdxMap.find(pdg) == fPdgIdxMap.end()) return false;
l = fList[fPdgIdxMap[pdg]];
return true;
}
// -------------------------------------------------------------------------
bool PndSimpleCombiner::GetListN(RhoCandList &l, int idx)
{
l.Cleanup();
if (idx>=0 && idx<GetNLists())
{
l = fList[idx+11];
return true;
}
return false;
}
"<<endl;
508 else if (info.
mwin<0) cout <<
" *** skipped due to missing Ecm setting *** "<<endl;
509 else cout <<
"none"<<endl;
513 for (
int i=0;
i<10;++
i)
518 cout <<
"\n------------------------------------------\n\n"<<endl;
531 for (
int i=0;
i<
n;++
i)
540 std::vector<int> aidx;
541 for (
size_t j=0;j<info.
didx.size();++j)
576 case 10:l.
Combine(
fList[idx[0]],
fList[idx[1]],
fList[idx[2]],
fList[idx[3]],
fList[idx[4]],
fList[idx[5]],
fList[idx[6]],
fList[idx[7]],
fList[idx[8]],
fList[idx[9]], mpdg);
break;
587 if (!TDatabasePDG::Instance()->GetParticle(comp))
return false;
589 return GetList(l, TDatabasePDG::Instance()->GetParticle(comp)->PdgCode());
RhoMomentumParticleSelector * fPSel
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
void Append(const RhoCandidate *c)
void SetPidPion(TString crit="", TString algo="")
void SetPidElectron(TString crit="", TString algo="")
std::map< int, TString > fIdxPidAlgoMap
std::map< int, TString > fIdxPidCritMap
void SetPidProton(TString crit="", TString algo="")
std::vector< SCDecayInfo > fDecayInfoArray
Bool_t FillList(RhoCandList &l, TString listkey="All", TString pidTcaNames="", int trackHypothesis=-1)
bool GetListN(RhoCandList &l, int idx)
std::map< int, int > fIdxPdgMap
RhoCandList fList[MAXLISTS]
std::map< int, int > fPdgIdxMap
int SplitString(TString s, TString delim, StringList &toks)
void Combine(RhoCandList &l1, RhoCandList &l2)
int CombineList(RhoCandList &l, int mpdg, std::vector< int > &idx)
PndSimpleCombiner(PndAnalysis *fAna, TString decay, TString params="", double Ecm=0)
std::vector< TString > StringList
bool ParseDecay(TString decay)
void Select(RhoParticleSelectorBase *pidmgr)
void InitDecayInfo(SCDecayInfo &info, int pdg, int idx)
RhoEnergyParticleSelector * fESel
bool CCInvariant(std::vector< int > &vpdg)
void SetPidMuon(TString crit="", TString algo="")
RhoMassParticleSelector * msel
bool GetList(RhoCandList &l, TString comp)
void SetPidKaon(TString crit="", TString algo="")
void SetPid(TString crit="", TString algo="")
std::map< int, TString > fIdxListNameMap
bool ParseParams(TString params)