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)
 
 minimizeMat (self, b="")
 
 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 111 of file ScifiCTR.py.

111 def ExecuteEvent(self,event):
112 h = self.M.h
113 tag = self.tag
114 DetID2Key={}
115 for nHit in range(event.Digi_ScifiHits.GetEntries()):
116 DetID2Key[event.Digi_ScifiHits[nHit].GetDetectorID()] = nHit
117
118 for aTrack in self.M.Reco_MuonTracks:
119 if not aTrack.GetUniqueID()==1: continue
120 fitStatus = aTrack.getFitStatus()
121 if not fitStatus.isFitConverged(): continue
122 state = aTrack.getFittedState()
123 mom = state.getMom()
124 slopeX = mom.X()/mom.Z()
125 slopeY = mom.Y()/mom.Z()
126 sortedClusters={}
127#
128 pos = {}
129 for s in range(1, nStations+1): sortedClusters[s] = {'H':[],'V':[]}
130 for nM in range(aTrack.getNumPointsWithMeasurement()):
131 state = aTrack.getFittedState(nM)
132 Meas = aTrack.getPointWithMeasurement(nM)
133 W = Meas.getRawMeasurement()
134 clkey = W.getHitId()
135 aCl = self.M.trackTask.clusScifi[clkey]
136 aHit = event.Digi_ScifiHits[DetID2Key[aCl.GetFirst()]]
137 detID = aCl.GetFirst()
138 s = detID//1000000
139 aCl.GetPosition(A,B)
140 mat = (detID//10000)%10
141 if aHit.isVertical():
142 L = B[1]-state.getPos()[1]
143 sortedClusters[s]['V'].append( [clkey,L,B[0],state.getPos()[1],mat,(A[2]+B[2])/2.,state.getPos()[0],aCl.GetFirst(),aCl.GetTime()] )
144 rc = h['res'+str(s)+'V'].Fill( (A[0]+B[0])/2.-state.getPos()[0])
145 else:
146 L = A[0]-state.getPos()[0]
147 sortedClusters[s]['H'].append( [clkey,L,A[1],state.getPos()[0],mat,(A[2]+B[2])/2.,state.getPos()[1],aCl.GetFirst(),aCl.GetTime()] )
148 rc = h['res'+str(s)+'H'].Fill( (A[1]+B[1])/2.-state.getPos()[1])
149 # find station with exactly 1 x and 1 y cluster:
150 for s in range(1, nStations+1):
151 if not (len(sortedClusters[s]['V']) * len(sortedClusters[s]['H']) ) ==1: continue
152 timeCorr = {}
153 for proj in ['V','H']:
154 clkey = sortedClusters[s][proj][0][0]
155 aCl = self.M.trackTask.clusScifi[clkey]
156 L = sortedClusters[s][proj][0][1]
157 rc = h['extrap'+str(s)+proj].Fill(abs(L))
158 time = aCl.GetTime() # Get time in ns, use fastest TDC of cluster
159 if M.options.check: time = self.M.Scifi.GetCorrectedTime(aCl.GetFirst(),aCl.GetTime(),0)
160 mat = sortedClusters[s][proj][0][4]
161 sipm_array = int(sortedClusters[s][proj][0][7]/1000)%10
162 sipm_channel = sortedClusters[s][proj][0][7]%1000
163 if channelTimeAlignment==1 and s==2 and proj=='H':# apply the corrections per channel
164 time-= self.tdcScifiStationCalib[s][1][proj][1][sipm_array][sipm_channel]
165 time-= self.tdcScifiStationCalib[s][1][proj][mat]
166 time-= self.tdcScifiStationCalib[s][0]
167 timeCorr[proj] = time - abs(L)/self.V
168 # print(s,proj,time,L,L/self.V)
169 dt = timeCorr['H'] - timeCorr['V']
170 rc = h['CTR_Scifi'+str(s)+tag].Fill(dt)
171 for proj in ['V','H']:
172 if proj=='V': o=1
173 else: o=0
174 if channelTimeAlignment==1 and s==2 and proj=='H': # plots for the corrections per channel
175 rc = h['CTR_ScifiMat'+str(sortedClusters[s][proj][0][7])+tag].Fill(dt)
176 rc=h['dT_posxV'+str(s)+tag].Fill(sortedClusters[s]['V'][0][6],dt)
177 rc=h['dT_posxH'+str(s)+tag].Fill(sortedClusters[s]['H'][0][3],dt)
178 rc=h['dT_posyH'+str(s)+tag].Fill(sortedClusters[s]['H'][0][6], dt)
179 rc=h['dT_posyV'+str(s)+tag].Fill(sortedClusters[s]['V'][0][3], dt)
180 rc=h['CTR_timeH_posy_Scifi'+str(s)+tag].Fill(sortedClusters[s]['H'][0][6], sortedClusters[s][proj][0][8])
181 rc=h['CTR_timeV_posy_Scifi'+str(s)+tag].Fill(sortedClusters[s]['V'][0][3],sortedClusters[s][proj][0][8])
182
183 matH,matV = sortedClusters[s]['H'][0][4],sortedClusters[s]['V'][0][4]
184 rc = h['CTR_Scifi'+str(100*s+10*matH+matV)+tag].Fill(dt)
185 if abs(slopeX)<0.1 and abs(slopeY)<0.1:
186 rc = h['CTR_Scifi_beam'+str(s)+tag].Fill(dt)
187 rc = h['CTR_Scifi_beam'+str(100*s+10*matH+matV)+tag].Fill(dt)
188 dR = sortedClusters[s]['V'][0][2] - sortedClusters[s]['H'][0][3]
189 rc = h['resX'+str(s)+'V'].Fill(dR)
190 dR = sortedClusters[s]['H'][0][2]-sortedClusters[s]['V'][0][3]
191 rc = h['resX'+str(s)+'H'].Fill(dR)
192
193 if tag!='v0' and tag!='v0prime':
194 stationTimes = {}
195 for s in range(1, nStations+1):
196 if not (len(sortedClusters[s]['V']) * len(sortedClusters[s]['H']) ) ==1: continue
197 sTime = 0
198 for proj in ['V','H']:
199 clkey = sortedClusters[s][proj][0][0]
200 aCl = self.M.trackTask.clusScifi[clkey]
201 L = sortedClusters[s][proj][0][1]
202 time = aCl.GetTime() # Get time in ns, use fastest TDC of cluster
203 if M.options.check: time = self.M.Scifi.GetCorrectedTime(aCl.GetFirst(),aCl.GetTime(),0)
204 mat = sortedClusters[s][proj][0][4]
205 time-= self.tdcScifiStationCalib[s][1][proj][mat]
206 time-= self.tdcScifiStationCalib[s][0]
207 time-= abs(L)/self.V
208 sTime += time
209 stationTimes[s] = [sTime/2.,(sortedClusters[s]['H'][0][5] + sortedClusters[s]['V'][0][5])/2.]
210 for s1 in range(1, nStations):
211 if not s1 in stationTimes: continue
212 for s2 in range(s1+1, nStations+1):
213 if not s2 in stationTimes: continue
214 dT = stationTimes[s2][0] - stationTimes[s1][0]
215# correct for slope
216 dZ = stationTimes[s2][1] - stationTimes[s1][1]
217 dL = dZ * ROOT.TMath.Sqrt( slopeX**2+slopeY**2+1 )
218 if slopeY>0.1: dL = -dL # cosmics from the back
219 dT -= dL / u.speedOfLight
220 rc = h['CTR_ScifiStation'+str(s1*10+s2)+tag].Fill(dT)
221 if abs(slopeX)<0.1 and abs(slopeY)<0.1:
222 rc = h['CTR_ScifiStation_beam'+str(s1*10+s2)+tag].Fill(dT)
223
Double_t GetCorrectedTime(Int_t fDetectorID, Double_t rawTime, Double_t L)
Definition Scifi.cxx:614

◆ ExtractMeanAndSigma()

ScifiCTR.Scifi_CTR.ExtractMeanAndSigma (   self)

Definition at line 299 of file ScifiCTR.py.

299 def ExtractMeanAndSigma(self):
300 self.meanAndSigma = {}
301 h = self.M.h
302 tag = self.tag
303 ut.bookHist(h,'cor')
304 for b in ['','_beam']:
305 self.meanAndSigma[b]={}
306 for s in range(1, nStations+1):
307 for matH in range(nMats):
308 for matV in range(nMats):
309 key = 100*s+10*matH+matV
310 histo = h['CTR_Scifi'+b+str(key)+tag]
311 Fun = histo.GetFunction('gaus')
312 self.meanAndSigma[b][key] = [Fun.GetParameter(1),Fun.GetParameter(2)]
313

◆ 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 ut.bookHist(h,'dT_posxV'+str(s)+tag,'; x [cm]; dt [ns]',100,-50.,-30., 100,-5.,5.)
62 ut.bookHist(h,'dT_posxH'+str(s)+tag,'; x [cm]; dt [ns]',100,-50.,-30., 100,-5.,5.)
63 ut.bookHist(h,'dT_posyH'+str(s)+tag,'; y [cm]; dt [ns]',100,35,55., 100,-5.,5.)
64 ut.bookHist(h,'dT_posyV'+str(s)+tag,'; y [cm]; dt [ns]',100,35,55., 100,-5.,5.)
65 ut.bookHist(h,'CTR_timeH_posy_Scifi'+str(s)+tag,'CTR '+str(s)+tag+'; y [cm]; cluster time [ns]; ',100,35,55,100,-5.,15.)
66 ut.bookHist(h,'CTR_timeV_posy_Scifi'+str(s)+tag,'CTR '+str(s)+tag+'; y [cm]; cluster time [ns]; ',100,35,55,100,-5.,15.)
67
68 for matH in range(nMats):
69 for matV in range(nMats):
70 ut.bookHist(h,'CTR_Scifi'+str(s*100+10*matH+matV)+tag,'CTR '+str(s)+tag+'; dt [ns]; ',100,-5.,5.)
71 ut.bookHist(h,'CTR_Scifi_beam'+str(s*100+10*matH+matV)+tag,'CTR beam'+str(s)+tag+'; dt [ns]; ',100,-5.,5.)
72
73 # For the testbeam 2024, perform time alignment per channel in Scifi 2H
74 if s==2 and channelTimeAlignment==1:
75 for arr in range(nSiPMArrays):
76 for chan in range(nChannelsPerSiPMArray):
77 detid = int(s*1e6+0*1e5+matH*1e4+arr*1e3+chan)
78 ut.bookHist(h,'CTR_ScifiMat'+str(detid)+tag,'CTR mat '+str(detid)+tag+'; dt [ns]; ',100,-5.,5.)
79
80 for p in self.projs:
81 ut.bookHist(h,'res'+str(s)+self.projs[p],'d; [cm]; ',100,-1.,1.)
82 ut.bookHist(h,'resX'+str(s)+self.projs[p],'d; [cm]; ',100,-1.,1.)
83 ut.bookHist(h,'extrap'+str(s)+self.projs[p],'SiPM distance; L [cm]; ',100,0.,50.)
84
85 for s1 in range(1, nStations):
86 for s2 in range(s1+1, nStations+1):
87 ut.bookHist(h,'CTR_ScifiStation'+str(s1*10+s2)+tag,'CTR station'+str(s1*10+s2)+'; dt [ns]; ',100,-5.,5.)
88 ut.bookHist(h,'CTR_ScifiStation_beam'+str(s1*10+s2)+tag,'CTR station beam'+str(s1*10+s2)+'; dt [ns]; ',100,-5.,5.)
89
90 if channelTimeAlignment==1 and tag == "v0prime":
91 self.tdcScifiStationCalib = {}
92 for s in range(1, nStations+1):
93 if nMats == 1 :
94 self.tdcScifiStationCalib[s] = [0,{'H': [0, {arr: {ch: 0 for ch in range(nChannelsPerSiPMArray)} for arr in range(nSiPMArrays)},],\
95 'V': [0, {arr: {ch: 0 for ch in range(nChannelsPerSiPMArray)} for arr in range(nSiPMArrays)},],},]
96 if nMats == 3:
97 self.tdcScifiStationCalib[s] = [0,{'H':{0:0,1:0,2:0},'V':{0:0,1:0,2:0}}]
98 elif channelTimeAlignment==0 and tag == "v0":
99 self.tdcScifiStationCalib = {}
100 for s in range(1, nStations+1):
101 if nMats == 1 :
102 self.tdcScifiStationCalib[s] = [0,{'H':{0:0},'V':{0:0}}]
103 if nMats == 3:
104 self.tdcScifiStationCalib[s] = [0,{'H':{0:0,1:0,2:0},'V':{0:0,1:0,2:0}}]
105 else:
106 with open('ScifiTimeAlignment_'+self.tag, 'rb') as fh:
107 self.tdcScifiStationCalib = pickle.load(fh)
108
109 self.V = M.Scifi.GetConfParF("Scifi/signalSpeed")
110

◆ minimize()

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

Definition at line 339 of file ScifiCTR.py.

339 def minimize(self,b=""):
340 h = self.M.h
341 self.ExtractMeanAndSigma()
342 ut.bookHist(h,'commonBlock','',100,0.,100.)
343
344 for s in range(1, nStations+1):
345 for matH in range(nMats):
346 for matV in range(nMats):
347 key = 100*s+10*matH+matV
348 dt = self.meanAndSigma[b][key][0]
349 h['commonBlock'].SetBinContent(matH*10+matV,dt)
350 npar = 2*nMats
351 ierflg = ctypes.c_int(0)
352 vstart = array('d',[0]*npar)
353 gMinuit = ROOT.TMinuit(npar)
354 gMinuit.SetFCN(FCN)
355 gMinuit.SetErrorDef(1.0)
356 gMinuit.SetMaxIterations(10000)
357 err = 1E-3
358 p = 0
359 for proj in ['H','V']:
360 for m in range(nMats):
361 name = "s"+str(s)+proj+str(m)
362 gMinuit.mnparm(p, name, vstart[p], err, 0.,0.,ierflg)
363 p+=1
364 gMinuit.FixParameter(0)
365 strat = array('d',[0])
366 gMinuit.mnexcm("SET STR",strat,1,ierflg) # 0 faster, 2 more reliable
367 gMinuit.mnexcm("SIMPLEX",vstart,npar,ierflg)
368 gMinuit.mnexcm("MIGRAD",vstart,npar,ierflg)
369
370 cor = ctypes.c_double(0)
371 ecor = ctypes.c_double(0)
372 p = 0
373 for proj in ['H','V']:
374 for m in range(nMats):
375 rc = gMinuit.GetParameter(p,cor,ecor)
376 p+=1
377 self.tdcScifiStationCalib[s][1][proj][m] = cor.value
378
379 with open('ScifiTimeAlignment_v1', 'wb') as fh:
380 pickle.dump(self.tdcScifiStationCalib, fh)
381

◆ minimizeMat()

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

Definition at line 314 of file ScifiCTR.py.

314 def minimizeMat(self,b=""):
315 h = self.M.h
316 tag = self.tag
317 ut.bookHist(h,'commonBlock_mat','',4000,0.,4000.)
318
319 for s in range(1, nStations+1):
320 for proj in ['H', 'V']:
321 # only done for SciFi 2H in the tb_24 setup
322 if s!=2 or proj!='H': continue
323 if proj=='H': o=0
324 else: o=1
325 for mat in range(nMats):
326 for arr in range(nSiPMArrays):
327 for chan in range(nChannelsPerSiPMArray):
328 key = int(1e6*s+1e5*o+1e4*mat+1e3*arr+chan)
329 histo = h[ 'CTR_ScifiMat'+str(key)+tag]# was here
330 if histo.GetEntries()==0: continue
331 dt=histo.GetMean()
332 h['commonBlock_mat'].SetBinContent(1000*arr+chan,dt)
333 self.tdcScifiStationCalib[s][1][proj][1][arr][chan]=dt
334 print('corrections', proj, arr, chan, self.tdcScifiStationCalib[s][1][proj][1][arr][chan])
335
336 with open('ScifiTimeAlignment_v0', 'wb') as fh:
337 pickle.dump(self.tdcScifiStationCalib, fh)
338

◆ minimizeStation()

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

Definition at line 382 of file ScifiCTR.py.

382 def minimizeStation(self,b=""):
383 h = self.M.h
384 tag = self.tag
385 self.meanAndSigmaStation = {}
386 self.meanAndSigmaStation[b]={}
387 for s1 in range(1, nStations+1):
388 for s2 in range(s1+1, nStations+1):
389 key = s1*10+s2
390 histo = h[ 'CTR_ScifiStation'+b+str(key)+tag]
391 Fun = histo.GetFunction('gaus')
392 self.meanAndSigmaStation[b][key] = [Fun.GetParameter(1),Fun.GetParameter(2)]
393 for s1 in range(1, nStations+1):
394 for s2 in range(s1+1, nStations+1):
395 key = 10*s1+s2
396 dt = self.meanAndSigmaStation[b][key][0]
397 h['commonBlock'].SetBinContent(key,dt)
398 npar = nStations
399 ierflg = ctypes.c_int(0)
400 vstart = array('d',[0]*npar)
401 gMinuit = ROOT.TMinuit(npar)
402 gMinuit.SetFCN(FCNS)
403 gMinuit.SetErrorDef(1.0)
404 gMinuit.SetMaxIterations(10000)
405 err = 1E-3
406 p = 0
407 for s in range(1, nStations+1):
408 name = "station"+str(s)
409 gMinuit.mnparm(p, name, vstart[p], err, 0.,0.,ierflg)
410 p+=1
411 gMinuit.FixParameter(0)
412 strat = array('d',[0])
413 gMinuit.mnexcm("SET STR",strat,1,ierflg) # 0 faster, 2 more reliable
414 gMinuit.mnexcm("SIMPLEX",vstart,npar,ierflg)
415 gMinuit.mnexcm("MIGRAD",vstart,npar,ierflg)
416
417 cor = ctypes.c_double(0)
418 ecor = ctypes.c_double(0)
419 for s in range(1, nStations+1):
420 rc = gMinuit.GetParameter(s-1,cor,ecor)
421 self.tdcScifiStationCalib[s][0] = cor.value
422
423 with open('ScifiTimeAlignment_v2', 'wb') as fh:
424 pickle.dump(self.tdcScifiStationCalib, fh)
425

◆ Plot()

ScifiCTR.Scifi_CTR.Plot (   self)

Definition at line 224 of file ScifiCTR.py.

224 def Plot(self):
225 h = self.M.h
226 tag = self.tag
227
228 if channelTimeAlignment==1:
229 for s in range(1, nStations+1):
230 for proj in ['H','V']:
231 if proj=='H': o=0
232 else: o=1
233 if s!=2 or proj!='H': continue
234 ut.bookCanvas(h,'CTR_mats'+str(s)+proj+tag,'CTR'+tag,1800,1200,32,16)
235 j=1
236 for mat in range(nMats):
237 for arr in range(nSiPMArrays):
238 for chan in range(nChannelsPerSiPMArray):
239 tc = h['CTR_mats'+str(s)+proj+tag].cd(j)
240 j+=1
241 histo = h['CTR_ScifiMat'+str(int(1e6*s+1e5*o+1e4*mat+1e3*arr+chan))+tag]
242 if 1: #histo.GetEntries()>3:
243 histo.Draw()
244
245 if tag!='v0prime':
246 for b in ['','_beam']:
247 ut.bookCanvas(h,'CTR'+b+tag,'CTR'+tag,1800,1200,3,2)
248 for s in range(1, nStations+1):
249 tc = h['CTR'+b+tag].cd(s)
250 histo = h['CTR_Scifi'+b+str(s)+tag]
251 rc = histo.Fit('gaus','SQ')
252 tc.Update()
253 stats = histo.FindObject('stats')
254 stats.SetOptFit(1111111)
255 stats.SetX1NDC(0.62)
256 stats.SetY1NDC(0.63)
257 stats.SetX2NDC(0.98)
258 stats.SetY2NDC(0.94)
259 histo.Draw()
260
261 for s in range(1, nStations+1):
262 ut.bookCanvas(h,'CTRM'+str(s)+b+tag,'CTR per mat combi',1800,1200,3,3)
263 j = 1
264 for matH in range(nMats):
265 for matV in range(nMats):
266 tc = h['CTRM'+str(s)+b+tag].cd(j)
267 j+=1
268 histo = h['CTR_Scifi'+b+str(100*s+10*matH+matV)+tag]
269 histo.Fit('gaus','SQ')
270 tc.Update()
271 stats = histo.FindObject('stats')
272 stats.SetOptFit(1111111)
273 stats.SetX1NDC(0.62)
274 stats.SetY1NDC(0.63)
275 stats.SetX2NDC(0.98)
276 stats.SetY2NDC(0.94)
277 histo.Draw()
278
279 if tag!='v0':
280 for b in ['','_beam']:
281 ut.bookCanvas(h,'CTRS'+b,'CTR per station combination'+tag,1800,1200,5,2)
282 k=1
283 for s1 in range(1, nStations):
284 for s2 in range(s1+1, nStations+1):
285 tc = h['CTRS'+b].cd(k)
286 k+=1
287 histo = h['CTR_ScifiStation'+b+str(s1*10+s2)+tag]
288 histo.Draw()
289 histo.Fit('gaus','SQ')
290 tc.Update()
291 stats = histo.FindObject('stats')
292 stats.SetOptFit(1111111)
293 stats.SetX1NDC(0.62)
294 stats.SetY1NDC(0.63)
295 stats.SetX2NDC(0.98)
296 stats.SetY2NDC(0.94)
297 histo.Draw()
298

Member Data Documentation

◆ M

ScifiCTR.Scifi_CTR.M

Definition at line 46 of file ScifiCTR.py.

◆ meanAndSigma

ScifiCTR.Scifi_CTR.meanAndSigma

Definition at line 300 of file ScifiCTR.py.

◆ meanAndSigmaStation

ScifiCTR.Scifi_CTR.meanAndSigmaStation

Definition at line 385 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 91 of file ScifiCTR.py.

◆ V

ScifiCTR.Scifi_CTR.V

Definition at line 109 of file ScifiCTR.py.


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