ATLAS Offline Software
Loading...
Searching...
No Matches
RootAsciiDumperAlg.cxx
Go to the documentation of this file.
1
2
3/*
4 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
5*/
6
7// RootAsciiDumperAlg.cxx
8// Implementation file for class RootAsciiDumperAlg
9// Author: S.Binet<binet@cern.ch>
11
12// AthenaRootComps includes
13#include "RootAsciiDumperAlg.h"
14
15// STL includes
16#include <sstream>
17#include <stdio.h>
18// to get the printing format specifiers (e.g. PRId64)
19#define __STDC_FORMAT_MACROS
20#include <inttypes.h>
21
22// linux i/o includes
23#include <sys/stat.h>
24#include <unistd.h>
25#include <fcntl.h>
26
27// FrameWork includes
28#include "Gaudi/Property.h"
29
30// SGTools
31#include "SGTools/BuiltinsClids.h" // to put ints,... in evtstore
32#include "SGTools/StlVectorClids.h" // to put std::vectors... in evtstore
34
35namespace Athena {
36
38// Public methods:
40
41// Constructors
44 ISvcLocator* pSvcLocator ) :
45 ::AthAlgorithm( name, pSvcLocator ),
46 m_ofname(""),
47 m_ofd(-1),
48 m_nentries(0),
49 m_runnbr(0),
50 m_evtnbr(0),
51 m_el_n(0),
52 m_el_eta(NULL),
53 m_el_jetcone_dr(NULL)
54{
55 //
56 // Property declaration
57 //
58 //declareProperty( "Property", m_nProperty );
59
60 declareProperty("AsciiFileName",
61 m_ofname = "d3pd.ascii",
62 "Name of the ascii file where the content of the "
63 "ROOT n-tuple file will be dumped.");
64
65}
66
67// Destructor
71
72// Athena Algorithm's Hooks
75{
76 ATH_MSG_INFO ("Initializing " << name() << "...");
77
78 ATH_MSG_INFO("dumping data into file ["
79 << m_ofname << "]...");
80 if (m_ofname.empty()) {
81 ATH_MSG_ERROR("cannot dump data into an empty file name!");
82 return StatusCode::FAILURE;
83 }
84 m_ofd = open(m_ofname.c_str(),
85 O_WRONLY | O_CREAT | O_TRUNC,
86 S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
87
88 if (m_ofd < 0) {
89 ATH_MSG_ERROR("problem opening file [" << m_ofname << "] with "
90 "write permissions.");
91 return StatusCode::FAILURE;
92 }
93
94 return StatusCode::SUCCESS;
95}
96
98{
99 ATH_MSG_INFO ("Finalizing " << name() << "...");
100
101 if (m_ofd > 0) {
102 fflush(NULL);
103 if (close(m_ofd) < 0) {
104 ATH_MSG_WARNING("problem while closing [" << m_ofname << "]");
105 }
106 }
107
108 return StatusCode::SUCCESS;
109}
110
112{
113 ATH_MSG_DEBUG ("Executing " << name() << "...");
114
115 uint64_t nevts = m_nentries;
116 m_nentries += 1;
117
118 if (!evtStore()->retrieve(m_runnbr, "RunNumber").isSuccess()) {
119 ATH_MSG_WARNING("could not retrieve [RunNumber] from store");
120 return StatusCode::RECOVERABLE;
121 }
122
123 if (!evtStore()->retrieve(m_evtnbr, "EventNumber").isSuccess()) {
124 ATH_MSG_WARNING("could not retrieve [EventNumber] from store");
125 return StatusCode::RECOVERABLE;
126 }
127
128 if (!evtStore()->retrieve(m_el_n, "el_n").isSuccess()) {
129 ATH_MSG_WARNING("could not retrieve [el_n] from store");
130 return StatusCode::RECOVERABLE;
131 }
132
133 xAOD::EventInfo* ei = nullptr;
134 if (!evtStore()->retrieve(ei, "EventInfo").isSuccess()) {
135 ATH_MSG_WARNING("could not retrieve [el_n] from store");
136 return StatusCode::RECOVERABLE;
137 }
138 static const SG::AuxElement::Accessor<std::string> tupleName ("tupleName");
139 static const SG::AuxElement::Accessor<std::string> collectionName ("collectionName");
140 std::string collName = collectionName(*ei);
141 std::string::size_type pos = collName.rfind ("/");
142 if (pos != std::string::npos) {
143 collName.erase (0, pos+1);
144 }
145
146 {
147 char* buf = 0;
148 int buf_sz = asprintf
149 (&buf,
150 "%03" PRId64 ".%s = %s\n"
151 "%03" PRId64 ".%s = %s\n"
152 "%03" PRId64 ".%s = %u\n"
153 "%03" PRId64 ".%s = %u\n"
154 "%03" PRId64 ".%s = %i\n",
155 nevts,
156 "collectionName",
157 collName.c_str(),
158 nevts,
159 "tupleName",
160 tupleName(*ei).c_str(),
161 nevts,
162 "RunNumber",
163 *m_runnbr,
164 nevts,
165 "EventNumber",
166 *m_evtnbr,
167 nevts,
168 "el_n",
169 *m_el_n);
170 if (buf_sz>=0){
171 write(m_ofd, buf, buf_sz);
172 free(buf);
173 }
174 }
175
176 if (*m_el_n > 0) {
177 if (!evtStore()->retrieve(m_el_eta, "el_eta").isSuccess()) {
178 ATH_MSG_WARNING("could not retrieve [el_eta] from store");
179 return StatusCode::RECOVERABLE;
180 }
181
182 if (!evtStore()->retrieve(m_el_jetcone_dr,
183 "el_jetcone_dr").isSuccess()) {
184 ATH_MSG_WARNING("could not retrieve [el_jetcone_dr] from store");
185 return StatusCode::RECOVERABLE;
186 }
187
188 {
189 std::stringstream bufv;
190 for (int32_t ii = 0; ii < *m_el_n; ++ii) {
191 bufv << (*m_el_eta)[ii];
192 if (ii != (*m_el_n)-1) {
193 bufv << ", ";
194 }
195 }
196 char* buf = 0;
197 int buf_sz = asprintf
198 (&buf,
199 "%03" PRId64 ".%s = [%s]\n",
200 nevts,
201 "el_eta",
202 bufv.str().c_str());
203 if (buf_sz>=0){
204 write(m_ofd, buf, buf_sz);
205 free(buf);
206 }
207 }
208
209
210 {
211 std::stringstream bufv;
212 for (int32_t ii = 0; ii < *m_el_n; ++ii) {
213 bufv << "[";
214 for (std::size_t jj = 0, jjmax = (*m_el_jetcone_dr)[ii].size();
215 jj < jjmax;
216 ++jj) {
217 bufv << (*m_el_jetcone_dr)[ii][jj];
218 if (jj != jjmax-1) {
219 bufv << ", ";
220 }
221 }
222 bufv << "]";
223 if (ii != (*m_el_n)-1) {
224 bufv << ", ";
225 }
226 }
227 char* buf = 0;
228 int buf_sz = asprintf
229 (&buf,
230 "%03" PRId64 ".%s = [%s]\n",
231 nevts,
232 "el_jetcone_dr",
233 bufv.str().c_str());
234 if (buf_sz>=0){
235 write(m_ofd, buf, buf_sz);
236 free(buf);
237 }
238 }
239 }
240
241 return StatusCode::SUCCESS;
242}
243
244} //> end namespace Athena
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const uint32_t * m_runnbr
run number
const std::vector< std::vector< float > > * m_el_jetcone_dr
jetcone dR
int m_ofd
file handle to the ASCII output file
const int32_t * m_el_n
number of electrons
std::string m_ofname
ASCII output file name.
const std::vector< float > * m_el_eta
eta of electrons
RootAsciiDumperAlg()
Default constructor:
const uint32_t * m_evtnbr
event number
uint64_t m_nentries
number of entries processed so-far
virtual ~RootAsciiDumperAlg()
Destructor:
virtual StatusCode initialize()
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
Some weak symbol referencing magic... These are declared in AthenaKernel/getMessageSvc....
static char buf[SIGNAL_MESSAGE_BUFSIZE]
Dump application state information on a fatal signal.
EventInfo_v1 EventInfo
Definition of the latest event info version.