////////////////////////////////////////////////////////////////////////////////////////// // 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_cc(int cb=2, int subevt=0,int EVT=100000, const char *fname="CC.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 = " <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;jx