ATLAS Offline Software
Loading...
Searching...
No Matches
TGCStripHighPtBoard.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include <iostream>
7#include <cstdlib>
8
9namespace LVL1TGCTrigger {
10
22
23
69
71{
73 if(m_decoderInTSB[ChipA][0]) delete m_decoderInTSB[ChipA][0];
74 if(m_decoderInTSB[ChipA][1]) delete m_decoderInTSB[ChipA][1];
75 if(m_decoderInTSB[ChipA][2]) delete m_decoderInTSB[ChipA][2];
76 if(m_decoderInTSB[ChipB][0]) delete m_decoderInTSB[ChipB][0];
77 if(m_decoderInTSB[ChipB][1]) delete m_decoderInTSB[ChipB][1];
78 }
79 int chip,j;
80 for( chip=0; chip<NumberOfChip; chip+=1){
81 for( j=0; j<NDecoderInTSB; j+=1) m_decoderInTSB[chip][j]=0;
82 for( j=0; j<NDecoderInDSB; j+=1) m_decoderInDSB[chip][j]=0;
83 }
84}
85
87 TGCSlaveBoardOut* SBOut)
88{
89 // divide output of TripletSlaveBoard to distribute to decoder channels.
90 // SBOut out
91 // a -> (iSet=0)
92 // b -> (iSet=0)
93 // c -> (iSet=0)
94 // d -> (iSet=0)
95 // a -> (iSet=1)
96 // b -> (iSet=1)
97 // c -> (iSet=1)
98 // d -> (iSet=1)
99
100 if(SBOut!=0)
101 {
102 TGCSlaveBoardOut* out =
103 new TGCSlaveBoardOut(SBOut->getOrigin(), SBOut->getBid());
104 int nData = SBOut->getNumberOfData();// total number of block
105 out->setNumberOfData(nData/2);
106
107 int i;
108 for( i=0; i< out->getNumberOfData(); i+=1)
109 {
110 out->setDev(i,SBOut->getDev((nData/2)*iSet+i));
111 out->setPos(i,SBOut->getPos((nData/2)*iSet+i));
112 out->setHit(i,SBOut->getHit((nData/2)*iSet+i));
113 out->setbPos(i,SBOut->getPos((nData/2)*iSet+i));
114 }
115 return out;
116 }
117 else
118 {
119 return 0;
120 }
121}
122
123
125 TGCHitPattern* tHit,
126 TGCHitPattern* dHit)
127{
128 int block,j,ch;
129 // input from TripletSlaveBoard
130#ifdef TGCCOUT
131 std::cout << "#--Strip decodeSlaveBoardOut()" << std::endl;
132 std::cout << "Triplet" << std::endl;
133#endif
134
135 for( j=0; j<NDecoderInSTSB; j+=1) {
136 if(m_decoderInTSB[chip][j]!=0) {
137#ifdef TGCCOUT
138 std::cout << "index:" << j << "/" << NDecoderInSTSB-1 << " in a chip ";
139 std::cout<<"SHPB:decoderInTSB["<<chip<<"]["<<j<<"]:";
140 m_decoderInTSB[chip][j]->print();
141#endif
142 for( block=0; block<m_decoderInTSB[chip][j]->getNumberOfData(); block+=1) {
143 if(m_decoderInTSB[chip][j]->getHit(block)) {
144 // input to the 2nd Decoder.
145 if(j>0) {
146 ch=(j-1)*m_nChOfTSBOut+block*m_nChInTSBRegion
147 +m_decoderInTSB[chip][j]->getPos(block);
148 if((ch>=0)&&(ch<m_nChOfTSBHit))
149 tHit->onChannel(ch);
150#ifdef TGCCOUT
151 else
152 std::cout<<"decodeSlaveBoardOut ch= "<<ch<<std::endl;
153#endif
154 }
155
156 // input to the 2nd Decoder.
158 +m_decoderInTSB[chip][j]->getPos(block);
159 if((ch>=0)&&(ch<m_nChOfTSBHit))
160 tHit->onChannel(ch);
161#ifdef TGCCOUT
162 else
163 std::cout<<"decodeSlaveBoardOut ch= "<<ch<<std::endl;
164#endif
165 // input to the 1st Decoder.
166 if(j<NDecoderInSTSB){
167 ch=(j+1)*m_nChOfTSBOut+block*m_nChInTSBRegion
168 +m_decoderInTSB[chip][j]->getPos(block);
169 if((ch>=0)&&(ch<m_nChOfTSBHit))
170 tHit->onChannel(ch);
171#ifdef TGCCOUT
172 else
173 std::cout<<"decodeSlaveBoardOut ch= "<<ch<<std::endl;
174#endif
175 }
176 }
177 }
178 }
179 }
180
181 // input from DoubletSlaveBoard.
182#ifdef TGCCOUT
183 std::cout << "Doublet" << std::endl;
184#endif
185 for( j=0; j<NDecoderInDSB; j+=1){
186 if(m_decoderInDSB[chip][j]!=0) {
187#ifdef TGCCOUT
188 std::cout << "index:" << j << "/" << NDecoderInDSB-1 << " in a chip ";
189 std::cout<<"SHPB:decoderInDSB["<<chip<<"]["<<j<<"]:";
190 m_decoderInDSB[chip][j]->print();
191#endif
192 for( block=0; block<m_decoderInDSB[chip][j]->getNumberOfData(); block+=1) {
193 if(m_decoderInDSB[chip][j]->getHit(block))
195 +m_decoderInDSB[chip][j]->getPos(block));
196 }
197 }
198 }
199}
200
202 int block,
203 const TGCHitPattern* tHit,
204 const TGCHitPattern* dHit)
205{
206 int nChUnitOfDSBHit=m_nChOfDSBHit/NBlockOfDSBChannel;
207 int maxTSBCh=(block+1)*nChUnitOfDSBHit;
208 int minTSBCh=block*nChUnitOfDSBHit;
209#ifdef TGCCOUT
210 std::cout << "# Strip doCoincidenceMatrix() chip:" << chip << " block:" << block << std::endl;
211#endif
212 for(int dev=0; dev<=m_maxDev; dev+=1) {
213 // convert Nonlinear dPhi
214 int dp = getNonLinearDelta(dev);
215 if (dp<0) continue;
216
217 int Oring, DevOrg;
218 int DSBCh, TSBCh;
219 for (int isgn=1; isgn >-2; isgn-=2) {
220 if ( (dev==0) && (isgn==-1) ) continue;
221 for(int i=0; i<nChUnitOfDSBHit; i+=1) {
222 //total ch from doublet in a block
223 if(dev>2*m_maxDev-m_maxDevOred){
224 Oring = 1;
225 DevOrg = 2*m_maxDev-m_maxDevOred + (dev - (2*m_maxDev-m_maxDevOred))*2 - 1;
226 } else {
227 Oring = 0;
228 DevOrg = dev;
229 }
230 for(int ior = 0; ior <= Oring; ior++) {
231 DSBCh = nChUnitOfDSBHit*block + i;
232 TSBCh = DSBCh + isgn*m_priorSign*(DevOrg + ior);
233 if ( ((isgn>0) && ( (block%2==0)||((block%2==1)&&(TSBCh<maxTSBCh)) ) ) || // dphi>=0
234 ((isgn<0) && ( (block%2==1)||((block%2==0)&&(TSBCh>=minTSBCh)) ) ) ){ // dphi<0
235 if(tHit->getChannel(TSBCh) && dHit->getChannel(DSBCh)) {
236#ifdef TGCDEBUG
237 std::cout<< "HighPt" << std::endl
238 << " th&&dh==1 priorSign*dev:" << m_priorSign
239 << "*" << dev
240 << " DSBCh:" << DSBCh
241 << " TSBCh:" << TSBCh << std::endl;
242#endif
243 m_highPtBoardOut->setPt(chip,block,PtHigh);
244 m_highPtBoardOut->setHit(chip,block,true);
245 m_highPtBoardOut->setDev(chip,block,isgn*m_priorSign*dp);
246 // assume that a unit of position is quarter of nch of DSB.
247 m_highPtBoardOut->setPos(chip,block,i/(m_nChOfDSBOut/4)); // !
248 return;
249 }
250 }
251 } // loop ior
252 } // loop i
253 } //loop isgn
254
255 } //loop dev
256 m_highPtBoardOut->setHit(chip,block,false);
257}
258
260{
261 int iblock;
262 int highPt1stBlock, highPt2ndBlock;
263 int lowPt1stBlock, lowPt2ndBlock;
264 int pos, dev;
265 // Get 1st, 2nd candidate block for High-PT
266 highPt1stBlock = -1;
267 highPt2ndBlock = -1;
268 for(iblock=0;iblock<NBlockOfDSBChannel;iblock+=1){
269 switch (m_highPtBoardOut->getSel(chip,iblock)){
270 case 0: // No Hit
271 break;
272 case 1: // 1st candidate
273 highPt1stBlock = iblock;
274 break;
275 case 2: // 2nd candidate
276 highPt2ndBlock = iblock;
277 break;
278 default:
279 break;
280 }
281 }
282 // Get 1st, 2nd candidate block for Low-PT
283 lowPt1stBlock = -1;
284 lowPt2ndBlock = -1;
285 for(iblock=0;iblock<NBlockOfDSBChannel;iblock+=1){
286 switch (m_lowPtBoardOut->getSel(chip,iblock)){
287 case 0: // No Hit
288 break;
289 case 1: // 1st candidate
290 lowPt1stBlock = iblock;
291 break;
292 case 2: // 2nd candidate
293 lowPt2ndBlock = iblock;
294 break;
295 default:
296 break;
297 }
298 }
299
300 if (highPt1stBlock < 0){ //No HPT Matrix Output
301 if (lowPt1stBlock >= 0){
302 // LPT 1st
303 pos=m_lowPtBoardOut->getPos(chip,lowPt1stBlock);
304 dev=m_lowPtBoardOut->getDev(chip,lowPt1stBlock);
306 m_highPtChipOut->setSel(chip,FirstCandidate,1);
307 m_highPtChipOut->setDev(chip,FirstCandidate,dev);
308 m_highPtChipOut->setPos(chip,FirstCandidate,pos);
309 m_highPtChipOut->setHitID(chip,FirstCandidate,lowPt1stBlock);
310 }
311 if (lowPt2ndBlock >= 0){
312 // LPT 2nd
313 pos=m_lowPtBoardOut->getPos(chip,lowPt2ndBlock);
314 dev=m_lowPtBoardOut->getDev(chip,lowPt2ndBlock);
316 m_highPtChipOut->setSel(chip,SecondCandidate,2);
317 m_highPtChipOut->setDev(chip,SecondCandidate,dev);
318 m_highPtChipOut->setPos(chip,SecondCandidate,pos);
319 m_highPtChipOut->setHitID(chip,SecondCandidate,lowPt2ndBlock);
320 }
321 return;
322 } else if (highPt2ndBlock < 0){ // 1 HPT Matrix Output
323 // HPT 1st
324 pos=m_highPtBoardOut->getPos(chip,highPt1stBlock);
325 dev=m_highPtBoardOut->getDev(chip,highPt1stBlock);
326 if ((dev>-8) && (dev<8)) { // check if |dev|<8
328 m_highPtChipOut->setSel(chip,FirstCandidate,1);
329 m_highPtChipOut->setDev(chip,FirstCandidate,dev);
330 m_highPtChipOut->setPos(chip,FirstCandidate,pos);
331 m_highPtChipOut->setHitID(chip,FirstCandidate,highPt1stBlock);
332 }
333
334 if ((lowPt1stBlock >= 0) &&
335 !((lowPt1stBlock == highPt1stBlock) && ((m_lowPtBoardOut->getPos(chip,lowPt1stBlock)) == (m_highPtBoardOut->getPos(chip,highPt1stBlock))))
336 ){ //for vi }
337 // LPT 1st (as 2nd candidate)
338 pos=m_lowPtBoardOut->getPos(chip,lowPt1stBlock);
339 dev=m_lowPtBoardOut->getDev(chip,lowPt1stBlock);
341 m_highPtChipOut->setSel(chip,SecondCandidate,2);
342 m_highPtChipOut->setDev(chip,SecondCandidate,dev);
343 m_highPtChipOut->setPos(chip,SecondCandidate,pos);
344 m_highPtChipOut->setHitID(chip,SecondCandidate,lowPt1stBlock);
345 return;
346 } else if ((lowPt2ndBlock >= 0) &&
347 !((lowPt2ndBlock == highPt1stBlock) && ((m_lowPtBoardOut->getPos(chip,lowPt2ndBlock)) == (m_highPtBoardOut->getPos(chip,highPt1stBlock))))
348 ){
349
350 // LPT 2nd (as 2nd candidate)
351 pos=m_lowPtBoardOut->getPos(chip,lowPt2ndBlock);
352 dev=m_lowPtBoardOut->getDev(chip,lowPt2ndBlock);
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,lowPt2ndBlock);
358 return;
359 }
360 } else { // 2 HPT Matrix Outputs
361 // HPT 1st
362 pos=m_highPtBoardOut->getPos(chip,highPt1stBlock);
363 dev=m_highPtBoardOut->getDev(chip,highPt1stBlock);
364 if ((dev>-8) && (dev<8)) { // check if |dev|<8
366 m_highPtChipOut->setSel(chip,FirstCandidate,1);
367 m_highPtChipOut->setDev(chip,FirstCandidate,dev);
368 m_highPtChipOut->setPos(chip,FirstCandidate,pos);
369 m_highPtChipOut->setHitID(chip,FirstCandidate,highPt1stBlock);
370 }
371 // HPT 2nd
372 pos=m_highPtBoardOut->getPos(chip,highPt2ndBlock);
373 dev=m_highPtBoardOut->getDev(chip,highPt2ndBlock);
374 if ((dev>-8) && (dev<8)) { // check if |dev|<8
376 m_highPtChipOut->setSel(chip,SecondCandidate,2);
377 m_highPtChipOut->setDev(chip,SecondCandidate,dev);
378 m_highPtChipOut->setPos(chip,SecondCandidate,pos);
379 m_highPtChipOut->setHitID(chip,SecondCandidate,highPt2ndBlock);
380 }
381 }
382}
383
385{
386 if (dev >=12) return 8; // set dev=8 in case of out of range
387 else if (dev >=10) return 7;
388 else if (dev >=8) return 6;
389 else if (dev >=6) return 5;
390 else if (dev >=4) return 4;
391 else return dev;
392}
393
394} //end of namespace bracket
TGCHighPtBoardOut * m_lowPtBoardOut
TGCHighPtBoardOut * m_highPtBoardOut
TGCHighPtChipOut * m_highPtChipOut
TGCSlaveBoardOut * m_DSBOut[NumberOfChip][s_NumberOfDSBOut]
TGCSlaveBoardOut * m_decoderInTSB[NumberOfChip][NDecoderInTSB]
TGCSlaveBoardOut * m_TSBOut[NumberOfChip][s_NumberOfTSBOut]
TGCSlaveBoardOut * m_decoderInDSB[NumberOfChip][NDecoderInDSB]
bool getChannel(int iChannel) const
void onChannel(int iChannel)
const TGCSlaveBoard * getOrigin() const
virtual void doCoincidenceMatrix(int chip, int block, const TGCHitPattern *tHit, const TGCHitPattern *dHit)
TGCSlaveBoardOut * divideTSBOut(int iSet, TGCSlaveBoardOut *SBOut)
virtual void decodeSlaveBoardOut(int chip, TGCHitPattern *tHit, TGCHitPattern *dHit)
const int NBlockOfDSBChannel
const int NDecoderInDSB
const int NumberOfChip
const int NDecoderInSTSB
const int NDecoderInTSB