ATLAS Offline Software
Loading...
Searching...
No Matches
PixelChargeToTConversion.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// conditions
12
13PixelChargeToTConversion::PixelChargeToTConversion(const std::string& name, ISvcLocator* pSvcLocator) :
14 AthAlgorithm(name, pSvcLocator)
15{
16}
17
18// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
19
21
22// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
23
25
26 ATH_MSG_INFO( "Initializing PixelChargeToTConversion" );
27
28 if (!m_IBLParameterSvc.empty()) {
29 if (m_IBLParameterSvc.retrieve().isFailure()) {
30 ATH_MSG_FATAL("Could not retrieve IBLParameterSvc");
31 return StatusCode::FAILURE;
32 } else
33 ATH_MSG_INFO("Retrieved service " << m_IBLParameterSvc);
34 }
35
36 m_doIBL = !m_IBLParameterSvc.empty() && m_IBLParameterSvc->containsIBL();
37
38 ATH_CHECK(m_pixelReadout.retrieve());
39 ATH_CHECK(m_chargeDataKey.initialize());
40 ATH_CHECK(m_pixelDetEleCollKey.initialize());
41 ATH_CHECK(m_pixelsClustersKey.initialize());
42
43 return StatusCode::SUCCESS;
44}
45
46StatusCode PixelChargeToTConversion::execute(const EventContext& ctx){
48 if (!pixel_container.isValid())
49 {
50 ATH_MSG_ERROR( "Pixel Cluster container " << m_pixelsClustersKey.key() << " not found" );
51 return StatusCode::RECOVERABLE;
52 }
53 ATH_MSG_DEBUG( "Pixel Cluster container found: " << pixel_container->size() << " collections" );
55 const PixelChargeCalibCondData *calibData = *calibDataHandle;
56
57 int overflowIBLToT=0;
58 if(m_doIBL) {
59 overflowIBLToT = calibData->getFEI4OverflowToT();
60 }
61
62 typedef InDet::PixelClusterContainer::const_iterator ClusterIter;
63 ClusterIter itrCluster;
64 ClusterIter itrClubeg=pixel_container->begin();
65 ClusterIter itrCluend=pixel_container->end();
66 for( itrCluster=itrClubeg;itrCluster!=itrCluend;++itrCluster){
67 const InDet::PixelClusterCollection* ClusterCollection(*itrCluster);
68 if (!ClusterCollection) continue;
69 for(DataVector<InDet::PixelCluster>::const_iterator p_clus=ClusterCollection->begin(); p_clus!=ClusterCollection->end(); ++p_clus){
70 const InDet::PixelCluster* theCluster = *p_clus;
71 const std::vector<Identifier>& RDOs = theCluster->rdoList();
72 const std::vector<int>& ToTs = theCluster->totList();
73 const std::vector<float>& Charges = theCluster->chargeList();
74 auto theNonConstCluster = const_cast<InDet::PixelCluster*> (theCluster);
75 ATH_MSG_DEBUG( "cluster RDOs , size, ToTs, size, Charges, size "<< RDOs <<" "<<RDOs.size()<<" "<< ToTs<<" " <<ToTs.size()<<" "<<Charges<<" "<<Charges.size());
76
77 const InDetDD::SiDetectorElement* element=theCluster->detectorElement();
78 if (element==0) {
79 ATH_MSG_ERROR("Could not get detector element");
80 return StatusCode::FAILURE;
81 }
82 const AtlasDetectorID* aid = element->getIdHelper();
83 if (aid==0){
84 ATH_MSG_ERROR("Could not get ATLASDetectorID");
85 }
86 const PixelID* pixelIDp=dynamic_cast<const PixelID*>(aid);
87 if (!pixelIDp){
88 ATH_MSG_ERROR("Could not get PixelID pointer");
89 return StatusCode::FAILURE;
90 }
91 const PixelID& pixelID = *pixelIDp;
92
93 int nRDO=RDOs.size();
94 // convert from Charge -> ToT
95 if(ToTs.size()==0 && Charges.size()!=0){
96 // safety check in case proper conddb is not used and vector of charges is filled with zeros
97 auto biggest_charge = std::max_element(std::begin(Charges), std::end(Charges));
98 ATH_MSG_DEBUG( "Max element of Charges is " << *biggest_charge);
99 if(*biggest_charge==0.) return StatusCode::SUCCESS;
100 //
101 int sumToT = 0;
102 std::vector<int> totList;
103
104 for (int i=0; i<nRDO; i++) {
105 Identifier pixid=RDOs[i];
106 int Charge=Charges[i];
107
108 Identifier moduleID = pixelID.wafer_id(pixid);
109 IdentifierHash moduleHash = pixelID.wafer_hash(moduleID);
110 unsigned int FE = m_pixelReadout->getFE(pixid, moduleID);
111 InDetDD::PixelDiodeType type = m_pixelReadout->getDiodeType(pixid);
112 int totInt = calibData->getToT(type, moduleHash, FE, Charges[i]);
113
114 if( m_doIBL && pixelID.barrel_ec(pixid) == 0 && pixelID.layer_disk(pixid) == 0 ) {
115 int tot0 = totInt;
116 if ( totInt >= overflowIBLToT ) totInt = overflowIBLToT;
117 msg(MSG::DEBUG) << "barrel_ec = " << pixelID.barrel_ec(pixid) << " layer_disque = " << pixelID.layer_disk(pixid) << " ToT = " << tot0 << " Real ToT = " << totInt << endmsg;
118 }
119
120 totList.push_back( totInt ) ; // Fudge to make sure we round to the correct number
121 ATH_MSG_DEBUG( "from Charge --> ToT " << Charge <<" "<< totInt);
122 sumToT += totInt;
123 }
124 ATH_MSG_DEBUG( "sumToT " << sumToT);
125 theNonConstCluster->setToTList (std::move (totList));
126 }
127
128 }//loop over clusters
129
130 }//loop over collections
131
132
133 return StatusCode::SUCCESS;
134}
135
136// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
137
139 return StatusCode::SUCCESS;
140}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
This is an Identifier helper class for the Pixel subdetector.
Define macros for attributes used to control the static checker.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
This is a "hash" representation of an Identifier.
Class to hold geometrical description of a silicon detector element.
const AtlasDetectorID * getIdHelper() const
Returns the id helper (inline).
virtual const InDetDD::SiDetectorElement * detectorElement() const override final
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
constexpr int getFEI4OverflowToT() const
float getToT(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE, float Q) const
ServiceHandle< InDetDD::IPixelReadoutManager > m_pixelReadout
SG::ReadHandleKey< InDet::PixelClusterContainer > m_pixelsClustersKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
ServiceHandle< IIBLParameterSvc > m_IBLParameterSvc
SG::ReadCondHandleKey< PixelChargeCalibCondData > m_chargeDataKey
StatusCode execute(const EventContext &ctx)
Execute method.
PixelChargeToTConversion(const std::string &name, ISvcLocator *pSvcLocator)
This is an Identifier helper class for the Pixel subdetector.
Definition PixelID.h:69
int layer_disk(const Identifier &id) const
Definition PixelID.h:602
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition PixelID.h:355
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0).
Definition PixelID.h:595
IdentifierHash wafer_hash(Identifier wafer_id) const
wafer hash from id
Definition PixelID.h:378
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)