ATLAS Offline Software
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"
12 #include "CxxUtils/ArrayHelper.h"
14 
15 
16 namespace JiveXML {
17 
18  //--------------------------------------------------------------------------
19 
20  sTgcPrepDataRetriever::sTgcPrepDataRetriever(const std::string& type,const std::string& name, const IInterface* 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()};
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 }
MuonGM::sTgcReadoutElement::padCorners
bool padCorners(const Identifier &id, std::array< Amg::Vector2D, 4 > &corners) const
pad corners
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:358
JiveXML::sTgcPrepDataRetriever::initialize
StatusCode initialize()
Default AthAlgTool methods.
Definition: sTgcPrepDataRetriever.cxx:30
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
MuonGM::MuonChannelDesign::inputPitch
double inputPitch
Definition: MuonChannelDesign.h:35
PlotCalibFromCool.norm
norm
Definition: PlotCalibFromCool.py:100
MuonGM::MuonChannelDesign::firstPos
double firstPos() const
Returns the position of the first strip along the x-axis.
Definition: MuonChannelDesign.h:481
MuonGM::MuonChannelDesign::xSize
double xSize() const
Definition: MuonChannelDesign.h:478
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:24
sTgcPrepDataRetriever.h
Trk::locY
@ locY
local cartesian
Definition: ParamDefs.h:38
MuonGM::MuonChannelDesign::groupWidth
double groupWidth
Definition: MuonChannelDesign.h:39
sTgcReadoutElement.h
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
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::sTgcPrepDataRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: sTgcPrepDataRetriever.cxx:41
MuonGM::sTgcReadoutElement::getDesign
const MuonChannelDesign * getDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:279
MuonPrepDataContainer.h
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
x
#define x
MuonGM::MuonClusterReadoutElement::surface
virtual const Trk::PlaneSurface & surface() const override
access to chamber surface (phi orientation), uses the first gas gap
Definition: MuonClusterReadoutElement.h:123
MuonGM::sTgcReadoutElement::stripPosition
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...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:321
JiveXML::sTgcPrepDataRetriever::m_sgKey
SG::ReadHandleKey< Muon::sTgcPrepDataContainer > m_sgKey
The storegate key for the STGC collection.
Definition: sTgcPrepDataRetriever.h:40
JiveXML::sTgcPrepDataRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: sTgcPrepDataRetriever.h:32
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
GeoPrimitives.h
MuonGM::MuonChannelDesign::minYSize
double minYSize() const
Definition: MuonChannelDesign.h:480
z
#define z
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
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
MuonGM::sTgcReadoutElement
An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station c...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:30
JiveXML::sTgcPrepDataRetriever::sTgcPrepDataRetriever
sTgcPrepDataRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: sTgcPrepDataRetriever.cxx:20
ArrayHelper.h
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonGM::sTgcReadoutElement::channelPitch
double channelPitch(const Identifier &id) const
Channel pitch.
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:578
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:22
MuonPadDesign.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
MuonGM::sTgcReadoutElement::stripGlobalPosition
bool stripGlobalPosition(const Identifier &id, Amg::Vector3D &gpos) const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:332
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
JiveXML::MuonFullIDHelper::getFullID
std::string getFullID(Identifier id, const MdtIdHelper &mdtHelper)
Get the identifier string for an MDT ID with the sequence: Detector/StationName/StationEta/StationPhi...
Definition: MuonFullIDHelper.cxx:26
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
MuonGM::MuonChannelDesign::channelLength
double channelLength(int channel) const
STRIPS ONLY: calculate channel length for a given strip number.
Definition: MuonChannelDesign.h:391
MuonChannelDesign.h
MuonGM::MuonChannelDesign
Definition: MuonChannelDesign.h:24
y
#define y
MuonGM::MuonChannelDesign::maxYSize
double maxYSize() const
Definition: MuonChannelDesign.h:479
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Trk::PlaneSurface
Definition: PlaneSurface.h:64
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
JiveXML::sTgcPrepDataRetriever::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: sTgcPrepDataRetriever.h:42
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
MuonFullIDHelper.h
AthAlgTool
Definition: AthAlgTool.h:26
Trk::PlaneSurface::localToGlobal
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.
Definition: PlaneSurface.cxx:204
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
Identifier
Definition: IdentifierFieldParser.cxx:14