Belle II Software development
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
28using namespace Belle2;
29using 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);
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
100void
102{
103
105 for (unsigned it = 0; it < m_parameters.nMLP; 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 ROOT::Math::XYZVector CellPosition = trgecl_obj->getTCPosition(tc);
122 ROOT::Math::PxPyPzEVector CellLab;
123 CellLab.SetPx(CellPosition.Unit().X());
124 CellLab.SetPy(CellPosition.Unit().Y());
125 CellLab.SetPz(CellPosition.Unit().Z());
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
150void
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
201void
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:151
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]
ROOT::Math::XYZVector getTCPosition(int)
TC position (cm)
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
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Abstract base class for different kinds of events.
STL namespace.
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