ATLAS Offline Software
Loading...
Searching...
No Matches
sTgcPrepDataRetriever.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "MuonFullIDHelper.h"
14
15
16namespace JiveXML {
17
18 //--------------------------------------------------------------------------
19
20 sTgcPrepDataRetriever::sTgcPrepDataRetriever(const std::string& type,const std::string& name, const IInterface* parent):
21 AthAlgTool(type, name, parent)
22 {
23
24 declareInterface<IDataRetriever>(this);
25
26 }
27
28 //--------------------------------------------------------------------------
29
31
32 ATH_MSG_DEBUG("Initializing retriever for " << dataTypeName());
33 ATH_CHECK(m_sgKey.initialize());
34 ATH_CHECK( m_idHelperSvc.retrieve() );
35
36 return StatusCode::SUCCESS;
37 }
38
39 //--------------------------------------------------------------------------
40
41 StatusCode sTgcPrepDataRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
42
43 //be verbose
44 ATH_MSG_DEBUG("Retrieving " << dataTypeName());
45
47
48 int ndata = 0;
49 for (const auto stgcCollection : *stgcContainer){
50 ndata += stgcCollection->size();
51 }
52 //Make the vectors to contain the information and reserve space accordingly
53 DataVect x; x.reserve(ndata);
54 DataVect y; y.reserve(ndata);
55 DataVect z; z.reserve(ndata);
56 DataVect lengthVec; lengthVec.reserve(ndata);
57 DataVect swidthVec; swidthVec.reserve(ndata);
58 DataVect lwidthVec; lwidthVec.reserve(ndata);
59 DataVect idVec; idVec.reserve(ndata);
60 DataVect identifierVec; identifierVec.reserve(ndata);
61 DataVect barcode; barcode.reserve(ndata);
62
63 for (const auto stgcCollection : *stgcContainer){
64 for (const auto data : *stgcCollection){
65
66 const MuonGM::sTgcReadoutElement *element = data->detectorElement();
67 Identifier id = data->identify();
68
69 if (!element) {
70 ATH_MSG_WARNING("No MuonGM::sTgcReadoutElement for hit " << id);
71 continue;
72 }
73
74 Amg::Vector3D globalPos{Amg::Vector3D::Zero()};
75 Amg::Vector2D pos{Amg::Vector2D::Zero()};
76 double shortWidth=0, longWidth=0, length=0;
77 int channel = m_idHelperSvc->stgcIdHelper().channel(id);
78 const Trk::PlaneSurface surface = element->surface(id);
79 element->stripGlobalPosition(id, globalPos);
80 element->stripPosition(id, pos);
81
82 if (m_idHelperSvc->stgcIdHelper().channelType(id)==0) { // pad
83 length = element->channelPitch(id); // Height of a pad
84 std::array<Amg::Vector2D, 4> corners{make_array<Amg::Vector2D, 4>(Amg::Vector2D::Zero())};
85 element->padCorners(id, corners); // BotLeft, BotRight, TopLeft, TopRight
86 shortWidth = (corners.at(1)-corners.at(0)).norm();
87 longWidth = (corners.at(3)-corners.at(2)).norm();
88
89 } else if (m_idHelperSvc->stgcIdHelper().channelType(id)==1) { // strip
90 const MuonGM::MuonChannelDesign* design = element->getDesign(id);
91 length = design->channelLength(channel);
92 shortWidth = element->channelPitch(id); // Full pitch of strips
93 longWidth = shortWidth;
94
95 } else { // wire
96 const MuonGM::MuonChannelDesign* design = element->getDesign(id);
97 if(!design) {
98 ATH_MSG_WARNING("No wire design for hit " << id);
99 continue;
100 }
101
102 // recalculate length and globalPos for wires, because design->channelLength(channel) doesn't look sensible
103 double fulllength = design->xSize();
104 double locY = design->firstPos() + (channel-1) * design->inputPitch * design->groupWidth;
105 if (std::abs(locY) > 0.5 * design->minYSize()) { // triangle region
106 double dY = 0.5 * (design->maxYSize() - design->minYSize());
107 length = (0.5 * design->maxYSize() - std::abs(locY)) / dY * fulllength;
108 if (std::abs(locY) > 873) { // trapezoid region in the outter most part of the large sector
109 length += 0.5*fulllength;
110 }
111 element->surface(id).localToGlobal(Amg::Vector2D(pos.x(), pos.y()+0.5*(fulllength-length)), Amg::Vector3D::Zero(), globalPos);
112 }
113 else { // rectangular region
114 length = fulllength;
115 }
116
117 shortWidth = element->channelPitch(id); // Width of a full wire group
118 longWidth = shortWidth;
119 }
120
121 x.push_back(DataType(globalPos.x()/CLHEP::cm));
122 y.push_back(DataType(globalPos.y()/CLHEP::cm));
123 z.push_back(DataType(globalPos.z()/CLHEP::cm));
124 swidthVec.push_back(DataType(shortWidth/CLHEP::cm));
125 lwidthVec.push_back(DataType(longWidth/CLHEP::cm));
126 lengthVec.push_back(DataType(length/CLHEP::cm));
127 identifierVec.push_back(DataType(MuonFullIDHelper::getFullID(id, m_idHelperSvc->stgcIdHelper())));
128 idVec.push_back(DataType( id.get_compact() ));
129 barcode.push_back(DataType(0));
130
131 }
132 }
133
134 DataMap myDataMap;
135 myDataMap["x"] = x;
136 myDataMap["y"] = y;
137 myDataMap["z"] = z;
138 myDataMap["length"] = lengthVec;
139 myDataMap["swidth"] = swidthVec;
140 myDataMap["lwidth"] = lwidthVec;
141 myDataMap["identifier"] = identifierVec;
142 myDataMap["id"] = idVec;
143 myDataMap["barcode"] = barcode;
144
145 //Be verbose
146 ATH_MSG_DEBUG(dataTypeName() << ": "<< x.size());
147
148 //forward data to formating tool
149 // Atlantis can't deal with SGkey in xml output in CSCD (freezes)
150 // So not output SGKey for now. jpt 20Aug09
151 std::string emptyStr="";
152 return FormatTool->AddToEvent(dataTypeName(), m_sgKey.key(), &myDataMap);
153 }
154}
constexpr std::array< T, N > make_array(const T &def_val)
Helper function to initialize in-place arrays with non-zero values.
Definition ArrayHelper.h:10
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
double length(const pvec &v)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
#define y
#define x
#define z
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
SG::ReadHandleKey< Muon::sTgcPrepDataContainer > m_sgKey
The storegate key for the STGC collection.
virtual std::string dataTypeName() const
Return the name of the data type.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
StatusCode initialize()
Default AthAlgTool methods.
sTgcPrepDataRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
virtual const Trk::PlaneSurface & surface() const override
access to chamber surface (phi orientation), uses the first gas gap
An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station c...
virtual bool stripPosition(const Identifier &id, Amg::Vector2D &pos) const override final
strip position - should be renamed to channel position If the strip number is outside the range of va...
bool padCorners(const Identifier &id, std::array< Amg::Vector2D, 4 > &corners) const
pad corners
const MuonChannelDesign * getDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
double channelPitch(const Identifier &id) const
Channel pitch.
bool stripGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
Class for a planaer rectangular or trapezoidal surface in the ATLAS detector.
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const override final
Specified for PlaneSurface: LocalToGlobal method without dynamic memory allocation.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
std::string getFullID(Identifier id, const MdtIdHelper &mdtHelper)
Get the identifier string for an MDT ID with the sequence: Detector/StationName/StationEta/StationPhi...
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
double firstPos() const
Returns the position of the first strip along the x-axis.
double channelLength(int channel) const
STRIPS ONLY: calculate channel length for a given strip number.