00001
00012
00013 #include "Trigger/EmcCCount.h"
00014 #include <iostream>
00015
00016 #include "Trigger/IBesGlobalTrigSvc.h"
00017 #include "Trigger/BesGlobalTrigSvc.h"
00018 #include "GaudiKernel/ISvcLocator.h"
00019 #include "GaudiKernel/Bootstrap.h"
00020 #include "GaudiKernel/IDataProviderSvc.h"
00021 #include "CLHEP/Random/RandGauss.h"
00022
00023 #include <map>
00024 #include <vector>
00025 #include <complex>
00026
00027 using namespace std;
00028
00029 EmcCCount::EmcCCount()
00030 {
00031 m_EmcTCFinder = EmcTCFinder::get_Emc();
00032 }
00033 EmcCCount::~EmcCCount()
00034 {
00035 }
00036 void EmcCCount::getClusterId()
00037 {
00038
00039 EClus_Z = false;
00040 WClus_Z = false;
00041
00042 for(int j=0;j<TrigConf::TCPHINO_B;j++)
00043 {
00044 BClusterPhi[j] = 0;
00045 for(int i=0;i<TrigConf::TCTHETANO_B;i++)
00046 {
00047 BClusterId[i][j] = 0;
00048 }
00049 }
00050
00051 for(int j =0;j<TrigConf::TCPHINO_E/2;j++)
00052 {
00053 if(j < TrigConf::TCPHINO_E/2) {
00054 WEClusterPhi[j] = 0;
00055 EEClusterPhi[j] = 0;
00056 }
00057 for(int i =0;i<TrigConf::TCTHETANO_E;i++)
00058 {
00059 EEClusterId[i][j] = 0;
00060 WEClusterId[i][j] = 0;
00061 }
00062 }
00063
00064 std::vector<double> emcClusE;
00065 emcClusE.clear();
00066
00067 for(int i=0;i<TrigConf::TCTHETANO_B;i++)
00068 for(int j=0;j<TrigConf::TCPHINO_B;j++)
00069 {
00071 if(findCluster(1,i,j))
00072 {
00073 BClusterId[i][j] = 1;
00074
00075 int block_phi = int (j/5);
00076 if(((block_phi%2 == 0) && i > 5) || ((block_phi%2 == 1) && i > 4)) WClus_Z = true;
00077 else EClus_Z = true;
00078 emcClusE.push_back(m_EmcTCFinder->getBTCEnergy(i,j));
00079 }
00080 }
00081
00082 for(int i =0;i<TrigConf::TCTHETANO_E;i++)
00083 for(int j =0;j<TrigConf::TCPHINO_E/2;j++)
00084 {
00085 if(findCluster(0,i,j)) { EEClusterId[i][j] = 1; EClus_Z = true; emcClusE.push_back(m_EmcTCFinder->getEETCEnergy(i,j)); }
00086 if(findCluster(2,i,j)) { WEClusterId[i][j] = 1; WClus_Z = true; emcClusE.push_back(m_EmcTCFinder->getWETCEnergy(i,j)); }
00087 }
00088
00089 for(int j = 0;j<TrigConf::TCPHINO_B;j++)
00090 for(int i =0;i<TrigConf::TCTHETANO_B;i++)
00091 {
00092 if(BClusterId[i][j]==1)
00093 {
00094 BClusterPhi[j] = 1;
00095 break;
00096 }
00097 }
00098
00099 for(int j =0;j<TrigConf::TCPHINO_E/2;j++)
00100 for(int i =0;i<TrigConf::TCTHETANO_E;i++)
00101 {
00102 if(WEClusterId[i][j] == 1)
00103 {
00104 WEClusterPhi[j] = 1;
00105 }
00106 }
00107
00108 for(int j =0;j<TrigConf::TCPHINO_E/2;j++)
00109 for(int i =0;i<TrigConf::TCTHETANO_E;i++)
00110 {
00111 if(EEClusterId[i][j] == 1)
00112 {
00113 EEClusterPhi[j] = 1;
00114 }
00115 }
00116
00117
00118
00119 int nbCluster = 0, neeCluster = 0, nweCluster = 0;
00120
00121 map<int,vector<complex<int> >, greater<int> > mClusId;
00122 std::vector<complex<int> > vClusIdBR;
00123 std::vector<complex<int> > vClusIdEE;
00124 std::vector<complex<int> > vClusIdWE;
00125 typedef pair<int, vector<complex<int> > > vpair;
00126 vClusIdBR.clear();
00127 vClusIdEE.clear();
00128 vClusIdWE.clear();
00129 mClusId.clear();
00130
00131 for(int i=0;i<TrigConf::TCTHETANO_B;i++)
00132 for(int j=0;j<TrigConf::TCPHINO_B;j++)
00133 {
00134 int BClusId = BClusterId[i][j];
00135 if(BClusId == 1) {
00136 nbCluster++;
00137 complex<int> clusId(i,j);
00138 vClusIdBR.push_back(clusId);
00139 }
00140 }
00141 for(int i=0; i<TrigConf::TCTHETANO_E; i++)
00142 for(int j=0; j<TrigConf::TCPHINO_E/2; j++)
00143 {
00144 if(EEClusterPhi[j]) {
00145 neeCluster++;
00146 complex<int> clusId(i,j);
00147 vClusIdEE.push_back(clusId);
00148 }
00149 if(WEClusterPhi[j]) {
00150 nweCluster++;
00151 complex<int> clusId(i,j);
00152 vClusIdWE.push_back(clusId);
00153 }
00154 }
00155
00156 mClusId.insert(vpair(1,vClusIdBR));
00157 mClusId.insert(vpair(0,vClusIdEE));
00158 mClusId.insert(vpair(2,vClusIdWE));
00159
00160 ISvcLocator* svcLocator = Gaudi::svcLocator();
00161 StatusCode sc = svcLocator->service("BesGlobalTrigSvc", m_tmpSvc);
00162 m_pIBGT = dynamic_cast<BesGlobalTrigSvc* >(m_tmpSvc);
00163
00164 m_pIBGT->setEmcNbCluster(nbCluster);
00165 m_pIBGT->setEmcNweCluster(nweCluster);
00166 m_pIBGT->setEmcNeeCluster(neeCluster);
00167 m_pIBGT->setEmcClusId(mClusId);
00168 m_pIBGT->setEmcClusE(emcClusE);
00169 }
00170
00171 bool EmcCCount::findCluster(int partId,int TCThetaNb,int TCPhiNb)
00172 {
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 int clus0,clus1,clus3,clus4,clus8;
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 if(partId==1)
00236 {
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246 clus0 = m_EmcTCFinder->getBTC(TCThetaNb,TCPhiNb);
00247 if(clus0 > 0)
00248 {
00249
00250 if(TCPhiNb != 0) clus1 = m_EmcTCFinder->getBTC(TCThetaNb,TCPhiNb - 1);
00251 else clus1 = m_EmcTCFinder->getBTC(TCThetaNb,TrigConf::TCPHINO_B-1);
00252
00253
00254
00255
00256 if(TCThetaNb!=0) clus3 = m_EmcTCFinder->getBTC(TCThetaNb - 1,TCPhiNb);
00257 else clus3 = 0;
00258
00259 if(TCPhiNb!=(TrigConf::TCPHINO_B-1)) clus4 = m_EmcTCFinder->getBTC(TCThetaNb,TCPhiNb+1);
00260 else clus4 = m_EmcTCFinder->getBTC(TCThetaNb,0);
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 if(TCThetaNb!=0&&TCPhiNb!=(TrigConf::TCPHINO_B-1)) clus8 = m_EmcTCFinder->getBTC(TCThetaNb-1,TCPhiNb+1);
00275 if(TCThetaNb==0) clus8 = 1;
00276 if(TCThetaNb!=0&&TCPhiNb==(TrigConf::TCPHINO_B-1)) clus8 = m_EmcTCFinder->getBTC(TCThetaNb-1,0);
00277
00278
00279 if(!((clus3 > 0)||(clus1 > 0)) && !((clus4 > 0)&&(clus8 > 0)))
00280 {
00281 return true;
00282 }
00283 else return false;
00284 }
00285 else return false;
00286 }
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 if(partId==0)
00404 {
00405 int etc1,etc2,etc3,etc4;
00406 etc1 = m_EmcTCFinder->getEETC(TCThetaNb,TCPhiNb*2);
00407 etc2 = m_EmcTCFinder->getEETC(TCThetaNb,TCPhiNb*2+1);
00408 if(etc1 > 0 || etc2 > 0) clus0 = 1;
00409 else clus0 = 0;
00410
00411 if(TCPhiNb!=0) {
00412 etc3 = m_EmcTCFinder->getEETC(TCThetaNb,(TCPhiNb-1)*2);
00413 etc4 = m_EmcTCFinder->getEETC(TCThetaNb,(TCPhiNb-1)*2+1);
00414 if(etc3 > 0 || etc4 > 0) clus1 = 1;
00415 else clus1 = 0;
00416 }
00417 else {
00418 etc3 = m_EmcTCFinder->getEETC(TCThetaNb,(TrigConf::TCPHINO_E/2-1)*2);
00419 etc4 = m_EmcTCFinder->getEETC(TCThetaNb,(TrigConf::TCPHINO_E/2-1)*2+1);
00420 if(etc3 > 0 || etc4 > 0) clus1 = 1;
00421 else clus1 = 0;
00422 }
00423
00424 if((clus0 > 0)&&(clus1 == 0)) return true;
00425 else return false;
00426 }
00427
00428
00429
00430
00431
00432
00433
00434
00435 if(partId==2)
00436 {
00437 int etc1,etc2,etc3,etc4;
00438 etc1 = m_EmcTCFinder->getWETC(TCThetaNb,TCPhiNb*2);
00439 etc2 = m_EmcTCFinder->getWETC(TCThetaNb,TCPhiNb*2+1);
00440 if(etc1 > 0 || etc2 > 0) clus0 = 1;
00441 else clus0 = 0;
00442
00443 if(TCPhiNb!= (TrigConf::TCPHINO_E/2-1)) {
00444 etc3 = m_EmcTCFinder->getWETC(TCThetaNb,(TCPhiNb+1)*2);
00445 etc4 = m_EmcTCFinder->getWETC(TCThetaNb,(TCPhiNb+1)*2+1);
00446 if(etc3 > 0 || etc4 > 0) clus1 = 1;
00447 else clus1 = 0;
00448 }
00449 else {
00450 etc3 = m_EmcTCFinder->getWETC(TCThetaNb,0);
00451 etc4 = m_EmcTCFinder->getWETC(TCThetaNb,1);
00452 if(etc3 > 0 || etc4 > 0) clus1 = 1;
00453 else clus1 = 0;
00454 }
00455
00456 if((clus0 > 0)&&(clus1 == 0)) return true;
00457 else return false;
00458 }
00459
00460 return false;
00461 }