ATLAS Offline Software
Loading...
Searching...
No Matches
LArGeoWeightsFill.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "LArGeoWeightsFill.h"
8#include "CaloDetDescr/CaloDetDescrElement.h"
9#include <fstream>
10
12#include "CoralBase/Blob.h"
13#include "CoralBase/Attribute.h"
14#include "CoralBase/AttributeList.h"
15#include "CoralBase/AttributeListSpecification.h"
16#include "CoolKernel/StorageType.h"
17
18LArGeoWeightsFill::LArGeoWeightsFill(const std::string& name, ISvcLocator* pSvcLocator) :
19 AthAlgorithm(name,pSvcLocator),
20 m_onlineID(0),
21 m_ttService("CaloTriggerTowerService")
22{
23 declareProperty("Key",m_key="GeoWeights");
24 declareProperty("Dump",m_dump=false);
25 declareProperty("OutFile",m_outFileName="out.txt");
26 //declareProperty("InFile",m_inFileName="");
27
28 declareProperty("Fill",m_fill=true);
29}
30
32
33
35
36 ATH_MSG_DEBUG ( "start initialize()" );
37 ATH_CHECK( detStore()->retrieve(m_onlineID,"LArOnlineID") );
38 ATH_CHECK( m_cablingKey.initialize() );
39 ATH_CHECK( m_caloMgrKey.initialize() );
40 ATH_CHECK( m_ttService.retrieve() );
41 return StatusCode::SUCCESS;
42}
43
45
46 ATH_MSG_DEBUG ( "start stop()" );
47
48 const unsigned hashMax=m_onlineID->channelHashMax();
49
50 if (m_fill) {
51
52 ATH_MSG_INFO ( "Filling database" );
53
54 coral::AttributeListSpecification* spec = new coral::AttributeListSpecification();
55 //cool::RecordSpecification* spec = new cool::RecordSpecification();
56 spec->extend("costheta", "blob");
57 spec->extend("sinthetacosphi", "blob");
58 spec->extend("sinthetasinphi", "blob");
59 spec->extend("offlineTTid","blob");
60
62 coral::Blob& costhetaBlob = (*attr)["costheta"].data<coral::Blob>();
63 coral::Blob& sinthetacosphiBlob = (*attr)["sinthetacosphi"].data<coral::Blob>();
64 coral::Blob& sinthetasinphiBlob = (*attr)["sinthetasinphi"].data<coral::Blob>();
65 coral::Blob& offlineTTidBlob = (*attr)["offlineTTid"].data<coral::Blob>();
66
67
68 costhetaBlob.resize(hashMax*sizeof(float));
69 sinthetacosphiBlob.resize(hashMax*sizeof(float));
70 sinthetasinphiBlob.resize(hashMax*sizeof(float));
71 offlineTTidBlob.resize(hashMax*sizeof(uint32_t));
72
73 float* pcostheta=static_cast<float*>(costhetaBlob.startingAddress());
74 float* psinthetacosphi=static_cast<float*>(sinthetacosphiBlob.startingAddress());
75 float* psinthetasinphi=static_cast<float*>(sinthetasinphiBlob.startingAddress());
76 uint32_t* pofflineTTid=static_cast<uint32_t*>(offlineTTidBlob.startingAddress());
77
78 ATH_CHECK( detStore()->record(attr,m_key) );
79
81 ATH_CHECK(caloMgrHandle.isValid());
82 const CaloDetDescrManager *theCaloDDM = *caloMgrHandle;
83 ATH_MSG_INFO ( "theCaloDDM retrieved" );
85 const LArOnOffIdMapping* cabling{*cablingHdl};
86 if(!cabling) {
87 ATH_MSG_ERROR("Do not have mapping object " << m_cablingKey.key());
88 return StatusCode::FAILURE;
89 }
90
91 for (unsigned hs=0;hs<hashMax;++hs) {
92 const HWIdentifier chid=m_onlineID->channel_Id(hs);
93
94 if(!cabling->isOnlineConnected(chid)){
95 ATH_MSG_DEBUG ( "cell chid: " << chid.get_compact() << " not connected channel, skip " );
96 //Set values for disconnected cells to 0
97 pcostheta[hs]=0.0;
98 psinthetacosphi[hs]=0.0;
99 psinthetasinphi[hs]=0.0;
100 pofflineTTid[hs]=0;
101 continue;
102 }
103 const Identifier id=cabling->cnvToIdentifier(chid);
104 const CaloDetDescrElement *caloDDE = theCaloDDM->get_element(id);
105 if(!caloDDE){
106 ATH_MSG_ERROR ( "Failed to return CaloDetDescrElement" );
107 return StatusCode::FAILURE;
108 }
109 ATH_MSG_DEBUG ( "hash, eta, phi: " << caloDDE->calo_hash() << ", " << caloDDE->eta() << ", " << caloDDE->phi() );
110
111 const float eta = caloDDE->eta();
112 const float phi = caloDDE->phi();
113 const float v = 1./cosh(eta); // sintheta
114 const float costheta=tanh(eta);
115 const float sinthetacosphi=v*cos(phi);
116 const float sinthetasinphi=v*sin(phi);
117
118 pcostheta[hs]=costheta;
119 psinthetacosphi[hs]=sinthetacosphi;
120 psinthetasinphi[hs]=sinthetasinphi;
121 pofflineTTid[hs]=m_ttService->whichTTID(id).get_identifier32().get_compact();
122 } // end loop over hash ids
123 }//end if FILL
124
125
126 if (m_dump) {
127
128 const AthenaAttributeList* attr=0;
129
130 ATH_CHECK( detStore()->retrieve(attr,m_key) );
131
132 const coral::Blob& costhetaBlob = (*attr)["costheta"].data<coral::Blob>();
133 const coral::Blob& sinthetacosphiBlob = (*attr)["sinthetacosphi"].data<coral::Blob>();
134 const coral::Blob& sinthetasinphiBlob = (*attr)["sinthetasinphi"].data<coral::Blob>();
135 const coral::Blob& offlineTTidBlob = (*attr)["offlineTTid"].data<coral::Blob>();
136
137 const float* pcostheta=static_cast<const float*>(costhetaBlob.startingAddress());
138 const float* psinthetacosphi=static_cast<const float*>(sinthetacosphiBlob.startingAddress());
139 const float* psinthetasinphi=static_cast<const float*>(sinthetasinphiBlob.startingAddress());
140 const uint32_t* pofflineTTid=static_cast<const uint32_t*>(offlineTTidBlob.startingAddress());
141
142
143 std::ostream *out = &(std::cout);
144 std::ofstream outfile;
145 if (m_outFileName.size()) {
146 outfile.open(m_outFileName.c_str(),std::ios::out);
147 if (outfile.is_open()) {
148 ATH_MSG_INFO ( "Writing to file " << m_outFileName );
149 out = &outfile;
150 }
151 else
152 ATH_MSG_ERROR ( "Failed to open file " << m_outFileName );
153 }
154
155 for (unsigned hs=0;hs<hashMax;++hs) {
156 const HWIdentifier chid=m_onlineID->channel_Id(hs);
157 (*out) << std::hex << chid.get_identifier32().get_compact() << std::dec << " "
158 << pcostheta[hs] << " " << psinthetacosphi[hs] << " " << psinthetasinphi[hs]
159 << " 0x"<< std::hex << pofflineTTid[hs] << std::dec << std::endl;
160 }
161
162
163 if (outfile.is_open())
164 outfile.close();
165 }// end if m_dump
166
167 return StatusCode::SUCCESS;
168}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(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 ServiceHandle< StoreGateSvc > & detStore() const
An AttributeList represents a logical row of attributes in a metadata table.
This class groups all DetDescr information related to a CaloCell.
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
This class provides the client interface for accessing the detector description information common to...
value_type get_compact() const
Get the compact id.
value_type get_compact() const
Get the compact id.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
LArGeoWeightsFill(const std::string &name, ISvcLocator *pSvcLocator)
ToolHandle< CaloTriggerTowerService > m_ttService
const LArOnlineID * m_onlineID
virtual StatusCode stop() override
std::string m_outFileName
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
virtual StatusCode initialize() override
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey