219 def ExecuteEvent(self,event):
220 h = self.M.h
221 W = self.M.Weight
222 nav = self.nav
223 if not hasattr(event,"Cluster_Scifi"):
224 self.trackTask.scifiCluster()
225 clusters = self.trackTask.clusScifi
226 else:
227 clusters = event.Cluster_Scifi
228
229 MufiTracks = []
230 ScifiTracks = []
231 k = -1
232 for theTrack in self.M.Reco_MuonTracks:
233 k+=1
234 fitStatus = theTrack.getFitStatus()
235 if not fitStatus.isFitConverged(): continue
236 if theTrack.GetUniqueID()==1: ScifiTracks.append(k)
237 if theTrack.GetUniqueID()==3: MufiTracks.append(k)
238 if len(MufiTracks)==0 or len(ScifiTracks)==0: return
239 vetoHits = []
240 k = -1
241 for aHit in event.Digi_MuFilterHits:
242 k+=1
243 Minfo = self.M.MuFilter_PlaneBars(aHit.GetDetectorID())
244 s,l,bar = Minfo['station'],Minfo['plane'],Minfo['bar']
245 if s>1: continue
246 X = aHit.GetAllSignals()
247 if len(X)<5: continue
248 vetoHits.append(k)
249 xExTag,yExTag = -10000,-10000
250 for kMu in MufiTracks:
251 theTrack = self.M.Reco_MuonTracks[kMu]
252 fstate = theTrack.getFittedState()
253 posT,momT = fstate.getPos(),fstate.getMom()
254 slopeXT = momT.X()/momT.Z()
255 slopeYT = momT.Y()/momT.Z()
256 if not abs(slopeXT)<0.1 or not abs(slopeYT)<0.1: continue
257 lam = (self.zEx-posT.z())/momT.z()
258 yExTag = posT.y()+lam*momT.y()
259 xExTag = posT.x()+lam*momT.x()
260
261 if xExTag < -9000: return
262 ok = False
263 for k in vetoHits:
264 aHit = event.Digi_MuFilterHits[k]
266
267 lam = (self.zExVeto-posT.z())/momT.z()
268 xExV,yExV = posT.x()+lam*momT.x(),posT.y()+lam*momT.y()
269 pq = A-posT
270 uCrossv= (B-A).Cross(momT)
271 doca = pq.Dot(uCrossv)/uCrossv.Mag()
272 if abs(doca)<self.res:
273 ok=True
274 break
275 if not ok: return
276
277
278 theTrack = False
279 for theTrack in self.M.Reco_MuonTracks:
280 if theTrack.GetUniqueID()==1:
281 fitStatus = theTrack.getFitStatus()
282 if fitStatus.isFitConverged():
283 state = theTrack.getFittedState()
284 pos = state.getPos()
285 mom = state.getMom()
286 slopeX = mom.X()/mom.Z()
287 slopeY = mom.Y()/mom.Z()
288 rc = h[detector+'trackChi2/ndof'].Fill(fitStatus.getChi2()/(fitStatus.getNdf()+1E-10),fitStatus.getNdf())
289 '''
290 self.M.fillHist2(detector+'trackSlopes',slopeX*1000-pos.X()/48.2,slopeY*1000-pos.Y()/48.2)
291 self.M.fillHist2(detector+'trackSlopesXL',slopeX-pos.X()/48200,slopeY-pos.Y()/48200)
292 self.M.fillHist2(detector+'trackPos',pos.X(),pos.Y())
293 if abs(slopeX)<0.1 and abs(slopeY)<0.1: self.M.fillHist2(detector+'trackPosBeam',pos.X(),pos.Y())
294 '''
295
296 if not theTrack: return
297
298 sortedClusters={}
299 for aCl in clusters:
300 so = aCl.GetFirst()//100000
301 if not so in sortedClusters: sortedClusters[so]=[]
302 sortedClusters[so].append(aCl)
303
304 if len(sortedClusters)<10: return
305 goodEvent = True
306 for s in sortedClusters:
307 if len(sortedClusters[s])>3:
308 goodEvent=False
309 break
310 if not goodEvent: return
311
312 for s in range(1,6):
313 if self.unbiased:
314
315 hitlist = {}
316 if self.unbiased or s==1:
317 k=0
318 Nproj = {0:0,1:0}
319 for so in sortedClusters:
320 if so//10 == s and self.unbiased: continue
321 Nproj[so%2]+=1
322 for x in sortedClusters[so]:
323 hitlist[k] = x
324 k+=1
325 if Nproj[0]<3 or Nproj[1]<3: continue
326 theTrack = self.trackTask.fitTrack(hitlist)
327 if not hasattr(theTrack,"getFittedState"): continue
328
329 fitStatus = theTrack.getFitStatus()
330 if not fitStatus.isFitConverged():
331 theTrack.Delete()
332 continue
333
334 fstate = theTrack.getFittedState()
335 pos,mom = fstate.getPos(),fstate.getMom()
336 lam = (self.zExVeto-pos.z())/mom.z()
337 yEx = pos.y()+lam*mom.y()
338 xEx = pos.x()+lam*mom.x()
339 dx = xExTag-xEx
340 dy = yExTag-yEx
341 rc = h['dx'].Fill(dx)
342 rc = h['dy'].Fill(dy)
343 if abs(dy)>self.res or abs(dx)>self.res:
344 if self.unbiased: continue
345 else: break
346
347
348 for o in range(2):
349 testPlane = s*10+o
350 z = self.M.zPos['Scifi'][testPlane]
351 rep = ROOT.genfit.RKTrackRep(13)
352 state = ROOT.genfit.StateOnPlane(rep)
353
354 mClose = 0
355 mZmin = 999999.
356 for m in range(0,theTrack.getNumPointsWithMeasurement()):
357 st = ROOT.getFittedState(theTrack,m)
358 if not st: break
359 Pos = st.getPos()
360 if abs(z-Pos.z())<mZmin:
361 mZmin = abs(z-Pos.z())
362 mClose = m
363 if mZmin>10000:
364 print("something wrong here with measurements",mClose,mZmin,theTrack.getNumPointsWithMeasurement())
365 break
366 fstate = theTrack.getFittedState(mClose)
367 pos,mom = fstate.getPos(),fstate.getMom()
368 rep.setPosMom(state,pos,mom)
369 NewPosition = ROOT.TVector3(0., 0., z)
370 rep.extrapolateToPlane(state, NewPosition, parallelToZ )
371 pos = state.getPos()
372 xEx,yEx = pos.x(),pos.y()
373 rc = h['track_Scifi'+str(testPlane)].Fill(xEx,yEx,W)
374 for aCl in sortedClusters[testPlane]:
375 aCl.GetPosition(A,B)
376 detID = aCl.GetFirst()
377 channel = detID%1000 + ((detID%10000)//1000)*128 + (detID%100000//10000)*512
378
379 pq = A-pos
380 uCrossv= (B-A).Cross(mom)
381 doca = pq.Dot(uCrossv)/uCrossv.Mag()
382 rc = h['resC'+self.projs[o]+'_Scifi'+str(testPlane)].Fill(doca/u.um,channel,W)
383 rc = h['res'+self.projs[o]+'_Scifi'+str(testPlane)].Fill(doca/u.um,W)
384 rc = h['resX'+self.projs[o]+'_Scifi'+str(testPlane)].Fill(doca/u.um,xEx,W)
385 rc = h['resY'+self.projs[o]+'_Scifi'+str(testPlane)].Fill(doca/u.um,yEx,W)
386
387 if self.unbiased: theTrack.Delete()
388
389
void GetPosition(Int_t id, TVector3 &vLeft, TVector3 &vRight)