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

Public Member Functions

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

Public Attributes

 M
 
 trackTask
 
 V
 
 tdcScifiStationCalib
 

Detailed Description

Definition at line 426 of file ScifiCTR.py.

Member Function Documentation

◆ ExecuteEvent()

ScifiCTR.Scifi_TimeOfTracks.ExecuteEvent (   self,
  event 
)

Definition at line 438 of file ScifiCTR.py.

438 def ExecuteEvent(self,event):
439 h = self.M.h
440 for aTrack in self.M.Reco_MuonTracks:
441 if not aTrack.GetUniqueID()==1: continue
442 fitStatus = aTrack.getFitStatus()
443 if not fitStatus.isFitConverged(): continue
444 state = aTrack.getFittedState()
445 mom = state.getMom()
446 slopeX = mom.X()/mom.Z()
447 slopeY = mom.Y()/mom.Z()
448 sortedClusters={}
449 DetID2Key={}
450 for nHit in range(event.Digi_ScifiHits.GetEntries()):
451 DetID2Key[event.Digi_ScifiHits[nHit].GetDetectorID()] = nHit
452#
453 pos = {}
454 for s in range(1, nStations+1): sortedClusters[s] = {'H':[],'V':[]}
455 for nM in range(aTrack.getNumPointsWithMeasurement()):
456 state = aTrack.getFittedState(nM)
457 Meas = aTrack.getPointWithMeasurement(nM)
458 W = Meas.getRawMeasurement()
459 clkey = W.getHitId()
460 aCl = self.trackTask.clusScifi[clkey]
461 aHit = event.Digi_ScifiHits[DetID2Key[aCl.GetFirst()]]
462 s = aCl.GetFirst()//1000000
463 aCl.GetPosition(A,B)
464 mat = (aCl.GetFirst()//10000)%10
465
466 if aHit.isVertical():
467 L = B[1]-state.getPos()[1]
468 sortedClusters[s]['V'].append( [clkey,L,B[0],state.getPos()[1],mat,(A[2]+B[2])/2.,state.getPos()[0],aCl.GetFirst(),aCl.GetTime()] )
469 else:
470 L = A[0]-state.getPos()[0]
471 sortedClusters[s]['H'].append( [clkey,L,A[1],state.getPos()[0],mat,(A[2]+B[2])/2.,state.getPos()[1],aCl.GetFirst(),aCl.GetTime()] )
472 stationTimes = {}
473 for s in range(1, nStations+1):
474 if not (len(sortedClusters[s]['V']) * len(sortedClusters[s]['H']) ) ==1: continue
475 sTime = 0
476 for proj in ['V','H']:
477 clkey = sortedClusters[s][proj][0][0]
478 aCl = self.trackTask.clusScifi[clkey]
479 L = sortedClusters[s][proj][0][1]
480 time = aCl.GetTime() # Get time in ns, use fastest TDC of cluster
481 mat = sortedClusters[s][proj][0][4]
482 sipm_array = int(sortedClusters[s][proj][0][7]/1000)%10
483 sipm_channel = sortedClusters[s][proj][0][7]%1000
484 if channelTimeAlignment==1 and s==2 and proj=='H':# apply the corrections per channel
485 time-= self.tdcScifiStationCalib[s][1][proj][1][sipm_array][sipm_channel]
486 time-= self.tdcScifiStationCalib[s][1][proj][mat] # correct as function of station / projection / mat
487 time-= self.tdcScifiStationCalib[s][0] # internal station calibration
488 time-= abs(L)/self.V
489
490# cross check
491 # corTime = self.M.Scifi.GetCorrectedTime(aCl.GetFirst(),aCl.GetTime(),abs(L) )
492 # print('test',aCl.GetTime(),time,corTime)
493
494 sTime += time
495 stationTimes[s] = [sTime/2.,(sortedClusters[s]['H'][0][5] + sortedClusters[s]['V'][0][5])/2.]
496 # require station 1 to be present which defines T0
497 if not 1 in stationTimes: continue
498
499 T0 = stationTimes[1][0]
500 Z0 = stationTimes[1][1]
501 for s in stationTimes:
502 if s == 1: continue
503 dZ = stationTimes[s][1]-Z0
504 dT = stationTimes[s][0]-T0
505 dL = dZ * ROOT.TMath.Sqrt( slopeX**2+slopeY**2+1 )
506 # if slopeY>0.1: dL = -dL # cosmics from the back
507 # dT -= dL / u.speedOfLight
508 rc = h['dTvsZ'].Fill(dL,dT)
509 if abs(slopeX)<0.1 and abs(slopeY)<0.1:
510 rc = h['dTvsZ_beam'].Fill(dL,dT)
511
512
513

◆ Init()

ScifiCTR.Scifi_TimeOfTracks.Init (   self,
  monitor 
)

Definition at line 428 of file ScifiCTR.py.

428 def Init(self,monitor):
429 self.M = monitor
430 self.trackTask = self.M.FairTasks['simpleTracking']
431 h = self.M.h
432 self.V = M.Scifi.GetConfParF("Scifi/signalSpeed")
433 ut.bookHist(M.h,'dTvsZ','dT versus dL; dL/0.5cm [cm];dT/100ps [ns]',140,0.,70.,120,-6.,6.)
434 ut.bookHist(M.h,'dTvsZ_beam','dT versus dL, beam dL/0.5cm [cm];dT/100ps [ns]',140,0.,70.,120,-6.,6.)
435 with open('ScifiTimeAlignment_v2', 'rb') as fh:
436 self.tdcScifiStationCalib = pickle.load(fh)
437

◆ Plot()

ScifiCTR.Scifi_TimeOfTracks.Plot (   self)

Definition at line 514 of file ScifiCTR.py.

514 def Plot(self):
515 h = self.M.h
516 ut.bookCanvas(h,'Tscifi','',1800,1200,2,1)
517 h['Tscifi'].cd(1)
518 h['dTvsZ'].Draw('colz')
519 h['Tscifi'].cd(2)
520 h['dTvsZ_beam'].Draw('colz')
521

Member Data Documentation

◆ M

ScifiCTR.Scifi_TimeOfTracks.M

Definition at line 429 of file ScifiCTR.py.

◆ tdcScifiStationCalib

ScifiCTR.Scifi_TimeOfTracks.tdcScifiStationCalib

Definition at line 436 of file ScifiCTR.py.

◆ trackTask

ScifiCTR.Scifi_TimeOfTracks.trackTask

Definition at line 430 of file ScifiCTR.py.

◆ V

ScifiCTR.Scifi_TimeOfTracks.V

Definition at line 432 of file ScifiCTR.py.


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