ATLAS Offline Software
Loading...
Searching...
No Matches
TGCSSCController.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
9#include <iostream>
10
11namespace LVL1TGCTrigger {
12
13//constructor
19
20// distribute signals to appropriate r-phi coincidence matrix.
22{
24 out->clear();
25
26 for(int HPBid=0; HPBid < m_sectorLogic->getNumberOfWireHighPtBoard(); HPBid++){
27 if(wire[HPBid]==0) continue; // NO wire HIT
28 for(int chip=0; chip<NumberOfChip; chip+=1){
29 for(int iCandidate=1; iCandidate>=0; iCandidate-=1){
30 if(wire[HPBid]->getSel(chip,iCandidate)){
31 // If both candidates has same HitID, ignore 2nd candidate(iCandidate==1).
32 if(iCandidate==1 && (wire[HPBid]->getHitID(chip,1)) == (wire[HPBid]->getHitID(chip,0))) continue;
33 int SSCId = getSSCId(HPBid,chip,wire[HPBid]->getHitID(chip,iCandidate));
34 if(SSCId<m_sectorLogic->getNumberOfSubSectorCluster()){
35 out->setR(SSCId,wire[HPBid]->getPos(chip,iCandidate));
36 out->setDR(SSCId,wire[HPBid]->getDev(chip,iCandidate));
37 out->setPtR(SSCId,wire[HPBid]->getPt(chip,iCandidate));
38 out->setHitR(SSCId,true);
39 }else{
40 std::cerr << "internal error in TGCSSCController::distribute() bid=" << m_sectorLogic->getBid() << " ";
41 std::cerr << " SSCId="<<SSCId<<std::endl;
42 }
43 }
44 }
45 }
46 }
47
48 if(strip==0) return out;
49
50 for(int chip=0; chip<NumberOfChip; chip+=1){
51 for(int iCandidate=1; iCandidate>=0; iCandidate-=1){
52 if( strip->getSel(chip,iCandidate) ){
53 // If both candidates has same HitID, ignore 2nd candidate(iCandidate==1).
54 if(iCandidate==1 && (strip->getHitID(chip,1)) == (strip->getHitID(chip,0))) continue;
55 int chamberNo = getChamberNo(chip,strip->getHitID(chip,iCandidate));
56 //if((chamberNo<0)||(chamberNo >= MaxNumberOfChamberInR)) continue;
57
58 int iPhi = convertPhi(chip,
59 strip->getHitID(chip,iCandidate),
60 strip->getPos(chip,iCandidate) );
61 int PhiPosInSSC = iPhi;
62 if ( PhiPosInSSC > 3 ) continue;
63 out->setPhi(chamberNo, PhiPosInSSC, iPhi);
64 out->setDPhi(chamberNo, PhiPosInSSC,strip->getDev(chip,iCandidate));
65 out->setPtPhi(chamberNo, PhiPosInSSC, strip->getPt(chip,iCandidate));
66 out->setHitPhi(chamberNo, PhiPosInSSC, true);
67
68 // chamber No3 and No4 can not be distiguished because of SHPT bug
69 // input from No3 or No4 are duplicated in both chamber
70 int oredChamber=-1;
71 if (chamberNo==4) oredChamber= 3;
72 if (chamberNo==3) oredChamber= 4;
73 if (tgcArgs()->SHPT_ORED() && (oredChamber>0)) {
74 if(!out->hasHitPhi(oredChamber, PhiPosInSSC)){
75 out->setPhi(oredChamber, PhiPosInSSC, iPhi);
76 out->setDPhi(oredChamber, PhiPosInSSC,strip->getDev(chip,iCandidate));
77 out->setPtPhi(oredChamber, PhiPosInSSC, strip->getPt(chip,iCandidate));
78 out->setHitPhi(oredChamber, PhiPosInSSC, true);
79 }
80 }
81
82 }
83 }
84 }
85 return out;
86}
87
88int TGCSSCController::getSSCId(int nHPB, int chip, int block) const
89{
91 return (block+chip*MaxNumberOfHPBData);
92 } else {
93 return (block+chip*MaxNumberOfHPBData+nHPB*MaxNumberOfHPBData*NumberOfChip-5);
94 }
95}
96
97int TGCSSCController::convertPhi(int /* chip */, int block, int pos) const
98{
99 return (pos + (block%2) * 2);
100}
101
102int TGCSSCController::getChamberNo(int chip, int block) const
103{
105 int chamber = ((block+chip*MaxNumberOfHPBData)/2);
106 if(chamber==5) return (chamber-1);
107 else if(chamber==4) return 0;
108 else return chamber;
109 }
110
111 else return 0;
112}
113
114int TGCSSCController::getPhiPosInSSC(int /* chip */, int block) const
115{
116 return block%2;
117}
118
119} //end of namespace bracket
const TGCSectorLogic * m_sectorLogic
int getSSCId(int nHPB, int chip, int block) const
const TGCArguments * tgcArgs() const
TGCSSCControllerOut * distribute(TGCHighPtChipOut *wire[], TGCHighPtChipOut *strip)
int getPhiPosInSSC(int chip, int block) const
int convertPhi(int chip, int block, int pos) const
int getChamberNo(int chip, int block) const
TGCSSCController(const TGCArguments *, const TGCSectorLogic *sL=0)
const int MaxNumberOfHPBData
const int NumberOfChip