ATLAS Offline Software
Loading...
Searching...
No Matches
ISF::PunchThroughClassifier Class Reference

#include <PunchThroughClassifier.h>

Inheritance diagram for ISF::PunchThroughClassifier:
Collaboration diagram for ISF::PunchThroughClassifier:

Public Member Functions

 PunchThroughClassifier (const std::string &, const std::string &, const IInterface *)
 Constructor.
virtual ~PunchThroughClassifier ()=default
 Destructor.
virtual StatusCode initialize () override final
 AlgTool initialize method.
StatusCode initializeScaler (const std::string &scalerConfigFile)
 input variable MinMaxScaler initialize method
StatusCode initializeNetwork (const std::string &networkConfigFile)
 neural network initialize method
StatusCode initializeCalibrator (const std::string &calibratorConfigFile)
 isotonic regressor calibrator initialize method
virtual double computePunchThroughProbability (const ISF::ISFParticle &isfp, const TFCSSimulationState &simulstate) const override
 interface method to return probability prediction of punch through
std::map< std::string, std::map< std::string, double > > scaleInputs (std::map< std::string, std::map< std::string, double > > &inputs) const
 scale NN inputs using MinMaxScaler
double calibrateOutput (double &networkOutput) const
 calibrate NN output using isotonic regressor

Static Public Member Functions

static std::map< std::string, std::map< std::string, double > > computeInputs (const ISF::ISFParticle &isfp, const TFCSSimulationState &simulstate)
 calcalate NN inputs based on isfp and simulstate

Private Attributes

std::unique_ptr< lwt::LightweightGraph > m_graph {}
 NN graph.
double m_scalerMin {}
 input variable MinMaxScaler members
double m_scalerMax {}
std::map< std::string, double > m_scalerMinMap
std::map< std::string, double > m_scalerMaxMap
std::string m_calibratorConfigFile
 isotonic regressor calibrator members
double m_calibrationMin {}
double m_calibrationMax {}
std::map< double, double > m_calibrationMap
std::string m_networkConfigFileName
std::string m_scalerConfigFileName
std::string m_calibratorConfigFileName

Detailed Description

Definition at line 26 of file PunchThroughClassifier.h.

Constructor & Destructor Documentation

◆ PunchThroughClassifier()

ISF::PunchThroughClassifier::PunchThroughClassifier ( const std::string & type,
const std::string & name,
const IInterface * parent )

Constructor.

Definition at line 28 of file PunchThroughClassifier.cxx.

29 : base_class(type, name, parent) {
30
31 declareProperty( "ScalerConfigFileName", m_scalerConfigFileName );
32 declareProperty( "NetworkConfigFileName", m_networkConfigFileName );
33 declareProperty( "CalibratorConfigFileName", m_calibratorConfigFileName );
34}

◆ ~PunchThroughClassifier()

virtual ISF::PunchThroughClassifier::~PunchThroughClassifier ( )
virtualdefault

Destructor.

Member Function Documentation

◆ calibrateOutput()

double ISF::PunchThroughClassifier::calibrateOutput ( double & networkOutput) const

calibrate NN output using isotonic regressor

Definition at line 202 of file PunchThroughClassifier.cxx.

202 {
203
204 //calibrate output of network using isotonic regressor model
205
206 //if network output is outside of the range of isotonic regressor then return min and max values
207 if (networkOutput < m_calibrationMin){
208 return m_calibrationMin;
209 }
210 else if (networkOutput > m_calibrationMax){
211 return m_calibrationMax;
212 }
213
214 //otherwise find neighbouring points in isotonic regressor
215 auto upper = m_calibrationMap.upper_bound(networkOutput);
216 auto lower = upper--;
217
218 //Perform linear interpolation between points
219 double m = (upper->second - lower->second)/(upper->first - lower->first);
220 double c = lower->second - m * lower->first;
221 double calibrated = m * networkOutput + c;
222
223 return calibrated;
224}
int upper(int c)
std::map< double, double > m_calibrationMap

◆ computeInputs()

std::map< std::string, std::map< std::string, double > > ISF::PunchThroughClassifier::computeInputs ( const ISF::ISFParticle & isfp,
const TFCSSimulationState & simulstate )
static

calcalate NN inputs based on isfp and simulstate

Definition at line 161 of file PunchThroughClassifier.cxx.

161 {
162
163 //calculate inputs for NN
164
165 std::map<std::string, std::map<std::string, double> > networkInputs;
166
167 //add initial particle and total energy variables
168 networkInputs["node_0"] = {
169 {"variable_0", isfp.momentum().mag() },
170 {"variable_1", std::abs(isfp.position().eta()) },
171 {"variable_2", isfp.position().phi() },
172 {"variable_3", simulstate.E()},
173 };
174
175 //add energy fraction variables
176 for (unsigned int i = 0; i < 24; i++){
177 networkInputs["node_0"].insert({"variable_" + std::to_string(i + 4), simulstate.Efrac(i)});
178 }
179
180 return networkInputs;
181}
const Amg::Vector3D & momentum() const
The current momentum vector of the ISFParticle.
const Amg::Vector3D & position() const
The current position of the ISFParticle.
double Efrac(int sample) const

◆ computePunchThroughProbability()

double ISF::PunchThroughClassifier::computePunchThroughProbability ( const ISF::ISFParticle & isfp,
const TFCSSimulationState & simulstate ) const
overridevirtual

interface method to return probability prediction of punch through

Definition at line 36 of file PunchThroughClassifier.cxx.

36 {
37
38 std::map<std::string, std::map<std::string, double> > networkInputs = computeInputs(isfp, simulstate); //compute inputs
39
40 networkInputs = scaleInputs(networkInputs); //scale inputs
41
42 std::map<std::string, double> networkOutputs = m_graph->compute(networkInputs); //call neural network on inputs
43
44 double calibratedOutput = calibrateOutput(networkOutputs["out_0"]); //calibrate neural network output
45
46 return calibratedOutput;
47}
std::map< std::string, std::map< std::string, double > > scaleInputs(std::map< std::string, std::map< std::string, double > > &inputs) const
scale NN inputs using MinMaxScaler
double calibrateOutput(double &networkOutput) const
calibrate NN output using isotonic regressor
static std::map< std::string, std::map< std::string, double > > computeInputs(const ISF::ISFParticle &isfp, const TFCSSimulationState &simulstate)
calcalate NN inputs based on isfp and simulstate
std::unique_ptr< lwt::LightweightGraph > m_graph
NN graph.

◆ initialize()

StatusCode ISF::PunchThroughClassifier::initialize ( )
finaloverridevirtual

AlgTool initialize method.

Definition at line 50 of file PunchThroughClassifier.cxx.

50 {
51
52 ATH_MSG_VERBOSE( "[ punchthroughclassifier ] initialize()" );
53
54 std::string resolvedScalerFileName = PathResolverFindCalibFile (m_scalerConfigFileName);
55 if ( initializeScaler(resolvedScalerFileName) != StatusCode::SUCCESS)
56 {
57 ATH_MSG_ERROR("[ punchthroughclassifier ] unable to load punchthroughclassifier input scaler");
58 }
59
60 std::string resolvedNetworkFileName = PathResolverFindCalibFile (m_networkConfigFileName);
61 if ( initializeNetwork(resolvedNetworkFileName) != StatusCode::SUCCESS)
62 {
63 ATH_MSG_ERROR("[ punchthroughclassifier ] unable to load punchthroughclassifier network");
64 }
65
66 std::string resolvedCalibratorFileName = PathResolverFindCalibFile (m_calibratorConfigFileName);
67 if ( initializeCalibrator(resolvedCalibratorFileName) != StatusCode::SUCCESS)
68 {
69 ATH_MSG_ERROR("[ punchthroughclassifier ] unable to load punchthroughclassifier calibrator");
70 }
71
72 return StatusCode::SUCCESS;
73}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
StatusCode initializeScaler(const std::string &scalerConfigFile)
input variable MinMaxScaler initialize method
StatusCode initializeNetwork(const std::string &networkConfigFile)
neural network initialize method
StatusCode initializeCalibrator(const std::string &calibratorConfigFile)
isotonic regressor calibrator initialize method

◆ initializeCalibrator()

StatusCode ISF::PunchThroughClassifier::initializeCalibrator ( const std::string & calibratorConfigFile)

isotonic regressor calibrator initialize method

Definition at line 130 of file PunchThroughClassifier.cxx.

130 {
131
132 //parse xml that contains config for isotonic regressor used to calibrate the network output
133 ATH_MSG_INFO( "[ punchthroughclassifier ] Loading calibrator: " << calibratorConfigFile);
134
135 xmlDocPtr doc = xmlParseFile( calibratorConfigFile.c_str() );
136
137 for( xmlNodePtr nodeRoot = doc->children; nodeRoot != nullptr; nodeRoot = nodeRoot->next) {
138
139 if (xmlStrEqual( nodeRoot->name, BAD_CAST "Transformations" )) {
140 for( xmlNodePtr nodeTransform = nodeRoot->children; nodeTransform != nullptr; nodeTransform = nodeTransform->next ) {
141
142 //get lower and upper bounds of isotonic regressor
143 if (xmlStrEqual( nodeTransform->name, BAD_CAST "LimitValues" )) {
144 m_calibrationMin = GetXmlAttr<double>( nodeTransform, "min" );
145 m_calibrationMax = GetXmlAttr<double>( nodeTransform, "max" );
146 }
147
148 //get defined points where isotonic regressor knows transform
149 if (xmlStrEqual( nodeTransform->name, BAD_CAST "LinearNorm" )) {
150 double orig = GetXmlAttr<double>( nodeTransform, "orig" );
151 double norm = GetXmlAttr<double>( nodeTransform, "norm" );
152 m_calibrationMap.emplace ( orig, norm );
153 }
154 }
155 }
156 }
157
158 return StatusCode::SUCCESS;
159}
#define ATH_MSG_INFO(x)
T GetXmlAttr(xmlNodePtr node, const char *attrName, const T &defaultValue=T{}) noexcept(std::is_arithmetic_v< T >)

◆ initializeNetwork()

StatusCode ISF::PunchThroughClassifier::initializeNetwork ( const std::string & networkConfigFile)

neural network initialize method

Definition at line 109 of file PunchThroughClassifier.cxx.

109 {
110
111 ATH_MSG_INFO( "[ punchthroughclassifier ] Loading classifier: " << networkConfigFile);
112
113 std::ifstream input(networkConfigFile);
114 if(!input){
115 ATH_MSG_ERROR("Could not find json file " << networkConfigFile );
116 return StatusCode::FAILURE;
117 }
118
119 m_graph = std::make_unique<lwt::LightweightGraph>(lwt::parse_json_graph(input));
120 if(!m_graph){
121 ATH_MSG_ERROR("Could not parse graph json file " << networkConfigFile );
122 return StatusCode::FAILURE;
123 }
124
125
126 return StatusCode::SUCCESS;
127}

◆ initializeScaler()

StatusCode ISF::PunchThroughClassifier::initializeScaler ( const std::string & scalerConfigFile)

input variable MinMaxScaler initialize method

Definition at line 75 of file PunchThroughClassifier.cxx.

75 {
76
77 //parse xml that contains config for MinMaxScaler for each of the network inputs
78
79 xmlDocPtr doc = xmlParseFile( scalerConfigFile.c_str() );
80
81 ATH_MSG_INFO( "[ punchthroughclassifier ] Loading scaler: " << scalerConfigFile);
82
83 for( xmlNodePtr nodeRoot = doc->children; nodeRoot != nullptr; nodeRoot = nodeRoot->next) {
84
85 if (xmlStrEqual( nodeRoot->name, BAD_CAST "Transformations" )) {
86 for( xmlNodePtr nodeTransform = nodeRoot->children; nodeTransform != nullptr; nodeTransform = nodeTransform->next ) {
87
88 //Get min and max values that we normalise values to
89 if (xmlStrEqual( nodeTransform->name, BAD_CAST "ScalerValues" )) {
90 m_scalerMin = GetXmlAttr<double>( nodeTransform, "min" );
91 m_scalerMax = GetXmlAttr<double>( nodeTransform, "max" );
92 }
93
94 //Get values necessary to normalise each input variable
95 if (xmlStrEqual( nodeTransform->name, BAD_CAST "VarScales" )) {
96 std::string name = GetXmlAttr<std::string>( nodeTransform, "name" );
97 double min = GetXmlAttr<double>( nodeTransform, "min" );
98 double max = GetXmlAttr<double>( nodeTransform, "max" );
99 m_scalerMinMap.emplace ( name, min );
100 m_scalerMaxMap.emplace ( name, max );
101 }
102 }
103 }
104 }
105
106 return StatusCode::SUCCESS;
107}
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
std::map< std::string, double > m_scalerMinMap
double m_scalerMin
input variable MinMaxScaler members
std::map< std::string, double > m_scalerMaxMap

◆ scaleInputs()

std::map< std::string, std::map< std::string, double > > ISF::PunchThroughClassifier::scaleInputs ( std::map< std::string, std::map< std::string, double > > & inputs) const

scale NN inputs using MinMaxScaler

Definition at line 183 of file PunchThroughClassifier.cxx.

183 {
184
185 //apply MinMaxScaler to network inputs
186
187 for (auto& var : inputs["node_0"]) {
188
189 double x_std;
190 if(m_scalerMaxMap.at(var.first) != m_scalerMinMap.at(var.first)){
191 x_std = (var.second - m_scalerMinMap.at(var.first)) / (m_scalerMaxMap.at(var.first) - m_scalerMinMap.at(var.first));
192 }
193 else{
194 x_std = (var.second - m_scalerMinMap.at(var.first));
195 }
196 var.second = x_std * (m_scalerMax - m_scalerMin) + m_scalerMin;
197 }
198
199 return inputs;
200}

Member Data Documentation

◆ m_calibrationMap

std::map<double, double> ISF::PunchThroughClassifier::m_calibrationMap
private

Definition at line 73 of file PunchThroughClassifier.h.

◆ m_calibrationMax

double ISF::PunchThroughClassifier::m_calibrationMax {}
private

Definition at line 72 of file PunchThroughClassifier.h.

72{};

◆ m_calibrationMin

double ISF::PunchThroughClassifier::m_calibrationMin {}
private

Definition at line 71 of file PunchThroughClassifier.h.

71{};

◆ m_calibratorConfigFile

std::string ISF::PunchThroughClassifier::m_calibratorConfigFile
private

isotonic regressor calibrator members

Definition at line 70 of file PunchThroughClassifier.h.

◆ m_calibratorConfigFileName

std::string ISF::PunchThroughClassifier::m_calibratorConfigFileName
private

Definition at line 78 of file PunchThroughClassifier.h.

◆ m_graph

std::unique_ptr<lwt::LightweightGraph> ISF::PunchThroughClassifier::m_graph {}
private

NN graph.

Definition at line 61 of file PunchThroughClassifier.h.

61{};

◆ m_networkConfigFileName

std::string ISF::PunchThroughClassifier::m_networkConfigFileName
private

Definition at line 76 of file PunchThroughClassifier.h.

◆ m_scalerConfigFileName

std::string ISF::PunchThroughClassifier::m_scalerConfigFileName
private

Definition at line 77 of file PunchThroughClassifier.h.

◆ m_scalerMax

double ISF::PunchThroughClassifier::m_scalerMax {}
private

Definition at line 65 of file PunchThroughClassifier.h.

65{};

◆ m_scalerMaxMap

std::map<std::string, double> ISF::PunchThroughClassifier::m_scalerMaxMap
private

Definition at line 67 of file PunchThroughClassifier.h.

◆ m_scalerMin

double ISF::PunchThroughClassifier::m_scalerMin {}
private

input variable MinMaxScaler members

Definition at line 64 of file PunchThroughClassifier.h.

64{};

◆ m_scalerMinMap

std::map<std::string, double> ISF::PunchThroughClassifier::m_scalerMinMap
private

Definition at line 66 of file PunchThroughClassifier.h.


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