ATLAS Offline Software
Loading...
Searching...
No Matches
TGCHighPtBoard.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
8#include <iostream>
9#include <cmath>
10#include <cstdlib>
11
12namespace LVL1TGCTrigger {
13
16 m_id(-1),m_bid(-1),m_idSectorLogic(-1),m_type(-1),
21{
22 for( int i=0; i<NumberOfChip; i+=1){
23 for( int j=0; j<s_NumberOfDSBOut; j+=1){
24 m_DSB[i][j]=0;
25 m_DSBOut[i][j]=0;
26 }
27 for( int j=0; j<s_NumberOfTSBOut; j+=1){
28 m_TSB[i][j]=0;
29 m_TSBOut[i][j]=0;
30 }
31 }
32
33 for( int i=0; i<NumberOfAdjacentHPB; i+=1)
34 m_adjacentHPB[i]=0;
35
36 for( int i=0; i<NumberOfChip; i+=1){
37 for( int j=0; j<NDecoderInTSB; j+=1) m_decoderInTSB[i][j]=0;
38 for( int j=0; j<NDecoderInDSB; j+=1) m_decoderInDSB[i][j]=0;
39 }
40}
41
43{
44 int i,j;
45 for( i=0; i<NumberOfChip; i+=1){
46 for( j=0; j<s_NumberOfDSBOut; j+=1){
47 m_DSB[i][j]=0;
48 if(m_DSBOut[i][j]!=0){
49 delete m_DSBOut[i][j];
50 m_DSBOut[i][j]=0;
51 }
52 }
53 for( j=0; j<s_NumberOfTSBOut; j+=1){
54 m_TSB[i][j]=0;
55 if(m_TSBOut[i][j]!=0){
56 delete m_TSBOut[i][j];
57 m_TSBOut[i][j]=0;
58 }
59 }
60 }
61
62 for( i=0; i<NumberOfChip; i+=1){
63 for( j=0; j<NDecoderInTSB; j+=1){
64 if(m_decoderInTSB[i][j]!=0) delete m_decoderInTSB[i][j];
65 m_decoderInTSB[i][j]=0;
66 }
67 for( j=0; j<NDecoderInDSB; j+=1){
68 if(m_decoderInDSB[i][j]!=0) delete m_decoderInDSB[i][j];
69 m_decoderInDSB[i][j]=0;
70 }
71 }
72
73 for( i=0; i<NumberOfAdjacentHPB; i+=1)
74 m_adjacentHPB[i]=0;
75}
76
78{
79 if(m_bid!=bidIn){
80#ifdef TGCCOUT
81 std::cout << "#TGCHighPtBoard::clockIn collect" << std::endl;
82#endif
83 m_bid = bidIn;
86 return;
87 }else{
88#ifdef TGCCOUT
89 std::cout << "#TGCHighPtBoard::clockIn BID:" << m_bid
90 << " TYPE:" << ((m_type==WHPB) ? "WHPB" : "SHPB" )
91 << " ID:" << m_id
92 << " REGION:" << ( (m_region==TGCRegionType::FORWARD) ? "FWD" : "END")
93 <<std::endl;
94#endif
95 createHighPtChipOut(); //Feeds to SL
96 createHighPtBoardOut(); //Internal Use
97 createLowPtBoardOut(); //Internal Use
99 showResult();
102 }
103 return;
104}
105
107{
108 int i,j;
109 for( j=0; j<NumberOfChip; j+=1){
110 for( i=0; i<s_NumberOfDSBOut; i+=1){
111 if(m_DSBOut[j][i]!=0){
112 delete m_DSBOut[j][i];
113 m_DSBOut[j][i]=0;
114 }
115 }
116 for( i=0; i<s_NumberOfTSBOut; i+=1){
117 if(m_TSBOut[j][i]!=0){
118 delete m_TSBOut[j][i];
119 m_TSBOut[j][i]=0;
120 }
121 }
122 }
123}
124
126{
127 int i,j;
128 for( j=0; j<NumberOfChip; j+=1){
129 for( i=0; i<s_NumberOfDSBOut; i+=1)
130 if(m_DSB[j][i]){
131 m_DSBOut[j][i]=m_DSB[j][i]->getOutput();
132 m_DSB[j][i]->eraseOutput();
133 if(m_DSBOut[j][i]) m_DSBOut[j][i]->print();
134 }
135 for( i=0; i<s_NumberOfTSBOut; i+=1)
136 if(m_TSB[j][i]){
137 m_TSBOut[j][i]=m_TSB[j][i]->getOutput();
138 m_TSB[j][i]->eraseOutput();
139 if(m_TSBOut[j][i]) m_TSBOut[j][i]->print();
140 }
141 }
142}
143
148
153
155{
156 if(m_highPtBoardOut!=0){
157 delete m_highPtBoardOut;
159 }
160}
161
163{
164 if(m_lowPtBoardOut!=0){
165 delete m_lowPtBoardOut;
167 }
168}
169
171{
172 int chip;
173
174 setDecoderIn();
175
176 for( chip=0; chip<NumberOfChip; chip+=1){
179
180 decodeSlaveBoardOut(chip, TSBHit, DSBHit);
181
182 int block;
183 for(block=0; block < NBlockOfDSBChannel; block++){
184 doCoincidenceMatrix(chip, block, TSBHit, DSBHit);
185 if(m_decoderInDSB[chip][block/2])
186 if(m_decoderInDSB[chip][block/2]->getHit(block%2)){
187 m_decoderInDSB[chip][block/2]->print(block%2);
188 }
189 // load SLB outputs to lowpTOutput
190 loadLowPtOutput(chip, block, m_decoderInDSB[chip][block/2]);
191 }
192 trackSelector(chip,PtHigh);
193 trackSelector(chip,PtLow);
194 highLowSelector(chip);
195
196 delete TSBHit;
197 TSBHit=0;
198 delete DSBHit;
199 DSBHit=0;
200 }
201
203}
204
205
206void TGCHighPtBoard::loadLowPtOutput(int chip, int block,
207 TGCSlaveBoardOut* dataDSB)
208{
209 if(dataDSB!=0){
210 if(dataDSB->getHit(block%2)){
211 int pos=dataDSB->getPos(block%2);
212 int dev=dataDSB->getDev(block%2);
213 m_lowPtBoardOut->setPt(chip,block,PtLow);
214 m_lowPtBoardOut->setHit(chip,block,true);
215 m_lowPtBoardOut->setDev(chip,block,dev);
216 m_lowPtBoardOut->setPos(chip,block,pos/(m_nChOfDSBOut/4)); // !
217 }else{
218 m_lowPtBoardOut->setHit(chip,block,false);
219 }
220 }else{
221 m_lowPtBoardOut->setHit(chip,block,false);
222 }
223}
224
226{
227 return m_TSBOut[chip][port];
228}
229
230void TGCHighPtBoard::trackSelector(int chip, int ptIn)
231{
232 int i,iblock,a,b;
233 int dev[NBlockOfDSBChannel];
234 int block[NBlockOfDSBChannel];
235
236 for( iblock=0; iblock<NBlockOfDSBChannel; iblock+=1){
237 block[iblock]=iblock;
238 if(ptIn==PtHigh){
239 if(m_highPtBoardOut->getHit(chip,iblock)) dev[iblock]=m_highPtBoardOut->getDev(chip,iblock);
240 else dev[iblock]=99;
241 } else { // Low-Pt track
242 if(m_lowPtBoardOut->getHit(chip,iblock)){
243 dev[iblock]=abs(m_lowPtBoardOut->getDev(chip,iblock))+m_maxDev+1;
244 if(m_lowPtBoardOut->getDev(chip,iblock)<0) dev[iblock]=-dev[iblock];
245 } else dev[iblock]=99;
246 }
247 }
248
249 // sort in ascending order of |dev|.
250 for(iblock=1;iblock<NBlockOfDSBChannel;iblock+=1){
251 a=dev[iblock];
252 b=block[iblock];
253 i=iblock-1;
254 while((i>=0)&&((abs(dev[i])>abs(a))||((abs(dev[i])==abs(a))&&(dev[i]!=a)&&(m_priorSign*dev[i]<0)))){
255 dev[i+1]=dev[i];
256 block[i+1]=block[i];
257 i--;
258 }
259 dev[i+1]=a;
260 block[i+1]=b;
261 }
262
263 for(iblock=0;iblock<m_maxNumberOfHPBData;iblock+=1){
264 if(ptIn==PtHigh){
265 if(m_highPtBoardOut->getHit(chip,block[iblock]))
266 m_highPtBoardOut->setSel(chip,block[iblock],iblock+1);
267 } else { // Low-Pt track
268 if(m_lowPtBoardOut->getHit(chip,block[iblock]))
269 m_lowPtBoardOut->setSel(chip,block[iblock],iblock+1);
270 }
271 }
272}
273
275{
276 int iblock;
277 int highPt1stBlock, highPt2ndBlock;
278 int lowPt1stBlock, lowPt2ndBlock;
279 int pos, dev;
280 // Get 1st, 2nd candidate block for High-PT
281 highPt1stBlock = -1;
282 highPt2ndBlock = -1;
283 for(iblock=0;iblock<NBlockOfDSBChannel;iblock+=1){
284 switch (m_highPtBoardOut->getSel(chip,iblock)){
285 case 0: // No Hit
286 break;
287 case 1: // 1st candidate
288 highPt1stBlock = iblock;
289 break;
290 case 2: // 2nd candidate
291 highPt2ndBlock = iblock;
292 break;
293 default:
294 break;
295 }
296 }
297 // Get 1st, 2nd candidate block for Low-PT
298 lowPt1stBlock = -1;
299 lowPt2ndBlock = -1;
300 for(iblock=0;iblock<NBlockOfDSBChannel;iblock+=1){
301 switch (m_lowPtBoardOut->getSel(chip,iblock)){
302 case 0: // No Hit
303 break;
304 case 1: // 1st candidate
305 lowPt1stBlock = iblock;
306 break;
307 case 2: // 2nd candidate
308 lowPt2ndBlock = iblock;
309 break;
310 default:
311 break;
312 }
313 }
314
315 if (highPt1stBlock < 0){ //No HPT Matrix Output
316 if (lowPt1stBlock >= 0){
317 // LPT 1st
318 pos=m_lowPtBoardOut->getPos(chip,lowPt1stBlock);
319 dev=m_lowPtBoardOut->getDev(chip,lowPt1stBlock);
321 m_highPtChipOut->setSel(chip,FirstCandidate,1);
322 m_highPtChipOut->setDev(chip,FirstCandidate,dev);
323 m_highPtChipOut->setPos(chip,FirstCandidate,pos);
324 m_highPtChipOut->setHitID(chip,FirstCandidate,lowPt1stBlock);
325 }
326 if (lowPt2ndBlock >= 0){
327 // LPT 2nd
328 pos=m_lowPtBoardOut->getPos(chip,lowPt2ndBlock);
329 dev=m_lowPtBoardOut->getDev(chip,lowPt2ndBlock);
331 m_highPtChipOut->setSel(chip,SecondCandidate,2);
332 m_highPtChipOut->setDev(chip,SecondCandidate,dev);
333 m_highPtChipOut->setPos(chip,SecondCandidate,pos);
334 m_highPtChipOut->setHitID(chip,SecondCandidate,lowPt2ndBlock);
335 }
336 return;
337 } else if (highPt2ndBlock < 0){ // 1 HPT Matrix Output
338 // HPT 1st
339 pos=m_highPtBoardOut->getPos(chip,highPt1stBlock);
340 dev=m_highPtBoardOut->getDev(chip,highPt1stBlock);
342 m_highPtChipOut->setSel(chip,FirstCandidate,1);
343 m_highPtChipOut->setDev(chip,FirstCandidate,dev);
344 m_highPtChipOut->setPos(chip,FirstCandidate,pos);
345 m_highPtChipOut->setHitID(chip,FirstCandidate,highPt1stBlock);
346
347 if ((lowPt1stBlock >= 0) &&
348 !((lowPt1stBlock == highPt1stBlock) && ((m_lowPtBoardOut->getPos(chip,lowPt1stBlock)) == (m_highPtBoardOut->getPos(chip,highPt1stBlock))))
349 ){ //for vi }
350 // LPT 1st (as 2nd candidate)
351 pos=m_lowPtBoardOut->getPos(chip,lowPt1stBlock);
352 dev=m_lowPtBoardOut->getDev(chip,lowPt1stBlock);
354 m_highPtChipOut->setSel(chip,SecondCandidate,2);
355 m_highPtChipOut->setDev(chip,SecondCandidate,dev);
356 m_highPtChipOut->setPos(chip,SecondCandidate,pos);
357 m_highPtChipOut->setHitID(chip,SecondCandidate,lowPt1stBlock);
358 return;
359 } else if ((lowPt2ndBlock >= 0) &&
360 !((lowPt2ndBlock == highPt1stBlock) && ((m_lowPtBoardOut->getPos(chip,lowPt2ndBlock)) == (m_highPtBoardOut->getPos(chip,highPt1stBlock))))
361 ){
362
363 // LPT 2nd (as 2nd candidate)
364 pos=m_lowPtBoardOut->getPos(chip,lowPt2ndBlock);
365 dev=m_lowPtBoardOut->getDev(chip,lowPt2ndBlock);
367 m_highPtChipOut->setSel(chip,SecondCandidate,2);
368 m_highPtChipOut->setDev(chip,SecondCandidate,dev);
369 m_highPtChipOut->setPos(chip,SecondCandidate,pos);
370 m_highPtChipOut->setHitID(chip,SecondCandidate,lowPt2ndBlock);
371 return;
372 }
373 } else { // 2 HPT Matrix Outputs
374 // HPT 1st
375 pos=m_highPtBoardOut->getPos(chip,highPt1stBlock);
376 dev=m_highPtBoardOut->getDev(chip,highPt1stBlock);
378 m_highPtChipOut->setSel(chip,FirstCandidate,1);
379 m_highPtChipOut->setDev(chip,FirstCandidate,dev);
380 m_highPtChipOut->setPos(chip,FirstCandidate,pos);
381 m_highPtChipOut->setHitID(chip,FirstCandidate,highPt1stBlock);
382 // HPT 2nd
383 pos=m_highPtBoardOut->getPos(chip,highPt2ndBlock);
384 dev=m_highPtBoardOut->getDev(chip,highPt2ndBlock);
386 m_highPtChipOut->setSel(chip,SecondCandidate,2);
387 m_highPtChipOut->setDev(chip,SecondCandidate,dev);
388 m_highPtChipOut->setPos(chip,SecondCandidate,pos);
389 m_highPtChipOut->setHitID(chip,SecondCandidate,highPt2ndBlock);
390 }
391}
392
399
406
413
414
416{
417
418#ifdef TGCCOUT
419 int i,j,k, chip, iBlock, iCandidate;
420 std::cout << "#HighPtBoard::showResult()" << std::endl;
421 std::cout<<"#HPB [Input] bid=" << m_bid;
422 std::cout.width(2);
423 std::cout << " type=" << ((m_type==WHPB) ? "WHPB" : "SHPB" );
424 std::cout.width(2);
425 std::cout << " region=" << ( (m_region==TGCRegionType::FORWARD) ? "FWD" : "END");
426 std::cout.width(2);
427 std::cout << " id=" << m_id << std::endl;
428 for( j=0; j<s_NumberOfTSBOut; j+=1){
429 for( i=0; i<NumberOfChip; i+=1){
430 if(m_TSBOut[i][j]!=0){
431 for( k=0; k<m_TSBOut[i][j]->getNumberOfData(); k+=1)
432 if(m_TSBOut[i][j]->getHit(k)){
433 std::cout << "\t[";
434 std::cout.width(2);
435 std::cout << "type=" << m_TSBOut[i][j]->getOrigin()->getTypeName(m_TSBOut[i][j]->getOrigin()->getType());
436 std::cout.width(2);
437 std::cout << " region=" << ((m_TSBOut[i][j]->getOrigin()->getRegion()==TGCRegionType::ENDCAP) ? "END" : "FWD");
438 std::cout.width(2);
439 std::cout << " id=" <<m_TSBOut[i][j]->getOrigin()->getId();
440 std::cout.width(2);
441 std::cout << " iChip=" << i;
442 std::cout.width(2);
443 std::cout << " iTSBOut=" << j;
444 std::cout.width(2);
445 std::cout << " k=" << k;
446 std::cout.width(3);
447 std::cout << " pos=" << m_TSBOut[i][j]->getPos(k);
448 std::cout << "]" << std::endl;
449 }
450 }
451 if(m_DSBOut[i][j]!=0){
452 for( k=0; k<m_DSBOut[i][j]->getNumberOfData(); k+=1)
453 if(m_DSBOut[i][j]->getHit(k)){
454 std::cout<<"\t[";
455 std::cout.width(2);
456 std::cout << "type=" << m_DSBOut[i][j]->getOrigin()->getTypeName(m_DSBOut[i][j]->getOrigin()->getType());
457 std::cout.width(2);
458 std::cout << " region=" <<((m_DSBOut[i][j]->getOrigin()->getRegion()==TGCRegionType::ENDCAP) ? "END" : "FWD");
459 std::cout.width(2);
460 std::cout << " id=" <<m_DSBOut[i][j]->getOrigin()->getId();
461 std::cout.width(2);
462 std::cout << " i=" << i;
463 std::cout.width(2);
464 std::cout << " j=" << j;
465 std::cout.width(2);
466 std::cout << " k=" << k;
467 std::cout.width(3);
468 std::cout << " pos=" << m_DSBOut[i][j]->getPos(k);
469 std::cout.width(3);
470 std::cout << " dev=" << m_DSBOut[i][j]->getDev(k);
471 std::cout << "]" << std::endl;
472 }
473 }
474 }
475 }
476 std::cout<<std::endl;
477
478 std::cout << "#HPB [Intermediate] bid=" << m_bid;
479 std::cout.width(2);
480 std::cout << " type=" << ((m_type==WHPB) ? "WHPB" : "SHPB" );
481 std::cout.width(2);
482 std::cout << " region=" << ( (m_region==TGCRegionType::FORWARD) ? "FWD" : "END");
483 std::cout.width(2);
484 std::cout << " id=" << m_id << std::endl;
485 for( chip=0; chip<NumberOfChip; chip+=1){
486 std::cout<<"\t[";
487 std::cout.width(2);
488 std::cout << "iChip=" << chip << "]" << std::endl;
489
490 // m_highPtBoardOut
491 for(iBlock=0; iBlock<NBlockOfDSBChannel; iBlock+=1){
492 std::cout<<"\t [highPtBoardOut: ";
493 std::cout.width(2);
494 std::cout << "block=" << iBlock;
495 if(m_highPtBoardOut->getHit(chip,iBlock)){
496 std::cout.width(2);
497 std::cout << " pos=" << m_highPtBoardOut->getPos(chip,iBlock);
498 std::cout.width(4);
499 std::cout << " dev=" << m_highPtBoardOut->getDev(chip,iBlock);
500 }
501 std::cout << "]" << std::endl;
502 }
503
504 // m_lowPtBoardOut
505 for(iBlock=0; iBlock<NBlockOfDSBChannel; iBlock+=1){
506 std::cout<<"\t [lowPtBoardOut: ";
507 std::cout.width(2);
508 std::cout << "block=" << iBlock;
509 if(m_lowPtBoardOut->getHit(chip,iBlock)){
510 std::cout.width(2);
511 std::cout << " pos=" << m_lowPtBoardOut->getPos(chip,iBlock);
512 std::cout.width(4);
513 std::cout << " dev=" << m_lowPtBoardOut->getDev(chip,iBlock);
514 }
515 std::cout << "]" << std::endl;
516 }
517 }
518
519 std::cout << "#HPB [Output] bid=" << m_bid;
520 std::cout.width(2);
521 std::cout << " type=" << ((m_type==WHPB) ? "WHPB" : "SHPB" );
522 std::cout.width(2);
523 std::cout << " region=" << ( (m_region==TGCRegionType::FORWARD) ? "FWD" : "END");
524 std::cout.width(2);
525 std::cout << " id=" << m_id << std::endl;
526 for( chip=0; chip<NumberOfChip; chip+=1){
527 std::cout<<"\t[";
528 std::cout.width(2);
529 std::cout << "iChip=" << chip << "]" << std::endl;
530 for( iCandidate=0; iCandidate<2; iCandidate+=1){
531 if(m_highPtChipOut->getSel(chip,iCandidate)){
532 std::cout<<"\t [";
533 std::cout.width(2);
534 std::cout << "HitID=" << m_highPtChipOut->getHitID(chip,iCandidate);
535 std::cout << " Sel:" << m_highPtChipOut->getSel(chip,iCandidate);
536 if(m_highPtChipOut->getPt(chip,iCandidate)==PtHigh)
537 std::cout<<" Pt:1[high]";
538 else
539 std::cout<<" Pt:0[low ]";
540 std::cout.width(2);
541 std::cout << " pos=" << m_highPtChipOut->getPos(chip,iCandidate);
542 std::cout.width(4);
543 std::cout << " dev=" << m_highPtChipOut->getDev(chip,iCandidate);
544 std::cout << "]" << std::endl;
545 }
546 }
547 }
548#endif
549}
550
551} // namespace LVL1TGCTrigger
static Double_t a
TGCHighPtBoardOut * m_lowPtBoardOut
TGCHighPtBoardOut * m_highPtBoardOut
virtual void clearDecoderIn()=0
static constexpr int s_NumberOfTSBOut
virtual void doCoincidenceMatrix(int chip, int block, const TGCHitPattern *tHit, const TGCHitPattern *dHit)=0
TGCHighPtChipOut * m_highPtChipOut
TGCSlaveBoard * m_DSB[NumberOfChip][s_NumberOfDSBOut]
virtual void decodeSlaveBoardOut(int chip, TGCHitPattern *tHit, TGCHitPattern *dHit)=0
TGCSlaveBoard * m_TSB[NumberOfChip][s_NumberOfTSBOut]
static constexpr int s_NumberOfDSBOut
virtual void highLowSelector(int chip)
void loadLowPtOutput(int chip, int block, TGCSlaveBoardOut *dataDSB)
TGCSlaveBoardOut * m_DSBOut[NumberOfChip][s_NumberOfDSBOut]
TGCSlaveBoardOut * getTSBOut(int chip, int port)
TGCSlaveBoardOut * m_decoderInTSB[NumberOfChip][NDecoderInTSB]
TGCHighPtBoard * m_adjacentHPB[NumberOfAdjacentHPB]
TGCSlaveBoardOut * m_TSBOut[NumberOfChip][s_NumberOfTSBOut]
void trackSelector(int chip, int ptIn)
TGCRegionType getRegion() const
TGCSlaveBoardOut * m_decoderInDSB[NumberOfChip][NDecoderInDSB]
const int NumberOfAdjacentHPB
const int NBlockOfDSBChannel
const int NDecoderInDSB
const int NumberOfChip
const int NDecoderInTSB