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 makeIni4Vector(TLorentzVector &l, double s)
void init(double pideff, double misid)
void printCand(SimpleCand c)
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
friend F32vec4 cos(const F32vec4 &a)
double SumNeutEminLab(double emin)
void SetP4(TLorentzVector lv)
double NeutESumLab() const 
double NeutEtSumCms() const 
void makeRecoCands(CandList &mc, CandList &reco, double eff=0.90, double dp=0.05, double dtht=0.001, double dphi=0.001)
void smearMom(SimpleCand &c, double dpr=0.05, double dtht=0.000, double dphi=0.000)
friend F32vec4 sqrt(const F32vec4 &a)
double Legendre(int l, double x)
void select(CandList &in, CandList &out, int chrg=0, int pdg=0, double mass=0.139)
int MultPminLab(double pmin)
std::map< int, int > pdgidx
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
void SetMcPid(bool mct=true)
void makePidSelection(CandList &l)
double eps(TVector3 v1, TVector3 v2)
std::vector< SimpleCand > CandList
double SumNeutEminCms(double emin)
void SetMarker(unsigned int i)
void boostList(CandList &list, CandList &boostlist, TVector3 boost)
void 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 NeutEtSumLab() const 
void SetMct(bool mct=true)
TString pt(TString pts, TString exts="px py pz")
TString m2(TString pts, TString exts="e px py pz")
void printList(CandList &l, TString tit="")
double SumChrgPminLab(double pmin)
void SetMass(double mass)
double NeutESumCms() const 
double compThrust(CandList &list, TVector3 &axis)
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
int MultPminCms(double pmin)
TLorentzVector P4() const 
int combine(CandList &l1, CandList &l2, CandList &out, int matchPdg=0)
friend F32vec4 fabs(const F32vec4 &a)
bool isDetected(double eff=0.90)
double compSphericity(CandList &list)
double ChrgPSumCms() const 
void selectMass(CandList &in, CandList &out, double mmean=0, double mw=0)
void compFoxWolfMoms(CandList &list)
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)
double FoxWolfMomR(int order)
void makePidTable(double pideff, double misid)
double dponline(TLorentzVector &v)
double SumChrgPminCms(double pmin)
double ChrgPSumLab() const 
void SetMotherIdx(int idx)
int massCrit(CandList &l, double m, double w)
double ChrgPtSumLab() const 
std::vector< SimpleCand > CandList
void SetDau(int n, int m=0)
TMatrixT< double > TMatrixD
double _foxwolfR[_nfwmom]
double SumPtminLab(double ptmin)