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
47 const EventContext &ctx = Gaudi::Hive::currentContext();
49 if (!pixel_container.isValid())
50 {
51 ATH_MSG_ERROR( "Pixel Cluster container " << m_pixelsClustersKey.key() << " not found" );
52 return StatusCode::RECOVERABLE;
53 }
54 ATH_MSG_DEBUG( "Pixel Cluster container found: " << pixel_container->size() << " collections" );
56 const PixelChargeCalibCondData *calibData = *calibDataHandle;
57
58 int overflowIBLToT=0;
59 if(m_doIBL) {
60 overflowIBLToT = calibData->getFEI4OverflowToT();
61 }
62
63 typedef InDet::PixelClusterContainer::const_iterator ClusterIter;
64 ClusterIter itrCluster;
65 ClusterIter itrClubeg=pixel_container->begin();
66 ClusterIter itrCluend=pixel_container->end();
67 for( itrCluster=itrClubeg;itrCluster!=itrCluend;++itrCluster){
68 const InDet::PixelClusterCollection* ClusterCollection(*itrCluster);
69 if (!ClusterCollection) continue;
70 for(DataVector<InDet::PixelCluster>::const_iterator p_clus=ClusterCollection->begin(); p_clus!=ClusterCollection->end(); ++p_clus){
71 const InDet::PixelCluster* theCluster = *p_clus;
72 const std::vector<Identifier>& RDOs = theCluster->rdoList();
73 const std::vector<int>& ToTs = theCluster->totList();
74 const std::vector<float>& Charges = theCluster->chargeList();
75 auto theNonConstCluster = const_cast<InDet::PixelCluster*> (theCluster);
76 ATH_MSG_DEBUG( "cluster RDOs , size, ToTs, size, Charges, size "<< RDOs <<" "<<RDOs.size()<<" "<< ToTs<<" " <<ToTs.size()<<" "<<Charges<<" "<<Charges.size());
77
78 const InDetDD::SiDetectorElement* element=theCluster->detectorElement();
79 if (element==0) {
80 ATH_MSG_ERROR("Could not get detector element");
81 return StatusCode::FAILURE;
82 }
83 const AtlasDetectorID* aid = element->getIdHelper();
84 if (aid==0){
85 ATH_MSG_ERROR("Could not get ATLASDetectorID");
86 }
87 const PixelID* pixelIDp=dynamic_cast<const PixelID*>(aid);
88 if (!pixelIDp){
89 ATH_MSG_ERROR("Could not get PixelID pointer");
90 return StatusCode::FAILURE;
91 }
92 const PixelID& pixelID = *pixelIDp;
93
94 int nRDO=RDOs.size();
95 // convert from Charge -> ToT
96 if(ToTs.size()==0 && Charges.size()!=0){
97 // safety check in case proper conddb is not used and vector of charges is filled with zeros
98 auto biggest_charge = std::max_element(std::begin(Charges), std::end(Charges));
99 ATH_MSG_DEBUG( "Max element of Charges is " << *biggest_charge);
100 if(*biggest_charge==0.) return StatusCode::SUCCESS;
101 //
102 int sumToT = 0;
103 std::vector<int> totList;
104
105 for (int i=0; i<nRDO; i++) {
106 Identifier pixid=RDOs[i];
107 int Charge=Charges[i];
108
109 Identifier moduleID = pixelID.wafer_id(pixid);
110 IdentifierHash moduleHash = pixelID.wafer_hash(moduleID);
111 unsigned int FE = m_pixelReadout->getFE(pixid, moduleID);
112 InDetDD::PixelDiodeType type = m_pixelReadout->getDiodeType(pixid);
113 int totInt = calibData->getToT(type, moduleHash, FE, Charges[i]);
114
115 if( m_doIBL && pixelID.barrel_ec(pixid) == 0 && pixelID.layer_disk(pixid) == 0 ) {
116 int tot0 = totInt;
117 if ( totInt >= overflowIBLToT ) totInt = overflowIBLToT;
118 msg(MSG::DEBUG) << "barrel_ec = " << pixelID.barrel_ec(pixid) << " layer_disque = " << pixelID.layer_disk(pixid) << " ToT = " << tot0 << " Real ToT = " << totInt << endmsg;
119 }
120
121 totList.push_back( totInt ) ; // Fudge to make sure we round to the correct number
122 ATH_MSG_DEBUG( "from Charge --> ToT " << Charge <<" "<< totInt);
123 sumToT += totInt;
124 }
125 ATH_MSG_DEBUG( "sumToT " << sumToT);
126 theNonConstCluster->setToTList (std::move (totList));
127 }
128
129 }//loop over clusters
130
131 }//loop over collections
132
133
134 return StatusCode::SUCCESS;
135}
136
137// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
138
140 return StatusCode::SUCCESS;
141}
#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 with parameters:
MsgStream & msg() const
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
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)