ATLAS Offline Software
Loading...
Searching...
No Matches
SiClusterRetriever.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
8#include "JiveXML/DataType.h"
9
10#include "CLHEP/Geometry/Point3D.h"
11
12
15
17
18namespace JiveXML {
19
26 SiClusterRetriever::SiClusterRetriever(const std::string& type,const std::string& name,const IInterface* parent):
27 AthAlgTool(type,name,parent)
28 {
29
30 //Only declare the interface
31 declareInterface<IDataRetriever>(this);
32
33 //And the properties
34 declareProperty("SCTClusters" , m_SiClusterCollName = "SCT_Clusters", "Collection name of SiClusterContainer for SCT");
35 declareProperty("SCT_TruthMap" , m_SiTruthMapName = "PRD_MultiTruthSCT", "Collection name of PRD_MultiTruthCollection> for SCT");
36 }
37
45 StatusCode SiClusterRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
46
47 //be verbose
48 ATH_MSG_DEBUG( "Retrieving " << dataTypeName() );
49
50 // Get SCT_DetectorElementCollection
52 const InDetDD::SiDetectorElementCollection* elements(sctDetEle.retrieve());
53 if (elements==nullptr) {
54 ATH_MSG_FATAL(m_SCTDetEleCollKey.fullKey() << " could not be retrieved");
55 return StatusCode::FAILURE;
56 }
57
58 //Retrieve the cluster container
60 if (!SiClusterCont.isValid()) {
61 ATH_MSG_DEBUG( "Could not retrieve SiClusterContainer with name " << m_SiClusterCollName.key() );
62 return StatusCode::RECOVERABLE;
63 }
64
65 //Retrieve the truth collection
67 if (m_useSiTruthMap) {
68 simClusterMap = SG::makeHandle(m_SiTruthMapName);
69 if (!simClusterMap.isValid()) {
70 //Just write out a warning if this fails
71 ATH_MSG_DEBUG( "Could not retrieve PRD_MultiTruthCollection with name " << m_SiTruthMapName.key() );
72 }
73 }
74
75 //Loop over all collections in the container and count the clusters
76 unsigned long NClusterTotal = 0;
77 for (const auto SiClusterColl : *SiClusterCont.cptr())
78 NClusterTotal += SiClusterColl->size();
79
80 //Now prepare the output data vectors
81 DataVect x0; x0.reserve(NClusterTotal);
82 DataVect y0; y0.reserve(NClusterTotal);
83 DataVect z0; z0.reserve(NClusterTotal);
84 DataVect x1; x1.reserve(NClusterTotal);
85 DataVect y1; y1.reserve(NClusterTotal);
86 DataVect z1; z1.reserve(NClusterTotal);
87 DataVect width; width.reserve(NClusterTotal);
88 DataVect ident; ident.reserve(NClusterTotal);
89
90 //Usually less than one track per cluster - so reserving one should be okay
91 DataVect numBarcodes; numBarcodes.reserve(NClusterTotal);
92 DataVect barcodes; barcodes.reserve(NClusterTotal);
93
94 DataVect phiModule; phiModule.reserve(NClusterTotal);
95 DataVect etaModule; etaModule.reserve(NClusterTotal);
96 DataVect side; side.reserve(NClusterTotal);
97
98 //Loop over all cluster collections in the container
99 for (const auto SiClusterColl : *SiClusterCont.cptr()){
100
101 //Only run on silicon (SCT) clusters
102 if ( ! m_geo->SCTIDHelper()->is_sct(SiClusterColl->identify())) continue ;
103
104 const IdentifierHash waferHash = SiClusterColl->identifyHash();
105
106 //Now loop over all clusters in that collection
107 for (const auto cluster : *SiClusterColl){
108
109 //and the detector element for that cluster via the id
110 Identifier id = m_geo->SCTIDHelper()->wafer_id(cluster->identify());
111 const InDetDD::SiDetectorElement* element = elements->getDetectorElement(waferHash);
112 if (!element){
113 ATH_MSG_DEBUG( "Could not obtain Detector Element with ID " << id );
114 continue ;
115 }
116
117 //Get the local position of the cluster
118 InDetDD::SiLocalPosition pos = element->localPosition(cluster->globalPosition());
119 std::pair<Amg::Vector3D, Amg::Vector3D > ends = element->endsOfStrip(pos);
120
121 Amg::Vector3D a = ends.first; // Top end, first cluster
122 Amg::Vector3D b = ends.second; // Bottom end, first cluster
123
124 //Now store all the infromation we've obtained so far
125 x0.push_back(DataType(a.x() /10.));
126 y0.push_back(DataType(a.y() /10.));
127 z0.push_back(DataType(a.z() /10.));
128 x1.push_back(DataType(b.x() /10.));
129 y1.push_back(DataType(b.y() /10.));
130 z1.push_back(DataType(b.z() /10.));
131 width.push_back(DataType(cluster->width().phiR()/20.0));
132
133 //Get the cluster id
134 Identifier clusterId = cluster->identify();
135 ident.push_back(DataType(clusterId.get_compact()));
136 phiModule.push_back(DataType(m_geo->SCTIDHelper()->phi_module(clusterId)));
137 etaModule.push_back(DataType(m_geo->SCTIDHelper()->eta_module(clusterId)));
138 side.push_back(DataType(m_geo->SCTIDHelper()->side(clusterId)));
139
140 //Only process truth if its there
141 if ( !m_useSiTruthMap || !simClusterMap.isValid() ) continue;
142
143 // Count the number of associated truth particles, and store their barcodes
144 unsigned long countBarcodes=0;
145 using iter = PRD_MultiTruthCollection::const_iterator;
146 std::pair<iter,iter> range = simClusterMap->equal_range(clusterId);
147 for (iter i = range.first; i != range.second; ++i) {
148 ++countBarcodes;
149 barcodes.push_back(DataType(i->second.barcode()));
150 }
151 numBarcodes.push_back(DataType(countBarcodes));
152
153 } // loop over clusters
154 } // loop over collections
155
156
157 //Now generate a DataMap for the output
158 DataMap dataMap;
159 dataMap["x0"] = x0;
160 dataMap["y0"] = y0;
161 dataMap["z0"] = z0;
162 dataMap["x1"] = x1;
163 dataMap["y1"] = y1;
164 dataMap["z1"] = z1;
165 dataMap["width"] = width;
166 dataMap["id"] = ident;
167 dataMap["phiModule"] = phiModule;
168 dataMap["etaModule"] = etaModule;
169 dataMap["side"] = side;
170
171 //Only store truth association if we processed them
172 if ( numBarcodes.size() > 0 ){
173 //Add barcodes counter
174 dataMap["numBarcodes"] = numBarcodes;
175 //Calculate multiplicy for barcodes of truth tracks
176 std::string bctag = "barcodes multiple=\""+DataType(barcodes.size()/double(numBarcodes.size())).toString()+"\"";
177 dataMap[bctag] = barcodes;
178 }
179
180 //Be verbose
181 ATH_MSG_DEBUG( " Retrieved " << dataTypeName() << ": " << x0.size() );
182
183 //forward data to formating tool and return
184 return FormatTool->AddToEvent(dataTypeName(), "", &dataMap);
185 }
186
188 ATH_CHECK(m_SCTDetEleCollKey.initialize());
189 ATH_CHECK(m_SiClusterCollName.initialize());
190 m_useSiTruthMap = !m_SiTruthMapName.key().empty();
192
193 return m_geo.retrieve();
194 }
195}
196
197
198
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_DEBUG(x)
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
defines an "iterator" over instances of a given type in StoreGateSvc
static Double_t a
This is an Identifier helper class for the SCT subdetector.
const double width
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
This is a "hash" representation of an Identifier.
value_type get_compact() const
Get the compact id.
Class to hold the SiDetectorElement objects to be put in the detector store.
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Class to hold geometrical description of a silicon detector element.
std::pair< Amg::Vector3D, Amg::Vector3D > endsOfStrip(const Amg::Vector2D &position) const
Special method for SCT to retrieve the two ends of a "strip" Returned coordinates are in global frame...
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
Amg::Vector2D localPosition(const HepGeom::Point3D< double > &globalPosition) const
transform a global position into a 2D local position (reconstruction frame) (inline)
SG::ReadHandleKey< InDet::SiClusterContainer > m_SiClusterCollName
StoreGate key for the SiClusterContainer for SCT.
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
Condition object key of SiDetectorElementCollection for SCT.
SiClusterRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
virtual StatusCode initialize()
initialize
bool m_useSiTruthMap
StoreGate key for the PRD_MultiTruthCollection for SCT.
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
const ToolHandle< IInDetGeoModelTool > m_geo
A tool handle to the geo model tool.
virtual std::string dataTypeName() const
Return the name of the data type.
SG::ReadHandleKey< PRD_MultiTruthCollection > m_SiTruthMapName
const_pointer_type retrieve()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
Eigen::Matrix< double, 3, 1 > Vector3D
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
std::map< std::string, DataVect > DataMap
Definition DataType.h:59
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition DataType.h:58
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())