00001
00012
00013 #include "Trigger/BesMucTrig.h"
00014 #include "Trigger/MucTrigHit.h"
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
00022 #include <iostream>
00023 #include <fstream>
00024
00025 using namespace std;
00026
00027 BesMucTrig::BesMucTrig()
00028 {
00029 m_MucTrigHit = MucTrigHit::get_Muc();
00030
00031 readIndex();
00032 }
00033
00034 BesMucTrig::~BesMucTrig()
00035 {
00036 }
00037
00038 void BesMucTrig::startMucTrig()
00039 {
00040 ISvcLocator* svcLocator = Gaudi::svcLocator();
00041 StatusCode sc = svcLocator->service("BesGlobalTrigSvc", m_tmpSvc);
00042 m_pIBGT = dynamic_cast<BesGlobalTrigSvc* >(m_tmpSvc);
00043
00044
00045 for(int i=0; i<8; i++)
00046 {
00047 nhitSegBR[i] = 0;
00048 for(int j=0; j<4; j++)
00049 {
00050 nfireLayerBR[i][j] = 0;
00051 nhitLayerBR[i][j] = 0;
00052 }
00053 }
00054 nhitBR = 0;
00055
00056 for(int i=0; i<2; i++)
00057 {
00058 nhitEC[i] = 0;
00059 for(int j=0; j<4; j++)
00060 {
00061 nhitSegEC[i][j] = 0;
00062 for(int k=0; k<4; k++)
00063 {
00064 nfireLayerEC[i][j][k] = 0;
00065 nhitLayerEC[i][j][k] = 0;
00066 }
00067 }
00068 }
00069
00070 vIndex.clear();
00071
00072 m_MucTrigHit->getFastOr();
00073
00074
00075 for(int i=0; i<8; i++)
00076 for(int j=0; j<4; j++)
00077 for(int k=0; k<7; k++)
00078 {
00079 foBR[i][j][k] = 0;
00080 foBR[i][j][k] = m_MucTrigHit->getfoBR(i, j, k);
00081 if(foBR[i][j][k] == 1) {
00082 nfireLayerBR[i][j] = 1;
00083 nhitLayerBR[i][j]+=1;
00084 nhitSegBR[i]+=1;
00085 nhitBR+=1;
00086
00087 int index = 1000 + i*100 + j*10 + k;
00088 vIndex.push_back(index);
00089 }
00090 }
00091
00092 for(int i=0; i<2; i++)
00093 for(int j=0; j<4; j++)
00094 for(int k=0; k<4; k++)
00095 for(int l=0; l<4; l++)
00096 {
00097 foEC[i][j][k][l] = 0;
00098 foEC[i][j][k][l] = m_MucTrigHit->getfoEC(i, j, k, l);
00099 if(foEC[i][j][k][l]==1) {
00100 nfireLayerEC[i][j][k] = 1;
00101 nhitLayerEC[i][j][k]+=1;
00102 nhitSegEC[i][j]+=1;
00103 nhitEC[i]+=1;
00104 int index;
00105
00106 if(i==0) index = 0 + j*100 + k*10 + l;
00107 if(i==1) index = 2000 + j*100 + k*10 +l;
00108 vIndex.push_back(index);
00109 }
00110 }
00111
00112 setIndex();
00113 findTrack();
00114 }
00115 void BesMucTrig::findTrack()
00116 {
00117
00118 for(int i=0; i<8; i++)
00119 {
00120 trackBR[i] = 0;
00121 track3lBR[i] = 0;
00122 if(i!=2) {
00123 for(unsigned int j=0; j<vindexb.size(); j++)
00124 {
00125 int ly1,ly2,ly3,ly4;
00126 ly1 = vindexb[j][0];
00127 ly2 = vindexb[j][1]-10;
00128 ly3 = vindexb[j][2]-20;
00129 ly4 = vindexb[j][3]-30;
00130 if((foBR[i][0][ly1]+foBR[i][1][ly2]+foBR[i][2][ly3]+foBR[i][3][ly4])>=3) {
00131 trackBR[i]++;
00132 break;
00133 }
00134 if(foBR[i][0][ly1]==1&&foBR[i][2][ly3]==1) { trackBR[i]++; break; }
00135 if(foBR[i][1][ly2]==1&&foBR[i][3][ly4]==1) { trackBR[i]++; break; }
00136 }
00137
00138 for(unsigned int j=0; j<vindexb.size(); j++)
00139 {
00140 int ly1,ly2,ly3,ly4;
00141 ly1 = vindexb[j][0];
00142 ly2 = vindexb[j][1]-10;
00143 ly3 = vindexb[j][2]-20;
00144 ly4 = vindexb[j][3]-30;
00145 if((foBR[i][0][ly1]+foBR[i][1][ly2]+foBR[i][2][ly3]+foBR[i][3][ly4])>=3) {
00146 track3lBR[i]++;
00147 break;
00148 }
00149 }
00150 }
00151 if(i==2) {
00152 for(unsigned int j=0; j<vindexb3.size(); j++)
00153 {
00154 int ly1,ly2,ly3,ly4;
00155 ly1 = vindexb3[j][0];
00156 ly2 = vindexb3[j][1]-10;
00157 ly3 = vindexb3[j][2]-20;
00158 ly4 = vindexb3[j][3]-30;
00159 if((foBR[i][0][ly1]+foBR[i][1][ly2]+foBR[i][2][ly3]+foBR[i][3][ly4])>=3) {
00160 trackBR[i]++;
00161 break;
00162 }
00163 if(foBR[i][0][ly1]==1&&foBR[i][2][ly3]==1) { trackBR[i]++; break; }
00164 if(foBR[i][1][ly2]==1&&foBR[i][3][ly4]==1) { trackBR[i]++; break; }
00165 }
00166
00167 for(unsigned int j=0; j<vindexb3.size(); j++)
00168 {
00169 int ly1,ly2,ly3,ly4;
00170 ly1 = vindexb3[j][0];
00171 ly2 = vindexb3[j][1]-10;
00172 ly3 = vindexb3[j][2]-20;
00173 ly4 = vindexb3[j][3]-30;
00174 if((foBR[i][0][ly1]+foBR[i][1][ly2]+foBR[i][2][ly3]+foBR[i][3][ly4])>=3) {
00175 track3lBR[i]++;
00176 break;
00177 }
00178 }
00179 }
00180 }
00181
00182
00183 for(int i=0; i<4; i++)
00184 {
00185 trackEE[i] = 0;
00186 trackWE[i] = 0;
00187 track3lEE[i] = 0;
00188 track3lWE[i] = 0;
00189 for(unsigned int j=0; j<vindexe.size(); j++)
00190 {
00191 int ly1,ly2,ly3,ly4;
00192 ly1 = vindexe[j][0];
00193 ly2 = vindexe[j][1]-10;
00194 ly3 = vindexe[j][2]-20;
00195 ly4 = vindexe[j][3]-30;
00196
00197 if((foEC[0][i][0][ly1]+foEC[0][i][1][ly2]+foEC[0][i][2][ly3]+foEC[0][i][3][ly4])>=3) {
00198 trackEE[i]++;
00199 break;
00200 }
00201 if(foEC[0][i][0][ly1]==1&&foEC[0][i][2][ly3]==1) { trackEE[i]++; break; }
00202 if(foEC[0][i][1][ly2]==1&&foEC[0][i][3][ly4]==1) { trackEE[i]++; break; }
00203 }
00204
00205 for(unsigned int j=0; j<vindexe.size(); j++)
00206 {
00207 int ly1,ly2,ly3,ly4;
00208 ly1 = vindexe[j][0];
00209 ly2 = vindexe[j][1]-10;
00210 ly3 = vindexe[j][2]-20;
00211 ly4 = vindexe[j][3]-30;
00212
00213 if((foEC[1][i][0][ly1]+foEC[1][i][1][ly2]+foEC[1][i][2][ly3]+foEC[1][i][3][ly4])>=3) {
00214 trackWE[i]++;
00215 break;
00216 }
00217 if(foEC[1][i][0][ly1]==1&&foEC[1][i][2][ly3]==1) { trackWE[i]++; break; }
00218 if(foEC[1][i][1][ly2]==1&&foEC[1][i][3][ly4]==1) { trackWE[i]++; break; }
00219 }
00220
00221 for(unsigned int j=0; j<vindexe.size(); j++)
00222 {
00223 int ly1,ly2,ly3,ly4;
00224 ly1 = vindexe[j][0];
00225 ly2 = vindexe[j][1]-10;
00226 ly3 = vindexe[j][2]-20;
00227 ly4 = vindexe[j][3]-30;
00228
00229 if((foEC[0][i][0][ly1]+foEC[0][i][1][ly2]+foEC[0][i][2][ly3]+foEC[0][i][3][ly4])>=3) {
00230 track3lEE[i]++;
00231 break;
00232 }
00233 }
00234 for(unsigned int j=0; j<vindexe.size(); j++)
00235 {
00236 int ly1,ly2,ly3,ly4;
00237 ly1 = vindexe[j][0];
00238 ly2 = vindexe[j][1]-10;
00239 ly3 = vindexe[j][2]-20;
00240 ly4 = vindexe[j][3]-30;
00241
00242 if((foEC[1][i][0][ly1]+foEC[1][i][1][ly2]+foEC[1][i][2][ly3]+foEC[1][i][3][ly4])>=3) {
00243 track3lWE[i]++;
00244 break;
00245 }
00246 }
00247 }
00248
00249
00250 btrack = 0;
00251 etrack = 0;
00252 int b3ltrack = 0, e3ltrack = 0;
00253 for(int i=0; i<8; i++) { btrack = btrack + trackBR[i]; b3ltrack = b3ltrack + track3lBR[i]; }
00254 for(int i=0; i<4; i++) { etrack = etrack + trackEE[i] + trackWE[i]; e3ltrack = e3ltrack + track3lWE[i] + track3lEE[i]; }
00255
00256
00257 bool mucBB3478 = false, mucBB37 = false;
00258 if((track3lBR[2] > 0 && track3lBR[6] > 0) || (track3lBR[3] > 0 && track3lBR[7] > 0)) mucBB3478 = true;
00259 if(track3lBR[2] > 0 && track3lBR[6] > 0) mucBB37 = true;
00260
00261
00262 m_pIBGT->setMucBB3478(mucBB3478);
00263 m_pIBGT->setMucBB37(mucBB37);
00264
00265
00266 m_pIBGT->setMucNtrackBR(btrack);
00267 m_pIBGT->setMucNtrackEC(etrack);
00268 m_pIBGT->setMucN3ltrackTotal(b3ltrack+e3ltrack);
00269 }
00270
00271 std::vector<int> BesMucTrig::getNlayerSeg()
00272 {
00273 vfireLayer.clear();
00274
00275 for(int i=0; i<8; i++)
00276 {
00277 int nlayer = 0;
00278 for(int j=0; j<4; j++)
00279 {
00280 if(nfireLayerBR[i][j] == 1) {
00281 nlayer++;
00282 }
00283 }
00284 if(nlayer != 0) {
00285 nlayer = 100 + i*10 + nlayer;
00286 vfireLayer.push_back(nlayer);
00287 }
00288 }
00289
00290 for(int i=0; i<2; i++)
00291 for(int j=0; j<4; j++)
00292 {
00293 int nlayer = 0;
00294 for(int k=0; k<4; k++)
00295 {
00296 if(nfireLayerEC[i][j][k] == 1) {
00297 nlayer++;
00298 }
00299 }
00300 if(nlayer != 0) {
00301 if(i==0) nlayer = 0 + j*10 + nlayer;
00302 else nlayer = 200 + j*10 + nlayer;
00303 vfireLayer.push_back(nlayer);
00304 }
00305 }
00306 return vfireLayer;
00307 }
00308
00309 int BesMucTrig::getNlayerPart(int part)
00310 {
00311 int nLayerBR = 0, nLayerWE = 0, nLayerEE = 0;
00312
00313 for(int i=0; i<8; i++)
00314 for(int j=0; j<4; j++)
00315 {
00316 if(nfireLayerBR[i][j] == 1) {
00317 nLayerBR++;
00318 }
00319 }
00320
00321 for(int i=0; i<2; i++)
00322 for(int j=0; j<4; j++)
00323 for(int k=0; k<4; k++)
00324 {
00325 if(nfireLayerEC[i][j][k] == 1) {
00326 if(i==0) nLayerEE++;
00327 if(i==1) nLayerWE++;
00328 }
00329 }
00330
00331 if(part == 0) return nLayerEE;
00332 if(part == 1) return nLayerBR;
00333 if(part == 2) return nLayerWE;
00334
00335 return -1;
00336 }
00337
00338 std::vector<int> BesMucTrig::getNhitLayer()
00339 {
00340 vhitLayer.clear();
00341
00342 for(int i=0; i<8; i++)
00343 for(int j=0; j<4; j++)
00344 {
00345 if(nhitLayerBR[i][j] != 0) {
00346
00347 int hit = 1000 + i*100 + j*10 + nhitLayerBR[i][j];
00348 vhitLayer.push_back(hit);
00349 }
00350 }
00351
00352 for(int i=0; i<2; i++)
00353 for(int j=0; j<4; j++)
00354 for(int k=0; k<4; k++)
00355 {
00356 if(nhitLayerEC[i][j][k] != 0) {
00357 int hit;
00358
00359 if(i==0) hit = 0 + j*100 + k*10 + nhitLayerEC[i][j][k];
00360
00361 else hit = 2000 + j*100 + k*10 + nhitLayerEC[i][j][k];
00362 vhitLayer.push_back(hit);
00363 }
00364 }
00365 return vhitLayer;
00366 }
00367
00368 std::vector<int> BesMucTrig::getNhitSeg()
00369 {
00370 vhitSeg.clear();
00371
00372 for(int i=0; i<8; i++)
00373 {
00374 if(nhitSegBR[i] != 0) {
00375
00376 int hit = 1000 + i*100 + nhitSegBR[i];
00377 vhitSeg.push_back(hit);
00378 }
00379 }
00380
00381 for(int i=0; i<2; i++)
00382 for(int j=0; j<4; j++)
00383 {
00384 if(nhitSegEC[i][j] != 0) {
00385 int hit;
00386
00387 if(i==0) hit = 0 + j*100 + nhitSegEC[i][j];
00388
00389 else hit = 2000 + j*100 + nhitSegEC[i][j];
00390 vhitSeg.push_back(hit);
00391 }
00392 }
00393 return vhitSeg;
00394 }
00395
00396 int BesMucTrig::getNhitPart(int i)
00397 {
00398 if(i == 1) return nhitBR;
00399 if(i == 0) return nhitEC[0];
00400 if(i == 2) return nhitEC[1];
00401
00402 return -1;
00403 }
00404
00405 int BesMucTrig::getNhitTotal()
00406 {
00407 int total = nhitBR + nhitEC[0] + nhitEC[1];
00408 return total;
00409 }
00410
00411 void BesMucTrig::setIndex()
00412 {
00413 m_pIBGT->setMucIndex(vIndex);
00414 }
00415
00416 void BesMucTrig::readIndex()
00417 {
00418 fstream infile1;
00419 fstream infile2;
00420 fstream infile3;
00421
00422 vindexb.clear();
00423 vindexb3.clear();
00424 vindexe.clear();
00425
00426 std::string filename = std::string(getenv( "TRIGGERROOT" ));
00427 std::string filename1 = filename + "/data/mufield0.5_1.5GeV_cos0.76_phi456thseg_index_select.txt";
00428 std::string filename2 = filename + "/data/mufield0.5_1.5GeV_cos0.76_phi234thseg_index_select.txt";
00429 std::string filename3 = filename + "/data/mufield0.5_1.5GeV_ee2_index_select.txt";
00430 infile1.open(filename1.c_str(), ios_base::in);
00431 infile2.open(filename2.c_str(), ios_base::in);
00432 infile3.open(filename3.c_str(), ios_base::in);
00433
00434 char line[255];
00435 char* token;
00436 std::string str;
00437
00438 if(!infile1) cout<<"open file1 failture"<<endl;
00439 while(infile1) {
00440 infile1.getline( line, 255 );
00441 token = strtok( line, " " );
00442 int num = 0;
00443 std::vector<int> tmp;
00444 tmp.clear();
00445 do{
00446 if(token) {
00447 str = token;
00448 token = strtok(NULL," ");
00449 int Index = atoi(str.c_str());
00450 if(num != 0) tmp.push_back(Index);
00451 num++;
00452 }
00453 else continue;
00454 }while (token!=NULL);
00455 if(tmp.size() == 4) vindexb.push_back(tmp);
00456 }
00457 cout<<"total "<<vindexb.size()<<" index in barrel have been read!"<<endl;
00458
00459
00460 if(!infile2) cout<<"open file2 failture"<<endl;
00461 while(infile2) {
00462 infile2.getline( line, 255 );
00463 token = strtok( line, " " );
00464 int num = 0;
00465 std::vector<int> tmp;
00466 tmp.clear();
00467 do{
00468 if(token) {
00469 str = token;
00470 token = strtok(NULL," ");
00471 int Index = atoi(str.c_str());
00472 if(num != 0) tmp.push_back(Index);
00473 num++;
00474 }
00475 else continue;
00476 }while (token!=NULL);
00477 if(tmp.size() == 4) vindexb3.push_back(tmp);
00478 }
00479 cout<<"total "<<vindexb3.size()<<" index in barrel 3 have been read!"<<endl;
00480
00481 if(!infile3) cout<<"open file3 failture"<<endl;
00482 while(infile3) {
00483 infile3.getline( line, 255 );
00484 token = strtok( line, " " );
00485 int num = 0;
00486 std::vector<int> tmp;
00487 tmp.clear();
00488 do{
00489 if(token) {
00490 str = token;
00491 token = strtok(NULL," ");
00492 int Index = atoi(str.c_str());
00493 if(num != 0) tmp.push_back(Index);
00494 num++;
00495 }
00496 else continue;
00497 }while (token!=NULL);
00498 if(tmp.size() == 4) vindexe.push_back(tmp);
00499 }
00500 cout<<"total "<<vindexe.size()<<" index in endcap have been read!"<<endl;
00501
00502 infile1.close();
00503 infile2.close();
00504 infile3.close();
00505 }