 |
ATLAS Offline Software
|
Go to the documentation of this file.
9 #include "GaudiKernel/SystemOfUnits.h"
23 std::stringstream sstr{};
24 sstr <<
"[x,y,z]=(" <<
v.x() <<
"," <<
v.y() <<
"," <<
v.z()
26 <<
v.eta() <<
"," <<
v.phi() <<
")";
37 return StatusCode::FAILURE;
44 std::unique_ptr<TGraph>&
graph = id_graph.second;
49 const int lay = is_mm ? mm_helper.
gasGap(
id) : st_helper.
gasGap(
id);
50 const std::string ch_name =
56 TDirectory*
dir =
out_file->GetDirectory(
"SinglePads");
57 dir->WriteObject(
graph.get(), ch_name.c_str());
59 const int signed_lay =
layerId(
id);
60 std::unique_ptr<TGraph>& lay_graph =
m_nswLayers[signed_lay];
63 std::string lay_name = std::string{is_mm ?
"MMG" :
"STG"} +
"W" +
66 out_file->WriteObject(lay_graph.get(), lay_name.c_str());
73 dir->WriteObject(active_area.get(), lay_name.c_str());
76 return StatusCode::SUCCESS;
83 return StatusCode::SUCCESS;
87 return StatusCode::SUCCESS;
88 ATH_MSG_INFO(
"Executing NSWGeoPlottingAlg for the first time");
89 const EventContext& ctx = Gaudi::Hive::currentContext();
97 std::unique_ptr<TGraph>& pad_graph = id_graph.second;
99 const int signed_lay =
layerId(
id);
100 std::unique_ptr<TGraph>& wheel_graph =
m_nswLayers[signed_lay];
103 is_mm ? detMgr->getMMReadoutElement(
id) :
nullptr;
105 is_mm ? nullptr : detMgr->getsTgcReadoutElement(
id);
113 auto fill_graphs = [&](
const Amg::Vector2D& locPos,
int strip) {
114 if ((is_mm || std::abs(locPos.y()) < 1.
e-3) &&
116 ATH_MSG_ALWAYS(
" Backmapping of the strip number did not work for "
118 << locPos.x() <<
" " << locPos.y() <<
" "
127 pad_graph->SetPoint(pad_graph->GetN(), globPos.x(), globPos.y());
129 wheel_graph->SetPoint(wheel_graph->GetN(), globPos.x(), globPos.y());
156 strip <= n_strips; strip += 1) {
159 if (design->
leftEdge(strip, locPos) && !fill_graphs(locPos, strip))
161 <<
" does not have strip "
162 << strip <<
"... Why?");
166 if (design->
center(strip, locPos) && !fill_graphs(locPos, strip))
168 <<
" does not have strip " << strip
173 if (design->
rightEdge(strip, locPos) && !fill_graphs(locPos, strip))
175 <<
" does not have strip "
176 << strip <<
"... Why?");
179 auto uv_intersects = [&]() {
182 return StatusCode::SUCCESS;
185 if ((ml == 1 &&
gap == 2) || (ml == 2 &&
gap == 4))
186 return StatusCode::SUCCESS;
189 strip <= n_strips; strip += 1) {
190 const int u_gap = ml == 1 ? 3 : 1;
191 const int v_gap = ml == 1 ? 4 : 2;
202 global_points(x_id, x_left, x_center, x_right);
203 global_points(u_id, u_left, u_center, u_right);
204 global_points(v_id, v_left, v_center, v_right);
210 std::optional<double> uv_isect =
211 Amg::intersect<3>(v_center, v_dir, u_center, u_dir);
214 ATH_MSG_ERROR(
"Failed to intersect the uv strips for identifiers "
220 return StatusCode::FAILURE;
222 const Amg::Vector3D uv_ipoint = u_center + (*uv_isect) * u_dir;
223 const Amg::Vector2D cen_diff = (uv_ipoint - x_center).block<2, 1>(0, 0);
224 if (cen_diff.dot(cen_diff) > std::numeric_limits<float>::epsilon()) {
231 <<
" intersect at the center of the corresponding x "
232 "strip. But they don't. "
235 <<
" vs." << std::endl
241 std::optional<double> ux_isect =
242 Amg::intersect<3>(u_center, u_dir, x_center, x_dir);
244 ATH_MSG_ERROR(
"Failed to intersect the ux strips for identifiers "
250 return StatusCode::FAILURE;
253 <<
to_string(x_center + (*ux_isect) * x_dir) <<
" "
256 std::optional<double> vx_isect =
257 Amg::intersect<3>(v_center, v_dir, x_center, x_dir);
259 ATH_MSG_ERROR(
"Failed to intersect the vx strips for identifiers "
265 return StatusCode::FAILURE;
268 <<
to_string(x_center + (*vx_isect) * x_dir) <<
" "
271 return StatusCode::SUCCESS;
277 if (!surface_histo) {
285 for (
double x = surf_cent.x() -
d;
x <= surf_cent.x() +
d;
x += 1) {
286 for (
double y = surf_cent.y() -
d;
y <= surf_cent.y() +
d;
y += 1) {
295 surface_histo->Fill(
x,
y);
301 return StatusCode::SUCCESS;
307 for (
const std::string station : {
"MML",
"MMS"}) {
310 for (
int eta = -2; eta <= 2; ++eta) {
314 bool is_valid{
false};
323 for (
int i_layer = 1; i_layer <= 4; ++i_layer) {
325 id_helper.
channelID(module_id, ml, i_layer, 10);
328 int signed_layer =
layerId(
id);
330 m_nswLayers[signed_layer] = std::make_unique<TGraph>();
335 "ActiveNSW;x [mm]; y [mm]", 1000, -5001, 5001., 1000,
343 return StatusCode::SUCCESS;
350 int lay = id_helper.
gasGap(
id);
352 return (8 * (
type == sTgcIdHelper::sTgcChannelTypes::Strip) + 4 * (ml - 1) +
359 int lay = id_helper.
gasGap(
id);
360 return (16 + 4 * (ml - 1) + (lay - 1)) * (eta > 0 ? 1 : -1);
368 for (
const std::string station : {
"STS",
"STL"}) {
377 bool is_valid{
false};
379 id_helper.
elementID(station, eta, phi, is_valid);
383 if (!detMgr->getsTgcReadoutElement(module_id))
385 for (
int lay = 1; lay <= 4; ++lay) {
387 module_id, ml, lay, sTgcIdHelper::sTgcChannelTypes::Strip, 10);
389 module_id, ml, lay, sTgcIdHelper::sTgcChannelTypes::Wire, 10);
390 for (
const Identifier&
id : {strip_id, wire_id}) {
392 int signed_layer =
layerId(
id);
394 m_nswLayers[signed_layer] = std::make_unique<TGraph>();
399 "ActiveNSW;x [mm]; y [mm]", 1000, -5001, 5001., 1000,
408 return StatusCode::SUCCESS;
def retrieve(aClass, aKey=None)
Gaudi::Property< std::string > m_outFile
StatusCode initMicroMega()
int multilayer(const Identifier &id) const
static int stationPhiMin()
StatusCode finalize() override
Ensure that the Athena extensions are properly loaded.
bool insideActiveBounds(const Identifier &id, const Amg::Vector2D &locpos, double tol1=0., double tol2=0.) const
boundary check Wrapper Trk::PlaneSurface::insideBounds() taking into account the passivated width
static int stationPhiMax()
virtual int numberOfStrips(const Identifier &layerId) const override final
number of strips per layer
static int stationPhiMin()
int channelNumber(const Amg::Vector2D &pos) const
calculate local channel number, range 1=nstrips like identifiers. Returns -1 if out of range
Eigen::Matrix< double, 2, 1 > Vector2D
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const
const MuonChannelDesign * getDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
const MuonChannelDesign * getDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
static int multilayerMin()
TGraph * graph(const std::string &graphName, const std::string &tDir="", const std::string &stream="")
Simplify the retrieval of registered TGraphs.
def gap(flags, cells_name, *args, **kw)
double hasStereoAngle() const
returns whether the stereo angle is non-zero
virtual const Trk::PlaneSurface & surface() const override
access to chamber surface (phi orientation), uses the first gas gap
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
int multilayer(const Identifier &id) const
virtual bool insideBounds(const Amg::Vector2D &locpos, double tol1=0., double tol2=0.) const override
This method calls the inside() method of the Bounds.
Identifier multilayerID(const Identifier &channeldID) const
static int stationEtaMin()
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
static int stationPhiMax()
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
::StatusCode StatusCode
StatusCode definition for legacy code.
An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station c...
int gasGap(const Identifier &id) const override
get the hashes
static int multilayerMax()
virtual const Surface & surface() const =0
Return surface associated with this detector element.
#define ATH_MSG_ALWAYS(x)
StatusCode execute() override
static int stationEtaMax()
std::map< Identifier, std::unique_ptr< TGraph > > m_nswPads
Map containing each PCB of the NSW seperately.
const std::string & stationNameString(const int &index) const
bool center(int channel, Amg::Vector2D &pos) const
STRIPS ONLY: Returns the center on the strip.
Identifier elementID(int stationName, int stationEta, int stationPhi) const
static int multilayerMax()
virtual int numberOfStrips(const Identifier &layerId) const override final
number of strips per layer
std::string to_string(const DetectorType &type)
std::map< int, std::unique_ptr< TH1 > > m_nswActiveAreas
Map showing the active areas of the NSW to show the passivation.
StatusCode initialize(bool used=true)
Eigen::Matrix< double, 3, 1 > Vector3D
Identifier elementID(int stationName, int stationEta, int stationPhi) const
bool rightEdge(int channel, Amg::Vector2D &pos) const
STRIPS ONLY: Returns the right edge of the strip.
int channel(const Identifier &id) const override
int gasGap(const Identifier &id) const override
get the hashes
virtual bool globalToLocal(const Amg::Vector3D &glob, const Amg::Vector3D &mom, Amg::Vector2D &loc) const =0
Specified by each surface type: GlobalToLocal method without dynamic memory allocation - boolean chec...
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
#define ATH_MSG_WARNING(x)
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
An MMReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station con...
Identifier multilayerID(const Identifier &channeldID) const
int numberOfMissingBottomStrips() const
Returns the number of missing bottom strips.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
std::map< int, std::unique_ptr< TGraph > > m_nswLayers
Map showing the edges of the 16 layers of the NSW.
int layerId(const Identifier &id) const
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channel) const
int channelType(const Identifier &id) const
virtual const Amg::Vector3D & center() const =0
Return the center of the element.
static int multilayerMin()
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const =0
Specified by each surface type: LocalToGlobal method without dynamic memory allocation.
bool leftEdge(int channel, Amg::Vector2D &pos) const
STRIPS ONLY: Returns the left edge of the strip.
StatusCode initialize() override