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

Public Member Functions

 Init (self, monitor)
 
 ExecuteEvent (self, event)
 
 Plot (self)
 
 ExtractMeanAndSigma (self)
 
 minimize (self, b="")
 
 minimizeStation (self, b="")
 

Public Attributes

 M
 
 projs
 
 snd_geo
 
 MuFilter
 
 Scifi
 
 tag
 
 tdcScifiStationCalib
 
 V
 
 meanAndSigma
 
 meanAndSigmaStation
 

Detailed Description

Definition at line 43 of file ScifiCTR.py.

Member Function Documentation

◆ ExecuteEvent()

ScifiCTR.Scifi_CTR.ExecuteEvent (   self,
  event 
)

Definition at line 90 of file ScifiCTR.py.

90 def ExecuteEvent(self,event):
91 h = self.M.h
92 tag = self.tag
93 DetID2Key={}
94 for nHit in range(event.Digi_ScifiHits.GetEntries()):
95 DetID2Key[event.Digi_ScifiHits[nHit].GetDetectorID()] = nHit
96
97 for aTrack in self.M.Reco_MuonTracks:
98 if not aTrack.GetUniqueID()==1: continue
99 fitStatus = aTrack.getFitStatus()
100 if not fitStatus.isFitConverged(): continue
101 state = aTrack.getFittedState()
102 mom = state.getMom()
103 slopeX = mom.X()/mom.Z()
104 slopeY = mom.Y()/mom.Z()
105 sortedClusters={}
106#
107 pos = {}
108 for s in range(1, nStations+1): sortedClusters[s] = {'H':[],'V':[]}
109 for nM in range(aTrack.getNumPointsWithMeasurement()):
110 state = aTrack.getFittedState(nM)
111 Meas = aTrack.getPointWithMeasurement(nM)
112 W = Meas.getRawMeasurement()
113 clkey = W.getHitId()
114 aCl = self.M.trackTask.clusScifi[clkey]
115 aHit = event.Digi_ScifiHits[DetID2Key[aCl.GetFirst()]]
116 s = aCl.GetFirst()//1000000
117 aCl.GetPosition(A,B)
118 mat = (aCl.GetFirst()//10000)%10
119 if aHit.isVertical():
120 L = B[1]-state.getPos()[1]
121 sortedClusters[s]['V'].append( [clkey,L,B[0],state.getPos()[1],mat,(A[2]+B[2])/2.] )
122 rc = h['res'+str(s)+'V'].Fill( (A[0]+B[0])/2.-state.getPos()[0])
123 else:
124 L = A[0]-state.getPos()[0]
125 sortedClusters[s]['H'].append( [clkey,L,A[1],state.getPos()[0],mat,(A[2]+B[2])/2.] )
126 rc = h['res'+str(s)+'H'].Fill( (A[1]+B[1])/2.-state.getPos()[1])
127 # find station with exactly 1 x and 1 y cluster:
128 for s in range(1, nStations+1):
129 if not (len(sortedClusters[s]['V']) * len(sortedClusters[s]['H']) ) ==1: continue
130 timeCorr = {}
131 for proj in ['V','H']:
132 clkey = sortedClusters[s][proj][0][0]
133 aCl = self.M.trackTask.clusScifi[clkey]
134 L = sortedClusters[s][proj][0][1]
135 rc = h['extrap'+str(s)+proj].Fill(abs(L))
136 time = aCl.GetTime() # Get time in ns, use fastest TDC of cluster
137 if M.options.check: time = self.M.Scifi.GetCorrectedTime(aCl.GetFirst(),aCl.GetTime(),0)
138 mat = sortedClusters[s][proj][0][4]
139 time-= self.tdcScifiStationCalib[s][1][proj][mat]
140 time-= self.tdcScifiStationCalib[s][0]
141 timeCorr[proj] = time - abs(L)/self.V
142 # print(s,proj,time,L,L/self.V)
143 dt = timeCorr['H'] - timeCorr['V']
144 rc = h['CTR_Scifi'+str(s)+tag].Fill(dt)
145 matH,matV = sortedClusters[s]['H'][0][4],sortedClusters[s]['V'][0][4]
146 rc = h['CTR_Scifi'+str(100*s+10*matH+matV)+tag].Fill(dt)
147 if abs(slopeX)<0.1 and abs(slopeY)<0.1:
148 rc = h['CTR_Scifi_beam'+str(s)+tag].Fill(dt)
149 rc = h['CTR_Scifi_beam'+str(100*s+10*matH+matV)+tag].Fill(dt)
150 dR = sortedClusters[s]['V'][0][2] - sortedClusters[s]['H'][0][3]
151 rc = h['resX'+str(s)+'V'].Fill(dR)
152 dR = sortedClusters[s]['H'][0][2]-sortedClusters[s]['V'][0][3]
153 rc = h['resX'+str(s)+'H'].Fill(dR)
154#
155 if tag!='v0':
156 stationTimes = {}
157 for s in range(1, nStations+1):
158 if not (len(sortedClusters[s]['V']) * len(sortedClusters[s]['H']) ) ==1: continue
159 sTime = 0
160 for proj in ['V','H']:
161 clkey = sortedClusters[s][proj][0][0]
162 aCl = self.M.trackTask.clusScifi[clkey]
163 L = sortedClusters[s][proj][0][1]
164 time = aCl.GetTime() # Get time in ns, use fastest TDC of cluster
165 if M.options.check: time = self.M.Scifi.GetCorrectedTime(aCl.GetFirst(),aCl.GetTime(),0)
166 mat = sortedClusters[s][proj][0][4]
167 time-= self.tdcScifiStationCalib[s][1][proj][mat]
168 time-= self.tdcScifiStationCalib[s][0]
169 time-= abs(L)/self.V
170 sTime += time
171 stationTimes[s] = [sTime/2.,(sortedClusters[s]['H'][0][5] + sortedClusters[s]['V'][0][5])/2.]
172 for s1 in range(1, nStations):
173 if not s1 in stationTimes: continue
174 for s2 in range(s1+1, nStations+1):
175 if not s2 in stationTimes: continue
176 dT = stationTimes[s2][0] - stationTimes[s1][0]
177# correct for slope
178 dZ = stationTimes[s2][1] - stationTimes[s1][1]
179 dL = dZ * ROOT.TMath.Sqrt( slopeX**2+slopeY**2+1 )
180 if slopeY>0.1: dL = -dL # cosmics from the back
181 dT -= dL / u.speedOfLight
182 rc = h['CTR_ScifiStation'+str(s1*10+s2)+tag].Fill(dT)
183 if abs(slopeX)<0.1 and abs(slopeY)<0.1:
184 rc = h['CTR_ScifiStation_beam'+str(s1*10+s2)+tag].Fill(dT)
185
Double_t GetCorrectedTime(Int_t fDetectorID, Double_t rawTime, Double_t L)
Definition Scifi.cxx:517

◆ ExtractMeanAndSigma()

ScifiCTR.Scifi_CTR.ExtractMeanAndSigma (   self)

Definition at line 242 of file ScifiCTR.py.

242 def ExtractMeanAndSigma(self):
243 self.meanAndSigma = {}
244 h = self.M.h
245 tag = self.tag
246 ut.bookHist(h,'cor')
247 for b in ['','_beam']:
248 self.meanAndSigma[b]={}
249 for s in range(1, nStations+1):
250 for matH in range(nMats):
251 for matV in range(nMats):
252 key = 100*s+10*matH+matV
253 histo = h['CTR_Scifi'+b+str(key)+tag]
254 Fun = histo.GetFunction('gaus')
255 self.meanAndSigma[b][key] = [Fun.GetParameter(1),Fun.GetParameter(2)]
256

◆ Init()

ScifiCTR.Scifi_CTR.Init (   self,
  monitor 
)

Definition at line 45 of file ScifiCTR.py.

45 def Init(self,monitor):
46 self.M = monitor
47 h = self.M.h
48 self.projs = {1:'V',0:'H'}
49
50 # setup geometry
51 if (options.geoFile).find('../')<0: self.snd_geo = SndlhcGeo.GeoInterface(options.path+options.geoFile)
52 else: self.snd_geo = SndlhcGeo.GeoInterface(options.geoFile[3:])
53 self.MuFilter = self.snd_geo.modules['MuFilter']
54 self.Scifi = self.snd_geo.modules['Scifi']
55
56 self.tag = monitor.iteration
57 tag = self.tag
58 for s in range(1, nStations+1):
59 ut.bookHist(h,'CTR_Scifi'+str(s)+tag,'CTR '+str(s)+tag+'; dt [ns]; ',100,-5.,5.)
60 ut.bookHist(h,'CTR_Scifi_beam'+str(s)+tag,'CTR beam'+str(s)+tag+'; dt [ns]; ',100,-5.,5.)
61 for matH in range(nMats):
62 for matV in range(nMats):
63 ut.bookHist(h,'CTR_Scifi'+str(s*100+10*matH+matV)+tag,'CTR '+str(s)+tag+'; dt [ns]; ',100,-5.,5.)
64 ut.bookHist(h,'CTR_Scifi_beam'+str(s*100+10*matH+matV)+tag,'CTR beam'+str(s)+tag+'; dt [ns]; ',100,-5.,5.)
65
66 for p in self.projs:
67 ut.bookHist(h,'res'+str(s)+self.projs[p],'d; [cm]; ',100,-1.,1.)
68 ut.bookHist(h,'resX'+str(s)+self.projs[p],'d; [cm]; ',100,-1.,1.)
69 ut.bookHist(h,'extrap'+str(s)+self.projs[p],'SiPM distance; L [cm]; ',100,0.,50.)
70
71 for s1 in range(1, nStations):
72 for s2 in range(s1+1, nStations+1):
73 ut.bookHist(h,'CTR_ScifiStation'+str(s1*10+s2)+tag,'CTR station'+str(s1*10+s2)+'; dt [ns]; ',100,-5.,5.)
74 ut.bookHist(h,'CTR_ScifiStation_beam'+str(s1*10+s2)+tag,'CTR station beam'+str(s1*10+s2)+'; dt [ns]; ',100,-5.,5.)
75
76 if self.tag == "v0":
77 self.tdcScifiStationCalib = {}
78 for s in range(1, nStations+1):
79 if nMats == 1 :
80 self.tdcScifiStationCalib[s] = [0,{'H':{0:0},'V':{0:0}}]
81 if nMats == 3:
82 self.tdcScifiStationCalib[s] = [0,{'H':{0:0,1:0,2:0},'V':{0:0,1:0,2:0}}]
83
84 else:
85 with open('ScifiTimeAlignment_'+self.tag, 'rb') as fh:
86 self.tdcScifiStationCalib = pickle.load(fh)
87
88 self.V = M.Scifi.GetConfParF("Scifi/signalSpeed")
89

◆ minimize()

ScifiCTR.Scifi_CTR.minimize (   self,
  b = "" 
)

Definition at line 257 of file ScifiCTR.py.

257 def minimize(self,b=""):
258 h = self.M.h
259 self.ExtractMeanAndSigma()
260 ut.bookHist(h,'commonBlock','',100,0.,100.)
261
262 for s in range(1, nStations+1):
263 for matH in range(nMats):
264 for matV in range(nMats):
265 key = 100*s+10*matH+matV
266 dt = self.meanAndSigma[b][key][0]
267 h['commonBlock'].SetBinContent(matH*10+matV,dt)
268 npar = 2*nMats
269 ierflg = ctypes.c_int(0)
270 vstart = array('d',[0]*npar)
271 gMinuit = ROOT.TMinuit(npar)
272 gMinuit.SetFCN(FCN)
273 gMinuit.SetErrorDef(1.0)
274 gMinuit.SetMaxIterations(10000)
275 err = 1E-3
276 p = 0
277 for proj in ['H','V']:
278 for m in range(nMats):
279 name = "s"+str(s)+proj+str(m)
280 gMinuit.mnparm(p, name, vstart[p], err, 0.,0.,ierflg)
281 p+=1
282 gMinuit.FixParameter(0)
283 strat = array('d',[0])
284 gMinuit.mnexcm("SET STR",strat,1,ierflg) # 0 faster, 2 more reliable
285 gMinuit.mnexcm("SIMPLEX",vstart,npar,ierflg)
286 gMinuit.mnexcm("MIGRAD",vstart,npar,ierflg)
287
288 cor = ctypes.c_double(0)
289 ecor = ctypes.c_double(0)
290 p = 0
291 for proj in ['H','V']:
292 for m in range(nMats):
293 rc = gMinuit.GetParameter(p,cor,ecor)
294 p+=1
295 self.tdcScifiStationCalib[s][1][proj][m] = cor.value
296
297 with open('ScifiTimeAlignment_v1', 'wb') as fh:
298 pickle.dump(self.tdcScifiStationCalib, fh)
299

◆ minimizeStation()

ScifiCTR.Scifi_CTR.minimizeStation (   self,
  b = "" 
)

Definition at line 300 of file ScifiCTR.py.

300 def minimizeStation(self,b=""):
301 h = self.M.h
302 tag = self.tag
303 self.meanAndSigmaStation = {}
304 self.meanAndSigmaStation[b]={}
305 for s1 in range(1, nStations+1):
306 for s2 in range(s1+1, nStations+1):
307 key = s1*10+s2
308 histo = h[ 'CTR_ScifiStation'+b+str(key)+tag]
309 Fun = histo.GetFunction('gaus')
310 self.meanAndSigmaStation[b][key] = [Fun.GetParameter(1),Fun.GetParameter(2)]
311 for s1 in range(1, nStations+1):
312 for s2 in range(s1+1, nStations+1):
313 key = 10*s1+s2
314 dt = self.meanAndSigmaStation[b][key][0]
315 h['commonBlock'].SetBinContent(key,dt)
316 npar = 5
317 ierflg = ctypes.c_int(0)
318 vstart = array('d',[0,-0.3365,-0.975,0.11,0.239])
319 gMinuit = ROOT.TMinuit(npar)
320 gMinuit.SetFCN(FCNS)
321 gMinuit.SetErrorDef(1.0)
322 gMinuit.SetMaxIterations(10000)
323 err = 1E-3
324 p = 0
325 for s in range(1, nStations+1):
326 name = "station"+str(s)
327 gMinuit.mnparm(p, name, vstart[p], err, 0.,0.,ierflg)
328 p+=1
329 gMinuit.FixParameter(0)
330 strat = array('d',[0])
331 gMinuit.mnexcm("SET STR",strat,1,ierflg) # 0 faster, 2 more reliable
332 gMinuit.mnexcm("SIMPLEX",vstart,npar,ierflg)
333 gMinuit.mnexcm("MIGRAD",vstart,npar,ierflg)
334
335 cor = ctypes.c_double(0)
336 ecor = ctypes.c_double(0)
337 for s in range(1, nStations+1):
338 rc = gMinuit.GetParameter(s-1,cor,ecor)
339 self.tdcScifiStationCalib[s][0] = cor.value
340
341 with open('ScifiTimeAlignment_v2', 'wb') as fh:
342 pickle.dump(self.tdcScifiStationCalib, fh)
343

◆ Plot()

ScifiCTR.Scifi_CTR.Plot (   self)

Definition at line 186 of file ScifiCTR.py.

186 def Plot(self):
187 h = self.M.h
188 tag = self.tag
189 for b in ['','_beam']:
190 ut.bookCanvas(h,'CTR'+b+tag,'CTR'+tag,1800,1200,3,2)
191 for s in range(1, nStations+1):
192 tc = h['CTR'+b+tag].cd(s)
193 histo = h['CTR_Scifi'+b+str(s)+tag]
194 rc = histo.Fit('gaus','SQ')
195 tc.Update()
196 stats = histo.FindObject('stats')
197 stats.SetOptFit(1111111)
198 stats.SetX1NDC(0.62)
199 stats.SetY1NDC(0.63)
200 stats.SetX2NDC(0.98)
201 stats.SetY2NDC(0.94)
202 histo.Draw()
203
204 for s in range(1, nStations+1):
205 ut.bookCanvas(h,'CTRM'+str(s)+b+tag,'CTR per mat combi',1800,1200,3,3)
206 j = 1
207 for matH in range(nMats):
208 for matV in range(nMats):
209 tc = h['CTRM'+str(s)+b+tag].cd(j)
210 j+=1
211 histo = h['CTR_Scifi'+b+str(100*s+10*matH+matV)+tag]
212 histo.Fit('gaus','SQ')
213 tc.Update()
214 stats = histo.FindObject('stats')
215 stats.SetOptFit(1111111)
216 stats.SetX1NDC(0.62)
217 stats.SetY1NDC(0.63)
218 stats.SetX2NDC(0.98)
219 stats.SetY2NDC(0.94)
220 histo.Draw()
221
222 if tag!='v0':
223 for b in ['','_beam']:
224 ut.bookCanvas(h,'CTRS'+b,'CTR per station combination'+tag,1800,1200,5,2)
225 k=1
226 for s1 in range(1, nStations):
227 for s2 in range(s1+1, nStations+1):
228 tc = h['CTRS'+b].cd(k)
229 k+=1
230 histo = h['CTR_ScifiStation'+b+str(s1*10+s2)+tag]
231 histo.Draw()
232 histo.Fit('gaus','SQ')
233 tc.Update()
234 stats = histo.FindObject('stats')
235 stats.SetOptFit(1111111)
236 stats.SetX1NDC(0.62)
237 stats.SetY1NDC(0.63)
238 stats.SetX2NDC(0.98)
239 stats.SetY2NDC(0.94)
240 histo.Draw()
241

Member Data Documentation

◆ M

ScifiCTR.Scifi_CTR.M

Definition at line 46 of file ScifiCTR.py.

◆ meanAndSigma

ScifiCTR.Scifi_CTR.meanAndSigma

Definition at line 243 of file ScifiCTR.py.

◆ meanAndSigmaStation

ScifiCTR.Scifi_CTR.meanAndSigmaStation

Definition at line 303 of file ScifiCTR.py.

◆ MuFilter

ScifiCTR.Scifi_CTR.MuFilter

Definition at line 53 of file ScifiCTR.py.

◆ projs

ScifiCTR.Scifi_CTR.projs

Definition at line 48 of file ScifiCTR.py.

◆ Scifi

ScifiCTR.Scifi_CTR.Scifi

Definition at line 54 of file ScifiCTR.py.

◆ snd_geo

ScifiCTR.Scifi_CTR.snd_geo

Definition at line 51 of file ScifiCTR.py.

◆ tag

ScifiCTR.Scifi_CTR.tag

Definition at line 56 of file ScifiCTR.py.

◆ tdcScifiStationCalib

ScifiCTR.Scifi_CTR.tdcScifiStationCalib

Definition at line 77 of file ScifiCTR.py.

◆ V

ScifiCTR.Scifi_CTR.V

Definition at line 88 of file ScifiCTR.py.


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