////////////////////////////////////////////////////////////////////////////////////////// // program to run TPythia6 under ROOT for cc/bb analysis // This program runs very slow // ----------------------------------------- // cb: QCD=0, bb =1;cc=2,JPsi=3,DY=4,W=5,Z=6 // ----------------------------------------- // subevt: 1=ele; 2=muon;3=kaon;0=all three // //OUTPUT: // Q_flag: 1=b->x; 2 = c->x; 3 = b->c->x; 4 =b->c->s->x; 6 =s->x ; 0 = from IP // // History: // 01/23/2002 Use cos_70,45,12,35 constants to apply detector acceptance cuts // 10/21/2002 Include more processes for J/Psi produciton // 02/14/2003 set single/dilepton stwitch, single = 0 run all; =1 single lepton only // // 02/28/2003 replaced pythia event loop with with a table; // added "forced particle decay" for pi/kaon in volum z=40cm,r=500cm // 03/05/2003 add primary vertex smearing, dx=dy=0, dz =30cm // 07/02/2003 add DY, W and Z processes ///////////////////////////////////////////////////////////////////////////////////////// void run_QQ(int cb=2, int subevt=0,int EVT=1000, const char *fname="QQ.root") { gROOT->Reset(); hfile = new TFile(fname,"recreate","Heavy qurak analysis"); single= new TNtuple("single","single-particle analysis","etype:q_px:q_py:q_pz:q_id:px:py:pz:E:ptjet:charge:pid:Q_flag:prt_id:prt_px:prt_py:prt_pz:prt_e:prt_m:r:z:vx:vy:vz"); TNtuple * mumu = new TNtuple("mumu","muon-muon correlatoin","etype:px1:py1:pz1:flag1:charge1:pid1:prt_id1:px2:py2:pz2:flag2:charge2:pid2:prt_id2:mass:pt:vx:vy:vz"); TNtuple * mue = new TNtuple("mue","muon-electorn correlatoin","etype:px1:py1:pz1:flag1:charge1:pid1:prt_id1:px2:py2:pz2:flag2:charge2:pid2:prt_id2:mass:pt:vx:vy:vz"); TNtuple * muk = new TNtuple("muk","muon-kaon correlatoin","etype:px1:py1:pz1:flag1:charge1:pid1:prt_id1:px2:py2:pz2:flag2:charge2:pid2:prt_id2:mass:pt:vx:vy:vz"); TNtuple * ee = new TNtuple("ee","ele-ele correlatoin","etype:px1:py1:pz1:flag1:charge1:pid1:prt_id1:px2:py2:pz2:flag2:charge2:pid2:prt_id2:mass:pt:vx:vy:vz"); TNtuple * ek = new TNtuple("ek","ele-kaoon correlatoin","etype:px1:py1:pz1:flag1:charge1:pid1:prt_id1:px2:py2:pz2:flag2:charge2:pid2:prt_id2:mass:pt:vx:vy:vz"); TNtuple * kk = new TNtuple("kk","kaon-kaoon correlatoin","etype:px1:py1:pz1:flag1:charge1:pid1:prt_id1:px2:py2:pz2:flag2:charge2:pid2:prt_id2:mass:pt:vx:vy:vz"); TNtuple * evt_g = new TNtuple("evt_g","Global Properties","x1:x2:pid1:pid2:p_px:p_py:p_pz:p_tot:p_pt:p_m:vx:vy:vz"); TNtuple * evt_q = new TNtuple("evt_q","Global Properties","x1:x2:pid1:pid2:qid1:qid2:q_px1:q_py1:q_pz1:q_m1:q_px2:q_py2:q_pz2:q_m2:vx:vy:vz"); c1 = new TCanvas("c1","Pythia output: muon/e/k info",10,20,600,500); c2 = new TCanvas("c2","Pythia output: parent Q-quark info",100,200,500,400); c3 = new TCanvas("c3","Total # of mu/e/k in QQ events",200,400,500,300); h1 = new TH1F("h1","mu/e/k ptot",100,0,20); h2 = new TH1F("h2","mu/e/k pt",50,0,10); h3 = new TH1F("h3","mu/e/k ID",10,0,5); h4 = new TH1F("h4","parent ID",600,0,600); h5 = new TH1F("h5","mu/e/k Cos_theta",100,-1,1); h6 = new TH1F("h6","Q_flag",10,0,5); h7 = new TH1F("h7","number of mu/e/k",10,-0.5,9.5); h21 = new TH1F("h21","Q(c,b) ptot",50,0,50); h22 = new TH1F("h22","Q(c,b) pt",50,0,10); h23 = new TH1F("h23","Q(c,b) P_ID",100,-25,25); h24 = new TH1F("h24","Q(c,b) Pz",50,-50,50); gSystem.Load("libEG.so"); gSystem.Load("libPythia6.so"); gSystem.Load("libEGPythia6"); TPythia6 pythia; // TPythia pythia; //////////////////////////////////////////////////////////////////////////////////////////////// //define user functions //For a given child-particle line #, returns Original Qaurk's line # parent_Q //and process type Q_flag=1 for b->l-; 2 for c->l+; 3 for b->c->l+; 0 for others /////////////////////////////////////////////////////////////////////////////////////////////// int parent_Q(TPythia6 *pythia, int child, int &Q_flag){ int N_Par,Parent_ID,Parent_KS,Parent_KF,Parent_KF1,origin; int abs_parent, c_flag,b_flag,k_flag; c_flag=0; b_flag=0; k_flag=0; Q_flag=0; N_Par=pythia->GetN(); Parent_ID = pythia->GetK(child,3); // parent line # Parent_KS=pythia->GetK(Parent_ID,1); // status code KS Parent_KF=pythia->GetK(Parent_ID,2); // status code KF Parent_KF1=pythia->GetK(Parent_ID,2); // immed parent origin =pythia->GetK(Parent_ID,3); // grand parent line # abs_parent=TMath::Abs(Parent_KF1); // immed-parent = mesons and baryons //C hadron if ((abs_parent>400&&abs_parent<500)||(abs_parent>4000&&abs_parent<5000)){ c_flag=1; } //B hadron else if((abs_parent>500&&abs_parent<600)||(abs_parent>5000&&abs_parent<6000)){ b_flag=1; } while(origin>2){ // find origin by looping parents Parent_ID = pythia->GetK(Parent_ID,3); // parent line # Parent_KS=pythia->GetK(Parent_ID,1); // status code KS Parent_KF=pythia->GetK(Parent_ID,2); // status code KF origin =pythia->GetK(Parent_ID,3); // grand parent line # abs_parent=abs(Parent_KF); // immed-parent = mesons and baryons if ((abs_parent==4)||(abs_parent>400&&abs_parent<500)||(abs_parent>4000&&abs_parent<5000)){ c_flag=1; } //B hadron else if((abs_parent==5)||(abs_parent>500&&abs_parent<600)||(abs_parent>5000&&abs_parent<6000)){ b_flag=1; } } if (b_flag==1&&c_flag==0){Q_flag=1;} if (b_flag==0&&c_flag==1){Q_flag=2;} if (b_flag==1&&c_flag==1){Q_flag=3;} if (b_flag==0&&c_flag==0){Q_flag=0;} /* cout << "immed_parent = " <SetMDCY(mu_KC,1,1); cout <<"muon MDCY(1) =" << pythia->GetMDCY(mu_KC,1) << endl; pythia->SetMDCY(pi_KC,1,1); cout <<"Pi MDCY(1) =" << pythia->GetMDCY(pi_KC,1) << endl; pythia->SetMDCY(kp_KC,1,1); cout <<"kaon MDCY(1) =" << pythia->GetMDCY(kp_KC,1) << endl; pythia->SetMDCY(ks0_KC,1,1); cout <<"kaon_S0 MDCY(1) =" << pythia->GetMDCY(ks0_KC,1) << endl; pythia->SetMDCY(kl0_KC,1,1); cout <<"kaon_L0 MDCY(1) =" << pythia->GetMDCY(kl0_KC,1) << endl; //check some partricles lifetime cout << "------ Particle Lifetime: (cm) " << endl; cout <<"Muon c*t = " << pythia->GetPMAS(mu_KC,4)/10.0 << endl; cout <<"pi c*t = " << pythia->GetPMAS(pi_KC,4)/10 << endl; cout <<"K+- c*t = " << pythia->GetPMAS(kp_KC,4)/10 << endl; cout <<"K_S0 c*t = " << pythia->GetPMAS(ks0_KC,4)/10 << endl; cout <<"K_L0 c*t = " << pythia->GetPMAS(kl0_KC,4)/10 << endl; cout << "Particle decay volume R (cm) = " << pythia->GetPARJ(73)/10 <SetSeed(1);//default = 65539 //define my own random generator delete gRandom; // gRandom = new TRandom(0); // old one gRandom = new TRandom3(0); // new one, better one, use time as the seed Float_t randx = 0; // gRandom->Rndm(1); randx = gRandom->Rndm(); Int_t Iseed = (int) 1000000*randx; cout << "Iseed = " << Iseed << "\t"; pythia->SetMRPY(1,Iseed); // default=19780503 // cout << "pythia->GetMRPY(1) = " << pythia->GetMRPY(1) << endl; pythia->SetMRPY(2,0); // default=0 for (int i=0;iGenerateEvent(); pythia->ImportParticles(); // pythia->Pytest(0); // test program if (i<3){ cout <<"----- Dump EVT = " << i << endl; // cout << " ---- PYLIST(1) ----" << endl; // pythia->Pylist(1); // dump out all particles cout << " ---- PYLIST(3) ----" << endl; pythia->Pylist(3); // dump out all particles in details // cout << " ---- PYLIST(11) ----" << endl; // pythia->Pylist(11); // dump out all particles } //kinematic analysis N_Par=pythia->GetN(); // number of particles generated in this event // primary vtx position v0x =pythia->GetV(1,1); v0y =pythia->GetV(1,2); v0z =pythia->GetV(1,3); if(i%1000==0){ cout <<"analyzing event " << i ; cout << " \t N_Par =" << N_Par << endl; } n_good =0; n_mu=n_e=n_k=0; //loop all particles in this event for (int j=1; j<=N_Par;j++){ // J starts from 1 //loop only stable and high Energy particles //electron, muon, Kaon P_KS=pythia->GetK(j,1); // status code KS E = pythia->GetP(j,4); //(Px, Py,Pz,E,M) // if (P_KS!=1||E0.5GeV if (E0.5GeV, be careful with pi/kaon decays continue; } //check production vtx position, mainly for decay muons vx =pythia->GetV(j,1); // production position vy =pythia->GetV(j,2); vz =pythia->GetV(j,3); vr=sqrt(vx*vx+vy*vy); px = pythia->GetP(j,1); //(Px, Py,Pz,E,M) py = pythia->GetP(j,2); //(Px, Py,Pz,E,M) pz = pythia->GetP(j,3); //(Px, Py,Pz,E,M) E = pythia->GetP(j,4); //(Px, Py,Pz,E,M) mass = pythia->GetP(j,5); //(Px, Py,Pz,E,M) pt=sqrt(px*px+py*py); ptot = sqrt(px*px+py*py+pz*pz); charge=pythia->GetK(j,2)/abs(pythia->GetK(j,2)); sinx=abs_sinx=1; //apply minimum ptot for ALL particles if (ptot>ptot_cut && pt>0.1){ cosx=TMath::Abs(pz/ptot); sinx=py/pt; abs_cosx=TMath::Abs(pz/ptot); abs_sinx=TMath::Abs(py/pt); } else { continue; } //------- PYTHIA PID---------- // e =11; muon=13;W=24;Z=23;phonton=22,gluon=21 // pi+=211; //---------------------------- x_pid=TMath::Abs(pythia->GetK(j,2)); Is_muon=0; Is_ele =0; Is_kaon=0; Q_flag=0; particle_ID=0; // electron acceptance if(x_pid==11 && pt>pt_cut_e && abs_cosx<=cos_e_max && abs_sinx<=sin_e_max){ // +-20degree cos70=0.3420; sin(45)=0.707 Is_ele=1; particle_ID=1; } //muon acceptance in South arm only if(x_pid==13 && ptot>ptot_cut_m && abs_cosx>cos_theta_max && abs_cosxpt_cut_e && abs_cosx0){ // +-20degree i ntheta; 0-45 in phi->TOF Is_kaon=1; particle_ID=3; } //select subevent type if (subevt==1){ // ele only // Is_ele =0; // run muon only Is_muon=0; // muon only Is_kaon=0; } else if (subevt==2){ // moun only Is_ele =0; // run muon only // Is_muon=0; // muon only Is_kaon=0; } else if (subevt==3){ // kaon only Is_ele =0; // run muon only Is_muon=0; // muon only //Is_kaon=0; } else if (subevt==0){ // keep all particles // Is_ele =0; // run muon only // Is_muon=0; // muon only // Is_kaon=0; } //if any electron/muon/kaon found if (Is_muon||Is_ele||Is_kaon){ // e=11,muons=13,pi+=211,K+=321 //lepton/kaon's immediate parent's information (pi,kaon etc) parentI = pythia->GetK(j,3); // hadron parent particle Line # parentId= pythia->GetK(parentI,2); // parent flavor prt_id = (float) abs(parentId); prt_px = pythia->GetP(parentI,1); //(Px, Py,Pz,E,M) prt_py = pythia->GetP(parentI,2); //(Px, Py,Pz,E,M) prt_pz = pythia->GetP(parentI,3); //(Px, Py,Pz,E,M) prt_e = pythia->GetP(parentI,4); //(Px, Py,Pz,E,M) prt_m = pythia->GetP(parentI,5); //(Px, Py,Pz,E,M) //find lepton/kaon's parent's (primary quark) line #, e.g. b in b->c->l process parentI = parent_Q(&pythia,j,Q_flag); p1_px = pythia->GetP(parentI,1); //(Px, Py,Pz,E,M) p1_py = pythia->GetP(parentI,2); //(Px, Py,Pz,E,M) p1_pz = pythia->GetP(parentI,3); //(Px, Py,Pz,E,M) p1_E = pythia->GetP(parentI,4); //(Px, Py,Pz,E,M) p1_mass = pythia->GetP(parentI,5); //(Px, Py,Pz,E,M) p1_id = pythia->GetK(parentI,2); // parent flavor p1_pt=sqrt(p1_px**2+p1_py**2); p1_ptot=sqrt(p1_pt**2+p1_pz**2); //lepton/kaon's Pt relative the jet axis (parent quark's momentum direction) ptjet=ptot*sqrt(1-(p1_px*px+p1_py*py+p1_pz*pz)/ptot/p1_ptot); //fill varaiables if (n_good<=MAX_N){ varx[n_good][0]=cb; //event type varx[n_good][1]=p1_px; //primary parent(quark or gluon)'s momentum varx[n_good][2]=p1_py; varx[n_good][3]=p1_pz; varx[n_good][4]=px; //lepton/kaon 's momentum varx[n_good][5]=py; varx[n_good][6]=pz; varx[n_good][7]=E; // varx[n_good][8]=ptjet; //lepton's Pt relative to primary parent's flight directino varx[n_good][9]=charge; varx[n_good][10]=particle_ID; // lepton/kaon'd PID - ele=1;muon=2;kaon=3 varx[n_good][11]=Q_flag; // lepton/kaon's weak-decay flavor varx[n_good][12]=prt_id; // lepton/kaon's immed parent particle ID varx[n_good][13]=vr; // production vtx - vr varx[n_good][14]=vz; // production vtz - vz varx[n_good][15]=mass; // } else { cout << "number of leptons and kaons = " << n_good << " exceeds " << MAX_N << " !!! " << endl; } //fill ntuple // single= new TNtuple("single","single-particle analysis","etype:q_px:q_py:q_pz:q_id::px:py:pz:E:ptjet:charge:pid:Q_flag:prt_id:prt_px:prt_py:prt_pz:prt_m:r:z:vx:vy:vz"); vf_s[0]=cb; vf_s[1]=p1_px; vf_s[2]=p1_py; vf_s[3]=p1_pz; vf_s[4]=p1_id; vf_s[5]=px; vf_s[6]=py; vf_s[7]=pz; vf_s[8]=E; vf_s[9]=ptjet; vf_s[10]=charge; vf_s[11]=particle_ID; vf_s[12]=Q_flag; vf_s[13]=prt_id; vf_s[14]=prt_px; vf_s[15]=prt_py; vf_s[16]=prt_pz; vf_s[17]=prt_e; vf_s[18]=prt_m; vf_s[19]=vr; vf_s[20]=vz; vf_s[21]=v0x; vf_s[22]=v0y; vf_s[23]=v0z; single->Fill(vf_s); // single->Fill(cb,p1_px,p1_py,p1_pz,px,py,pz,E,ptjet,charge,particle_ID,Q_flag,prt_id,vr,vz); //lepton/kaon information h1->Fill(ptot); h2->Fill(pt); h3->Fill(particle_ID); h4->Fill(abs(parentId)); // immed parent, may not be the same as the primary parent h5->Fill(cosx); h6->Fill(Q_flag); //primary parent information h21->Fill(p1_ptot); h22->Fill(p1_pt); h23->Fill(p1_id); h24->Fill(p1_pz); n_good++; // number of good ele/muons/kaon in this event }// if muon,ele,kaon } // end of loop event j float mass_xx = 0; float pt12 = 0; float px1,py1,pz1,E1,charge1,m1,flag1; float px2,py2,pz2,E2,charge2,m2,flag2; int pid1,pid2,prt_id1,prt_id2; //two particle correlations if (n_good>0){ // cout << "n_good = " << n_good << endl; for (int ix=0;ix<=n_good;ix++){ px1 = varx[ix][4]; py1 = varx[ix][5]; pz1 = varx[ix][6]; E1 = varx[ix][7]; charge1 = varx[ix][9]; pid1 = (int)varx[ix][10]; flag1 = varx[ix][11]; prt_id1 = (int)varx[ix][12]; m1 = varx[ix][15]; for (int jx=ix+1;jxFill(vf_ll); // mumu->Fill(cb,px1,py1,pz1,flag1,charge1,pid1,px2,py2,pz2,flag2,charge2,pid2,mass_xx,pt12); } else if (pid1==2&&pid2==1||pid1==1&&pid2==2){ // mu-e mue->Fill(vf_ll); // mue->Fill(cb,px1,py1,pz1,flag1,charge1,pid1,px2,py2,pz2,flag2,charge2,pid2,mass_xx,pt12); } else if (pid1==2&&pid2==3||pid1==3&&pid2==2){ // mu-k muk->Fill(vf_ll); // muk->Fill(cb,px1,py1,pz1,flag1,charge1,pid1,px2,py2,pz2,flag2,charge2,pid2,mass_xx,pt12); } else if (pid1==1&&pid2==1||pid1==1&&pid2==1){ // e-e ee->Fill(vf_ll); // ee->Fill(cb,px1,py1,pz1,flag1,charge1,pid1,px2,py2,pz2,flag2,charge2,pid2,mass_xx,pt12); } else if (pid1==1&&pid2==3||pid1==3&&pid2==1){ //e-k ek->Fill(vf_ll); // ek->Fill(cb,px1,py1,pz1,flag1,charge1,pid1,px2,py2,pz2,flag2,charge2,pid2,mass_xx,pt12); } else if (pid1==3&&pid2==3||pid1==3&&pid2==3){ //k-k kk->Fill(vf_ll); // kk->Fill(cb,px1,py1,pz1,flag1,charge1,pid1,px2,py2,pz2,flag2,charge2,pid2,mass_xx,pt12); } else { cout << "ERROR in two particel correlation!!!! \t pid1 =" << pid1 << "pid2 =" << pid2 << endl;} }//loop 2nd particle }//loop 1st paricles } // n_good > 0 ////////////////////////////////////////////////////// // event global porperties // do more detailed analysis if good particle(s) found ////////////////////////////////////////////////////// if(n_good>0){ // if good particle found h7->Fill(n_good); // number of muons/ele/k in this event // this is for J/Psi parent information: gg->J/Psi; qq->J/Psi for (int j=1; j<=20;j++){ // J starts from 1 if((pythia->GetK(j,2)==445)&&(pythia->GetK(j,3)>0)){ // chi_2c ? px = pythia->GetP(j,1); //(Px, Py,Pz,E,M) py = pythia->GetP(j,2); //(Px, Py,Pz,E,M) pz = pythia->GetP(j,3); //(Px, Py,Pz,E,M) E = pythia->GetP(j,4); //(Px, Py,Pz,E,M) mass = pythia->GetP(j,5); //(Px, Py,Pz,E,M) pt=sqrt(px*px+py*py); ptot = sqrt(px*px+py*py+pz*pz); break; } } x1 = pythia->GetP(3,3)/100; //(Px, Py,Pz,E,M) x2 = pythia->GetP(4,3)/100; //(Px, Py,Pz,E,M) pid1=pythia->GetK(3,2); pid2=pythia->GetK(4,2); vf_g[0]=x1; vf_g[1]=x2; vf_g[2]=pid1; vf_g[3]=pid2; vf_g[4]=px; vf_g[5]=py; vf_g[6]=pz; vf_g[7]=ptot; vf_g[8]=pt; vf_g[9]=mass; vf_g[10]=vx; vf_g[11]=vy; vf_g[12]=vz; evt_g->Fill(vf_g); //evt_g->Fill(x1,x2,pid1,pid2,px,py,pz,ptot,pt,mass,vx,vy,vz); //this is for QQ event analysis for (int j=1; j<=20;j++){ // J starts from 1 if((abs(pythia->GetK(j,2))==4||abs(pythia->GetK(j,2))==5)&&(pythia->GetK(j,3)==0)){ // cc or bb events //parton-1 q_px1 = pythia->GetP(j,1); //(Px, Py,Pz,E,M) q_py1 = pythia->GetP(j,2); //(Px, Py,Pz,E,M) q_pz1 = pythia->GetP(j,3); //(Px, Py,Pz,E,M) q_m1 = pythia->GetP(j,5); //(Px, Py,Pz,E,M) qid1 = pythia->GetK(j,2); //parton-2 q_px2 = pythia->GetP(j+1,1); //(Px, Py,Pz,E,M) q_py2 = pythia->GetP(j+1,2); //(Px, Py,Pz,E,M) q_pz2 = pythia->GetP(j+1,3); //(Px, Py,Pz,E,M) q_m2 = pythia->GetP(j+1,5); //(Px, Py,Pz,E,M) qid2 = pythia->GetK(j+1,2); vf_q[0]=x1; vf_q[1]=x2; vf_q[2]=pid1; vf_q[3]=pid2; vf_q[4]=qid1; vf_q[5]=qid2; vf_q[6]=q_px1; vf_q[7]=q_py1; vf_q[8]=q_pz1; vf_q[9]=q_m1; vf_q[10]=q_px2; vf_q[11]=q_py2; vf_q[12]=q_pz2; vf_q[13]=q_m2; vf_q[14]=vx; vf_q[15]=vy; vf_q[16]=vz; evt_q->Fill(vf_q); // evt_q->Fill(x1,x2,pid1,pid2,qid1,qid2,q_px1,q_py1,q_pz1,q_m1,q_px2,q_py2,q_pz2,q_m2,vx,vy,vz); break; } } } // end of global analysis, n_good>0 } // end of event loop cout << "------ PYSTAT (1) --------- " << endl; pythia->Pystat(1); cout << "------ PYSTAT (3) --------- " << endl; pythia->Pystat(3); cout << "------ PYSTAT (4) --------- " << endl; pythia->Pystat(4); cout << "------ PYSTAT (5) --------- " << endl; pythia->Pystat(5); cout << "------ PYSTAT (6) --------- " << endl; pythia->Pystat(6); // draw plots c1.Divide(2,3); c1.cd(1); h1->Draw(); c1.cd(2); h2->Draw(); c1.cd(3); h3->Draw(); c1.cd(4); h4->Draw(); c1.cd(5); h5->Draw(); c1.cd(6); h6->Draw(); //parent c2.Divide(2,2); c2.cd(1); h21->Draw(); c2.cd(2); h22->Draw(); c2.cd(3); h23->Draw(); c2.cd(4); h24->Draw(); c3.cd(); // c3->SetLogy(); h7->Draw(); hfile->Write(); }