ATLAS Offline Software
Loading...
Searching...
No Matches
L1CPHitsTools.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
3*/
5// L1CPHitsTools.cxx,
7
8#include <map>
9#include <numeric>
10
19#include "L1CPHitsTools.h"
20
21namespace LVL1 {
22
24
26 const std::string& name,
27 const IInterface* parent)
28 :
29 AthAlgTool(type, name, parent)
30{
31 declareInterface<IL1CPHitsTools>(this);
32}
33
35
39
40
42
44{
45 m_debug = msgLvl(MSG::DEBUG);
46
47 ATH_MSG_INFO( "Initialization completed" );
48
49 return StatusCode::SUCCESS;
50}
51
53
55{
56 return StatusCode::SUCCESS;
57}
58
60
62 DataVector<CPMRoI>* cpmRoiVec) const
63{
65 DataVector<EmTauROI>::const_iterator pose = emTauRoiVec->end();
66 for (; pos != pose; ++pos) {
67 CPMRoI* roi = new CPMRoI((*pos)->roiWord());
68 cpmRoiVec->push_back(roi);
69 }
70}
71
73
75 DataVector<CPMHits>* cpmHitsVec) const
76{
77 std::vector<const DataVector<CPMRoI>*> cpmRoiColls(1, cpmRoiVec);
78 formCPMHits(cpmRoiColls, cpmHitsVec, 0);
79}
80
82
84 const std::vector<const DataVector<CPMRoI>*>& cpmRoiColls,
85 DataVector<CPMHits>* cpmHitsVec, int peak) const
86{
88 std::map<unsigned int, CPMHits*> cpmHitsMap;
90 int timeslices = cpmRoiColls.size();
91
92 for (int slice = 0; slice < timeslices; ++slice) {
93 const DataVector<CPMRoI>* cpmRoiVec = cpmRoiColls[slice];
94
95 for (it=cpmRoiVec->begin(); it!=cpmRoiVec->end(); ++it){
96 const CPMRoI* roi = *it;
97 unsigned int crate = roi->crate();
98 unsigned int module = roi->cpm();
99 unsigned int key = testKey.cpmKey(crate, module);
100 if (m_debug) {
101 CPRoIDecoder decoder;
102 CoordinateRange coord = decoder.coordinate(roi->roiWord());
103 if (timeslices > 1) ATH_MSG_DEBUG( "Slice " << slice << ", ");
104 ATH_MSG_DEBUG( "Found RoI with (eta, phi) = ("
105 << coord.eta() << ", " << coord.phi() << ") " << ", RoIWord = "
106 << std::hex << roi->roiWord() << std::dec );
107 ATH_MSG_DEBUG( "Crate = " << crate << ", Module = " << module
108 << ", CPM key = " << key );
109 }
110 CPMHits* cpmHits=0;
111 // find whether corresponding CPMHits already exists
112 std::map<unsigned int, CPMHits*>::iterator test=cpmHitsMap.find(key);
113 // if not, create it
114 if ( test==cpmHitsMap.end()){
115 ATH_MSG_DEBUG( "New key. CPM has crate = "
116 << crate << ", Module = " << module );
117 ATH_MSG_DEBUG( "Create new CPMHits" );
118 cpmHits = new CPMHits(crate, module);
119 if (timeslices > 1) {
120 HitsVector hitVec(timeslices);
121 cpmHits->addHits(hitVec, hitVec);
122 cpmHits->setPeak(peak);
123 }
124
125 ATH_MSG_DEBUG( "and insert into map" );
126 cpmHitsMap.insert(
127 std::map<unsigned int,CPMHits*>::value_type(key,cpmHits));
128 cpmHitsVec->push_back(cpmHits);
129 }
130 else {
131 ATH_MSG_DEBUG( "Existing CPMHits" );
132 cpmHits = test->second; // Already exists, so set pointer
133 }
134 // increment hit multiplicity.
135 ATH_MSG_DEBUG( "Update CPM hits" );
136 HitsVector hitvec0(cpmHits->HitsVec0());
137 HitsVector hitvec1(cpmHits->HitsVec1());
138 unsigned int hits0 = hitvec0[slice];
139 unsigned int hits1 = hitvec1[slice];
140 hits0 = addHits(hits0, roi->roiWord()&0xFF, 24, 8);
141 hits1 = addHits(hits1,(roi->roiWord()&0xFF00)>>8, 24, 8);
142 hitvec0[slice] = hits0;
143 hitvec1[slice] = hits1;
144 cpmHits->addHits(hitvec0, hitvec1);
145 ATH_MSG_DEBUG( "All done for this one" );
146 }
147 }
148}
149
151
153 DataVector<CMMCPHits>* cmmHitsVec) const
154{
157 formCMMCPHitsModule(cpmHitsVec, cmmHitsVec);
158 formCMMCPHitsCrate(cmmHitsVec, cmmHitsCrate);
159 formCMMCPHitsSystem(cmmHitsCrate, cmmHitsSys);
160 mergeCMMCPHits(cmmHitsVec, cmmHitsCrate);
161 mergeCMMCPHits(cmmHitsVec, cmmHitsSys);
162 delete cmmHitsCrate;
163 delete cmmHitsSys;
164}
165
167
169 DataVector<CMMCPHits>* cmmHitsMod) const
170{
171 DataVector<CPMHits>::const_iterator pos = cpmHitsVec->begin();
172 DataVector<CPMHits>::const_iterator pose = cpmHitsVec->end();
173 for (; pos != pose; ++pos) {
174 const CPMHits* hits = *pos;
175 int crate = hits->crate();
176 int cpm = hits->module();
177 int peak = hits->peak();
178 HitsVector hits0(hits->HitsVec0());
179 HitsVector hits1(hits->HitsVec1());
180 ErrorVector err0(hits0.size());
181 ErrorVector err1(hits1.size());
182 cmmHitsMod->push_back(new CMMCPHits(crate, cpm, hits0, hits1,
183 err0, err1, peak));
184 }
185}
186
188
190 DataVector<CMMCPHits>* cmmHitsCrate) const
191{
192 int peakm = 0;
193 HitsVector crate0Hit0(1);
194 HitsVector crate0Hit1(1);
195 HitsVector crate1Hit0(1);
196 HitsVector crate1Hit1(1);
197 HitsVector crate2Hit0(1);
198 HitsVector crate2Hit1(1);
199 HitsVector crate3Hit0(1);
200 HitsVector crate3Hit1(1);
202 DataVector<CMMCPHits>::const_iterator pose = cmmHitsMod->end();
203 for (; pos != pose; ++pos) {
204 const CMMCPHits* hits = *pos;
205 int dataId = hits->dataID();
206 if (dataId > 14) continue;
207 int crate = hits->crate();
208 int peak = hits->peak();
209 if (peak > peakm) peakm = peak;
210 HitsVector hits0(hits->HitsVec0());
211 HitsVector hits1(hits->HitsVec1());
212 if (crate == 0) {
213 addCMMCPHits(crate0Hit0, hits0);
214 addCMMCPHits(crate0Hit1, hits1);
215 } else if (crate == 1) {
216 addCMMCPHits(crate1Hit0, hits0);
217 addCMMCPHits(crate1Hit1, hits1);
218 } else if (crate == 2) {
219 addCMMCPHits(crate2Hit0, hits0);
220 addCMMCPHits(crate2Hit1, hits1);
221 } else if (crate == 3) {
222 addCMMCPHits(crate3Hit0, hits0);
223 addCMMCPHits(crate3Hit1, hits1);
224 }
225 }
226 // Save non-zero crate totals
227 saveCMMCPHits(cmmHitsCrate, crate0Hit0, crate0Hit1, 0, CMMCPHits::LOCAL,
228 peakm);
229 saveCMMCPHits(cmmHitsCrate, crate1Hit0, crate1Hit1, 1, CMMCPHits::LOCAL,
230 peakm);
231 saveCMMCPHits(cmmHitsCrate, crate2Hit0, crate2Hit1, 2, CMMCPHits::LOCAL,
232 peakm);
233 saveCMMCPHits(cmmHitsCrate, crate3Hit0, crate3Hit1, 3, CMMCPHits::LOCAL,
234 peakm);
235 saveCMMCPHits(cmmHitsCrate, crate0Hit0, crate0Hit1, 3, CMMCPHits::REMOTE_0,
236 peakm);
237 saveCMMCPHits(cmmHitsCrate, crate1Hit0, crate1Hit1, 3, CMMCPHits::REMOTE_1,
238 peakm);
239 saveCMMCPHits(cmmHitsCrate, crate2Hit0, crate2Hit1, 3, CMMCPHits::REMOTE_2,
240 peakm);
241}
242
244
246 const DataVector<CMMCPHits>* cmmHitsCrate,
247 DataVector<CMMCPHits>* cmmHitsSys) const
248{
249 int peakm = 0;
250 HitsVector systemHit0(1);
251 HitsVector systemHit1(1);
252 DataVector<CMMCPHits>::const_iterator pos = cmmHitsCrate->begin();
253 DataVector<CMMCPHits>::const_iterator pose = cmmHitsCrate->end();
254 for (; pos != pose; ++pos) {
255 const CMMCPHits* hits = *pos;
256 if (hits->crate() != 3) continue;
257 int dataId = hits->dataID();
258 if (dataId != CMMCPHits::LOCAL &&
259 dataId != CMMCPHits::REMOTE_0 &&
260 dataId != CMMCPHits::REMOTE_1 &&
261 dataId != CMMCPHits::REMOTE_2) continue;
262 int peak = hits->peak();
263 if (peak > peakm) peakm = peak;
264 HitsVector hits0(hits->HitsVec0());
265 HitsVector hits1(hits->HitsVec1());
266 addCMMCPHits(systemHit0, hits0);
267 addCMMCPHits(systemHit1, hits1);
268 }
269 // Save non-zero system totals
270 saveCMMCPHits(cmmHitsSys, systemHit0, systemHit1, 3, CMMCPHits::TOTAL, peakm);
271}
272
274
276{
277 int size1 = vec1.size();
278 int size2 = vec2.size();
279 if (size1 < size2) vec1.resize(size2);
280 HitsVector::iterator pos1 = vec1.begin();
281 HitsVector::iterator pose1 = vec1.end();
282 HitsVector::const_iterator pos2 = vec2.begin();
283 HitsVector::const_iterator pose2 = vec2.end();
284 for (; pos1 != pose1 && pos2 != pose2; ++pos1, ++pos2) {
285 *pos1 = addHits(*pos1, *pos2, 24, 24);
286 }
287}
288
290
291unsigned int L1CPHitsTools::addHits(unsigned int hitMult,
292 unsigned int hitVec,
293 int multBits, int vecBits) const
294{
295 ATH_MSG_DEBUG("addHits: Original hitMult = " << std::hex << hitMult
296 << ". Add hitWord = " << hitVec << std::dec);
297
298 // Results transmitted in 2 words, each reporting half of the CP thresholds
299 int nthresh = TrigT1CaloDefs::numOfCPThresholds/2;
300
301 int nbitsOut = multBits/nthresh;
302 int nbitsIn = vecBits/nthresh;
303
304 ATH_MSG_DEBUG(" Bits per threshold = " << nbitsOut);
305
306 int max = (1<<nbitsOut) - 1;
307 unsigned int multMask = max;
308 unsigned int hitMask = (1<<nbitsIn) - 1;
309 unsigned int shift = 0;
310
311 unsigned int hits = 0;
312
313 for (int i = 0; i < nthresh; i++) {
314 int mult = (hitMult&multMask) + (hitVec&hitMask);
315 mult = ( (mult<=max) ? mult : max);
316 hits += (mult<<shift);
317
318 hitMult >>= nbitsOut;
319 hitVec >>= nbitsIn;
320 shift += nbitsOut;
321 }
322
323 ATH_MSG_DEBUG("addHits returning hitMult = "
324 << std::hex << hits << std::dec );
325
326 return hits;
327}
328
330
332 DataVector<CMMCPHits>* cmmHitsVec2) const
333{
334 int size = cmmHitsVec2->size();
335 for (int index = 0; index < size; ++index) {
336 CMMCPHits* hitsIn = 0;
337 CMMCPHits* hitsOut = 0;
338 cmmHitsVec2->swapElement(index, hitsIn, hitsOut);
339 cmmHitsVec1->push_back(hitsOut);
340 }
341 cmmHitsVec2->clear();
342}
343
345
347 const HitsVector& hits0,
348 const HitsVector& hits1,
349 int crate, int dataId, int peak) const
350{
351 if (std::accumulate(hits0.begin(), hits0.end(), 0) ||
352 std::accumulate(hits1.begin(), hits1.end(), 0)) {
353 ErrorVector err0(hits0.size());
354 ErrorVector err1(hits1.size());
355 cmmHitsVec->push_back(new CMMCPHits(crate, dataId, hits0, hits1,
356 err0, err1, peak));
357 }
358}
359
360} // end of namespace
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
double coord
Type of coordination system.
#define max(a, b)
Definition cfImp.cxx:41
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
bool msgLvl(const MSG::Level lvl) const
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
void swapElement(size_type index, value_type newElem, reference oldElem)
Swap one element out of the container.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
void clear()
Erase all the elements in the collection.
Summary of CP (EM/tau) hits received by the merger modules.
The CPMHits object contains the hit data produced by a given Cluster Processor Module,...
const std::vector< unsigned int > & HitsVec0() const
Multi-slice accessors.
Definition CPMHits.cxx:63
void addHits(const std::vector< unsigned int > &hits0, const std::vector< unsigned int > &hits1)
Add hits to existing object.
Definition CPMHits.cxx:71
const std::vector< unsigned int > & HitsVec1() const
Definition CPMHits.cxx:66
void setPeak(int peak)
In multi-slice readout, need to specify which is peak slice.
Definition CPMHits.cxx:78
uint32_t roiWord() const
Return packed RoI word.
int crate() const
Return crate number (0-1)
int cpm() const
Return CPM number (1-14)
A level 1 calorimeter trigger conversion service: returns the Coordinate represented by a RoI word.
The ClusterProcessorModuleKey object provides the key for each trigger tower depending on its eta-phi...
unsigned int cpmKey(unsigned int crate, unsigned int module)
calculates key from crate and module index
CoordinateRange class declaration.
virtual void formCMMCPHitsSystem(const DataVector< CMMCPHits > *cmmHitsCrate, DataVector< CMMCPHits > *cmmHitsSys) const
form partial CMM-CP hits (system) from crate CMM-CP hits
virtual void formCMMCPHitsModule(const DataVector< CPMHits > *cpmHitsVec, DataVector< CMMCPHits > *cmmHitsMod) const
form partial CMM-CP hits (module) from CPM hits
virtual ~L1CPHitsTools()
default destructor
std::vector< unsigned int > HitsVector
virtual void formCPMRoI(const DataVector< EmTauROI > *emTauRoiVec, DataVector< CPMRoI > *cpmRoiVec) const
EmTauROI to CPMRoI conversion.
virtual void formCPMHits(const DataVector< CPMRoI > *cpmRoiVec, DataVector< CPMHits > *cpmHitsVec) const
form CPM hits from RoIs - single slice
virtual void formCMMCPHitsCrate(const DataVector< CMMCPHits > *cmmHitsMod, DataVector< CMMCPHits > *cmmHitsCrate) const
form partial CMM-CP hits (crate) from module CMM-CP hits
void mergeCMMCPHits(DataVector< CMMCPHits > *cmmHitsVec1, DataVector< CMMCPHits > *cmmHitsVec2) const
Merge CMM-CP hits vectors.
void saveCMMCPHits(DataVector< CMMCPHits > *cmmHitsVec, const HitsVector &hits0, const HitsVector &hits1, int crate, int dataId, int peak) const
Save non-zero CMM-CP hits.
void addCMMCPHits(HitsVector &vec1, const HitsVector &vec2) const
Add hits from second vector to first.
unsigned int addHits(unsigned int hitMult, unsigned int hitVec, int multBits, int vecBits) const
Increment CPM/CMM hit word.
virtual StatusCode finalize()
standard Athena-Algorithm method
std::vector< int > ErrorVector
virtual void formCMMCPHits(const DataVector< CPMHits > *cpmHitsVec, DataVector< CMMCPHits > *cmmHitsVec) const
form complete CMM-CP hits from CPM hits
L1CPHitsTools(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
virtual StatusCode initialize()
standard Athena-Algorithm method
static const unsigned int numOfCPThresholds
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Definition index.py:1