SND@LHC Software
Loading...
Searching...
No Matches
Scifi_monitoring.Scifi_trackEfficiency Class Reference
Inheritance diagram for Scifi_monitoring.Scifi_trackEfficiency:
Collaboration diagram for Scifi_monitoring.Scifi_trackEfficiency:

Public Member Functions

 Init (self, options, monitor)
 
 ExecuteEvent (self, event)
 
 Plot (self)
 

Public Attributes

 M
 
 debug
 
 zEx
 
 zExVeto
 
 res
 
 unbiased
 
 masked
 
 deadTime
 
 eventBefore
 

Detailed Description

Definition at line 506 of file Scifi_monitoring.py.

Member Function Documentation

◆ ExecuteEvent()

Scifi_monitoring.Scifi_trackEfficiency.ExecuteEvent (   self,
  event 
)

Definition at line 537 of file Scifi_monitoring.py.

537 def ExecuteEvent(self,event):
538 vetoHitsFromPrev = 0
539 if event.EventHeader.GetRunId() < 6204 and event.EventHeader.GetRunId() > 5480: vetoHitsFromPrev = 5
540 # special treatment for first 10fb-1 in 2023, wrong time alignment, again!
541 N1 = event.GetReadEntry()
542 Tcurrent = event.EventHeader.GetEventTime()
543 dT = abs(Tcurrent-self.eventBefore['T'])
544 prevAdded = False
545 vetoHits = []
546 USQDC = 0
547 for j in [0,-1]:
548 if j<0 and N1>0:
549 if dT > vetoHitsFromPrev: continue
550 rc = event.GetEvent(N1-1) # add veto hits from prev event
551 prevAdded = True
552 for aHit in event.Digi_MuFilterHits:
553 Minfo = self.M.MuFilter_PlaneBars(aHit.GetDetectorID())
554 s,l,bar = Minfo['station'],Minfo['plane'],Minfo['bar']
555 if s==2 and j==0: USQDC += aHit.SumOfSignals()['Sum']
556 if s>1: continue
557 X = aHit.GetAllSignals()
558 if len(X)<5: continue # number of fired SiPMs
559 vetoHits.append(aHit.GetDetectorID())
560 if prevAdded and N1>1:
561 rc = event.GetEvent(N1-2)
562 Tprevprev = event.EventHeader.GetEventTime()
563 dT = abs(Tcurrent-Tprevprev)
564 if prevAdded: event.GetEvent(N1)
565 prevEvent = False
566 if dT < self.deadTime and dT > vetoHitsFromPrev:
567 return
568 self.eventBefore['T'] = Tcurrent
569
570 h = self.M.h
571 W = self.M.Weight
572 MufiTracks = []
573 ScifiTracks = []
574 k = -1
575 for theTrack in self.M.Reco_MuonTracks:
576 k+=1
577 fitStatus = theTrack.getFitStatus()
578 if not fitStatus.isFitConverged(): continue
579 if theTrack.GetUniqueID()==1: ScifiTracks.append(k)
580 if theTrack.GetUniqueID()==3: MufiTracks.append(k)
581 if len(MufiTracks)==0: return
582
583 xExTag, yExTag = -10000,-10000
584 for kMu in MufiTracks:
585 theTrack = self.M.Reco_MuonTracks[kMu]
586 fstate = theTrack.getFittedState()
587 posT,momT = fstate.getPos(),fstate.getMom()
588 slopeXT = momT.X()/momT.Z()
589 slopeYT = momT.Y()/momT.Z()
590 if not abs(slopeXT)<0.1 or not abs(slopeYT)<0.1: continue
591 lam = (self.zEx-posT.z())/momT.z()
592 yExTag = posT.y()+lam*momT.y()
593 xExTag = posT.x()+lam*momT.x()
594 # eventually require hit in veto to remove ghost tracks
595 ok = False
596 for detID in vetoHits:
597 self.M.MuFilter.GetPosition(detID,A,B)
598# calculate DOCA
599 lam = (self.zExVeto-posT.z())/momT.z()
600 xExV,yExV = posT.x()+lam*momT.x(),posT.y()+lam*momT.y()
601 pq = A-posT
602 uCrossv= (B-A).Cross(momT)
603 doca = pq.Dot(uCrossv)/uCrossv.Mag()
604 if abs(doca)<self.res:
605 ok=True
606 break
607 if not ok: continue
608 rc = h['DStag'].Fill(xExTag,yExTag)
609 for kSc in ScifiTracks:
610 scifiTrack = self.M.Reco_MuonTracks[kSc]
611 fstate = scifiTrack.getFittedState()
612 pos,mom = fstate.getPos(),fstate.getMom()
613 lam = (self.zEx-pos.z())/mom.z()
614 yEx = pos.y()+lam*mom.y()
615 xEx = pos.x()+lam*mom.x()
616 dx = xExTag-xEx
617 dy = yExTag-yEx
618 rc = h['Xdx'].Fill(dx)
619 rc = h['Xdy'].Fill(dy)
620 if abs(dy)<self.res and abs(dx)<self.res:
621 rc = h['scifiTrack'].Fill(xExTag,yExTag)
622 rc = h['USQDC'].Fill(USQDC)
623 sortedClusters={}
624 NscifiTot = 0
625 for aCl in self.M.trackTask.clusScifi:
626 s = aCl.GetFirst()//100000
627 if not (s in sortedClusters): sortedClusters[s]=0
628 sortedClusters[s]+=aCl.GetN()
629 rc = h['clSize'].Fill(aCl.GetN())
630 for s in sortedClusters:
631 rc = h['hitPerPlane'].Fill(sortedClusters[s])
632# finished for Scifi track efficiency
633# start of Scifi plane inefficiency
634 if len(ScifiTracks) < 1: return
635 if xExTag< -9000 or not ok: return
636 sortedClusters={}
637 for aCl in self.M.trackTask.clusScifi:
638 so = aCl.GetFirst()//100000
639 if not so in sortedClusters: sortedClusters[so]=0
640 sortedClusters[so]+=1
641 trackClusters = {}
642 for x in self.M.trackTask.trackCandidates['Scifi'][0]:
643 aCl = self.M.trackTask.trackCandidates['Scifi'][0][x]
644 so = aCl.GetFirst()//100000
645 if not so in trackClusters: trackClusters[so]=0
646 trackClusters[so]+=1
647
648 for s in range(1,6):
649 # s is test station
650 if self.unbiased:
651 # build trackCandidate without s
652 self.M.trackTask.maskPlane = s
653 self.M.trackTask.fittedTracks.Delete()
654 self.M.trackTask.ExecuteTask(option='Scifi')
655 if self.M.trackTask.fittedTracks.GetEntries()==0: continue
656 theTrack = self.M.trackTask.fittedTracks[0]
657 if not hasattr(theTrack,"getFittedState"): continue
658 if not theTrack.getFitStatus().isFitConverged():
659 self.M.trackTask.fittedTracks.Delete()
660 continue
661 else:
662 # check that test station not required for making track
663 nproj = {0:0,1:0}
664 for aCl in trackClusters:
665 sq = aCl//10
666 if sq==s or self.masked.find(str(sq))>-0.5: continue
667 nproj[aCl%10]+=1
668 if nproj[0]<3 or nproj[1]<3: continue
669 theTrack = self.M.Reco_MuonTracks[ScifiTracks[0]]
670
671 flightDir = self.M.trackTask.trackDir(theTrack)
672 rc = h['flightDir'].Fill(flightDir[0])
673 if flightDir[0] < -100:
674 if self.unbiased: self.M.trackTask.fittedTracks.Delete()
675 continue
676 fstate = theTrack.getFittedState()
677 pos,mom = fstate.getPos(),fstate.getMom()
678 lam = (self.zEx-pos.z())/mom.z()
679 yEx = pos.y()+lam*mom.y()
680 xEx = pos.x()+lam*mom.x()
681 dx = xExTag-xEx
682 dy = yExTag-yEx
683 slopeX = mom.X()/mom.Z()
684 slopeY = mom.Y()/mom.Z()
685 if not abs(slopeX)<0.1 or not abs(slopeY)<0.1:
686 if self.unbiased: self.M.trackTask.fittedTracks.Delete()
687 continue
688 if abs(dy)>self.res or abs(dx)>self.res:
689 if self.unbiased: self.M.trackTask.fittedTracks.Delete()
690 continue
691 testPlane = 10*s
692 z = self.M.zPos['Scifi'][testPlane]
693 lam = (z-pos.z())/mom.z()
694 yEx = pos.y()+lam*mom.y()
695 xEx = pos.x()+lam*mom.x()
696 rc = h['XscifiTrack_0'+str(s)].Fill(xEx,yEx)
697 if not ( (s*10 in sortedClusters) or ( (s*10+1) in sortedClusters) ):
698 rc = h['XscifiTrack_'+str(s)].Fill(xEx,yEx)
699 if -39<xEx and xEx<-16 and 22<yEx and yEx<47 and self.debug:
700 print('inefficient scifi detector ',s,self.M.EventNumber,xEx,yEx,len(vetoHits))
701 if not (s*10 in sortedClusters):
702 rc = h['XscifiTrack_'+str(s*10)].Fill(xEx,yEx)
703 if not ((s*10+1) in sortedClusters):
704 rc = h['XscifiTrack_'+str(s*10+1)].Fill(xEx,yEx)
705 if s==1:
706 nproj = {0:0,1:0}
707 for aCl in trackClusters:
708 sq = aCl//10
709 if sq==2 or sq==1: continue
710 nproj[aCl%10]+=1
711 if nproj[0]<3 or nproj[1]<3: continue
712 rc = h['2scifiTrack_0'+str(s)].Fill(xEx,yEx)
713 if not ( (s*10 in sortedClusters) or ( (s*10+1) in sortedClusters) or ( (2*10) in sortedClusters) or ( (2*10+1) in sortedClusters) ):
714 rc = h['2scifiTrack_'+str(s)].Fill(xEx,yEx)
715 if not (s*10 in sortedClusters or 2*10 in sortedClusters ):
716 rc = h['2scifiTrack_'+str(s*10)].Fill(xEx,yEx)
717 if not ((s*10+1) in sortedClusters or (2*10+1) in sortedClusters):
718 rc = h['2scifiTrack_'+str(s*10+1)].Fill(xEx,yEx)
719 if self.unbiased:
720# restore original track
721 self.M.trackTask.maskPlane = -1
722 self.M.trackTask.fittedTracks.Delete()
723# analysis and plots
void GetPosition(Int_t id, TVector3 &vLeft, TVector3 &vRight)
Definition MuFilter.cxx:639

◆ Init()

Scifi_monitoring.Scifi_trackEfficiency.Init (   self,
  options,
  monitor 
)

Definition at line 508 of file Scifi_monitoring.py.

508 def Init(self,options,monitor):
509 self.M = monitor
510 self.debug = False
511 h = self.M.h
512 ut.bookHist(h,'DStag','DS track X/Y at scifi 1; X[cm]; Y[cm]',100,-50,0.,100,10,60)
513 ut.bookHist(h,'Xdx','DS track X - scifi X; X[cm]',100,-20.,20.)
514 ut.bookHist(h,'Xdy','DS track Y - scifi Y; Y[cm]',100,-20.,20.)
515 ut.bookHist(h,'scifiTrack','scifi track X/Y at scifi 1; X[cm]; Y[cm]',100,-50,0.,100,10,60)
516 ut.bookHist(h,'USQDC','US QDC for matched tracks; qdc',220,-10,2190.)
517 ut.bookHist(h,'clSize','Scifi cluster size for matched tracks; n hits',10,-0.5,9.5)
518 ut.bookHist(h,'hitPerPlane','Scifi hits per detector ; n hits',50,-0.5,49.5)
519 ut.bookHist(h,'flightDir','flight direction',100,-20.,20.)
520 for s in range(6):
521 ut.bookHist(h,'XscifiTrack_'+str(s),'scifi track X/Y at scifi 1 missing station '+str(s)+'; X[cm]; Y[cm]',100,-50,0.,100,10,60)
522 if s==0: continue
523 ut.bookHist(h,'XscifiTrack_0'+str(s),'scifi track X/Y at scifi 1 missing station '+str(s)+'; X[cm]; Y[cm]',100,-50,0.,100,10,60)
524 for proj in range(2):
525 ut.bookHist(h,'XscifiTrack_'+str(10*s+proj),'scifi track X/Y at scifi 1 missing plane '+str(s*10+proj)+'; X[cm]; Y[cm]',100,-50,0.,100,10,60)
526 ut.bookHist(h,'2scifiTrack_1','scifi track X/Y at scifi 1 missing station 1 and 2; X[cm]; Y[cm]',100,-50,0.,100,10,60)
527 ut.bookHist(h,'2scifiTrack_01','scifi track X/Y at scifi 1 missing station 1 and 2; X[cm]; Y[cm]',100,-50,0.,100,10,60)
528 for proj in range(2):
529 ut.bookHist(h,'2scifiTrack_'+str(10*1+proj),'scifi track X/Y at scifi 1 missing plane '+str(proj)+' in 1 and 2; X[cm]; Y[cm]',100,-50,0.,100,10,60)
530 self.zEx = self.M.zPos['Scifi'][10]
531 self.zExVeto = self.M.zPos['MuFilter'][10]
532 self.res = 10.
533 self.unbiased = options.ScifiResUnbiased
534 self.masked = options.ScifiStationMasked
535 self.deadTime = 100
536 self.eventBefore={'T':-1,'N':-1,'hits':{1:0,0:0,'0L':0,'0R':0,'1L':0,'1R':0}}

◆ Plot()

Scifi_monitoring.Scifi_trackEfficiency.Plot (   self)

Definition at line 724 of file Scifi_monitoring.py.

724 def Plot(self):
725 h = self.M.h
726 ut.bookCanvas(h,'dxdy','',1200,1200,2,1)
727 tc = h['dxdy'].cd(1)
728 h['Xdx'].Draw()
729 tc = h['dxdy'].cd(2)
730 h['Xdy'].Draw()
731 self.M.myPrint(h['dxdy'],'ScifiMufiPulls',subdir='scifi/expert')
732 ut.bookCanvas(h,'scifiEff','',1600,800,3,1)
733 tc = h['scifiEff'].cd(1)
734 h['DStag'].Draw('colz')
735 tc = h['scifiEff'].cd(2)
736 h['scifiTrack'].Draw('colz')
737 h['eff']=h['scifiTrack'].Clone('eff')
738 h['eff'].Divide(h['DStag'])
739 tc = h['scifiEff'].cd(3)
740 h['eff'].DrawCopy('colz')
741 self.M.myPrint(h['scifiEff'],'ScifiTrackEfficiency',subdir='scifi/expert')
742 limits = {1:{'X':[-44,-8],'Y':[16,50]},2:{'X':[-40,-12],'Y':[18,47]}}
743 bins = {}
744 for l in limits :
745 bins[l] = []
746 for p in limits[l]:
747 for x in limits[l][p]:
748 bins[l].append(eval('h["DStag"].Get'+p+'axis().FindBin(x)'))
749 e = h['scifiTrack'].Integral(bins[l][0],bins[l][1],bins[l][2],bins[l][3])/h['DStag'].Integral(bins[l][0],bins[l][1],bins[l][2],bins[l][3])*100
750 print('average efficiency: %5.2F<X<%5.2F %5.2F<Y<%5.2F = %5.2F%%'%(limits[l]['X'][0],limits[l]['X'][1],limits[l]['Y'][0],limits[l]['Y'][1],e))
751 # station inefficiency
752 ut.bookCanvas(h,'Tsineff','',1200,900,3,2)
753 sRef=1
754 border = [14.964849051657234, 54.00431913184336, -46.21974599493218, -7.146496817384938] # scifi 1 boundaries
755 h['TlineTop'+str(sRef)] = ROOT.TLine(border[2],border[1],border[3],border[1])
756 h['TlineBot'+str(sRef)] = ROOT.TLine(border[2],border[0],border[3],border[0])
757 h['TlineLef'+str(sRef)] = ROOT.TLine(border[2],border[0],border[2],border[1])
758 h['TlineRig'+str(sRef)] = ROOT.TLine(border[3],border[0],border[3],border[1])
759 for x in ['TlineTop'+str(sRef),'TlineBot'+str(sRef),'TlineLef'+str(sRef),'TlineRig'+str(sRef)]:
760 h[x].SetLineWidth(2)
761 h[x].SetLineColor(ROOT.kRed)
762 for s in range(1,6):
763 tc = h['Tsineff'].cd(s)
764 tc.SetRightMargin(0.1)
765 tc.SetLogz(1)
766 h['sineff'+str(s)] = h['XscifiTrack_'+str(s)].Clone('sineff'+str(s))
767 h['sineff'+str(s)].Divide(h['XscifiTrack_0'])
768 h['sineff'+str(s)].SetStats(0)
769 h['sineff'+str(s)].SetMaximum(0.1)
770 h['sineff'+str(s)].DrawCopy('colz')
771 for x in ['TlineTop'+str(sRef),'TlineBot'+str(sRef),'TlineLef'+str(sRef),'TlineRig'+str(sRef)]: h[x].Draw('same')
772 tc.Update()
773 for l in limits :
774 e = h['XscifiTrack_'+str(s)].Integral(bins[l][0],bins[l][1],bins[l][2],bins[l][3])/h['scifiTrack'].Integral(bins[l][0],bins[l][1],bins[l][2],bins[l][3])
775 print('average efficiency station: %2i %5.2F<X<%5.2F %5.2F<Y<%5.2F = %5.2G'%(s,limits[l]['X'][0],limits[l]['X'][1],limits[l]['Y'][0],limits[l]['Y'][1],e))
776 self.M.myPrint(h['Tsineff'],'ScifiStationInEfficiency',subdir='scifi/expert')
777 ut.bookCanvas(h,'Tqdc','',1200,900,1,1)
778 tc = h['Tqdc'].cd()
779 h['USQDC'].Draw()
780 self.M.myPrint(h['Tqdc'],'US QDC for muon track',subdir='mufilter/expert')

Member Data Documentation

◆ deadTime

Scifi_monitoring.Scifi_trackEfficiency.deadTime

Definition at line 535 of file Scifi_monitoring.py.

◆ debug

Scifi_monitoring.Scifi_trackEfficiency.debug

Definition at line 510 of file Scifi_monitoring.py.

◆ eventBefore

Scifi_monitoring.Scifi_trackEfficiency.eventBefore

Definition at line 536 of file Scifi_monitoring.py.

◆ M

Scifi_monitoring.Scifi_trackEfficiency.M

Definition at line 509 of file Scifi_monitoring.py.

◆ masked

Scifi_monitoring.Scifi_trackEfficiency.masked

Definition at line 534 of file Scifi_monitoring.py.

◆ res

Scifi_monitoring.Scifi_trackEfficiency.res

Definition at line 532 of file Scifi_monitoring.py.

◆ unbiased

Scifi_monitoring.Scifi_trackEfficiency.unbiased

Definition at line 533 of file Scifi_monitoring.py.

◆ zEx

Scifi_monitoring.Scifi_trackEfficiency.zEx

Definition at line 530 of file Scifi_monitoring.py.

◆ zExVeto

Scifi_monitoring.Scifi_trackEfficiency.zExVeto

Definition at line 531 of file Scifi_monitoring.py.


The documentation for this class was generated from the following file: