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;
125 std::vector<float> pxValues, pyValues, pzValues, eValues, etaValues, phiValues, ptValues;
126 float truthMultiplicity = 0.0;
127 const int truthParticles = truthParticlesVec.size();
128 bool forceMCOverlay =
false;
129 for (
int itruth = 0; itruth < truthParticles; itruth++) {
131 if (thisTruth->
pdgId() == 22 && thisTruth->
status() == 1 &&
132 thisTruth->
pt() * 0.001 > 25 &&
133 std::abs(thisTruth->
eta()) < 2.5 &&
134 thisTruth->
e() * 0.001 > 100.0 ) {
135 forceMCOverlay =
true;
139 pxValues.push_back((thisTruth->
px()*0.001-1.46988000e+03)*
px_diff);
140 pyValues.push_back((thisTruth->
py()*0.001-1.35142000e+03)*
py_diff);
141 pzValues.push_back((thisTruth->
pz()*0.001-1.50464000e+03)*
pz_diff);
142 ptValues.push_back((thisTruth->
pt()*0.001-5.00006000e-01)*
pt_diff);
144 etaValues.push_back(thisTruth->
eta());
145 phiValues.push_back(thisTruth->
phi());
146 eValues.push_back((thisTruth->
e()*0.001-5.08307000e-01)*
e_diff);
148 eventPxSum += thisTruth->
px();
149 eventPySum += thisTruth->
py();
158 puEvents = !
m_truthPileUpEventName.key().empty() and truthPileupEventContainer.
isValid() ?
static_cast<int>( truthPileupEventContainer->size() ) : pie.
isValid() ? pie->actualInteractionsPerCrossing() : 0;
159 eventPt = std::sqrt(eventPxSum*eventPxSum + eventPySum*eventPySum)*0.001;
161 std::vector<float> puEventsVec(pxValues.size(), (puEvents-1.55000000e+01)*
pu_diff);
162 std::vector<float> truthMultiplicityVec(pxValues.size(), (truthMultiplicity-1.80000000e+01)*
multi_diff);
163 std::vector<float> eventPtVec(pxValues.size(), (eventPt-3.42359395e-01)*
eventPt_diff);
164 std::vector<float> predictions;
167 Eigen::VectorXf ptEigen = Eigen::VectorXf::Map(ptValues.data(), ptValues.size());
168 Eigen::VectorXf phiEigen = Eigen::VectorXf::Map(phiValues.data(), phiValues.size());
169 Eigen::VectorXf etaEigen = Eigen::VectorXf::Map(etaValues.data(), etaValues.size());
170 for (std::size_t i = 0; i < truthMultiplicity; ++i) {
171 float multiplicity_0p05 = 0.0, multiplicity_0p2 = 0.0;
172 float sum_0p05 = 0.0, sum_0p2 = 0.0;
173 float pt_0p05 = 0.0, pt_0p2 = 0.0;
174 float deltaEtaI = etaEigen[i];
175 float phiI = phiEigen[i];
176 for (std::size_t j = 0; j < truthMultiplicity; ++j) {
177 if (i == j)
continue;
178 float deltaEta = deltaEtaI - etaEigen[j];
179 float deltaPhi = phiI - phiEigen[j];
187 if (distances < 0.05){
189 sum_0p05 += distances;
190 pt_0p05 += ptEigen[j];
192 if (distances < 0.2){
194 sum_0p2 += distances;
195 pt_0p2 += ptEigen[j];
199 std::vector<float> featData;
200 featData.push_back(pxValues[i]);
201 featData.push_back(pyValues[i]);
202 featData.push_back(pzValues[i]);
203 featData.push_back(eValues[i]);
204 featData.push_back(ptValues[i]);
212 featData.push_back(puEventsVec[i]);
213 featData.push_back(truthMultiplicityVec[i]);
214 featData.push_back(eventPtVec[i]);
216 std::vector<int64_t> input_node_dims;
217 std::vector<char*> input_node_names;
221 std::vector<int64_t> output_node_dims;
222 std::vector<char*> output_node_names;
226 Ort::MemoryInfo memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeCPU);
227 input_node_dims[0]=1;
228 Ort::Value input_data = Ort::Value::CreateTensor(memoryInfo, featData.data(), featData.size(), input_node_dims.data(), input_node_dims.size());
229 Ort::RunOptions run_options(
nullptr);
232 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());
233 float* predictionData = output_values[0].GetTensorMutableData<
float>();
234 float prediction = predictionData[0];
236 predictions.push_back(prediction);
240 for (
float prediction : predictions) {
245 if (truthMultiplicity == 0){
247 return StatusCode::FAILURE;
249 float rouletteScore =
static_cast<float>(badTracks) /
static_cast<float>(truthMultiplicity);
253 int decision = rouletteScore == 0;
254 if (decision==0 || forceMCOverlay){
264 filter.setPassed(pass);
265 ATH_MSG_ALWAYS(
"End TrackOverlayDecisionAlg, difference in filters: "<<(pass ?
"found" :
"not found")<<
"="<<pass<<
", invert="<<
m_invertfilter);
266 return StatusCode::SUCCESS;