ATLAS Offline Software
Loading...
Searching...
No Matches
LArHitContainerCnv_p2.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3*/
4
7#include "Identifier/Identifier.h"
8
11
13
14// LArHitContainerCnv_p2, used for T/P separation
15// author Ilija Vukotic
16
19#include "GaudiKernel/ServiceHandle.h"
20#include <map>
21#include <stdexcept>
22
23
25 : m_cellIdHelper(nullptr)
26{
27 ServiceHandle<StoreGateSvc> detStore ("DetectorStore", "LArHitContainerCnv_p2");
28 if (detStore->retrieve (m_cellIdHelper, "CaloCell_ID").isFailure()) {
29 throw std::runtime_error ("LArHitContainerCnv_p2: Can't get CaloCell_ID");
30 }
31}
32
33
34void LArHitContainerCnv_p2::transToPers(const LArHitContainer* transCont, LArHitContainer_p2* persCont, MsgStream &log)
35{ //static int ev=0;
36
37 size_t size = transCont->size();
38 log << MSG::DEBUG << " *** Writing LArHitContainer_p2 of size:"<<size<<endmsg;
39
40 persCont->m_channelHash.reserve(size);
41 std::vector<float> tempE; tempE.reserve(size);
42 std::vector<float> tempT; tempT.reserve(size);
43
44 LArHitContainer::const_iterator it = transCont->begin();
45
46 std::multimap <unsigned int, unsigned int> map_hashPositions;// first hash ; second its position in container
47
48 for (unsigned int w=0;w<size;++w){
49 IdentifierHash hashId = m_cellIdHelper->calo_cell_hash((*it)->cellID());
50 map_hashPositions.insert(std::pair<unsigned int, int>((unsigned int)hashId, w));
51// if (!ev) std::cout<<hashId<<"\t"<<((*it)->cellID())<<std::endl;
52 ++it;
53 }
54
55 std::multimap<unsigned int, unsigned int>::const_iterator iter;
56 unsigned int old=0;
57// int count=0;
58 for (iter=map_hashPositions.begin(); iter != map_hashPositions.end(); ++iter) {
59 //cout <<"container position:"<< iter->second << " \t hash:" << iter->first << endl;
60 unsigned int pHash=(iter->first)-old; // to store as a difference
61 old=iter->first;
62 unsigned int pos=iter->second;
63 persCont->m_channelHash.push_back(pHash);
64 tempE.push_back( (float) (transCont->At(pos))->energy() );
65 tempT.push_back( (float) (transCont->At(pos))->time() );
66// if (!ev) std::cout<<"Writing Hash: "<<iter->first<<"\t E: "<< (float) (transCont->At(pos))->m_energy<<"\t T: "<< (float) (transCont->At(pos))->m_time<<std::endl;
67// count++;
68 }
69// std::cout<<"ILIJA : "<<count<<std::endl;
70
71 Compressor A; A.setNrBits(18);
72 A.reduce(tempE,persCont->m_energy); // packs energy
73 Compressor B;
74 B.reduceToUS(tempT, persCont->m_time);
75 persCont->m_name = transCont->Name(); //stores name
76
77// ev++;
78}
79
80
81
82void LArHitContainerCnv_p2::persToTrans(const LArHitContainer_p2* persCont, LArHitContainer* transCont, MsgStream &log)
83{
84// static int dog=0;
85 size_t cells=persCont->m_channelHash.size();
86 log << MSG::DEBUG << " *** Reading LArHitContainer of size: "<<cells<<endmsg;
87 transCont->clear();
88 transCont->reserve(cells);
89 transCont->setName(persCont->name() );
90
91
93 std::vector<float> tempE; tempE.reserve(cells);
94 std::vector<float> tempT; tempT.reserve(cells);
95
96 A.expandFromUStoFloat(persCont->m_time,tempT);
97 A.expandToFloat(persCont->m_energy,tempE);
98 unsigned int sum=0;
99 for (unsigned int i=0;i<cells;++i){
100 sum+= persCont->m_channelHash[i];
101 LArHit* trans=new LArHit
102 (m_cellIdHelper->cell_id(sum),
103 tempE[i],
104 tempE[i] != 0 ? (double)(tempT[i])/tempE[i] : 0);
105// if(!dog) std::cout<<"Reading hash: "<< sum <<"\t E: "<< (double)tempE[i]<<"\t T: "<<(tempT[i]) <<std::endl;
106 transCont->push_back(trans);
107 }
108// dog++;
109}
110
#define endmsg
boost::transform_iterator< make_const, typename CONT::const_iterator > const_iterator
void reserve(size_type n)
void setName(const std::string &name)
const T * At(unsigned int pos) const
const_iterator begin() const
size_type size() const
const std::string & Name() const
This is a "hash" representation of an Identifier.
virtual void persToTrans(const LArHitContainer_p2 *persColl, LArHitContainer *transColl, MsgStream &log) override
const CaloCell_ID * m_cellIdHelper
virtual void transToPers(const LArHitContainer *transColl, LArHitContainer_p2 *persColl, MsgStream &log) override
Persistent represenation of a LArHitContainer,.
std::vector< unsigned int > m_channelHash
std::vector< unsigned int > m_energy
const std::string & name() const
std::vector< unsigned short > m_time
Hit collection.
Class to store hit energy and time in LAr cell from G4 simulation.
Definition LArHit.h:25
hold the test vectors and ease the comparison