ATLAS Offline Software
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 
5 #include "SiClusterRetriever.h"
6 #include "StoreGate/DataHandle.h"
8 #include "JiveXML/DataType.h"
9 
10 #include "CLHEP/Geometry/Point3D.h"
11 
12 
15 
16 #include "InDetIdentifier/SCT_ID.h"
17 
18 namespace JiveXML {
19 
26  SiClusterRetriever::SiClusterRetriever(const std::string& type,const std::string& name,const IInterface* 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
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 
190  m_useSiTruthMap = !m_SiTruthMapName.key().empty();
192 
193  return m_geo.retrieve();
194  }
195 }
196 
197 
198 
DataType.h
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
JiveXML::SiClusterRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: SiClusterRetriever.h:53
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
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
JiveXML::SiClusterRetriever::m_SCTDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
Condition object key of SiDetectorElementCollection for SCT.
Definition: SiClusterRetriever.h:65
DataType
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
Definition: RoIBResultByteStreamTool.cxx:25
Identifier::get_compact
value_type get_compact() const
Get the compact id.
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
DataHandle.h
ReadCondHandle.h
makeTRTBarrelCans.y1
tuple y1
Definition: makeTRTBarrelCans.py:15
TRT::Hit::side
@ side
Definition: HitInfo.h:83
InDetDD::SiLocalPosition
Definition: SiLocalPosition.h:31
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:270
JiveXML::SiClusterRetriever::SiClusterRetriever
SiClusterRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: SiClusterRetriever.cxx:26
SG::ReadCondHandle::retrieve
const_pointer_type retrieve()
Definition: ReadCondHandle.h:162
python.Dumpers.barcodes
def barcodes(beg, end, sz)
Definition: Dumpers.py:2800
lumiFormat.i
int i
Definition: lumiFormat.py:85
JiveXML::SiClusterRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: SiClusterRetriever.cxx:45
LArHistMerge_trf.dataMap
dataMap
Definition: LArHistMerge_trf.py:218
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
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
JiveXML::SiClusterRetriever::m_geo
const ToolHandle< IInDetGeoModelTool > m_geo
A tool handle to the geo model tool.
Definition: SiClusterRetriever.h:62
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
JiveXML::SiClusterRetriever::m_SiClusterCollName
SG::ReadHandleKey< InDet::SiClusterContainer > m_SiClusterCollName
StoreGate key for the SiClusterContainer for SCT.
Definition: SiClusterRetriever.h:68
SiLocalPosition.h
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:22
InDetDD::SiDetectorElement::endsOfStrip
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...
Definition: SiDetectorElement.cxx:339
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
SiClusterRetriever.h
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
TRT::Hit::ident
@ ident
Definition: HitInfo.h:77
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
SiDetectorElement.h
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
a
TList * a
Definition: liststreamerinfos.cxx:10
JiveXML::SiClusterRetriever::initialize
virtual StatusCode initialize()
initialize
Definition: SiClusterRetriever.cxx:187
TRT::Hit::phiModule
@ phiModule
Definition: HitInfo.h:80
Base_Fragment.width
width
Definition: Sherpa_i/share/common/Base_Fragment.py:59
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
JiveXML::SiClusterRetriever::m_SiTruthMapName
SG::ReadHandleKey< PRD_MultiTruthCollection > m_SiTruthMapName
Definition: SiClusterRetriever.h:72
InDetDD::SolidStateDetectorElementBase::localPosition
Amg::Vector2D localPosition(const HepGeom::Point3D< double > &globalPosition) const
transform a global position into a 2D local position (reconstruction frame) (inline)
AthAlgTool
Definition: AthAlgTool.h:26
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
JiveXML::SiClusterRetriever::m_useSiTruthMap
bool m_useSiTruthMap
StoreGate key for the PRD_MultiTruthCollection for SCT.
Definition: SiClusterRetriever.h:71
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15
Identifier
Definition: IdentifierFieldParser.cxx:14