ATLAS Offline Software
AlgoJiveXML.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "JiveXML/AlgoJiveXML.h"
11 
13 
14 #include "GaudiKernel/MsgStream.h"
15 #include "GaudiKernel/ServiceHandle.h"
16 
17 #include <algorithm>
18 
19 namespace JiveXML{
20 
21  AlgoJiveXML::AlgoJiveXML(const std::string& name, ISvcLocator* pSvcLocator) :
22  AthAlgorithm(name, pSvcLocator) {}
23 
32 
33  //be verbose
34  ATH_MSG_VERBOSE("Initialize()");
35 
39  if(m_writeGeometry){
40 
41  ATH_MSG_DEBUG("Writing geometry to file");
42 
44  std::vector<std::string>::iterator GeoWriterNameItr = m_GeoWriterNames.begin();
45  for ( ; GeoWriterNameItr != m_GeoWriterNames.end(); ++GeoWriterNameItr){
46 
48 
49  ToolHandle<IGeometryWriter> GeometryWriter(*GeoWriterNameItr);
50  if ( GeometryWriter.retrieve().isFailure() ){
51  ATH_MSG_WARNING("Unable to locate "<<GeometryWriter.name()<<" tool");
52  } else {
54  if ( GeometryWriter->writeGeometry().isFailure() ){
55  ATH_MSG_WARNING("Unable to write geometry");
56  }
58  if ( GeometryWriter.release().isFailure() ){
59  ATH_MSG_WARNING("Unable to release tool GeometryWriter");
60  }
61  }
62  }
63  }
64 
68  ATH_MSG_DEBUG("Retrieving XML format tool");
69 
70  //Retrieve the format tool
71  ATH_CHECK(m_FormatTool.retrieve());
72 
73  //Setting the tags
74  if ( m_FormatTool->SetTag( TagType("Release",m_AtlasRelease)).isFailure() ){
75  ATH_MSG_WARNING( "Couldn't set Release version" );
76  }
77 
81  ATH_MSG_DEBUG("Retrieving streaming tools");
82  if (m_writeToFile){
83  ATH_MSG_INFO("Retrieving default file streaming tool");
84  ATH_CHECK(m_StreamToFileTool.retrieve());
85  }
86  ATH_MSG_INFO("online " << m_onlineMode);
88  if (m_onlineMode){
89  ATH_MSG_INFO("Retrieving default server streaming tool");
90  ATH_CHECK(m_StreamToServerTool.retrieve());
91  }
92 
97  ATH_MSG_DEBUG("Obtaining list of data retrievers");
98 
100  std::vector<std::string>::iterator DataTypesEnd = m_dataTypes.end();
101  std::vector<std::string>::iterator DataTypeItr = m_dataTypes.begin();
102 
104  for( ; DataTypeItr != DataTypesEnd; ++DataTypeItr)
105  {
107  ToolHandle<IDataRetriever> DataRetrieverTool(*DataTypeItr);
109  if( DataRetrieverTool.retrieve().isFailure() ) {
110  ATH_MSG_WARNING( "Unable to locate tool "
111  << DataRetrieverTool.type() << " with name "
112  << DataRetrieverTool.name());
113  } else {
115  m_DataRetrievers.push_back(DataRetrieverTool);
116  }
117  }
118 
119  ATH_MSG_INFO("Retrieving data from " << m_DataRetrievers.size() << " tools" );
120 
121  ATH_MSG_INFO("List property settings: ");
122  ATH_MSG_INFO("AtlasRelease: " << m_AtlasRelease);
123  ATH_MSG_INFO("DataTypes: " << m_dataTypes );
124  ATH_MSG_INFO("WriteToFile: " << m_writeToFile);
125  ATH_MSG_INFO("OnlineMode: " << m_onlineMode);
126  ATH_MSG_INFO("WriteGeometry: " << m_writeGeometry);
127  ATH_MSG_INFO("GeometryVersion: " << m_geometryVersionIn);
128  ATH_MSG_INFO("GeoWriterNames: " << m_GeoWriterNames );
129 
130  return StatusCode::SUCCESS;
131  }
132 
140 
144  //The run and event number of the current event
145  unsigned int runNo = 0, lumiBlock = 0;
146  uint64_t eventNo=0;
147  //Date and time string of the current event
148  char dateTime[32];
149  //general event property, unused yet
150  std::string eventProperty = "default";
151 
152  // geometry-version/geometry-tag from Athena (sourced via jOs)
153  std::string geometryVersion = "default";
155 
156  //Retrieve eventInfo from StoreGate
157  const xAOD::EventInfo* eventInfo = nullptr;
158  if (evtStore()->retrieve(eventInfo).isFailure()){
159  ATH_MSG_FATAL("Could not find xAODEventInfo" );
160  return StatusCode::FAILURE;
161  }else{
162  // Event/xAOD/xAODEventInfo/trunk/xAODEventInfo/versions/EventInfo_v1.h
163  ATH_MSG_DEBUG(" xAODEventInfo: runNumber: " << eventInfo->runNumber() // is '222222' for mc events ?
164  << ", eventNumber: " << eventInfo->eventNumber()
165  << ", mcChannelNumber: " << eventInfo->mcChannelNumber()
166  << ", mcEventNumber: " << eventInfo->mcEventNumber() // MC: use this instead of runNumber
167  << ", lumiBlock: " << eventInfo->lumiBlock()
168  << ", timeStamp: " << eventInfo->timeStamp()
169  << ", bcid: " << eventInfo->bcid()
170  << ", eventTypeBitmask: " << eventInfo->eventTypeBitmask()
171  << ", actualInteractionsPerCrossing: " << eventInfo->actualInteractionsPerCrossing()
172  << ", averageInteractionsPerCrossing: " << eventInfo->averageInteractionsPerCrossing()
173  );
174  }
175 
176  // new treatment of mc_channel_number for mc12
177  // from: https://twiki.cern.ch/twiki/bin/viewauth/Atlas/PileupDigitization#Contents_of_Pileup_RDO
178  unsigned int mcChannelNo = 0;
179  bool firstEv = true;
180 
181  //+++ Get sub-event info object
182  ATH_MSG_DEBUG( "Sub Event Infos: " );
183  for (const xAOD::EventInfo::SubEvent& subevt : eventInfo->subEvents()) {
184  const xAOD::EventInfo* sevt = subevt.ptr();
185  if (sevt) {
186  if (firstEv){
187  mcChannelNo = sevt->mcChannelNumber(); // the 'real' mc-channel
188  ATH_MSG_DEBUG( " mc_channel from SubEvent : " << sevt->mcChannelNumber() );
189  firstEv = false;
190  }
191  ATH_MSG_VERBOSE("Sub Event Info:\n Time : " << subevt.time()
192  << " Index : " << subevt.index()
193  << " Provenance : " << subevt.type() // This is the provenance stuff: signal, minbias, cavern, etc
194  << " Run Number : " << sevt->runNumber()
195  << " Event Number : " << sevt->eventNumber()
196  << " ns Offset : " << sevt->timeStampNSOffset()
197  << " Lumi Block : " << sevt->lumiBlock()
198  << " mc_channel : " << sevt->mcChannelNumber()
199  << " BCID : " << sevt->bcid()
200  << " Geo version : " << m_geometryVersionIn
201  );
202  }
203  else ATH_MSG_VERBOSE("Subevent is null ptr ");
204  }
205 
206  //Get run and event numbers
207  runNo = eventInfo->runNumber();
208  eventNo = eventInfo->eventNumber();
209 
210 // Note: 4294967293 is the maximum value for a unsigned long
211 
212  if ( mcChannelNo != 0 ){ runNo = mcChannelNo + 140000000; } // indicating 'mc14'
213  ATH_MSG_DEBUG( " runNumber for filename: " << runNo << ", eventNumber: " << eventNo);
214 
215  if ( eventInfo->lumiBlock() ){
216  lumiBlock = eventInfo->lumiBlock();
217  }else{
218  lumiBlock = -1; // placeholder
219  }
220  if ( mcChannelNo != 0 ) lumiBlock = -1; // mask for mc11a
221 
222  // lumiBlock from mc can be just huge number, ignore then
223  if ( lumiBlock > 1000000 ) { lumiBlock = 0; }
224 
225  //Get timestamp of the event
226  //If Grid job not running in CEST or CET, change to UTC
227  //Only option to avoid odd timezones. jpt 29Mar11
228  size_t found1;
229  size_t found2;
230  if (eventInfo->timeStamp() > 0) {
231  time_t unixtime = (time_t) eventInfo->timeStamp();
232  struct tm time;
233  localtime_r(&unixtime, &time);
234  strftime(dateTime, 32, "%Y-%m-%d %H:%M:%S %Z", &time);
235  struct tm utctime;
236  gmtime_r(&unixtime, &utctime);
237  found1 = (DataType(dateTime).toString().find("CEST"));
238  found2 = (DataType(dateTime).toString().find("CET"));
239  if ( int(found1)<0 && int(found2)<0 ){ // not found is -1
240  strftime(dateTime, 32, "%Y-%m-%d %H:%M:%S UTC", &utctime);
241  ATH_MSG_DEBUG( " TIME NOT CET/CEST. Adjusted to:" << dateTime );
242  }
243  } else {
244  dateTime[0] = '\0'; // empty string
245  }
246  if ( mcChannelNo != 0 ){ dateTime[0] = '\0'; } // mask for mc11a
247 
251  if ( m_FormatTool->StartEvent(eventNo, runNo, dateTime, lumiBlock, eventProperty, geometryVersion).isFailure() ){
252  ATH_MSG_FATAL("Couldn't start event in FormatTool");
253  return StatusCode::FAILURE;
254  }
255 
260  ATH_MSG_DEBUG("Starting loop over data retrievers" );
261  //Loop over data retrievers
263  for(; DataRetrieverItr != m_DataRetrievers.end(); ++DataRetrieverItr) {
264  //Add try-catch to avoid retrieval to fail on single retriever
265  try {
266  //Retrieve information and pass it to formatting tool object
267  if ((*DataRetrieverItr)->retrieve(m_FormatTool).isFailure()) {
268  ATH_MSG_WARNING( "Failed to fill " << (*DataRetrieverItr)->dataTypeName() );
269  } else {
270  ATH_MSG_DEBUG("Filled: " << (*DataRetrieverItr)->dataTypeName() );
271  }
272  //Only catch std::exception
273  } catch ( std::exception& ex ){
274  //Now show some message
275  ATH_MSG_FATAL("Caught exception in " << (*DataRetrieverItr)->name()
276  << " while retrieving data for " << (*DataRetrieverItr)->dataTypeName()
277  << " : " << ex.what() );
278  //and return with an error
279  return StatusCode::FAILURE;
280  }
281  }
282  ATH_MSG_DEBUG( "Finished loop over data retrievers" );
283 
287  if ( m_FormatTool->EndEvent().isFailure() ){
288  ATH_MSG_WARNING( "Couldn't end event in FormatTool" );
289  return StatusCode::FAILURE;
290  }
291 
295  if(m_writeToFile){
296  ATH_MSG_DEBUG("Streaming event to file");
297  if ( (m_StreamToFileTool->StreamEvent(eventNo, runNo, m_FormatTool->getFormattedEvent()).isFailure() )){
298  ATH_MSG_WARNING( "Could not stream event to file" );
299  }
300  }
301  if(m_onlineMode){
302  ATH_MSG_DEBUG("Streaming event to server");
303  if ( (m_StreamToServerTool->StreamEvent(eventNo, runNo, m_FormatTool->getFormattedEvent()).isFailure() )){
304  ATH_MSG_WARNING( "Could not stream event to server" );
305  }
306  }
307 
308  return StatusCode::SUCCESS;
309  }
310 
316 
317  ATH_MSG_VERBOSE( "finalize()" );
318 
320  m_DataRetrievers.release().ignore();
321  m_FormatTool.release().ignore();
322  m_StreamToFileTool.release().ignore();
323  m_StreamToServerTool.release().ignore();
324 
325  return StatusCode::SUCCESS;
326  }
327 } //namespace
JiveXML::AlgoJiveXML::m_writeToFile
Gaudi::Property< bool > m_writeToFile
Definition: AlgoJiveXML.h:47
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
JiveXML::GeometryWriter::writeGeometry
virtual StatusCode writeGeometry() override
Writes the inner detector and calorimeter geometry to an XML file.
Definition: GeometryWriter.cxx:35
JiveXML::AlgoJiveXML::m_GeoWriterNames
Gaudi::Property< std::vector< std::string > > m_GeoWriterNames
Definition: AlgoJiveXML.h:51
jetMakeRefSamples.geometryVersion
string geometryVersion
Definition: jetMakeRefSamples.py:68
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
IGeometryWriter.h
JiveXML::AlgoJiveXML::m_onlineMode
Gaudi::Property< bool > m_onlineMode
Definition: AlgoJiveXML.h:48
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAOD::EventInfo_v1::eventNumber
uint64_t eventNumber() const
The current event's event number.
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
JiveXML::AlgoJiveXML::m_dataTypes
Gaudi::Property< std::vector< std::string > > m_dataTypes
Definition: AlgoJiveXML.h:46
JiveXML::AlgoJiveXML::m_FormatTool
ToolHandle< JiveXML::IFormatTool > m_FormatTool
Handle to the formatting tool, which is passed on to the data retrievers and converts the data into X...
Definition: AlgoJiveXML.h:63
DataType
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
Definition: RoIBResultByteStreamTool.cxx:25
StreamToServerTool.h
JiveXML::AlgoJiveXML::AlgoJiveXML
AlgoJiveXML(const std::string &name, ISvcLocator *pSvcLocator)
Definition: AlgoJiveXML.cxx:21
xAOD::EventInfo_v1::eventTypeBitmask
uint32_t eventTypeBitmask() const
The event type bitmask.
JiveXML::AlgoJiveXML::execute
StatusCode execute()
Execute - called for every event.
Definition: AlgoJiveXML.cxx:139
JiveXML::AlgoJiveXML::finalize
StatusCode finalize()
Finalize called once in the end.
Definition: AlgoJiveXML.cxx:315
JiveXML::AlgoJiveXML::m_geometryVersionIn
Gaudi::Property< std::string > m_geometryVersionIn
Definition: AlgoJiveXML.h:50
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
xAOD::EventInfo_v1::timeStampNSOffset
uint32_t timeStampNSOffset() const
Nanosecond time offset wrt. the time stamp.
JiveXML::AlgoJiveXML::m_AtlasRelease
Gaudi::Property< std::string > m_AtlasRelease
Definition: AlgoJiveXML.h:45
xAOD::EventInfo_v1::runNumber
uint32_t runNumber() const
The current event's run number.
StreamToFileTool.h
xAOD::EventInfo_v1::mcChannelNumber
uint32_t mcChannelNumber() const
The MC generator's channel number.
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
JiveXML::AlgoJiveXML::initialize
StatusCode initialize()
Initialize - called once in the beginning.
Definition: AlgoJiveXML.cxx:31
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
calibdata.exception
exception
Definition: calibdata.py:496
AlgoJiveXML.h
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::EventInfo_v1::lumiBlock
uint32_t lumiBlock() const
The current event's luminosity block number.
AthAlgorithm
Definition: AthAlgorithm.h:47
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
SCT_Cabling::dateTime
std::string dateTime()
Definition: SCT_CablingXmlTags.h:55
JiveXML::AlgoJiveXML::m_StreamToServerTool
ToolHandle< JiveXML::IStreamTool > m_StreamToServerTool
Definition: AlgoJiveXML.h:70
xAOD::EventInfo_v1::averageInteractionsPerCrossing
float averageInteractionsPerCrossing() const
Average interactions per crossing for all BCIDs - for out-of-time pile-up.
Definition: EventInfo_v1.cxx:397
JiveXML::AlgoJiveXML::m_DataRetrievers
ToolHandleArray< JiveXML::IDataRetriever > m_DataRetrievers
The list of DataRetrievers.
Definition: AlgoJiveXML.h:57
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
JiveXML::AlgoJiveXML::m_StreamToFileTool
ToolHandle< JiveXML::IStreamTool > m_StreamToFileTool
Streaming tools that pass the formatted XML text into a file, to a server, etc.
Definition: AlgoJiveXML.h:69
XMLFormatTool.h
EventInfo.h
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
JiveXML::GeometryWriter
Writes the inner detector and calorimeter geometry to an XML file for use with Atlantis.
Definition: GeometryWriter.h:37
xAOD::EventInfo_v1::timeStamp
uint32_t timeStamp() const
POSIX time in seconds from 1970. January 1st.
JiveXML::TagType
std::pair< std::string, std::string > TagType
Defines a tag as a pair of strings.
Definition: DataType.h:62
JiveXML::AlgoJiveXML::m_writeGeometry
Gaudi::Property< bool > m_writeGeometry
Definition: AlgoJiveXML.h:49
xAOD::EventInfo_v1::subEvents
const std::vector< SubEvent > & subEvents() const
Get the pileup events that were used in the simulation.
Definition: EventInfo_v1.cxx:596
xAOD::EventInfo_v1::bcid
uint32_t bcid() const
The bunch crossing ID of the event.
xAOD::lumiBlock
setTeId lumiBlock
Definition: L2StandAloneMuon_v1.cxx:327
xAOD::EventInfo_v1::SubEvent
Class describing the properties of one pileup sub-event.
Definition: EventInfo_v1.h:286
IDataRetriever.h
xAOD::EventInfo_v1::mcEventNumber
uint64_t mcEventNumber() const
The MC generator's event number.
xAOD::EventInfo_v1::actualInteractionsPerCrossing
float actualInteractionsPerCrossing() const
Average interactions per crossing for the current BCID - for in-time pile-up.
Definition: EventInfo_v1.cxx:380