537 def ExecuteEvent(self,event):
538 vetoHitsFromPrev = 0
539 if event.EventHeader.GetRunId() < 6204 and event.EventHeader.GetRunId() > 5480: vetoHitsFromPrev = 5
540
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)
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
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
595 ok = False
596 for detID in vetoHits:
598
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
633
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
650 if self.unbiased:
651
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
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
721 self.M.trackTask.maskPlane = -1
722 self.M.trackTask.fittedTracks.Delete()
723
void GetPosition(Int_t id, TVector3 &vLeft, TVector3 &vRight)