ATLAS Offline Software
Loading...
Searching...
No Matches
TauJetRetriever.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "CLHEP/Units/SystemOfUnits.h"
8
10
15#include "tauEvent/TauPID.h"
17
18// for associations:
20#include "CaloEvent/CaloClusterContainer.h"
21
22namespace JiveXML {
23
30 TauJetRetriever::TauJetRetriever(const std::string& type,const std::string& name,const IInterface* parent):
31 AthAlgTool(type,name,parent),
32 m_typeName("TauJet"){
33
34 //Only declare the interface
35 declareInterface<IDataRetriever>(this);
36
37 declareProperty("StoreGateKey", m_sgKey = "TauRecContainer");
38 declareProperty("DoWriteHLT", m_doWriteHLT = false); // ignore HLTAutoKey objects
39 m_fastSimSGFlag = false; }
40
44 StatusCode TauJetRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
45
46 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in retrieveAll()" << endmsg;
47
49 const Analysis::TauJetContainer* tauCont;
50
51 //obtain the default collection first
52 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve " << dataTypeName() << " (" << m_sgKey << ")" << endmsg;
53 StatusCode sc = evtStore()->retrieve(tauCont, m_sgKey);
54 if (sc.isFailure()) {
55 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
56 }else{
57 if ( tauCont->size() > 0){ // check that collection is not empty
58 DataMap data = getData(tauCont);
59 if ( FormatTool->AddToEvent(dataTypeName(), m_sgKey, &data).isFailure()){
60 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
61 }else{
62 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << m_sgKey << ") TauJet retrieved" << endmsg;
63 }
64 }
65 }
66
67 //obtain all other collections from StoreGate
68 if (( evtStore()->retrieve(iterator, end)).isFailure()){
69 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Unable to retrieve iterator for Jet collection" << endmsg;
70// return StatusCode::WARNING;
71 }
72
73 for (; iterator!=end; ++iterator) {
74 m_fastSimSGFlag = false; //reset
75 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Trying TauJets from: " << iterator.key() << endmsg;
76 std::string::size_type position = iterator.key().find("HLT",0); // special case. Normally: HLTAutokey
77 // some Atlfast collections wrongly assign 'Full' to DataType:
78 std::string::size_type positionFast = iterator.key().find("Atlfast",0);
79 if ( positionFast == 0){
80 m_fastSimSGFlag = true;
81 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " SG key Atlfast collection: Fast Sim " << endmsg;
82 };
83 if ( m_doWriteHLT ){ position = 99; } // override SG key find
84 if ( position != 0 ){ // SG key doesn't contain HLTAutoKey
85 if ( iterator.key()!=m_sgKey) {
86 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve all " << dataTypeName() << " (" << iterator.key() << ")" << endmsg;
88 if ( FormatTool->AddToEvent(dataTypeName(), iterator.key(), &data).isFailure()){
89 if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << iterator.key() << " not found in SG " << endmsg;
90 }else{
91 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << iterator.key() << ") TauJet retrieved" << endmsg;
92 }
93 }
94 }
95 } // end collection iterator
96 //All collections retrieved okay
97 return StatusCode::SUCCESS;
98 }
99
100
106
107 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in getData()" << endmsg;
108
110
111 DataVect phi; phi.reserve(taucont->size());
112 DataVect eta; eta.reserve(taucont->size());
113 DataVect pt; pt.reserve(taucont->size());
114 DataVect mass; mass.reserve(taucont->size());
115 DataVect energy; energy.reserve(taucont->size());
116 DataVect px; px.reserve(taucont->size());
117 DataVect py; py.reserve(taucont->size());
118 DataVect pz; pz.reserve(taucont->size());
119
120 DataVect isTauString; isTauString.reserve(taucont->size());
121 DataVect label; label.reserve(taucont->size());
122 DataVect numTracks; numTracks.reserve(taucont->size());
123 DataVect charge; charge.reserve(taucont->size());
124 DataVect author; author.reserve(taucont->size());
125 DataVect etEMCalib; etEMCalib.reserve(taucont->size());
126 DataVect etHadCalib; etHadCalib.reserve(taucont->size());
127 DataVect emRadius; emRadius.reserve(taucont->size());
128 DataVect isolFrac; isolFrac.reserve(taucont->size());
129 DataVect stripWidth; stripWidth.reserve(taucont->size());
130 DataVect logLhRatio; logLhRatio.reserve(taucont->size());
131
132// DataVect isTau; isTau.reserve(taucont->size()); // available from rel.15 ?
133
134 // for associations:
135 DataVect clusterKeyVec; clusterKeyVec.reserve(taucont->size());
136 DataVect clusterIndexVec; clusterIndexVec.reserve(taucont->size());
137 DataVect trackKeyVec; trackKeyVec.reserve(taucont->size());
138 DataVect trackIndexVec; trackIndexVec.reserve(taucont->size());
139 DataVect trackLinkCountVec; trackLinkCountVec.reserve(taucont->size());
140
141//from AnalysisSkeleton
142
144 Analysis::TauJetContainer::const_iterator taujetItrE = taucont->end();
145
147 bool checkDataType=true;
148
149 if ( taujetItr != taujetItrE) {
150 dataType = (*taujetItr)->dataType();
151 checkDataType = (dataType != ParticleDataType::Fast) &&
152 (dataType != ParticleDataType::True);
153 }
154
155 if(checkDataType){
156 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " TauJet Datatype: Full Sim " << endmsg;
157 }else{
158 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " TauJet Datatype: Fast Sim " << endmsg;
159 }
160 // if ( m_fastSimSGFlag ){ if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " fastSimSGFlag set ! " << endmsg; }
161
162 unsigned int countTrackLinks = 0;
163 unsigned int numTauJets = 0;
164 std::string numTracksPerTaujet = "";
165 std::string trackKeyString = "trackKey"; // default: n/a or fast sim
166 std::string trackIndexString = "trackIndex";
167
168 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Number of TauJets: " << taucont->size() << endmsg;
169 if (checkDataType && !m_fastSimSGFlag){ // full sim
170 for (; taujetItr != taujetItrE; ++taujetItr) { // first, just count trackKey for multiple
171 const ElementLinkVector<Rec::TrackParticleContainer> myTrackLinkVector = (*taujetItr)->trackLinkVector();
172 countTrackLinks += myTrackLinkVector.size();
173 numTauJets++;
174 }
175 if ( numTauJets == 0 ){ // capture division by zero
176 numTracksPerTaujet = "0";
177 } else {
178 numTracksPerTaujet = DataType( countTrackLinks/((double) numTauJets )).toString();
179 }
180 trackKeyString = "trackKey multiple=\""+numTracksPerTaujet+"\"";
181 trackIndexString = "trackIndex multiple=\""+numTracksPerTaujet+"\"";
182 } // full sim
183
184 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " trackKeyString: " << trackKeyString <<
185 " trackIndexString: " << trackIndexString << endmsg;
186
187 std::string labelStr = "none";
188 std::string isTauStr = "none";
189 int id=0;
190 taujetItr = taucont->begin(); // reset iterator
191 for (; taujetItr != taujetItrE; ++taujetItr) { // full loop
192
193 pt.push_back( JiveXML::DataType((*taujetItr)->pt()/CLHEP::GeV ) );
194 phi.push_back( JiveXML::DataType((*taujetItr)->phi() ) );
195 eta.push_back( JiveXML::DataType((*taujetItr)->eta() ) );
196 px.push_back( JiveXML::DataType((*taujetItr)->px()/CLHEP::GeV ) );
197 py.push_back( JiveXML::DataType((*taujetItr)->py()/CLHEP::GeV ) );
198 pz.push_back( JiveXML::DataType((*taujetItr)->pz()/CLHEP::GeV ) );
199 energy.push_back( JiveXML::DataType((*taujetItr)->m()/CLHEP::GeV ) );
200 mass.push_back( JiveXML::DataType((*taujetItr)->e()/CLHEP::GeV ) );
201
202 if (checkDataType && !m_fastSimSGFlag) { // full sim
203
204 std::string taujetAuthor = "none";
205 if (( (*taujetItr)->author()) == 0){ taujetAuthor = "default"; }
206 if (( (*taujetItr)->author()) == 1){ taujetAuthor = "tauRec"; }
207 if (( (*taujetItr)->author()) == 2){ taujetAuthor = "tau1P3P"; }
208 author.push_back( JiveXML::DataType( taujetAuthor ) );
209
210 labelStr = taujetAuthor;
211
212 numTracks.push_back( JiveXML::DataType( (*taujetItr)->numTrack() ) );
213 charge.push_back( JiveXML::DataType((*taujetItr)->charge() ) );
214
215 isTauStr = "none";
216 // this is organised as hierarchy: First Tau1P3p, then CaloCuts
217 // 'best' tau passed is TauCutTight. This is used for cut in GUI
218 // all info written into 'label'
219 if ((*taujetItr)->tauID()->isTau(TauJetParameters::TauLlhLoose)){
220 isTauStr = "TauLlhLoose"; labelStr += "_TauLlhLoose";}
221 if ((*taujetItr)->tauID()->isTau(TauJetParameters::TauLlhMedium)){
222 isTauStr = "TauLlhMedium"; labelStr += "_TauLlhMedium";}
223 if ((*taujetItr)->tauID()->isTau(TauJetParameters::TauLlhTight)){
224 isTauStr = "TauLlhTight"; labelStr += "_TauLlhTight";}
225 if ((*taujetItr)->tauID()->isTau(TauJetParameters::TauCutLoose)){
226 isTauStr = "TauCutLoose"; labelStr += "_TauCutLoose";}
227 if ((*taujetItr)->tauID()->isTau(TauJetParameters::TauCutMedium)){
228 isTauStr = "TauCutMedium"; labelStr += "_TauCutMedium";}
229 if ((*taujetItr)->tauID()->isTau(TauJetParameters::TauCutTight)){
230 isTauStr = "TauCutTight"; labelStr += "_TauCutTight"; }
231 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " TauJet # " << (++id)
232 << ", label:" << labelStr << endmsg;
233 isTauString.push_back (isTauStr);
234 label.push_back( labelStr );
235// obsolete, only for backwards compatibility
236 etEMCalib.push_back( JiveXML::DataType( 0. ) );
237 etHadCalib.push_back( JiveXML::DataType( 0. ) );
238 emRadius.push_back( JiveXML::DataType( 0. ) );
239 isolFrac.push_back( JiveXML::DataType( 0. ) ); // keep this ?
240 stripWidth.push_back( JiveXML::DataType( 0. ) );
241 logLhRatio.push_back( JiveXML::DataType( 0. ) ); // drop this !
242
243// new access to details taken from: jpt 10Nov09
244// PhysicsAnalysis/TauID/TauAnalysis/TauJetSelector.cxx
245// http://atlas-sw.cern.ch/cgi-bin/viewcvs-atlas.cgi/offline/Reconstruction/tauRec/src/tauCuts.cxx?revision=1.27.8.1&view=markup&pathrev=tauRec-02-05-48-branch
246// https://twiki.cern.ch/twiki/bin/view/Atlas/TauEDM
247//
248// parameters for associations: Storegate key and Index
249
250 // This doesn't work in devval towards 16.0.0: no valid link.
251 // Also not with clusterLinkVector, not available for TauJet.
252 const ElementLink<CaloClusterContainer> clusterLink = (*taujetItr)->clusterLink();
253 if (clusterLink.isValid()) {
254 std::string clusterKey = clusterLink.dataID(); // Storegate key of
255 int clusterIndex = clusterLink.index(); // index into the contianer
256 clusterKeyVec.push_back(DataType( clusterKey ));
257 clusterIndexVec.push_back(DataType( clusterIndex));
258 } else { // no clusterLink
259 clusterKeyVec.push_back(DataType( "none" ));
260 clusterIndexVec.push_back(DataType( -1 ));
261 }
262
263 // this works fine
264 const ElementLinkVector<Rec::TrackParticleContainer> myTrackLinkVector = (*taujetItr)->trackLinkVector();
265
266 unsigned int trackLinkCount = myTrackLinkVector.size();
267 trackLinkCountVec.push_back(DataType( trackLinkCount ));
268
269 if (trackLinkCount > 0){
270 for (unsigned int i=0; i<trackLinkCount; ++i){
271
272 const ElementLink<Rec::TrackParticleContainer> trackParticleLink = myTrackLinkVector.at(i);
273 std::string trackKey = trackParticleLink.dataID();
274 int trackIndex = trackParticleLink.index();
275 if ( trackParticleLink.isValid()){
276 // if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " TrackParticle " << trackKey << " ,"
277 // << " Index " << trackIndex << " " << endmsg;
278
279 trackKeyVec.push_back(DataType( trackKey ));
280 trackIndexVec.push_back(DataType( trackIndex));
281 } else { // no trackLink
282 trackKeyVec.push_back(DataType( "none" ));
283 trackIndexVec.push_back(DataType( -1 ));
284 }
285 }
286 }
287 } else { // end of checkDataType loop. Now fast simulation placeholders:
288
289 std::string numTracksEmpty = "0";
290 author.push_back( JiveXML::DataType( "atlfast" ) );
291 numTracks.push_back( JiveXML::DataType( "1" ));
292 charge.push_back( JiveXML::DataType( 1. ) );
293 etEMCalib.push_back( JiveXML::DataType( 0. ) );
294 etHadCalib.push_back( JiveXML::DataType( 0. ) );
295 emRadius.push_back( JiveXML::DataType( 0. ) );
296 isolFrac.push_back( JiveXML::DataType( 0. ) );
297 stripWidth.push_back( JiveXML::DataType( 0. ) );
298 logLhRatio.push_back( JiveXML::DataType( 0. ) );
299 isTauString.push_back( JiveXML::DataType( "fastSim" ) );
300 label.push_back( JiveXML::DataType( "atlfast" ) );
301
302 clusterKeyVec.push_back(DataType( "none" ));
303 clusterIndexVec.push_back(DataType( -1 ));
304 trackKeyVec.push_back(DataType( "none" ));
305 trackIndexVec.push_back(DataType( -1 ));
306 trackLinkCountVec.push_back(DataType( -1 ));
307 }
308 } // end tau iterator
309
310 // four-vectors
311 DataMap["phi"] = phi;
312 DataMap["eta"] = eta;
313 DataMap["pt"] = pt;
314 DataMap["energy"] = energy;
315 DataMap["mass"] = mass;
316 DataMap["px"] = px;
317 DataMap["py"] = py;
318 DataMap["pz"] = pz;
319
320 // special tau parameters
321 DataMap["isTauString"] = isTauString;
322 DataMap["label"] = label;
323 DataMap["numTracks"] = numTracks;
324 DataMap["charge"] = charge;
325 DataMap["author"] = author;
326 DataMap["etEMCalib"] = etEMCalib;
327 DataMap["etHadCalib"] = etHadCalib;
328 DataMap["emRadius"] = emRadius;
329 DataMap["isolFrac"] = isolFrac;
330 DataMap["stripWidth"] = stripWidth;
331 DataMap["logLhRatio"] = logLhRatio;
332// DataMap["isTau"] = isTau;
333 // associations
334 DataMap["clusterKey"] = clusterKeyVec;
335 DataMap["clusterIndex"] = clusterIndexVec;
336 DataMap[trackKeyString] = trackKeyVec;
337 DataMap[trackIndexString] = trackIndexVec;
338 DataMap["trackLinkCount"] = trackLinkCountVec;
339
340 if (msgLvl(MSG::DEBUG)) {
341 msg(MSG::DEBUG) << dataTypeName() << " retrieved with " << phi.size() << " entries"<< endmsg;
342 }
343
344 //All collections retrieved okay
345 return DataMap;
346
347 } // retrieve
348
349 //--------------------------------------------------------------------------
350
351} // JiveXML namespace
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define endmsg
double charge(const T &p)
Definition AtlasPID.h:997
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t sc
DEPRECATED DO NOT USE.
DEPRECATED DO NOT USE.
Declaration of details class for tau event.
DEPRECATED DO NOT USE.
DEPRECATED DO NOTT USE.
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.
ElementLinkVector implementation for standalone ROOT.
const_reference at(size_type n) const
Templated class to convert any object that is streamable in a ostringstream in a string.
Definition DataType.h:21
TauJetRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
const std::string m_typeName
The data type that is generated by this retriever.
const DataMap getData(const Analysis::TauJetContainer *)
Retrieve basic parameters, mainly four-vectors, for each collection.
virtual std::string dataTypeName() const
Return the name of the data type.
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
a const_iterator facade to DataHandle.
Definition SGIterator.h:164
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