23 from ROOT
import Belle2
24 from ROOT
import gROOT, AddressOf
25 import reconstruction
as reco
27 gROOT.ProcessLine(
'struct TrackData {\
30 float chiSquaredOverNdf;\
34 gROOT.ProcessLine(
'struct DEDXData {\
43 from ROOT
import TrackData, DEDXData
48 """A module to analyse residuals in overlaps of ladders."""
51 """Initialize the module"""
53 super(CosmicAnalysis, self).
__init__()
56 self.
rootfilerootfile = ROOT.TFile(
'cosmicAnalysis.root',
'recreate')
63 ROOT.gStyle.SetCanvasColor(0)
64 ROOT.gStyle.SetStatBorderSize(1)
65 ROOT.gStyle.SetStatColor(0)
66 ROOT.gStyle.SetTitleColor(1)
67 ROOT.gStyle.SetCanvasColor(0)
68 ROOT.gStyle.SetPadColor(0)
69 ROOT.gStyle.SetPadBorderMode(0)
70 ROOT.gStyle.SetCanvasBorderMode(0)
71 ROOT.gStyle.SetFrameBorderMode(0)
72 ROOT.gStyle.SetOptStat(0)
77 for key
in TrackData.__dict__:
80 if isinstance(self.
trackDatatrackData.__getattribute__(key), int):
82 self.
tree_tracktree_track.Branch(key, AddressOf(self.
trackDatatrackData, key), key + formstring)
86 for key
in DEDXData.__dict__:
89 if isinstance(self.
dedxDatadedxData.__getattribute__(key), int):
91 self.
tree_DEDXtree_DEDX.Branch(key, AddressOf(self.
dedxDatadedxData, key), key + formstring)
95 self.
HitsVsLayerHitsVsLayer = ROOT.TH2F(
'HitsVsLayer',
'', 6, 0.5, 6.5, 6, 0.5, 6.5)
97 self.
HitsVsSensorHitsVsSensor = ROOT.TH2F(
'HitsVsSensor',
'', 6, 0.5, 6.5, 5, 0.5, 5.5)
99 self.
LayerVsSensorLayerVsSensor = ROOT.TH2F(
'LayerVsSensor',
'', 6, 0.5, 6.5, 5, 0.5, 5.5)
101 self.
PXDClusterSizePXDClusterSize = ROOT.TH1F(
'PXDClusterSize',
'', 20, 0.5, 20.5)
103 self.
Chi2Chi2 = ROOT.TH1F(
'Chi2',
'', 300, 0.0, 500)
105 self.
NDFNDF = ROOT.TH1F(
'NDF',
'', 200, 0.0, 200)
107 self.
Chi2OverNDFChi2OverNDF = ROOT.TH1F(
'Chi2OverNDF',
'', 300, 0.0, 5)
109 self.
MomentumMomentum = ROOT.TH1F(
'Momentum',
'', 500, 0.0, 1000)
114 'ADCCountOverNumberOfHitsInCDCVsMomentum',
'', 200, 0.0, 300, 0.0, 1000)
117 'MomentumVsADCCountOverNumberOfHitsInCDC',
'', 100, 0.0, 100, 0.0, 1000)
123 """ Fill histograms """
127 nCDCDedxTracks = cdcDedxTracks.getEntries()
128 for DEDXTrack_index
in range(nCDCDedxTracks):
129 dedxTrack = cdcDedxTracks[DEDXTrack_index]
130 self.dedxData.momentumCDC = dedxTrack.getMomentum()
131 self.dedxData.acdCount = 0
133 self.dedxData.path = 0
134 self.dedxData.numberOfHits = dedxTrack.size()
136 nKLMClusters = KLMClusters.getEntries()
137 if nKLMClusters == 2:
138 for nHit
in range(dedxTrack.size()):
139 self.dedxData.acdCount = self.dedxData.acdCount + dedxTrack.getADCCount(nHit)
140 self.dedxData.dE = self.dedxData.dE + dedxTrack.getDE(nHit)
141 self.dedxData.path = self.dedxData.path + dedxTrack.getPath(nHit)
142 self.dedxData.distanceKLM = math.sqrt(
144 KLMClusters[0].getClusterPosition().Z() -
145 KLMClusters[1].getClusterPosition().Z(),
148 self.ADCCountOverNumberOfHitsInCDC.Fill(self.dedxData.acdCount / dedxTrack.size())
149 self.MomentumVsADCCountOverNumberOfHitsInCDC.Fill(
150 self.dedxData.momentumCDC, self.dedxData.acdCount / dedxTrack.size())
151 self.ADCCountOverNumberOfHitsInCDCVsMomentum.Fill(
152 self.dedxData.acdCount / dedxTrack.size(), self.dedxData.momentumCDC)
155 self.tree_DEDX.Fill()
159 nRecoTracks = RecoTracks.getEntries()
161 for track_index
in range(nRecoTracks):
162 track = RecoTracks[track_index]
164 if track.wasFitSuccessful():
167 nTrackFitResults = TrackFitResults.getEntries()
168 if nTrackFitResults == 1:
169 self.trackData.momentum = TrackFitResults[0].getMomentum().Mag()
170 self.Momentum.Fill(TrackFitResults[0].getMomentum().Mag())
172 if track.hasPXDHits()
or track.hasSVDHits():
174 if track.getNumberOfSVDHits() % 2 == 0:
175 totalNumberOfHits = track.getNumberOfPXDHits() + track.getNumberOfSVDHits() / 2
177 totalNumberOfHits = track.getNumberOfPXDHits() + (track.getNumberOfSVDHits() - 1) / 2
179 self.TotalNumberOfHits.Fill(totalNumberOfHits)
182 self.Chi2.Fill(track.getTrackFitStatus().getChi2())
183 self.NDF.Fill(track.getTrackFitStatus().getNdf())
184 self.Chi2OverNDF.Fill(track.getTrackFitStatus().getChi2() / track.getTrackFitStatus().getNdf())
186 self.trackData.chi2 = track.getTrackFitStatus().getChi2()
187 self.trackData.ndf = track.getTrackFitStatus().getNdf()
188 self.trackData.chiSquaredOverNdf = track.getTrackFitStatus().getChi2() / track.getTrackFitStatus().getNdf()
191 self.tree_track.Fill()
194 if track.hasPXDHits():
203 for n
in range(0, len(track.getPXDHitList())):
204 pxdHit = track.getPXDHitList()[n]
206 info = geoCache.get(sensorID)
207 layer = sensorID.getLayerNumber()
208 sensor = sensorID.getSensorNumber()
210 self.HitsVsLayer.Fill(totalNumberOfHits, layer)
211 self.HitsVsSensor.Fill(totalNumberOfHits, sensor)
212 self.LayerVsSensor.Fill(layer, sensor)
213 self.PXDClusterSize.Fill(track.getPXDHitList()[n].getSize())
216 if track.hasSVDHits():
225 for n
in range(0, len(track.getSVDHitList())):
226 svdHit = track.getSVDHitList()[n]
228 info = geoCache.get(sensorID)
229 layer = sensorID.getLayerNumber()
230 sensor = sensorID.getSensorNumber()
232 if svdHit.isUCluster():
234 for lst
in range(0, len(track.getSVDHitList())):
235 svdHitA = track.getSVDHitList()[lst]
237 if info == geoCache.get(sensorIDA):
238 if svdHitA.isUCluster() == 0:
240 self.HitsVsLayer.Fill(totalNumberOfHits, layer)
241 self.HitsVsSensor.Fill(totalNumberOfHits, sensor)
242 self.LayerVsSensor.Fill(layer, sensor)
246 print(
'Fit was not successful')
249 """Close & write output files"""
252 labelHits = (
'',
'One',
'Two',
'Three',
'Four',
'Five',
'Six')
253 labelLayers = (
'',
'First',
'Second',
'Third',
'Fourth',
'Fifth',
'Sixth')
254 labelSensors = (
'',
'First',
'Second',
'Third',
'Fourth',
'Fifth')
256 for i
in range(1, 7):
259 self.
TotalNumberOfHitsTotalNumberOfHits.GetYaxis().SetTitle(
"Number of tracks in VXD")
260 self.
TotalNumberOfHitsTotalNumberOfHits.GetXaxis().SetTitle(
"Number of hits in VXD")
271 for i
in range(1, 7):
272 self.
HitsVsLayerHitsVsLayer.GetXaxis().SetBinLabel(i, labelHits[i])
273 self.
HitsVsLayerHitsVsLayer.GetYaxis().SetBinLabel(i, labelLayers[i])
274 self.
HitsVsLayerHitsVsLayer.GetXaxis().SetLabelSize(0.05)
275 self.
HitsVsLayerHitsVsLayer.GetYaxis().SetLabelSize(0.05)
276 self.
HitsVsLayerHitsVsLayer.GetXaxis().SetTitle(
"Number hits in VXD")
277 self.
HitsVsLayerHitsVsLayer.GetYaxis().SetTitle(
"Layer")
278 self.
HitsVsLayerHitsVsLayer.GetYaxis().CenterTitle()
279 self.
HitsVsLayerHitsVsLayer.GetXaxis().CenterTitle()
280 self.
HitsVsLayerHitsVsLayer.GetYaxis().SetTitleOffset(1.6)
281 self.
HitsVsLayerHitsVsLayer.GetXaxis().SetTitleOffset(1.3)
282 ROOT.gPad.SetMargin(0.11, 0.11, 0.1, 0.1)
286 for i
in range(1, 7):
287 self.
HitsVsSensorHitsVsSensor.GetXaxis().SetBinLabel(i, labelHits[i])
288 for i
in range(1, 6):
289 self.
HitsVsSensorHitsVsSensor.GetYaxis().SetBinLabel(i, labelSensors[i])
290 self.
HitsVsSensorHitsVsSensor.GetXaxis().SetLabelSize(0.05)
291 self.
HitsVsSensorHitsVsSensor.GetYaxis().SetLabelSize(0.05)
292 self.
HitsVsSensorHitsVsSensor.GetXaxis().SetTitle(
"Number hits in VXD")
293 self.
HitsVsSensorHitsVsSensor.GetYaxis().SetTitle(
"Sensor")
296 self.
HitsVsSensorHitsVsSensor.GetYaxis().SetTitleOffset(1.6)
297 self.
HitsVsSensorHitsVsSensor.GetXaxis().SetTitleOffset(1.3)
298 ROOT.gPad.SetMargin(0.11, 0.11, 0.1, 0.1)
302 for i
in range(1, 7):
303 self.
LayerVsSensorLayerVsSensor.GetXaxis().SetBinLabel(i, labelLayers[i])
304 for i
in range(1, 6):
305 self.
LayerVsSensorLayerVsSensor.GetYaxis().SetBinLabel(i, labelSensors[i])
306 self.
LayerVsSensorLayerVsSensor.GetXaxis().SetLabelSize(0.05)
307 self.
LayerVsSensorLayerVsSensor.GetYaxis().SetLabelSize(0.05)
309 self.
LayerVsSensorLayerVsSensor.GetYaxis().SetTitle(
"Sensor")
312 self.
LayerVsSensorLayerVsSensor.GetYaxis().SetTitleOffset(1.6)
313 self.
LayerVsSensorLayerVsSensor.GetXaxis().SetTitleOffset(1.3)
314 ROOT.gPad.SetMargin(0.11, 0.11, 0.1, 0.1)
318 self.
Chi2Chi2.GetXaxis().SetTitle(
"#Chi^{2}")
319 self.
Chi2Chi2.GetYaxis().SetTitle(
"Number of tracks")
320 self.
Chi2Chi2.GetYaxis().CenterTitle()
321 self.
Chi2Chi2.GetXaxis().CenterTitle()
322 self.
Chi2Chi2.GetYaxis().SetTitleOffset(1.3)
323 self.
Chi2Chi2.GetXaxis().SetTitleOffset(1.3)
324 self.
Chi2Chi2.SetFillStyle(3365)
325 self.
Chi2Chi2.SetFillColor(9)
326 self.
Chi2Chi2.SetLineColor(9)
330 self.
NDFNDF.GetXaxis().SetTitle(
"Degrees of freedom")
331 self.
NDFNDF.GetYaxis().SetTitle(
"Number of tracks")
332 self.
NDFNDF.GetYaxis().CenterTitle()
333 self.
NDFNDF.GetXaxis().CenterTitle()
334 self.
NDFNDF.GetYaxis().SetTitleOffset(1.3)
335 self.
NDFNDF.GetXaxis().SetTitleOffset(1.3)
336 self.
NDFNDF.SetFillStyle(3365)
337 self.
NDFNDF.SetFillColor(9)
338 self.
NDFNDF.SetLineColor(9)
342 self.
Chi2OverNDFChi2OverNDF.SetTitle(
"#Chi^{2}/Degrees of freedom")
343 self.
Chi2OverNDFChi2OverNDF.GetYaxis().SetTitle(
"Number of tracks")
344 self.
Chi2OverNDFChi2OverNDF.GetYaxis().CenterTitle()
345 self.
Chi2OverNDFChi2OverNDF.GetXaxis().CenterTitle()
346 self.
Chi2OverNDFChi2OverNDF.GetYaxis().SetTitleOffset(1.3)
347 self.
Chi2OverNDFChi2OverNDF.GetXaxis().SetTitleOffset(1.3)
354 self.
MomentumMomentum.GetXaxis().SetTitle(
"Momentum [GeVc^{-1}]")
355 self.
MomentumMomentum.GetYaxis().SetTitle(
"Number of tracks")
356 self.
MomentumMomentum.GetYaxis().CenterTitle()
357 self.
MomentumMomentum.GetXaxis().CenterTitle()
358 self.
MomentumMomentum.GetYaxis().SetTitleOffset(1.3)
359 self.
MomentumMomentum.GetXaxis().SetTitleOffset(1.3)
360 self.
MomentumMomentum.SetFillStyle(3365)
361 self.
MomentumMomentum.SetFillColor(9)
362 self.
MomentumMomentum.SetLineColor(9)
378 function = ROOT.TF1(
"function",
"[0]+[1]*log(x)")
379 function.SetParameters(0.0, 0.0)
390 inverse_function = ROOT.TF1(
"inverse_function",
"exp((-[0]+x)/[1])", 0, 115)
391 inverse_function.SetParameter(0, function.GetParameter(0))
392 inverse_function.SetParameter(1, function.GetParameter(1))
393 constant = ROOT.TF1(
"constant",
"[0]", 115, 300)
394 constant.SetParameter(0, 20)
406 print(
'Parameters of fitted function y = exp((-p0+x)/p1) + p2, where x ~ ADCCounts/NumberOfCDCHits, y ~ momentum')
407 print(
'p0 =', inverse_function.GetParameter(0),
'p1 =', inverse_function.GetParameter(1),
'p2 =', constant.GetParameter(0))
409 self.
PXDClusterSizePXDClusterSize.GetXaxis().SetTitle(
"Size of PXD Clusters")
410 self.
PXDClusterSizePXDClusterSize.GetYaxis().SetTitle(
"Number of tracks")
424 main = b2.create_path()
426 main.add_module(
'RootInput')
427 main.add_module(
'Gearbox')
428 main.add_module(
'Geometry')
430 reco.add_cosmics_reconstruction(main, pruneTracks=
False, merge_tracks=
True)
431 main.add_module(
'DAFRecoFitter', pdgCodesToUseForFitting=[13])
432 main.add_module(
"CDCDedxPID")
435 main.add_module(CosmicAnalysis)
437 progress = b2.register_module(
'ProgressBar')
438 main.add_module(progress)
a (simplified) python wrapper for StoreArray.
static GeoCache & getInstance()
Return a reference to the singleton instance.
Class to uniquely identify a any structure of the PXD and SVD.
Momentum
Histogram with track momentum.
HitsVsSensor
Histogram with number of hits vs.
tree_track
Tree with track data.
TotalNumberOfHits
Histogram with total number of hits on track.
HitsVsLayer
Histogram with number of hits vs.
trackData
struct with track data
Chi2OverNDF
Histogram with track Chi2/NDF.
NDF
Histogram with track NDF.
Chi2
Histogram with track Chi2.
ADCCountOverNumberOfHitsInCDC
Histogram with ADC count vs.
LayerVsSensor
Histogram with hitted layer vs.
tree_DEDX
Tree with dE/dx data.
PXDClusterSize
Histogram with PXD cluster size.
ADCCountOverNumberOfHitsInCDCVsMomentum
Profile with ADC count vs.
dedxData
struct with dE/dx data
MomentumVsADCCountOverNumberOfHitsInCDC
Profile with ADC count vs.