9 #include "TDatabasePDG.h"
10 #include "TParticlePDG.h"
15 #include "TParticle.h"
16 #include "TClonesArray.h"
24 #include "TMatrixDEigen.h"
44 const double fdE = 0.03;
144 CandList eplus,
eminus,
muplus,
muminus,
piplus,
piminus,
kplus,
kminus,
pplus,
pminus,
gam;
152 for (
unsigned int i=0;
i<N;
i++)
155 TLorentzVector lv(c.
P4());
158 boostlist.push_back(c);
165 double prod = v1.Dot(v2);
166 return prod/
fabs(prod);
181 if (list[i].P4().Vect().Mag()>pmax)
183 n0=list[
i].P4().Vect();
184 pmax=list[
i].P4().Vect().Mag();
189 TVector3 nnew(0,0,0);
196 nnew+=n0*list[j].P4().Vect()>0 ? list[j].P4().Vect() : -list[j].P4().Vect();
205 thr+=
fabs(axis.Dot(list[i].P4().Vect()));
206 sum+=list[
i].P4().Vect().Mag();
214 assert(
fabs(x) <= 1.);
223 for(
int ll=2; ll<=l; ll++)
225 double pll = (x * (2 * ll - 1) * pmmp1 - (ll - 1) * pmm) / (ll);
240 double _sumarray[
_nfwmom]={0,0,0,0};
243 for (i=0; i<n-1; ++
i)
246 TVector3
p1(list[i].P4().Vect());
247 double pmag1 = p1.Mag();
251 for (j=i+1; j<
n; ++j)
254 TVector3
p2(list[j].P4().Vect());
255 double pmag2 = p2.Mag();
258 double cosPhi =
cos ( p1.Angle(p2) );
263 _sumarray[l] += 2 * pmag1 * pmag2 *
Legendre( l, cosPhi );
268 _sumarray[l] += pmag1 * pmag1 *
Legendre( l, 1. );
271 s += list[
i].P4().Energy();
287 double stot=0, sxx=0, sxy=0, sxz=0, syy=0, syz=0, szz=0;
292 TVector3
v(list[i].P4().Vect());
294 sxx += v.X()*v.X(); sxy += v.X()*v.Y(); sxz += v.X()*v.Z();
295 syy += v.Y()*v.Y(); syz += v.Y()*v.Z();
302 sm(0,0) = sxx/stot; sm(0,1) = sxy/stot; sm(0,2) = sxz/stot;
303 sm(1,0) = sxy/stot; sm(1,1) = syy/stot; sm(1,2) = syz/stot;
304 sm(2,0) = sxz/stot; sm(2,1) = syz/stot; sm(2,2) = szz/stot;
306 TMatrixDEigen ei(sm);
309 _sph = 1.5 * (eiv(1,1) + eiv(2,2));
310 _apl = 1.5 * eiv(2,2);
311 _pla = eiv(1,1) - eiv(2,2);
320 return (n==11 || n==13 || n==211 || n==321 || n==2212 || n==22);
328 return f_res->Eval(v.Pt())/100.;
334 cout<<
"Using PID table:"<<endl;
336 if (pideff<0 && misid<0)
338 for (
int i=0;
i<5;++
i)
340 for (
int j=0;j<5;++j)
351 if (pideff<0) pideff=0;
352 if (pideff>100) pideff=100;
353 if (misid>100) misid=100;
359 for (
int i=0;
i<5;++
i)
361 for (
int j=0;j<5;++j)
372 void init(
double pideff,
double misid)
382 pdg_db=TDatabasePDG::Instance();
388 mE =
pdg_db->GetParticle(11)->Mass();
391 mK =
pdg_db->GetParticle(321)->Mass();
392 mP =
pdg_db->GetParticle(2212)->Mass();
397 f_res=
new TF1(
"f_res",
"pol2(0)");
398 f_res->SetParameters(2.367,1.3,0.133);
399 f_res->SetRange(0,10);
405 cout <<c.
Id()<<
" pid:"<<c.
Pid()<<
" ("<<c.
P4().X()<<
","<<c.
P4().Y()<<
","<<c.
P4().Z()<<
";"<<c.
P4().T()<<
") ";
408 cout <<
" mcpid:"<<c.
McPid()<<
" mct:"<<c.
Mct()<<endl;
414 if (tit!=
"") cout << tit<<endl;
415 for (
unsigned int j=0;j<l.size();++j)
printCand(l[j]);
447 for (
unsigned int i=0;
i<l.size();++
i)
449 double mass=l[
i].P4().M();
450 if (mass>m-w && mass<m+w) cnt++;
457 int fillHisto(
CandList &l, TH1 *hall, TH1* hbg=0,
double m =0,
double w=0, TH1* hallsel=0, TH1* hbgsel=0, TH1* hsig=0, TH1* hmm=0, TH2* hmvsmm=0)
460 for (
unsigned int i=0;
i<l.size();++
i)
462 double mass = l[
i].P4().M();
463 double miss = (
fIni-l[
i].P4()).M();
467 if (hmm) hmm->Fill(miss);
468 if (hmvsmm) hmvsmm->Fill(mass, miss);
470 bool mct = l[
i].Mct();
471 if (hbg && !mct) hbg->Fill(mass);
472 if (hsig && mct) hsig->Fill(mass);
473 if (mass>
m-w && mass<
m+w)
476 if (hallsel) hallsel->Fill(mass);
477 if (hbgsel && !mct) hbgsel->Fill(mass);
487 bool sameList = (&l1 == &l2);
489 for (
unsigned int i=0;
i<l1.size();++
i)
491 for (
unsigned int j=0;j<l2.size();++j)
493 if (sameList && j<=
i)
continue;
494 if (l1[
i].Marker() & l2[j].Marker())
continue;
497 c.
SetP4(l1[
i].P4()+l2[j].P4());
499 c.
SetNFS(l1[
i].NFS()+l2[j].NFS());
502 int m1 = l1[
i].MotherIdx();
503 int m2 = l2[j].MotherIdx();
504 int ev1 = l1[
i].EvtId();
505 int ev2 = l2[j].EvtId();
509 (l1[
i].McPid()||l1[
i].Mct()) &&
510 (l2[j].McPid()||l2[j].Mct()) &&
512 matchPdg ==
mclist[m1].Pid() )
530 bool same12 = (&l1 == &l2);
531 bool same13 = (&l1 == &l3);
532 bool same23 = (&l2 == &l3);
534 for (
unsigned int i1=0;i1<l1.size();++i1)
536 for (
unsigned int i2=0;i2<l2.size();++i2)
538 if (same12 && i2<i1)
continue;
539 if (l1[i1].Marker() & l2[i2].Marker())
continue;
541 for (
unsigned int i3=0;i3<l3.size();++i3)
543 if ((same13 && i3<i1) || (same23 && i3<i2))
continue;
545 if ( l1[i1].Marker() & l3[i3].Marker() )
continue;
546 if ( l2[i2].Marker() & l3[i3].Marker() )
continue;
553 c.
SetP4( l1[i1].P4() + l2[i2].P4() + l3[i3].P4());
554 c.
SetCharge( l1[i1].Charge() + l2[i2].Charge() + l3[i3].Charge() );
555 c.
SetNFS( l1[i1].NFS() + l2[i2].NFS() + l3[i3].NFS());
556 c.
SetMarker( l1[i1].Marker() | l2[i2].Marker() | l3[i3].Marker() );
558 int m1 = l1[i1].MotherIdx();
559 int m2 = l2[i2].MotherIdx();
560 int m3 = l3[i3].MotherIdx();
562 int ev1 = l1[i1].EvtId();
563 int ev2 = l2[i2].EvtId();
564 int ev3 = l3[i3].EvtId();
566 if ( ev1==ev2 && ev2==ev3 &&
567 m1>=0 && m1 == m2 && m2 == m3 &&
568 (l1[i1].McPid()||l1[i1].Mct()) &&
569 (l2[i2].McPid()||l2[i2].Mct()) &&
570 (l3[i3].McPid()||l3[i3].Mct()) &&
572 matchPdg ==
mclist[m1].Pid() )
590 TLorentzVector p4=c.
P4();
602 while (newp<0) newp = p4.P() +
fRand.Gaus(0.0,dp);
604 p4.SetVectM( p4.Vect().Unit()*newp,
m );
606 double newtht = p4.Theta();
607 if (dtht!=0) newtht +=
fRand.Gaus(0.,dtht);
610 double newphi = p4.Phi();
611 if (dphi!=0) newphi +=
fRand.Gaus(0.,dphi);
621 if (
fRand.Rndm()<eff)
return true;
629 for (
unsigned int i=0;
i<mc.size();
i++)
655 for (
unsigned int i=0;
i<in.size();++
i)
656 if (
fabs(in[
i].P4().M()-mmean)<mw) out.push_back(in[
i]);
665 TParticlePDG *part =
pdg_db->GetParticle(pdg);
669 if (part) mass = part->Mass();
670 if (mass<0) mass = 0.13957;
672 for (
unsigned int i=0;
i<in.size();++
i)
681 if (pdg==0 || pdg==22) out.push_back(c);
687 int selidx =
pdgidx[abs(pdg)];
689 double prob =
pidtab[5*selidx + partidx]/100.;
692 if (
fRand.Rndm()<prob) out.push_back(c);
721 double X = (s*s-2*
mP*
mP)/(2*
mP);
728 double trkeff=100.,
double pideff=95.,
double misid =5.,
double P_mix=0.00 )
741 TFile *
f=
new TFile(fsig,
"READ");
744 cout <<
"File not found:"<<fsig<<endl;
748 bool dpm=fsig.Contains(
"DPM");
749 bool bkg=dpm || fsig.Contains(
"BKG");
750 TString treename = dpm ?
"data" :
"ntp";
751 TTree *
t=(TTree*)f->Get(treename);
755 cout <<
"Tree '"<<treename<<
"' not found in '"<<fsig<<
"'."<<endl;
760 int Nevt = t->GetEntriesFast();
761 if (nev==0) nev = Nevt;
763 double mmean=0, mwsig=0, mwoff=0;
772 if (!bkg) name+=
"sig_mode_";
773 else name+=
"bkg_mode_";
774 name+=
mode; name+=
".root";
776 TFile *ggg=
new TFile(name,
"RECREATE");
780 TString branches =
"sig:mode:npart:nneut:nchrg:ne:nmu:npi:nk:npr:pmax:ptmax:np05:np10:np15:np20:np25:np30:np40:np50:npt05:npt10:npt15:npt20:npt25:npt30:npt40:npt50:sph:apl:pla:thr:sne:scp:";
783 branches +=
"fw1:fw2:fw3:pmaxl:ptmaxl:np05l:np10l:np15l:np20l:np25l:np30l:np40l:np50l:ne10:ne20:nmu10:nmu20:npi10:npi20:nk10:nk20:npr10:npr20:";
786 branches +=
"sumpt:sumptl:sumptc:sumptcl:sumetn:sumetnl:sumpc:sumpcl:sumen:sumenl:cir:fw4:fw5:pmin:ptmin:pminl:prapmax:sumpt05:sumpt10:sumpc05:sumpc10:sumpc05l:sumpc10l:";
789 branches +=
"sumen05:sumen10:sumen05l:sumen10l:npi0:nks0:npi005:nks005:npi010:nks010";
791 TNtuple *ntpev =
new TNtuple(
"ntpev",
"ntpev", branches);
799 TClonesArray* DpmPart=0;
803 DpmPart=
new TClonesArray(
"TParticle",100);
804 t->SetBranchAddress(
"Npart",&nTrk);
805 t->SetBranchAddress(
"Particles", &DpmPart);
809 t->SetBranchAddress(
"nTrk",&nTrk);
810 t->SetBranchAddress(
"Id",Id);
811 t->SetBranchAddress(
"DF",DF);
812 t->SetBranchAddress(
"DL",DL);
813 t->SetBranchAddress(
"px",px);
814 t->SetBranchAddress(
"py",py);
815 t->SetBranchAddress(
"pz",pz);
816 t->SetBranchAddress(
"E",E);
817 t->SetBranchAddress(
"m",m);
827 bool channelselect[6];
828 double channelcount[6];
829 TString channelname[6]={
"J/psi",
"D+-",
"Ds",
"Phi",
"D0",
"Lamc"};
831 for (i=0;i<6;++
i) channelcount[i]=0.;
833 if (
fRand.Rndm()<P_mix) mixevts=2;
839 if (i%5000==0) cout <<
"ev "<<i<<endl;
854 TParticle *
pt=(TParticle*)DpmPart->At(j);
855 Id[j] = pt->GetPdgCode();
856 int pdg = abs(Id[j]);
861 m[j] = pt->GetMass();
870 int pdg = abs(Id[j]);
871 TParticlePDG *
p=
pdg_db->GetParticle(Id[j]);
872 if (p) chrg = p->Charge();
873 if (abs(chrg)>1) chrg/=3;
875 SimpleCand c(px[j], py[j], pz[j], E[j], Id[j], j, chrg);
878 for (k=0;k<j;++k) if (j>=DF[k] && j<=DL[k])
892 if (++currmix<mixevts)
continue;
897 TVector3 boost =
fIni.BoostVector();
963 ntpval[84] = LPi0.size();
964 ntpval[85] = LKs.size();
967 ntpval[38] = evs.
Ptmax();
969 ntpval[71] = evs.
Ptmin();
999 ntpval[11] = evs.
Ptmax();
1063 ntpval[31] = evs.
Thrust();
1074 for (j=0; j<
eplus.size(); ++j)
1076 if (
eplus[j].P4().P()>1.0) ntpval[47]+=1.0;
1077 if (
eplus[j].P4().P()>2.0) ntpval[48]+=1.0;
1079 for (j=0; j<
eminus.size(); ++j)
1081 if (
eminus[j].P4().P()>1.0) ntpval[47]+=1.0;
1082 if (
eminus[j].P4().P()>2.0) ntpval[48]+=1.0;
1086 for (j=0; j<
muplus.size(); ++j)
1088 if (
muplus[j].P4().P()>1.0) ntpval[49]+=1.0;
1089 if (
muplus[j].P4().P()>2.0) ntpval[50]+=1.0;
1091 for (j=0; j<
muminus.size(); ++j)
1093 if (
muminus[j].P4().P()>1.0) ntpval[49]+=1.0;
1094 if (
muminus[j].P4().P()>2.0) ntpval[50]+=1.0;
1098 for (j=0; j<
piplus.size(); ++j)
1100 if (
piplus[j].P4().P()>1.0) ntpval[51]+=1.0;
1101 if (
piplus[j].P4().P()>2.0) ntpval[52]+=1.0;
1103 for (j=0; j<
piminus.size(); ++j)
1105 if (
piminus[j].P4().P()>1.0) ntpval[51]+=1.0;
1106 if (
piminus[j].P4().P()>2.0) ntpval[52]+=1.0;
1110 for (j=0; j<
kplus.size(); ++j)
1112 if (
kplus[j].P4().P()>1.0) ntpval[53]+=1.0;
1113 if (
kplus[j].P4().P()>2.0) ntpval[54]+=1.0;
1115 for (j=0; j<
kminus.size(); ++j)
1117 if (
kminus[j].P4().P()>1.0) ntpval[53]+=1.0;
1118 if (
kminus[j].P4().P()>2.0) ntpval[54]+=1.0;
1122 for (j=0; j<
pplus.size(); ++j)
1124 if (
pplus[j].P4().P()>1.0) ntpval[55]+=1.0;
1125 if (
pplus[j].P4().P()>2.0) ntpval[56]+=1.0;
1127 for (j=0; j<
pminus.size(); ++j)
1129 if (
pminus[j].P4().P()>1.0) ntpval[55]+=1.0;
1130 if (
pminus[j].P4().P()>2.0) ntpval[56]+=1.0;
1134 for (j=0; j<LPi0.size(); ++j)
1136 if (LPi0[j].P4().P()>0.5) ntpval[86]+=1.0;
1137 if (LPi0[j].P4().P()>1.0) ntpval[88]+=1.0;
1140 for (j=0; j<LKs.size(); ++j)
1142 if (LKs[j].P4().P()>0.5) ntpval[87]+=1.0;
1143 if (LKs[j].P4().P()>1.0) ntpval[89]+=1.0;
1152 TLorentzVector lv = cnd.
P4();
1156 TLorentzVector lvcm = cndcms.
P4();
1161 if (lvcm.Pt()>0.5) ntpval[20]+=1.0;
1162 if (lvcm.Pt()>1.0) ntpval[21]+=1.0;
1163 if (lvcm.Pt()>1.5) ntpval[22]+=1.0;
1164 if (lvcm.Pt()>2.0) ntpval[23]+=1.0;
1165 if (lvcm.Pt()>2.5) ntpval[24]+=1.0;
1166 if (lvcm.Pt()>3.0) ntpval[25]+=1.0;
1167 if (lvcm.Pt()>4.0) ntpval[26]+=1.0;
1168 if (lvcm.Pt()>5.0) ntpval[27]+=1.0;
1172 ntpev->Fill(ntpval);
1175 if (
fRand.Rndm()<P_mix) mixevts=2;
double ChrgPtSumCms() const
void select(CandList &in, CandList &out, int chrg=0, int pdg=0, double mass=0.139)
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
void printList(CandList &l, TString tit="")
friend F32vec4 cos(const F32vec4 &a)
double SumNeutEminLab(double emin)
void SetP4(TLorentzVector lv)
double NeutESumLab() const
void makePidSelection(CandList &l)
double NeutEtSumCms() const
friend F32vec4 sqrt(const F32vec4 &a)
int MultPminLab(double pmin)
void printCand(SimpleCand c)
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
void makePidTable(double pideff, double misid)
void makeRecoCands(CandList &mc, CandList &reco, double eff=0.90, double dp=0.05, double dtht=0.001, double dphi=0.001)
void SetMcPid(bool mct=true)
int combine(CandList &l1, CandList &l2, CandList &out, int matchPdg=0)
int fillHisto(CandList &l, TH1 *hall, TH1 *hbg=0, double m=0, double w=0, TH1 *hallsel=0, TH1 *hbgsel=0, TH1 *hsig=0, TH1 *hmm=0, TH2 *hmvsmm=0)
std::vector< SimpleCand > CandList
double SumNeutEminCms(double emin)
std::map< int, int > pdgidx
double dponline(TLorentzVector &v)
double compSphericity(CandList &list)
void SetMarker(unsigned int i)
double NeutEtSumLab() const
void SetMct(bool mct=true)
TString pt(TString pts, TString exts="px py pz")
int massCrit(CandList &l, double m, double w)
TString m2(TString pts, TString exts="e px py pz")
double SumChrgPminLab(double pmin)
double _foxwolfR[_nfwmom]
double compThrust(CandList &list, TVector3 &axis)
void SetMass(double mass)
double eps(TVector3 v1, TVector3 v2)
double NeutESumCms() const
std::vector< SimpleCand > CandList
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
int MultPminCms(double pmin)
TLorentzVector P4() const
friend F32vec4 fabs(const F32vec4 &a)
void smearMom(SimpleCand &c, double dpr=0.05, double dtht=0.000, double dphi=0.000)
void boostList(CandList &list, CandList &boostlist, TVector3 boost)
int softtrigger_kin5(TString fsig, int mode=0, double sqrts=3.77, int nev=1000, bool evcut=false, double dp=0.03, double trkeff=100., double pideff=95., double misid=5., double P_mix=0.00)
double ChrgPSumCms() const
double FoxWolfMomR(int order)
void selectMass(CandList &in, CandList &out, double mmean=0, double mw=0)
double SumChrgPminCms(double pmin)
double ChrgPSumLab() const
void SetMotherIdx(int idx)
bool isDetected(double eff=0.90)
double ChrgPtSumLab() const
void init(double pideff, double misid)
void compFoxWolfMoms(CandList &list)
void SetDau(int n, int m=0)
TMatrixT< double > TMatrixD
void makeIni4Vector(TLorentzVector &l, double s)
double Legendre(int l, double x)
double SumPtminLab(double ptmin)