121 {
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
138 int sector{0};
139 if (asdin.isEndcap()) {
140 if (!asdin.isInner()) {
141
143 } else {
144
146 }
147 } else {
148 if (!asdin.isInner()) {
149
151 } else {
152
154 }
155 }
156
157
159 if (asdin.isEndcap() && !asdin.isInner()) {
160 chamber = 5 - asdin.getChamber();
161 } else {
162 chamber = asdin.getChamber() - 1;
163 }
164
166
167
168 if (asdin.isWire()) {
169 const int MaxEntry = databaseP->getMaxEntry();
170 for (
int i = 0;
i < MaxEntry;
i++) {
171
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
187
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
198
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
213
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;
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}
static constexpr int NUM_INNER_SECTOR