ATLAS Offline Software
Loading...
Searching...
No Matches
TGCCableInASD.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
10
11namespace MuonTGC_Cabling {
12
13// Constructor & Destructor
14TGCCableInASD::TGCCableInASD(const std::string& filename)
15 : TGCCable(TGCCable::InASD), m_database{{{nullptr}}} {
16 m_database[TGCId::Endcap][TGCId::WD] =
17 std::make_unique<TGCDatabaseASDToPP>(filename, "EWD");
18 m_database[TGCId::Endcap][TGCId::WT] =
19 std::make_unique<TGCDatabaseASDToPP>(filename, "EWT");
20 m_database[TGCId::Endcap][TGCId::SD] =
21 std::make_unique<TGCDatabaseASDToPP>(filename, "ESD");
22 m_database[TGCId::Endcap][TGCId::ST] =
23 std::make_unique<TGCDatabaseASDToPP>(filename, "EST");
24 m_database[TGCId::Endcap][TGCId::WI] =
25 std::make_unique<TGCDatabaseASDToPP>(filename, "EWI");
26 m_database[TGCId::Endcap][TGCId::SI] =
27 std::make_unique<TGCDatabaseASDToPP>(filename, "ESI");
28 m_database[TGCId::Forward][TGCId::WD] =
29 std::make_unique<TGCDatabaseASDToPP>(filename, "FWD");
30 m_database[TGCId::Forward][TGCId::WT] =
31 std::make_unique<TGCDatabaseASDToPP>(filename, "FWT");
32 m_database[TGCId::Forward][TGCId::SD] =
33 std::make_unique<TGCDatabaseASDToPP>(filename, "FSD");
34 m_database[TGCId::Forward][TGCId::ST] =
35 std::make_unique<TGCDatabaseASDToPP>(filename, "FST");
36 m_database[TGCId::Forward][TGCId::WI] =
37 std::make_unique<TGCDatabaseASDToPP>(filename, "FWI");
38 m_database[TGCId::Forward][TGCId::SI] =
39 std::make_unique<TGCDatabaseASDToPP>(filename, "FSI");
40}
41
42TGCCableInASD::~TGCCableInASD() = default;
43
44std::unique_ptr<TGCChannelId> TGCCableInASD::getChannel(
45 const TGCChannelId& channelId, bool orChannel) const {
46 if (channelId.getChannelIdType() == TGCChannelId::ChannelIdType::ASDIn) {
47 return getChannelOut(channelId, orChannel);
48 }
49 if (channelId.getChannelIdType() == TGCChannelId::ChannelIdType::ASDOut) {
50 return getChannelIn(channelId, orChannel);
51 }
52
53 return nullptr;
54}
55
56std::unique_ptr<TGCChannelId> TGCCableInASD::getChannelIn(
57 const TGCChannelId& asdout, bool orChannel) const {
58 if (orChannel || !asdout.isValid()) {
59 return nullptr;
60 }
61
62 TGCDatabase* databaseP =
63 m_database[asdout.getRegionType()][asdout.getModuleType()].get();
64
65 // sector ASDIn [1..48, 1..24], ASDOut [0..47, 0..23]
66 int sector;
67 if (asdout.isEndcap() && !asdout.isInner()) {
68 sector = asdout.getSector() - 1;
69 if (sector <= 0) {
71 }
72 } else {
73 sector = asdout.getSector();
74 if (sector <= 0) {
76 }
77 }
78
79 // chamber ASDIn [1(F),1,2,3,4,5(E)], ASDOut [0(F),4,3,2,1,0(E)]
80 int chamber;
81 if (asdout.isEndcap() && !asdout.isInner()) {
82 chamber = 5 - asdout.getChamber();
83 } else {
84 chamber = asdout.getChamber() + 1;
85 }
86
87 int channel = -1;
88 // channel ASDIn [1..32(S),1..n(W chamber)], ASDOut [0..31(S),n..0(W
89 // sector)]
90 if (asdout.isWire()) {
91 // Endcap Triplet chamberId start from 1 in ASDOut
92 int dbChamber = asdout.getChamber();
93 if (asdout.isEndcap() && asdout.isTriplet()) {
94 dbChamber = dbChamber - 1;
95 }
96 int indexIn[TGCDatabaseASDToPP::NIndexIn] = {
97 asdout.getLayer(), dbChamber, asdout.getChannel()};
98 int i = databaseP->getIndexDBIn(indexIn);
99 if (i < 0) {
100 return nullptr;
101 }
102 channel = databaseP->getEntry(i, 7) + 1;
103 } else {
104 if ((asdout.isBackward() && asdout.isAside()) ||
105 (!asdout.isBackward() && asdout.isCside())) {
106 channel = 32 - asdout.getChannel();
107 } else {
108 channel = asdout.getChannel() + 1;
109 }
110 }
111 if (channel == -1) {
112 return nullptr;
113 }
114
115 return std::make_unique<TGCChannelASDIn>(
116 asdout.getSideType(), asdout.getSignalType(), asdout.getRegionType(),
117 sector, asdout.getLayer(), chamber, channel);
118}
119
120std::unique_ptr<TGCChannelId> TGCCableInASD::getChannelOut(
121 const TGCChannelId& asdin, bool orChannel) const {
122 if (orChannel || asdin.isValid() == false) {
123 return nullptr;
124 }
125
126 const bool asdinisEndcap = asdin.isEndcap();
127 const bool asdinisTriplet = asdin.isTriplet();
128 const int asdinLayer = asdin.getLayer();
129 const int asdinChannel = asdin.getChannel();
130
131 TGCDatabase* databaseP =
132 m_database[asdin.getRegionType()][asdin.getModuleType()].get();
133
134 if (!databaseP) {
135 return nullptr;
136 }
137 // sector ASDIn [1..48, 1..24], ASDOut [2..47.0.1, 1..23.0]
138 int sector{0};
139 if (asdin.isEndcap()) {
140 if (!asdin.isInner()) {
141 // Endcap
142 sector = (asdin.getSector() + 1) % TGCId::NUM_ENDCAP_SECTOR;
143 } else {
144 // EI
145 sector = (asdin.getSector()) % TGCId::NUM_INNER_SECTOR;
146 }
147 } else {
148 if (!asdin.isInner()) {
149 // Forward
150 sector = (asdin.getSector()) % TGCId::NUM_FORWARD_SECTOR;
151 } else {
152 // FI
153 sector = (asdin.getSector()) % TGCId::NUM_INNER_SECTOR;
154 }
155 }
156
157 // chamber ASDIn [1(F),1,2,3,4,5(E)], ASDOut [0(F),4,3,2,1,0(E)]
158 int chamber{0};
159 if (asdin.isEndcap() && !asdin.isInner()) {
160 chamber = 5 - asdin.getChamber();
161 } else {
162 chamber = asdin.getChamber() - 1;
163 }
164
165 int channel = -1;
166 // channel ASDIn [1..32(S),1..n(W chamber)], ASDOut [0..31(S),n..0(W
167 // sector)]
168 if (asdin.isWire()) {
169 const int MaxEntry = databaseP->getMaxEntry();
170 for (int i = 0; i < MaxEntry; i++) {
171 // Endcap Triplet chamberId start from 1 in ASDOut
172 int dbChamber = chamber;
173 if (asdinisEndcap && asdinisTriplet) {
174 dbChamber = dbChamber - 1;
175 }
176
177 int dbChannel = asdinChannel - 1;
178 if (databaseP->getEntry(i, 7) == dbChannel &&
179 databaseP->getEntry(i, 1) == dbChamber &&
180 databaseP->getEntry(i, 0) == asdinLayer) {
181 channel = databaseP->getEntry(i, 6);
182 break;
183 }
184 }
185 } else {
186 // asdin.isBackward() can not be used because this method rely on
187 // sector number for asdout
188 bool is_Backward = false;
189 if (asdin.isEndcap()) {
190 if (!asdin.isInner()) {
191 if (asdin.isAside()) {
192 is_Backward = (sector % 2 == 1);
193 } else {
194 is_Backward = (sector % 2 == 0);
195 }
196 } else {
197 // EI
198 // Special case of EI11
199 if (sector == 15) {
200 if (asdin.isAside()) {
201 is_Backward = false;
202 } else {
203 is_Backward = true;
204 }
205 } else if (sector == 16) {
206 if (asdin.isAside()) {
207 is_Backward = true;
208 } else {
209 is_Backward = false;
210 }
211 } else {
212 // A-side phi0 F: phi1 F: phi2 B
213 // C-side phi0 B: phi1 B: phi2 F
214 if (asdin.isAside()) {
215 is_Backward = (sector % 3 == 2);
216 } else {
217 is_Backward = (sector % 3 != 2);
218 }
219 }
220 }
221 } else {
222 if (asdin.isAside()) {
223 is_Backward = true; // All Backward for A-side
224 }
225 }
226 if ((is_Backward && asdin.isAside()) ||
227 (!is_Backward && asdin.isCside())) {
228 channel = 32 - asdin.getChannel();
229 } else {
230 channel = asdin.getChannel() - 1;
231 }
232 }
233 if (channel == -1) {
234 return nullptr;
235 }
236
237 return std::make_unique<TGCChannelASDOut>(
238 asdin.getSideType(), asdin.getSignalType(), asdin.getRegionType(),
239 sector, asdin.getLayer(), chamber, channel);
240}
241
242} // namespace MuonTGC_Cabling
TGCCableInASD(const std::string &filename)
std::array< std::array< std::unique_ptr< TGCDatabase >, TGCId::MaxModuleType >, TGCId::MaxRegionType > m_database
std::unique_ptr< TGCChannelId > getChannelOut(const TGCChannelId &asdin, bool orChannel=false) const
std::unique_ptr< TGCChannelId > getChannel(const TGCChannelId &channelId, bool orChannel=false) const
std::unique_ptr< TGCChannelId > getChannelIn(const TGCChannelId &asdout, bool orChannel=false) const
TGCCable(CableType type=NoCableType)
Definition TGCCable.h:31
virtual bool isValid() const
virtual int getIndexDBIn(int *indexIn) const
virtual int getMaxEntry() const
virtual int getEntry(int entry, int column) const
bool isEndcap() const
Definition TGCId.h:190
bool isTriplet() const
Definition TGCId.h:178
bool isAside() const
Definition TGCId.h:166
static constexpr int NUM_INNER_SECTOR
Definition TGCId.h:43
ModuleType getModuleType() const
Definition TGCId.h:137
static constexpr int NUM_ENDCAP_SECTOR
Definition TGCId.h:41
int getChamber() const
Definition TGCId.h:159
bool isCside() const
Definition TGCId.h:169
RegionType getRegionType() const
Definition TGCId.h:146
bool isWire() const
Definition TGCId.h:175
virtual int getSector() const
Definition TGCId.h:156
SideType getSideType() const
Definition TGCId.h:134
bool isInner() const
Definition TGCId.h:184
SignalType getSignalType() const
Definition TGCId.h:140
static constexpr int NUM_FORWARD_SECTOR
Definition TGCId.h:42