BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EmcCCount.cxx
Go to the documentation of this file.
1//---------------------------------------------------------------------------//
2//// BOOST --- BESIII Object_Oriented Simulation Tool /
3////
4////---------------------------------------------------------------------------/
5////
6////Description:
7////Author: Caogf
8////Created: Feb, 2006
9////Modified:
10////Comment:
11////
12//
13#include "Trigger/EmcCCount.h"
14#include <iostream>
15
16#include "CLHEP/Random/RandGauss.h"
17#include "GaudiKernel/Bootstrap.h"
18#include "GaudiKernel/IDataProviderSvc.h"
19#include "GaudiKernel/ISvcLocator.h"
22
23#include <complex>
24#include <map>
25#include <vector>
26
27using namespace std;
28
32 // reset values
33 EClus_Z = false;
34 WClus_Z = false;
35 // barrel
36 for ( int j = 0; j < TrigConf::TCPHINO_B; j++ )
37 {
38 BClusterPhi[j] = 0;
39 for ( int i = 0; i < TrigConf::TCTHETANO_B; i++ ) { BClusterId[i][j] = 0; }
40 }
41 // endcaps
42 for ( int j = 0; j < TrigConf::TCPHINO_E / 2; j++ )
43 {
44 if ( j < TrigConf::TCPHINO_E / 2 )
45 {
46 WEClusterPhi[j] = 0;
47 EEClusterPhi[j] = 0;
48 }
49 for ( int i = 0; i < TrigConf::TCTHETANO_E; i++ )
50 {
51 EEClusterId[i][j] = 0;
52 WEClusterId[i][j] = 0;
53 }
54 }
55
56 std::vector<double> emcClusE;
57 emcClusE.clear();
58
59 for ( int i = 0; i < TrigConf::TCTHETANO_B; i++ )
60 for ( int j = 0; j < TrigConf::TCPHINO_B; j++ )
61 {
62 /// Find cluster position in barral
63 if ( findCluster( 1, i, j ) )
64 {
65 BClusterId[i][j] = 1;
66 // check cluster z balance for charge track
67 int block_phi = int( j / 5 );
68 if ( ( ( block_phi % 2 == 0 ) && i > 5 ) || ( ( block_phi % 2 == 1 ) && i > 4 ) )
69 WClus_Z = true;
70 else EClus_Z = true;
71 emcClusE.push_back( m_EmcTCFinder->getBTCEnergy( i, j ) );
72 }
73 }
74 // Find cluster position in endcap
75 for ( int i = 0; i < TrigConf::TCTHETANO_E; i++ )
76 for ( int j = 0; j < TrigConf::TCPHINO_E / 2; j++ )
77 {
78 if ( findCluster( 0, i, j ) )
79 {
80 EEClusterId[i][j] = 1;
81 EClus_Z = true;
82 emcClusE.push_back( m_EmcTCFinder->getEETCEnergy( i, j ) );
83 }
84 if ( findCluster( 2, i, j ) )
85 {
86 WEClusterId[i][j] = 1;
87 WClus_Z = true;
88 emcClusE.push_back( m_EmcTCFinder->getWETCEnergy( i, j ) );
89 }
90 }
91 // Find phi position of cluster in barrel
92 for ( int j = 0; j < TrigConf::TCPHINO_B; j++ )
93 for ( int i = 0; i < TrigConf::TCTHETANO_B; i++ )
94 {
95 if ( BClusterId[i][j] == 1 )
96 {
97 BClusterPhi[j] = 1;
98 break;
99 }
100 }
101 // Find phi position of cluster in west endcap
102 for ( int j = 0; j < TrigConf::TCPHINO_E / 2; j++ )
103 for ( int i = 0; i < TrigConf::TCTHETANO_E; i++ )
104 {
105 if ( WEClusterId[i][j] == 1 ) { WEClusterPhi[j] = 1; }
106 }
107 // Find phi position of cluster in east endcap
108 for ( int j = 0; j < TrigConf::TCPHINO_E / 2; j++ )
109 for ( int i = 0; i < TrigConf::TCTHETANO_E; i++ )
110 {
111 if ( EEClusterId[i][j] == 1 ) { EEClusterPhi[j] = 1; }
112 }
113 // for(int i=0;i<TrigConf::TCPHINO_E/2;i++) cout<<"ClusterId output "<<EEClusterPhi[i]<<"
114 // "<<WEClusterPhi[i]<<endl;
115
116 // set number of cluster in barrel and endcaps for service
117 int nbCluster = 0, neeCluster = 0, nweCluster = 0;
118
119 map<int, vector<complex<int>>, greater<int>> mClusId;
120 std::vector<complex<int>> vClusIdBR;
121 std::vector<complex<int>> vClusIdEE;
122 std::vector<complex<int>> vClusIdWE;
123 typedef pair<int, vector<complex<int>>> vpair;
124 vClusIdBR.clear();
125 vClusIdEE.clear();
126 vClusIdWE.clear();
127 mClusId.clear();
128
129 for ( int i = 0; i < TrigConf::TCTHETANO_B; i++ )
130 for ( int j = 0; j < TrigConf::TCPHINO_B; j++ )
131 {
132 int BClusId = BClusterId[i][j];
133 if ( BClusId == 1 )
134 {
135 nbCluster++;
136 complex<int> clusId( i, j );
137 vClusIdBR.push_back( clusId );
138 }
139 }
140 for ( int i = 0; i < TrigConf::TCTHETANO_E; i++ )
141 for ( int j = 0; j < TrigConf::TCPHINO_E / 2; j++ )
142 {
143 if ( EEClusterPhi[j] )
144 {
145 neeCluster++;
146 complex<int> clusId( i, j );
147 vClusIdEE.push_back( clusId );
148 }
149 if ( WEClusterPhi[j] )
150 {
151 nweCluster++;
152 complex<int> clusId( i, j );
153 vClusIdWE.push_back( clusId );
154 }
155 }
156
157 mClusId.insert( vpair( 1, vClusIdBR ) );
158 mClusId.insert( vpair( 0, vClusIdEE ) );
159 mClusId.insert( vpair( 2, vClusIdWE ) );
160
161 ISvcLocator* svcLocator = Gaudi::svcLocator();
162 StatusCode sc = svcLocator->service( "BesGlobalTrigSvc", m_tmpSvc );
163 m_pIBGT = dynamic_cast<BesGlobalTrigSvc*>( m_tmpSvc );
164
165 m_pIBGT->setEmcNbCluster( nbCluster );
166 m_pIBGT->setEmcNweCluster( nweCluster );
167 m_pIBGT->setEmcNeeCluster( neeCluster );
168 m_pIBGT->setEmcClusId( mClusId );
169 m_pIBGT->setEmcClusE( emcClusE );
170}
171
172bool EmcCCount::findCluster( int partId, int TCThetaNb, int TCPhiNb ) {
173 // double L1TC_THRESH = m_pIBGT->getL1TC_THRESH();
174 /*for(int i = 0; ; i++) {
175 double theshold = RandGauss::shoot(m_pIBGT->getL1TC_THRESH(),3.3);
176 if(theshold < m_pIBGT->getL1TC_THRESH()) {
177 L1TC_THRESH = theshold;
178 break;
179 }
180 }*/
181
182 // double energy0,energy1,energy2,energy3,energy4,energy5,energy6,energy7,energy8;
183 int clus0, clus1, clus3, clus4, clus8;
184 /* if(partId==1)
185 {
186 // Cluster Finder Logic
187 // Phi--->
188 // |---|----|----|
189 // | 5 | 1 | 6 |
190 // |---|----|----|
191 // | 2 | 0 | 3 |
192 // |---|----|----| ^
193 // | 7 | 4 | 8 | |
194 // |---|----|----| Theta
195 energy0 = m_EmcTCFinder->getBTCEnergy(TCThetaNb,TCPhiNb);
196 if(energy0>L1TC_THRESH)
197 {
198 //trigger cell index from 0, not 1, so TrigConf::TCTHETANO_B - 1 or TrigConf::TCPHINO_B
199 - 1 needed if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)) energy1 =
200 m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,TCPhiNb); else energy1 = 0.0;
201
202 if(TCPhiNb!=0) energy2 = m_EmcTCFinder->getBTCEnergy(TCThetaNb,TCPhiNb-1);
203 else energy2 = m_EmcTCFinder->getBTCEnergy(TCThetaNb,TrigConf::TCPHINO_B-1);
204
205 if(TCPhiNb!=(TrigConf::TCPHINO_B-1)) energy3 =
206 m_EmcTCFinder->getBTCEnergy(TCThetaNb,TCPhiNb+1); else energy3 =
207 m_EmcTCFinder->getBTCEnergy(TCThetaNb,0);
208
209 if(TCThetaNb!=0) energy4 = m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,TCPhiNb);
210 else energy4 = 0.0;
211
212 if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb!=0) energy5 =
213 m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,TCPhiNb-1); if(TCThetaNb==(TrigConf::TCTHETANO_B-1))
214 energy5 = 0.0; if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb==0) energy5 =
215 m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,TrigConf::TCPHINO_B-1);
216
217 if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb!=(TrigConf::TCPHINO_B-1)) energy6 =
218 m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,TCPhiNb+1); if(TCThetaNb==(TrigConf::TCTHETANO_B-1))
219 energy6 = 0.0; if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb==(TrigConf::TCPHINO_B-1))
220 energy6 = m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,0);
221
222 if(TCThetaNb!=0&&TCPhiNb!=0) energy7 =
223 m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,TCPhiNb-1); if(TCThetaNb==0) energy7=0;
224 if(TCThetaNb!=0&&TCPhiNb==0) energy7 =
225 m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,TrigConf::TCPHINO_B-1);
226
227 if(TCThetaNb!=0&&TCPhiNb!=(TrigConf::TCPHINO_B-1)) energy8 =
228 m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,TCPhiNb+1); if(TCThetaNb==0) energy8 = 0.0;
229 if(TCThetaNb!=0&&TCPhiNb==(TrigConf::TCPHINO_B-1)) energy8 =
230 m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,0);
231
232 if((energy3>=L1TC_THRESH)||(energy1>=L1TC_THRESH)||((energy4>=L1TC_THRESH)&&(energy8>=L1TC_THRESH)))
233 {
234 return false;
235 }
236 else return true;
237 }
238 else return false;
239 }*/
240 if ( partId == 1 )
241 {
242 // Cluster Finder Logic
243 // <---Theta
244 // |---|----|----|
245 // | 5 | 1 | 6 |
246 // |---|----|----|
247 // | 2 | 0 | 3 | Phi
248 // |---|----|----| |
249 // | 7 | 4 | 8 | |
250 // |---|----|----| ^
251 clus0 = m_EmcTCFinder->getBTC( TCThetaNb, TCPhiNb );
252 if ( clus0 > 0 )
253 {
254 // trigger cell index from 0, not 1, so TrigConf::TCTHETANO_B - 1 or TrigConf::TCPHINO_B
255 // - 1 needed
256 if ( TCPhiNb != 0 ) clus1 = m_EmcTCFinder->getBTC( TCThetaNb, TCPhiNb - 1 );
257 else clus1 = m_EmcTCFinder->getBTC( TCThetaNb, TrigConf::TCPHINO_B - 1 );
258
259 // if(TCPhiNb!=0) clus2 = m_EmcTCFinder->getBTC(TCThetaNb,TCPhiNb-1);
260 // else clus2 = m_EmcTCFinder->getBTC(TCThetaNb,TrigConf::TCPHINO_B-1);
261
262 if ( TCThetaNb != 0 ) clus3 = m_EmcTCFinder->getBTC( TCThetaNb - 1, TCPhiNb );
263 else clus3 = 0;
264
265 if ( TCPhiNb != ( TrigConf::TCPHINO_B - 1 ) )
266 clus4 = m_EmcTCFinder->getBTC( TCThetaNb, TCPhiNb + 1 );
267 else clus4 = m_EmcTCFinder->getBTC( TCThetaNb, 0 );
268
269 // if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb!=0) clus5 =
270 // m_EmcTCFinder->getBTC(TCThetaNb+1,TCPhiNb-1);
271 // if(TCThetaNb==(TrigConf::TCTHETANO_B-1)) clus5 = 0;
272 // if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb==0) clus5 =
273 // m_EmcTCFinder->getBTC(TCThetaNb+1,TrigConf::TCPHINO_B-1);
274
275 // if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb!=(TrigConf::TCPHINO_B-1)) clus6
276 // = m_EmcTCFinder->getBTC(TCThetaNb+1,TCPhiNb+1);
277 // if(TCThetaNb==(TrigConf::TCTHETANO_B-1)) clus6 = 0;
278 // if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb==(TrigConf::TCPHINO_B-1)) clus6
279 // = m_EmcTCFinder->getBTC(TCThetaNb+1,0);
280
281 // if(TCThetaNb!=0&&TCPhiNb!=0) clus7 =
282 // m_EmcTCFinder->getBTC(TCThetaNb-1,TCPhiNb-1); if(TCThetaNb==0) clus7 = 0;
283 // if(TCThetaNb!=0&&TCPhiNb==0) clus7 =
284 // m_EmcTCFinder->getBTC(TCThetaNb-1,TrigConf::TCPHINO_B-1);
285
286 if ( TCThetaNb != 0 && TCPhiNb != ( TrigConf::TCPHINO_B - 1 ) )
287 clus8 = m_EmcTCFinder->getBTC( TCThetaNb - 1, TCPhiNb + 1 );
288 if ( TCThetaNb == 0 ) clus8 = 1;
289 if ( TCThetaNb != 0 && TCPhiNb == ( TrigConf::TCPHINO_B - 1 ) )
290 clus8 = m_EmcTCFinder->getBTC( TCThetaNb - 1, 0 );
291
292 // if((clus3 > 0)||(clus1 > 0)||((clus4 > 0)&&(clus8 > 0)))
293 if ( !( ( clus3 > 0 ) || ( clus1 > 0 ) ) && !( ( clus4 > 0 ) && ( clus8 > 0 ) ) )
294 { return true; }
295 else return false;
296 }
297 else return false;
298 }
299 //------------------------------------------------------------------------------------
300 /* Cluster Finder Logic (1)
301 <---phi
302 |---|
303 | 1 |
304 |---|---| /|\
305 | 0 | 2 | |
306 |---|---| theta
307 if(partId==0)
308 {
309 if(TCThetaNb==0)
310 {
311 energy0 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TCPhiNb);
312 energy1 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb+1,TCPhiNb);
313 if(TCPhiNb!=0) energy2 =m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TCPhiNb-1);
314 else energy2 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TrigConf::TCPHINO_E-1);
315 if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)&&(energy2<L1TC_THRESH)) return true;
316 else return false;
317 }
318 if(TCThetaNb==(TrigConf::TCTHETANO_E-1))
319 {
320 energy0 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TCPhiNb);
321 if(TCPhiNb!=0) energy1 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TCPhiNb-1);
322 else energy1 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TrigConf::TCPHINO_E-1);
323 if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)) return true;
324 else return false;
325 }
326 }
327 if(partId==2)
328 {
329 if(TCThetaNb==0)
330 {
331 energy0 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TCPhiNb);
332 energy1 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb+1,TCPhiNb);
333 if(TCPhiNb!=0) energy2 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TCPhiNb-1);
334 else energy2 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TrigConf::TCPHINO_E-1);
335 if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)&&(energy2<L1TC_THRESH)) return true;
336 else return false;
337 }
338 if(TCThetaNb==(TrigConf::TCTHETANO_E-1))
339 {
340 energy0 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TCPhiNb);
341 if(TCPhiNb!=0) energy1 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TCPhiNb-1);
342 else energy1 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TrigConf::TCPHINO_E-1);
343 if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)) return true;
344 else return false;
345 }
346 }
347 */
348 //------------------------------------------------------------------------------------
349 /*Cluster Finder Logic (1)
350 <---phi
351
352 |---|---| /|\
353 | 0 | 1 | |
354 |---|---| theta
355 //if(partId==0)
356 //{
357 // energy0 = m_EmcTCFinder->getEETCEnergy(TCThetaNb,TCPhiNb);
358 // if(TCPhiNb!=0) {
359 // energy1 = m_EmcTCFinder->getEETCEnergy(TCThetaNb,TCPhiNb-1);
360 // }
361 // else {
362 // energy1 = m_EmcTCFinder->getEETCEnergy(TCThetaNb,(TrigConf::TCPHINO_E-1));
363 // }
364 // if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)) return true;
365 // else return false;
366 //}
367
368 if(partId==0)
369 {
370 clus0 = m_EmcTCFinder->getEETC(TCThetaNb,TCPhiNb);
371 if(TCPhiNb!=0) {
372 clus1 = m_EmcTCFinder->getEETC(TCThetaNb,TCPhiNb-1);
373 }
374 else {
375 clus1 = m_EmcTCFinder->getEETC(TCThetaNb,(TrigConf::TCPHINO_E-1));
376 }
377 if((clus0 > 0)&&(clus1 == 0)) return true;
378 else return false;
379 }
380
381 //if(partId==2)
382 //{
383 // energy0 = m_EmcTCFinder->getWETCEnergy(TCThetaNb,TCPhiNb);
384 // if(TCPhiNb!=0) {
385 // energy1 = m_EmcTCFinder->getWETCEnergy(TCThetaNb,TCPhiNb-1);
386 // }
387 // else {
388 // energy1 = m_EmcTCFinder->getWETCEnergy(TCThetaNb,(TrigConf::TCPHINO_E-1));
389 // }
390 // if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)) return true;
391 // else return false;
392 //}
393
394 if(partId==2)
395 {
396 clus0 = m_EmcTCFinder->getWETC(TCThetaNb,TCPhiNb);
397 if(TCPhiNb!=0) {
398 clus1 = m_EmcTCFinder->getWETC(TCThetaNb,TCPhiNb-1);
399 }
400 else {
401 clus1 = m_EmcTCFinder->getWETC(TCThetaNb,(TrigConf::TCPHINO_E-1));
402 }
403 if((clus0 > 0)&&(clus1 == 0)) return true;
404 else return false;
405 }
406 */
407
408 /*Cluster Finder Logic (2)
409 <---phi
410
411 |---|---| /|\
412 | 0 | 1 | |
413 |---|---| theta
414 */
415 if ( partId == 0 )
416 {
417 int etc1, etc2, etc3, etc4;
418 etc1 = m_EmcTCFinder->getEETC( TCThetaNb, TCPhiNb * 2 );
419 etc2 = m_EmcTCFinder->getEETC( TCThetaNb, TCPhiNb * 2 + 1 );
420 if ( etc1 > 0 || etc2 > 0 ) clus0 = 1;
421 else clus0 = 0;
422
423 if ( TCPhiNb != 0 )
424 {
425 etc3 = m_EmcTCFinder->getEETC( TCThetaNb, ( TCPhiNb - 1 ) * 2 );
426 etc4 = m_EmcTCFinder->getEETC( TCThetaNb, ( TCPhiNb - 1 ) * 2 + 1 );
427 if ( etc3 > 0 || etc4 > 0 ) clus1 = 1;
428 else clus1 = 0;
429 }
430 else
431 {
432 etc3 = m_EmcTCFinder->getEETC( TCThetaNb, ( TrigConf::TCPHINO_E / 2 - 1 ) * 2 );
433 etc4 = m_EmcTCFinder->getEETC( TCThetaNb, ( TrigConf::TCPHINO_E / 2 - 1 ) * 2 + 1 );
434 if ( etc3 > 0 || etc4 > 0 ) clus1 = 1;
435 else clus1 = 0;
436 }
437
438 if ( ( clus0 > 0 ) && ( clus1 == 0 ) ) return true;
439 else return false;
440 }
441
442 /*Cluster Finder Logic (2)
443 <---phi
444
445 |---|---| /|\
446 | 1 | 0 | |
447 |---|---| theta
448 */
449 if ( partId == 2 )
450 {
451 int etc1, etc2, etc3, etc4;
452 etc1 = m_EmcTCFinder->getWETC( TCThetaNb, TCPhiNb * 2 );
453 etc2 = m_EmcTCFinder->getWETC( TCThetaNb, TCPhiNb * 2 + 1 );
454 if ( etc1 > 0 || etc2 > 0 ) clus0 = 1;
455 else clus0 = 0;
456
457 if ( TCPhiNb != ( TrigConf::TCPHINO_E / 2 - 1 ) )
458 {
459 etc3 = m_EmcTCFinder->getWETC( TCThetaNb, ( TCPhiNb + 1 ) * 2 );
460 etc4 = m_EmcTCFinder->getWETC( TCThetaNb, ( TCPhiNb + 1 ) * 2 + 1 );
461 if ( etc3 > 0 || etc4 > 0 ) clus1 = 1;
462 else clus1 = 0;
463 }
464 else
465 {
466 etc3 = m_EmcTCFinder->getWETC( TCThetaNb, 0 );
467 etc4 = m_EmcTCFinder->getWETC( TCThetaNb, 1 );
468 if ( etc3 > 0 || etc4 > 0 ) clus1 = 1;
469 else clus1 = 0;
470 }
471
472 if ( ( clus0 > 0 ) && ( clus1 == 0 ) ) return true;
473 else return false;
474 }
475
476 return false;
477}
void setEmcNbCluster(int i)
void getClusterId()
Definition EmcCCount.cxx:31
bool findCluster(int partId, int TCThetaNb, int TCPhiNb)
static EmcTCFinder * get_Emc(void)