56 std::vector<const xAOD::TruthParticle*> tempVec {};
62 if (not truthParticleContainer.
isValid()) {
65 tempVec.insert(tempVec.begin(), truthParticleContainer->begin(), truthParticleContainer->end());
75 const auto& links =
event->truthParticleLinks();
76 tempVec.reserve(event->nTruthParticles());
77 for (
const auto& link : links) {
79 tempVec.push_back(*link);
88 if (truthPileupEventContainer.
isValid()) {
89 const unsigned int nPileup = truthPileupEventContainer->size();
90 tempVec.reserve(nPileup * 200);
91 for (
unsigned int i(0); i != nPileup; ++i) {
92 const auto *eventPileup = truthPileupEventContainer->at(i);
94 int ntruth = eventPileup->nTruthParticles();
95 ATH_MSG_VERBOSE(
"Adding " << ntruth <<
" truth particles from TruthPileupEvents container");
96 const auto& links = eventPileup->truthParticleLinks();
97 for (
const auto& link : links) {
99 tempVec.push_back(*link);
121 float eventPxSum = 0.0;
122 float eventPySum = 0.0;
124 float puEvents = 0.0;
126 std::vector<float> pxValues, pyValues, pzValues, eValues, etaValues, phiValues, ptValues;
127 float truthMultiplicity = 0.0;
128 const int truthParticles = truthParticlesVec.size();
129 for (
int itruth = 0; itruth < truthParticles; itruth++) {
133 pxValues.push_back((thisTruth->
px()*0.001-1.46988000e+03)*
px_diff);
134 pyValues.push_back((thisTruth->
py()*0.001-1.35142000e+03)*
py_diff);
135 pzValues.push_back((thisTruth->
pz()*0.001-1.50464000e+03)*
pz_diff);
136 ptValues.push_back((thisTruth->
pt()*0.001-5.00006000e-01)*
pt_diff);
138 etaValues.push_back(thisTruth->
eta());
139 phiValues.push_back(thisTruth->
phi());
140 eValues.push_back((thisTruth->
e()*0.001-5.08307000e-01)*
e_diff);
142 eventPxSum += thisTruth->
px();
143 eventPySum += thisTruth->
py();
152 puEvents = !
m_truthPileUpEventName.key().empty() and truthPileupEventContainer.
isValid() ?
static_cast<int>( truthPileupEventContainer->size() ) : pie.
isValid() ? pie->actualInteractionsPerCrossing() : 0;
153 eventPt = std::sqrt(eventPxSum*eventPxSum + eventPySum*eventPySum)*0.001;
155 std::vector<float> puEventsVec(pxValues.size(), (puEvents-1.55000000e+01)*
pu_diff);
156 std::vector<float> truthMultiplicityVec(pxValues.size(), (truthMultiplicity-1.80000000e+01)*
multi_diff);
157 std::vector<float> eventPtVec(pxValues.size(), (eventPt-3.42359395e-01)*
eventPt_diff);
158 std::vector<float> predictions;
161 Eigen::VectorXf ptEigen = Eigen::VectorXf::Map(ptValues.data(), ptValues.size());
162 Eigen::VectorXf phiEigen = Eigen::VectorXf::Map(phiValues.data(), phiValues.size());
163 Eigen::VectorXf etaEigen = Eigen::VectorXf::Map(etaValues.data(), etaValues.size());
164 for (std::size_t i = 0; i < truthMultiplicity; ++i) {
165 float multiplicity_0p05 = 0.0, multiplicity_0p2 = 0.0;
166 float sum_0p05 = 0.0, sum_0p2 = 0.0;
167 float pt_0p05 = 0.0, pt_0p2 = 0.0;
168 float deltaEtaI = etaEigen[i];
169 float phiI = phiEigen[i];
170 for (std::size_t j = 0; j < truthMultiplicity; ++j) {
171 if (i == j)
continue;
172 float deltaEta = deltaEtaI - etaEigen[j];
173 float deltaPhi = phiI - phiEigen[j];
181 if (distances < 0.05){
183 sum_0p05 += distances;
184 pt_0p05 += ptEigen[j];
186 if (distances < 0.2){
188 sum_0p2 += distances;
189 pt_0p2 += ptEigen[j];
193 std::vector<float> featData;
194 featData.push_back(pxValues[i]);
195 featData.push_back(pyValues[i]);
196 featData.push_back(pzValues[i]);
197 featData.push_back(eValues[i]);
198 featData.push_back(ptValues[i]);
206 featData.push_back(puEventsVec[i]);
207 featData.push_back(truthMultiplicityVec[i]);
208 featData.push_back(eventPtVec[i]);
210 std::vector<int64_t> input_node_dims;
211 std::vector<char*> input_node_names;
215 std::vector<int64_t> output_node_dims;
216 std::vector<char*> output_node_names;
220 Ort::MemoryInfo memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeCPU);
221 input_node_dims[0]=1;
222 Ort::Value input_data = Ort::Value::CreateTensor(memoryInfo, featData.data(), featData.size(), input_node_dims.data(), input_node_dims.size());
223 Ort::RunOptions run_options(
nullptr);
226 auto output_values = mysession.Run(run_options, input_node_names.data(), &input_data, input_node_names.size(), output_node_names.data(), output_node_names.size());
227 float* predictionData = output_values[0].GetTensorMutableData<
float>();
228 float prediction = predictionData[0];
230 predictions.push_back(prediction);
235 for (
float prediction : predictions) {
240 if (truthMultiplicity == 0){
242 return StatusCode::FAILURE;
244 float rouletteScore =
static_cast<float>(badTracks) /
static_cast<float>(truthMultiplicity);
248 int decision = rouletteScore == 0;
259 filter.setPassed(pass);
260 ATH_MSG_ALWAYS(
"End TrackOverlayDecisionAlg, difference in filters: "<<(pass ?
"found" :
"not found")<<
"="<<pass<<
", invert="<<
m_invertfilter);
261 return StatusCode::SUCCESS;