ATLAS Offline Software
LVL1TrigTowerRetriever.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include <string>
8 
9 #include "CLHEP/Units/SystemOfUnits.h"
10 
12 
13 namespace JiveXML {
14 
18  LVL1TrigTowerRetriever::LVL1TrigTowerRetriever(const std::string& type, const std::string& name, const IInterface* parent):
20  m_typeName("LVL1TriggerTower")
21  {
22 
23  declareInterface<IDataRetriever>(this);
24 
25  declareProperty("StoreGateKey", m_sgKey = "TriggerTowers", "Storegate key for Level-1 TriggerTowers");
26  declareProperty("SumEnergyThreshold", m_sumEnergyThr = 0, "TriggerTower only written out if sumEnergy above this");
27  }
28 
35  StatusCode LVL1TrigTowerRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
36 
37  //Retrieve trigger towers
38  const DataVector<LVL1::TriggerTower>* TTVector;
39 
40  if ( evtStore()->retrieve(TTVector,m_sgKey).isFailure() ) {
41  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No Level-1 Trigger Towers found in SG at "
42  << m_sgKey << endmsg;
43  return StatusCode::SUCCESS;
44  }
45 
46  //Get number of trigger towers
47  int numTrigTowers = TTVector->size();
48  int count = 0;
49  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Retrieving Level-1 Trigger Towers with size " << numTrigTowers << endmsg;
50 
51  DataVect phi; phi.reserve(numTrigTowers);
52  DataVect eta; eta.reserve(numTrigTowers);
53  DataVect emEnergyVec; emEnergyVec.reserve(numTrigTowers);
54  DataVect hadEnergyVec; hadEnergyVec.reserve(numTrigTowers);
55  DataVect sumEnergyVec; sumEnergyVec.reserve(numTrigTowers);
56  DataVect numADCVec; numADCVec.reserve(numTrigTowers);
57  DataVect emBCIDVec; emBCIDVec.reserve(numTrigTowers);
58  DataVect hadBCIDVec; hadBCIDVec.reserve(numTrigTowers);
59  DataVect isEMSaturated; isEMSaturated.reserve(numTrigTowers);
60  DataVect isHadSaturated; isHadSaturated.reserve(numTrigTowers);
61  DataVect emADCVec; emADCVec.reserve(numTrigTowers);
62  DataVect hadADCVec; hadADCVec.reserve(numTrigTowers);
63 
64  // Loop over all trigger towers and fill vectors
65  DataVector<LVL1::TriggerTower>::const_iterator trigTowerIter = TTVector->begin();
66  for ( trigTowerIter = TTVector->begin(); trigTowerIter < TTVector->end(); ++trigTowerIter ){
67 
68  // skip TTs with no energy
69  if ( (*trigTowerIter)->hadEnergy() == 0 && (*trigTowerIter)->emEnergy() == 0 ) continue;
70 
71  if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) <<" Lvl1 TriggerTower No " << count++ << " with"
72  << " eta:"<<(*trigTowerIter)->eta() << ", phi:"<<(*trigTowerIter)->phi()
73  << ", EM energy:"<<(*trigTowerIter)->emEnergy()<<", Had Energy:"<<(*trigTowerIter)->hadEnergy() <<endmsg;
74 
75  //Be verbose
76  //if (msgLvl(MSG::DEBUG)){
77  // msg(MSG::DEBUG) << " Em ADC size:" << (*trigTowerIter)->emADC().size() << endmsg;
78  // msg(MSG::DEBUG) << " Had ADC size:" << (*trigTowerIter)->hadADC().size() << endmsg;
79  //}
80 
81  int sumEnergy = 0;
82  int emEnergy = 0;
83  int hadEnergy = 0;
84 
85  emEnergy = (*trigTowerIter)->emEnergy();
86  hadEnergy = (*trigTowerIter)->hadEnergy();
87  // propagate saturated towers
88  if ((emEnergy != 255) && (hadEnergy != 255)){ // are in GeV
89  sumEnergy = (*trigTowerIter)->emEnergy()+(*trigTowerIter)->hadEnergy();
90  } else {
91  sumEnergy = 255;
92  }
93 
94  // finally write out only TrigTowers with sumEnergy > sumEnergyThr (default: 0)
95  if ( sumEnergy > m_sumEnergyThr ){
96 
97  //Store energies
98  emEnergyVec.push_back( emEnergy );
99  hadEnergyVec.push_back( hadEnergy );
100  sumEnergyVec.push_back( sumEnergy );
101 
102  //Store eta and phi
103  eta.push_back(DataType((*trigTowerIter)->eta()));
104  phi.push_back(DataType((*trigTowerIter)->phi()));
105 
106  //Store the bunch crossing ID
107  emBCIDVec.push_back(DataType((*trigTowerIter)->emBCID()));
108  hadBCIDVec.push_back(DataType((*trigTowerIter)->hadBCID()));
109 
110  //Store saturation flag
111  isEMSaturated.push_back(DataType( ((*trigTowerIter)->isEMSaturated())? 1 : 0 ));
112  isHadSaturated.push_back(DataType( ((*trigTowerIter)->isHadSaturated())? 1 : 0 ));
113 
114  //Make sure number of hadronic and em ADC values match.
115  //Dummy data inserted if they don't.
116  if ((*trigTowerIter)->emADC().size() != (*trigTowerIter)->hadADC().size()){
117  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Number of EmADC and HadADC values do not match"
118  << ",em:"<< (*trigTowerIter)->emADC().size()
119  << ",had:" << (*trigTowerIter)->hadADC().size() << endmsg;
120  numADCVec.push_back(DataType( 1 ));
121  emADCVec.push_back(DataType( 0 ));
122  hadADCVec.push_back(DataType( 0 ));
123  continue ; // next tower or exit
124  }
125 
126  // We have checked that em and had have same size
127  numADCVec.push_back(DataType( (*trigTowerIter)->emADC().size() ));
128 
129  // loop again over ADCs to write values out:
130  std::vector<int>::const_iterator emADCItr = ((*trigTowerIter)->emADC()).begin();
131  for (; emADCItr != ((*trigTowerIter)->emADC()).end(); ++emADCItr)
132  emADCVec.push_back(DataType( *emADCItr ));
133 
134  std::vector<int>::const_iterator hadADCItr = ((*trigTowerIter)->hadADC()).begin();
135  for (; hadADCItr != ((*trigTowerIter)->hadADC()).end(); ++hadADCItr)
136  hadADCVec.push_back(DataType( *hadADCItr ));
137  } // end sumEnergy > sumEnergyThr
138  }//end trigger tower iterator loop
139 
140  //Calculate multiple string (we have checked that EM and Had match)
141  std::string multiple = " multiple=\"0.\"";
142  if (emEnergyVec.size() != 0){ // avoid division by zero !
143  multiple = " multiple=\""+DataType(((float)emADCVec.size())/((float)emEnergyVec.size())).toString()+"\"";
144  }
145 
146  DataMap myDataMap;
147  myDataMap["phi"] = phi;
148  myDataMap["eta"] = eta;
149  myDataMap["emEnergy"] = emEnergyVec;
150  myDataMap["hadEnergy"] = hadEnergyVec;
151  myDataMap["sumEnergy"] = sumEnergyVec;
152  myDataMap["emADC"+multiple] = emADCVec;
153  myDataMap["hadADC"+multiple] = hadADCVec;
154  myDataMap["numADC"] = numADCVec;
155  myDataMap["emBCID"] = emBCIDVec;
156  myDataMap["hadBCID"] = hadBCIDVec;
157  myDataMap["isEMSaturated"] = isEMSaturated;
158  myDataMap["isHadSaturated"] = isHadSaturated;
159 
160  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << ": "<< phi.size() << endmsg;
161 
162  //forward data to formating tool
163  return FormatTool->AddToEvent(dataTypeName(), m_sgKey, &myDataMap);
164  }
165 }
JiveXML::LVL1TrigTowerRetriever::m_sgKey
std::string m_sgKey
The storegate key for the TriggerTowers.
Definition: LVL1TrigTowerRetriever.h:36
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
JiveXML::LVL1TrigTowerRetriever::LVL1TrigTowerRetriever
LVL1TrigTowerRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: LVL1TrigTowerRetriever.cxx:18
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
JiveXML::DataVect
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition: DataType.h:58
DataType
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
Definition: RoIBResultByteStreamTool.cxx:25
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
JiveXML::LVL1TrigTowerRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: LVL1TrigTowerRetriever.h:28
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
LVL1TrigTowerRetriever.h
JiveXML::DataType
Templated class to convert any object that is streamable in a ostringstream in a string.
Definition: DataType.h:21
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
JiveXML::LVL1TrigTowerRetriever::m_sumEnergyThr
int m_sumEnergyThr
Definition: LVL1TrigTowerRetriever.h:37
test_pyathena.parent
parent
Definition: test_pyathena.py:15
DataVector< LVL1::TriggerTower >
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
AthAlgTool
Definition: AthAlgTool.h:26
JiveXML::LVL1TrigTowerRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: LVL1TrigTowerRetriever.cxx:35
TriggerTower.h
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.