Belle II Software  release-06-01-15
nntd.py
1 import basf2
2 from ROOT import Belle2
3 import numpy as np
4 import pickle
5 
6 
7 class nntd(basf2.Module):
8  '''
9  This class represents a dataset.
10  '''
11  version = 2 # changes, when form of self.array changes
12  # dict to store the content for each entry in a track vector
13  varnum = {}
14  varnum["recoz"] = [0, r'$Z_{Reco}$', r'$[cm]$']
15  varnum["recotheta"] = [1, r'$\theta_{Reco}$', r'$[°]$']
16  varnum["recophi"] = [2, r'$\phi_{Reco}$', r'$[°]$']
17  varnum["recopt"] = [3, r'$P_{t, Reco}$', r'$[GeV]$']
18  varnum["neuroz"] = [4, r'$Z_{Neuro}$', r'$[cm]$']
19  varnum["neurotheta"] = [5, r'$\theta_{Neuro}$', r'$[°]$']
20  varnum["neurophi"] = [6, r'$\phi_{Neuro}$', r'$[°]$']
21  varnum["neuropt"] = [7, r'$P_{t, Neuro}$', r'$[GeV]$']
22  varnum["neuroval"] = [8, r'Validity', '']
23  varnum["neuroqual"] = [9, r'Quality', '']
24  varnum["neurots"] = [10, r'TSVector', '']
25  varnum["neuroexp"] = [11, r'Expert Number', '']
26  varnum["neurodriftth"] = [12, r'Driftthreshold', '']
27  varnum["neuroquad"] = [13, r'Quadrant', '']
28  varnum["neurofp"] = [14, r'Fastestpriority Eventtime', 'clocks']
29  varnum["neuroetf"] = [15, r'ETF Eventtime', 'clocks']
30  varnum["twodphi"] = [16, r'$\phi_{2D}$', r'$[°]$']
31  varnum["twodpt"] = [17, r'$P_{t, 2D}$', r'$[GeV]$']
32  varnum["twodfot"] = [18, r'FoundOldTrack', '']
33  varnum["hwneuroz"] = [4, r'$Z_{HWNeuro}$', r'$[cm]$']
34  varnum["hwneurotheta"] = [5, r'$\theta_{HWNeuro}$', r'$[°]$']
35  varnum["hwneurophi"] = [6, r'$\phi_{HWNeuro}$', r'$[°]$']
36  varnum["hwneuropt"] = [7, r'$P_{t, HWNeuro}$', r'$[GeV]$']
37  varnum["hwNeuroval"] = [8, r'Validity', '']
38  varnum["hwNeuroqual"] = [9, r'Quality', '']
39  varnum["hwNeurots"] = [10, r'TSVector', '']
40  varnum["hwNeuroexp"] = [11, r'Expert Number', '']
41  varnum["hwNeurodriftth"] = [12, r'Driftthreshold', '']
42  varnum["hwNeuroquad"] = [13, r'Quadrant', '']
43  varnum["hwNeurofp"] = [14, r'Fastestpriority Eventtime', 'clocks']
44  varnum["hwNeuroetf"] = [15, r'ETF Eventtime', 'clocks']
45  nonelist = [None for i in range(17)]
46 
47  def initialize(self):
48  # TODO:
49  # check if folder is present or create it
50  # initialize all plots somehow
51  # initialize filters somehow, so they can be looped over in the evetn function
52  # setup histograms
53  self.datadata = None # np.array([[[]]])
54  self.eventlisteventlist = []
55  # TODO
56  # # dict of plots, which should be plotted during the processing and updated every 5000 events.
57  # self.plotdict = {}
58  self.recotracksnamerecotracksname = "RecoTracks" # recotracksname
59  self.neurotracksnameneurotracksname = "TSimNeuroTracks" # "TRGCDCNeuroTracks" # neurotracksname
60  self.hwneurotracksnamehwneurotracksname = "CDCTriggerNeuroTracks" # "TRGCDCNeuroTracks" # neurotracksname
61  self.twodtracksnametwodtracksname = "CDCTriggerNNInput2DFinderTracks" # "TRGCDC2DFinderTracks" # twodtracksname
62  self.etfnameetfname = "CDCTriggerNeuroETFT0"
63  self.tsnametsname = "CDCTriggerNNInputSegmentHits"
64 
65  # storearrays
66  self.recotracksrecotracks = Belle2.PyStoreArray(self.recotracksnamerecotracksname)
67  self.neurotracksneurotracks = Belle2.PyStoreArray(self.neurotracksnameneurotracksname)
68  self.hwneurotrackshwneurotracks = Belle2.PyStoreArray(self.hwneurotracksnamehwneurotracksname)
69  self.twodtrackstwodtracks = Belle2.PyStoreArray(self.twodtracksnametwodtracksname)
70  self.tsts = Belle2.PyStoreArray(self.tsnametsname)
71  self.etfetf = Belle2.PyStoreObj(self.etfnameetfname)
72 
73  self.varnumvarnumvarnum = nntd.varnum
74  self.networknamenetworkname = None
75 
76  def costotheta(self, x):
77  if isinstance(x, list):
78  ret = []
79  for y in x:
80  ret.append(self.costothetacostotheta(y))
81  return ret
82  else:
83  ret = None
84  if not x:
85  return None
86  else:
87  if x < -1 or x > 1:
88  x = np.round(x)
89  return 180. / np.pi * np.arccos(x)
90 
91  def getrecovals(self, fitres):
92  ret = []
93  if fitres:
94  ret.append(fitres.getPosition().Z())
95  ret.append(self.costothetacostotheta(fitres.getMomentum().CosTheta()))
96  ret.append(fitres.getMomentum().Phi())
97  ret.append(fitres.getMomentum().Pt())
98  else:
99  for i in range(4):
100  ret.append(None)
101  return ret
102 
103  def getneurovals(self, neuro):
104  ret = []
105  if neuro:
106  ret.append(neuro.getZ0())
107  ret.append(self.costothetacostotheta(neuro.getCotTheta() / np.sqrt(1 + neuro.getCotTheta()**2)))
108  ret.append(neuro.getPhi0())
109  ret.append(neuro.getPt())
110  ret.append(neuro.getValidStereoBit())
111  ret.append(neuro.getQualityVector())
112  ret.append(None) # int(neuro.getTSVector()))
113  ret.append(neuro.getExpert())
114  ret.append(None) # int(neuro.getDriftThreshold()))
115  ret.append(neuro.getQuadrant())
116  fpt = 9999
117  for ts in neuro.getRelationsTo(self.tsnametsname):
118  if ts.priorityTime() < fpt:
119  fpt = ts.priorityTime()
120  if self.etfetf.hasBinnedEventT0(Belle2.Const.CDC):
121  eft = self.etfetf.getBinnedEventT0(Belle2.Const.CDC)
122  else:
123  eft = None
124  ret.append(fpt)
125  ret.append(eft)
126  else:
127  for i in range(12):
128  ret.append(None)
129  return ret
130 
131  def gettwodvals(self, twod):
132  ret = []
133  if twod:
134  ret.append(twod.getPhi0())
135  ret.append(twod.getPt())
136  ret.append(None) # int(twod.getFoundOldTrack()))
137  else:
138  for i in range(3):
139  ret.append(None)
140  return ret
141 
142  def event(self):
143  # TODO: update the plots every nth time
144  # if self.showplots != 0:
145  # if eventnumber % self.showplots = 0:
146  # show plots
147 
148  # loop over events
149  event = []
150  for reco in self.recotracksrecotracks:
151  track = reco.getRelatedFrom("Tracks")
152  if not track:
153  print("no track found for recotrack")
154  continue
155  whishPdg = 211 # pion
156  fitres = track.getTrackFitResultWithClosestMass(Belle2.Const.ChargedStable(whishPdg))
157  if not fitres:
158  continue
159  # neuro = reco.getRelatedTo(self.neurotracksname)
160  event.append([])
161  try:
162  neuro = reco.getRelatedTo(self.neurotracksnameneurotracksname)
163  except BaseException:
164  neuro = None
165  try:
166  hwneuro = reco.getRelatedTo(self.hwneurotracksnamehwneurotracksname)
167  except BaseException:
168  hwneuro = None
169  try:
170  twod = reco.getRelatedTo(self.twodtracksnametwodtracksname)
171  except BaseException:
172  twod = None
173  event[-1] += self.getrecovalsgetrecovals(fitres)
174  event[-1] += self.getneurovalsgetneurovals(neuro)
175  event[-1] += self.gettwodvalsgettwodvals(twod)
176  event[-1] += self.getneurovalsgetneurovals(hwneuro)
177  for neuro in self.neurotracksneurotracks:
178  # print("neuroloop")
179  # print(len(neuro.getRelationsFrom(self.recotracksname)))
180  if len(neuro.getRelationsFrom(self.recotracksnamerecotracksname)) > 0:
181  # this track is already stored in a recoline
182  # print("skipping...")
183  continue
184  event.append([])
185  try:
186  twod = reco.getRelatedTo(self.twodtracksnametwodtracksname)
187  except BaseException:
188  twod = None
189  try:
190  hwneuro = neuro.getRelatedTo(self.hwneurotracksnamehwneurotracksname)
191  except BaseException:
192  twod = None
193  event[-1] += self.getrecovalsgetrecovals(None)
194  event[-1] += self.getneurovalsgetneurovals(neuro)
195  event[-1] += self.gettwodvalsgettwodvals(twod)
196  event[-1] += self.getneurovalsgetneurovals(hwneuro)
197  for twod in self.twodtrackstwodtracks:
198  # print("twodloop")
199  # print(len(twod.getRelationsFrom(self.neurotracksname)))
200  if len(twod.getRelationsFrom(self.neurotracksnameneurotracksname)) > 0:
201  # print("skipping...")
202  # this track is already stored in a recoline or twodline
203  continue
204  event.append([])
205  event[-1] += self.getrecovalsgetrecovals(None)
206  event[-1] += self.getneurovalsgetneurovals(None)
207  event[-1] += self.gettwodvalsgettwodvals(twod)
208  event[-1] += self.getneurovalsgetneurovals(None)
209 
210  # attach an array for every event
211  if len(event) > 100:
212  event = event[0:100]
213  elif len(event) < 100:
214  for i in range(100 - len(event)):
215  event.append(self.getrecovalsgetrecovals(None) + self.getneurovalsgetneurovals(None) + self.gettwodvalsgettwodvals(None) + self.getneurovalsgetneurovals(None))
216  self.eventlisteventlist.append(event)
217 
218  def terminate(self):
219  # self.eventfilters()
220  # self.makearray(self.eventlist)
221  # convert eventlist to data array
222  # initialize histograms and fill them
223  # both save histograms to file and show them in the plots
224  pass
225 
226  def save(self, filename, netname):
227  # save the dataset as an array, the corresponding varnum,
228  # and a description about the dataset into a pickle file
229  savedict = {}
230  savedict["eventlist"] = self.eventlist
231  savedict["varnum"] = self.varnum
232  savedict["networkname"] = netname
233  savedict["version"] = nntd.version
234  f = open(filename, 'wb')
235  pickle.dump(savedict, f)
236  f.close()
237  print('file ' + filename + ' has been saved. ')
238 
239  def loadmore(self, filenames):
240  for x in filenames:
241  f = open(x, 'rb')
242  savedict = pickle.load(f)
243  f.close()
244  if self.version != savedict["version"]:
245  print("Error! loaded file was made with different version of nntd! exiting ... ")
246  exit()
247  self.networkname = savedict["networkname"]
248  self.eventlist += savedict["eventlist"]
249  self.varnum = savedict["varnum"]
250  print("Loaded file: " + x)
251  self.makearray(self.eventlist)
252 
253  def load(self, filename):
254  # load a given pickle file
255  f = open(filename, 'rb')
256  savedict = pickle.load(f)
257  f.close()
258  if self.version != savedict["version"]:
259  print("Error! loaded file was made with different version of nntd! exiting ... ")
260  exit()
261  self.eventlist = savedict["eventlist"]
262  self.varnum = savedict["varnum"]
263  self.networkname = savedict["networkname"]
264  # self.eventfilters()
265  self.makearray(self.eventlist)
266 
267  def makearray(self, evlist):
268  # TODO: apply filters
269  self.data = np.array(evlist)
Provides a type-safe way to pass members of the chargedStableSet set.
Definition: Const.h:470
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:56
a (simplified) python wrapper for StoreObjPtr.
Definition: PyStoreObj.h:67
Definition: nntd.py:7
tsname
Definition: nntd.py:63
dictionary varnum
Definition: nntd.py:13
neurotracksname
Definition: nntd.py:59
etfname
Definition: nntd.py:62
data
Definition: nntd.py:53
recotracksname
Definition: nntd.py:58
eventlist
Definition: nntd.py:54
networkname
Definition: nntd.py:74
neurotracks
Definition: nntd.py:67
def gettwodvals(self, twod)
Definition: nntd.py:131
def costotheta(self, x)
Definition: nntd.py:76
def getrecovals(self, fitres)
Definition: nntd.py:91
twodtracksname
Definition: nntd.py:61
varnum
Definition: nntd.py:73
hwneurotracksname
Definition: nntd.py:60
hwneurotracks
Definition: nntd.py:68
def getneurovals(self, neuro)
Definition: nntd.py:103
recotracks
Definition: nntd.py:66
twodtracks
Definition: nntd.py:69