Belle II Software  release-08-01-10
GRLNeuroModule.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 
10 #include <framework/datastore/StoreArray.h>
11 #include <framework/datastore/StoreObjPtr.h>
12 #include <framework/dataobjects/EventMetaData.h>
13 #include <framework/core/ModuleParam.templateDetails.h>
14 #include <framework/gearbox/Unit.h>
15 #include <framework/utilities/FileSystem.h>
16 #include <analysis/utility/PCmsLabTransform.h>
17 #include <trg/ecl/TrgEclMapping.h>
18 #include <trg/ecl/dataobjects/TRGECLCluster.h>
19 #include <trg/grl/dataobjects/GRLMLPData.h>
20 #include <trg/grl/dataobjects/TRGGRLInfo.h>
21 #include "trg/grl/dataobjects/TRGGRLUnpackerStore.h"
22 #include "trg/grl/modules/trggrlneuralnet/GRLNeuroModule.h"
23 
24 #include <fstream>
25 #include <cmath>
26 #include <TFile.h>
27 
28 using namespace Belle2;
29 using namespace std;
30 
31 //-----------------------------------------------------------------
32 // Register the Module
33 //-----------------------------------------------------------------
35 
36 //-----------------------------------------------------------------
37 // Implementation
38 //-----------------------------------------------------------------
39 //
41 {
43  "The NeuroTrigger module of the GRL.\n"
44  "Takes CDC track and ECL cluster to prepare input data\n"
45  "for the training of a neural network.\n"
46  "Networks are trained after the event loop and saved."
47  );
49  // parameters for saving / loading
50  addParam("TrgGrlInformation", m_TrgGrlInformationName,
51  "Name of the StoreArray holding the information of tracks and clusters from cdc ecl klm.",
52  string("TRGGRLObjects"));
53  addParam("HistFileName", m_HistFileName,
54  "Name of the root file saving the output histogram.",
55  string("hist.root"));
56  addParam("SaveHist", m_saveHist,
57  "Save the output histogram to root file.",
58  false);
59  addParam("nMLP", m_parameters.nMLP,
60  "Number of expert MLPs.", m_parameters.nMLP);
61  addParam("n_cdc_sector", m_parameters.n_cdc_sector,
62  "Number of expert CDC MLPs.", m_parameters.n_cdc_sector);
63  addParam("n_ecl_sector", m_parameters.n_ecl_sector,
64  "Number of expert ECL MLPs.", m_parameters.n_ecl_sector);
65  addParam("i_cdc_sector", m_parameters.i_cdc_sector,
66  "#cdc track of expert MLPs.", m_parameters.i_cdc_sector);
67  addParam("i_ecl_sector", m_parameters.i_ecl_sector,
68  "#ecl cluster of expert MLPs.", m_parameters.i_ecl_sector);
69  addParam("nHidden", m_parameters.nHidden,
70  "Number of nodes in each hidden layer for all networks "
71  "or factor to multiply with number of inputs (1 list or nMLP lists). "
72  "The number of layers is derived from the shape.",
74  addParam("multiplyHidden", m_parameters.multiplyHidden,
75  "If true, multiply nHidden with number of input nodes.",
77  addParam("outputScale", m_parameters.outputScale,
78  "Output scale for all networks (1 value list or nMLP value lists). "
79  "Output[i] of the MLP is scaled from [-1, 1] "
80  "to [outputScale[2*i], outputScale[2*i+1]]. "
81  "(units: z[cm] / theta[degree])",
83  addParam("weightFiles", m_weightFileNames,
84  "Name of the file where the weights of MLPs are saved. "
85  "the default file is $BELLE2_LOCAL_DIR/data/trg/grl/weights.dat",
86  {FileSystem::findFile("/data/trg/grl/weights.dat", true)});
87  addParam("biasFiles", m_biasFileNames,
88  "Name of the file where the biases of MLPs are saved. "
89  "the default file is $BELLE2_LOCAL_DIR/data/trg/grl/bias.dat",
90  {FileSystem::findFile("/data/trg/grl/bias.dat", true)});
91  addParam("TRGECLClusters", m_TrgECLClusterName,
92  "Name of the StoreArray holding the information of trigger ecl clusters ",
93  string("TRGECLClusters"));
94  addParam("MVACut", m_nn_thres,
95  "Cut value applied to the MLP output",
96  {0.4});
97 }
98 
99 
100 void
102 {
103 
105  for (unsigned it = 0; it < m_parameters.nMLP; it++) {
106  if (!m_GRLNeuro.load(it, m_weightFileNames[it], m_biasFileNames[it])) {
107  B2ERROR("NeuroTrigger could not be loaded correctly.");
108  }
109  }
110  TrgEclMapping* trgecl_obj = new TrgEclMapping();
111  for (int tc = 1; tc <= 576; tc++) {
112  TCThetaID.push_back(trgecl_obj->getTCThetaIdFromTCId(tc));
113  }
114 
115  //-----------------------------------------------------------------------------------------
116  //..ECL look up tables
117  PCmsLabTransform boostrotate;
118  for (int tc = 1; tc <= 576; tc++) {
119 
120  //..Four vector of a 1 GeV lab photon at this TC
121  TVector3 CellPosition = trgecl_obj->getTCPosition(tc);
122  ROOT::Math::PxPyPzEVector CellLab;
123  CellLab.SetPx(CellPosition.Unit().Px());
124  CellLab.SetPy(CellPosition.Unit().Py());
125  CellLab.SetPz(CellPosition.Unit().Pz());
126  CellLab.SetE(1.);
127 
128  //..cotan Theta and phi in lab
129  //TCPhiLab.push_back(CellPosition.Phi());
130  //double tantheta = tan(CellPosition.Theta());
131  //TCcotThetaLab.push_back(1. / tantheta);
132 
133  //..Corresponding 4 vector in the COM frame
134  ROOT::Math::PxPyPzEVector CellCOM = boostrotate.rotateLabToCms() * CellLab;
135  TCThetaCOM.push_back(CellCOM.Theta()*TMath::RadToDeg());
136  TCPhiCOM.push_back(CellCOM.Phi()*TMath::RadToDeg() + 180.0);
137 
138  }
139  if (m_saveHist) {
140  for (unsigned int isector = 0; isector < m_parameters.nMLP; isector++) {
141  h_target.push_back(new TH1D(("h_target_" + to_string(isector)).c_str(),
142  ("h_target_" + to_string(isector)).c_str(), 100, 0.0, 1.0));
143  }
144  }
145 
146  delete trgecl_obj;
147 
148 }
149 
150 void
152 {
153  //inputs and outputs
154  std::vector<float> MLPinput;
155  MLPinput.clear();
156  MLPinput.assign(19, 0);
157 
158  //ECL input
159  //..Use only clusters within 100 ns of event timing (from ECL).
160  //StoreArray<TRGECLTrg> trgArray;
163  //int ntrgArray = trgArray.getEntries();
164  //double EventTiming = -9999.;
165  //if (ntrgArray > 0) {EventTiming = trgArray[0]->getEventTiming();}
166  int necl = eclTrgClusterArray.getEntries();
167  for (int ic = 0; ic < necl; ic++) {
168  int TC = eclTrgClusterArray[ic]->getMaxTCId();
169  MLPinput[ic] = eclTrgClusterArray[ic]->getEnergyDep() * 1000.0;
170  MLPinput[ic + 6] = TCThetaCOM[TC - 1];
171  MLPinput[ic + 12] = TCPhiCOM[TC - 1];
172  }
173 
174  //Energy, theta and phi data are the quantized.
175  //Energy: LSB = ADC count (5MeV)
176  //theta : 0 ~ 180∘, LSB = 1.40625∘
177  //phi : 0 ~ 360∘, LSB = 1.40625∘
178  float LSB_ADC = 1 / 5.0;
179  float LSB_agnle = 1 / 1.40625;
180  std::for_each(MLPinput.begin() + 0, MLPinput.begin() + 6, [LSB_ADC](float & x) { x = std::ceil(x * LSB_ADC); });
181  std::for_each(MLPinput.begin() + 6, MLPinput.begin() + 12, [LSB_agnle](float & x) { x = std::ceil(x * LSB_agnle);});
182  std::for_each(MLPinput.begin() + 12, MLPinput.begin() + 18, [LSB_agnle](float & x) { x = std::ceil(x * LSB_agnle); });
183  MLPinput[18] = necl;
184 
185 //cout<<"input: ";
186 //for(int i=0;i<19;i++){
187 //cout<<MLPinput[i]<<" ";
188 //}
189 //cout<<endl;
190  float target = m_GRLNeuro.runMLP(0, MLPinput);
191 //cout<<"output: "<<target<<endl;
192  if (m_saveHist) {
193  h_target[0]->Fill(target);
194  }
195  if (target > m_nn_thres[0]) {
196  trgInfo->setTauNN(true);
197  } else trgInfo->setTauNN(false);
198 
199 }
200 
201 void
203 {
204  if (m_saveHist) {
205  TFile* file = new TFile(TString(m_HistFileName), "recreate");
206  for (unsigned int isector = 0; isector < m_parameters.nMLP; isector++) {
207  h_target[isector]->Write();
208  }
209  file->Write();
210  file->Close();
211  }
212 
213 }
static std::string findFile(const std::string &path, bool silent=false)
Search for given file or directory in local or central release directory, and return absolute path if...
Definition: FileSystem.cc:148
std::vector< float > TCThetaCOM
Polar angle of a given TRGcluster.
std::string m_HistFileName
Name of root file to save the histogram.
virtual void initialize() override
Initialize the module.
std::string m_TrgECLClusterName
Name of the StoreArray containing the ECL clusters.
std::vector< int > TCThetaID
TCID of a given TRGcluster.
GRLNeuro m_GRLNeuro
Instance of the NeuroTrigger.
virtual void event() override
Called once for each event.
GRLNeuro::Parameters m_parameters
Parameters for the NeuroTrigger.
GRLNeuroModule()
Constructor, for setting module description and parameters.
virtual void terminate() override
This method is called at the end of the event processing.
std::vector< std::string > m_weightFileNames
Name of file where network weights etc.
std::string m_TrgGrlInformationName
name of TRG GRL information object
bool m_saveHist
save the output histogram
std::vector< float > TCPhiCOM
Azimuth angle of a given TRGcluster.
std::vector< float > m_nn_thres
cut on MVA to separate signal
std::vector< TH1D * > h_target
Histograms to save the NN classifiers.
std::vector< std::string > m_biasFileNames
Name of file where network bias etc.
Class to represent the GRL Neuro.
Definition: GRLNeuro.h:35
void initialize(const Parameters &p)
Set parameters and get some network independent parameters.
Definition: GRLNeuro.cc:29
bool load(unsigned isector, const std::string &wfilename, const std::string &bfilename)
Load MLPs from file.
Definition: GRLNeuro.cc:154
float runMLP(unsigned isector, const std::vector< float > &input)
Run an expert MLP.
Definition: GRLNeuro.cc:87
Base class for Modules.
Definition: Module.h:72
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
Class to hold Lorentz transformations from/to CMS and boost vector.
const ROOT::Math::LorentzRotation rotateLabToCms() const
Returns Lorentz transformation from Lab to CMS.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:96
A class of TC Mapping.
Definition: TrgEclMapping.h:26
int getTCThetaIdFromTCId(int)
get [TC Theta ID] from [TC ID]
TVector3 getTCPosition(int)
TC position (cm)
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
Abstract base class for different kinds of events.
std::vector< std::vector< float > > outputScale
Output scale for all networks.
Definition: GRLNeuro.h:58
bool multiplyHidden
If true, multiply nHidden with number of input nodes.
Definition: GRLNeuro.h:56
unsigned nMLP
Number of networks.
Definition: GRLNeuro.h:47
unsigned n_ecl_sector
Number of ECL sectors.
Definition: GRLNeuro.h:64
std::vector< std::vector< float > > nHidden
Number of nodes in each hidden layer for all networks or factor to multiply with number of inputs.
Definition: GRLNeuro.h:52
unsigned n_cdc_sector
Number of CDC sectors.
Definition: GRLNeuro.h:61