ATLAS Offline Software
Loading...
Searching...
No Matches
TileCellFillerTool.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/*
6 * File: TileCellFillerTool.cxx
7 * Author: Marco van Woerden <mvanwoer@cern.ch>, Gang Qin <gang.qin@cern.ch>
8 * Description: CaloCell filler.
9 *
10 * Created in September 2012
11 */
12
13// INCLUDE HEADER
15#include "TileCellFillerTool.h"
16
17// xAOD tools
19using namespace xAOD;
20
21
22// ADD TILEMUONCELLFILLERTOOL TO D3PD NAMESPACE
23namespace D3PD{
24
25//=======================================================================================================================
26TileCellFillerTool::TileCellFillerTool(const std::string& type,const std::string& name,const IInterface* parent):
28m_trackInCalo("TrackInCaloTools/extrapolMuonInCaloTool"){
29//=======================================================================================================================
30
31 // TRACK EXTRAPOLATOR TOOL
32 declareProperty("TrackTools", m_trackInCalo);
33 declareProperty("LevelOfDetails", m_LevelOfDetails = 1);
34 declareProperty("TryStandAloneMuons", m_standalone = "no");
35 declareProperty("FilterConfiguration", m_filterConfiguration = 0);
36 declareProperty("TrackType", m_trackType = 0);
37 declareProperty("MuonContainerName", m_muonContainerName="Muons");
38
39 TileCellFillerTool::book().ignore(); // AVOID COVERITY WARNINGS
40
41} // TileCellFillerTool::TileCellFillerTool
42
43
44//==============================================
46//==============================================
47
48 ATH_MSG_DEBUG("TileCellFillerTool::initialize()");
49
50 if(m_LevelOfDetails > 1){
51 // RETRIEVE CALORIMETER EXTRAPOLATOR TOOLS
52 CHECK(m_trackInCalo.retrieve());
53 } // IF
54
55 // RETRIEVE SERVICES
56 if(m_LevelOfDetails > 2){
57 CHECK(detStore()->retrieve(m_tileID));
58 CHECK(detStore()->retrieve(m_tileHWID));
59 } // IF
60
61 return StatusCode::SUCCESS;
62
63} // TileCellFillerTool::initialize
64
65//============================================
67//============================================
68
69 ATH_MSG_DEBUG("TileCellFillerTool::finalize()");
70 return StatusCode::SUCCESS;
71
72} // TileCellFillerTool::finalize
73
74//========================================
76//========================================
77 if(m_LevelOfDetails > 0){
78 // CELL ENERGY AND ETA/PHI
80 CHECK( addVariable ("Et", m_cellEt));
81 CHECK( addVariable ("eta", m_cellEta));
82 CHECK( addVariable ("phi", m_cellPhi));
83 } // IF
84
85 if(m_LevelOfDetails > 1){
86 CHECK( addVariable ("gain", m_cellGain));
87 CHECK( addVariable ("badCell", m_badCell));
88 CHECK( addVariable ("samplingID", m_samplingID));
89 CHECK( addVariable ("time", m_time));
90 CHECK( addVariable ("quality", m_quality));
91 CHECK( addVariable ("subcalo", m_subcalo));
92 } // IF
93
94 if(m_LevelOfDetails > 2){
95 // GLOBAL CELL POSITIONING AND QUALITY
96 CHECK( addVariable ("sinTh", m_cellSinTh));
97 CHECK( addVariable ("cosTh", m_cellCosTh));
98 CHECK( addVariable ("cotTh", m_cellCotTh));
99 CHECK( addVariable ("x", m_cellX));
100 CHECK( addVariable ("y", m_cellY));
101 CHECK( addVariable ("z", m_cellZ));
102
103 // CELL DIMENSIONS
104 CHECK( addVariable ("R", m_cellR));
105 CHECK( addVariable ("dR", m_celldR));
106 CHECK( addVariable ("dx", m_celldX));
107 CHECK( addVariable ("dy", m_celldY));
108 CHECK( addVariable ("dz", m_celldZ));
109 CHECK( addVariable ("V", m_cellV));
110 CHECK( addVariable ("dPhi", m_celldPhi));
111 CHECK( addVariable ("dEta", m_celldEta));
112
113 // TILECAL CELL POSITIONING
114 CHECK( addVariable ("side", m_side , "",-2));
115 CHECK( addVariable ("section", m_section , "",-2));
116 CHECK( addVariable ("module", m_module , "",-2));
117 CHECK( addVariable ("tower", m_tower , "",-2));
118 CHECK( addVariable ("sample", m_sample , "",-2));
119 CHECK( addVariable ("eta_index", m_eta_index, "",-2));
120 } // IF
121
122 if(m_LevelOfDetails > 3){
123 // PMT INFORMATION
124 CHECK( addVariable ("PMT1_energy", m_pmt1Energy, "",0.));
125 CHECK( addVariable ("PMT1_time", m_pmt1Time, "",0.));
126 CHECK( addVariable ("PMT1_quality", m_pmt1Quality, "",0));
127 CHECK( addVariable ("PMT1_qbit", m_pmt1Qbit, "",0));
128 CHECK( addVariable ("PMT1_bad", m_pmt1Bad, "",false));
129 CHECK( addVariable ("PMT1_gain", m_pmt1Gain, "",0));
130 CHECK( addVariable ("PMT1_ros", m_pmt1Ros, "",-1));
131 CHECK( addVariable ("PMT1_drawer", m_pmt1Drawer, "",-1));
132 CHECK( addVariable ("PMT1_channel", m_pmt1Channel, "",-1));
133
134 CHECK( addVariable ("PMT2_energy", m_pmt2Energy, "",0.));
135 CHECK( addVariable ("PMT2_time", m_pmt2Time, "",0.));
136 CHECK( addVariable ("PMT2_quality", m_pmt2Quality, "",0));
137 CHECK( addVariable ("PMT2_qbit", m_pmt2Qbit, "",0));
138 CHECK( addVariable ("PMT2_bad", m_pmt2Bad, "",false));
139 CHECK( addVariable ("PMT2_gain", m_pmt2Gain, "",0));
140 CHECK( addVariable ("PMT2_ros", m_pmt2Ros, "",-1));
141 CHECK( addVariable ("PMT2_drawer", m_pmt2Drawer, "",-1));
142 CHECK( addVariable ("PMT2_channel", m_pmt2Channel, "",-1));
143 } // IF
144
145 if(m_LevelOfDetails > 4){
146 // PATH LENGTH AND CELL RESPONSE
147 CHECK( addVariable ("muon_N", m_muN, "", 0));
148 CHECK( addVariable ("muon_dx", m_dx));
149 CHECK( addVariable ("muon_dEdx", m_dEdx));
150 CHECK( addVariable ("muon_type", m_mutype));
151 CHECK( addVariable ("muon_author", m_muonAuthor));
152 CHECK( addVariable ("muon_ptcone40", m_muptcone40));
153 CHECK( addVariable ("muon_larcone40", m_mularcone40));
154 CHECK( addVariable ("muon_p", m_mup));
155 CHECK( addVariable ("muon_Nsiliconhits", m_muNsiliconhits));
156 CHECK( addVariable ("muon_x", m_muonX));
157 CHECK( addVariable ("muon_y", m_muonY));
158 CHECK( addVariable ("muon_z", m_muonZ));
159 CHECK( addVariable ("muon_phi", m_muonPhi));
160 CHECK( addVariable ("muon_eta", m_muonEta));
161 CHECK( addVariable ("to_muon_dx", m_to_muon_dx));
162 CHECK( addVariable ("to_muon_dy", m_to_muon_dy));
163 CHECK( addVariable ("to_muon_dz", m_to_muon_dz));
164 CHECK( addVariable ("to_muon_dPhi", m_to_muon_dPhi));
165 CHECK( addVariable ("to_muon_dEta", m_to_muon_dEta));
166 } // IF
167
168 return StatusCode::SUCCESS;
169} // TileCellFillerTool::book
170
171//==========================================================
172StatusCode TileCellFillerTool::fill (const CaloCell& p){
173//==========================================================
174 ATH_MSG_DEBUG("TileCellFillerTool::fill()");
175
176 const CaloDetDescrElement *dde = p.caloDDE();
177
178 if(m_LevelOfDetails > 0){
179 // DEPOSITED ENERGY
180 *m_cellEnergy = p.energy();
181 *m_cellEt = p.et();
182
183 // CELL POSITION
184 *m_cellEta = p.eta();
185 *m_cellPhi = p.phi();
186 } // IF
187
188 if(m_LevelOfDetails > 1){
189 *m_cellGain = p.gain();
190 *m_badCell = p.badcell();
191 *m_time = p.time();
192 *m_quality = p.provenance();
193 *m_samplingID = dde->getSampling();
194 *m_subcalo = dde->getSubCalo();
195
196 } // IF
197
198 if(m_LevelOfDetails > 2){
199 *m_cellSinTh = p.sinTh();
200 *m_cellCosTh = p.cosTh();
201 *m_cellCotTh = p.cotTh();
202
203 // CELL DIMENSIONS
204 *m_cellX = dde->x();
205 *m_cellY = dde->y();
206 *m_cellZ = dde->z();
207 *m_cellR = dde->r();
208 *m_celldX = dde->dx();
209 *m_celldY = dde->dy();
210 *m_celldZ = dde->dz();
211 *m_celldR = dde->dr();
212 *m_cellV = dde->volume();
213 *m_celldPhi = dde->dphi();
214 *m_celldEta = dde->deta();
215
216
217 // RAW CHANNEL INFORMATION
218 const CaloCell* cell=&p;
219 const TileCell* tilecell = dynamic_cast<const TileCell*> (cell);
220
221 if(tilecell){
222 *m_side = m_tileID->side(cell->ID());
223 *m_section = m_tileID->section(cell->ID());
224 *m_module = m_tileID->module(cell->ID());
225 *m_tower = m_tileID->tower(cell->ID());
226 *m_sample = m_tileID->sample(cell->ID());
227 *m_eta_index = m_trackInCalo->retrieveIndex(*m_samplingID,*m_cellEta);
228
229 if(m_LevelOfDetails > 3){
230 *m_pmt1Energy = tilecell->ene1();
231 *m_pmt2Energy = tilecell->ene2();
232 *m_pmt1Time = tilecell->time1();
233 *m_pmt2Time = tilecell->time2();
234 *m_pmt1Quality = tilecell->qual1();
235 *m_pmt2Quality = tilecell->qual2();
236 *m_pmt1Qbit = tilecell->qbit1();
237 *m_pmt2Qbit = tilecell->qbit2();
238 *m_pmt1Bad = tilecell->badch1();
239 *m_pmt2Bad = tilecell->badch2();
240 *m_pmt1Gain = tilecell->gain1();
241 *m_pmt2Gain = tilecell->gain2();
242
243 *m_pmt1Ros = m_tileHWID->ros(m_tileHWID->adc_id(dde->onl1(),tilecell->gain1()));
244 *m_pmt2Ros = m_tileHWID->ros(m_tileHWID->adc_id(dde->onl2(),tilecell->gain2()));
245 *m_pmt1Drawer = m_tileHWID->drawer(m_tileHWID->adc_id(dde->onl1(),tilecell->gain1()));
246 *m_pmt2Drawer = m_tileHWID->drawer(m_tileHWID->adc_id(dde->onl2(),tilecell->gain2()));
247 *m_pmt1Channel = m_tileHWID->channel(m_tileHWID->adc_id(dde->onl1(),tilecell->gain1()));
248 *m_pmt2Channel = m_tileHWID->channel(m_tileHWID->adc_id(dde->onl2(),tilecell->gain2()));
249 } // IF
250 } // ELSE
251 } // IF
252
253 if(m_LevelOfDetails > 4){
254 // RETRIEVE APPROPRIATE POINTERS
255 // GET HANDLE ON MUON CONTAINER
256 const MUONCONTAINER* muons = 0;
257
258 // MUONS
259 CHECK( evtStore()->retrieve( muons, m_muonContainerName ) );
260
261 MUONCONTAINER::const_iterator muonItr = muons->begin();
262 MUONCONTAINER::const_iterator muonEnd = muons->end();
263 for(; muonItr != muonEnd; ++muonItr ){
264 const MUON* muon = *muonItr;
265 // MUON COUNTER AND TYPES
266 *m_muN = *m_muN + 1;
267 m_mutype->push_back(m_trackType); // NO MUON
268 m_muonAuthor->push_back( muon->author() );
269
276 const TRACK* muon_track = 0;
277 switch(m_trackType)
278 {
279 case 0: muon_track = muon->trackParticle(xAOD::Muon::CombinedTrackParticle); break;
280 case 1: muon_track = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle); break;
281 case 2: muon_track = muon->trackParticle(xAOD::Muon::MuonSpectrometerTrackParticle); break;
282 default: muon_track = muon->primaryTrackParticle(); break;
283 } // SWITCH
284 if(!muon_track) continue;
285
286 std::vector<double> coordinates = m_trackInCalo->getXYZEtaPhiInCellSampling(muon_track,&p);
287
288 if(coordinates.size() == 5 )
289 {
290 // CALCULATE PATH LENGTHS USING EXTRAPOLATOR TOOL
291 float path = m_trackInCalo->getPathInsideCell(muon_track,&p);
292 float ptcone40 = 0.;
293 if (!muon->isolation(ptcone40, Iso::IsolationType::ptcone40 ))
294 ptcone40 = 0;
295 m_muptcone40 ->push_back(ptcone40);
296 m_mularcone40 ->push_back(0.); //FIXME
297 m_mup ->push_back(muon->p4().P());
298
299 uint8_t NumberOfPixelHits=0;
300 uint8_t NumberOfSCTHits=0;
301 if( !muon->summaryValue(NumberOfPixelHits,xAOD::numberOfPixelHits) )
302 {
303 ATH_MSG_INFO("Can not get the value of numberOfPixelHits");
304 }
305 if( !muon->summaryValue(NumberOfSCTHits,xAOD::numberOfSCTHits) )
306 {
307 ATH_MSG_INFO("Can not get the value of numberOfSCTHits");
308 }
309
310 m_muNsiliconhits->push_back( int(NumberOfPixelHits + NumberOfSCTHits) );
311
312 m_muonX ->push_back(coordinates[0]);
313 m_muonY ->push_back(coordinates[1]);
314 m_muonZ ->push_back(coordinates[2]);
315 m_muonEta->push_back(coordinates[3]);
316 m_muonPhi->push_back(coordinates[4]);
317
318 m_to_muon_dx ->push_back(*m_cellX - coordinates[0]);
319 m_to_muon_dy ->push_back(*m_cellY - coordinates[1]);
320 m_to_muon_dz ->push_back(*m_cellZ - coordinates[2]);
321 m_to_muon_dEta->push_back(*m_cellEta - coordinates[3]);
322 m_to_muon_dPhi->push_back( KinematicUtils::deltaPhi(coordinates[4],*m_cellPhi) );
323
324 m_dx->push_back(path);
325 m_dEdx->push_back(path > 0 ? p.energy() / path : -1.);
326 } // IF
327 } // FOR
328 } // IF
329
330 return StatusCode::SUCCESS;
331} // TileCellFillerTool::fill
332
333} // namespace D3PD
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
xAOD::TrackParticle TRACK
Block filler tool for CaloCells, used for muon studies in TileCal.
xAOD::MuonContainer MUONCONTAINER
xAOD::Muon MUON
D3PD INCLUDES.
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
This class groups all DetDescr information related to a CaloCell.
CaloCell_ID::CaloSample getSampling() const
cell sampling
IdentifierHash onl2() const
cell online identifier 2
IdentifierHash onl1() const
cell online identifier 1
virtual StatusCode addVariable(const std::string &name, const std::type_info &ti, void *&ptr, const std::string &docstring="", const void *defval=0)
Type-safe wrapper for block filler tools.
std::vector< float > * m_muonX
std::vector< float > * m_muonPhi
std::vector< float > * m_to_muon_dEta
std::vector< float > * m_to_muon_dz
std::vector< float > * m_muonY
std::vector< float > * m_dEdx
std::vector< float > * m_muptcone40
std::vector< short > * m_muonAuthor
virtual StatusCode fill(const CaloCell &p)
Fill one block — type-safe version.
std::vector< float > * m_mularcone40
virtual StatusCode book()
Declare tuple variables.
std::vector< float > * m_mup
std::vector< float > * m_dx
std::vector< short > * m_mutype
std::vector< short > * m_muNsiliconhits
TileCellFillerTool(const std::string &type, const std::string &name, const IInterface *parent)
std::vector< float > * m_muonZ
ToolHandle< ITrackTools > m_trackInCalo
std::vector< float > * m_to_muon_dy
virtual StatusCode initialize()
std::vector< float > * m_muonEta
std::vector< float > * m_to_muon_dPhi
virtual StatusCode finalize()
std::vector< float > * m_to_muon_dx
DataModel_detail::const_iterator< DataVector > 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.
uint8_t qual1(void) const
get quality of first PMT (data member)
Definition TileCell.h:197
float time1(void) const
get time of first PMT
Definition TileCell.h:192
int gain2(void) const
get gain of second PMT
Definition TileCell.cxx:175
bool badch1(void) const
check if first PMT is in bad channel list and masked
Definition TileCell.h:209
uint8_t qbit2(void) const
get quality bits of second PMT (data member)
Definition TileCell.h:206
int gain1(void) const
get gain of first PMT
Definition TileCell.cxx:168
uint8_t qual2(void) const
get quality of second PMT (data member)
Definition TileCell.h:200
float ene1(void) const
get energy of first PMT
Definition TileCell.h:187
bool badch2(void) const
check if second PMT is in bad channel list and masked
Definition TileCell.h:212
float time2(void) const
get time of second PMT
Definition TileCell.h:194
uint8_t qbit1(void) const
get quality bits of first PMT (data member)
Definition TileCell.h:203
float ene2(void) const
get energy of second PMT
Definition TileCell.h:189
Block filler tool for noisy FEB information.
double deltaPhi(double phi1, double phi2)
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].