ATLAS Offline Software
Loading...
Searching...
No Matches
EmTauROIRetriever.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 <string>
8
9#include "CLHEP/Units/SystemOfUnits.h"
10
12
15
16namespace JiveXML {
17
18 //--------------------------------------------------------------------------
19
20 EmTauROIRetriever::EmTauROIRetriever(const std::string& type, const std::string& name, const IInterface* parent):
21 AthAlgTool(type, name, parent),
22 m_typeName("EmTauROI")
23 {
24
25 declareInterface<IDataRetriever>(this);
26 declareProperty("readCPM", m_readCPM=false,"If 'true' reads low-level ROI data from L1Calo hardware. False by default");
27 // this could be used to mask the lower 4 of the possible 8 multiplicities
28 // to be implemented if necessary
29 declareProperty("maskLowerThresholds", m_maskLowerThresholds=false);
30 }
31
32 //--------------------------------------------------------------------------
33
34 StatusCode EmTauROIRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
35
36 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " retrieving" <<
37 ( m_readCPM ? " from CPMRoIs (ACR) " : " EmTauROI (LVL1_ROI) ") << endmsg;
38
41 DataVect energy;
42 DataVect energyEM;
43 DataVect energyTAU;
44 DataVect roiWord;
45 DataVect thrPattern;
46
47 if (!m_readCPM){ // 'normal' mode: Use Offline EmTauROI object
48
49 const LVL1_ROI * roi;
50
51 // L1JetObject -not- available
52 m_sgKey = "LVL1_ROI";
53 if ( evtStore()->retrieve(roi,m_sgKey).isFailure() ) {
54 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No LVL1_ROI found in SG for Level-1 JetROI" << endmsg;
55 return StatusCode::SUCCESS;
56 }
57
58 // Access as in: PhysicsAnalysis/AnalysisCommon/AnalysisTest/ReadTrigger
59 // Tested with: AODTriggerRead_topOptions.py
60 // class read:
61 // PhysicsAnalysis/AnalysisTrigger/AnalysisTriggerEvent/EmTau_ROI.h
62 LVL1_ROI::emtaus_type::const_iterator itEM = (roi->getEmTauROIs()).begin();
63 LVL1_ROI::emtaus_type::const_iterator itEMe = (roi->getEmTauROIs()).end();
64
65 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "JetROIs from LVL1_ROI retrieved from StoreGate with size: "<< (roi->getJetROIs()).size() <<endmsg;
66
67 for (; itEM != itEMe; ++itEM)
68 {
69 phi.push_back(DataType( itEM->getPhi()));
70 eta.push_back(DataType( itEM->getEta()));
76 energy.push_back(DataType( itEM->getTauClus() /CLHEP::GeV ));
77 // Seperate EM and TAU, useful to experts:
78 energyEM.push_back(DataType( itEM->getEMClus() / CLHEP::GeV ));
79 energyTAU.push_back(DataType( itEM->getTauClus() /CLHEP::GeV ));
80 roiWord.push_back(DataType( itEM->getROIWord()));
81 thrPattern.push_back(DataType( itEM->getThrPattern()));
82 }
83
84 }else{ // readCPM mode: decode bits from CPM into eta,phi, for ACR data from SFI
85
86 const DataVector<LVL1::CPMRoI>* cpmRoICollection = 0;
87 LVL1::CPRoIDecoder decoder;
88 // L1JetObject -not- available
89 m_sgKey = "CPMRoIs";
90 if ( evtStore()->retrieve(cpmRoICollection, m_sgKey).isFailure() ) {
91 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No DataVector<LVL1::CPMRoI> found with key CPMRoIs" << endmsg;
92 return StatusCode::SUCCESS;
93 }
94 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "DataVector<LVL1::CPMRoI> retrieved from StoreGate with size: "<< cpmRoICollection->size() <<endmsg;
95
96 DataVector<LVL1::CPMRoI>::const_iterator roi_it = cpmRoICollection->begin();
97 DataVector<LVL1::CPMRoI>::const_iterator roi_end = cpmRoICollection->end();
98
99 for(;roi_it!=roi_end;++roi_it) {
100 const LVL1::CPMRoI* roi = (*roi_it);
101
102 // different coordinates in phi, correct for this:
103 auto fixphi = [] (double phi)
104 {
105 if (phi > M_PI) return phi - 2*M_PI;
106 return phi;
107 };
108
109 const LVL1::CoordinateRange coord(decoder.coordinate(roi->roiWord()));
110 const double roiEta = coord.eta();
111 const double roiPhi = fixphi (coord.phi());
112
113 phi.push_back(DataType( roiPhi ));
114 eta.push_back(DataType( roiEta ));
115
116 // info from Alan Watson: energy would need to be decoded
117 // with jet elements. This will only be implemented if necessary
118 // jpt 19Mar09
119 energy.push_back(DataType( 1 ) ); //placeholder
120 energyEM.push_back(DataType( 1 ) ); //placeholder
121 energyTAU.push_back(DataType( 1 ) ); //placeholder
122
123 roiWord.push_back(DataType( roi->roiWord() ));
124 thrPattern.push_back(DataType( roi->hits() ));
125 }
126 }//end if readCPM
127
128 DataMap myDataMap;
129 const auto nPhi = phi.size();
130 myDataMap["energy"] = energy;
131 myDataMap["phi"] = std::move(phi);
132 myDataMap["eta"] = std::move(eta);
133 myDataMap["energy"] = std::move(energy);
134 myDataMap["energyEM"] = std::move(energyEM);
135 myDataMap["energyTAU"] = std::move(energyTAU);
136 myDataMap["roiWord"] = std::move(roiWord);
137 myDataMap["thrPattern"] = std::move(thrPattern);
138
139 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << ": "<< nPhi
140 << " from: " << m_sgKey << endmsg;
141
142 //forward data to formating tool
143 return FormatTool->AddToEvent(dataTypeName(), m_sgKey, &myDataMap);
144 }
145}
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define endmsg
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
double coord
Type of coordination system.
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
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Standard 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.
EmTauROIRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
virtual std::string dataTypeName() const
Return the name of the data type.
const std::string m_typeName
The data type that is generated by this retriever.
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
uint32_t roiWord() const
Return packed RoI word.
int hits() const
Return hit thresholds map.
A level 1 calorimeter trigger conversion service: returns the Coordinate represented by a RoI word.
CoordinateRange class declaration.
Top level AOD object storing LVL1 RoIs.
Definition LVL1_ROI.h:43
const emtaus_type & getEmTauROIs() const
Get all the em/tau RoIs in the event.
Definition LVL1_ROI.h:65
const jets_type & getJetROIs() const
Get all the jet RoIs in the event.
Definition LVL1_ROI.h:67
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