ATLAS Offline Software
PixelClusterRetriever.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "JiveXML/DataType.h"
7 
8 #include "CLHEP/Geometry/Point3D.h"
9 
11 
14 
16 
17 namespace JiveXML {
18 
25  PixelClusterRetriever::PixelClusterRetriever(const std::string& type,const std::string& name,const IInterface* parent):
27  {
28 
29  //Only declare the interface
30  declareInterface<IDataRetriever>(this);
31 
32  //And the properties
33  declareProperty("PixelClusters" , m_PixelClusterCollName = "PixelClusters");
34  declareProperty("PixelTruthMap" , m_PixelTruthMapName = "PRD_MultiTruthPixel");
35  }
36 
42 
43  return m_geo.retrieve();
44  }
45 
53  StatusCode PixelClusterRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
54 
55  //be verbose
56  ATH_MSG_DEBUG( "Retrieving " << dataTypeName() );
57 
59  const InDetDD::SiDetectorElementCollection* elements(*pixelDetEleHandle);
60  if (not pixelDetEleHandle.isValid() or elements==nullptr) {
61  ATH_MSG_FATAL(m_pixelDetEleCollKey.fullKey() << " is not available.");
62  return StatusCode::FAILURE;
63  }
64 
65  //Retrieve the cluster container
67  if (!SiClusterCont.isValid()) {
68  ATH_MSG_WARNING( "Could not retrieve SiClusterContainer with name " << m_PixelClusterCollName.key() );
69  return StatusCode::RECOVERABLE;
70  }
71 
72  //Retrieve the truth collection
74  if (m_usePixelTruthMap) {
75  simClusterMap = SG::makeHandle(m_PixelTruthMapName);
76  if (!simClusterMap.isValid()) {
77  //Just write out a warning if this fails
78  ATH_MSG_WARNING( "Could not retrieve PRD_MultiTruthCollection with name " << m_PixelTruthMapName.key() );
79  }
80  }
81 
82  //Loop over all collections in the container and count the clusters
83  unsigned long NClusterTotal = 0;
84  for (const auto SiClusterColl : * SiClusterCont)
85  NClusterTotal += SiClusterColl->size();
86 
87  //Now prepare the output data vectors
88  DataVect x0; x0.reserve(NClusterTotal);
89  DataVect y0; y0.reserve(NClusterTotal);
90  DataVect z0; z0.reserve(NClusterTotal);
91  DataVect widthx; widthx.reserve(NClusterTotal);
92  DataVect widthy; widthy.reserve(NClusterTotal);
93  DataVect eloss; eloss.reserve(NClusterTotal);
94  DataVect ident; ident.reserve(NClusterTotal);
95 
96  //Usually less than one track per cluster - so reserving one should be okay
97  DataVect numBarcodes; numBarcodes.reserve(NClusterTotal);
98  DataVect barcodes; barcodes.reserve(2*NClusterTotal);
99 
100  DataVect phiModule; phiModule.reserve(NClusterTotal);
101  DataVect etaModule; etaModule.reserve(NClusterTotal);
102 
103  //Loop over all cluster collections in the container
104  for (const auto SiClusterColl : * SiClusterCont) {
105 
106  //Only run on Pixel clusters
107  if ( ! m_geo->PixelIDHelper()->is_pixel(SiClusterColl->identify())) continue ;
108 
109  //Now loop over all clusters in that collection
110  for (const auto sicluster : * SiClusterColl) {
111 
112  //Get the cluster
113  const InDet::PixelCluster *cluster = dynamic_cast<const InDet::PixelCluster*>(sicluster);
114  if (not cluster) continue;
115  //and the detector element for that cluster via the id
116  Identifier id = m_geo->PixelIDHelper()->wafer_id(cluster->identify());
117  IdentifierHash wafer_hash = m_geo->PixelIDHelper()->wafer_hash(id);
118  const InDetDD::SiDetectorElement* element = elements->getDetectorElement(wafer_hash);
119  if (!element){
120  ATH_MSG_DEBUG( "Could not obtain Detector Element with ID " << id );
121  continue ;
122  }
123 
124  //Now store all the information we've obtained so far
125  x0.push_back(DataType(cluster->globalPosition().x() /10.));
126  y0.push_back(DataType(cluster->globalPosition().y() /10.));
127  z0.push_back(DataType(cluster->globalPosition().z() /10.));
128  widthx.push_back(DataType(cluster->width().phiR()/10.0));
129  widthy.push_back(DataType(cluster->width().z()/10.0));
130  eloss.push_back(DataType(cluster->energyLoss()));
131 
132  //Get the cluster id
133  Identifier clusterId = cluster->identify();
134  ident.push_back(DataType(clusterId.get_compact()));
135  phiModule.push_back(DataType(m_geo->PixelIDHelper()->phi_module(clusterId)));
136  etaModule.push_back(DataType(m_geo->PixelIDHelper()->eta_module(clusterId)));
137 
138  //Only process truth if its there
139  if ( !m_usePixelTruthMap || !simClusterMap.isValid() ) continue;
140 
141  // Count the number of associated truth particles, and store their barcodes
142  unsigned long countBarcodes=0;
143  using iter = PRD_MultiTruthCollection::const_iterator;
144  std::pair<iter,iter> range = simClusterMap->equal_range(clusterId);
145  for (iter i = range.first; i != range.second; ++i) {
146  ++countBarcodes;
147  barcodes.push_back(DataType(i->second.barcode()));
148  }
149  numBarcodes.push_back(DataType(countBarcodes));
150 
151  } // loop over clusters
152  } // loop over collections
153 
154 
155  //Now generate a DataMap for the output
157  dataMap["x0"] = x0;
158  dataMap["y0"] = y0;
159  dataMap["z0"] = z0;
160  dataMap["widthx"] = widthx;
161  dataMap["widthy"] = widthy;
162  dataMap["eloss"] = eloss;
163  dataMap["id"] = ident;
164  dataMap["phiModule"] = phiModule;
165  dataMap["etaModule"] = etaModule;
166 
167  //Only store truth association if we processed them
168  if ( numBarcodes.size() > 0 ){
169  //Add barcodes counter
170  dataMap["numBarcodes"] = numBarcodes;
171  //Calculate multiplicy for barcodes of truth tracks
172  std::string bctag = "barcodes multiple=\""+DataType(barcodes.size()/double(numBarcodes.size())).toString()+"\"";
173  dataMap[bctag] = barcodes;
174  }
175 
176  //Be verbose
177  ATH_MSG_DEBUG( " Retrieved " << dataTypeName() << ": " << x0.size() );
178 
179  //forward data to formating tool and return
180  return FormatTool->AddToEvent(dataTypeName(), "", &dataMap);
181  }
182 
183 }
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
DataType.h
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
PixelClusterRetriever.h
JiveXML::PixelClusterRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: PixelClusterRetriever.h:53
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
PixelCluster.h
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
JiveXML::DataVect
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition: DataType.h:58
DataType
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
Definition: RoIBResultByteStreamTool.cxx:25
JiveXML::PixelClusterRetriever::m_geo
const ToolHandle< IInDetGeoModelTool > m_geo
A tool handle to the geo model tool.
Definition: PixelClusterRetriever.h:62
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:206
JiveXML::PixelClusterRetriever::m_usePixelTruthMap
bool m_usePixelTruthMap
The StoreGate key for the PRD MultiTruthMap with the track associations.
Definition: PixelClusterRetriever.h:68
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:270
JiveXML::PixelClusterRetriever::m_PixelTruthMapName
SG::ReadHandleKey< PRD_MultiTruthCollection > m_PixelTruthMapName
Definition: PixelClusterRetriever.h:69
JiveXML::PixelClusterRetriever::m_pixelDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
Definition: PixelClusterRetriever.h:71
python.Dumpers.barcodes
def barcodes(beg, end, sz)
Definition: Dumpers.py:2800
lumiFormat.i
int i
Definition: lumiFormat.py:92
LArHistMerge_trf.dataMap
dataMap
Definition: LArHistMerge_trf.py:218
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
JiveXML::PixelClusterRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: PixelClusterRetriever.cxx:53
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
test_pyathena.parent
parent
Definition: test_pyathena.py:15
JiveXML::PixelClusterRetriever::initialize
virtual StatusCode initialize()
initialize only geo model tool
Definition: PixelClusterRetriever.cxx:37
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
SiLocalPosition.h
JiveXML::PixelClusterRetriever::PixelClusterRetriever
PixelClusterRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: PixelClusterRetriever.cxx:25
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
TRT::Hit::ident
@ ident
Definition: HitInfo.h:77
SiDetectorElement.h
InDet::PixelCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/PixelCluster.h:49
TRT::Hit::phiModule
@ phiModule
Definition: HitInfo.h:80
Identifier::get_compact
value_type get_compact(void) const
Get the compact id.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
AthAlgTool
Definition: AthAlgTool.h:26
IdentifierHash
Definition: IdentifierHash.h:38
JiveXML::PixelClusterRetriever::m_PixelClusterCollName
SG::ReadHandleKey< InDet::SiClusterContainer > m_PixelClusterCollName
The StoreGate key for the SiClusterCollection to retrieve.
Definition: PixelClusterRetriever.h:65
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15