6from argparse
import ArgumentParser
7parser = ArgumentParser()
8parser.add_argument(
"-f",
"--inputFile", dest=
"inputFile", help=
"single input file", required=
False, default=
"sndLHC.Ntuple-TGeant4_dig.root")
9parser.add_argument(
"-g",
"--geoFile", dest=
"geoFile", help=
"geofile", required=
False, default=
"geofile_full.Ntuple-TGeant4.root")
10parser.add_argument(
"-n",
"--nEvents", dest=
"nEvents", help=
"number of events to process", default=100000)
11parser.add_argument(
"-d",
"--Debug", dest=
"debug", help=
"debug", default=
False)
12parser.add_argument(
"-s",
"--start", dest=
"start", type=int,help=
"file name with $*$", required=
False,default=
False)
13parser.add_argument(
"-e",
"--end", dest=
"end", type=int,help=
"file name with $*$", required=
False,default=
False)
15options = parser.parse_args()
19fgeo = ROOT.TFile.Open(options.geoFile)
20from ShipGeoConfig
import ConfigRegistry
21from rootpyPickler
import Unpickler
24snd_geo = upkl.load(
'ShipGeo')
27import shipLHC_conf
as sndDet_conf
29run = ROOT.FairRunSim()
31run.SetSink(ROOT.FairRootFileSink(ROOT.TMemFile(
'output',
'recreate')))
32run.SetUserConfig(
"g4Config_basic.C")
33rtdb = run.GetRuntimeDb()
34modules = sndDet_conf.configure(run,snd_geo)
36nav = sGeo.GetCurrentNavigator()
37top = sGeo.GetTopVolume()
38scifi = modules[
'Scifi']
41ut.bookHist(h,
'S',
'stations',7,-0.5,6.5)
42ut.bookHist(h,
'O',
'orientation',7,-0.5,6.5)
43ut.bookHist(h,
'M',
'mat',7,-0.5,6.5)
44ut.bookHist(h,
'R',
'row',7,-0.5,6.5)
45ut.bookHist(h,
'N',
'fibre',1000,-0.5,999.5)
48 ut.bookHist(h,
'Sxy'+str(s),
'XY',50,-50.,0.,50,10.,60.)
52 ut.bookHist(h,
'N'+str(s)+str(o)+str(m)+str(r),
'fibre',1000,-0.5,999.5)
53ut.bookHist(h,
'E',
'dE',100,0.0,300.)
54ut.bookHist(h,
'Edigi_all',
'digitized signal',150,0.0,150.)
55ut.bookHist(h,
'Edigi',
'digitized valid signal',150,0.0,150.)
56ut.bookHist(h,
'Edigi_muon',
'digitized valid signal',150,0.0,150.)
57ut.bookHist(h,
'Ecluster',
'cluster energy',150,0.0,150.)
58ut.bookHist(h,
'clusterSize',
'cluster size',20,-0.5,19.5)
59ut.bookHist(h,
'clusterSize_muon',
'cluster size',20,-0.5,19.5)
60ut.bookHist(h,
'doca',
'closest distance;[micron]',100,-500.,500.)
61ut.bookHist(h,
'doca_muon',
'closest distance; [micron] ',100,-500.,500.)
62ut.bookHist(h,
'docaCl',
'closest distance;[micron]',100,-500.,500.)
63ut.bookHist(h,
'docaCl_muon',
'closest distance; [micron] ',100,-500.,500.)
64ut.bookHist(h,
'pangle',
'angle of particle entering;mrad',100,-10.,10.)
65ut.bookHist(h,
'pangle_muon',
'angle of particle entering;mrad',100,-10.,10.)
67ut.bookHist(h,
'pdoca_muon',
'closest distance',100,0.0,0.02)
68ut.bookHist(h,
'pdx_muon',
'closest distance',100,-0.02,0.02)
70ut.bookHist(h,
'nMCpoints',
'hits per event',5000,-0.5,4999.5)
71ut.bookHist(h,
'nDigihits',
'hits per event',5000,-0.5,4999.5)
72ut.bookHist(h,
'nDigihits_muon',
'hits per event directly from muon',100,-0.5,99.5)
73ut.bookHist(h,
'in_muon',
'p of incoming muon in Scifi',1000,0.0,2000.)
85 return tmp.Mag()/n.Mag()
92 dist = ROOT.TMath.Sqrt(ac.Mag2()+3*(ac.Dot(u))**2/u.Mag2())
94 dist = n.Dot(ac)/n.Mag()
101tchain = ROOT.TChain(
"cbmsim")
102if options.inputFile.find(
"XXX")<0:
103 tchain.Add(options.inputFile)
105 for i
in range(options.start,options.end+1):
106 aFile = options.inputFile.replace(
"XXX",str(i))
109for x
in h: h[x].Reset()
111 L = sTree.Digi_ScifiHits2MCPoints[0]
112 w = sTree.MCTrack[0].GetWeight()
114 rc = h[
'nMCpoints'].Fill(sTree.ScifiPoint.GetEntries(),w)
115 rc = h[
'nDigihits'].Fill(sTree.Digi_ScifiHits.GetEntries(),w)
118 for p
in sTree.ScifiPoint:
119 if p.GetDetectorID()==0:
122 rc = h[
'S'].Fill(p.station(),w)
123 rc = h[
'O'].Fill(p.orientation(),w)
124 rc = h[
'M'].Fill(p.mat(),w)
125 rc = h[
'R'].Fill(p.row(),w)
126 rc = h[
'N'].Fill(p.fibreN(),w)
127 rc = h[
'Sxy'+str(p.station())].Fill(p.GetX(),p.GetY(),w)
128 rc = h[
'N'+str(p.GetDetectorID()//1000)].Fill(p.fibreN(),w)
129 rc = h[
'E'].Fill(p.GetEnergyLoss()*1E6,w)
130 if p.GetTrackID()==0:
131 scifi.GetPosition(p.GetDetectorID(),A,B)
132 impactPoint = ROOT.TVector3(p.GetX(),p.GetY(),p.GetZ())
134 rc = h[
'pdoca_muon'].Fill(D)
135 if p.orientation()==1:
136 rc = h[
'pdx_muon'].Fill(A[0]-impactPoint[0])
138 rc = h[
'pdx_muon'].Fill(A[1]-impactPoint[1])
141 P = ROOT.TVector3(p.GetPx(),p.GetPy(),p.GetPz())
142 rc = h[
'in_muon'].Fill(P.Mag(),w)
145 for k
in range(sTree.Digi_ScifiHits.GetEntries()):
146 d = sTree.Digi_ScifiHits[k]
147 rc = h[
'Edigi_all'].Fill(d.GetEnergy())
148 if not d.isValid():
continue
149 rc = h[
'Edigi'].Fill(d.GetEnergy())
150 hitDict[d.GetDetectorID()] = k
152 for cl
in sTree.Cluster_Scifi:
153 rc = h[
'Ecluster'].Fill(cl.GetEnergy())
155 meanImpact = ROOT.TVector3(0,0,0)
157 first = cl.GetFirst()
159 for c
in range(first,cl_size+first):
163 scifiPoint = sTree.ScifiPoint[p[0]]
164 trackKey = scifiPoint.GetTrackID()
166 if not trackKey<0: pid = sTree.MCTrack[trackKey].GetPdgCode()
167 rc = h[
'pangle'].Fill(ROOT.TMath.ATan2(scifiPoint.GetPx(),scifiPoint.GetPz())*1000)
168 if abs(pid)==13: rc = h[
'pangle_muon'].Fill(ROOT.TMath.ATan2(scifiPoint.GetPx(),scifiPoint.GetPz())*1000)
169 if abs(pid)!=13: isMuon =
False
170 meanImpact+=ROOT.TVector3(scifiPoint.GetX(),scifiPoint.GetY(),scifiPoint.GetZ())
173 meanImpact=meanImpact*w
174 rc = h[
'clusterSize'].Fill(cl_size)
177 rc = h[
'clusterSize_muon'].Fill(cl_size)
178 for hitID
in range(first,first+cl_size):
179 d = sTree.Digi_ScifiHits[hitDict[hitID]]
180 r = h[
'Edigi_muon'].Fill(d.GetEnergy())
182 vertical =
int(first/100000)%10 == 1
184 locCluster = scifi.GetLocalPos(first,A)
185 locPart = scifi.GetLocalPos(first,meanImpact)
187 if vertical: delta = locCluster[0]-locPart[0]
188 else: delta = locCluster[1]-locPart[1]
189 rc = h[
'docaCl'].Fill(delta/u.um)
191 rc = h[
'docaCl_muon'].Fill(delta/u.um)
193 print(
'delta ',delta/u.um,cl_size)
198 for aHit
in range(first,cl_size+first):
199 scifi.GetSiPMPosition(aHit, A, B)
200 loc = scifi.GetLocalPos(aHit,A)
201 if vertical: delta = loc[0]-locPart[0]
202 else: delta = loc[1]-locPart[1]
203 rc = h[
'doca'].Fill(delta/u.um)
205 rc = h[
'doca_muon'].Fill(delta/u.um)
207 print(
'------------ ',aHit,delta/u.um)
209 if abs(delta/u.um) > docaMax: docaMax = abs(delta/u.um)
213 rc = h[
'nDigihits_muon'].Fill(NmuonHit,w)
217from array
import array
218loc = array(
'd',[0,0,0])
219glob = array(
'd',[0,0,0])
222 F = SciFiMapping.getFibre2SiPMCPP(modules)
224 print(
"================================================")
225 scifi.GetPosition(1011001,A,B)
226 print(
"horizontal mat")
229 print(
"vertical mat")
230 scifi.GetPosition(1111001,A,B)
234from array
import array
235class Tracking(ROOT.FairTask):
237 def InitTask(self,event):
238 geoMat = ROOT.genfit.TGeoMaterialInterface()
239 bfield = ROOT.genfit.ConstField(0,0,0)
240 fM = ROOT.genfit.FieldManager.getInstance()
242 ROOT.genfit.MaterialEffects.getInstance().init(geoMat)
243 ROOT.genfit.MaterialEffects.getInstance().setNoEffects()
244 self.fitter = ROOT.genfit.KalmanFitter()
245 self.fitter.setMaxIterations(50)
246 self.sigma_spatial = 100.*u.mu
250 def FinishEvent(self):
253 def ExecuteTask(self,option=''):
254 self.clusters = self.scifiCluster()
255 self.trackCandidates = self.patternReco()
256 self.event.fittedTracks = []
257 for aTrack
in self.trackCandidates:
258 rc = self.fitTrack(aTrack)
260 print(
'trackfit failed',rc,aTrack)
262 self.event.fittedTracks.append(aTrack)
264 def scifiCluster(self):
267 for k
in range(event.Digi_ScifiHits.GetEntries()):
268 d = event.Digi_ScifiHits[k]
269 if not d.isValid():
continue
270 hitDict[d.GetDetectorID()] = k
271 hitList = list(hitDict.keys())
277 last = len(hitList)-1
278 hitlist = ROOT.std.vector(
"sndScifiHit*")()
279 for i
in range(len(hitList)):
280 if i==0
and len(hitList)>1:
continue
284 if (c-cprev)!=1
or c==hitList[last]:
288 for aHit
in tmp: hitlist.push_back( event.Digi_ScifiHits[hitDict[aHit]])
289 aCluster = ROOT.sndCluster(first,N,hitlist)
290 clusters.append(aCluster)
301 for cl
in self.clusters:
303 trackCandidates.append(hitlist)
304 return trackCandidates
306 def fitTrack(hitlist):
311 posM = ROOT.TVector3(0, 0, 0.)
312 momM = ROOT.TVector3(0,0,100.)
315 covM = ROOT.TMatrixDSym(6)
316 res = self.sigma_spatial
317 for i
in range(3): covM[i][i] = res*res
318 for i
in range(3,6): covM[i][i] = ROOT.TMath.Power(res / (4.*2.) / ROOT.TMath.Sqrt(3), 2)
319 rep = ROOT.genfit.RKTrackRep(13)
322 state = ROOT.genfit.MeasuredStateOnPlane(rep)
323 rep.setPosMomCov(state, posM, momM, covM)
326 seedState = ROOT.TVectorD(6)
327 seedCov = ROOT.TMatrixDSym(6)
328 rep.get6DStateCov(state, seedState, seedCov)
329 theTrack = ROOT.genfit.Track(rep, seedState, seedCov)
334 A,B = ROOT.TVector3(),ROOT.TVector3()
335 for k
in range(hitlist):
337 detID = aHit.GetDetectorID()
340 tmp = array(
'd',[A[0],A[1],A[2],B[0],B[1],B[2],distance])
341 unSortedList[A[2]] = [ROOT.TVectorD(7,tmp),detID,k]
342 sorted_z=list(unSortedList.keys())
345 tp = ROOT.genfit.TrackPoint()
346 hitCov = ROOT.TMatrixDSym(7)
347 hitCov[6][6] = resolution*resolution
348 measurement = ROOT.genfit.WireMeasurement(unSortedList[z][0],hitCov,1,6,tp)
349 measurement.setMaxDistance(0.1)
350 measurement.setDetId(unSortedList[z][1])
351 measurement.setHitId(unSortedList[z][2])
352 tp.addRawMeasurement(measurement)
353 theTrack.insertPoint(tp)
354 if not theTrack.checkConsistency():
355 print(
"track not consistent")
359 self.fitter.processTrack(theTrack)
360 fitStatus = theTrack.getFitStatus()
361 if self.Debug: print(
"Fit result: converged chi2 Ndf",fitStatus.isFitConverged(),fitStatus.getChi2(),fitStatus.getNdf())
362 if not fitStatus.isFitConverged():
366 chi2 = fitStatus.getChi2()/fitStatus.getNdf()
367 fittedState = theTrack.getFittedState()
368 P = fittedState.getMomMag()
369 print(
"track fitted Ndf #Meas P",fitStatus.getNdf(), theTrack.getNumPointsWithMeasurement(),P)
370 for p
in theTrack.getPointsWithMeasurement():
371 rawM = p.getRawMeasurement()
372 info = p.getFitterInfo()
373 if not info:
continue
374 detID = rawM.getDetId()
375 print(detID,
"weights",info.getWeights()[0],info.getWeights()[1],fitStatus.getNdf())