ATLAS Offline Software
Loading...
Searching...
No Matches
TileHitVecToNtuple.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5//*****************************************************************************
6// Filename : TileHitVecToNtuple.cxx
7// Author : Mikhail
8// Created : July, 2005
9//
10// DESCRIPTION:
11// Implement the algorithm
12//
13// HISTORY:
14//
15// BUGS:
16//
17//*****************************************************************************
18
19// Gaudi includes
20#include "GaudiKernel/INTupleSvc.h"
21#include "GaudiKernel/IDataProviderSvc.h"
22#include "GaudiKernel/SmartDataPtr.h"
23
24//Atlas include
26
27// Calo include
29
30//TileCalo include
33
34TileHitVecToNtuple::TileHitVecToNtuple(const std::string& name, ISvcLocator* pSvcLocator)
35 : AthAlgorithm(name, pSvcLocator)
36 , m_ntuplePtr(0)
37 , m_ntupleID("h32")
38 , m_ntupleLoc("/FILE1/TileRec")
39 , m_hitVector("TileHitVec")
40 , m_tileID(0)
41{
42 declareProperty("TileHitVector", m_hitVector);
43 declareProperty("NTupleLoc", m_ntupleLoc);
44 declareProperty("NTupleID", m_ntupleID);
45 declareProperty("CommitNtuple", m_commitNtuple = true);
46 declareProperty("MaxLength", m_maxLength = 4999);
47
48}
49
53
54//****************************************************************************
55//* Initialization
56//****************************************************************************
57
59{
60
61 ATH_MSG_INFO( "Initialization started" );
62
63 // retrieve TileID helper from det store
64
65 CHECK( detStore()->retrieve(m_tileID) );
66
67 m_ntupleLoc="/NTUPLES" + m_ntupleLoc;
68
69 SmartDataPtr<NTuple::Directory> DirPtr(ntupleSvc(), m_ntupleLoc);
70 if(!DirPtr) DirPtr=ntupleSvc()->createDirectory(m_ntupleLoc);
71 if(!DirPtr) {
72 ATH_MSG_ERROR( "Invalid Ntuple Directory: " );
73 return StatusCode::FAILURE;
74 }
75
76 m_ntuplePtr = ntupleSvc()->book(DirPtr.ptr(), m_ntupleID,
77 CLID_ColumnWiseTuple, "TileHit-Ntuple");
78
79 if(!m_ntuplePtr) {
80 std::string ntupleCompleteID=m_ntupleLoc+"/"+m_ntupleID;
81 NTuplePtr nt(ntupleSvc(),ntupleCompleteID);
82
83 if (!nt) {
85 "Failed to book or to retrieve ntuple " << ntupleCompleteID );
86 return StatusCode::FAILURE;
87 } else {
88 ATH_MSG_INFO( "Reaccessing ntuple " << ntupleCompleteID );
89 m_ntuplePtr = nt;
90 }
91
92 }
93
94 CHECK( m_ntuplePtr->addItem("TileHit/nhit",m_nchan,0,m_maxLength) );
95 CHECK( m_ntuplePtr->addItem("TileHit/totalE",m_tolE) );
96 CHECK( m_ntuplePtr->addItem("TileHit/totalE05",m_tolE0) );
97 CHECK( m_ntuplePtr->addItem("TileHit/totalE5",m_tolE1) );
98 CHECK( m_ntuplePtr->addItem("TileHit/totalE10",m_tolE2) );
99 CHECK( m_ntuplePtr->addItem("TileHit/totalE25",m_tolE3) );
100 CHECK( m_ntuplePtr->addItem("TileHit/totalE50",m_tolE4) );
101
102 CHECK( m_ntuplePtr->addItem("TileHit/energy",m_nchan,m_energy) );
103 CHECK( m_ntuplePtr->addItem("TileHit/time",m_nchan,m_time) );
104
105 CHECK( m_ntuplePtr->addItem("TileHit/detector",m_nchan,m_detector,0,3) );
106 CHECK( m_ntuplePtr->addItem("TileHit/side",m_nchan,m_side,-1,1) );
107 CHECK( m_ntuplePtr->addItem("TileHit/sample",m_nchan,m_sample,0,3) );
108 CHECK( m_ntuplePtr->addItem("TileHit/pmt", m_nchan, m_pmt,0,1) );
109 CHECK( m_ntuplePtr->addItem("TileHit/eta",m_nchan,m_eta,0,15) );
110 CHECK( m_ntuplePtr->addItem("TileHit/phi",m_nchan,m_phi,0,63) );
111
112 ATH_MSG_INFO( "Initialization completed" );
113 return StatusCode::SUCCESS;
114}
115
116//****************************************************************************
117//* Execution
118//****************************************************************************
119
121{
122
123 // step1: read TileHits from TDS
124 const TileHitVector * inputHits = nullptr;
125 CHECK( evtStore()->retrieve(inputHits, m_hitVector) );
126
127 m_nchan = 0;
128 m_tolE = 0.0;
129 m_tolE0 = 0.0;
130 m_tolE1 = 0.0;
131 m_tolE2 = 0.0;
132 m_tolE3 = 0.0;
133 m_tolE4 = 0.0;
134 int n_hit = 0;
135 for (const TileHit& cinp : *inputHits) {
136
137 Identifier id = cinp.identify();
138
139 int size = cinp.size();
140 for (int i = 0; i < size; ++i) {
141 float time=cinp.time(i);
142 double ene=cinp.energy(i);
143 m_tolE += ene;
144 if (time<49.99) {
145 m_tolE4 += ene;
146 if (time<24.99) {
147 m_tolE3 += ene;
148 if (time<9.99) {
149 m_tolE2 += ene;
150 if (time<4.99) {
151 m_tolE1 += ene;
152 if (time>0.01) {
153 m_tolE0 += ene;
154 }
155 }
156 }
157 }
158 }
159 m_energy[m_nchan] = cinp.energy(i);
160 m_time[m_nchan] = cinp.time(i);
161
162 m_detector[m_nchan] = m_tileID->section(id);
163 m_side[m_nchan] = m_tileID->side(id);
164 m_sample[m_nchan] = m_tileID->sample(id);
165 m_pmt[m_nchan] = m_tileID->pmt(id);
166 m_eta[m_nchan] = m_tileID->tower(id);
167 m_phi[m_nchan] = m_tileID->module(id);
168
169 m_nchan++;
170 if (m_nchan >= m_maxLength)
171 break;
172 }
173
174 if (msgLvl(MSG::VERBOSE)) {
175 msg(MSG::VERBOSE) << " iHit=" << n_hit << " id="
176 << m_tileID->to_string(id, -1) << " ener=";
177
178 for (int i = 0; i < size; ++i)
179 msg(MSG::VERBOSE) << cinp.energy(i) << " ";
180
181 msg(MSG::VERBOSE) << "time=";
182 for (int i = 0; i < size; ++i)
183 msg(MSG::VERBOSE) << cinp.time(i) << " ";
184
185 msg(MSG::VERBOSE) << endmsg;
186 }
187
188 ++n_hit;
189 if (m_nchan >= m_maxLength) {
190 ATH_MSG_DEBUG( "Number of hits exceeds maximum (" << m_maxLength
191 << "), ignore all the rest" );
192 break;
193 }
194 }
195
196
197 // step3: commit ntuple
198 if ( m_commitNtuple ) {
199 ATH_MSG_DEBUG( "Committing Ntuple" );
200 CHECK( ntupleSvc()->writeRecord(m_ntuplePtr) );
201 }
202
203 // Execution completed.
204 ATH_MSG_DEBUG( "execute() completed successfully" );
205 return StatusCode::SUCCESS;
206}
207
208//****************************************************************************
209//* Finalize
210//****************************************************************************
211
213{
214 ATH_MSG_INFO( "finalize() completed successfully" );
215 return StatusCode::SUCCESS;
216}
#define endmsg
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
INTupleSvc * ntupleSvc()
AtlasHitsVector< TileHit > TileHitVector
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
NTuple::Item< double > m_tolE4
NTuple::Array< float > m_energy
NTuple::Array< int > m_phi
const TileID * m_tileID
NTuple::Array< int > m_sample
NTuple::Array< int > m_eta
TileHitVecToNtuple(const std::string &name, ISvcLocator *pSvcLocator)
NTuple::Array< int > m_pmt
NTuple::Array< int > m_detector
NTuple::Item< int > m_nchan
NTuple::Array< float > m_time
NTuple::Array< int > m_side
NTuple::Tuple * m_ntuplePtr
NTuple::Item< double > m_tolE2
NTuple::Item< double > m_tolE1
NTuple::Item< double > m_tolE3
NTuple::Item< double > m_tolE
NTuple::Item< double > m_tolE0