Belle II Software development
Saving1stMVAData Class Reference
Inheritance diagram for Saving1stMVAData:
HarvestingModule

Public Member Functions

 __init__ (self, name, contact=None, checkObj='RecoTracks', output_file_name='flip-refit-MVA1.root')
 
 initialize (self)
 
 prepare (self)
 
 pick (self, recoTrack)
 
 peel (self, recoTrack)
 
 id (self)
 
 event (self)
 
 terminate (self)
 
 barn (self)
 
 gather (self)
 
 refine (self, crops)
 

Static Public Member Functions

 create_crop_part_collection ()
 
 iter_store_obj (store_obj)
 

Public Attributes

 checkObj = checkObj
 Name of the Obj to be picked.
 
str mcRecoTracks = "MCRecoTracks"
 Name of the StoreArray of the mc tracks.
 
 track_match_look_up = None
 Reference to the track match lookup object reading the relation information.
 
 outputname = output_file_name
 Name of the output file.
 
 foreach = foreach
 Name of the StoreArray or iterable StoreObjPtr that contains the objects to be harvested.
 
 output_file_name = output_file_name
 Name of the ROOT output file to be generated.
 
 title = title or self.name()
 Name of this harvest.
 
 contact = contact
 Contact email address to be displayed on the validation page.
 
int expert_level = self.default_expert_level if expert_level is None else expert_level
 Integer expert level that controls to detail of plots to be generated.
 
list refiners = []
 A list of additional refiner instances to be executed on top of the refiner methods that are members of this class.
 
 show_results = show_results
 Switch to show the result ROOT file in a TBrowser on terminate.
 
 stash = self.barn()
 stash of the harvested crops (start with those in the barn)
 
 crops
 the dictionaries from peel
 
 raw_crops = raw_crops
 the dictionaries from peel as a numpy.array of doubles
 

Static Public Attributes

 save_tree = refiners.save_tree(name="data")
 save a tree of all the collected variables
 
int default_expert_level = 1
 The default value of expert_level if not specified explicitly by the caller.
 

Detailed Description

 A dedicated module to save the variables using in flipping steps

Definition at line 19 of file savingFlippingVariables.py.

Constructor & Destructor Documentation

◆ __init__()

__init__ ( self,
name,
contact = None,
checkObj = 'RecoTracks',
output_file_name = 'flip-refit-MVA1.root' )
Constructor

Definition at line 22 of file savingFlippingVariables.py.

22 def __init__(self, name, contact=None, checkObj='RecoTracks', output_file_name='flip-refit-MVA1.root'):
23 """Constructor"""
24 super().__init__(foreach=checkObj, name=name, contact=contact, output_file_name=output_file_name)
25
26 ## Name of the Obj to be picked
27 self.checkObj = checkObj
28
29 ## Name of the StoreArray of the mc tracks
30 self.mcRecoTracks = "MCRecoTracks"
31
32 ## Reference to the track match lookup object reading the relation information
33 self.track_match_look_up = None
34
35 ## Name of the output file
36 self.outputname = output_file_name
37

Member Function Documentation

◆ barn()

barn ( self)
inherited
Coroutine that receives the dictionaries of names and values from peel and store them.

Reimplemented in PickleHarvestingModule.

Definition at line 287 of file harvesting.py.

287 def barn(self):
288 """Coroutine that receives the dictionaries of names and values from peel and store them."""
289 crop = (yield)
290 raw_crops = copy.copy(crop)
291 crops = copy.copy(crop)
292
293 if isinstance(crop, numbers.Number):
294 raw_crops = self.create_crop_part_collection()
295 try:
296 while True:
297 raw_crops.append(crop)
298 # next crop
299 crop = (yield)
300 except GeneratorExit:
301 crops = np.array(raw_crops)
302
303 elif isinstance(crop, collections.abc.MutableMapping):
304 for part_name in crop:
305 raw_crops[part_name] = self.create_crop_part_collection()
306
307 try:
308 while True:
309 for part_name, parts in list(raw_crops.items()):
310 if part_name in crop:
311 parts.append(crop[part_name])
312 else:
313 parts.append(np.NaN)
314 # next crop
315 crop = (yield)
316 except GeneratorExit:
317 for part_name, parts in list(raw_crops.items()):
318 crops[part_name] = np.array(parts)
319
320 else:
321 msg = f"Unrecognised crop {crop} of type {type(crop)}"
322 raise ValueError(msg)
323
324
325 self.raw_crops = raw_crops
326
327 self.crops = crops
328

◆ create_crop_part_collection()

create_crop_part_collection ( )
staticinherited
Create the storing objects for the crop values

Currently a numpy.array of doubles is used to store all values in memory.

Definition at line 279 of file harvesting.py.

279 def create_crop_part_collection():
280 """Create the storing objects for the crop values
281
282 Currently a numpy.array of doubles is used to store all values in memory.
283 """
284 return array.array("d")
285

◆ event()

event ( self)
inherited
Event method of the module

* Does invoke the prepare method before the iteration starts.
* In each event fetch the StoreArray / iterable StoreObjPtr,
* Iterate through all instances
* Feed each instance to the pick method to decide it the instance is relevant
* Forward it to the peel method that should generated a dictionary of values
* Store each dictionary of values

Definition at line 239 of file harvesting.py.

239 def event(self):
240 """Event method of the module
241
242 * Does invoke the prepare method before the iteration starts.
243 * In each event fetch the StoreArray / iterable StoreObjPtr,
244 * Iterate through all instances
245 * Feed each instance to the pick method to decide it the instance is relevant
246 * Forward it to the peel method that should generated a dictionary of values
247 * Store each dictionary of values
248 """
249 self.prepare()
250 stash = self.stash.send
251 pick = self.pick
252 peel = self.peel
253 for crop in self.gather():
254 if pick(crop):
255 crop = peel(crop)
256 if isinstance(crop, types.GeneratorType):
257 many_crops = crop
258 for crop in many_crops:
259 stash(crop)
260 else:
261 stash(crop)
262

◆ gather()

gather ( self)
inherited
Iterator that yield the instances form the StoreArray / iterable StoreObj.

Yields
------
Object instances from the StoreArray, iterable StoreObj or the StoreObj itself
in case it is not iterable.

Definition at line 329 of file harvesting.py.

329 def gather(self):
330 """Iterator that yield the instances form the StoreArray / iterable StoreObj.
331
332 Yields
333 ------
334 Object instances from the StoreArray, iterable StoreObj or the StoreObj itself
335 in case it is not iterable.
336 """
337
338 registered_store_arrays = Belle2.PyStoreArray.list()
339 registered_store_objs = Belle2.PyStoreObj.list()
340
341 foreach = self.foreach
342 foreach_is_store_obj = foreach in registered_store_objs
343 foreach_is_store_array = foreach in registered_store_arrays
344
345 if foreach is not None:
346 if foreach_is_store_array:
347 store_array = Belle2.PyStoreArray(self.foreach)
348 yield from store_array
349
350 elif foreach_is_store_obj:
351 store_obj = Belle2.PyStoreObj(self.foreach)
352 try:
353 yield from self.iter_store_obj(store_obj)
354 except TypeError:
355 # Cannot iter the store object. Yield it instead.
356 yield store_obj.obj()
357
358 else:
359 msg = f"Name {self.foreach} does not refer to a valid object on the data store"
360 raise KeyError(msg)
361 else:
362 yield None
363
A (simplified) python wrapper for StoreArray.
static std::vector< std::string > list(DataStore::EDurability durability=DataStore::EDurability::c_Event)
Return list of available arrays for given durability.
a (simplified) python wrapper for StoreObjPtr.
Definition PyStoreObj.h:67
static std::vector< std::string > list(DataStore::EDurability durability=DataStore::EDurability::c_Event)
Return list of available objects for given durability.
Definition PyStoreObj.cc:28

◆ id()

id ( self)
inherited
Working around that name() is a method.

Exposing the name as a property using a different name

Definition at line 224 of file harvesting.py.

224 def id(self):
225 """Working around that name() is a method.
226
227 Exposing the name as a property using a different name
228 """
229 return self.name()
230

◆ initialize()

initialize ( self)
Initialization at the start of the event processing

Reimplemented from HarvestingModule.

Definition at line 38 of file savingFlippingVariables.py.

38 def initialize(self):
39 """Initialization at the start of the event processing"""
40 super().initialize()
41 self.track_match_look_up = Belle2.TrackMatchLookUp(self.mcRecoTracks, self.checkObj)
42 output_tfile = ROOT.TFile(self.outputname, "RECREATE")
43 self.outputname = output_tfile
44
Class to provide convenient methods to look up matching information between pattern recognition and M...

◆ iter_store_obj()

iter_store_obj ( store_obj)
staticinherited
Obtain a iterator from a StoreObj

Repeatedly calls iter(store_obj) or store_obj.__iter__()
until the final iterator returns itself

Returns
-------
iterator of the StoreObj

Definition at line 443 of file harvesting.py.

443 def iter_store_obj(store_obj):
444 """Obtain a iterator from a StoreObj
445
446 Repeatedly calls iter(store_obj) or store_obj.__iter__()
447 until the final iterator returns itself
448
449 Returns
450 -------
451 iterator of the StoreObj
452 """
453 iterable = store_obj.obj()
454 last_iterable = None
455 while iterable is not last_iterable:
456 if hasattr(iterable, "__iter__"):
457 iterable, last_iterable = iterable.__iter__(), iterable
458 else:
459 iterable, last_iterable = iter(iterable), iterable
460 return iterable
461
462

◆ peel()

peel ( self,
recoTrack )
store the information for each recoTrack

Reimplemented from HarvestingModule.

Definition at line 58 of file savingFlippingVariables.py.

58 def peel(self, recoTrack):
59 """store the information for each recoTrack"""
60 track_match_look_up = self.track_match_look_up
61 nan = float('nan')
62 d0_variance = nan
63 seed_pz_estimate = nan
64 n_hits = nan
65 z0_estimate = nan
66 seed_pz_variance = nan
67 phi0_variance = nan
68 seed_z_estimate = nan
69 tan_lambda_estimate = nan
70 omega_variance = nan
71 seed_tan_lambda_estimate = nan
72 d0_estimate = nan
73 seed_pt_estimate = nan
74 cdc_qualityindicator = nan
75 omega_estimate = nan
76 z0_variance = nan
77 seed_x_estimate = nan
78 seed_y_estimate = nan
79 seed_pt_resolution = nan
80 seed_py_variance = nan
81 seed_d0_estimate = nan
82 seed_omega_variance = nan
83 tan_lambda_variance = nan
84 svd_layer6_clsTime = nan
85 seed_tan_lambda_variance = nan
86 seed_z_variance = nan
87 n_svd_hits = nan
88 phi0_estimate = nan
89 n_cdc_hits = nan
90 n_pxd_hits = nan
91 svd_layer3_positionSigma = nan
92 first_cdc_layer = nan
93 last_cdc_layer = nan
94 ndf_hits = nan
95 isPrimary_misID = False
96 ismatched = False
97 ismatched_CC = False
98 ismatched_WC = False
99 isclone_CC = False
100 isclone_WC = False
101 isclone = False
102 isbackground = False
103 isghost = False
104 isprimary = False
105 charge_truth = nan
106 inGoingArmTime = nan
107 inGoingArmTimeError = nan
108 outGoingArmTime = nan
109 outGoingArmTimeError = nan
110 InOutArmTimeDifference = nan
111 InOutArmTimeDifferenceError = nan
112 pt_estimate = nan
113 track_charge = nan
114 quality_flip_indicator = nan
115 quality_2ndflip_indicator = nan
116
117 if (recoTrack):
118
119 mc_particle = track_match_look_up.getRelatedMCParticle(recoTrack)
120 fit_result = track_match_look_up.getRelatedTrackFitResult(recoTrack)
121
122 inGoingArmTime = recoTrack.getIngoingArmTime()
123 inGoingArmTimeError = recoTrack.getIngoingArmTimeError()
124 outGoingArmTime = recoTrack.getOutgoingArmTime()
125 outGoingArmTimeError = recoTrack.getOutgoingArmTimeError()
126 InOutArmTimeDifference = recoTrack.getInOutArmTimeDifference()
127 InOutArmTimeDifferenceError = recoTrack.getInOutArmTimeDifferenceError()
128
129 ismatched = track_match_look_up.isAnyChargeMatchedPRRecoTrack(recoTrack)
130 ismatched_CC = track_match_look_up.isCorrectChargeMatchedPRRecoTrack(recoTrack)
131 ismatched_WC = track_match_look_up.isWrongChargeMatchedPRRecoTrack(recoTrack)
132
133 isclone = track_match_look_up.isAnyChargeClonePRRecoTrack(recoTrack)
134 isclone_CC = track_match_look_up.isCorrectChargeClonePRRecoTrack(recoTrack)
135 isclone_WC = track_match_look_up.isWrongChargeClonePRRecoTrack(recoTrack)
136
137 isbackground = track_match_look_up.isBackgroundPRRecoTrack(recoTrack)
138 isghost = track_match_look_up.isGhostPRRecoTrack(recoTrack)
139 quality_flip_indicator = recoTrack.getFlipQualityIndicator()
140 quality_2ndflip_indicator = recoTrack.get2ndFlipQualityIndicator()
141
142 if mc_particle and fit_result:
143 isprimary = bool(mc_particle.hasStatus(Belle2.MCParticle.c_PrimaryParticle))
144 charge_truth = mc_particle.getCharge()
145 track_charge = fit_result.getChargeSign()
146 if isprimary:
147 if mc_particle.getCharge() != track_charge:
148 isPrimary_misID = True
149
150 cdc_track_cand = recoTrack.getRelated('CDCRecoTracks')
151 if cdc_track_cand:
152 cdc_qualityindicator = cdc_track_cand.getQualityIndicator()
153
154 if fit_result:
155 omega_estimate = fit_result.getOmega()
156 z0_estimate = fit_result.getZ0()
157 d0_estimate = fit_result.getD0()
158 phi0_estimate = fit_result.getPhi() % (2.0 * math.pi)
159 tan_lambda_estimate = fit_result.getCotTheta()
160
161 mom = fit_result.getMomentum()
162 pt_estimate = mom.Rho()
163
164 d0_variance = fit_result.getCov()[0]
165 z0_variance = fit_result.getCov()[12]
166 phi0_variance = fit_result.getCov()[5]
167 omega_variance = fit_result.getCov()[9]
168
169 reco_svdcdc_track = recoTrack.getRelated("SVDCDCRecoTracks")
170
171 seed_fit_result = peelers.get_seed_track_fit_result(reco_svdcdc_track)
172 seed_mom = seed_fit_result.getMomentum()
173 seed_pos = seed_fit_result.getPosition()
174 seed_cov6 = seed_fit_result.getCovariance6()
175 seed_tan_lambda_estimate = seed_fit_result.getCotTheta()
176
177 seed_pz_estimate = seed_mom.Z()
178 seed_pz_variance = seed_cov6(5, 5)
179 seed_z_estimate = seed_pos.Z()
180 seed_x_estimate = seed_pos.X()
181 seed_y_estimate = seed_pos.Y()
182
183 seed_pt_estimate = seed_mom.Rho()
184 seed_py_variance = seed_cov6(4, 4)
185 seed_d0_estimate = seed_fit_result.getD0()
186 seed_omega_variance = seed_fit_result.getCov()[9]
187 seed_tan_lambda_variance = seed_fit_result.getCov()[14]
188 seed_z_variance = seed_cov6(2, 2)
189
190 tan_lambda_variance = seed_fit_result.getCov()[14]
191 for svd_hit in getObjectList(recoTrack.getSVDHitList()):
192 if svd_hit.getSensorID().getLayerNumber() == 3:
193 svd_layer3_positionSigma = svd_hit.getPositionSigma()
194 if svd_hit.getSensorID().getLayerNumber() == 6:
195 svd_layer6_clsTime = svd_hit.getClsTime()
196
197 cdc_hits = [hit.getICLayer() for hit in getObjectList(recoTrack.getCDCHitList())]
198 if cdc_hits:
199 first_cdc_layer = min(cdc_hits)
200 last_cdc_layer = max(cdc_hits)
201
202 n_cdc_hits = recoTrack.getNumberOfCDCHits()
203 n_svd_hits = recoTrack.getNumberOfSVDHits()
204 n_pxd_hits = recoTrack.getNumberOfPXDHits()
205
206 n_hits = n_pxd_hits + n_svd_hits + n_cdc_hits
207 ndf_hits = 2 * n_pxd_hits + n_svd_hits + n_cdc_hits
208
209 crops = dict(
210 d0_variance=d0_variance,
211 seed_pz_estimate=seed_pz_estimate,
212 n_hits=n_hits,
213 z0_estimate=z0_estimate,
214 seed_pz_variance=seed_pz_variance,
215 phi0_variance=phi0_variance,
216 seed_z_estimate=seed_z_estimate,
217 tan_lambda_estimate=tan_lambda_estimate,
218 omega_variance=omega_variance,
219 seed_tan_lambda_estimate=seed_tan_lambda_estimate,
220 d0_estimate=d0_estimate,
221 seed_pt_estimate=seed_pt_estimate,
222 cdc_qualityindicator=cdc_qualityindicator,
223 omega_estimate=omega_estimate,
224 z0_variance=z0_variance,
225 seed_x_estimate=seed_x_estimate,
226 seed_y_estimate=seed_y_estimate,
227 seed_pt_resolution=seed_pt_resolution,
228 seed_py_variance=seed_py_variance,
229 seed_d0_estimate=seed_d0_estimate,
230 seed_omega_variance=seed_omega_variance,
231 tan_lambda_variance=tan_lambda_variance,
232 svd_layer6_clsTime=svd_layer6_clsTime,
233 seed_tan_lambda_variance=seed_tan_lambda_variance,
234 seed_z_variance=seed_z_variance,
235 n_svd_hits=n_svd_hits,
236 phi0_estimate=phi0_estimate,
237 n_cdc_hits=n_cdc_hits,
238 n_pxd_hits=n_pxd_hits,
239 svd_layer3_positionSigma=svd_layer3_positionSigma,
240 first_cdc_layer=first_cdc_layer,
241 last_cdc_layer=last_cdc_layer,
242 ndf_hits=ndf_hits,
243 isPrimary_misID=isPrimary_misID,
244 ismatched=ismatched,
245 ismatched_CC=ismatched_CC,
246 ismatched_WC=ismatched_WC,
247 isclone_CC=isclone_CC,
248 isclone_WC=isclone_WC,
249 isclone=isclone,
250 isbackground=isbackground,
251 isghost=isghost,
252 isprimary=isprimary,
253 charge_truth=charge_truth,
254 track_charge=track_charge,
255 inGoingArmTime=inGoingArmTime,
256 inGoingArmTimeError=inGoingArmTimeError,
257 outGoingArmTime=outGoingArmTime,
258 outGoingArmTimeError=outGoingArmTimeError,
259 InOutArmTimeDifference=InOutArmTimeDifference,
260 InOutArmTimeDifferenceError=InOutArmTimeDifferenceError,
261 pt_estimate=pt_estimate,
262 quality_flip_indicator=quality_flip_indicator,
263 quality_2ndflip_indicator=quality_2ndflip_indicator,
264 )
265 return crops
266

◆ pick()

pick ( self,
recoTrack )
pick every recoTrack

Reimplemented from HarvestingModule.

Definition at line 54 of file savingFlippingVariables.py.

54 def pick(self, recoTrack):
55 """pick every recoTrack"""
56 return True
57

◆ prepare()

prepare ( self)
preparation at the start of each event.
   make sure the checkObj exist

Reimplemented from HarvestingModule.

Definition at line 45 of file savingFlippingVariables.py.

45 def prepare(self):
46 """preparation at the start of each event.
47 make sure the checkObj exist
48 """
49 super().prepare()
50 checkDatas = Belle2.PyStoreArray(self.checkObj)
51 if (not checkDatas):
52 return False
53

◆ refine()

refine ( self,
crops )
inherited
Receive the gathered crops and forward them to the refiners.

Reimplemented in PickleHarvestingModule.

Definition at line 398 of file harvesting.py.

398 def refine(self, crops):
399 """Receive the gathered crops and forward them to the refiners."""
400
401 kwds = {}
402 if self.output_file_name:
403 # Save everything to a ROOT file
404 if isinstance(self.output_file_name, ROOT.TFile):
405 output_tdirectory = self.output_file_name
406 else:
407 output_tfile = ROOT.TFile(self.output_file_name, 'recreate')
408 output_tdirectory = output_tfile
409
410 else:
411 output_tdirectory = None
412
413 try:
414 with root_cd(output_tdirectory):
415 for refiner in self.refiners:
416 refiner(self, crops, tdirectory=output_tdirectory, **kwds)
417
418 # Get the methods marked as refiners from the class
419 cls = type(self)
420 for name in dir(cls):
421 if isinstance(getattr(cls, name), Refiner):
422 refiner = getattr(self, name)
423 # Getattr already binds self
424 refiner(crops, tdirectory=output_tdirectory, **kwds)
425
426 finally:
427 # If we opened the TFile ourself, close it again
428 if self.output_file_name:
429 if isinstance(self.output_file_name, str):
430 output_tfile.Close()
431
432 if self.show_results and self.output_file_name:
433 if isinstance(self.output_file_name, str):
434 output_tfile = ROOT.TFile(self.output_file_name)
435 root_browse(output_tfile)
436 input("Press enter to close")
437 output_tfile.Close()
438 else:
439 root_browse(self.output_file_name)
440 input("Press enter to close")
441

◆ terminate()

terminate ( self)
inherited
Termination method of the module.

Finalize the collected crops.
Start the refinement.

Reimplemented in ClusterFilterValidationModule.

Definition at line 263 of file harvesting.py.

263 def terminate(self):
264 """Termination method of the module.
265
266 Finalize the collected crops.
267 Start the refinement.
268 """
269
270 self.stash.close()
271 del self.stash
272
273 try:
274 self.refine(self.crops)
275 except AttributeError:
276 pass
277

Member Data Documentation

◆ checkObj

checkObj = checkObj

Name of the Obj to be picked.

Definition at line 27 of file savingFlippingVariables.py.

◆ contact

contact = contact
inherited

Contact email address to be displayed on the validation page.

Definition at line 211 of file harvesting.py.

◆ crops

crops
inherited

the dictionaries from peel

Definition at line 274 of file harvesting.py.

◆ default_expert_level

int default_expert_level = 1
staticinherited

The default value of expert_level if not specified explicitly by the caller.

Definition at line 156 of file harvesting.py.

◆ expert_level

int expert_level = self.default_expert_level if expert_level is None else expert_level
inherited

Integer expert level that controls to detail of plots to be generated.

Definition at line 214 of file harvesting.py.

◆ foreach

foreach = foreach
inherited

Name of the StoreArray or iterable StoreObjPtr that contains the objects to be harvested.

Definition at line 196 of file harvesting.py.

◆ mcRecoTracks

str mcRecoTracks = "MCRecoTracks"

Name of the StoreArray of the mc tracks.

Definition at line 30 of file savingFlippingVariables.py.

◆ output_file_name

output_file_name = output_file_name
inherited

Name of the ROOT output file to be generated.

Definition at line 199 of file harvesting.py.

◆ outputname

outputname = output_file_name

Name of the output file.

Definition at line 36 of file savingFlippingVariables.py.

◆ raw_crops

raw_crops = raw_crops
inherited

the dictionaries from peel as a numpy.array of doubles

Definition at line 325 of file harvesting.py.

◆ refiners

list refiners = []
inherited

A list of additional refiner instances to be executed on top of the refiner methods that are members of this class.

Definition at line 218 of file harvesting.py.

◆ save_tree

save_tree = refiners.save_tree(name="data")
static

save a tree of all the collected variables

Definition at line 268 of file savingFlippingVariables.py.

◆ show_results

show_results = show_results
inherited

Switch to show the result ROOT file in a TBrowser on terminate.

Definition at line 221 of file harvesting.py.

◆ stash

stash = self.barn()
inherited

stash of the harvested crops (start with those in the barn)

Definition at line 237 of file harvesting.py.

◆ title

title = title or self.name()
inherited

Name of this harvest.

Title particle of this harvest

Definition at line 208 of file harvesting.py.

◆ track_match_look_up

track_match_look_up = None

Reference to the track match lookup object reading the relation information.

Definition at line 33 of file savingFlippingVariables.py.


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