BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
BesMucTrig Class Reference

#include <BesMucTrig.h>

Public Member Functions

 BesMucTrig ()
 ~BesMucTrig ()
void startMucTrig ()
std::vector< int > getNlayerSeg ()
int getNlayerPart (int part)
std::vector< int > getNhitLayer ()
std::vector< int > getNhitSeg ()
int getNhitPart (int i)
int getNhitTotal ()
void setIndex ()
void readIndex ()
void findTrack ()

Detailed Description

Definition at line 10 of file BesMucTrig.h.

Constructor & Destructor Documentation

◆ BesMucTrig()

BesMucTrig::BesMucTrig ( )

Definition at line 27 of file BesMucTrig.cxx.

27 {
28 m_MucTrigHit = MucTrigHit::get_Muc();
29
30 readIndex();
31}
void readIndex()
static MucTrigHit * get_Muc(void)

◆ ~BesMucTrig()

BesMucTrig::~BesMucTrig ( )

Definition at line 33 of file BesMucTrig.cxx.

33{}

Member Function Documentation

◆ findTrack()

void BesMucTrig::findTrack ( )

Definition at line 113 of file BesMucTrig.cxx.

113 {
114 // find tracks in barrel
115 for ( int i = 0; i < 8; i++ )
116 {
117 trackBR[i] = 0;
118 track3lBR[i] = 0;
119 if ( i != 2 )
120 {
121 for ( unsigned int j = 0; j < vindexb.size(); j++ )
122 {
123 int ly1, ly2, ly3, ly4;
124 ly1 = vindexb[j][0];
125 ly2 = vindexb[j][1] - 10;
126 ly3 = vindexb[j][2] - 20;
127 ly4 = vindexb[j][3] - 30;
128 if ( ( foBR[i][0][ly1] + foBR[i][1][ly2] + foBR[i][2][ly3] + foBR[i][3][ly4] ) >= 3 )
129 {
130 trackBR[i]++;
131 break;
132 }
133 if ( foBR[i][0][ly1] == 1 && foBR[i][2][ly3] == 1 )
134 {
135 trackBR[i]++;
136 break;
137 }
138 if ( foBR[i][1][ly2] == 1 && foBR[i][3][ly4] == 1 )
139 {
140 trackBR[i]++;
141 break;
142 }
143 }
144
145 for ( unsigned int j = 0; j < vindexb.size(); j++ )
146 {
147 int ly1, ly2, ly3, ly4;
148 ly1 = vindexb[j][0];
149 ly2 = vindexb[j][1] - 10;
150 ly3 = vindexb[j][2] - 20;
151 ly4 = vindexb[j][3] - 30;
152 if ( ( foBR[i][0][ly1] + foBR[i][1][ly2] + foBR[i][2][ly3] + foBR[i][3][ly4] ) >= 3 )
153 {
154 track3lBR[i]++;
155 break;
156 }
157 }
158 }
159 if ( i == 2 )
160 {
161 for ( unsigned int j = 0; j < vindexb3.size(); j++ )
162 {
163 int ly1, ly2, ly3, ly4;
164 ly1 = vindexb3[j][0];
165 ly2 = vindexb3[j][1] - 10;
166 ly3 = vindexb3[j][2] - 20;
167 ly4 = vindexb3[j][3] - 30;
168 if ( ( foBR[i][0][ly1] + foBR[i][1][ly2] + foBR[i][2][ly3] + foBR[i][3][ly4] ) >= 3 )
169 {
170 trackBR[i]++;
171 break;
172 }
173 if ( foBR[i][0][ly1] == 1 && foBR[i][2][ly3] == 1 )
174 {
175 trackBR[i]++;
176 break;
177 }
178 if ( foBR[i][1][ly2] == 1 && foBR[i][3][ly4] == 1 )
179 {
180 trackBR[i]++;
181 break;
182 }
183 }
184
185 for ( unsigned int j = 0; j < vindexb3.size(); j++ )
186 {
187 int ly1, ly2, ly3, ly4;
188 ly1 = vindexb3[j][0];
189 ly2 = vindexb3[j][1] - 10;
190 ly3 = vindexb3[j][2] - 20;
191 ly4 = vindexb3[j][3] - 30;
192 if ( ( foBR[i][0][ly1] + foBR[i][1][ly2] + foBR[i][2][ly3] + foBR[i][3][ly4] ) >= 3 )
193 {
194 track3lBR[i]++;
195 break;
196 }
197 }
198 }
199 }
200
201 // find tracks in endcaps
202 for ( int i = 0; i < 4; i++ )
203 {
204 trackEE[i] = 0;
205 trackWE[i] = 0;
206 track3lEE[i] = 0;
207 track3lWE[i] = 0;
208 for ( unsigned int j = 0; j < vindexe.size(); j++ )
209 {
210 int ly1, ly2, ly3, ly4;
211 ly1 = vindexe[j][0];
212 ly2 = vindexe[j][1] - 10;
213 ly3 = vindexe[j][2] - 20;
214 ly4 = vindexe[j][3] - 30;
215 // for east endcap
216 if ( ( foEC[0][i][0][ly1] + foEC[0][i][1][ly2] + foEC[0][i][2][ly3] +
217 foEC[0][i][3][ly4] ) >= 3 )
218 {
219 trackEE[i]++;
220 break;
221 }
222 if ( foEC[0][i][0][ly1] == 1 && foEC[0][i][2][ly3] == 1 )
223 {
224 trackEE[i]++;
225 break;
226 }
227 if ( foEC[0][i][1][ly2] == 1 && foEC[0][i][3][ly4] == 1 )
228 {
229 trackEE[i]++;
230 break;
231 }
232 }
233
234 for ( unsigned int j = 0; j < vindexe.size(); j++ )
235 {
236 int ly1, ly2, ly3, ly4;
237 ly1 = vindexe[j][0];
238 ly2 = vindexe[j][1] - 10;
239 ly3 = vindexe[j][2] - 20;
240 ly4 = vindexe[j][3] - 30;
241 // for west endcap
242 if ( ( foEC[1][i][0][ly1] + foEC[1][i][1][ly2] + foEC[1][i][2][ly3] +
243 foEC[1][i][3][ly4] ) >= 3 )
244 {
245 trackWE[i]++;
246 break;
247 }
248 if ( foEC[1][i][0][ly1] == 1 && foEC[1][i][2][ly3] == 1 )
249 {
250 trackWE[i]++;
251 break;
252 }
253 if ( foEC[1][i][1][ly2] == 1 && foEC[1][i][3][ly4] == 1 )
254 {
255 trackWE[i]++;
256 break;
257 }
258 }
259
260 for ( unsigned int j = 0; j < vindexe.size(); j++ )
261 {
262 int ly1, ly2, ly3, ly4;
263 ly1 = vindexe[j][0];
264 ly2 = vindexe[j][1] - 10;
265 ly3 = vindexe[j][2] - 20;
266 ly4 = vindexe[j][3] - 30;
267 // for east endcap
268 if ( ( foEC[0][i][0][ly1] + foEC[0][i][1][ly2] + foEC[0][i][2][ly3] +
269 foEC[0][i][3][ly4] ) >= 3 )
270 {
271 track3lEE[i]++;
272 break;
273 }
274 }
275 for ( unsigned int j = 0; j < vindexe.size(); j++ )
276 {
277 int ly1, ly2, ly3, ly4;
278 ly1 = vindexe[j][0];
279 ly2 = vindexe[j][1] - 10;
280 ly3 = vindexe[j][2] - 20;
281 ly4 = vindexe[j][3] - 30;
282 // for west endcap
283 if ( ( foEC[1][i][0][ly1] + foEC[1][i][1][ly2] + foEC[1][i][2][ly3] +
284 foEC[1][i][3][ly4] ) >= 3 )
285 {
286 track3lWE[i]++;
287 break;
288 }
289 }
290 }
291
292 // count the tracks in barrel and endcaps
293 btrack = 0;
294 etrack = 0;
295 int b3ltrack = 0, e3ltrack = 0;
296 for ( int i = 0; i < 8; i++ )
297 {
298 btrack = btrack + trackBR[i];
299 b3ltrack = b3ltrack + track3lBR[i];
300 }
301 for ( int i = 0; i < 4; i++ )
302 {
303 etrack = etrack + trackEE[i] + trackWE[i];
304 e3ltrack = e3ltrack + track3lWE[i] + track3lEE[i];
305 }
306
307 // cosmic ray experiment, MUC trigger, 3v7 or 4v8; Or use 3v7 only; Note: use 3/4 logic in
308 // both cases
309 bool mucBB3478 = false, mucBB37 = false;
310 if ( ( track3lBR[2] > 0 && track3lBR[6] > 0 ) || ( track3lBR[3] > 0 && track3lBR[7] > 0 ) )
311 mucBB3478 = true;
312 if ( track3lBR[2] > 0 && track3lBR[6] > 0 ) mucBB37 = true;
313
314 // set muc trigger conditions
315 m_pIBGT->setMucBB3478( mucBB3478 );
316 m_pIBGT->setMucBB37( mucBB37 );
317
318 // set value in service
319 m_pIBGT->setMucNtrackBR( btrack );
320 m_pIBGT->setMucNtrackEC( etrack );
321 m_pIBGT->setMucN3ltrackTotal( b3ltrack + e3ltrack );
322}

Referenced by startMucTrig().

◆ getNhitLayer()

std::vector< int > BesMucTrig::getNhitLayer ( )

Definition at line 386 of file BesMucTrig.cxx.

386 {
387 vhitLayer.clear();
388
389 for ( int i = 0; i < 8; i++ )
390 for ( int j = 0; j < 4; j++ )
391 {
392 if ( nhitLayerBR[i][j] != 0 )
393 {
394 // 1000: barrel, i*100: ith segment, j*10: jth gap, nhitLayerBR[i][j]: the number of
395 // hits
396 int hit = 1000 + i * 100 + j * 10 + nhitLayerBR[i][j];
397 vhitLayer.push_back( hit );
398 }
399 }
400
401 for ( int i = 0; i < 2; i++ )
402 for ( int j = 0; j < 4; j++ )
403 for ( int k = 0; k < 4; k++ )
404 {
405 if ( nhitLayerEC[i][j][k] != 0 )
406 {
407 int hit;
408 // 0: east endcaps, j*100: jth segment, k*10: kth gap, nhitLayerEC[i][j][k]: the
409 // number of hits
410 if ( i == 0 ) hit = 0 + j * 100 + k * 10 + nhitLayerEC[i][j][k];
411 // 2000: west endcap, j*100: jth segment, k*10: kth gap, nhitLayerEC[i][j][k]: the
412 // number of hits
413 else hit = 2000 + j * 100 + k * 10 + nhitLayerEC[i][j][k];
414 vhitLayer.push_back( hit );
415 }
416 }
417 return vhitLayer;
418}

◆ getNhitPart()

int BesMucTrig::getNhitPart ( int i)

Definition at line 449 of file BesMucTrig.cxx.

449 {
450 if ( i == 1 ) return nhitBR;
451 if ( i == 0 ) return nhitEC[0];
452 if ( i == 2 ) return nhitEC[1];
453
454 return -1;
455}

◆ getNhitSeg()

std::vector< int > BesMucTrig::getNhitSeg ( )

Definition at line 420 of file BesMucTrig.cxx.

420 {
421 vhitSeg.clear();
422
423 for ( int i = 0; i < 8; i++ )
424 {
425 if ( nhitSegBR[i] != 0 )
426 {
427 // 1000: barrel, i*100: ith segment,tSegBR[i]: the number of hits
428 int hit = 1000 + i * 100 + nhitSegBR[i];
429 vhitSeg.push_back( hit );
430 }
431 }
432
433 for ( int i = 0; i < 2; i++ )
434 for ( int j = 0; j < 4; j++ )
435 {
436 if ( nhitSegEC[i][j] != 0 )
437 {
438 int hit;
439 // 0: east endcaps, j*100: jth segment, nhitSegEC[i][j]: the number of hits
440 if ( i == 0 ) hit = 0 + j * 100 + nhitSegEC[i][j];
441 // 2000: west endcap, j*100: jth segment, nhitSegEC[i][j]: the number of hits
442 else hit = 2000 + j * 100 + nhitSegEC[i][j];
443 vhitSeg.push_back( hit );
444 }
445 }
446 return vhitSeg;
447}

◆ getNhitTotal()

int BesMucTrig::getNhitTotal ( )

Definition at line 457 of file BesMucTrig.cxx.

457 {
458 int total = nhitBR + nhitEC[0] + nhitEC[1];
459 return total;
460}

◆ getNlayerPart()

int BesMucTrig::getNlayerPart ( int part)

Definition at line 359 of file BesMucTrig.cxx.

359 {
360 int nLayerBR = 0, nLayerWE = 0, nLayerEE = 0;
361 // count the barrel fired layer number
362 for ( int i = 0; i < 8; i++ )
363 for ( int j = 0; j < 4; j++ )
364 {
365 if ( nfireLayerBR[i][j] == 1 ) { nLayerBR++; }
366 }
367 // count each endcap fired layer number
368 for ( int i = 0; i < 2; i++ )
369 for ( int j = 0; j < 4; j++ )
370 for ( int k = 0; k < 4; k++ )
371 {
372 if ( nfireLayerEC[i][j][k] == 1 )
373 {
374 if ( i == 0 ) nLayerEE++;
375 if ( i == 1 ) nLayerWE++;
376 }
377 }
378
379 if ( part == 0 ) return nLayerEE;
380 if ( part == 1 ) return nLayerBR;
381 if ( part == 2 ) return nLayerWE;
382
383 return -1;
384}

◆ getNlayerSeg()

std::vector< int > BesMucTrig::getNlayerSeg ( )

Definition at line 324 of file BesMucTrig.cxx.

324 {
325 vfireLayer.clear();
326
327 for ( int i = 0; i < 8; i++ )
328 {
329 int nlayer = 0;
330 for ( int j = 0; j < 4; j++ )
331 {
332 if ( nfireLayerBR[i][j] == 1 ) { nlayer++; }
333 }
334 if ( nlayer != 0 )
335 {
336 nlayer = 100 + i * 10 + nlayer; // 100: part(barrel), i*10: segment
337 vfireLayer.push_back( nlayer );
338 }
339 }
340
341 for ( int i = 0; i < 2; i++ )
342 for ( int j = 0; j < 4; j++ )
343 {
344 int nlayer = 0;
345 for ( int k = 0; k < 4; k++ )
346 {
347 if ( nfireLayerEC[i][j][k] == 1 ) { nlayer++; }
348 }
349 if ( nlayer != 0 )
350 {
351 if ( i == 0 ) nlayer = 0 + j * 10 + nlayer; // 0: east endcaps, j*10: jth segment
352 else nlayer = 200 + j * 10 + nlayer; // 200: west endcap, j*10: jth segment
353 vfireLayer.push_back( nlayer );
354 }
355 }
356 return vfireLayer;
357}

◆ readIndex()

void BesMucTrig::readIndex ( )

Definition at line 464 of file BesMucTrig.cxx.

464 {
465 fstream infile1;
466 fstream infile2;
467 fstream infile3;
468
469 vindexb.clear();
470 vindexb3.clear();
471 vindexe.clear();
472
473 std::string filename = std::string( getenv( "TRIGGERROOT" ) );
474 std::string filename1 =
475 filename + "/data/mufield0.5_1.5GeV_cos0.76_phi456thseg_index_select.txt";
476 std::string filename2 =
477 filename + "/data/mufield0.5_1.5GeV_cos0.76_phi234thseg_index_select.txt";
478 std::string filename3 = filename + "/data/mufield0.5_1.5GeV_ee2_index_select.txt";
479 infile1.open( filename1.c_str(), ios_base::in );
480 infile2.open( filename2.c_str(), ios_base::in );
481 infile3.open( filename3.c_str(), ios_base::in );
482
483 char line[255];
484 char* token;
485 std::string str;
486
487 if ( !infile1 ) cout << "open file1 failture" << endl;
488 while ( infile1 )
489 {
490 infile1.getline( line, 255 );
491 token = strtok( line, " " );
492 int num = 0;
493 std::vector<int> tmp;
494 tmp.clear();
495 do {
496 if ( token )
497 {
498 str = token;
499 token = strtok( NULL, " " );
500 int Index = atoi( str.c_str() );
501 if ( num != 0 ) tmp.push_back( Index );
502 num++;
503 }
504 else continue;
505 } while ( token != NULL );
506 if ( tmp.size() == 4 ) vindexb.push_back( tmp );
507 }
508 cout << "total " << vindexb.size() << " index in barrel have been read!" << endl;
509
510 if ( !infile2 ) cout << "open file2 failture" << endl;
511 while ( infile2 )
512 {
513 infile2.getline( line, 255 );
514 token = strtok( line, " " );
515 int num = 0;
516 std::vector<int> tmp;
517 tmp.clear();
518 do {
519 if ( token )
520 {
521 str = token;
522 token = strtok( NULL, " " );
523 int Index = atoi( str.c_str() );
524 if ( num != 0 ) tmp.push_back( Index );
525 num++;
526 }
527 else continue;
528 } while ( token != NULL );
529 if ( tmp.size() == 4 ) vindexb3.push_back( tmp );
530 }
531 cout << "total " << vindexb3.size() << " index in barrel 3 have been read!" << endl;
532
533 if ( !infile3 ) cout << "open file3 failture" << endl;
534 while ( infile3 )
535 {
536 infile3.getline( line, 255 );
537 token = strtok( line, " " );
538 int num = 0;
539 std::vector<int> tmp;
540 tmp.clear();
541 do {
542 if ( token )
543 {
544 str = token;
545 token = strtok( NULL, " " );
546 int Index = atoi( str.c_str() );
547 if ( num != 0 ) tmp.push_back( Index );
548 num++;
549 }
550 else continue;
551 } while ( token != NULL );
552 if ( tmp.size() == 4 ) vindexe.push_back( tmp );
553 }
554 cout << "total " << vindexe.size() << " index in endcap have been read!" << endl;
555
556 infile1.close();
557 infile2.close();
558 infile3.close();
559}
Index
Definition EvtCyclic3.hh:19

Referenced by BesMucTrig().

◆ setIndex()

void BesMucTrig::setIndex ( )

Definition at line 462 of file BesMucTrig.cxx.

462{ m_pIBGT->setMucIndex( vIndex ); }

Referenced by startMucTrig().

◆ startMucTrig()

void BesMucTrig::startMucTrig ( )

Definition at line 35 of file BesMucTrig.cxx.

35 {
36 ISvcLocator* svcLocator = Gaudi::svcLocator();
37 StatusCode sc = svcLocator->service( "BesGlobalTrigSvc", m_tmpSvc );
38 m_pIBGT = dynamic_cast<BesGlobalTrigSvc*>( m_tmpSvc );
39
40 // reset values
41 for ( int i = 0; i < 8; i++ )
42 {
43 nhitSegBR[i] = 0;
44 for ( int j = 0; j < 4; j++ )
45 {
46 nfireLayerBR[i][j] = 0;
47 nhitLayerBR[i][j] = 0;
48 }
49 }
50 nhitBR = 0;
51
52 for ( int i = 0; i < 2; i++ )
53 {
54 nhitEC[i] = 0;
55 for ( int j = 0; j < 4; j++ )
56 {
57 nhitSegEC[i][j] = 0;
58 for ( int k = 0; k < 4; k++ )
59 {
60 nfireLayerEC[i][j][k] = 0;
61 nhitLayerEC[i][j][k] = 0;
62 }
63 }
64 }
65
66 vIndex.clear();
67
68 m_MucTrigHit->getFastOr(); // run fastOr algorithm
69
70 // reset values and get fastOr signal from class MucTrigHit
71 for ( int i = 0; i < 8; i++ )
72 for ( int j = 0; j < 4; j++ )
73 for ( int k = 0; k < 7; k++ )
74 {
75 foBR[i][j][k] = 0;
76 foBR[i][j][k] = m_MucTrigHit->getfoBR( i, j, k );
77 if ( foBR[i][j][k] == 1 )
78 {
79 nfireLayerBR[i][j] = 1; // fired layer Id of barrel
80 nhitLayerBR[i][j] += 1; // Hit number in each layer of barrel
81 nhitSegBR[i] += 1; // hit number in each segment of barrel
82 nhitBR += 1; // hit number in barrel
83 // 1000: barrel, i*100: segment, j*10: gap, k: strip
84 int index = 1000 + i * 100 + j * 10 + k;
85 vIndex.push_back( index );
86 }
87 }
88
89 for ( int i = 0; i < 2; i++ )
90 for ( int j = 0; j < 4; j++ )
91 for ( int k = 0; k < 4; k++ )
92 for ( int l = 0; l < 4; l++ )
93 {
94 foEC[i][j][k][l] = 0;
95 foEC[i][j][k][l] = m_MucTrigHit->getfoEC( i, j, k, l );
96 if ( foEC[i][j][k][l] == 1 )
97 {
98 nfireLayerEC[i][j][k] = 1; // fired layer Id of endcaps
99 nhitLayerEC[i][j][k] += 1; // hit number in each layer of endcaps
100 nhitSegEC[i][j] += 1; // hit number in each segment of endcaps
101 nhitEC[i] += 1; // hit number in endcaps
102 int index;
103 // 0: east endcap, 2000: west endcap, j*100: segment, k*10: gap, l: strip
104 if ( i == 0 ) index = 0 + j * 100 + k * 10 + l;
105 if ( i == 1 ) index = 2000 + j * 100 + k * 10 + l;
106 vIndex.push_back( index );
107 }
108 }
109
110 setIndex();
111 findTrack();
112}
void setIndex()
void findTrack()

The documentation for this class was generated from the following files: