#include <BesMucTrig.h>
Public Member Functions | |
BesMucTrig () | |
BesMucTrig () | |
void | findTrack () |
void | findTrack () |
std::vector< int > | getNhitLayer () |
std::vector< int > | getNhitLayer () |
int | getNhitPart (int i) |
int | getNhitPart (int i) |
std::vector< int > | getNhitSeg () |
std::vector< int > | getNhitSeg () |
int | getNhitTotal () |
int | getNhitTotal () |
int | getNlayerPart (int part) |
int | getNlayerPart (int part) |
std::vector< int > | getNlayerSeg () |
std::vector< int > | getNlayerSeg () |
void | readIndex () |
void | readIndex () |
void | setIndex () |
void | setIndex () |
void | startMucTrig () |
void | startMucTrig () |
~BesMucTrig () | |
~BesMucTrig () | |
Private Attributes | |
int | btrack |
int | etrack |
int | foBR [8][4][7] |
int | foEC [2][4][4][4] |
MucTrigHit * | m_MucTrigHit |
MucTrigHit * | m_MucTrigHit |
BesGlobalTrigSvc * | m_pIBGT |
BesGlobalTrigSvc * | m_pIBGT |
IBesGlobalTrigSvc * | m_tmpSvc |
IBesGlobalTrigSvc * | m_tmpSvc |
int | nfireLayerBR [8][4] |
int | nfireLayerEC [2][4][4] |
int | nhitBR |
int | nhitEC [2] |
int | nhitLayerBR [8][4] |
int | nhitLayerEC [2][4][4] |
int | nhitSegBR [8] |
int | nhitSegEC [2][4] |
int | track3lBR [8] |
int | track3lEE [4] |
int | track3lWE [4] |
int | trackBR [8] |
int | trackEE [4] |
int | trackWE [4] |
std::vector< int > | vfireLayer |
std::vector< int > | vfireLayer |
std::vector< int > | vhitLayer |
std::vector< int > | vhitLayer |
std::vector< int > | vhitSeg |
std::vector< int > | vhitSeg |
std::vector< int > | vIndex |
std::vector< int > | vIndex |
std::vector< std::vector< int > > | vindexb |
std::vector< std::vector< int > > | vindexb |
std::vector< std::vector< int > > | vindexb3 |
std::vector< std::vector< int > > | vindexb3 |
std::vector< std::vector< int > > | vindexe |
std::vector< std::vector< int > > | vindexe |
|
00028 { 00029 m_MucTrigHit = MucTrigHit::get_Muc(); 00030 ISvcLocator* svcLocator = Gaudi::svcLocator(); 00031 StatusCode sc = svcLocator->service("BesGlobalTrigSvc", m_tmpSvc); 00032 if(!sc.isSuccess()) cerr<<"Fatal error: can not get trigger service"<<endl; 00033 m_pIBGT = dynamic_cast<BesGlobalTrigSvc* >(m_tmpSvc); 00034 00035 readIndex(); 00036 }
|
|
00039 { 00040 }
|
|
|
|
|
|
|
|
00116 { 00117 //find tracks in barrel 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 //find tracks in endcaps 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 //for east endcap 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 //for west endcap 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 //for east endcap 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 //for west endcap 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 //count the tracks in barrel and endcaps 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 //cosmic ray experiment, MUC trigger, 3v7 or 4v8; Or use 3v7 only; Note: use 3/4 logic in both cases 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 //set muc trigger conditions 00263 m_pIBGT->setMucBB3478(mucBB3478); 00264 m_pIBGT->setMucBB37(mucBB37); 00265 00266 //set value in service 00267 m_pIBGT->setMucNtrackBR(btrack); 00268 m_pIBGT->setMucNtrackEC(etrack); 00269 m_pIBGT->setMucN3ltrackTotal(b3ltrack+e3ltrack); 00270 }
|
|
|
|
00340 { 00341 vhitLayer.clear(); 00342 00343 for(int i=0; i<8; i++) 00344 for(int j=0; j<4; j++) 00345 { 00346 if(nhitLayerBR[i][j] != 0) { 00347 //1000: barrel, i*100: ith segment, j*10: jth gap, nhitLayerBR[i][j]: the number of hits 00348 int hit = 1000 + i*100 + j*10 + nhitLayerBR[i][j]; 00349 vhitLayer.push_back(hit); 00350 } 00351 } 00352 00353 for(int i=0; i<2; i++) 00354 for(int j=0; j<4; j++) 00355 for(int k=0; k<4; k++) 00356 { 00357 if(nhitLayerEC[i][j][k] != 0) { 00358 int hit; 00359 //0: east endcaps, j*100: jth segment, k*10: kth gap, nhitLayerEC[i][j][k]: the number of hits 00360 if(i==0) hit = 0 + j*100 + k*10 + nhitLayerEC[i][j][k]; 00361 //2000: west endcap, j*100: jth segment, k*10: kth gap, nhitLayerEC[i][j][k]: the number of hits 00362 else hit = 2000 + j*100 + k*10 + nhitLayerEC[i][j][k]; 00363 vhitLayer.push_back(hit); 00364 } 00365 } 00366 return vhitLayer; 00367 }
|
|
|
|
00398 { 00399 if(i == 1) return nhitBR; 00400 if(i == 0) return nhitEC[0]; 00401 if(i == 2) return nhitEC[1]; 00402 00403 return -1; 00404 }
|
|
|
|
00370 { 00371 vhitSeg.clear(); 00372 00373 for(int i=0; i<8; i++) 00374 { 00375 if(nhitSegBR[i] != 0) { 00376 //1000: barrel, i*100: ith segment,tSegBR[i]: the number of hits 00377 int hit = 1000 + i*100 + nhitSegBR[i]; 00378 vhitSeg.push_back(hit); 00379 } 00380 } 00381 00382 for(int i=0; i<2; i++) 00383 for(int j=0; j<4; j++) 00384 { 00385 if(nhitSegEC[i][j] != 0) { 00386 int hit; 00387 //0: east endcaps, j*100: jth segment, nhitSegEC[i][j]: the number of hits 00388 if(i==0) hit = 0 + j*100 + nhitSegEC[i][j]; 00389 //2000: west endcap, j*100: jth segment, nhitSegEC[i][j]: the number of hits 00390 else hit = 2000 + j*100 + nhitSegEC[i][j]; 00391 vhitSeg.push_back(hit); 00392 } 00393 } 00394 return vhitSeg; 00395 }
|
|
|
|
|
|
|
|
00311 { 00312 int nLayerBR = 0, nLayerWE = 0, nLayerEE = 0; 00313 //count the barrel fired layer number 00314 for(int i=0; i<8; i++) 00315 for(int j=0; j<4; j++) 00316 { 00317 if(nfireLayerBR[i][j] == 1) { 00318 nLayerBR++; 00319 } 00320 } 00321 //count each endcap fired layer number 00322 for(int i=0; i<2; i++) 00323 for(int j=0; j<4; j++) 00324 for(int k=0; k<4; k++) 00325 { 00326 if(nfireLayerEC[i][j][k] == 1) { 00327 if(i==0) nLayerEE++; 00328 if(i==1) nLayerWE++; 00329 } 00330 } 00331 00332 if(part == 0) return nLayerEE; 00333 if(part == 1) return nLayerBR; 00334 if(part == 2) return nLayerWE; 00335 00336 return -1; 00337 }
|
|
|
|
00273 { 00274 vfireLayer.clear(); 00275 00276 for(int i=0; i<8; i++) 00277 { 00278 int nlayer = 0; 00279 for(int j=0; j<4; j++) 00280 { 00281 if(nfireLayerBR[i][j] == 1) { 00282 nlayer++; 00283 } 00284 } 00285 if(nlayer != 0) { 00286 nlayer = 100 + i*10 + nlayer; //100: part(barrel), i*10: segment 00287 vfireLayer.push_back(nlayer); 00288 } 00289 } 00290 00291 for(int i=0; i<2; i++) 00292 for(int j=0; j<4; j++) 00293 { 00294 int nlayer = 0; 00295 for(int k=0; k<4; k++) 00296 { 00297 if(nfireLayerEC[i][j][k] == 1) { 00298 nlayer++; 00299 } 00300 } 00301 if(nlayer != 0) { 00302 if(i==0) nlayer = 0 + j*10 + nlayer; //0: east endcaps, j*10: jth segment 00303 else nlayer = 200 + j*10 + nlayer; //200: west endcap, j*10: jth segment 00304 vfireLayer.push_back(nlayer); 00305 } 00306 } 00307 return vfireLayer; 00308 }
|
|
|
|
00418 { 00419 fstream infile1; 00420 fstream infile2; 00421 fstream infile3; 00422 00423 vindexb.clear(); 00424 vindexb3.clear(); 00425 vindexe.clear(); 00426 00427 std::string filename = std::string(getenv( "TRIGGERROOT" )); 00428 std::string filename1 = filename + "/data/mufield0.5_1.5GeV_cos0.76_phi456thseg_index_select.txt"; 00429 std::string filename2 = filename + "/data/mufield0.5_1.5GeV_cos0.76_phi234thseg_index_select.txt"; 00430 std::string filename3 = filename + "/data/mufield0.5_1.5GeV_ee2_index_select.txt"; 00431 infile1.open(filename1.c_str(), ios_base::in); 00432 infile2.open(filename2.c_str(), ios_base::in); 00433 infile3.open(filename3.c_str(), ios_base::in); 00434 00435 char line[255]; 00436 char* token; 00437 std::string str; 00438 00439 if(!infile1) cout<<"open file1 failture"<<endl; 00440 while(infile1) { 00441 infile1.getline( line, 255 ); 00442 token = strtok( line, " " ); 00443 int num = 0; 00444 std::vector<int> tmp; 00445 tmp.clear(); 00446 do{ 00447 if(token) { 00448 str = token; 00449 token = strtok(NULL," "); 00450 int Index = atoi(str.c_str()); 00451 if(num != 0) tmp.push_back(Index); 00452 num++; 00453 } 00454 else continue; 00455 }while (token!=NULL); 00456 if(tmp.size() == 4) vindexb.push_back(tmp); 00457 } 00458 cout<<"total "<<vindexb.size()<<" index in barrel have been read!"<<endl; 00459 00460 00461 if(!infile2) cout<<"open file2 failture"<<endl; 00462 while(infile2) { 00463 infile2.getline( line, 255 ); 00464 token = strtok( line, " " ); 00465 int num = 0; 00466 std::vector<int> tmp; 00467 tmp.clear(); 00468 do{ 00469 if(token) { 00470 str = token; 00471 token = strtok(NULL," "); 00472 int Index = atoi(str.c_str()); 00473 if(num != 0) tmp.push_back(Index); 00474 num++; 00475 } 00476 else continue; 00477 }while (token!=NULL); 00478 if(tmp.size() == 4) vindexb3.push_back(tmp); 00479 } 00480 cout<<"total "<<vindexb3.size()<<" index in barrel 3 have been read!"<<endl; 00481 00482 if(!infile3) cout<<"open file3 failture"<<endl; 00483 while(infile3) { 00484 infile3.getline( line, 255 ); 00485 token = strtok( line, " " ); 00486 int num = 0; 00487 std::vector<int> tmp; 00488 tmp.clear(); 00489 do{ 00490 if(token) { 00491 str = token; 00492 token = strtok(NULL," "); 00493 int Index = atoi(str.c_str()); 00494 if(num != 0) tmp.push_back(Index); 00495 num++; 00496 } 00497 else continue; 00498 }while (token!=NULL); 00499 if(tmp.size() == 4) vindexe.push_back(tmp); 00500 } 00501 cout<<"total "<<vindexe.size()<<" index in endcap have been read!"<<endl; 00502 00503 infile1.close(); 00504 infile2.close(); 00505 infile3.close(); 00506 }
|
|
|
|
00413 { 00414 m_pIBGT->setMucIndex(vIndex); 00415 }
|
|
|
|
00043 { 00044 //reset values 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(); //run fastOr algorithm 00073 00074 //reset values and get fastOr signal from class MucTrigHit 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; //fired layer Id of barrel 00083 nhitLayerBR[i][j]+=1; //Hit number in each layer of barrel 00084 nhitSegBR[i]+=1; //hit number in each segment of barrel 00085 nhitBR+=1; //hit number in barrel 00086 //1000: barrel, i*100: segment, j*10: gap, k: strip 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; //fired layer Id of endcaps 00101 nhitLayerEC[i][j][k]+=1; //hit number in each layer of endcaps 00102 nhitSegEC[i][j]+=1; //hit number in each segment of endcaps 00103 nhitEC[i]+=1; //hit number in endcaps 00104 int index; 00105 //0: east endcap, 2000: west endcap, j*100: segment, k*10: gap, l: strip 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 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|