ATLAS Offline Software
Loading...
Searching...
No Matches
TruthParticleRetriever.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "CLHEP/Units/SystemOfUnits.h"
9#include <string>
10
11namespace JiveXML {
12
13 //--------------------------------------------------------------------------
14
15 TruthParticleRetriever::TruthParticleRetriever(const std::string& type, const std::string& name, const IInterface* parent):
16 AthAlgTool(type, name, parent),
17 m_typeName("CompositeParticle")
18 {
19
20 declareInterface<IDataRetriever>(this);
21
22 declareProperty("StoreGateKey", m_sgKey = "SpclMC","StoreGate key for TruthParticles");
23 declareProperty("TruthStatus", m_truthStatus = 2,"Truth status cut, currently not applied"); // currently unused
24 declareProperty("TruthMaximumPdgId", m_truthMaximumPdgId = 40,
25 "Maximum Truth PDG-ID, default:< 40");
26 declareProperty("TruthPtCut", m_truthPtCut = 10.,"pT cut on Truth, default 10 GeV");
27 declareProperty("SkimTruth", m_skimTruth = true,"Some criteria to skim most important Truth info ");
28 }
29
30 //--------------------------------------------------------------------------
31
32 StatusCode TruthParticleRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
33
34 const TruthParticleContainer *truthCont = NULL;
35
37 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No TruthParticle found in SG at "
38 << m_sgKey << endmsg;
39 return StatusCode::SUCCESS;
40 }
41 if ( evtStore()->retrieve(truthCont,m_sgKey).isFailure() ) {
42 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "TruthParticle retrieval from SG failed "
43 << m_sgKey << endmsg;
44 return StatusCode::SUCCESS;
45 }
46 int nTruth = truthCont->size();
47
48 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Retrieving TruthParticles with size " << nTruth << endmsg;
49
50//code from: PhysicsAnalysis/HiggsPhys/HiggsToFourLeptons/src/H4lElectronPerformanceTool.cxx
51
52 DataVect pt; pt.reserve(nTruth);
53 DataVect phi; phi.reserve(nTruth);
54 DataVect eta; eta.reserve(nTruth);
55 DataVect typeEV; typeEV.reserve(nTruth);
56 DataVect label; label.reserve(nTruth);
57 DataVect typeLabelStr; typeLabelStr.reserve(nTruth);
58 DataVect pdgId; pdgId.reserve(nTruth);
59 DataVect dataType; dataType.reserve(nTruth);
60
61 TruthParticleContainer::const_iterator mcpartItr = truthCont->begin();
62 TruthParticleContainer::const_iterator mcpartItrE = truthCont->end();
63
64 std::string truthLabels;
65 std::string statusList="_";
66 std::string typeLabel="n_a";
67 int pdgId2;
68 int motherPdgId;
69 int childPdgId;
70 int countTruth = 1;
71 bool samePdgIdFlag = false;
72 bool initialProcessFlag = false;
73 bool protectedParticleFlag = false;
74
75 for(; (mcpartItr != mcpartItrE) ; ++mcpartItr) { // loop over TruthParticle
76 samePdgIdFlag = false;
77 initialProcessFlag = false;
78 protectedParticleFlag = false;
79 statusList += std::to_string((*mcpartItr)->status()) + "_";
80
81 if ( (*mcpartItr)->et()/CLHEP::GeV < m_truthPtCut ){ continue; }
82 if ( abs( (*mcpartItr)->pdgId()) > m_truthMaximumPdgId ){ continue; }
83
84 pdgId2 = (*mcpartItr)->pdgId();
85
86 // important particles are protected (can come from gamma etc)
87 if (( abs(pdgId2) == 24 ) || ( abs(pdgId2) == 5 ) ||
88 ( abs(pdgId2) == 6 ) || ( abs(pdgId2) == 23 ) ||
89 ( abs(pdgId2) == 36 ) || ( abs(pdgId2) == 37 ) ||
90 ( abs(pdgId2) == 25 ) ){
91 protectedParticleFlag = true;
92 }
93
94 // particle has to originate from b,t,W,Z,H,A,H+- only
95 for ( unsigned int iMother = 0; iMother < (*mcpartItr)->nParents(); ++iMother ) {
96 bool motherHasPdgId = (*mcpartItr)->mother(iMother)->hasPdgId();
97 if ( motherHasPdgId ){
98 motherPdgId = (*mcpartItr)->mother(iMother)->pdgId();
99 if ( motherPdgId == pdgId2 ){ samePdgIdFlag = true; }
100 if (( abs(motherPdgId) == 24 ) || ( abs(motherPdgId) == 5 ) ||
101 ( abs(motherPdgId) == 6 ) || ( abs(motherPdgId) == 23 ) ||
102 ( abs(motherPdgId) == 36 ) || ( abs(motherPdgId) == 37 ) ||
103 ( abs(pdgId2) == 25 ) ){
104 initialProcessFlag = true;
105 }
106 }
107 }
108 // jump to next particle (ignore) if PdgId is same as mother
109 if (m_skimTruth){ // some skimming criteria for simpler display of Truth
110 if ( !initialProcessFlag && !protectedParticleFlag ){
111 // if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Particle rejected: not initial process " << endmsg;
112 continue;
113 }
114 }
115 if ( samePdgIdFlag ){
116 // if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Particle rejected: Same PdgId " << endmsg;
117 continue;
118 }
119
120 pt.push_back( DataType((*mcpartItr)->et()/CLHEP::GeV ) );
121 phi.push_back( DataType((*mcpartItr)->phi() ) );
122 eta.push_back( DataType((*mcpartItr)->eta() ) );
123 dataType.push_back( DataType( (*mcpartItr)->dataType() ));
124
125// if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " TruthParticle No:" << countTruth << " pt:"
126// << (*mcpartItr)->et()/CLHEP::GeV << endmsg;
127
128 pdgId.push_back( DataType( pdgId2 ));
129
130 typeLabel = "n_a";
131 if( abs(pdgId2) == 11) typeLabel = "Electron";
132 if( abs(pdgId2) == 12) typeLabel = "NeutrinoElectron";
133 if( abs(pdgId2) == 13) typeLabel = "Muon";
134 if( abs(pdgId2) == 14) typeLabel = "NeutrinoMuon";
135 if( abs(pdgId2) == 15) typeLabel = "Tau";
136 if( abs(pdgId2) == 16) typeLabel = "NeutrinoTau";
137 if( pdgId2 == 6) typeLabel = "Top";
138 if( pdgId2 == -6) typeLabel = "AntiTop";
139 if( pdgId2 == 5) typeLabel = "Bottom";
140 if( pdgId2 == -5) typeLabel = "AntiBottom";
141 if( pdgId2 == 22) typeLabel = "Photon";
142 if( pdgId2 == 23) typeLabel = "Z0";
143 if( pdgId2 == 224) typeLabel = "Wplus";
144 if( pdgId2 == -24) typeLabel = "Wminus";
145 if( pdgId2 == 36) typeLabel = "A0";
146 if( pdgId2 == 25) typeLabel = "Higgs0";
147 if(( abs(pdgId2) >= 1) && ( abs(pdgId2) <= 4)) typeLabel = "LightQuark";
148
149 typeEV.push_back( DataType( typeLabel ) );
150
151 truthLabels = "No" + DataType( countTruth ).toString() +"_Pdg="
152 + DataType( (*mcpartItr)->pdgId() ).toString()
153 + "_stat=" + DataType( (*mcpartItr)->status() ).toString()
154 + "_nParents=" + DataType( (*mcpartItr)->nParents() ).toString()
155 + "_nDecay=" + DataType( (*mcpartItr)->nDecay() ).toString();
156
157 for ( unsigned int iChild = 0; iChild < (*mcpartItr)->nDecay(); ++iChild ) {
158 bool childHasPdgId = (*mcpartItr)->child(iChild)->hasPdgId();
159 if ( childHasPdgId ){
160 childPdgId = (*mcpartItr)->child(iChild)->pdgId();
161 truthLabels += "_CNo=" + DataType(iChild+1).toString() + "_CPdgId=" +
162 DataType( childPdgId ).toString() + "_CET=" +
163 DataType( (*mcpartItr)->child(iChild)->et()/CLHEP::GeV ).toString();
164 if ( (*mcpartItr)->child(iChild)->et()/CLHEP::GeV <= m_truthPtCut ){ continue; }
165 if (childPdgId == -11){
166 truthLabels += "_IntoElectron";
167 typeLabel += "_IntoElectron";
168 }
169 if (childPdgId == 11){
170 truthLabels += "_FromPositron";
171 typeLabel += "_FromPositron";
172 }
173 if (childPdgId == 13){
174 truthLabels += "_IntoMuonMinus";
175 typeLabel += "_IntoMuonMinus";
176 }
177 if (childPdgId == -13){
178 truthLabels += "_IntoMuonPlus";
179 typeLabel += "_IntoMuonPlus";
180 }
181 if (childPdgId == 15){
182 truthLabels += "_IntoTauMinus";
183 typeLabel += "_IntoTauMinus";
184 }
185 if (childPdgId == -15){
186 truthLabels += "_IntoTauPlus";
187 typeLabel += "_IntoTauPlus";
188 }
189 if (childPdgId == 5){
190 truthLabels += "_IntoBottom";
191 typeLabel += "_IntoBottom";
192 }
193 if (childPdgId == -5){
194 truthLabels += "_IntoAntiBottom";
195 typeLabel += "_IntoAntiBottom";
196 }
197 if (childPdgId == 6){
198 truthLabels += "_IntoTop";
199 typeLabel += "_IntoTop";
200 }
201 if (childPdgId == -6){
202 truthLabels += "_IntoAntiTop";
203 typeLabel += "_IntoAntiTop";
204 }
205 if ( ( abs(childPdgId) >= 1) && ( abs(childPdgId) <=4) ) {
206 truthLabels += "_IntoLightQuark";
207 typeLabel += "_IntoLightQuark";
208 }
209 if (childPdgId == -24){
210 truthLabels += "_IntoWminus";
211 typeLabel += "_IntoWminus";
212 }
213 if (childPdgId == 24){
214 truthLabels += "_IntoWplus";
215 typeLabel += "_IntoWplus";
216 }
217 if (childPdgId == 25){
218 truthLabels += "_IntoHiggs0";
219 typeLabel += "_IntoHiggs0";
220 }
221 if (childPdgId == 23){
222 truthLabels += "_IntoZ0";
223 typeLabel += "_IntoZ0";
224 }
225 }
226 }
227 for ( unsigned int iMother = 0; iMother < (*mcpartItr)->nParents(); ++iMother ) {
228 bool motherHasPdgId = (*mcpartItr)->mother(iMother)->hasPdgId();
229 if ( motherHasPdgId ){
230 int motherPdgId = (*mcpartItr)->mother(iMother)->pdgId();
231 truthLabels += "_MNo=" + DataType(iMother+1).toString() + "_MPdgId=" +
232 DataType( motherPdgId ).toString();
233 if ( (*mcpartItr)->mother(iMother)->et()/CLHEP::GeV <= m_truthPtCut ){ continue; }
234 if (motherPdgId == -24){
235 truthLabels += "_FromWminus";
236 typeLabel += "_FromWminus";
237 }
238 if (motherPdgId == 24){
239 truthLabels += "_FromWplus";
240 typeLabel += "_FromWplus";
241 }
242 if (motherPdgId == 25){
243 truthLabels += "_FromHiggs0";
244 typeLabel += "_FromHiggs0";
245 }
246 if (motherPdgId == 23){
247 truthLabels += "_FromZ0";
248 typeLabel += "_FromZ0";
249 }
250 if (motherPdgId == 6){
251 truthLabels += "_FromTop";
252 typeLabel += "_FromTop";
253 }
254 if (motherPdgId == -6){
255 truthLabels += "_FromAntiTop";
256 typeLabel += "_FromAntiTop";
257 }
258 if (motherPdgId == 5){
259 truthLabels += "_FromBottom";
260 typeLabel += "_FromBottom";
261 }
262 if (motherPdgId == -5){
263 truthLabels += "_FromAntiBottom";
264 typeLabel += "_FromAntiBottom";
265 }
266 if (motherPdgId == 36){
267 truthLabels += "_FromA0";
268 typeLabel += "_FromA0";
269 }
270 if (motherPdgId == 37){
271 truthLabels += "_FromHiggsPlus";
272 typeLabel += "_FromHiggsPlus";
273 }
274 if (motherPdgId == -37){
275 truthLabels += "_FromHiggsMinus";
276 typeLabel += "_FromHiggsMinus";
277 }
278 } // end of hasMotherPdgId
279 } // end of MotherParticle loop
280 countTruth++;
281 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "TruthParticles label: " << DataType( truthLabels ).toString() << endmsg;
282 label.push_back( DataType( truthLabels ).toString() );
283 typeLabelStr.push_back( DataType( typeLabel ).toString() );
284
285 // log << MSG::DEBUG << "TruthParticles status: " << statusList << endmsg;
286 } // end of TruthParticle Loop
287 DataMap myDataMap;
288 const auto n = phi.size();
289 myDataMap["pt"] = std::move(pt);
290 myDataMap["phi"] = std::move(phi);
291 myDataMap["eta"] = std::move(eta);
292 myDataMap["typeEV"] = std::move(typeEV);
293 myDataMap["label"] = std::move(typeLabelStr);
294 myDataMap["pdgId"] = std::move(pdgId);
295 myDataMap["dataType"] = std::move(dataType);
296
297 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << ": "<< n << endmsg;
298
299 //forward data to formating tool
300 return FormatTool->AddToEvent(dataTypeName(), m_sgKey, &myDataMap);
301 }
302}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define endmsg
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
const std::string m_typeName
The data type that is generated by this retriever.
TruthParticleRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
virtual std::string dataTypeName() const
Return the name of the data type.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
std::string label(const std::string &format, int i)
Definition label.h:19
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
std::map< std::string, DataVect > DataMap
Definition DataType.h:59
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition DataType.h:58