Belle II Software development
ChargedPidMVAWeights Class Reference

Class to contain the payload of MVA weightfiles needed for charged particle identification. More...

#include <ChargedPidMVAWeights.h>

Inheritance diagram for ChargedPidMVAWeights:

Public Types

enum class  ChargedPidMVATrainingMode : unsigned int {
  c_Classification = 0 ,
  c_Multiclass = 1 ,
  c_ECL_Classification = 2 ,
  c_ECL_Multiclass = 3 ,
  c_PSD_Classification = 4 ,
  c_PSD_Multiclass = 5 ,
  c_ECL_PSD_Classification = 6 ,
  c_ECL_PSD_Multiclass = 7
}
 A (strongly-typed) enumerator identifier for each valid MVA training mode. More...
 

Public Member Functions

 ChargedPidMVAWeights ()
 Default constructor, necessary for ROOT to stream the object.
 
 ChargedPidMVAWeights (const double &energyUnit, const double &angUnit, const std::string &thetaVarName="clusterTheta", bool implictNaNmasking=false)
 Specialized constructor.
 
 ~ChargedPidMVAWeights ()
 Destructor.
 
void setEnergyUnit (const double &unit)
 Set the energy unit to ensure consistency w/ the one used to define the bins grid.
 
void setAngularUnit (const double &unit)
 Set the angular unit to ensure consistency w/ the one used to define the bins grid.
 
void setWeightCategories (const double *clusterThetaBins, const int nClusterThetaBins, const double *pBins, const int nPBins, const double *chargeBins, const int nChargeBins)
 Set the 3D (clusterTheta, p, charge) grid representing the categories for which weightfiles are defined.
 
void storeMVAWeights (const int pdg, const std::vector< std::string > &filepaths, const std::vector< std::tuple< double, double, double > > &categoryBinCentres)
 Given a particle mass hypothesis' pdgId, store the list of MVA weight files (one for each category) into the payload.
 
void storeMVAWeightsMultiClass (const std::vector< std::string > &filepaths, const std::vector< std::tuple< double, double, double > > &categoryBinCentres)
 For the multi-class mode, store the list of MVA weight files (one for each category) into the payload.
 
void storeCuts (const int pdg, const std::vector< std::string > &cutfiles, const std::vector< std::tuple< double, double, double > > &categoryBinCentres)
 Given a particle mass hypothesis' pdgId, store the list of selection cuts (one for each category) into the payload.
 
void storeCutsMultiClass (const std::vector< std::string > &cutfiles, const std::vector< std::tuple< double, double, double > > &categoryBinCentres)
 For the multi-class mode, store the list of selection cuts (one for each category) into the payload.
 
void storeAliases (const VariablesByAlias &aliases)
 Store the map associating variable aliases to variable names knowm to VariableManager.
 
const TH3F * getWeightCategories () const
 Get the raw pointer to the 3D grid representing the categories for which weightfiles are defined.
 
const std::vector< std::string > * getMVAWeights (const int pdg) const
 Given a particle mass hypothesis' pdgId, get the list of (serialized) MVA weightfiles stored in the payload, one for each category.
 
const std::vector< std::string > * getMVAWeightsMulticlass () const
 For the multi-class mode, get the list of (serialized) MVA weightfiles stored in the payload, one for each category.
 
const std::vector< std::string > * getCuts (const int pdg) const
 Given a particle mass hypothesis' pdgId, get the list of selection cuts stored in the payload, one for each category.
 
const std::vector< std::string > * getCutsMulticlass () const
 For the multi-class mode, get the list of selection cuts stored in the payload, one for each category.
 
const VariablesByAliasgetAliases () const
 Get the map of unique aliases.
 
unsigned int getMVAWeightIdx (const double &theta, const double &p, const double &charge, int &idx_theta, int &idx_p, int &idx_charge) const
 Get the index of the XML weight file, for a given reconstructed triplet (clusterTheta(theta), p, charge).
 
unsigned int getMVAWeightIdx (const double &theta, const double &p, const double &charge) const
 Overloaded method, to be used if not interested in knowing the 3D bin coordinates.
 
void dumpPayload (const double &theta, const double &p, const double &charge, const int pdg, bool dump_all=false) const
 Read and dump the payload content from the internal 'matrioska' maps into an XML weightfile for the given set of inputs.
 
void dumpPayloadMulticlass (const double &theta, const double &p, const double &charge) const
 Special version for multi-class mode.
 
bool isValidPdg (const int pdg) const
 Check if the input pdgId is that of a valid charged particle.
 
std::string getThetaVarName () const
 Get the name of the polar angle variable.
 
bool hasImplicitNaNmasking () const
 Check flag for implicit NaN masking.
 

Private Types

typedef std::unordered_map< int, std::vector< std::string > > WeightfilesByParticle
 Typedef.
 
typedef std::map< std::string, std::string > VariablesByAlias
 Typedef.
 

Private Member Functions

int findBin (const double &x, const double &y, const double &z) const
 Find global bin index of the 3D categories histogram for the given (x, y, z) values.
 
 ClassDef (ChargedPidMVAWeights, 10)
 2: add energy/angular units.
 

Private Attributes

TParameter< double > m_energy_unit
 The energy unit used for defining the bins grid.
 
TParameter< double > m_ang_unit
 The angular unit used for defining the bins grid.
 
std::string m_thetaVarName
 The name of the polar angle variable used in the MVA categorisation.
 
bool m_implicitNaNmasking
 Flag to indicate whether the MVA variables have been NaN-masked directly in the weightfiles.
 
std::unique_ptr< TH3F > m_categories
 A 3D histogram whose bins represent the categories for which XML weight files are defined.
 
WeightfilesByParticle m_weightfiles
 For each charged particle mass hypothesis' pdgId, this map contains a list of (serialized) Weightfile objects to be stored in the payload.
 
WeightfilesByParticle m_cuts
 For each charged particle mass hypothesis' pdgId, this map contains a list of selection cuts to be stored in the payload.
 
VariablesByAlias m_aliases
 A map that associates variable aliases used in the MVA training to variable names known to the VariableManager.
 

Detailed Description

Class to contain the payload of MVA weightfiles needed for charged particle identification.

Definition at line 34 of file ChargedPidMVAWeights.h.

Member Typedef Documentation

◆ VariablesByAlias

typedef std::map<std::string, std::string> VariablesByAlias
private

Typedef.

Definition at line 37 of file ChargedPidMVAWeights.h.

◆ WeightfilesByParticle

typedef std::unordered_map<int, std::vector<std::string> > WeightfilesByParticle
private

Typedef.

Definition at line 36 of file ChargedPidMVAWeights.h.

Member Enumeration Documentation

◆ ChargedPidMVATrainingMode

enum class ChargedPidMVATrainingMode : unsigned int
strong

A (strongly-typed) enumerator identifier for each valid MVA training mode.

Enumerator
c_Classification 

Binary classification.

c_Multiclass 

Multi-class classification.

c_ECL_Classification 

Binary classification, ECL only.

c_ECL_Multiclass 

Multi-class classification, ECL only.

c_PSD_Classification 

Binary classification, including PSD.

c_PSD_Multiclass 

Multi-class classification, including PSD.

c_ECL_PSD_Classification 

Binary classification, ECL only, including PSD.

c_ECL_PSD_Multiclass 

Multi-class classification, ECL only, including PSD.

Definition at line 73 of file ChargedPidMVAWeights.h.

73 : unsigned int {
75 c_Classification = 0,
77 c_Multiclass = 1,
79 c_ECL_Classification = 2,
81 c_ECL_Multiclass = 3,
83 c_PSD_Classification = 4,
85 c_PSD_Multiclass = 5,
87 c_ECL_PSD_Classification = 6,
89 c_ECL_PSD_Multiclass = 7
90 };

Constructor & Destructor Documentation

◆ ChargedPidMVAWeights() [1/2]

Default constructor, necessary for ROOT to stream the object.

Definition at line 44 of file ChargedPidMVAWeights.h.

44 :
45 m_energy_unit("energyUnit", Unit::GeV),
46 m_ang_unit("angularUnit", Unit::rad),
47 m_thetaVarName("clusterTheta"),
48 m_implicitNaNmasking(false)
49 {};

◆ ChargedPidMVAWeights() [2/2]

ChargedPidMVAWeights ( const double & energyUnit,
const double & angUnit,
const std::string & thetaVarName = "clusterTheta",
bool implictNaNmasking = false )
inline

Specialized constructor.

Definition at line 55 of file ChargedPidMVAWeights.h.

58 {
59 setEnergyUnit(energyUnit);
60 setAngularUnit(angUnit);
61 m_thetaVarName = thetaVarName;
62 m_implicitNaNmasking = implictNaNmasking;
63 }

◆ ~ChargedPidMVAWeights()

~ChargedPidMVAWeights ( )
inline

Destructor.

Definition at line 68 of file ChargedPidMVAWeights.h.

68{};

Member Function Documentation

◆ ClassDef()

ClassDef ( ChargedPidMVAWeights ,
10  )
private

2: add energy/angular units.

  1. Add name of polar angle variable used for categorisation, and a boolean flag to check if implicit NaN masking is set in the input data.9. Add map of variable aliases and original basf2 vars.8. Use unique_ptr for m_categories.7. Use double instead of float in tuple.6. Introduce charge bin in the parametrisation.5. remove 2D grid dependence on pdgId, add multi-class support, define enum for valid training modes4. add cuts map.3. add overloaded getMVAWeightIdx. 1: first class implementation.

◆ dumpPayload()

void dumpPayload ( const double & theta,
const double & p,
const double & charge,
const int pdg,
bool dump_all = false ) const
inline

Read and dump the payload content from the internal 'matrioska' maps into an XML weightfile for the given set of inputs.

Useful for debugging.

Parameters
thetathe particle polar angle (from the cluster, or from the track if no cluster match) in [rad].
pthe particle momentum (from the track) in [GeV/c].
chargethe particle charge (from the track).
pdgthe particle mass hypothesis' pdgId.
dump_alldump all information.

Definition at line 391 of file ChargedPidMVAWeights.h.

392 {
393
394 B2INFO("Dumping payload content for:");
395 B2INFO("clusterTheta(theta) = " << theta << " [rad], p = " << p << " [GeV/c], charge = " << charge);
396
397 if (m_categories) {
398 std::string filename = "db_payload_chargedpidmva__theta_p_charge_categories.root";
399 B2INFO("\tWriting ROOT file w/ TH3F grid that defines categories:" << filename);
400 auto f = std::make_unique<TFile>(filename.c_str(), "RECREATE");
401 m_categories->Write();
402 f->Close();
403 } else {
404 B2WARNING("\tThe TH3F object that defines categories is a nullptr!");
405 }
406
407 for (const auto& [pdgId, weights] : m_weightfiles) {
408
409 if (!dump_all && pdg != pdgId) continue;
410
411 auto idx = getMVAWeightIdx(theta, p, charge);
412
413 auto serialized_weightfile = weights.at(idx);
414
415 std::string filename = "db_payload_chargedpidmva__weightfile_pdg_" + std::to_string(pdgId) +
416 "_glob_bin_" + std::to_string(idx + 1) + ".xml";
417
418 auto cutstr = getCuts(pdgId)->at(idx);
419
420 B2INFO("\tpdgId = " << pdgId);
421 B2INFO("\tCut: " << cutstr);
422 B2INFO("\tWriting weight file: " << filename);
423
424 std::ofstream weightfile;
425 weightfile.open(filename.c_str(), std::ios::out);
426 weightfile << serialized_weightfile << std::endl;
427 weightfile.close();
428
429 }
430
431 };

◆ dumpPayloadMulticlass()

void dumpPayloadMulticlass ( const double & theta,
const double & p,
const double & charge ) const
inline

Special version for multi-class mode.

Uses the special value of pdg=0 reserved for multi-class mode.

Definition at line 438 of file ChargedPidMVAWeights.h.

439 {
440 dumpPayload(theta, p, charge, 0);
441 }

◆ findBin()

int findBin ( const double & x,
const double & y,
const double & z ) const
inlineprivate

Find global bin index of the 3D categories histogram for the given (x, y, z) values.

This method had to be re-implemented b/c ROOT has no const version of TH1::FindBin() :(

Parameters
xvalue along the x axis.
yvalue along the y axis.
zvalue along the z axis.
Returns
the global linearised bin index.

Definition at line 483 of file ChargedPidMVAWeights.h.

484 {
485
486 int nbinsx_vis = m_categories->GetXaxis()->GetNbins();
487 int nbinsy_vis = m_categories->GetYaxis()->GetNbins();
488 int nbinsz_vis = m_categories->GetZaxis()->GetNbins();
489
490 double xx = x;
491 double yy = y;
492 double zz = z;
493
494 // If x, y, z are outside of the 3D grid (visible) range, set their value to
495 // fall in the last (first) bin before (after) overflow (underflow).
496 if (x < m_categories->GetXaxis()->GetBinLowEdge(1)) { xx = m_categories->GetXaxis()->GetBinCenter(1); }
497 if (x >= m_categories->GetXaxis()->GetBinLowEdge(nbinsx_vis + 1)) { xx = m_categories->GetXaxis()->GetBinCenter(nbinsx_vis); }
498 if (y < m_categories->GetYaxis()->GetBinLowEdge(1)) { yy = m_categories->GetYaxis()->GetBinCenter(1); }
499 if (y >= m_categories->GetYaxis()->GetBinLowEdge(nbinsy_vis + 1)) { yy = m_categories->GetYaxis()->GetBinCenter(nbinsy_vis); }
500 if (z < m_categories->GetZaxis()->GetBinLowEdge(1)) { zz = m_categories->GetZaxis()->GetBinCenter(1); }
501 if (z >= m_categories->GetZaxis()->GetBinLowEdge(nbinsz_vis + 1)) { zz = m_categories->GetZaxis()->GetBinCenter(nbinsz_vis); }
502
503 int nbinsx = m_categories->GetXaxis()->GetNbins() + 2;
504 int nbinsy = m_categories->GetYaxis()->GetNbins() + 2;
505
506 int j = m_categories->GetXaxis()->FindBin(xx);
507 int i = m_categories->GetYaxis()->FindBin(yy);
508 int k = m_categories->GetZaxis()->FindBin(zz);
509
510 return j + nbinsx * (i + nbinsy * k);
511 }

◆ getAliases()

const VariablesByAlias * getAliases ( ) const
inline

Get the map of unique aliases.

Definition at line 333 of file ChargedPidMVAWeights.h.

334 {
335 return &m_aliases;
336 }

◆ getCuts()

const std::vector< std::string > * getCuts ( const int pdg) const
inline

Given a particle mass hypothesis' pdgId, get the list of selection cuts stored in the payload, one for each category.

Parameters
pdgthe particle mass hypothesis' pdgId.

Definition at line 313 of file ChargedPidMVAWeights.h.

314 {
315 return &(m_cuts.at(pdg));
316 }

◆ getCutsMulticlass()

const std::vector< std::string > * getCutsMulticlass ( ) const
inline

For the multi-class mode, get the list of selection cuts stored in the payload, one for each category.

Uses the special value of pdg=0 reserved for multi-class mode.

Definition at line 324 of file ChargedPidMVAWeights.h.

325 {
326 return getCuts(0);
327 }

◆ getMVAWeightIdx() [1/2]

unsigned int getMVAWeightIdx ( const double & theta,
const double & p,
const double & charge ) const
inline

Overloaded method, to be used if not interested in knowing the 3D bin coordinates.

Definition at line 375 of file ChargedPidMVAWeights.h.

376 {
377 int idx_theta, idx_p, idx_charge;
378 return getMVAWeightIdx(theta, p, charge, idx_theta, idx_p, idx_charge);
379 }

◆ getMVAWeightIdx() [2/2]

unsigned int getMVAWeightIdx ( const double & theta,
const double & p,
const double & charge,
int & idx_theta,
int & idx_p,
int & idx_charge ) const
inline

Get the index of the XML weight file, for a given reconstructed triplet (clusterTheta(theta), p, charge).

The index is obtained by linearising the 3D m_categories histogram. The same index can be used to look up the correct MVAExpert, Dataset and Cut in the application module, hence we believe it's more useful to return the index rather than a pointer to the weightfile itself. The function also retrieves the 3D bin coordinates.

Parameters
thetathe particle polar angle (from the cluster, or from the track if no cluster match) in [rad].
pthe particle momentum (from the track) in [GeV/c].
chargethe particle charge (from the track).
[out]idx_thetathe index of the 3D bin along the theta (X) axis.
[out]idx_pthe index of the 3D bin along the p (Y) axis.
[out]idx_chargethe index of the 3D bin along the charge (Z) axis.
Returns
the index of the weightfile of interest from the array of weightfiles.

Definition at line 353 of file ChargedPidMVAWeights.h.

355 {
356
357 if (!m_categories) {
358 B2FATAL("No (clusterTheta, p, charge) TH3 grid was found in the DB payload. Most likely, you are using a GT w/ an old payload which is no longer compatible with the DB object class implementation. This should not happen! Abort...");
359 }
360
361 int nbins_th = m_categories->GetXaxis()->GetNbins(); // nr. of theta (visible) bins, along X.
362 int nbins_p = m_categories->GetYaxis()->GetNbins(); // nr. of p (visible) bins, along Y.
363
364 int glob_bin_idx = findBin(theta / m_ang_unit.GetVal(), p / m_energy_unit.GetVal(), charge);
365 m_categories->GetBinXYZ(glob_bin_idx, idx_theta, idx_p, idx_charge);
366
367 // The index of the linearised 3D m_categories.
368 // The unit offset is b/c ROOT sets global bin idx also for overflows and underflows.
369 return (idx_theta - 1) + nbins_th * ((idx_p - 1) + nbins_p * (idx_charge - 1));
370 }

◆ getMVAWeights()

const std::vector< std::string > * getMVAWeights ( const int pdg) const
inline

Given a particle mass hypothesis' pdgId, get the list of (serialized) MVA weightfiles stored in the payload, one for each category.

Parameters
pdgthe particle mass hypothesis' pdgId.

Definition at line 291 of file ChargedPidMVAWeights.h.

292 {
293 return &(m_weightfiles.at(pdg));
294 }

◆ getMVAWeightsMulticlass()

const std::vector< std::string > * getMVAWeightsMulticlass ( ) const
inline

For the multi-class mode, get the list of (serialized) MVA weightfiles stored in the payload, one for each category.

Uses the special value of pdg=0 reserved for multi-class mode.

Definition at line 302 of file ChargedPidMVAWeights.h.

303 {
304 return getMVAWeights(0);
305 }

◆ getThetaVarName()

std::string getThetaVarName ( ) const
inline

Get the name of the polar angle variable.

Definition at line 457 of file ChargedPidMVAWeights.h.

458 {
459 return m_thetaVarName;
460 }

◆ getWeightCategories()

const TH3F * getWeightCategories ( ) const
inline

Get the raw pointer to the 3D grid representing the categories for which weightfiles are defined.

Used just to view the stored data.

Definition at line 280 of file ChargedPidMVAWeights.h.

281 {
282 return m_categories.get();
283 }

◆ hasImplicitNaNmasking()

bool hasImplicitNaNmasking ( ) const
inline

Check flag for implicit NaN masking.

Definition at line 466 of file ChargedPidMVAWeights.h.

467 {
468 return m_implicitNaNmasking;
469 }

◆ isValidPdg()

bool isValidPdg ( const int pdg) const
inline

Check if the input pdgId is that of a valid charged particle.

An input value of pdg=0 is considered valid, since it's reserved for multi-class mode.

Definition at line 448 of file ChargedPidMVAWeights.h.

449 {
450 bool isValid = (Const::chargedStableSet.find(pdg) != Const::invalidParticle) || (pdg == 0);
451 return isValid;
452 }
bool isValid(EForwardBackward eForwardBackward)
Check whether the given enum instance is one of the valid values.

◆ setAngularUnit()

void setAngularUnit ( const double & unit)
inline

Set the angular unit to ensure consistency w/ the one used to define the bins grid.

Definition at line 102 of file ChargedPidMVAWeights.h.

102{ m_ang_unit.SetVal(unit); }

◆ setEnergyUnit()

void setEnergyUnit ( const double & unit)
inline

Set the energy unit to ensure consistency w/ the one used to define the bins grid.

Definition at line 96 of file ChargedPidMVAWeights.h.

96{ m_energy_unit.SetVal(unit); }

◆ setWeightCategories()

void setWeightCategories ( const double * clusterThetaBins,
const int nClusterThetaBins,
const double * pBins,
const int nPBins,
const double * chargeBins,
const int nChargeBins )
inline

Set the 3D (clusterTheta, p, charge) grid representing the categories for which weightfiles are defined.

Parameters
clusterThetaBinsarray of clusterTheta bin edges
nClusterThetaBinsnumber of clusterTheta bins
pBinsarray of p bin edges
nPBinsnumber of p bins
chargeBinsarray of charge bin edges
nChargeBinsnumber of charge bins

Definition at line 113 of file ChargedPidMVAWeights.h.

116 {
117
118 m_categories = std::make_unique<TH3F>("clustertheta_p_charge_binsgrid",
119 ";ECL cluster #theta;p_{lab};Q",
120 nClusterThetaBins, clusterThetaBins,
121 nPBins, pBins,
122 nChargeBins, chargeBins);
123 }

◆ storeAliases()

void storeAliases ( const VariablesByAlias & aliases)
inline

Store the map associating variable aliases to variable names knowm to VariableManager.

Parameters
aliasesa map of (alias, VM variable) pairs. NB: it is supposed to contain all the aliases for every category.

Definition at line 270 of file ChargedPidMVAWeights.h.

271 {
272 m_aliases = VariablesByAlias(aliases);
273 }

◆ storeCuts()

void storeCuts ( const int pdg,
const std::vector< std::string > & cutfiles,
const std::vector< std::tuple< double, double, double > > & categoryBinCentres )
inline

Given a particle mass hypothesis' pdgId, store the list of selection cuts (one for each category) into the payload.

Parameters
pdgthe particle mass hypothesis' pdgId.
cutfilesa list of text files w/ cut strings, for each (clusterTheta, p, charge) category. The format of the cut must comply with the GeneralCut syntax.
categoryBinCentresa list of <double, double, double> representing the (clusterTheta, p, charge) bin centres. Used to check consistency of the xml vector indexing w/ the linearised TH3 category map.

Definition at line 209 of file ChargedPidMVAWeights.h.

211 {
212
213 if (!isValidPdg(pdg)) {
214 B2FATAL("PDG: " << pdg << " is not that of a valid charged particle! Aborting...");
215 }
216
217 unsigned int idx(0);
218 for (const auto& cutfile : cutfiles) {
219
220 auto bin_centres_tuple = categoryBinCentres.at(idx);
221
222 auto theta_bin_centre = std::get<0>(bin_centres_tuple);
223 auto p_bin_centre = std::get<1>(bin_centres_tuple);
224 auto charge_bin_centre = std::get<2>(bin_centres_tuple);
225
226 auto h_idx = getMVAWeightIdx(theta_bin_centre, p_bin_centre, charge_bin_centre);
227 if (idx != h_idx) {
228 B2FATAL("Cut file:\n" << cutfile << "\nindex in input vector:\n" << idx << "\ndoes not correspond to:\n" << h_idx <<
229 "\n, i.e. the linearised index of the 3D bin centered in (clusterTheta, p, charge) = (" << theta_bin_centre << ", " << p_bin_centre
230 << ", " <<
231 charge_bin_centre <<
232 ")\nPlease check how the input cut file list is being filled.");
233 }
234
235 std::ifstream ifs(cutfile);
236 std::string cut((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
237
238 // Strip trailing newline.
239 cut.erase(std::remove(cut.begin(), cut.end(), '\n'), cut.end());
240
241 m_cuts[pdg].push_back(cut);
242
243 ++idx;
244 }
245
246 }

◆ storeCutsMultiClass()

void storeCutsMultiClass ( const std::vector< std::string > & cutfiles,
const std::vector< std::tuple< double, double, double > > & categoryBinCentres )
inline

For the multi-class mode, store the list of selection cuts (one for each category) into the payload.

Uses the special value of pdg=0 reserved for multi-class mode.

Parameters
cutfilesa list of text files w/ cut strings, for each (clusterTheta, p, charge) category. The format of the cut must comply with the GeneralCut syntax.
categoryBinCentresa list of <double, double, double> representing the (clusterTheta, p, charge) bin centres. Used to check consistency of the xml vector indexing w/ the linearised TH3 category map.

Definition at line 258 of file ChargedPidMVAWeights.h.

260 {
261 storeCuts(0, cutfiles, categoryBinCentres);
262 }

◆ storeMVAWeights()

void storeMVAWeights ( const int pdg,
const std::vector< std::string > & filepaths,
const std::vector< std::tuple< double, double, double > > & categoryBinCentres )
inline

Given a particle mass hypothesis' pdgId, store the list of MVA weight files (one for each category) into the payload.

Parameters
pdgthe particle mass hypothesis' pdgId.
filepathsa list of xml (root) file paths for several (clusterTheta, p, charge) categories.
categoryBinCentresa list of <double, double, double> representing the (clusterTheta, p, charge) bin centres. Used to check consistency of the xml vector indexing w/ the linearised TH3 category map.

Definition at line 134 of file ChargedPidMVAWeights.h.

136 {
137
138 if (!isValidPdg(pdg)) {
139 B2FATAL("PDG: " << pdg << " is not that of a valid charged particle! Aborting...");
140 }
141
142 unsigned int idx(0);
143 for (const auto& path : filepaths) {
144
145 // Index consistency check.
146 auto bin_centres_tuple = categoryBinCentres.at(idx);
147
148 auto theta_bin_centre = std::get<0>(bin_centres_tuple);
149 auto p_bin_centre = std::get<1>(bin_centres_tuple);
150 auto charge_bin_centre = std::get<2>(bin_centres_tuple);
151
152 auto h_idx = getMVAWeightIdx(theta_bin_centre, p_bin_centre, charge_bin_centre);
153 if (idx != h_idx) {
154 B2FATAL("xml file:\n" << path << "\nindex in input vector:\n" << idx << "\ndoes not correspond to:\n" << h_idx <<
155 "\n, i.e. the linearised index of the 3D bin centered in (clusterTheta, p, charge) = (" << theta_bin_centre << ", " << p_bin_centre
156 << ", " <<
157 charge_bin_centre <<
158 ")\nPlease check how the input xml file list is being filled.");
159 }
160
161 MVA::Weightfile weightfile;
162 if (path.ends_with(".root")) {
163 weightfile = MVA::Weightfile::loadFromROOTFile(path);
164 } else if (path.ends_with(".xml")) {
165 weightfile = MVA::Weightfile::loadFromXMLFile(path);
166 } else {
167 B2WARNING("Unknown file extension for file: " << path << ", fallback to xml...");
168 weightfile = MVA::Weightfile::loadFromXMLFile(path);
169 }
170
171 // Serialize the MVA::Weightfile object into a string for storage in the database,
172 // otherwise there are issues w/ dictionary generation for the payload class...
173 std::stringstream ss;
174 MVA::Weightfile::saveToStream(weightfile, ss);
175 m_weightfiles[pdg].push_back(ss.str());
176
177 ++idx;
178 }
179
180 }

◆ storeMVAWeightsMultiClass()

void storeMVAWeightsMultiClass ( const std::vector< std::string > & filepaths,
const std::vector< std::tuple< double, double, double > > & categoryBinCentres )
inline

For the multi-class mode, store the list of MVA weight files (one for each category) into the payload.

Uses the special value of pdg=0 reserved for multi-class mode.

Parameters
filepathsa list of xml (root) file paths for several (clusterTheta, p, charge) categories.
categoryBinCentresa list of <double, double, double> representing the (clusterTheta, p, charge) bin centres. Used to check consistency of the xml vector indexing w/ the linearised TH3 category map.

Definition at line 192 of file ChargedPidMVAWeights.h.

194 {
195 storeMVAWeights(0, filepaths, categoryBinCentres);
196 }

Member Data Documentation

◆ m_aliases

VariablesByAlias m_aliases
private

A map that associates variable aliases used in the MVA training to variable names known to the VariableManager.

Definition at line 572 of file ChargedPidMVAWeights.h.

◆ m_ang_unit

TParameter<double> m_ang_unit
private

The angular unit used for defining the bins grid.

Definition at line 518 of file ChargedPidMVAWeights.h.

◆ m_categories

std::unique_ptr<TH3F> m_categories
private

A 3D histogram whose bins represent the categories for which XML weight files are defined.

It is used to lookup the correct file in the payload, given a reconstructed set of (clusterTheta(theta), p, charge).

Definition at line 528 of file ChargedPidMVAWeights.h.

◆ m_cuts

WeightfilesByParticle m_cuts
private
Initial value:
= {
{ 0, std::vector<std::string>() },
{ Const::electron.getPDGCode(), std::vector<std::string>() },
{ Const::muon.getPDGCode(), std::vector<std::string>() },
{ Const::pion.getPDGCode(), std::vector<std::string>() },
{ Const::kaon.getPDGCode(), std::vector<std::string>() },
{ Const::proton.getPDGCode(), std::vector<std::string>() },
{ Const::deuteron.getPDGCode(), std::vector<std::string>() }
}
static const ChargedStable muon
muon particle
Definition Const.h:660
static const ChargedStable electron
electron particle
Definition Const.h:659

For each charged particle mass hypothesis' pdgId, this map contains a list of selection cuts to be stored in the payload.

To each Weightfile (i.e., category) corresponds a cut. The indexing in each vector must reflect the one of the corresponding 'linearised' TH3F histogram contained in the m_grids map.

The dummy pdgId=0 key is reserved for multi-class, where a unique signal hypothesis is not defined.

Definition at line 558 of file ChargedPidMVAWeights.h.

558 {
559 { 0, std::vector<std::string>() },
560 { Const::electron.getPDGCode(), std::vector<std::string>() },
561 { Const::muon.getPDGCode(), std::vector<std::string>() },
562 { Const::pion.getPDGCode(), std::vector<std::string>() },
563 { Const::kaon.getPDGCode(), std::vector<std::string>() },
564 { Const::proton.getPDGCode(), std::vector<std::string>() },
565 { Const::deuteron.getPDGCode(), std::vector<std::string>() }
566 };

◆ m_energy_unit

TParameter<double> m_energy_unit
private

The energy unit used for defining the bins grid.

Definition at line 517 of file ChargedPidMVAWeights.h.

◆ m_implicitNaNmasking

bool m_implicitNaNmasking
private

Flag to indicate whether the MVA variables have been NaN-masked directly in the weightfiles.

Definition at line 521 of file ChargedPidMVAWeights.h.

◆ m_thetaVarName

std::string m_thetaVarName
private

The name of the polar angle variable used in the MVA categorisation.

Must be a string that can be parsed by the VariableManager.

Definition at line 520 of file ChargedPidMVAWeights.h.

◆ m_weightfiles

WeightfilesByParticle m_weightfiles
private
Initial value:
= {
{ 0, std::vector<std::string>() },
{ Const::electron.getPDGCode(), std::vector<std::string>() },
{ Const::muon.getPDGCode(), std::vector<std::string>() },
{ Const::pion.getPDGCode(), std::vector<std::string>() },
{ Const::kaon.getPDGCode(), std::vector<std::string>() },
{ Const::proton.getPDGCode(), std::vector<std::string>() },
{ Const::deuteron.getPDGCode(), std::vector<std::string>() }
}

For each charged particle mass hypothesis' pdgId, this map contains a list of (serialized) Weightfile objects to be stored in the payload.

Each weightfile in the list corresponds to a 3D category. The indexing in each vector must reflect the one of the corresponding 'linearised' TH3F histogram contained in the m_grids map.

The dummy pdgId=0 key is reserved for multi-class, where a unique signal hypothesis is not defined.

Definition at line 539 of file ChargedPidMVAWeights.h.

539 {
540 { 0, std::vector<std::string>() },
541 { Const::electron.getPDGCode(), std::vector<std::string>() },
542 { Const::muon.getPDGCode(), std::vector<std::string>() },
543 { Const::pion.getPDGCode(), std::vector<std::string>() },
544 { Const::kaon.getPDGCode(), std::vector<std::string>() },
545 { Const::proton.getPDGCode(), std::vector<std::string>() },
546 { Const::deuteron.getPDGCode(), std::vector<std::string>() }
547 };

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