1from __future__
import print_function
2from __future__
import division
3import ROOT,time,os,sys,random,getopt,copy
6ROOT.gROOT.LoadMacro(
"$VMCWORKDIR/gconfig/basiclibs.C")
8timer = ROOT.TStopwatch()
17Fntuple=
'Cascade100k-parp16-MSTP82-1-MSEL'+str(mselcb)+
'-ntuple.root'
19print(
"usage: python $FAIRSHIP/macro/makeCascade.py -n (20000) -msel (4) -E (400)")
22 opts, args = getopt.getopt(sys.argv[1:],
"s:t:H:n:E:m:P",[\
23 "msel=",
"seed=",
"beam="])
24except getopt.GetoptError:
26 print(
' enter -n: number of events to produce, default 20000')
27 print(
' -m --msel=4 (5): charm (beauty) production, default charm')
28 print(
' -E --beam=: energy of beam, default 400 GeV')
29 print(
' -t: name of ntuple output file, default: Cascade20k-parp16-MSTP82-1-MSEL"+msel+"-ntuple.root')
30 print(
' -s --seed: random number seed, integer, if not given, current time will be used.')
31 print(
' -P : store all particles produced together with charm')
36 if o
in (
"-E",
"--beam"):
38 if o
in (
"-m",
"--msel"):
42 if o
in (
"-s",
"--seed"):
46print(
'Generate ',nevgen,
' p.o.t. with msel=',mselcb,
' proton beam ',pbeamh,
'GeV')
47print(
'Output ntuples written to: ',Fntuple)
55idbeam=[2212,211,2112,321,130,310]
57print(
'Chi generation with ',nev,
' events/point, nr points=',nrpoints)
58print(
'Cascade beam particle: ',idbeam)
64print(
'Target particles: ',target,
' fraction of protons in Mo=',fracp)
70 idsig=[411, 421, 431,4122,4132,4232,4332,4412,4414,4422,4424,4432,4434,4444]
73 idsig=[511, 521, 531, 541,5122,5132,5142,5232,5242,5332,5342,5412,5414,5422,5424,5432,5434,5442,5444,5512,5514,5522,5524,5532,5534,5542,5544,5554]
75 print(
'Error: msel is unknown',mselcb,
' STOP program')
76 sys.exit(
'ERROR on input, exit')
78PDG = ROOT.TDatabasePDG.Instance()
79myPythia = ROOT.TPythia6()
80tp = ROOT.tPythia6Generator()
83PDG.GetParticle(2212).SetName(
'p+')
84PDG.GetParticle(-2212).SetName(
'pbar-')
85PDG.GetParticle(2112).SetName(
'n0')
86PDG.GetParticle(-2112).SetName(
'nbar0')
87PDG.GetParticle(130).SetName(
'KL0')
88PDG.GetParticle(310).SetName(
'KS0')
96 print(
'********** PoorE791_tune **********')
99 print(
'PARP(91)=',P6.GetPARP(91))
101 print(
'MSTP PDF info, i.e. (51) and (52)=',P6.GetMSTP(51),P6.GetMSTP(52))
105 print(
'And corresponding multiple parton stuff, i.e. MSTP(82),PARP(81,89,90)=',P6.GetMSTP(82),P6.GetPARP(81),P6.GetPARP(89),P6.GetPARP(90))
106 print(
'********** PoorE791_tune **********')
113 print(
'********** LHCb_tune **********')
121 P6.SetMSTP(51, 10042)
125 P6.SetPARP(89, 14000)
126 P6.SetPARP(90, 0.238)
130 P6.SetPARP(149, 0.02)
131 P6.SetPARP(150, 0.085)
134 P6.SetPARJ(13, 0.769)
136 P6.SetPARJ(15, 0.018)
137 P6.SetPARJ(16, 0.0815)
138 P6.SetPARJ(17, 0.0815)
141 print(
'********** LHCb_tune **********')
147 i1=hist.FindBin(pbeaml,0.,0.)
148 y1=hist.GetBinContent(i1)
149 p1=hist.GetBinCenter(i1)
150 for i
in range(i1+1,nb+1):
151 if hist.GetBinContent(i)>0.:
152 y2=hist.GetBinContent(i)
153 p2=hist.GetBinCenter(i)
155 for ib
in range(i1+1,i):
156 px=hist.GetBinCenter(ib)
171myPythia.OpenFortranFile(11, os.devnull)
172myPythia.SetMSTU(11, 11)
176if R ==
'': R = int(time.time()*100000000%900000000)
177print(
'Setting random number seed =',R)
188idhist=len(idbeam)*4*[0]
189print(
'Get chi vs momentum for all beam+target particles')
190for idp
in range(0,len(idbeam)):
192 for idpm
in range(-1,3,2):
194 if PDG.GetParticle(idw)!=
None:
195 name=PDG.GetParticle(idw).GetName()
198 for idnp
in range(2):
200 ut.bookHist(h,str(idb+1),
'sigma vs p, '+name+
'->'+target[idnp],nb,0.5,pbeamh+0.5)
201 ut.bookHist(h,str(idb+2),
'sigma-tot vs p, '+name+
'->'+target[idnp],nb,0.5,pbeamh+0.5)
202 ut.bookHist(h,str(idb+3),
'chi vs p, '+name+
'->'+target[idnp],nb,0.5,pbeamh+0.5)
203 ut.bookHist(h,str(idb+4),
'Prob(normalised), '+name+
'->'+target[idnp],nb,0.5,pbeamh+0.5)
207 for idpn
in range(2):
210 print(name,
'+',target[idpn],
' for chi, seconds:',time.time()-t0)
211 for ipbeam
in range(nrpoints):
212 pbw=ipbeam*(pbeamh-pbeaml)/(nrpoints-1)+pbeaml
214 ibin=h[str(id*10+1+idadd)].FindBin(pbw,0.,0.)
215 pbw=h[str(id*10+1+idadd)].GetBinCenter(ibin)
217 myPythia.SetMSEL(mselcb)
218 myPythia.Initialize(
'FIXT',name,target[idpn],pbw)
219 for iev
in range(nev):
220 myPythia.GenerateEvent()
222 h[str(id*10+1+idadd)].Fill(pbw,tp.getPyint5_XSEC(2,0))
225 myPythia.Initialize(
'FIXT',name,target[idpn],pbw)
226 for iev
in range(nev//10):
228 myPythia.GenerateEvent()
230 h[str(id*10+2+idadd)].Fill(pbw,tp.getPyint5_XSEC(2,0))
232 h[str(id*10+3+idadd)].Divide(h[str(id*10+1+idadd)],h[str(id*10+2+idadd)],1.,1.)
234 fillp1(h[str(id*10+3+idadd)])
238for i
in range(1,id+1):
239 for idpn
in range(2):
241 ibh=h[str(idw)].FindBin(pbeamh)
242 print(
'beam id, momentum,chi,chimx=',i,idw,idhist[i],pbeamh,h[str(idw)].GetBinContent(ibh),chimx)
243 if h[str(idw)].GetBinContent(ibh)>chimx: chimx=h[str(idw)].GetBinContent(ibh)
245for i
in range(1,id+1):
246 for idpn
in range(2):
248 h[str(idw+1)].Add(h[str(idw)],h[str(idw)],chimx,0.)
253ut.bookHist(h,str(1),
'E of signals',100,0.,400.)
254ut.bookHist(h,str(2),
'nr signal per cascade depth',50,0.5,50.5)
255ut.bookHist(h,str(3),
'D0 pt**2',40,0.,4.)
256ut.bookHist(h,str(4),
'D0 pt**2',100,0.,18.)
257ut.bookHist(h,str(5),
'D0 pt',100,0.,10.)
258ut.bookHist(h,str(6),
'D0 XF',100,-1.,1.)
260ftup = ROOT.TFile.Open(Fntuple,
'RECREATE')
261Ntup = ROOT.TNtuple(
"pythia6",
"pythia6 heavy flavour",\
262 "id:px:py:pz:E:M:mid:mpx:mpy:mpz:mE:mM:k:a0:a1:a2:a3:a4:a5:a6:a7:a8:a9:a10:a11:a12:a13:a14:a15:\
263s0:s1:s2:s3:s4:s5:s6:s7:s8:s9:s10:s11:s12:s13:s14:s15")
267 kc = myPythia.Pycomp(kf)
268 myPythia.SetMDCY(kc,1,0)
271 kc = myPythia.Pycomp(kf)
272 myPythia.SetMDCY(kc,1,0)
276for iev
in range(nevgen):
277 if iev%1000==0: print(
'Generate event ',iev)
281 stack[nstack]=[2212,0.,0.,pbeamh,1,100*[0],100*[0]]
282 stack[nstack][5][0]=2212
285 ptot=ROOT.TMath.Sqrt(stack[nstack][1]**2+stack[nstack][2]**2+stack[nstack][3]**2)
287 for i
in range(1,id+1):
289 if stack[nstack][0]==idhist[i]:
292 if random.random>fracp: idpn=1
294 ib=h[str(idw)].FindBin(ptot,0.,0.)
295 prbsig=h[str(idw)].GetBinContent(ib)
296 if prbsig>random.random():
299 myPythia.SetP(1,k,stack[nstack][k])
300 myPythia.SetP(2,k,0.)
302 myPythia.SetMSEL(mselcb)
303 myPythia.Initialize(
'3MOM',PDG.GetParticle(stack[nstack][0]).GetName(),target[idpn],0.)
304 myPythia.GenerateEvent()
307 for itrk
in range(1,myPythia.GetN()+1):
308 idabs = ROOT.TMath.Abs(myPythia.GetK(itrk,2))
312 vl.append(float(myPythia.GetK(itrk,2)))
314 vl.append(float(myPythia.GetP(itrk,i)))
315 vl.append(float(myPythia.GetK(1,2)))
317 vl.append(float(myPythia.GetP(1,i)))
318 vl.append(float(stack[nstack][4]))
320 vl.append(float(stack[nstack][5][i]))
321 nsub=stack[nstack][4]-1
323 for i
in range(nsub):
324 vl.append(float(stack[nstack][6][i]))
325 vl.append(float(myPythia.GetMSTI(1)))
326 for i
in range(nsub+1,16):
329 charmFound.append(itrk)
330 h[
'1'].Fill(myPythia.GetP(itrk,4))
331 h[
'2'].Fill(stack[nstack][4])
332 if idabs==421
and stack[nstack][4]==1 :
334 pt2=myPythia.GetP(itrk,1)**2+myPythia.GetP(itrk,2)**2
337 h[
'5'].Fill(ROOT.TMath.Sqrt(pt2))
339 beta=pbeamh/(myPythia.GetP(1,4)+myPythia.GetP(2,5))
340 gamma=(1-beta**2)**-0.5
341 pbcm=-gamma*beta*myPythia.GetP(1,4)+gamma*myPythia.GetP(1,3)
342 pDcm=-gamma*beta*myPythia.GetP(itrk,4)+gamma*myPythia.GetP(itrk,3)
345 if len(charmFound)>0
and storePrimaries:
346 for itP
in range(1,myPythia.GetN()+1):
347 if itP
in charmFound:
continue
348 if myPythia.GetK(itP,1)==1:
351 Ntup.Fill(float(myPythia.GetK(itP,2)),float(myPythia.GetP(itP,1)),float(myPythia.GetP(itP,2)),float(myPythia.GetP(itP,3)),\
352 float(myPythia.GetP(itP,4)),float(myPythia.GetP(itP,5)),-1,\
353 float(myPythia.GetV(itP,1)-myPythia.GetV(charmFound[0],1)),\
354 float(myPythia.GetV(itP,2)-myPythia.GetV(charmFound[0],2)),\
355 float(myPythia.GetV(itP,3)-myPythia.GetV(charmFound[0],3)),0,0,stack[nstack][4])
359 myPythia.SetP(1,k,stack[nstack][k])
360 myPythia.SetP(2,k,0.)
364 if random.random()>fracp: idpn=1
365 myPythia.Initialize(
'3MOM',PDG.GetParticle(stack[nstack][0]).GetName(),target[idpn],0.)
366 myPythia.GenerateEvent()
369 icas=stack[nstack][4]+1
371 anclist=copy.copy(stack[nstack][5])
372 sublist=copy.copy(stack[nstack][6])
374 if nstack==0: sublist[0]=myPythia.GetMSTI(1)
376 for itrk
in range(1,myPythia.GetN()+1):
377 if myPythia.GetK(itrk,1)==1:
378 ptot=ROOT.TMath.Sqrt(myPythia.GetP(itrk,1)**2+myPythia.GetP(itrk,2)**2+myPythia.GetP(itrk,3)**2)
381 for isig
in range(len(idbeam)):
382 if ROOT.TMath.Abs(myPythia.GetK(itrk,2))==idbeam[isig]
and nstack<999:
383 if nstack<999: nstack+=1
385 tmp=copy.copy(anclist)
386 tmp[icas-1]=myPythia.GetK(itrk,2)
387 stmp=copy.copy(sublist)
389 stmp[icas-1]=myPythia.GetMSTI(1)
390 stack[nstack]=[myPythia.GetK(itrk,2),myPythia.GetP(itrk,1),myPythia.GetP(itrk,2),myPythia.GetP(itrk,3),icas,tmp,stmp]
392print(
'Now at Ntup.Write()')
394for akey
in h: h[akey].Write()
398rtime = timer.RealTime()
399ctime = timer.CpuTime()
401print(
"Macro finished succesfully.")
402print(
"Output file is ", ftup.GetName())
403print(
"Real time ",rtime,
" s, CPU time ",ctime,
"s")