120 {
121 if (orChannel || asdin.isValid() == false) {
122 return nullptr;
123 }
124
125 const bool asdinisEndcap = asdin.isEndcap();
126 const bool asdinisTriplet = asdin.isTriplet();
127 const int asdinLayer = asdin.getLayer();
128 const int asdinChannel = asdin.getChannel();
129
130 TGCDatabase* databaseP =
131 m_database.at(+asdin.getRegionType()).at(+asdin.getModuleType()).get();
132
133 if (!databaseP) {
134 return nullptr;
135 }
136
137 int sector{0};
138 if (asdin.isEndcap()) {
139 if (!asdin.isInner()) {
140
142 } else {
143
145 }
146 } else {
147 if (!asdin.isInner()) {
148
150 } else {
151
153 }
154 }
155
156
158 if (asdin.isEndcap() && !asdin.isInner()) {
159 chamber = 5 - asdin.getChamber();
160 } else {
161 chamber = asdin.getChamber() - 1;
162 }
163
165
166
167 if (asdin.isWire()) {
168 const int MaxEntry = databaseP->getMaxEntry();
169 for (
int i = 0;
i < MaxEntry;
i++) {
170
172 if (asdinisEndcap && asdinisTriplet) {
173 dbChamber = dbChamber - 1;
174 }
175
176 int dbChannel = asdinChannel - 1;
177 if (databaseP->getEntry(i, 7) == dbChannel &&
178 databaseP->getEntry(i, 1) == dbChamber &&
179 databaseP->getEntry(i, 0) == asdinLayer) {
180 channel = databaseP->getEntry(i, 6);
181 break;
182 }
183 }
184 } else {
185
186
187 bool is_Backward = false;
188 if (asdin.isEndcap()) {
189 if (!asdin.isInner()) {
190 if (asdin.isAside()) {
191 is_Backward = (sector % 2 == 1);
192 } else {
193 is_Backward = (sector % 2 == 0);
194 }
195 } else {
196
197
198 if (sector == 15) {
199 if (asdin.isAside()) {
200 is_Backward = false;
201 } else {
202 is_Backward = true;
203 }
204 } else if (sector == 16) {
205 if (asdin.isAside()) {
206 is_Backward = true;
207 } else {
208 is_Backward = false;
209 }
210 } else {
211
212
213 if (asdin.isAside()) {
214 is_Backward = (sector % 3 == 2);
215 } else {
216 is_Backward = (sector % 3 != 2);
217 }
218 }
219 }
220 } else {
221 if (asdin.isAside()) {
222 is_Backward = true;
223 }
224 }
225 if ((is_Backward && asdin.isAside()) ||
226 (!is_Backward && asdin.isCside())) {
227 channel = 32 - asdin.getChannel();
228 } else {
229 channel = asdin.getChannel() - 1;
230 }
231 }
232 if (channel == -1) {
233 return nullptr;
234 }
235
236 return std::make_unique<TGCChannelASDOut>(
237 asdin.getSideType(), asdin.getSignalType(), asdin.getRegionType(),
238 sector, asdin.getLayer(), chamber, channel);
239}
static constexpr int NUM_INNER_SECTOR