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
45 bool orChannel) const {
46 if (channelId) {
47 if (channelId->getChannelIdType() ==
49 return getChannelOut(channelId, orChannel);
50 }
51 if (channelId->getChannelIdType() ==
53 return getChannelIn(channelId, orChannel);
54 }
55 }
56 return nullptr;
57}
58
60 bool orChannel) const {
61 if (orChannel) {
62 return nullptr;
63 }
64 if (asdout->isValid() == false) {
65 return nullptr;
66 }
67
68 TGCDatabase* databaseP =
69 m_database[asdout->getRegionType()][asdout->getModuleType()].get();
70
71 TGCChannelASDIn* asdin = nullptr;
72
73 // sector ASDIn [1..48, 1..24], ASDOut [0..47, 0..23]
74 int sector;
75 if (asdout->isEndcap() && !asdout->isInner()) {
76 sector = asdout->getSector() - 1;
77 if (sector <= 0) {
79 }
80 } else {
81 sector = asdout->getSector();
82 if (sector <= 0) {
84 }
85 }
86
87 // chamber ASDIn [1(F),1,2,3,4,5(E)], ASDOut [0(F),4,3,2,1,0(E)]
88 int chamber;
89 if (asdout->isEndcap() && !asdout->isInner()) {
90 chamber = 5 - asdout->getChamber();
91 } else {
92 chamber = asdout->getChamber() + 1;
93 }
94
95 int channel = -1;
96 // channel ASDIn [1..32(S),1..n(W chamber)], ASDOut [0..31(S),n..0(W
97 // sector)]
98 if (asdout->isWire()) {
99 // Endcap Triplet chamberId start from 1 in ASDOut
100 int dbChamber = asdout->getChamber();
101 if (asdout->isEndcap() && asdout->isTriplet()) {
102 dbChamber = dbChamber - 1;
103 }
104 int indexIn[TGCDatabaseASDToPP::NIndexIn] = {
105 asdout->getLayer(), dbChamber, asdout->getChannel()};
106 int i = databaseP->getIndexDBIn(indexIn);
107 if (i < 0) {
108 return nullptr;
109 }
110 channel = databaseP->getEntry(i, 7) + 1;
111 } else {
112 if ((asdout->isBackward() && asdout->isAside()) ||
113 (!asdout->isBackward() && asdout->isCside())) {
114 channel = 32 - asdout->getChannel();
115 } else {
116 channel = asdout->getChannel() + 1;
117 }
118 }
119 if (channel == -1) {
120 return nullptr;
121 }
122
123 asdin = new TGCChannelASDIn(asdout->getSideType(), asdout->getSignalType(),
124 asdout->getRegionType(), sector,
125 asdout->getLayer(), chamber, channel);
126
127 return asdin;
128}
129
131 bool orChannel) const {
132 if (orChannel) {
133 return nullptr;
134 }
135 if (asdin->isValid() == false) {
136 return nullptr;
137 }
138
139 const bool asdinisEndcap = asdin->isEndcap();
140 const bool asdinisTriplet = asdin->isTriplet();
141 const int asdinLayer = asdin->getLayer();
142 const int asdinChannel = asdin->getChannel();
143
144 TGCDatabase* databaseP =
145 m_database[asdin->getRegionType()][asdin->getModuleType()].get();
146
147 TGCChannelASDOut* asdout = nullptr;
148
149 // sector ASDIn [1..48, 1..24], ASDOut [2..47.0.1, 1..23.0]
150 int sector;
151 if (asdin->isEndcap()) {
152 if (!asdin->isInner()) {
153 // Endcap
154 sector = (asdin->getSector() + 1) % TGCId::NUM_ENDCAP_SECTOR;
155 } else {
156 // EI
157 sector = (asdin->getSector()) % TGCId::NUM_INNER_SECTOR;
158 }
159 } else {
160 if (!asdin->isInner()) {
161 // Forward
162 sector = (asdin->getSector()) % TGCId::NUM_FORWARD_SECTOR;
163 } else {
164 // FI
165 sector = (asdin->getSector()) % TGCId::NUM_INNER_SECTOR;
166 }
167 }
168
169 // chamber ASDIn [1(F),1,2,3,4,5(E)], ASDOut [0(F),4,3,2,1,0(E)]
170 int chamber;
171 if (asdin->isEndcap() && !asdin->isInner()) {
172 chamber = 5 - asdin->getChamber();
173 } else {
174 chamber = asdin->getChamber() - 1;
175 }
176
177 int channel = -1;
178 // channel ASDIn [1..32(S),1..n(W chamber)], ASDOut [0..31(S),n..0(W
179 // sector)]
180 if (asdin->isWire()) {
181 const int MaxEntry = databaseP->getMaxEntry();
182 for (int i = 0; i < MaxEntry; i++) {
183 // Endcap Triplet chamberId start from 1 in ASDOut
184 int dbChamber = chamber;
185 if (asdinisEndcap && asdinisTriplet) {
186 dbChamber = dbChamber - 1;
187 }
188
189 int dbChannel = asdinChannel - 1;
190 if (databaseP->getEntry(i, 7) == dbChannel &&
191 databaseP->getEntry(i, 1) == dbChamber &&
192 databaseP->getEntry(i, 0) == asdinLayer) {
193 channel = databaseP->getEntry(i, 6);
194 break;
195 }
196 }
197 } else {
198 // asdin->isBackward() can not be used because this method rely on
199 // sector number for asdout
200 bool is_Backward = false;
201 if (asdin->isEndcap()) {
202 if (!asdin->isInner()) {
203 if (asdin->isAside()) {
204 is_Backward = (sector % 2 == 1);
205 } else {
206 is_Backward = (sector % 2 == 0);
207 }
208 } else {
209 // EI
210 // Special case of EI11
211 if (sector == 15) {
212 if (asdin->isAside()) {
213 is_Backward = false;
214 } else {
215 is_Backward = true;
216 }
217 } else if (sector == 16) {
218 if (asdin->isAside()) {
219 is_Backward = true;
220 } else {
221 is_Backward = false;
222 }
223 } else {
224 // A-side phi0 F: phi1 F: phi2 B
225 // C-side phi0 B: phi1 B: phi2 F
226 if (asdin->isAside()) {
227 is_Backward = (sector % 3 == 2);
228 } else {
229 is_Backward = (sector % 3 != 2);
230 }
231 }
232 }
233 } else {
234 if (asdin->isAside()) {
235 is_Backward = true; // All Backward for A-side
236 }
237 }
238 if ((is_Backward && asdin->isAside()) ||
239 (!is_Backward && asdin->isCside())) {
240 channel = 32 - asdin->getChannel();
241 } else {
242 channel = asdin->getChannel() - 1;
243 }
244 }
245 if (channel == -1) {
246 return nullptr;
247 }
248
249 asdout = new TGCChannelASDOut(asdin->getSideType(), asdin->getSignalType(),
250 asdin->getRegionType(), sector,
251 asdin->getLayer(), chamber, channel);
252
253 return asdout;
254}
255
256} // namespace MuonTGC_Cabling
virtual TGCChannelId * getChannelOut(const TGCChannelId *asdin, bool orChannel=false) const
std::array< std::array< std::unique_ptr< TGCDatabase >, TGCId::MaxModuleType >, TGCId::MaxRegionType > m_database
virtual TGCChannelId * getChannel(const TGCChannelId *channelId, bool orChannel=false) const
virtual 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(void) 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(void) const
Definition TGCId.h:137
static constexpr int NUM_ENDCAP_SECTOR
Definition TGCId.h:41
int getChamber() const
Definition TGCId.h:159
RegionType getRegionType(void) const
Definition TGCId.h:146
bool isCside() const
Definition TGCId.h:169
SignalType getSignalType(void) const
Definition TGCId.h:140
bool isWire() const
Definition TGCId.h:175
virtual int getSector() const
Definition TGCId.h:156
bool isInner() const
Definition TGCId.h:184
SideType getSideType(void) const
Definition TGCId.h:134
static constexpr int NUM_FORWARD_SECTOR
Definition TGCId.h:42