ATLAS Offline Software
Loading...
Searching...
No Matches
TGCSector.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
12#include "TrigT1TGC/TGCASDOut.h"
23
26
28
29#include <iostream>
30
31
32namespace LVL1TGCTrigger {
33
35{
36 int idPP,conPP,chPP;
37
38 TGCSignalType signalType = ASDOut->GetSignalType();
39
40 TGCReadoutIndex readoutIndex;
41 readoutIndex = ASDOut->GetTGCReadoutIndex();
42
43 int layer = readoutIndex.GetLayerNumber();
44 int rNumber = readoutIndex.GetRNumber();
45 int ch = ASDOut->GetHitID();
46
47 int PPType = getPatchPanelType(signalType,layer);
48 int notFound;
49 if (PPType<0){
50 notFound = -1;
51 } else {
52 notFound = m_ASDToPP[PPType]->getConnection(m_sideId,layer,rNumber,ch,&idPP,&conPP,&chPP);
53 }
54
55 if (tgcArgs()->MSGLEVEL() <= MSG::DEBUG) {
56 MsgStream log(Athena::getMessageSvc(), "LVL1TGCTrigger::TGCSector");
57 if (!notFound) {
58 log << MSG::DEBUG
59 << "signalType= " << ((signalType == WIRE) ? "Wire" : "Strip")
60 <<" layer= " <<layer <<" rNumber= " <<rNumber <<" ch= "<< ch
61 <<"id(PP)= " <<idPP <<" connector(PP)= " <<conPP <<" ch(PP)= " <<chPP
62 <<endmsg;
63 }
64 }
65
66 if(!notFound){
67 m_PP[PPType][idPP]->setASDOut(chPP,conPP,ASDOut);
69 return 0;
70 }
71 return -1;
72}
73
74int TGCSector::getPatchPanelType(TGCSignalType signal, int layer) const
75{
76 if((layer>=0)&&(layer<=2)){
77 if (signal == WIRE) return WTPP;
78 else return STPP;
79 } else if((layer>=3)&&(layer<=6)){
80 if (signal == WIRE) return WDPP;
81 else return SDPP;
82 } else if (layer<=8) {
83 if (signal == WIRE) return WIPP;
84 else return SIPP;
85 } else {
86 return NOPP;
87 }
88}
89
92 m_numberOfHit(0),
93 m_octantId(0), m_moduleId(0),
95 m_SL(0), m_TMDB(0), m_NSW(0),m_BIS78(0),
96 m_tgcArgs(nullptr), m_dbMgr(nullptr)
97{
98 for(unsigned int iPatchPanelType=0; iPatchPanelType<NumberOfPatchPanelType; iPatchPanelType++) {
99 m_ASDToPP[iPatchPanelType] = 0;
100 m_PP[iPatchPanelType].clear();
101 }
102 for(unsigned int iSlaveBoardType=0; iSlaveBoardType<NumberOfSlaveBoardType; iSlaveBoardType++) {
103 m_SB[iSlaveBoardType].clear();
104 }
105 for(unsigned int iHighPtBoardType=0; iHighPtBoardType<NumberOfHighPtBoardType; iHighPtBoardType++) {
106 m_HPB[iHighPtBoardType].clear();
107 }
108}
109
111 int idIn, TGCRegionType type,
112 TGCForwardBackwardType forwardBackward,
113 const TGCDatabaseManager* db,
114 std::shared_ptr<const LVL1TGC::TGCTMDB> tm,
115 std::shared_ptr<const LVL1TGC::TGCNSW> nsw,
116 std::shared_ptr<const LVL1TGC::TGCBIS78> bis78)
117 : m_id(idIn), m_regionType(type), m_numberOfHit(0),
118 m_TMDB(std::move(tm)), m_NSW(std::move(nsw)), m_BIS78(std::move(bis78)),
119 m_tgcArgs(tgcargs), m_dbMgr(db)
120{
124 m_forwardBackward = forwardBackward;
125
126 int i;
127 if (m_moduleId < 9) {
128 for( i=0; i<=SDPP; i+=1) {
129 m_ASDToPP[i] = db->getConnectionASDToPP((TGCRegionType)m_regionType, i, forwardBackward);
130 }
131 for( i=WIPP; i<NumberOfPatchPanelType; i+=1) m_ASDToPP[i]=0;
132 } else {
133 // Inner Module
134 for( i=0; i<=SDPP; i+=1) m_ASDToPP[i]=0;
135 for( i=WIPP; i<NumberOfPatchPanelType; i+=1) {
136 m_ASDToPP[i] = db->getConnectionASDToPP((TGCRegionType)m_regionType, i, forwardBackward);
137 }
138 }
139
140 const TGCConnectionPPToSL* PPToSL = db->getConnectionPPToSL(m_regionType);
141 // make PatchPanel Boards, Slave Boards, HighPt Boards, SectorLogic.
142 setModule(PPToSL);
143 // dumpModule();
144
145 if (m_moduleId < 9) {
146 // set TMDB
147 m_SL->setTMDB(m_TMDB);
148
149 // set NSW
150 m_SL->setNSW(m_NSW);
151
152 // set BIS78
153 m_SL->setBIS78(m_BIS78);
154 }
155
156 // set connection between boards;
157 connectPPToSB(PPToSL->getPPToSB());
158 if (m_moduleId < 9) {
160 connectSBToHPB(PPToSL->getSBToHPB());
161 connectHPBToSL(PPToSL->getHPBToSL());
163 }
164}
165
167{
168 if (m_moduleId <9) { // BW Sectors
169 // PP ASIC
170 for (int jpp=0; jpp <= SDPP; jpp++) {
171 m_PP[jpp].resize(connection->getPPToSB()->getNumber(jpp));
172 for (unsigned int i=0; i < m_PP[jpp].size(); i++) {
173 if (jpp==WTPP) { m_PP[jpp][i] = new TGCWireTripletPP(tgcArgs()); }
174 else if(jpp==WDPP) { m_PP[jpp][i] = new TGCWireDoubletPP(tgcArgs()); }
175 else if(jpp==STPP) { m_PP[jpp][i] = new TGCStripTripletPP(tgcArgs());}
176 else if(jpp==SDPP) { m_PP[jpp][i] = new TGCStripDoubletPP(tgcArgs());}
177 m_PP[jpp][i]->setId(connection->getPPToSB()->getId(jpp,i));
178 m_PP[jpp][i]->setType(jpp);
179 m_PP[jpp][i]->setRegion(m_regionType);
180 }
181 }
182 for (int jpp=WIPP; jpp<NumberOfPatchPanelType; jpp++) {
183 m_PP[jpp].clear();
184 }
185
186 // SLB
187 for (int jsb=0; jsb <= SDSB; jsb++) {
188 m_SB[jsb].resize(connection->getSBToHPB()->getNumber(jsb));
189 for (unsigned int i=0; i < m_SB[jsb].size(); i++) {
190 if (jsb == WTSB) { m_SB[jsb][i] = new TGCWireTripletSB(); }
191 else if (jsb == WDSB) { m_SB[jsb][i] = new TGCWireDoubletSB(); }
192 else if (jsb == STSB) { m_SB[jsb][i] = new TGCStripTripletSB();}
193 else if (jsb == SDSB) { m_SB[jsb][i] = new TGCStripDoubletSB();}
194 m_SB[jsb][i]->setId(connection->getSBToHPB()->getId(jsb,i));
195 m_SB[jsb][i]->setType(jsb);
196 m_SB[jsb][i]->setRegion(m_regionType);
197 }
198 }
199 for (int jsb=WISB; jsb < NumberOfSlaveBoardType; jsb++) {
200 m_SB[jsb].clear();
201 }
202
203 // HPT
204 for (int jhp=0; jhp<NumberOfHighPtBoardType; jhp++) {
205 m_HPB[jhp].resize(connection->getHPBToSL()->getNumber(jhp));
206 for (unsigned int i=0; i < m_HPB[jhp].size(); i++) {
207 if(jhp == WHPB) m_HPB[jhp][i] = new TGCWireHighPtBoard;
208 if(jhp == SHPB) m_HPB[jhp][i] = new TGCStripHighPtBoard;
209 m_HPB[jhp][i]->setId(connection->getHPBToSL()->getId(jhp,i));
210 m_HPB[jhp][i]->setType(jhp);
211 m_HPB[jhp][i]->setRegion(m_regionType);
212 }
213 }
214
215 // Sector Logic
217 m_SL->getSSCController()->setNumberOfWireHighPtBoard(connection->getHPBToSL()->getNumber(WHPB));
218 } else { // Inner Small Wheel
219 // PP ASIC
220 for (int jpp=0; jpp <= SDPP; jpp++) {
221 m_PP[jpp].clear();
222 }
223 for (int jpp=WIPP; jpp < NumberOfPatchPanelType; jpp++) {
224 m_PP[jpp].resize(connection->getPPToSB()->getNumber(jpp));
225 for (unsigned int i=0; i < m_PP[jpp].size(); i++) {
226 if (jpp == WIPP) { m_PP[jpp][i] = new TGCWireInnerPP(tgcArgs()); }
227 else if (jpp == SIPP) { m_PP[jpp][i] = new TGCStripInnerPP(tgcArgs()); }
228 m_PP[jpp][i]->setId(connection->getPPToSB()->getId(jpp,i));
229 m_PP[jpp][i]->setType(jpp);
230 m_PP[jpp][i]->setRegion(m_regionType);
231 }
232 }
233
234 // SLB
235 for (int jsb=0; jsb<=SDSB; jsb+=1) {
236 m_SB[jsb].clear();
237 }
238 for (int jsb=WISB; jsb<NumberOfSlaveBoardType; jsb++) {
239 m_SB[jsb].resize(1);
240 m_SB[jsb][0] = new TGCInnerSB();
241 m_SB[jsb][0]->setType(jsb);
242 m_SB[jsb][0]->setRegion(m_regionType);
243 m_SB[jsb][0]->setId(0);
244 }
245
246 // HPT
247 for(int jhp=0; jhp<NumberOfHighPtBoardType; jhp+=1){
248 m_HPB[jhp].clear();
249 }
250
251 // no specific Sector Logic
252 m_SL = 0;
253 }
254}
255
257{
258 int iPort;
259 int startType, endType;
260 if (m_moduleId <9) {
261 startType =0;
262 endType = SDPP;
263 } else {
264 startType = WIPP;
265 endType = SIPP;
266 }
267
268 // set a Slave Board ID to connect for each Patch Panel.
269 // find the Slave Board and give a pointer of the Patch Panel to it.
270 for (int i=startType; i <= endType; i++) {
271#ifdef TGCDEBUG
272 std::cerr << "connectionPPToSB :"
273 << " module:" << m_moduleId
274 << " type: " << i
275 << " #PP=" << m_PP[i].size()
276 << " #SB=" << m_SB[i].size()
277 << std::endl;
278#endif
279 for(unsigned int iPP = 0; iPP < m_PP[i].size(); iPP++) {
280 for ( iPort = 0; iPort < connection->getNumberOfPort(); iPort += 1) {
281 m_PP[i][iPP]->setIdSlaveBoard(iPort,connection->getSBIdToPP(i,iPort,iPP));
282 for (unsigned int iSB = 0; iSB < m_SB[i].size(); iSB++) {
283 if (m_PP[i][iPP]->getIdSlaveBoard(iPort) == m_SB[i][iSB]->getId()) {
284 m_SB[i][iSB]->setPatchPanel(m_PP[i][iPP]);
285 break;
286 }
287 } // m_SB loop
288 } // Port loop
289 } // m_PP loop
290 } // type loop
291
292}
293
294
296{
297 for (unsigned int iPP = 1; iPP < m_PP[WDPP].size(); iPP++) {
298 m_PP[WDPP][iPP-1]->setAdjacentPP(1,m_PP[WDPP][iPP]);
299 m_PP[WDPP][iPP]->setAdjacentPP(0,m_PP[WDPP][iPP-1]);
300 }
301
302 for (unsigned int iPP = 1; iPP < m_PP[WTPP].size(); iPP++) {
303 m_PP[WTPP][iPP-1]->setAdjacentPP(1,m_PP[WTPP][iPP]);
304 m_PP[WTPP][iPP]->setAdjacentPP(0,m_PP[WTPP][iPP-1]);
305 }
306
307 for (unsigned int iPP = 1; iPP < m_PP[STPP].size(); iPP++) {
308 m_PP[STPP][iPP-1]->setAdjacentPP(1,m_PP[STPP][iPP]);
309 m_PP[STPP][iPP]->setAdjacentPP(0,m_PP[STPP][iPP-1]);
310 }
311
312 for (unsigned int iPP = 1; iPP < m_PP[SDPP].size(); iPP++) {
313 m_PP[SDPP][iPP-1]->setAdjacentPP(1,m_PP[SDPP][iPP]);
314 m_PP[SDPP][iPP]->setAdjacentPP(0,m_PP[SDPP][iPP-1]);
315 }
316
317 for (int i=0; i<=SDPP; i++) {
318 for (TGCPatchPanel* ppasic : m_PP[i]) {
319 ppasic->connect();
320 }
321 }
322}
323
325{
326 for (int i=0; i < NumberOfSlaveBoardType; i++) {
327 if ( i==WISB ) continue; // Inner m_SB is not connected to m_HPB
328 if ( i==SISB ) continue; // Inner m_SB is not connected to m_HPB
329
330 for (unsigned int iSB = 0; iSB < m_SB[i].size(); iSB++) {
331 m_SB[i][iSB]->setIdHighPtBoard(connection->getHPBIdToSB(i,iSB));
332 int type = i/2; // ! assume HighPtBoardType=SlaveBoardType/2
333 for (unsigned int iHPB = 0; iHPB < m_HPB[type].size(); iHPB += 1){
334 if ( m_SB[i][iSB]->getIdHighPtBoard() == m_HPB[type].at(iHPB)->getId()) {
335 if((i==WDSB)||(i==SDSB))
336 m_HPB[type].at(iHPB)->setDSB(connection->getHPBPortToSB(i,iSB),m_SB[i][iSB]);
337 else if((i==WTSB)||(i==STSB))
338 m_HPB[type].at(iHPB)->setTSB(connection->getHPBPortToSB(i,iSB),m_SB[i][iSB]);
339 break;
340 }
341 }
342 }
343 }
344}
345
347{
348 if (!m_SL) return;
349
350 // set pointers of HighPtBoard to connect to SectorLogic
351 for (unsigned int iHPB = 0; iHPB < m_HPB[WHPB].size(); iHPB++){
352 m_SL->setWireHighPtBoard(connection->getSLPortToHPB(WHPB,iHPB), m_HPB[WHPB].at(iHPB));
353 }
354 for (unsigned int iHPB = 0; iHPB < m_HPB[SHPB].size(); iHPB++) {
355 m_SL->setStripHighPtBoard(m_HPB[SHPB].at(iHPB));
356 }
357}
358
360{
361 switch(m_regionType){
363 // assume there are only two WireHighPtBoards.
364 if((m_HPB[WHPB][1]) && (m_HPB[WHPB][0])){
365 m_HPB[WHPB][0]->setAdjacentHPB(1,m_HPB[WHPB][1]);
366 m_HPB[WHPB][1]->setAdjacentHPB(0,m_HPB[WHPB][0]);
367 }
368 break;
370 if(m_HPB[WHPB][0]){
371 m_HPB[WHPB][0]->setAdjacentHPB(1,0);
372 }
373 break;
374 default:
375 break;
376 }
377}
378
380{
381 // Don't delete m_ASDToPP! 22 May 2001 (MT, KH)
382 for (int i=0; i < NumberOfPatchPanelType; i++) {
383 for (unsigned int j=0; j<m_PP[i].size(); j++) {
384 if (m_PP[i][j] != nullptr) delete m_PP[i][j];
385 }
386 m_PP[i].clear();
387 }
388
389 for (int i=0; i < NumberOfSlaveBoardType; i++) {
390 for (unsigned int j=0; j < m_SB[i].size(); j+=1) {
391 if(m_SB[i][j] != nullptr) delete m_SB[i][j];
392 }
393 m_SB[i].clear();
394 }
395
396 for(int i=0; i<NumberOfHighPtBoardType; i+=1){
397 for(unsigned int j=0; j < m_HPB[i].size(); j+=1) {
398 if(m_HPB[i][j] != nullptr) delete m_HPB[i][j];
399 }
400 m_HPB[i].clear();
401 }
402 if (m_SL) delete m_SL;
403 m_SL = 0;
404}
405
407{
408 std::cout << "Side:" << m_sideId << " Octant:" << m_octantId
409 << " ModuleId:" << m_moduleId << std::endl;
410
411 std::cout << "PatchPanel NumberOfPatchPanelType: " << NumberOfPatchPanelType << std::endl;
412 for (int j=0; j < NumberOfPatchPanelType; j++) {
413 std::cout << "numberOfPP(index in a type): " << m_PP[j].size() << std::endl;
414 for (TGCPatchPanel* ppasic : m_PP[j]) {
415 std::cout << " Type:" << ppasic->getType();
416 std::cout << " Id:" << ppasic->getId();
417 std::cout << " Region:" << (ppasic->getRegion()==TGCRegionType::FORWARD ? "FWD" : "END");
418 std::cout << ((ppasic->getRegion() == TGCRegionType::ENDCAP) ? ":Endcap" : ":Forward") << std::endl;
419 }
420 }
421
422 std::cout << "SlaveBoard NumberOfSlaveBoardType: " << NumberOfSlaveBoardType << std::endl;
423 for (int j=0; j < NumberOfSlaveBoardType; j++) {
424 std::cout << "numberOfSB(index in a type): " << m_SB[j].size() << std::endl;
425 for (unsigned int i=0; i < m_SB[j].size(); i++) { // index in a type
426 std::cout << " Type:" << m_SB[j][i]->getType();
427 std::cout << " Id:" << m_SB[j][i]->getId();
428 std::cout << " Region: " << ((m_SB[j][i]->getRegion() == TGCRegionType::ENDCAP) ? "Endcap" : "Forward") << std::endl;
429 }
430 }
431
432 std::cout << "HighPtBoard NumberOfHighPtBoardType:" << NumberOfHighPtBoardType << std::endl;
433 for(int j=0; j<NumberOfHighPtBoardType; j+=1){
434 std::cout << "numberOfHPB(index in a type):" << m_HPB[j].size() << std::endl;
435 for(unsigned int i=0; i < m_HPB[j].size(); i+=1) {
436 std::cout << " Type:" << m_HPB[j][i]->getType();
437 std::cout << " Id:" << m_HPB[j][i]->getId();
438 std::cout << " Region:" << (m_HPB[j][i]->getRegion()==TGCRegionType::ENDCAP ? "Endcap" : "Forward") << std::endl;
439 }
440 }
441
442 std::cout << "SectorLogic" << std::endl;
443 if (m_SL) {
444 std::cout << "SL:" << m_SL << std::endl;
445 std::cout << " Id:" << m_SL->getId();
446 std::cout << " Region:";
447 if(m_SL->getRegion()==TGCRegionType::ENDCAP) {
448 std::cout << "Endcap" << std::endl;
449 }else{
450 std::cout << "Forward" << std::endl;
451 }
452 } else {
453 std::cout << "NO SL" << std::endl;
454 }
455}
456
457} // namespace LVL1TGCTrigger
#define endmsg
const TGCReadoutIndex & GetTGCReadoutIndex() const
Definition TGCASDOut.h:33
TGCSignalType GetSignalType() const
Definition TGCASDOut.h:34
int getId(const unsigned int type, const unsigned int board) const
int getNumber(const unsigned int type) const
int getSLPortToHPB(int type, int index) const
int getSBIdToPP(int type, int port, int index) const
const TGCConnectionSBToHPB * getSBToHPB() const
const TGCConnectionHPBToSL * getHPBToSL() const
const TGCConnectionPPToSB * getPPToSB() const
int getHPBPortToSB(int type, int index) const
int getHPBIdToSB(int type, int index) const
std::vector< TGCHighPtBoard * > m_HPB[NumberOfHighPtBoardType]
Definition TGCSector.h:115
void connectPPToSB(const TGCConnectionPPToSB *connection)
LVL1TGC::TGCSide m_sideId
Definition TGCSector.h:105
std::shared_ptr< const LVL1TGC::TGCBIS78 > m_BIS78
Definition TGCSector.h:120
TGCArguments * m_tgcArgs
Definition TGCSector.h:122
TGCArguments * tgcArgs()
Definition TGCSector.h:79
void setModule(const TGCConnectionPPToSL *connection)
std::vector< TGCPatchPanel * > m_PP[NumberOfPatchPanelType]
Definition TGCSector.h:113
TGCSectorLogic * m_SL
Definition TGCSector.h:117
TGCRegionType m_regionType
Definition TGCSector.h:104
std::shared_ptr< const LVL1TGC::TGCTMDB > m_TMDB
Definition TGCSector.h:118
void connectSBToHPB(const TGCConnectionSBToHPB *connection)
const TGCDatabaseManager * m_dbMgr
Definition TGCSector.h:123
std::vector< TGCSlaveBoard * > m_SB[NumberOfSlaveBoardType]
Definition TGCSector.h:114
int distributeSignal(const TGCASDOut *asdOut)
Definition TGCSector.cxx:34
TGCForwardBackwardType m_forwardBackward
Definition TGCSector.h:110
const TGCConnectionASDToPP * m_ASDToPP[NumberOfPatchPanelType]
Definition TGCSector.h:111
std::shared_ptr< const LVL1TGC::TGCNSW > m_NSW
Definition TGCSector.h:119
void connectHPBToSL(const TGCConnectionHPBToSL *connection)
int getPatchPanelType(TGCSignalType signal, int layer) const
Definition TGCSector.cxx:74
singleton-like access to IMessageSvc via open function and helper
IMessageSvc * getMessageSvc(bool quiet=false)
class TGCPatchPanel TGCStripTripletPP
class TGCPatchPanel TGCStripInnerPP
class TGCPatchPanel TGCWireTripletPP
class TGCPatchPanel TGCWireInnerPP
class TGCPatchPanel TGCStripDoubletPP
class TGCPatchPanel TGCWireDoubletPP
TGCSide
The sides of TGC (A- or C-side)
STL namespace.