229 pmom=[5.,10.,15.,20.,25.,50.,75.,100.,150.,200.,250,300.,400.,500.,750.,1000.,1500.,2500.,5000.,7500.,10000.]
230 mutype = {-13:
'gamma/mu+',13:
'gamma/mu-'}
234 h[
'g_'+
str(pid)+t] = ROOT.TGraph()
235 h[
'g_'+
str(pid)+t].SetName(
'g_'+
str(pid)+t)
238 print(
'run pythia6 for ',pid,
' on ',t,
'with p=',P)
241 ut.bookHist(h,
"Qhist"+tag,
"Q;[GeV]", 100, 0., 50.)
242 ut.bookHist(h,
"pTehist"+tag,
"pT of scattered muon;[GeV]", 100, 0., 50.)
243 ut.bookHist(h,
"xhist"+tag,
"x", 100, 0., 1.)
244 ut.bookHist(h,
"yhist"+tag,
"y", 100, 0., 1.)
245 ut.bookHist(h,
"pTrhist"+tag,
"pT of radiated parton; [GeV]", 100, 0., 50.)
246 ut.bookHist(h,
"pTdhist"+tag,
"ratio pT_parton/pT_muon", 100, 0., 5.)
247 ut.bookHist(h,
"nMult"+tag,
"particle multiplicity", 50, -0.5, 49.5)
248 ut.bookHist(h,
"nMultcha"+tag,
"charged particle multiplicity", 50, -0.5, 49.5)
249 ut.bookHist(h,
"nMultneu"+tag,
"neutral particle multiplicity", 50, -0.5, 49.5)
251 myPythia = ROOT.TPythia6()
253 myPythia.SetPARP(2,2)
254 R =
int(time.time()%900000000)
255 myPythia.SetMRPY(1,R)
257 myPythia.SetMSTU(11, 11)
258 myPythia.Initialize(
'FIXT',mutype[pid],t,P)
259 for n
in range(nstat):
260 myPythia.GenerateEvent()
262 for i
in range(1,myPythia.GetN()+1):
263 tmp = ROOT.Pythia8.Vec4(myPythia.GetP(i,1),myPythia.GetP(i,2),myPythia.GetP(i,3),myPythia.GetP(i,4))
264 print(i,myPythia.GetK(i,2),tmp.pAbs())
265 pProton = ROOT.Pythia8.Vec4(myPythia.GetP(2,1),myPythia.GetP(2,2),myPythia.GetP(2,3),myPythia.GetP(2,4))
266 peIn = ROOT.Pythia8.Vec4(myPythia.GetP(1,1),myPythia.GetP(1,2),myPythia.GetP(1,3),myPythia.GetP(1,4))
267 peOut = ROOT.Pythia8.Vec4(myPythia.GetP(3,1),myPythia.GetP(3,2),myPythia.GetP(3,3),myPythia.GetP(3,4))
268 pPhoton = peIn - peOut
270 Q2 = - pPhoton.m2Calc()
271 W2 = (pProton + pPhoton).m2Calc()
272 x = Q2 / (2. * (pProton * pPhoton))
273 y = (pProton * pPhoton) / (pProton * peIn)
274 h[
'Qhist'+tag].Fill( ROOT.TMath.Sqrt(Q2) )
275 h[
'xhist'+tag].Fill( x )
276 h[
'yhist'+tag].Fill( y )
277 h[
'pTehist'+tag].Fill( peOut.pT() )
281 for i
in range(1,myPythia.GetN()+1):
283 pidCode = myPythia.GetK(i,2)
284 ch = myPythia.Pychge(pidCode)
285 if abs( ch )>0 : nMult[1]+=1
286 elif pidCode != 22 : nMult[2]+=1
287 tmp = ROOT.Pythia8.Vec4(myPythia.GetP(i,1),myPythia.GetP(i,2),myPythia.GetP(i,3),myPythia.GetP(i,4))
288 h[
'pTrhist'+tag].Fill( tmp.pT() )
289 h[
'pTdhist'+tag].Fill( tmp.pT() / peOut.pT() )
290 h[
'nMult'+tag].Fill(nMult[0])
291 h[
'nMultcha'+tag].Fill(nMult[1])
292 h[
'nMultneu'+tag].Fill(nMult[2])
299 h[
'g_'+
str(pid)+t].SetPoint(np,P,xsec)
301 fout = ROOT.TFile(
'muDIScrossSec_Pythia6.root',
'RECREATE')
304 h[
'g_'+
str(pid)+t].Write()
307 for x
in [
"nMult"+tag,
"nMultcha"+tag,
"nMultneu"+tag,
"Qhist"+tag,
"pTehist"+tag,
308 "xhist"+tag,
"yhist"+tag,
"pTrhist"+tag,
"pTdhist"+tag]:
334 pmom=[50.,75.,100.,150.,200.,250,300.,400.,500.,750.,1000.,1500.,2500.,5000.,7500.,10000.]
335 mutype = {-13:
'mu+',13:
'mu-'}
340 h[
'g_'+
str(pid)+g] = ROOT.TGraph()
341 h[
'g_'+
str(pid)+g].SetName(
'g_'+
str(pid)+g)
344 generators[g]=ROOT.Pythia8.Pythia()
345 if g==
'p': generators[g].settings.mode(
"Beams:idB", 2212)
346 else: generators[g].settings.mode(
"Beams:idB", 2112)
347 generators[g].settings.mode(
"Next:numberCount",options.heartbeat)
348 generators[g].settings.mode(
"Beams:frameType", 2)
349 generators[g].settings.parm(
"Beams:eA",P)
350 generators[g].settings.mode(
"Beams:idA", pid)
351 generators[g].settings.parm(
"Beams:eB",0.)
352 generators[g].readString(
"PDF:pSet = "+options.PDFpSet)
355 generators[g].readString(
"WeakBosonExchange:ff2ff(t:gmZ) = on")
358 generators[g].readString(
"WeakBosonExchange:ff2ff(t:W) = on")
361 generators[g].settings.parm(
"PhaseSpace:Q2Min", Q2min)
364 generators[g].readString(
"SpaceShower:dipoleRecoil = on")
368 generators[g].readString(
"SpaceShower:pTmaxMatch = 2")
371 generators[g].readString(
"PDF:lepton = off")
372 generators[g].readString(
"TimeShower:QEDshowerByL = off")
377 ut.bookHist(h,
"Qhist"+tag,
"Q;[GeV]", 100, 0., 50.)
378 ut.bookHist(h,
"pTehist"+tag,
"pT of scattered muon;[GeV]", 100, 0., 50.)
379 ut.bookHist(h,
"xhist"+tag,
"x", 100, 0., 1.)
380 ut.bookHist(h,
"yhist"+tag,
"y", 100, 0., 1.)
381 ut.bookHist(h,
"pTrhist"+tag,
"pT of radiated parton; [GeV]", 100, 0., 50.)
382 ut.bookHist(h,
"pTdhist"+tag,
"ratio pT_parton/pT_muon", 100, 0., 5.)
383 ut.bookHist(h,
"nMult"+tag,
"particle multiplicity", 50, -0.5, 49.5)
384 ut.bookHist(h,
"nMultcha"+tag,
"charged particle multiplicity", 50, -0.5, 49.5)
385 ut.bookHist(h,
"nMultneu"+tag,
"neutral particle multiplicity", 50, -0.5, 49.5)
387 for n
in range(nstat):
388 rc = generators[g].next()
390 event = generators[g].event
392 pProton = event[2].p()
395 pPhoton = peIn - peOut
397 Q2 = - pPhoton.m2Calc()
398 W2 = (pProton + pPhoton).m2Calc()
399 x = Q2 / (2. * (pProton * pPhoton))
400 y = (pProton * pPhoton) / (pProton * peIn)
401 h[
'Qhist'+tag].Fill( ROOT.TMath.Sqrt(Q2) )
402 h[
'xhist'+tag].Fill( x )
403 h[
'yhist'+tag].Fill( y )
404 h[
'pTehist'+tag].Fill( event[6].pT() )
407 for i
in range(event.size()):
409 if (event[i].status()>0):
411 if abs( event[i].chargeType() )>0 : nMult[1]+=1
412 elif event[i].id() != 22 : nMult[2]+=1
413 if (event[i].statusAbs() == 43):
414 h[
'pTrhist'+tag].Fill( event[i].pT() )
415 h[
'pTdhist'+tag].Fill( event[i].pT() / event[6].pT() )
416 h[
'nMult'+tag].Fill(nMult[0])
417 h[
'nMultcha'+tag].Fill(nMult[1])
418 h[
'nMultneu'+tag].Fill(nMult[2])
420 xsec = ROOT.fixInfo(generators[g])
421 h[
'g_'+
str(pid)+g].SetPoint(np,P,xsec)
423 fout = ROOT.TFile(
'muDIScrossSec_Pythia8.root',
'RECREATE')
426 h[
'g_'+
str(pid)+g].Write()
429 for x
in [
"nMult"+tag,
"nMultcha"+tag,
"nMultneu"+tag,
"Qhist"+tag,
"pTehist"+tag,
430 "xhist"+tag,
"yhist"+tag,
"pTrhist"+tag,
"pTdhist"+tag]:
450 if withElossFunction:
451 ut.readHists(h,
"meanEloss.root")
452 eLoss = h[
'TCeloss'].FindObject(
'pol3').Clone(
'eLoss')
454 myPythia = ROOT.TPythia6()
456 myPythia.SetPARP(2,2)
457 for kf
in [211,321,130,310,3112,3122,3222,3312,3322,3334]:
458 kc = myPythia.Pycomp(kf)
459 myPythia.SetMDCY(kc,1,0)
460 R =
int(time.time()%900000000)
461 myPythia.SetMRPY(1,R)
462 mutype = {-13:
'gamma/mu+',13:
'gamma/mu-'}
468 run = array(
'i', [0])
469 event = array(
'i', [0])
470 fout = ROOT.TFile(
'muonDis_'+
str(options.run)+
'.root',
'recreate')
471 dTree = ROOT.TTree(
'DIS',
'muon DIS')
472 dTree.Branch(
"run", run,
"run/I")
473 dTree.Branch(
"event", event,
"event/I")
474 iMuon = ROOT.TClonesArray(
"TParticle")
475 iMuonBranch = dTree.Branch(
"InMuon",iMuon,32000,-1)
476 dPart = ROOT.TClonesArray(
"TParticle")
477 dPartBranch = dTree.Branch(
"Particles",dPart,32000,-1)
479 fin = ROOT.TFile(options.muonIn)
480 sTree = fin.Get(
"nt")
481 nTOT = sTree.GetEntries()
482 nEnd = min(nTOT,options.nStart + options.nEvents)
484 myPythia.SetMSTU(11, 11)
485 print(
"start production ",options.nStart,nEnd)
487 for k
in range(options.nStart,nEnd):
488 rc = sTree.GetEvent(k)
489 run[0] =
int(sTree.run)
490 event[0] =
int(sTree.event)
492 px,py,pz = sTree.px,sTree.py,sTree.pz
493 x,y,z = sTree.x,sTree.y,sTree.z-SND_Z
494 pid,w =
int(sTree.id),sTree.w
495 if withElossFunction:
496 E = sTree.E - eLoss.Eval(sTree.E)
499 p = ROOT.TMath.Sqrt(px*px+py*py+pz*pz)
500 Peloss = ROOT.TMath.Sqrt(E*E-muonMass*muonMass)
504 theta = ROOT.TMath.ACos(pz/p)
505 phi = ROOT.TMath.ATan2(py,px)
506 ctheta,stheta = ROOT.TMath.Cos(theta),ROOT.TMath.Sin(theta)
507 cphi,sphi = ROOT.TMath.Cos(phi),ROOT.TMath.Sin(phi)
509 muPart = ROOT.TParticle(pid,0,0,0,0,0,px*escale,py*escale,pz*escale,E,x,y,z,t)
511 myPythia.Initialize(
'FIXT',mutype[pid],nucleon,E)
512 for n
in range(options.nMult):
515 muPart_replica = ROOT.TParticle(muPart)
516 muPart_TCA = iMuon.ConstructedAt(0)
517 ROOT.std.swap(muPart_replica, muPart_TCA)
518 myPythia.GenerateEvent()
521 for itrk
in range(1,myPythia.GetN()+1):
522 did = myPythia.GetK(itrk,2)
523 dpx,dpy,dpz =
rotate(ctheta,stheta,cphi,sphi,myPythia.GetP(itrk,1),myPythia.GetP(itrk,2),myPythia.GetP(itrk,3))
524 psq = dpx**2+dpy**2+dpz**2
526 part = ROOT.TParticle(did,0,0,0,0,0,dpx,dpy,dpz,E,x,y,z,t)
527 part.SetWeight(w/
float(options.nMult))
529 nPart = dPart.GetEntries()
530 if dPart.GetSize() == nPart: dPart.Expand(nPart+10)
531 part_TCA = dPart.ConstructedAt(nPart)
532 ROOT.std.swap(part, part_TCA)
534 if nMade%options.heartbeat==0: print(
'made so far ',options.run,
' :',nMade,time.ctime())
538 myPythia.SetMSTU(11, 6)
539 print(
"finished ",options.run)
653 NinteractionLength = 3
654 fin = ROOT.TFile(
'muDIScrossSec.root')
656 for pid
in [
'13',
'-13']:
657 h[
'g_'+pid] = fin.Get(
'g_'+pid).Clone(
'g_'+pid)
658 ut.bookHist(h,
'inMu_'+
str(pid),
'Energy',200,0.,5000.,20,0.0,19.5)
659 ut.bookHist(h,
'xy_In'+
str(pid),
' x/y muon In',120,-60.,60.,120,-60.,60.)
660 ut.bookCanvas(h,
'sec',
'xsec',900,600,1,1)
661 ut.bookHist(h,
'muDISXsec',
';E [GeV];#sigma [mb]',100,0.,10000.)
663 h[
'muDISXsec'].SetMinimum(0.)
664 h[
'muDISXsec'].SetMaximum(30.E-3)
665 h[
'muDISXsec'].Draw()
666 h[
'muDISXsec'].SetStats(0)
667 h[
'g_13'] .SetLineColor(ROOT.kGreen)
668 h[
'g_13'] .SetLineWidth(4)
669 h[
'g_13'] .Draw(
'same')
670 h[
'g_-13'] .Draw(
'same')
671 h[
'sec'].Print(
'muonXsec.png')
673 h[
'sTree'] = ROOT.TChain(
'DIS')
675 for cycle
in range(options.nMult):
676 for run
in range(1,11):
678 f = ROOT.TFile(
'muonDis_'+
str(run+cycle*100+k)+
'.root')
680 print(
"file corrupted ",run+cycle*100+k)
682 sTree.AddFile(
'muonDis_'+
str(run+cycle*100+k)+
'.root')
683 newFile = ROOT.TFile(
'muonDIS_SND.root',
'RECREATE')
684 newTree = sTree.CloneTree(0)
688 muonEnergy = muon.Energy()
689 pid = muon.GetPdgCode()
690 wLHC = 5.83388*muon.GetWeight()/options.nMult/10.
691 wDis = NinteractionLength * 97.5 / 1.67E-24 * h[
'g_'+
str(pid)].Eval(muonEnergy ) * 1E-27
693 rc = h[
'inMu_'+
str(pid)].Fill(muonEnergy,out.GetEntries(),wLHC*wDis)
696 lam = ( (SND_Z-z_int)-muon.Vz() ) / muon.Pz()
697 mxex = muon.Vx()+lam*muon.Px()
698 myex = muon.Vy()+lam*muon.Py()
700 rc = h[
'xy_In'+
str(muon.GetPdgCode())].Fill(mxex,myex,muon.GetWeight())
701 neutralParticles = []
702 chargedParticles = []
707 hname =
"E_"+
str(pid)
709 ut.bookHist(h,hname,
'Energy',1000,0.,5000.)
710 ut.bookHist(h,
'2dEsnd_'+
str(pid),
'E in SND',1000,0.,5000.,100,0.,5000.)
711 ut.bookHist(h,
'test1_'+
str(pid),
'E in SND',100,0.,5000.)
712 ut.bookHist(h,
'test2_'+
str(pid),
'E in SND',100,0.,5000.)
713 ut.bookHist(h,
'origin_xy'+
str(pid),
'E in SND',100,-100.,100.,100,-100.,100.)
714 ut.bookHist(h,
'2dEsnd_Veto_'+
str(pid),
'E in SND',1000,0.,5000.,100,0.,5000.)
715 ut.bookHist(h,
'Veto_mult_'+
str(pid),
'veto multiplicity',100,0.,100.)
716 ut.bookHist(h,
"xy_"+
str(pid),
'x/y ',120,-60.,60.,120,-60.,60.)
717 rc = h[hname].Fill(E,p.GetWeight())
718 lamP = (SND_Z-z_int)/p.Pz()
719 xex = mxex + lamP*p.Px()
720 yex = myex + lamP*p.Py()
721 rc = h[
"xy_"+
str(pid)].Fill(xex,yex,p.GetWeight())
722 if abs(pid)
in [211,321,13,2212]: chargedParticles.append([pid,E])
729 if -8 > xex
and xex >-49
and 15 < yex
and yex < 57:
730 if pid
in [130,2112,-2112]: neutralParticles.append([pid,E,muonEnergy,wDis*wLHC])
731 rc = h[
"2dEsnd_"+
str(pid)].Fill(E,muonEnergy ,wDis*wLHC)
732 rc = h[
"test1_"+
str(pid)].Fill(muonEnergy ,wLHC)
733 rc = h[
"test2_"+
str(pid)].Fill(muonEnergy)
734 if abs(pid)
in [211,321,13,2212]:
735 if E > 1*u.GeV: veto =
True
737 for x
in neutralParticles:
738 rc = h[
"Veto_mult_"+
str(x[0])].Fill(len(chargedParticles))
739 if len(chargedParticles)>0: rc = h[
'origin_xy'+
str(x[0])].Fill(mxex,myex,x[3])
740 if not veto
and len(neutralParticles)==1:
741 rc = h[
"2dEsnd_Veto_"+
str(x[0])].Fill(x[1],x[2],x[3])
742 if len(neutralParticles)>0: rc = newTree.Fill()
746 ut.bookCanvas(h,
'muDIS_SND2',
'incoming muon energy',1500,900,2,1)
747 c=h[
'muDIS_SND2'].cd(1)
748 hname =
"inMuEsnd_2112"
749 h[hname] = h[
"2dEsnd_2112" ].ProjectionY(hname)
750 ut.makeIntegralDistrib(h,hname)
751 h[
'I-'+hname].SetTitle(
'incoming muon energy;> E [GeV/c];N arbitrary units')
752 h[
'I-'+hname].SetMinimum(1.E-6)
754 h[
'I-'+hname].SetStats(0)
755 h[
'I-'+hname].SetLineWidth(3)
756 h[
'I-'+hname].Draw(
'hist')
757 c=h[
'muDIS_SND2'].cd(2)
758 h[hname].SetTitle(
'incoming muon energy; E [GeV/c];N arbitrary units')
760 h[hname].SetLineWidth(3)
761 h[hname].Draw(
'hist')
762 h[
'muDIS_SND2'].Print(
'inMuEnergy.png')
763 parts = [130,2112,-2112]
765 hname =
"Esnd_"+
str(pid)
766 h[hname] = h[
"2dEsnd_"+
str(pid)].ProjectionX(hname)
767 h[
"Esnd_Veto_"+
str(pid)] = h[
"2dEsnd_Veto_"+
str(pid)].ProjectionX(
"Esnd_Veto_"+
str(pid))
768 ut.makeIntegralDistrib(h,hname)
769 h[
'I-'+hname].GetXaxis().SetRangeUser(0.,1000.)
770 h[
'I-'+hname].SetMinimum(1E-6)
771 ut.makeIntegralDistrib(h,
"Esnd_Veto_"+
str(pid))
772 ut.bookCanvas(h,
'muDIS_SND',
'Kl and neutrons arriving at SND',2500,900,3,1)
773 for k
in range(len(parts)):
776 tc=h[
'muDIS_SND'].cd(k+1)
778 pname = PDG.GetParticle(parts[k]).GetName()
779 hname =
"Esnd_"+
str(parts[k])
780 hnameVeto =
"Esnd_Veto_"+
str(parts[k])
781 for X
in [hname,hnameVeto]:
782 h[
'IFB-'+X] = h[
'I-'+X].Clone(
'IFB-'+X)
783 h[
'IFB-'+X].Scale(150.*fbScale)
784 h[
'IFB-'+X].SetTitle(pname+
';> E [GeV/c];N /150 fb^{-1}')
785 h[
'IFB-'+X]. GetYaxis().SetTitleOffset(1.4)
786 h[
'IFB-'+X].SetMaximum(90*150.)
787 h[
'IFB-'+X].SetStats(0)
788 h[
'IFB-'+X].SetLineWidth(3)
789 h[
'IFB-'+X].SetMinimum(0.1)
790 h[
'IFB-'+hname].Draw(
'hist')
791 h[
'IFB-'+hnameVeto].SetLineColor(ROOT.kRed)
792 h[
'IFB-'+hnameVeto].Draw(
'histsame')
794 histVeto = h[
'I-Esnd_Veto_'+
str(parts[k])]
795 R = hist.GetBinContent(1)
796 RVeto = histVeto.GetBinContent(1)
797 print(
" %s: %5.2F N/sec %5.2F N fb with Veto: %5.2F N fb "%(pname,R,R*fbScale,RVeto*fbScale))
798 R = hist.GetBinContent(3)
799 RVeto = histVeto.GetBinContent(3)
800 print(
"E>10GeV, %s: %5.2F N/sec %5.2F N fb with Veto: %5.2F N fb "%(pname,R,R*fbScale,RVeto*fbScale))
801 R = hist.GetBinContent(21)
802 RVeto= histVeto.GetBinContent(21)
803 print(
"E>100GeV, %s: %5.2E N/sec %5.2F N fb with Veto: %5.2F N fb "%(pname,R,R*fbScale,RVeto*fbScale))
804 R = hist.GetBinContent(41)
805 RVeto= histVeto.GetBinContent(41)
806 print(
"E>200GeV, %s: %5.2E N/sec %5.2F N fb with Veto: %5.2F N fb "%(pname,R,R*fbScale,RVeto*fbScale))
807 R = hist.GetBinContent(101)
808 RVeto = histVeto.GetBinContent(101)
809 print(
"E>500GeV, %s: %5.2E N/sec %5.2F N fb with Veto: %5.2F N fb "%(pname,R,R*fbScale,RVeto*fbScale))
810 h[
'muDIS_SND'].Print(
'muDIS_SND.png')
811 h[
'muDIS_SND'].Print(
'muDIS_SND.pdf')
813 norm = normalization[version]
815 ut.readHists(h,
"efficiency.root")
816 h[
'efficiency'] = h[
'eff'].FindObject(
'eloss_px').Clone(
'efficiency')
818 rc = h[
'efficiency'].Fit(fname,
'S',
'',20,300.)
819 effFun = h[
'efficiency'].GetFunction(fname)
821 ut.readHists(h,
"meanEloss.root")
822 eLoss = h[
'TCeloss'].FindObject(
'pol3').Clone(
'eLoss')
824 fnames = {13:
"unit30_Nm.root",-13:
"unit30_Pm.root"}
825 ut.bookCanvas(h,
'muDIS_SNDXY_1',
'muons',1200,900,1,1)
826 ut.bookCanvas(h,
'muDIS_SNDXY_2',
'muons',1200,900,1,1)
827 ut.bookCanvas(h,
'muDIS_SNDE',
'muons',1200,900,1,1)
829 fin = ROOT.TFile(fnames[mu])
830 ut.bookHist(h,
'xy_'+
str(mu),
'x/y;x [cm];y [cm];N/sec/cm^{2} ' , 200,-100.,100.,200,-100.,100.)
831 ut.bookHist(h,
'xyMS_'+
str(mu),
'x/y;x [cm];y [cm];N/sec/cm^{2} ',200,-100.,100.,200,-100.,100.)
832 ut.bookHist(h,
'xyW_'+
str(mu),
'x/y;x [cm];y [cm];N/sec/cm^{2} ' , 200,-100.,100.,200,-100.,100.)
833 ut.bookHist(h,
'xysco_'+
str(mu),
'x/y;x [cm];y [cm];N/sec/cm^{2} ' , 200,-100.,100.,200,-100.,100.)
834 ut.bookHist(h,
'xyMSW_'+
str(mu),
'x/y;x [cm];y [cm];N/sec/cm^{2} ',200,-100.,100.,200,-100.,100.)
835 ut.bookHist(h,
'Esco_'+
str(mu),
'E in SND',1000,0.,5000.)
836 ut.bookHist(h,
'Esnd_'+
str(mu),
'E in SND',1000,0.,5000.)
837 ut.bookHist(h,
'EsndMS_'+
str(mu),
'E in SND',1000,0.,5000.)
838 ut.bookHist(h,
'Efaser_'+
str(mu),
'E in faser',1000,0.,5000.)
839 ut.bookHist(h,
'EfaserMS_'+
str(mu),
'E in faser',1000,0.,5000.)
840 ut.bookHist(h,
'tanThetaXY_'+
str(mu),
'tan theta X/Y',200,-0.01,0.01,200,-0.01,0.01)
841 ut.bookHist(h,
'tanThetaXY30_'+
str(mu),
'tan theta X/Y',200,-0.01,0.01,200,-0.01,0.01)
842 ut.bookHist(h,
'tanThetaXYSND_'+
str(mu),
'tan theta X/Y',200,-0.01,0.01,200,-0.01,0.01)
843 ut.bookHist(h,
'tanThetaXYMS_'+
str(mu),
'tan theta X/Y',200,-0.01,0.01,200,-0.01,0.01)
844 ut.bookHist(h,
'tanThetaXYMSfaser_'+
str(mu),
'tan theta X/Y',200,-0.01,0.01,200,-0.01,0.01)
845 ut.bookHist(h,
'theta',
'mult scattering angle',200,-1.,1.)
846 for sTree
in fin.Get(
"nt"):
847 px,py,pz = sTree.px,sTree.py,sTree.pz
849 if version == 0: m2cm = 100
850 x,y,z = sTree.x,sTree.y,sTree.z*m2cm
852 pid,w =
int(sTree.id),sTree.w
853 p = ROOT.TMath.Sqrt(px*px+py*py+pz*pz)
855 rc = h[
"Esco_"+
str(mu)].Fill(p,wLHC)
856 rc = h[
'xysco_'+
str(pid)].Fill(x,y,wLHC)
859 if p < effPMax: wLHC=wLHC*effFun.Eval(p)
860 Psnd = p - eLoss.Eval(p)
863 if version == 1: Psnd = p - 26.
868 rc = h[
'xy_'+
str(pid)].Fill(mxex,myex)
869 rc = h[
'xyW_'+
str(pid)].Fill(mxex,myex,wLHC)
870 tanThetaX = ROOT.TMath.Tan(ROOT.TMath.ATan2(px,pz))
871 tanThetaY = ROOT.TMath.Tan(ROOT.TMath.ATan2(py,pz))
872 rc = h[
'tanThetaXY_'+
str(mu)].Fill(tanThetaX,tanThetaY,wLHC)
874 rc = h[
'tanThetaXY30_'+
str(mu)].Fill(tanThetaX,tanThetaY,wLHC)
875 if -8 > mxex
and mxex >-49
and 15 < myex
and myex < 57:
876 rc = h[
"Esnd_"+
str(mu)].Fill(Psnd,wLHC)
877 if -12 < mxex
and mxex < 12
and -12 < myex
and myex < 12:
878 rc = h[
"Efaser_"+
str(mu)].Fill(Psnd,wLHC)
880 for r
in range(Rmult):
884 thetaX = rnr.Gaus(0.,h[
'MS'].Eval(p))
885 thetaY = rnr.Gaus(0.,h[
'MS'].Eval(p))
886 rc = h[
'theta'].Fill(thetaX)
887 rc = h[
'theta'].Fill(thetaY)
888 mxexMS = mxex + (SND_Z-z)*ROOT.TMath.Tan(thetaX)
889 myexMS = myex + (SND_Z-z)*ROOT.TMath.Tan(thetaY)
890 tanThetaX = ROOT.TMath.Tan(ROOT.TMath.ATan2(px,pz)+thetaX)
891 tanThetaY = ROOT.TMath.Tan(ROOT.TMath.ATan2(py,pz)+thetaY)
892 rc = h[
'tanThetaXYSND_'+
str(mu)].Fill(tanThetaX,tanThetaY,wLHC/Rmult)
894 rc = h[
'xyMS_'+
str(pid)].Fill(mxexMS,myexMS)
895 rc = h[
'xyMSW_'+
str(pid)].Fill(mxexMS,myexMS,wLHC/Rmult)
896 if -8 > mxexMS
and mxexMS >-49
and 15 < myexMS
and myexMS < 57:
897 rc = h[
"EsndMS_"+
str(mu)].Fill(Psnd,wLHC/Rmult)
898 if Psnd >0: rc = h[
'tanThetaXYMS_'+
str(mu)].Fill(tanThetaX,tanThetaY,wLHC/Rmult)
899 if -12 < mxexMS
and mxexMS < 12
and -12 < myexMS
and myexMS < 12:
900 rc = h[
"EfaserMS_"+
str(mu)].Fill(Psnd,wLHC/Rmult)
901 if Psnd >0: rc = h[
'tanThetaXYMSfaser_'+
str(mu)].Fill(tanThetaX,tanThetaY,wLHC/Rmult)
902 for hname
in [
"Esco_"+
str(mu),
"Esnd_"+
str(mu),
"EsndMS_"+
str(mu),
"Efaser_"+
str(mu),
"EfaserMS_"+
str(mu)]:
903 if 'I-'+hname
in h: A=h.pop(
'I-'+hname)
905 ut.makeIntegralDistrib(h,hname)
906 h[
'I-'+hname].GetXaxis().SetRangeUser(0.,10000.)
907 h[
'I-'+hname].SetMinimum(1E-6)
908 pname = PDG.GetParticle(mu).GetName()
909 if hname.find(
"Esco")==0:
910 print(
"at scoring plane %s, %s: %5.2F N/sec "%(pname,hname,h[
'I-'+hname].GetBinContent(1)))
912 print(
"at SND dE=-30GeV %s, %s: %5.2F N/sec "%(pname,hname,h[
'I-'+hname].GetBinContent(1)))
913 h[
'snd_1'] = ROOT.TLine(-49,15,-8,15)
914 h[
'snd_2'] = ROOT.TLine(-49,57,-8,57)
915 h[
'snd_3'] = ROOT.TLine(-49,57,-49,15)
916 h[
'snd_4'] = ROOT.TLine(-8,57,-8,15)
917 h[
'fas_1'] = ROOT.TLine(-12,12,12,12)
918 h[
'fas_2'] = ROOT.TLine(-12,-12,12,-12)
919 h[
'fas_3'] = ROOT.TLine(-12,-12,-12,12)
920 h[
'fas_4'] = ROOT.TLine(12,-12,12,12)
922 h[
'snd_'+
str(n)] .SetLineColor(ROOT.kBlack)
923 h[
'snd_'+
str(n)] .SetLineWidth(5)
924 h[
'snd_'+
str(n)] .SetLineStyle(1)
925 h[
'fas_'+
str(n)] .SetLineColor(ROOT.kCyan)
926 h[
'fas_'+
str(n)] .SetLineWidth(5)
927 h[
'fas_'+
str(n)] .SetLineStyle(2)
928 for Y
in [
'xyMSW_',
'xysco_']:
930 h[Y+
str(mu)].SetStats(0)
932 h[Y+
str(mu)].GetXaxis().SetRangeUser(-60.,60.)
933 h[Y+
str(mu)].GetYaxis().SetRangeUser(-60.,60.)
936 h[Y+
str(mu)].GetXaxis().SetRangeUser(-80.,80.)
937 h[Y+
str(mu)].GetYaxis().SetRangeUser(-80.,80.)
938 if mu<0: h[Y+
str(mu)].SetTitle(
"#mu^{+}")
939 if mu>0: h[Y+
str(mu)].SetTitle(
"#mu^{-}")
940 tc = h[
'muDIS_SNDXY_1'].cd()
941 tc.SetRightMargin(0.2)
942 h[Y+
'13'].GetZaxis().SetTitleOffset(1.3)
943 h[Y+
'13'].Draw(
'colz')
945 pal = h[Y+
'13'].GetListOfFunctions()[0]
950 h[
'snd_'+
str(n)].Draw(
'same')
951 if withFaser: h[
'fas_'+
str(n)].Draw(
'same')
952 tc = h[
'muDIS_SNDXY_2'].cd()
953 tc.SetRightMargin(0.2)
954 h[Y+
'-13'].GetZaxis().SetTitleOffset(1.5)
955 h[Y+
'-13'].Draw(
'colz')
957 pal = h[Y+
'-13'].GetListOfFunctions()[0]
962 h[
'snd_'+
str(n)].Draw(
'same')
963 if withFaser: h[
'fas_'+
str(n)].Draw(
'same')
965 myPrint(h[
'muDIS_SNDXY_1'],
'muDIS_SNDXY_muM')
966 myPrint(h[
'muDIS_SNDXY_2'],
'muDIS_SNDXY_muP')
968 myPrint(h[
'muDIS_SNDXY_1'],
'muDIS_SCOXY_muM')
969 myPrint(h[
'muDIS_SNDXY_2'],
'muDIS_SCOXY_muP')
971 R = h[
'I-EsndMS_13'].GetBinContent(1)+h[
'I-EsndMS_-13'].GetBinContent(1)
972 print(
'mu+ and mu- at SND: %5.2F N/sec %5.2F Hz/cm2'%(R,R/(41.*42.)))
973 R = h[
'I-EfaserMS_13'].GetBinContent(1)+h[
'I-EfaserMS_-13'].GetBinContent(1)
974 print(
'mu+ and mu- at Faser: %5.2F N/sec %5.2F Hz/cm2'%(R,R/(24.*24.)))
975 rc = h[
'muDIS_SNDE'].cd(1)
977 h[
'I-Esnd_-13'].SetLineColor(ROOT.kRed)
978 h[
'I-Esnd_13'].SetLineColor(ROOT.kBlue)
979 h[
'I-Esnd_13'].SetFillStyle(2)
980 h[
'I-Esnd_13'].SetStats(0)
981 h[
'I-Esnd_-13'].SetStats(0)
982 h[
'I-Esnd_-13'].SetFillStyle(2)
983 h[
'I-Esnd_13'].SetMinimum(1E-3)
984 h[
'I-Esnd_13'].SetTitle(
';>P [GeV/c]; Hz')
985 h[
'I-Esnd_13'].Draw(
'BAR')
986 h[
'I-Esnd_-13'].Draw(
'sameBAR')
987 h[
't-13' ]=ROOT.TLatex(500,0.1,PDG.GetParticle(-13).GetName())
988 h[
't13' ]=ROOT.TLatex(2500,0.3,PDG.GetParticle(13).GetName())
989 h[
't13' ].SetTextColor(ROOT.kWhite)
990 h[
't13' ].Draw(
'same')
991 h[
't-13'].Draw(
'same')
992 h[
'muDIS_SNDE'].Print(
'muDIS_ESND.png')
1013 norm = normalization[version]
1014 path=
"/mnt/hgfs/microDisk/CERNBOX/SND@LHC/FLUKA/"
1016 if Plimit: pMin = 30.
1018 fnames = {13:path+
"muons_up/version0/unit30_Nm.root",-13:path+
"muons_up/version0/unit30_Pm.root"}
1020 if Plimit: pMin = 27.
1021 fnames = {13:path+
"muons_up/version1/unit30_Nm.root",-13:path+
"muons_up/version1/unit30_Pm.root"}
1023 if Plimit: pMin = 27.
1024 fnames = {13:path+
"muons_down/muons_VCdown_IR1-LHC.root"}
1026 ut.bookCanvas(h,
'TXY',
'muons',1800,650,2,1)
1027 ut.bookCanvas(h,
'TE',
'muons',1800,650,2,1)
1028 ut.bookCanvas(h,
'TW',
'muons',1800,650,2,1)
1031 ut.bookHist(h,
'xySCO_'+
str(mu),
'x/y;x [cm];y [cm];N/sec/cm^{2} ' , 200,-100.,100.,200,-100.,100.)
1032 ut.bookHist(h,
'xySND_'+
str(mu),
'x/y;x [cm];y [cm];N/sec/cm^{2} ' , 200,-100.,100.,200,-100.,100.)
1033 ut.bookHist(h,
'xySNDX_'+
str(mu),
'x/y;x [cm];y [cm];N/sec/cm^{2} ' , 200,-100.,100.,200,-100.,100.)
1034 ut.bookHist(h,
'E_'+
str(mu),
';E [GeV]; N / 5 GeV',1000,0.,5000.)
1035 ut.bookHist(h,
'W_'+
str(mu),
'w',100,0.,0.15)
1037 fin = ROOT.TFile(fnames[mu])
1038 for sTree
in fin.Get(
"nt"):
1040 if version == 0: m2cm = 100.
1041 P = ROOT.TVector3(sTree.px,sTree.py,sTree.pz)
1042 if P.Mag()<pMin:
continue
1043 X = ROOT.TVector3(sTree.x,sTree.y,sTree.z*m2cm)
1044 pid,w =
int(sTree.id),sTree.w
1046 rc = h[
'xySCO_'+
str(pid)].Fill(X[0],X[1],wLHC)
1047 rc = h[
"E_"+
str(pid)].Fill(P.Mag(),wLHC)
1048 rc = h[
'W_'+
str(pid)].Fill(w)
1049 lam = ( SND_Z-X[2])/P[2]
1051 rc = h[
'xySND_'+
str(pid)].Fill(Xex[0],Xex[1],wLHC)
1052 if abs(sTree.x)>50.
or abs(sTree.y)>50.: rc = h[
'xySNDX_'+
str(pid)].Fill(Xex[0],Xex[1],wLHC)
1054 for Y
in [
'xySCO_',
'xySND_',
'xySNDX_']:
1055 if version==0
and Y==
'xySNDX_':
continue
1059 h[Y+
str(mu)].SetStats(0)
1060 h[Y+
str(mu)].SetMaximum(5.)
1061 if mu<0: h[Y+
str(mu)].SetTitle(
"#mu^{+}")
1062 if mu>0: h[Y+
str(mu)].SetTitle(
"#mu^{-}")
1064 tc.SetRightMargin(0.2)
1065 h[Y+
str(mu)].GetZaxis().SetTitleOffset(1.3)
1066 h[Y+
str(mu)].Draw(
'colz')
1068 pal = h[Y+
str(mu)].GetListOfFunctions()[0]
1071 if not Y.find(
'xySND')<0:
1072 for n
in range(1,5):
1073 h[
'snd_'+
str(n)].Draw(
'same')
1074 if withFaser: h[
'fas_'+
str(n)].Draw(
'same')
1075 myPrint(h[
'TXY'],
'FlukaMuons'+Y+
'v'+
str(version))
1081 if mu<0: h[
"E_"+
str(mu)].SetTitle(
"#mu^{+}")
1082 if mu>0: h[
"E_"+
str(mu)].SetTitle(
"#mu^{-}")
1083 h[
"E_"+
str(mu)].SetStats(0)
1084 h[
"E_"+
str(mu)].Draw()
1085 myPrint(h[
'TE'],
'FlukaMuonsE_v'+
str(version))
1091 if mu<0: h[
"W_"+
str(mu)].SetTitle(
"#mu^{+}")
1092 if mu>0: h[
"W_"+
str(mu)].SetTitle(
"#mu^{-}")
1093 h[
"W_"+
str(mu)].SetStats(0)
1094 h[
"W_"+
str(mu)].Draw()
1095 myPrint(h[
'TW'],
'FlukaMuonsW_v'+
str(version))
1097 if not 'stats' in h: h[
'stats'] = {}
1098 h[
'stats'][version] = {}
1099 stats = h[
'stats'][version]
1102 for z
in [
'snd',
'fas']:
1104 for Y
in [
'xySND_',
'xySNDX_']:
1106 xMin = hist.GetXaxis().FindBin(h[z+
'_1'].GetX1())
1107 xMax = hist.GetXaxis().FindBin(h[z+
'_1'].GetX2())
1108 yMin = hist.GetYaxis().FindBin(h[z+
'_1'].GetY1())
1109 yMax = hist.GetYaxis().FindBin(h[z+
'_2'].GetY1())
1114 sqcm = (xMax-xMin)*(yMax-yMin)
1115 stats[mu][z].append(hist.Integral(xMin,xMax,yMin,yMax))
1116 stats[mu][z].append(sqcm)
1117 stats[mu][
'total'] = h[
'xySND_'+
str(mu)].GetSumOfWeights()
1118 stats[mu][
'1x1'] = h[
'xySND_'+
str(mu)].GetSumOfWeights() - h[
'xySNDX_'+
str(mu)].GetSumOfWeights()
1120 print(
"-------- "+PDG.GetParticle(mu).GetName()+
" ----------")
1121 if version==1
and 0
in h[
'stats']:
1122 print(
'increae of rates, total: %5.2F absolute(1x1) %5.2F new/old=%5.2F'%(stats[mu][
'1x1']/stats[mu][
'total'],stats[mu][
'1x1'],stats[mu][
'1x1']/h[
'stats'][0][mu][
'1x1']))
1123 newOvOld = (stats[mu][
'snd'][0] -stats[mu][
'snd'][1])/(h[
'stats'][0][mu][
'snd'][0] -h[
'stats'][0][mu][
'snd'][1])
1124 newOvOldTOT = stats[mu][
'snd'][0]/h[
'stats'][0][mu][
'snd'][0]
1125 print(
'increae of rates, SND: %5.2F absolute(1x1) %5.2F new/old=%5.2F new/old(tot)=%5.2F'%(stats[mu][
'snd'][1]/stats[mu][
'snd'][0],stats[mu][
'snd'][0] -stats[mu][
'snd'][1],newOvOld,newOvOldTOT ))
1126 newOvOld = (stats[mu][
'fas'][0] -stats[mu][
'fas'][1])/(h[
'stats'][0][mu][
'fas'][0] -h[
'stats'][0][mu][
'fas'][1])
1127 newOvOldTOT = stats[mu][
'fas'][0]/h[
'stats'][0][mu][
'fas'][0]
1128 print(
'increae of rates, FAS: %5.2F absolute(1x1) %5.2F new/old=%5.2F new/old(tot)=%5.2F'%(stats[mu][
'fas'][1]/stats[mu][
'fas'][0] ,stats[mu][
'fas'][0] -stats[mu][
'fas'][1],newOvOld,newOvOldTOT ))
1130 print(
'increae of rates, total: %5.2F absolute(1x1) %5.2F'%(h[
'xySNDX_'+
str(mu)].GetSumOfWeights()/h[
'xySND_'+
str(mu)].GetSumOfWeights(),
1131 h[
'xySND_'+
str(mu)].GetSumOfWeights()-h[
'xySNDX_'+
str(mu)].GetSumOfWeights()) )
1132 print(
'increae of rates, SND: %5.2F absolute(1x1) %5.2F'%(stats[mu][
'snd'][1]/stats[mu][
'snd'][0],stats[mu][
'snd'][0] -stats[mu][
'snd'][1] ))
1133 print(
'increae of rates, FAS: %5.2F absolute(1x1) %5.2F'%(stats[mu][
'fas'][1]/stats[mu][
'fas'][0] ,stats[mu][
'fas'][0] -stats[mu][
'fas'][1] ))
1135 if version==1
and 0
in h[
'stats']:
1136 for z
in [
'snd',
'fas']:
1137 sumMu = h[
'stats'][1][13][z][0]+h[
'stats'][1][-13][z][0]
1138 increase = sumMu/(h[
'stats'][0][13][z][0]+h[
'stats'][0][-13][z][0])
1139 print(
'%s: %5.2F /cm2/s increase: %5.2F '%(z,sumMu/h[
'stats'][1][13][z][2],increase))
1185def muondEdX(version=2,njobs=100,path='',withFaser=False, plotOnly=True):
1192 neuPartList = [22,130,310,2112,-2112,3122,-3122,3322,-3322]
1194 norm = normalization[version]
1196 ut.bookHist(h,
'eloss',
'energyLoss', 500,0., 5000.,500,0.,500.)
1197 ut.bookHist(h,
'dx',
'multiple scattering x', 500,0., 5000.,1000,-0.02,0.02)
1198 ut.bookHist(h,
'dy',
'multiple scattering y', 500,0., 5000.,1000,-0.02,0.02)
1199 ut.bookHist(h,
'oE',
'original energy', 500,0.,5000.)
1200 ut.bookHist(h,
'oL',
'flight path', 100,0.,10000.)
1201 ut.bookHist(h,
'3d',
'exit points',200,-100.,100.,200,-100.,100.,600,-500.,100.)
1202 ut.bookHist(h,
'z',
'last z ',1000,-1000.,1000.)
1203 ut.bookHist(h,
'SNDmuP',
'SND entry points',200,-100.,100.,200,-100.,100.)
1204 ut.bookHist(h,
'SNDmuM',
'SND entry points',200,-100.,100.,200,-100.,100.)
1205 ut.bookHist(h,
'SNDmuP_E',
'SND muon enery',200,0.,5000.)
1206 ut.bookHist(h,
'SNDmuM_E',
'SND muon energy',200,0.,5000.)
1207 ut.bookHist(h,
'allmuE_13',
'all muon enery',200,0.,5000.)
1208 ut.bookHist(h,
'allmuE_-13',
'all muon energy',200,0.,5000.)
1209 ut.bookHist(h,
'SNDMuFiltermuP',
'SND entry points',200,-100.,100.,200,-100.,100.)
1210 ut.bookHist(h,
'SNDMuFiltermuM',
'SND entry points',200,-100.,100.,200,-100.,100.)
1211 ut.bookHist(h,
'xy_13',
'x/y;x [cm];y [cm];N/sec/cm^{2} ' , 200,-100.,100.,200,-100.,100.)
1212 ut.bookHist(h,
'xy_-13',
'x/y;x [cm];y [cm];N/sec/cm^{2} ' , 200,-100.,100.,200,-100.,100.)
1214 for p
in neuPartList: ut.bookHist(h,
"E_"+
str(p),
'Energy', 500,0.,5000.)
1216 if version == 3: g = ROOT.TFile(path+
'muGeant4_VCdown_0/geofile_full.conical.Ntuple-TGeant4.root')
1217 elif version == 2: g = ROOT.TFile(path+
'muGeant4_0/geofile_full.conical.Ntuple-TGeant4.root')
1218 else: g = ROOT.TFile(path+
'muMinusGeant4_0/geofile_full.conical.Ntuple-TGeant4.root')
1219 geoManager = g.FAIRGeom
1220 for subjob
in range(njobs):
1221 if version == 3: muons = [path+
'muGeant4_VCdown_'+
str(subjob)+
'/ship.conical.Ntuple-TGeant4.root']
1222 elif version == 2: muons = [path+
'muGeant4_'+
str(subjob)+
'/ship.conical.Ntuple-TGeant4.root']
1223 else: muons = [path+
'muMinusGeant4_'+
str(subjob)+
'/ship.conical.Ntuple-TGeant4.root',path+
'muPlusGeant4_'+
str(subjob)+
'/ship.conical.Ntuple-TGeant4.root']
1225 h[fname] = ROOT.TFile(fname)
1228 for sTree
in h[fname].Get(
"cbmsim"):
1230 muon = sTree.MCTrack[0]
1231 w = norm*muon.GetWeight()
1232 muID = muon.GetPdgCode()
1233 if muon.GetPdgCode()==0:
1234 print(
'something strange here PdgCode=0',fname)
1235 rc = h[
'oE'].Fill(muon.GetEnergy(),w)
1236 for x
in sTree.MCTrack:
1237 pid = x.GetPdgCode()
1238 if pid
in neuPartList: rc = h[
"E_"+
str(pid)].Fill(x.GetEnergy())
1240 for p
in sTree.vetoPoint:
1241 track = p.GetTrackID()
1242 if track < 0:
continue
1243 if track != 0:
continue
1245 if not track
in trajectories: trajectories[track]={}
1246 traj = trajectories[track]
1248 middle = ROOT.TVector3(p.GetX(),p.GetY(),p.GetZ())
1249 first = 2*middle - end
1250 Pin = ROOT.Math.PxPyPzMVector(p.GetPx(),p.GetPy(),p.GetPz(),muonMass)
1251 Pout = ROOT.Math.PxPyPzMVector(p.LastMom()[0],p.LastMom()[1],p.LastMom()[2],muonMass)
1254 if sTree.ScifiPoint.GetEntries()>0
or sTree.MuFilterPoint.GetEntries()>0
and end.z() < -24.5:
1255 print(
'something strange here, pout.z<0',nEv,fname,sTree.ScifiPoint.GetEntries(),sTree.MuFilterPoint.GetEntries())
1258 test = end + 1./Pout.Z()*p.LastMom()
1259 node = geoManager.FindNode(test[0],test[1],test[2])
1260 enterCave = node.GetName() .find(
'Vrock') <0
1261 traj[first[2]]=[first[0],first[1],Pin,
False]
1262 traj[end[2]]=[end[0],end[1],Pout,enterCave]
1263 for track
in trajectories:
1264 traj = trajectories[track]
1265 zPos = list(traj.keys())
1267 T = [ROOT.TGraph(),ROOT.TGraph()]
1271 T[j].SetPoint(k,z,traj[z][j])
1273 xex,yex = T[0].Eval(0),T[1].Eval(0)
1274 if xex==0
and yex==0:
1277 print(nEv,fname,track,traj,zPos)
1278 rc = h[
'xy_'+
str(muID)].Fill(xex,yex,w)
1281 if not traj[z][3]:
continue
1282 oEnergy = muon.GetEnergy()
1285 h[
'allmuE_'+
str(muID)].Fill(P.E())
1287 eloss = muon.GetEnergy() - P.E()
1288 rc = h[
'eloss'].Fill(oEnergy,eloss,w)
1289 start = ROOT.TVector3(sTree.MCTrack[0].GetStartX(),sTree.MCTrack[0].GetStartY(),sTree.MCTrack[0].GetStartZ())
1291 rc = h[
'oL'].Fill(L.Mag(),w)
1293 dAlpha = muon.GetPx()/muon.GetPz() - P.X()/P.Z()
1294 rc = h[
'dx'].Fill(oEnergy,dAlpha)
1295 dAlpha = muon.GetPy()/muon.GetPz()- P.Y()/P.Z()
1296 rc = h[
'dy'].Fill(oEnergy,dAlpha)
1297 rc = h[
'3d'].Fill(traj[z][0],traj[z][1],z,w)
1300 for p
in sTree.ScifiPoint:
1302 omu = p.GetTrackID()
1303 if omu != 0
or abs(p.PdgCode()) != 13:
continue
1305 if p.PdgCode()<0: hname =
'SNDmuP'
1306 rc = h[hname].Fill(p.GetX(),p.GetY(),w)
1307 mom = ROOT.TVector3(p.GetPx(),p.GetPy(),p.GetPz())
1308 rc = h[hname+
'_E'].Fill(mom.Mag(),w)
1312 for p
in sTree.MuFilterPoint:
1314 omu = p.GetTrackID()
1315 if omu != 0
or abs(p.PdgCode()) != 13:
continue
1316 hname =
'SNDMuFiltermuM'
1317 if p.PdgCode()<0: hname =
'SNDMuFiltermuP'
1318 rc = h[hname].Fill(p.GetX(),p.GetY(),w)
1323 for p
in sTree.ScifiPoint:
1324 if abs(p.PdgCode()) != 13:
continue
1325 if p.GetDetectorID()==47:
1330 ut.writeHists(h,
'muondEdX_'+
str(version)+
'.root')
1332 ut.readHists(h,
'muondEdX_'+
str(version)+
'.root')
1334 for det
in [
'SND',
'SNDMuFilter']:
1335 S = h[det+
'muP'].Clone(
'S')
1338 nx,ny = h[hname].GetXaxis().GetNbins(),h[hname].GetYaxis().GetNbins()
1339 projx = S.ProjectionX()
1340 projy = S.ProjectionY()
1341 for ix
in range(1,nx+1):
1342 if projx.GetBinContent(ix)>0:
1343 xmin = projx.GetBinCenter(ix)-projx.GetBinWidth(ix)/2.
1345 for ix
in range(nx,0,-1):
1346 if projx.GetBinContent(ix)>0:
1347 xmax = projx.GetBinCenter(ix)+projx.GetBinWidth(ix)/2.
1349 for iy
in range(1,ny+1):
1350 if projy.GetBinContent(iy)>0:
1351 ymin = projy.GetBinCenter(iy)-projy.GetBinWidth(iy)/2.
1353 for iy
in range(ny,0,-1):
1354 if projy.GetBinContent(iy)>0:
1355 ymax = projy.GetBinCenter(iy)+projy.GetBinWidth(iy)/2.
1357 sqcm = (xmax-xmin)*(ymax-ymin)
1358 muP = h[det+
'muP'].GetSumOfWeights()
1359 muM = h[det+
'muM'].GetSumOfWeights()
1360 print(
"%s square: %5.2F,%5.2F,%5.2F,%5.2F"%(det,xmin,xmax,ymin,ymax))
1361 print(
" mu+ rate = %5.2F Hz %5.2F Hz/cm2"%(muP,muP/sqcm))
1362 print(
" mu- rate = %5.2F Hz %5.2F Hz/cm2"%(muM,muM/sqcm))
1363 print(
" sum rate = %5.2F Hz %5.2F Hz/cm2"%(muM+muP,(muM+muP)/sqcm))
1365 ut.bookCanvas(h,
'TCeloss',
'eloss',900,600,1,1)
1366 tc = h[
'TCeloss'].cd()
1367 h[
'eloss_mean'] = h[
'eloss'].ProfileX(
'mean',1,-1,
'g')
1368 h[
'eloss_mean'].GetXaxis().SetRangeUser(10,5000)
1370 h[
'eloss_mean'].Fit(fname,
'S',
'',20.,5000.)
1372 h[
'eloss_mean'].SetTitle(
'; incoming momentun [GeV/c] ; mean energy loss [GeV]')
1373 h[
'eloss_mean'].Draw(
'hist')
1374 fun = h[
'eloss_mean'].GetFunction(fname)
1377 stats = h[
'eloss_mean'].FindObject(
'stats')
1378 stats.SetOptFit(111)
1383 stats.SetY2NDC(0.75)
1387 ut.bookCanvas(h,
'eff',
'efficiency',900,600,1,1)
1389 eff = h[
'eloss'].ProjectionX()
1392 eff.SetTitle(
"; incoming momentun [GeV/c] ; efficiency")
1393 eff.GetXaxis().SetRangeUser(0.,500.)
1397 ut.bookCanvas(h,
'TCMS',
'multiple scattering',900,600,1,1)
1399 msDx = h[
'dx'].ProfileX(
'msDx',1,-1,
's')
1400 N = msDx.GetNbinsX()
1401 Xmin = msDx.GetBinCenter(1)-msDx.GetBinWidth(1)
1402 Xmax = msDx.GetBinCenter(N)+msDx.GetBinWidth(N)
1403 ut.bookHist(h,
'msDxE',
'msDxE',N,Xmin,Xmax)
1406 for j
in range(1,msDx.GetNbinsX()+1):
1407 tmp = h[
'dy'].ProjectionY(
'tmp',j,j)
1410 if tmp.GetEntries()>20:
1411 rc = tmp.Fit(
'gaus',
'SQL')
1412 fitResult = rc.Get()
1413 rms = fitResult.Parameter(2)
1414 Erms = fitResult.ParError(2)
1415 msDxE.SetBinContent(j,rms)
1416 msDxE.SetBinError(j,Erms)
1417 msDxE.SetTitle(
"; incoming momentun [GeV/c] ; MS angle [rad]")
1418 msDxE.SetMaximum(0.02)
1419 msDxE.SetMinimum(0.0001)
1421 msDxE.GetXaxis().SetRangeUser(0.,1000.)
1423 rc = msDxE.Fit(h[
'MS'],
'S',
'',20.,400.)
1425 stats = msDxE.FindObject(
'stats')
1426 stats.SetOptFit(111)
1427 h[
'MS'].Draw(
'same')
1428 myPrint(h[
'TCMS'],
'multipleScattering_'+
str(version))
1431 ut.bookCanvas(h,
'TXY',
'muons',1800,650,2,1)
1435 hist = h[
'xy_'+
str(mu)]
1438 if mu<0: hist.SetTitle(
"#mu^{+}")
1439 if mu>0: hist.SetTitle(
"#mu^{-}")
1441 tc.SetRightMargin(0.2)
1442 hist.GetZaxis().SetTitleOffset(1.3)
1445 pal = hist.GetListOfFunctions()[0]
1448 for n
in range(1,5):
1449 h[
'snd_'+
str(n)].Draw(
'same')
1450 if withFaser: h[
'fas_'+
str(n)].Draw(
'same')
1451 myPrint(h[
'TXY'],
'Geant4Muonsxy_v'+
str(version))
1457 for z
in [
'snd',
'fas']:
1459 hist = h[
'xy_'+
str(mu)]
1460 xMin = hist.GetXaxis().FindBin(h[z+
'_1'].GetX1())
1461 xMax = hist.GetXaxis().FindBin(h[z+
'_1'].GetX2())
1462 yMin = hist.GetYaxis().FindBin(h[z+
'_1'].GetY1())
1463 yMax = hist.GetYaxis().FindBin(h[z+
'_2'].GetY1())
1468 sqcm = (xMax-xMin)*(yMax-yMin)
1469 stats[mu][z].append(hist.Integral(xMin,xMax,yMin,yMax))
1470 stats[mu][z].append(sqcm)
1471 print(
'%s, %s: total = %5.2F Hz %5.2F Hz/cm2 '%(mu,z,stats[mu][z][0],stats[mu][z][0]/stats[mu][z][1]))
1474 ut.bookCanvas(h,
'Tmuons',
'muons',1600,900,2,1)
1475 fin = ROOT.TFile(
'muDIScrossSec.root')
1477 L = {
'13':
'SNDmuM',
'-13':
'SNDmuP'}
1479 h[
'g_'+pid] = fin.Get(
'g_'+pid).Clone(
'g_'+pid)
1480 hname = L[pid]+
'_inter'
1481 if pid==
'13': h[L[pid]+
'_E'].SetLineColor(ROOT.kRed)
1482 else: h[L[pid]+
'_E'].SetLineColor(ROOT.kBlue)
1483 h[L[pid]+
'_E'].SetTitle(
';E [GeV]; N/s')
1484 h[L[pid]+
'_E'].SetStats(0)
1485 h[hname]=h[L[pid]+
'_E'].Clone(hname)
1486 for k
in range(1,h[hname].GetNbinsX()+1):
1487 muonEnergy = h[L[pid]+
'_E'].GetBinCenter(k)
1488 wDis = 5.9*19.3 / 1.67E-24 * h[
'g_'+
str(pid)].Eval(muonEnergy) * 1E-27
1489 h[hname].SetBinContent(k,wDis*h[L[pid]+
'_E'].GetBinContent(k))
1490 ut.makeIntegralDistrib(h,L[pid]+
'_E')
1491 ut.makeIntegralDistrib(h,hname)
1492 tc = h[
'Tmuons'].cd(1)
1494 h[
'I-SNDmuM_E'].Draw(
'hist')
1495 h[
'I-SNDmuP_E'].Draw(
'histsame')
1496 tc = h[
'Tmuons'].cd(2)
1498 h[
'I-SNDmuM_inter'].Draw(
'hist')
1499 h[
'I-SNDmuP_inter'].Draw(
'histsame')
1501 myPrint(h[
'Tmuons'],
'Geant4MuonE_v'+
str(version))
1571def muonDISfull(cycle = 0, sMin=0,sMax=200,rMin=1,rMax=11,path = '/eos/experiment/ship/user/truf/SND/muonDis/',debug=0,version=1,pythia6=True):
1574 geofile =
'geofile_full.conical.muonDIS-TGeant4.root'
1575 geofileExample =
'run_1_1/'+geofile
1576 datafile =
'ship.conical.muonDIS-TGeant4.root'
1578 muRange = [
'muMinusGeant4',
'muPlusGeant4']
1579 geofile =
'geofile_full.conical.Ntuple-TGeant4.root'
1580 geofileExample =
'muMinusGeant4_0/'+geofile
1581 datafile =
'/ship.conical.Ntuple-TGeant4.root'
1582 if cycle ==100: datafile =
'/ship.conical.Ntuple-TGeant4_boost100.0.root'
1585 norm = normalization[version]
1586 fin = ROOT.TFile(
'muDIScrossSec.root')
1588 for pid
in [
'13',
'-13']:
1589 h[
'g_'+pid] = fin.Get(
'g_'+pid).Clone(
'g_'+pid)
1590 ut.bookHist(h,
'wDIS_'+pid,
'muon DIS probability',100,0.,0.1)
1591 for z
in [
'0',
'inter']:
1592 ut.bookHist(h,
'inMu_'+z+
str(pid),
'muon Energy vs #direct hits',200,0.,5000.,20,0.0,19.5)
1593 ut.bookHist(h,
"xyz_mu_"+z+
str(pid),
'x/y /z',200,-100.,100.,200,-100.,100.,
int(600/redfac3d) ,-500.,100.)
1594 neuPartList = [22,130,310,2112,-2112,3122,-3122,3322,-3322]
1595 ut.bookHist(h,
'fullStats',
'statistics',2000,-0.5,1999.5)
1596 ut.bookHist(h,
'pidsDict',
'pids dictionary',100,-0.5,99.5)
1599 h[
'pidsDict'].SetBinContent(n,x)
1602 for p
in neuPartList:
1603 for o
in [
'',
'_secondary']:
1604 ut.bookHist(h,
'inE_'+
str(p)+o,
'energy',500,0.,5000.,600,-500.,100.)
1605 ut.bookHist(h,
'inE_Concrete_'+
str(p)+o,
'energy',500,0.,5000.,600,-500.,100.)
1606 ut.bookHist(h,
"E_"+
str(p),
'Energy', 500,0.,5000.,200,-30.,170.)
1607 ut.bookHist(h,
"E_veto_"+
str(p),
'Energy', 500,0.,5000.,200,-30.,170.)
1608 ut.bookHist(h,
"E_vetoParticle_"+
str(p),
'Energy', 500,0.,50.,20,-0.5,19.5)
1609 ut.bookHist(h,
"Eprim_"+
str(p),
'Energy', 500,0.,5000.,200,-30.,170.)
1610 ut.bookHist(h,
"Eprim_veto_"+
str(p),
'Energy', 500,0.,5000.,200,-30.,170.)
1611 ut.bookHist(h,
"startZ_"+
str(p),
'z',200,-100.,300.)
1612 ut.bookHist(h,
"xyz_Inter_"+
str(p),
'x/y/z ',200,-100.,100.,200,-100.,100.,
int(400/redfac3d),-100.,100.)
1613 ut.bookHist(h,
"xyzE100_Inter_"+
str(p),
'x/y/z ',200,-100.,100.,200,-100.,100.,
int(400/redfac3d),-100.,100.)
1614 ut.bookHist(h,
"xyzVeto_Inter_"+
str(p),
'x/y/z ',200,-100.,100.,200,-100.,100.,
int(400/redfac3d),-100.,100.)
1615 ut.bookHist(h,
"xyz_muInter_"+
str(p),
'x/y /z',200,-100.,100.,200,-100.,100.,
int(600/redfac3d) ,-500.,100.)
1616 ut.bookHist(h,
"xyz_origin_"+
str(p),
'x/y /z',200,-100.,100.,200,-100.,100.,
int(600/redfac3d) ,-500.,100.)
1617 ut.bookHist(h,
"z_veto_"+
str(p),
'z veto vs z neutral',100,-50.,50.,100,-50.,50.)
1618 ut.bookHist(h,
"xy_z-30_veto_"+
str(p),
'xy at z=-30cm',200,-100.,100.,200,-100.,100.)
1619 ut.bookHist(h,
"xy_z-30_"+
str(p),
'xy at z=-30cm',200,-100.,100.,200,-100.,100.)
1623 if path.find(
'eos')<0: g = ROOT.TFile.Open(path+geofileExample)
1624 else: g = ROOT.TFile.Open(os.environ[
'EOSSHIP']+path+geofileExample)
1625 geoManager = g.FAIRGeom
1626 if path.find(
'eos')<0:
1627 topDir = os.listdir(path)
1629 topDir =
str( subprocess.check_output(
"xrdfs "+os.environ[
'EOSSHIP']+
" ls -l "+path,shell=
True) )
1631 for run
in range(rMin,rMax):
1633 for subjob
in range(sMin,sMax):
1635 if options.Emin==0: prod =
'run_'+
str(run+cycle*100+k)+
'_'+
str(subjob)
1636 else: prod =
"ecut"+
str(options.Emin)+
'_run_'+
str(run+cycle*100+k)+
'_'+
str(subjob)
1638 prod = k+
"_"+
str(subjob)
1639 if path.find(
'eos')<0:
1640 if not prod
in topDir:
1641 print(
'prod not found ',prod)
1643 if not geofile
in os.listdir(path+prod):
1644 print(
'no geofile found ',path+prod)
1647 if not "/"+prod
in topDir:
1648 print(
'prod not found on eos',prod)
1650 temp = subprocess.check_output(
"xrdfs "+os.environ[
'EOSSHIP']+
" ls -l "+path+prod,shell=
True)
1651 if not geofile
in str(temp):
1652 print(
'no geofile found on eos',path+prod)
1654 if pythia6: rc = h[
'fullStats'].Fill(run+cycle*100+k)
1655 if path.find(
'eos')<0: h[
'f'] = ROOT.TFile.Open(path+prod+datafile)
1656 else: h[
'f'] = ROOT.TFile.Open(os.environ[
'EOSSHIP']+path+prod+datafile)
1658 for sTree
in h[
'f'].Get(
"cbmsim"):
1660 if nEv%1000 == 0: print(
'N ',nEv,prod)
1661 muon = sTree.MCTrack[0]
1662 muonEnergy = muon.GetEnergy()
1663 mupid = muon.GetPdgCode()
1664 muInterVx = ROOT.TVector3(muon.GetStartX(),muon.GetStartY(),muon.GetStartZ())
1669 wLHC = norm*muon.GetWeight()/
float(nMult)
1670 wInter = sTree.MCTrack[2].GetWeight()
1672 wDis = wInter / 1.67E-24 * h[
'g_'+
str(mupid)].Eval(muonEnergy ) * 1E-27
1673 rc = h[
'wDIS_'+
str(mupid)].Fill(wDis)
1676 W = norm*muon.GetWeight()
1677 rc = h[
'inMu_0'+
str(mupid)].Fill(muonEnergy,0,W)
1678 rc = h[
'xyz_mu_0'+
str(mupid)].Fill(muon.GetStartX(),muon.GetStartY(),muon.GetStartZ(),W)
1681 for d
in sTree.MCTrack:
1682 motherOf[d] = d.GetMotherId()
1683 daughterOf = dict(zip(motherOf.values(), motherOf.keys()))
1688 for m
in sTree.MCTrack:
1690 Apid = abs(m.GetPdgCode())
1691 if Apid
in neuPartList:
1693 nodeOrigin = geoManager.FindNode(m.GetStartX(),m.GetStartY(),m.GetStartZ())
1694 om = nodeOrigin.GetName()
1695 if not( om==
'VTI18_1' or om==
'Vrock_1' or om==
'cave_1'):
continue
1701 endZ = d.GetStartZ()
1702 nodeInter = geoManager.FindNode(d.GetStartX(),d.GetStartY(),d.GetStartZ())
1703 if nodeInter.GetName()==
'VTI18_1' or nodeInter.GetName()==
'Vrock_1': concrete =
True
1704 if not endZ<999.:
continue
1706 if m.GetProcID()!=0 : origin =
'_secondary'
1707 rc = h[
'inE_'+
str(m.GetPdgCode())+origin].Fill(m.GetEnergy(),endZ,W)
1708 if concrete: rc = h[
'inE_Concrete_'+
str(m.GetPdgCode())+origin].Fill(m.GetEnergy(),endZ,W)
1709 elif debug>2
and m.GetEnergy()>75.
and endZ>-25.
and endZ<25.
and Apid==130 :
1711 print(
'tagged ',h[
'f'].GetName(),nEv,tagged)
1715 nm = nodeInter.GetName()
1716 if nm!=
'VTI18_1' and nm!=
'Vrock_1' and nm!=
'cave_1' and endZ<25:
1718 neutrals[n] = [m.GetProcID(),nm,d.GetStartX(),d.GetStartY(),d.GetStartZ()]
1719 if sTree.ScifiPoint.GetEntries()<1:
continue
1720 if len(neutrals)<1 :
continue
1724 E = sTree.MCTrack[x].GetEnergy()
1727 if debug>3: print(
'debug',len(neutrals),E,sTree.MCTrack[x])
1730 vetoPoint, zMinCharged = -1,999.
1731 for det
in [sTree.ScifiPoint,sTree.MuFilterPoint]:
1735 part = PDG.GetParticle(p.PdgCode())
1737 if part: charge = part.Charge()
1738 if charge != 0
and p.GetZ() < zMinCharged :
1739 vetoPoint,zMinCharged = p,p.GetZ()
1740 if debug>2
and tagged >0:
1741 print(
"What happened",neu)
1742 Npart = sTree.MCTrack[neu]
1743 E = Npart.GetEnergy()
1744 pid = Npart.GetPdgCode()
1746 neutInterVx = [neutrals[neu][2],neutrals[neu][3],neutrals[neu][4]]
1747 veto = zMinCharged < neutInterVx[2]
1748 rc = h[
'xyz_Inter_'+
str(pid)].Fill(neutInterVx[0],neutInterVx[1],neutInterVx[2],W)
1749 if E>100.: rc = h[
'xyzE100_Inter_'+
str(pid)].Fill(neutInterVx[0],neutInterVx[1],neutInterVx[2],W)
1750 rc = h[
'xyz_origin_'+
str(pid)].Fill(Npart.GetStartX(),Npart.GetStartY(),Npart.GetStartZ(),W)
1751 rc = h[
'xyz_muInter_'+
str(pid)].Fill(muInterVx.X(),muInterVx.Y(),muInterVx.Z(),W)
1753 rc = h[
'xyzVeto_Inter_'+
str(pid)].Fill(neutInterVx[0],neutInterVx[1],neutInterVx[2],W)
1754 rc = h[
"E_veto_"+
str(pid)].Fill(E,neutInterVx[2],W)
1756 P = ROOT.TVector3(p.GetPx(),p.GetPy(),p.GetPz())
1757 pidVeto = p.PdgCode()
1758 if not pidVeto
in pidsDictRev:
1759 print(
"!!!! unknown pid",pidVeto)
1760 L = len(pidsDictRev)
1761 pidsDictRev[pidVeto] = L
1762 rc = h[
'pidsDict'].SetBinContent(L+1,pidVeto)
1763 rc = h[
"E_vetoParticle_"+
str(pid)].Fill(P.Mag(),pidsDictRev[pidVeto],W)
1764 rc = h[
"z_veto_"+
str(pid)].Fill(neutInterVx[2],zMinCharged)
1766 rc = h[
"E_"+
str(pid)].Fill(E,neutInterVx[2],W)
1767 if Npart.GetProcID()==0:
1768 if veto: rc = h[
"Eprim_veto_"+
str(pid)].Fill(E,neutInterVx[2],W)
1769 else: rc = h[
"Eprim_"+
str(pid)].Fill(E,neutInterVx[2],W)
1772 for p
in sTree.MuFilterPoint:
1773 if p.GetZ()<50.
and p.GetZ()>0:
1774 track = p.GetTrackID()
1775 if track<0:
continue
1776 V = sTree.MCTrack[track]
1777 if V.GetStartZ()<-35:
1778 rc = h[
"xy_z-30_"+
str(pid)].Fill(p.GetX(),p.GetY(),W)
1779 if veto: rc = h[
"xy_z-30_veto_"+
str(pid)].Fill(p.GetX(),p.GetY(),W)
1781 h[
'3d']=h[
'xyz_muInter_130'].Clone(
'3d')
1782 h[
'3d'].Add(h[
'xyz_muInter_2112'])
1783 h[
'3d'].Add(h[
'xyz_muInter_-2112'])
1785 if options.Emin==0: ut.writeHists(h,
"muonDISfull-"+
str(sMin)+
"_"+
str(sMax)+
"_"+
str(cycle)+
".root")
1786 else: ut.writeHists(h,
"muonDISfull-"+
str(options.Emin)+
'_'+
str(sMin)+
"_"+
str(sMax)+
"_"+
str(cycle)+
".root")
1788 ut.writeHists(h,
"muonGeant4full-"+
str(sMin)+
"_"+
str(sMax)+
".root")
1814def analyzeDIS(NsubJobs=0,delta=13,hists="../Muons Extended Scoring Plane/muonDISfull.root",runCoverage=6.):
1816 pathToPlots =
"/mnt/hgfs/microDisk/SND@LHC/MuonDis/reMake2022"
1818 if options.pythia6<0:
1819 pathToPlots =
"/mnt/hgfs/microDisk/CERNBOX/SND@LHC/MuonGeant4/"
1820 latex =
'latex-geant4.tex'
1823 ut.readHists(h,hists)
1827 sMin,sMax = s,s+delta
1828 print(
"reading muonDISfull-"+
str(sMin)+
"_"+
str(sMax)+
".root" )
1829 ut.readHists(h,
"muonDISfull-"+
str(sMin)+
"_"+
str(sMax)+
".root")
1832 ut.bookCanvas(h,
'muDIS_SND2',
'incoming muon energy',1500,900,2,1)
1833 c=h[
'muDIS_SND2'].cd(1)
1835 h[hname] = h[
"inMu_013" ].ProjectionX(hname)
1836 h[hname].Add(h[
"inMu_0-13" ].ProjectionX())
1837 ut.makeIntegralDistrib(h,hname)
1838 h[
'I-'+hname].SetTitle(
'incoming muon energy;> E [GeV/c];N arbitrary units')
1839 h[
'I-'+hname].SetMinimum(1.E-6)
1840 h[
'I-'+hname].SetStats(0)
1841 h[
'I-'+hname].SetLineWidth(3)
1842 h[
'I-'+hname].Draw(
'hist')
1843 c=h[
'muDIS_SND2'].cd(2)
1844 h[hname].SetTitle(
'incoming muon energy; E [GeV/c];N arbitrary units')
1845 h[hname].SetStats(0)
1846 h[hname].SetLineWidth(3)
1847 h[hname].Draw(
'hist')
1848 myPrint(h[
'muDIS_SND2'],
'inMuEnergy.png',pathToPlots=pathToPlots)
1850 c=h[
'muDIS_SND2'].cd(1)
1852 for x
in [
'13',
'-13']:
1853 h[
"xy_mu_0"+x] = h[
"xyz_mu_0"+x].Project3D(
'yx')
1854 h[
"xy_mu_0"+x].SetName(
"xy_mu_0"+x)
1855 h[
"xy_mu_0"+x].SetStats(0)
1856 h[
"xy_mu_0"+x].SetTitle(PDG.GetParticle(
int(x)).GetName()+
' ;x [cm]; y [cm]')
1857 h[
"xy_mu_0"+x].Draw(
'colz')
1858 c=h[
'muDIS_SND2'].cd(2)
1859 myPrint(h[
'muDIS_SND2'],
'inMu_0XY',pathToPlots=pathToPlots)
1860 h[
"xyz_mu_0"]=h[
"xyz_mu_013"].Clone(
"xyz_mu_0")
1861 h[
"xyz_mu_0"].Add(h[
"xyz_mu_0-13"])
1862 h[
"yz_mu_0"] = h[
"xyz_mu_0"].Project3D(
'yz')
1863 h[
"yz_mu_0"].SetName(
"yz_mu_0")
1864 h[
"yz_mu_0"].SetStats(0)
1865 h[
"yz_mu_0"].SetTitle(
"; z [cm]; y [cm]")
1866 ut.bookCanvas(h,
'muDIS_SNDyz',
'incoming muon',1200,900,1,1)
1867 c=h[
'muDIS_SNDyz'].cd()
1868 h[
"yz_mu_0"].Draw(
'colz')
1869 myPrint(h[
'muDIS_SNDyz'],
'inMu_0YZ',pathToPlots=pathToPlots)
1871 parts = [130,2112,-2112,310,3122,-3122,3322,-3322,22]
1874 ut.bookCanvas(h,
'muDIS_N0In',
'primary neutrals',1200,1200,3,3)
1875 for k
in range(len(parts)):
1877 pname = PDG.GetParticle(pid).GetName()
1878 tc=h[
'muDIS_N0In'].cd(k+1)
1880 hname =
"inE_"+
str(pid)
1881 hConcr =
"inE_Concrete_"+
str(pid)
1882 hout =
"inE_out_"+
str(pid)
1883 h[hout] = h[hname].Clone(hout)
1884 h[hout].Add(h[hConcr],-1.)
1885 h[hout+
'_projx'] = h[hout].ProjectionX(hout+
'_projx')
1886 h[hname+
'_projx'] = h[hname].ProjectionX(hname+
'_projx')
1887 h[hout+
'_projx'].SetMarkerStyle(20)
1888 h[hname+
'_projx'].SetMarkerStyle(27)
1889 h[hname+
'_projx'].SetStats(0)
1890 binw =
int(h[hname+
'_projx'].GetBinWidth(1))
1891 h[hname+
'_projx'].GetYaxis().SetTitle(
'N [Hz/'+
str(binw)+
'GeV]')
1892 h[hout+
'_projx'].SetMarkerStyle(29)
1893 h[hname+
'_projx'].GetXaxis().SetRangeUser(0.,2900.)
1894 h[hname+
'_projx'].GetXaxis().SetTitle(
'Energy [GeV] ')
1895 h[hname+
'_projx'].SetTitle(pname)
1896 h[hname+
'_projx'].GetYaxis().SetTitleOffset(1.2)
1897 h[hname+
'_projx'].SetMaximum(20.)
1898 h[hname+
'_projx'].Draw(
'PHIST')
1899 h[hname+
'_projx'].Draw(
'histsame')
1900 h[hout+
'_projx'].SetLineColor(ROOT.kRed)
1901 h[hout+
'_projx'].Draw(
'SAMEPHIST')
1902 h[hout+
'_projx'].Draw(
'histsame')
1903 myPrint(h[
'muDIS_N0In'],
'EofPrimNeutrals',pathToPlots=pathToPlots)
1905 tname =
'muDIS_inSND'
1906 ut.bookCanvas(h,tname,
'neutrals not in concrete and z>-25cm',1200,1200,3,3)
1907 for k
in range(len(parts)):
1909 pname = PDG.GetParticle(pid).GetName()
1912 h[
"inE_prim_"+
str(pid)] = h[
"inE_"+
str(pid)].Clone(
"inE_prim_"+
str(pid))
1913 h[
"inE_prim_"+
str(pid)].Add(h[
"inE_Concrete_"+
str(pid)],-1)
1914 h[
"inE_seco_"+
str(pid)] = h[
"inE_"+
str(pid)+
'_secondary'].Clone(
"inE_"+
str(pid)+
'_secondary_out')
1915 h[
"inE_seco_"+
str(pid)].Add(h[
"inE_Concrete_"+
str(pid)+
'_secondary'],-1)
1916 for x
in [
'prim_',
'seco_']:
1917 zmin = h[
"inE_"+x+
str(pid)].GetYaxis().FindBin(-25.)
1918 zmax = h[
"inE_"+x+
str(pid)].GetYaxis().FindBin(+25.)
1919 hname =
"inE_"+x+
str(pid)+
'_SND'
1920 h[hname] = h[
"inE_"+x+
str(pid)].ProjectionX(hname,zmin,zmax)
1921 h[hname].SetStats(0)
1922 binw =
int(h[hname].GetBinWidth(1))
1923 h[hname].GetYaxis().SetTitle(
'N [Hz/'+
str(binw)+
'GeV]')
1924 h[hname].GetXaxis().SetRangeUser(0.,2900.)
1925 h[hname].GetXaxis().SetTitle(
'Energy [GeV] ')
1926 h[hname].SetTitle(pname)
1927 h[hname].GetYaxis().SetTitleOffset(1.2)
1928 h[hname].SetMaximum(20.)
1929 h[hname].SetMinimum(1.E-6)
1930 hname =
"inE_prim_"+
str(pid)+
'_SND'
1931 h[hname].SetLineColor(ROOT.kRed)
1932 h[hname].Draw(
'hist')
1933 hname =
"inE_seco_"+
str(pid)+
'_SND'
1934 h[hname].SetLineColor(ROOT.kBlue)
1935 h[hname].Draw(
'histsame')
1936 myPrint(h[tname],
'EofNeutralsInSND',pathToPlots=pathToPlots)
1939 colour[
''] = ROOT.kRed
1940 colour[
'_secondary'] = ROOT.kBlue
1941 minMax = {
'out_':[9,1E-6],
'Concrete_':[30.,1E-5]}
1942 for k
in range(len(parts)):
1944 for origin
in [
'_secondary',
'']:
1945 hname =
"inE_"+
str(pid)+origin
1946 hConcr =
"inE_Concrete_"+
str(pid) +origin
1947 hout =
"inE_out_"+
str(pid)+origin
1948 h[hout] = h[hname].Clone(hout)
1949 h[hout].Add(h[hConcr],-1.)
1951 for c
in [
'out_',
'Concrete_']:
1952 tname =
'muDIS_neuZend'+c
1953 ut.bookCanvas(h,tname,
'end vertex z',1200,1200,3,3)
1954 for k
in range(len(parts)):
1956 pname = PDG.GetParticle(pid).GetName()
1959 for origin
in [
'_secondary',
'']:
1961 hname =
"inE_"+c+
str(pid)+origin
1962 h[hname+
'_projz'] = h[hname].ProjectionY(hname+
'_projz')
1963 h[hname+
'_projz'].SetLineColor(colour[origin])
1964 h[hname+
'_projz'].SetStats(0)
1965 binw =
int(h[hname+
'_projz'].GetBinWidth(1))
1966 h[hname+
'_projz'].GetYaxis().SetTitle(
'N [Hz/'+
str(binw)+
'GeV]')
1967 h[hname+
'_projz'].GetXaxis().SetTitle(
'z [cm] ')
1968 h[hname+
'_projz'].SetTitle(pname)
1969 h[hname+
'_projz'].GetYaxis().SetTitleOffset(1.2)
1970 h[hname+
'_projz'].SetMaximum(minMax[c][0])
1971 h[hname+
'_projz'].SetMinimum(minMax[c][1])
1972 if origin==
'_secondary': h[hname+
'_projz'].Draw(
'HIST')
1973 else: h[hname+
'_projz'].Draw(
'HISTsame')
1974 myPrint(h[tname],c+
'zEndOfNeutrals',pathToPlots=pathToPlots)
1978 for hist
in [
'xyz_muInter',
'xyz_Inter',
'xyzE100_Inter',
'xyz_origin',
'inE',
'inE_Concrete',
'xyzVeto_Inter',
'z_veto']:
1981 if pid==22:
continue
1983 h[hist] = h[hist+
'_'+
str(pid)].Clone(hist)
1985 else: h[hist].Add(h[hist+
'_'+
str(pid)])
1986 h[
'inE-noConc']=h[
'inE'].Clone(
'inE-noConc')
1987 h[
'inE-noConc'].Add(h[
'inE_Concrete'],-1.)
1988 h[
'inE-noConc_22']=h[
'inE_22'].Clone(
'inE-noConc_22')
1989 h[
'inE-noConc_22'].Add(h[
'inE_Concrete_22'],-1.)
1990 for hist
in [
'xyz_muInter',
'xyz_Inter',
'xyzE100_Inter',
'xyz_origin',
'inE',
'inE-noConc',
'xyzVeto_Inter',
'z_veto']:
1991 if h[hist].ClassName() ==
'TH2D':
1992 h[hist+
'_z']=h[hist].ProjectionY(hist+
'_z')
1993 h[hist+
'_22_z']=h[hist+
'_22'].ProjectionY(hist+
'_22_z')
1994 h[hist+
'_22_z'].SetTitle(
';z [cm]')
1995 h[hist+
'_z'].SetTitle(
';z [cm]')
1997 for g
in [
'',
'_22']:
1998 h[hist+g+
'_z'] =h[hist+g].ProjectionZ(hist+g+
'_z')
1999 h[hist+g+
'_z'].SetTitle(
';z [cm]')
2000 h[hist+g+
'_xy']=h[hist+g].Project3D(
'yx')
2001 h[hist+g+
'_xy'].SetName(hist+g+
'_xy')
2002 h[hist+g+
'_xy'].SetTitle(
';x [cm]; y [cm]')
2003 h[hist+g+
'_xy'].SetStats(0)
2004 h[hist+g+
'_xz']=h[hist+g].Project3D(
'xz')
2005 h[hist+g+
'_xz'].SetName(hist+g+
'_xz')
2006 h[hist+g+
'_xz'].SetTitle(
';z [cm]; x [cm]')
2007 h[hist+g+
'_xz'].SetStats(0)
2008 h[hist+g+
'_yz']=h[hist+g].Project3D(
'yz')
2009 h[hist+g+
'_yz'].SetName(hist+g+
'_yz')
2010 h[hist+g+
'_yz'].SetTitle(
';z [cm]; y [cm]')
2011 h[hist+g+
'_yz'].SetStats(0)
2012 h[hist+
'_z'].SetStats(0)
2013 h[hist+
'_z'].SetTitle(
'; z [cm]')
2014 ut.bookCanvas(h,
'vertices'+hist+
'_z',
'vertices '+hist,1200,900,1,1)
2015 tc = h[
'vertices'+hist+
'_z'].cd()
2016 if hist==
'z_veto': tc.SetLogy()
2017 if hist==
'xyzVeto_Inter': tc.SetLogy()
2018 if hist
in [
'xyz_muInter',
'xyz_origin']:
2021 h[hist+
'_22_z'].SetStats(0)
2022 h[hist+
'_22_z'].SetLineColor(ROOT.kRed)
2023 h[hist+
'_22_z'].Draw()
2024 h[hist+
'_z'].Draw(
'same')
2025 if hist==
'xyzE100_Inter':
2028 if h[hist+
'_z'].GetEntries()>10:
2029 rc = h[hist+
'_z'].Fit(
'expo',
'S',
'',-25.,30.)
2030 fitresult = rc.Get()
2031 txtlam =
'#lambda =%4.1Fcm'%(-1./fitresult.GetParams()[1])
2032 rc = h[hist+
'_22_z'].Fit(
'expo',
'SL',
'',-30.,10.)
2033 fitresult = rc.Get()
2034 funRad =h[hist+
'_22_z'].GetFunction(
'expo')
2035 funRad.SetBit(ROOT.TF1.kNotDraw)
2036 funRad.SetLineColor(h[hist+
'_22_z'].GetLineColor())
2037 txtrad =
'X_{0} =%4.1Fcm'%(-1./fitresult.GetParams()[1])
2038 h[hist+
'_z'].GetFunction(
'expo').SetLineColor(h[hist+
'_z'].GetLineColor())
2040 h[hist+
'_22_z'].Draw(
'same')
2042 T.DrawLatex(-10,0.005,txtlam)
2044 myPrint(h[
'vertices'+hist+
'_z'],hist+
'_z',pathToPlots=pathToPlots)
2045 if h[hist].ClassName() ==
'TH3D':
2046 for proj
in [
'xy',
'xz',
'yz']:
2047 ut.bookCanvas(h,
'vertices'+hist+
'_'+proj,
'vertices '+hist,1200,900,1,1)
2048 tc = h[
'vertices'+hist+
'_'+proj].cd()
2049 h[hist+
'_'+proj].Draw(
'colz')
2050 myPrint(h[
'vertices'+hist+
'_'+proj],hist+
'_'+proj,pathToPlots=pathToPlots)
2052 ut.bookCanvas(h,
'verticesinE_z',
'vertices inE_z',1200,900,1,1)
2053 h[
'verticesinE_z'].cd()
2054 h[
"inE-noConc_z"].SetLineColor(ROOT.kRed)
2055 h[
"inE_z"].Draw(
'hist')
2056 h[
"inE-noConc_z"].Draw(
'samehist')
2057 myPrint(h[
'verticesinE_z'],
"inE_z",pathToPlots=pathToPlots)
2058 ut.bookCanvas(h,
'verticesxyz_Inter_z',
'vertices xyz_Inter_z',1200,900,1,1)
2059 h[
'verticesxyz_Inter_z'].cd()
2060 h[
'xyz_Inter_z'].GetXaxis().SetRangeUser(-50.,100.)
2061 h[
"xyz_Inter_z"].Draw(
'hist')
2062 myPrint(h[
'verticesxyz_Inter_z'],
"verticesxyz_Inter_z",pathToPlots=pathToPlots)
2066 ut.bookCanvas(h,
'mult',
' ',1200,900,1,1)
2069 mults = {22:[19,ROOT.kMagenta],130:[20,ROOT.kRed],2112:[22,ROOT.kBlue],-2112:[23,ROOT.kCyan],
2070 310:[21,ROOT.kOrange],3122:[24,ROOT.kGreen-1],-3122:[25,ROOT.kGreen+1],
2071 3322:[26,ROOT.kGreen-2],-3322:[27,ROOT.kGreen+2]}
2072 h[
'legmult']=ROOT.TLegend(0.6,0.6,0.82,0.75)
2074 hist =
'mult_'+
str(m)
2076 h[hist].SetTitle(
'; N')
2077 h[hist].SetMarkerStyle(mults[m][0])
2078 h[hist].SetMarkerColor(mults[m][1])
2079 h[hist].SetLineColor(mults[m][1])
2080 rc = h[
'legmult'].AddEntry(h[hist],PDG.GetParticle(m).GetName(),
'PL')
2082 for m
in mults: h[
'mult_'+
str(m)].Draw(
'same')
2083 h[
'legmult'].Draw(
'same')
2084 myPrint(h[
'mult'],
"neutralMultiplicities",pathToPlots=pathToPlots)
2086 ut.makeIntegralDistrib(h,
"inE_"+
str(pid))
2087 ut.makeIntegralDistrib(h,
"inE_Concrete_"+
str(pid))
2088 for o
in [
"",
"prim"]:
2089 hname =
"Esnd"+o+
"_"+
str(pid)
2090 h[hname] = h[
"E"+o+
"_"+
str(pid)].ProjectionX(hname)
2091 h[
"Esnd"+o+
"_all_"+
str(pid)] = h[
"E"+o+
"_veto_"+
str(pid)].ProjectionX(
"Esnd"+o+
"_all_"+
str(pid))
2092 h[
"Esnd"+o+
"_all_"+
str(pid)] .Add(h[hname] )
2093 ut.makeIntegralDistrib(h,hname)
2094 h[
'I-'+hname].GetXaxis().SetRangeUser(0.,1000.)
2095 h[
'I-'+hname].SetMinimum(1E-6)
2096 ut.makeIntegralDistrib(h,
"Esnd"+o+
"_all_"+
str(pid))
2098 ut.bookCanvas(h,
'muDIS_SNDwithVeto',
'neutrals arriving at SND',1800,1200,3,3)
2099 for k
in range(len(parts)):
2100 tc=h[
'muDIS_SNDwithVeto'].cd(k+1)
2102 pname = PDG.GetParticle(parts[k]).GetName()
2103 hnameScaled =
"Esnd_"+
str(parts[k])+
"_fb150"
2104 h[hnameScaled] = h[
"Esnd_"+
str(parts[k])].Clone(hnameScaled)
2105 h[hnameScaled].Scale(150.*fbScale/runCoverage)
2106 h[hnameScaled].GetXaxis().SetRangeUser(0,500)
2107 h[hnameScaled].SetStats(0)
2108 h[hnameScaled].SetMaximum(4E6)
2109 h[hnameScaled].SetTitle(pname+
'; E [GeV/c];N/10GeV /150 fb^{-1}')
2110 h[hnameScaled].SetLineWidth(3)
2111 h[hnameScaled].Draw(
'hist')
2112 myPrint(h[
'muDIS_SNDwithVeto'],
'EofNeutralsInSND_vetoApplied',pathToPlots=pathToPlots)
2114 ut.bookCanvas(h,
'muDIS_SNDnoVetoRequired',
'neutrals arriving at SND',1800,1200,3,3)
2115 for k
in range(len(parts)):
2116 tc=h[
'muDIS_SNDnoVetoRequired'].cd(k+1)
2118 pname = PDG.GetParticle(parts[k]).GetName()
2119 hnameScaled =
"Esnd_all_"+
str(parts[k])+
"_fb150"
2120 h[hnameScaled] = h[
"Esnd_all_"+
str(parts[k])].Clone(hnameScaled)
2121 h[hnameScaled].Scale(150.*fbScale/runCoverage)
2122 h[hnameScaled].GetXaxis().SetRangeUser(0,500)
2123 h[hnameScaled].SetStats(0)
2124 h[hnameScaled].SetMaximum(4E6)
2125 h[hnameScaled].SetTitle(pname+
'; E [GeV/c];N/10GeV /150 fb^{-1}')
2126 h[hnameScaled].SetLineWidth(3)
2127 h[hnameScaled].Draw(
'hist')
2128 myPrint(h[
'muDIS_SNDnoVetoRequired'],
'EofNeutralsInSND_NoVetoApplied',pathToPlots=pathToPlots)
2130 for o
in [
"",
"prim"]:
2131 ut.bookCanvas(h,
'muDIS_SND'+o,
'neutrals arriving at SND',1800,1200,3,3)
2132 for k
in range(len(parts)):
2133 tc=h[
'muDIS_SND'+o].cd(k+1)
2136 pname = PDG.GetParticle(parts[k]).GetName()
2137 hname =
"Esnd"+o+
"_"+
str(parts[k])
2138 hnameAll =
"Esnd"+o+
"_all_"+
str(parts[k])
2139 for X
in [hname,hnameAll]:
2140 h[
'IFB-'+X] = h[
'I-'+X].Clone(
'IFB-'+X)
2141 h[
'IFB-'+X].Scale(150.*fbScale)
2142 h[
'IFB-'+X].SetTitle(pname+
';> E [GeV/c];N /150 fb^{-1}')
2143 h[
'IFB-'+X]. GetYaxis().SetTitleOffset(1.4)
2144 h[
'IFB-'+X]. GetXaxis().SetRangeUser(0.1,1200.)
2145 h[
'IFB-'+X].SetMaximum(2E7)
2146 h[
'IFB-'+X].SetStats(0)
2147 h[
'IFB-'+X].SetLineWidth(3)
2148 h[
'IFB-'+X].SetMinimum(1.0)
2149 h[
'IFB-'+hnameAll].Draw(
'hist')
2150 h[
'IFB-'+hname].SetLineColor(ROOT.kRed)
2151 h[
'IFB-'+hname].Draw(
'histsame')
2152 hist = h[
'I-'+hname]
2153 histAll = h[
'I-'+hnameAll]
2154 print(
"----> results for "+o)
2155 for E
in [0,10,100,200,300,500,1000]:
2157 RVeto = hist.GetBinContent(n) / runCoverage
2158 R = histAll.GetBinContent(n) / runCoverage
2160 if parts[k]
in FASERNU:
2161 if E
in FASERNU[parts[k]]:
2162 faser =
"%5.2G"%( FASERNU[parts[k]][E]*scaleFactor )
2163 print(
"E>%i GeV, %s: %5.2F N/sec %5.2F N fb with Veto: %5.2F N fb | %5.2G veto %5.2G (%s) "%(E,pname,R,R*fbScale,RVeto*fbScale,R*150.*fbScale,RVeto*150.*fbScale,faser))
2164 myPrint(h[
'muDIS_SND'+o],
'muDIS_SND'+o,pathToPlots=pathToPlots)
2166 fout = open(latex,
'w')
2167 platex = {2112:
'$n$' ,-2112:
'$\overline{n}$' ,130:
'$K_L$',310:
'$K_S$',3122:
'$\Lambda$',-3122:
'$\overline{\Lambda}$',3322:
'$\Xi + \overline{\Xi}$',22:
'$\gamma$'}
2169 for x
in [2112,-2112,130,310,3122,-3122,3322,22]:
2171 for E
in [10,100,200,300,500,1000]:
2172 pname = PDG.GetParticle(x).GetName()
2173 hnameAll =
"Esnd"+
"_all_"+
str(x)
2174 histAll = h[
'I-'+hnameAll]
2175 n = histAll.FindBin(E)
2176 R = histAll.GetBinContent(n) / runCoverage
2177 if x == 3322: R+=h[
'I-'+hnameAll.replace(
'3322',
'-3322')].GetBinContent(n) / runCoverage
2178 R150 = R*150.*fbScale
2179 if R150<1E-8: R150=0
2180 if R150<1000: line +=
"& $%5.1F$"%(R150)
2181 else: line +=
"& $%6.2G$"%(R150)
2184 xline = line.replace(
'E+0',
'\,10^')
2186 fout.write(
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n")
2187 for x
in [2112,-2112,130,310,3122,-3122,3322,22]:
2189 for E
in [10,100,200,300,500,1000]:
2190 pname = PDG.GetParticle(x).GetName()
2191 hname =
"Esnd_"+
str(x)
2194 R = hist.GetBinContent(n) / runCoverage
2195 if x == 3322: R+=h[
'I-'+hname.replace(
'3322',
'-3322')].GetBinContent(n) / runCoverage
2196 R150 = R*150.*fbScale
2197 if R150<1E-8: R150=0
2198 if R150<1000: line +=
"& $%5.1F$"%(R150)
2199 else: line +=
"& $%6.2G$"%(R150)
2202 xline = line.replace(
'E+0',
'\,10^')
2204 fout.write(
"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n")
2205 for x
in [2112,-2112,130,310,3122,-3122,3322,22]:
2207 for E
in [10,100,300,1000]:
2208 faser = FASERNU[x][E]*scaleFactor
2209 if x == 3322: faser+=FASERNU[-x][E]*scaleFactor
2210 if faser<1000: line +=
"& $%5.1F$"%(faser)
2211 else: line +=
"& $%6.2G$"%(faser)
2214 xline = line.replace(
'E+0',
'\,10^')