00001
00012
00013 #include "Trigger/BesTMTrig.h"
00014 #include <algorithm>
00015 #include <iostream>
00016 #include <fstream>
00017 #include "Trigger/IBesGlobalTrigSvc.h"
00018 #include "Trigger/BesGlobalTrigSvc.h"
00019 #include "GaudiKernel/ISvcLocator.h"
00020 #include "GaudiKernel/Bootstrap.h"
00021 #include "GaudiKernel/IDataProviderSvc.h"
00022 #include <map>
00023
00024 BesTMTrig::BesTMTrig() {
00025 char line[255];
00026 std::string filename = std::string(getenv( "TRIGGERROOT" ));
00027 filename += std::string("/data/tm/TM_BARREL.pat");
00028 std::ifstream infile( filename.c_str() );
00029 if(infile) {
00030 while(infile) {
00031 infile.getline(line,255);
00032 if(line[0] == '#') continue;
00033 std::string mdcId, tofId_l, tofId_h, emcId_l, emcId_h;
00034 char* token = strtok( line, " " );
00035 if ( token ) { mdcId = token; token = strtok( NULL, " " );} else continue;
00036 if ( token ) { tofId_l = token; token = strtok( NULL, " " );} else continue;
00037 if ( token ) { tofId_h = token; token = strtok( NULL, " " );} else continue;
00038 if ( token ) { emcId_l = token; token = strtok( NULL, " " );} else continue;
00039 if ( token ) { emcId_h = token; token = strtok( NULL, " " );} else continue;
00040 if ( token != NULL ) continue;
00041
00042
00043 int i_tofId_l = atoi( tofId_l.c_str() );
00044 int i_tofId_h = atoi( tofId_h.c_str() );
00045 int i_emcId_l = atoi( emcId_l.c_str() );
00046 int i_emcId_h = atoi( emcId_h.c_str() );
00047
00048 std::vector<int> tof_tmp;
00049 std::vector<int> emc_tmp;
00050
00051 if(i_tofId_l > i_tofId_h) {
00052 for(int i = i_tofId_l; i <= (i_tofId_h + 88); i++) {
00053 if(i >= 88) tof_tmp.push_back(i - 88);
00054 else tof_tmp.push_back(i);
00055 }
00056 }
00057 else {
00058 for(int i = i_tofId_l; i <= i_tofId_h; i++) {
00059 tof_tmp.push_back(i);
00060 }
00061 }
00062
00063 if(i_emcId_l > i_emcId_h) {
00064 for(int i = i_emcId_l; i <= (i_emcId_h + 30); i++) {
00065 if(i >= 30) emc_tmp.push_back(i - 30);
00066 else emc_tmp.push_back(i);
00067 }
00068 }
00069 else {
00070 for(int i = i_emcId_l; i <= i_emcId_h; i++) {
00071 emc_tmp.push_back(i);
00072 }
00073 }
00074 m_tm_barrel.push_back(tof_tmp);
00075 m_tm_barrel.push_back(emc_tmp);
00076 }
00077 }
00078 else {
00079 std::cout << "Can not open file: " << filename << " in BesTMTrig. " << std::endl;
00080 }
00081
00082 filename = std::string(getenv( "TRIGGERROOT" ));
00083 filename += std::string("/data/tm/TM_EAST_ENDCAP.pat");
00084 std::ifstream infile1( filename.c_str() );
00085 if(infile1) {
00086 while(infile1) {
00087 infile1.getline(line,255);
00088 if(line[0] == '#') continue;
00089 std::string mdcId, tofId_l, tofId_h, emcId_l, emcId_h;
00090 char* token = strtok( line, " " );
00091 if ( token ) { mdcId = token; token = strtok( NULL, " " );} else continue;
00092 if ( token ) { tofId_l = token; token = strtok( NULL, " " );} else continue;
00093 if ( token ) { tofId_h = token; token = strtok( NULL, " " );} else continue;
00094 if ( token ) { emcId_l = token; token = strtok( NULL, " " );} else continue;
00095 if ( token ) { emcId_h = token; token = strtok( NULL, " " );} else continue;
00096 if ( token != NULL ) continue;
00097
00098
00099 int i_tofId_l = atoi( tofId_l.c_str() );
00100 int i_tofId_h = atoi( tofId_h.c_str() );
00101 int i_emcId_l = atoi( emcId_l.c_str() );
00102 int i_emcId_h = atoi( emcId_h.c_str() );
00103
00104 std::vector<int> tof_tmp;
00105 std::vector<int> emc_tmp;
00106
00107 if(i_tofId_l > i_tofId_h) {
00108 for(int i = i_tofId_l; i <= (i_tofId_h + 24); i++) {
00109 if(i >= 24) tof_tmp.push_back(i - 24);
00110 else tof_tmp.push_back(i);
00111 }
00112 }
00113 else {
00114 for(int i = i_tofId_l; i <= i_tofId_h; i++) {
00115 tof_tmp.push_back(i);
00116 }
00117 }
00118
00119 if(i_emcId_l > i_emcId_h) {
00120 for(int i = i_emcId_l; i <= (i_emcId_h + 16); i++) {
00121 if(i >= 16) emc_tmp.push_back(i - 16);
00122 else emc_tmp.push_back(i);
00123 }
00124 }
00125 else {
00126 for(int i = i_emcId_l; i <= i_emcId_h; i++) {
00127 emc_tmp.push_back(i);
00128 }
00129 }
00130 m_tm_ecap.push_back(tof_tmp);
00131 m_tm_ecap.push_back(emc_tmp);
00132 }
00133 }
00134 else {
00135 std::cout << "Can not open file: " << filename << " in BesTMTrig. " << std::endl;
00136 }
00137
00138
00139 filename = std::string(getenv( "TRIGGERROOT" ));
00140 filename += std::string("/data/tm/TM_WEST_ENDCAP.pat");
00141 std::ifstream infile2( filename.c_str() );
00142 if(infile2) {
00143 while(infile2) {
00144 infile2.getline(line,255);
00145 if(line[0] == '#') continue;
00146 std::string mdcId, tofId_l, tofId_h, emcId_l, emcId_h;
00147 char* token = strtok( line, " " );
00148 if ( token ) { mdcId = token; token = strtok( NULL, " " );} else continue;
00149 if ( token ) { tofId_l = token; token = strtok( NULL, " " );} else continue;
00150 if ( token ) { tofId_h = token; token = strtok( NULL, " " );} else continue;
00151 if ( token ) { emcId_l = token; token = strtok( NULL, " " );} else continue;
00152 if ( token ) { emcId_h = token; token = strtok( NULL, " " );} else continue;
00153 if ( token != NULL ) continue;
00154
00155
00156 int i_tofId_l = atoi( tofId_l.c_str() );
00157 int i_tofId_h = atoi( tofId_h.c_str() );
00158 int i_emcId_l = atoi( emcId_l.c_str() );
00159 int i_emcId_h = atoi( emcId_h.c_str() );
00160
00161 std::vector<int> tof_tmp;
00162 std::vector<int> emc_tmp;
00163
00164 if(i_tofId_l > i_tofId_h) {
00165 for(int i = i_tofId_l; i <= (i_tofId_h + 24); i++) {
00166 if(i >= 24) tof_tmp.push_back(i - 24);
00167 else tof_tmp.push_back(i);
00168 }
00169 }
00170 else {
00171 for(int i = i_tofId_l; i <= i_tofId_h; i++) {
00172 tof_tmp.push_back(i);
00173 }
00174 }
00175
00176 if(i_emcId_l > i_emcId_h) {
00177 for(int i = i_emcId_l; i <= (i_emcId_h + 16); i++) {
00178 if(i >= 16) emc_tmp.push_back(i - 16);
00179 else emc_tmp.push_back(i);
00180 }
00181 }
00182 else {
00183 for(int i = i_emcId_l; i <= i_emcId_h; i++) {
00184 emc_tmp.push_back(i);
00185 }
00186 }
00187 m_tm_wcap.push_back(tof_tmp);
00188 m_tm_wcap.push_back(emc_tmp);
00189 }
00190 }
00191 else {
00192 std::cout << "Can not open file: " << filename << " in BesTMTrig. " << std::endl;
00193 }
00194 infile.close();
00195 infile1.close();
00196 infile2.close();
00197
00198 }
00199
00200 BesTMTrig::~BesTMTrig() {
00201 }
00202
00203 void BesTMTrig::dump() {
00204 std::cout << "The size of barrel vector: " << m_tm_barrel.size() << std::endl;
00205 std::cout << "The size of east endcap vector: " << m_tm_ecap.size() << std::endl;
00206 std::cout << "The size of west endcap vector: " << m_tm_wcap.size() << std::endl;
00207 std::cout << "--------------------------- BARREL -----------------------------" << std::endl;
00208 for(unsigned int i = 0; i < m_tm_barrel.size(); i+=2) {
00209 std::cout << "MdcId is " << i/2 << " TofId size " << m_tm_barrel[i].size() <<
00210 " Id " << m_tm_barrel[i][0] << " " << m_tm_barrel[i][m_tm_barrel[i].size() - 1] << std::endl;
00211 std::cout << "MdcId is " << i/2 << " EmcId size " << m_tm_barrel[i+1].size() <<
00212 " Id " << m_tm_barrel[i+1][0] << " " << m_tm_barrel[i+1][m_tm_barrel[i+1].size() - 1] << std::endl;
00213 }
00214 std::cout << "--------------------------- EAST ENDCAP -----------------------------" << std::endl;
00215 for(unsigned int i = 0; i < m_tm_ecap.size(); i+=2) {
00216 std::cout << "MdcId is " << i/2 << " TofId size " << m_tm_ecap[i].size() <<
00217 " Id " << m_tm_ecap[i][0] << " " << m_tm_ecap[i][m_tm_ecap[i].size() - 1] << std::endl;
00218 std::cout << "MdcId is " << i/2 << " EmcId size " << m_tm_ecap[i+1].size() <<
00219 " Id " << m_tm_ecap[i+1][0] << " " << m_tm_ecap[i+1][m_tm_ecap[i+1].size() - 1] << std::endl;
00220 }
00221 std::cout << "--------------------------- WEST ENDCAP -----------------------------" << std::endl;
00222 for(unsigned int i = 0; i < m_tm_wcap.size(); i+=2) {
00223 std::cout << "MdcId is " << i/2 << " TofId size " << m_tm_wcap[i].size() <<
00224 " Id " << m_tm_wcap[i][0] << " " << m_tm_wcap[i][m_tm_wcap[i].size() - 1] << std::endl;
00225 std::cout << "MdcId is " << i/2 << " EmcId size " << m_tm_wcap[i+1].size() <<
00226 " Id " << m_tm_wcap[i+1][0] << " " << m_tm_wcap[i+1][m_tm_wcap[i+1].size() - 1] << std::endl;
00227 }
00228 }
00229
00230 void BesTMTrig::startTMTrig() {
00231 ISvcLocator* svcLocator = Gaudi::svcLocator();
00232 StatusCode sc = svcLocator->service("BesGlobalTrigSvc", m_tmpSvc);
00233 m_pIBGT = dynamic_cast<BesGlobalTrigSvc* >(m_tmpSvc);
00234
00235
00236 std::vector<int> tm_mdcstrkId;
00237 std::vector<int> tm_mdcltrkId;
00238 std::vector<int> mdcstrkId = m_pIBGT->getMdcStrkId();
00239 std::vector<int> mdcltrkId = m_pIBGT->getMdcLtrkId();
00240 for(unsigned int i = 0; i < mdcstrkId.size(); i++)
00241 {
00242 int trackId = int (mdcstrkId[i]/2);
00243 if(find(tm_mdcstrkId.begin(),tm_mdcstrkId.end(),trackId) == tm_mdcstrkId.end()) tm_mdcstrkId.push_back(trackId);
00244 }
00245 for(unsigned int i = 0; i < mdcltrkId.size(); i++)
00246 {
00247 int trackId = int (mdcltrkId[i]/2);
00248 if(find(tm_mdcltrkId.begin(),tm_mdcltrkId.end(),trackId) == tm_mdcltrkId.end()) tm_mdcltrkId.push_back(trackId);
00249 }
00250
00251 std::map<int,std::vector<int>,greater<int> > tofHit;
00252 std::vector<int> tm_btofhitId;
00253 std::vector<int> tm_etofhitId;
00254 std::vector<int> tm_wtofhitId;
00255 tofHit = m_pIBGT->getTofHitPos();
00256 for(std::map<int,std::vector<int>,greater<int> >::iterator iter = tofHit.begin(); iter != tofHit.end(); iter++) {
00257 if(iter->first == 0) {
00258 for(unsigned int i = 0; i < iter->second.size(); i++){
00259 tm_etofhitId.push_back(iter->second[i]);
00260 }
00261 }
00262 if(iter->first == 1) {
00263 for(unsigned int i = 0; i < iter->second.size(); i++){
00264 tm_btofhitId.push_back(iter->second[i]);
00265 }
00266 }
00267 if(iter->first == 2) {
00268 for(unsigned int i = 0; i < iter->second.size(); i++){
00269 tm_wtofhitId.push_back(iter->second[i]);
00270 }
00271 }
00272 }
00273
00274 std::map<int,std::vector<complex<int> >, greater<int> > emcHit;
00275 std::vector<int> tm_bemcClusId;
00276 std::vector<int> tm_eemcClusId;
00277 std::vector<int> tm_wemcClusId;
00278 emcHit = m_pIBGT->getEmcClusId();
00279 for(std::map<int,std::vector<complex<int> >, greater<int> >::iterator iter = emcHit.begin(); iter != emcHit.end(); iter++) {
00280 if(iter->first == 1) {
00281 for(unsigned int i = 0; i < iter->second.size(); i++)
00282 {
00283
00284 int crystalId = iter->second[i].imag();
00285 if(find(tm_bemcClusId.begin(),tm_bemcClusId.end(),crystalId) == tm_bemcClusId.end()) tm_bemcClusId.push_back(crystalId);
00286 }
00287 }
00288 if(iter->first == 0) {
00289 for(unsigned int i = 0; i < iter->second.size(); i++)
00290 {
00291
00292 int crystalId = int ((iter->second[i].imag())/2);
00293 if(find(tm_eemcClusId.begin(),tm_eemcClusId.end(),crystalId) == tm_eemcClusId.end()) tm_eemcClusId.push_back(crystalId);
00294 }
00295 }
00296 if(iter->first == 2) {
00297 for(unsigned int i = 0; i < iter->second.size(); i++)
00298 {
00299
00300 int crystalId = int ((iter->second[i].imag())/2);
00301 if(find(tm_wemcClusId.begin(),tm_wemcClusId.end(),crystalId) == tm_wemcClusId.end()) tm_wemcClusId.push_back(crystalId);
00302 }
00303 }
00304 }
00305
00306 int BTOF_MATCH[64];
00307 int ETOF_MATCH[64];
00308 int WTOF_MATCH[64];
00309 int BEMC_MATCH[64];
00310 int EEMC_MATCH[64];
00311 int WEMC_MATCH[64];
00312 int BTOF_EMC_MATCH[64];
00313 int ETOF_EMC_MATCH[64];
00314 int WTOF_EMC_MATCH[64];
00315 for(int i = 0; i < 64; i++) {
00316 BTOF_MATCH[i] = 0;
00317 ETOF_MATCH[i] = 0;
00318 WTOF_MATCH[i] = 0;
00319 BEMC_MATCH[i] = 0;
00320 EEMC_MATCH[i] = 0;
00321 WEMC_MATCH[i] = 0;
00322 BTOF_EMC_MATCH[i] = 0;
00323 ETOF_EMC_MATCH[i] = 0;
00324 WTOF_EMC_MATCH[i] = 0;
00325 }
00326 for(unsigned int i = 0; i < tm_mdcltrkId.size(); i++) {
00327 int cellId = tm_mdcltrkId[i];
00328 for(unsigned int j = 0; j < (m_tm_barrel[2*cellId]).size(); j++) {
00329 if(find(tm_btofhitId.begin(),tm_btofhitId.end(),m_tm_barrel[2*cellId][j]) != tm_btofhitId.end()) { BTOF_MATCH[cellId] = 1; break; }
00330 }
00331 for(unsigned int j = 0; j < (m_tm_barrel[2*cellId+1]).size(); j++) {
00332 if(find(tm_bemcClusId.begin(),tm_bemcClusId.end(),m_tm_barrel[2*cellId+1][j]) != tm_bemcClusId.end()) { BEMC_MATCH[cellId] = 1; break; }
00333 }
00334 }
00335 for(unsigned int i = 0; i < tm_mdcstrkId.size(); i++) {
00336 int cellId = tm_mdcstrkId[i];
00337 for(unsigned int j = 0; j < (m_tm_ecap[2*cellId]).size(); j++) {
00338 if(find(tm_etofhitId.begin(),tm_etofhitId.end(),m_tm_ecap[2*cellId][j]) != tm_etofhitId.end()) { ETOF_MATCH[cellId] = 1; break; }
00339 }
00340 for(unsigned int j = 0; j < (m_tm_ecap[2*cellId+1]).size(); j++) {
00341 if(find(tm_eemcClusId.begin(),tm_eemcClusId.end(),m_tm_ecap[2*cellId+1][j]) != tm_eemcClusId.end()) { EEMC_MATCH[cellId] = 1; break; }
00342 }
00343 for(unsigned int j = 0; j < (m_tm_wcap[2*cellId]).size(); j++) {
00344 if(find(tm_wtofhitId.begin(),tm_wtofhitId.end(),m_tm_wcap[2*cellId][j]) != tm_wtofhitId.end()) { WTOF_MATCH[cellId] = 1; break; }
00345 }
00346 for(unsigned int j = 0; j < (m_tm_wcap[2*cellId+1]).size(); j++) {
00347 if(find(tm_wemcClusId.begin(),tm_wemcClusId.end(),m_tm_wcap[2*cellId+1][j]) != tm_wemcClusId.end()) { WEMC_MATCH[cellId] = 1; break; }
00348 }
00349 }
00350
00351 int NATrk = 0;
00352 int NBTrk = 0;
00353 int NCTrk = 0;
00354 for(int i = 0; i < 64; i++) {
00355 if(BTOF_MATCH[i] == 1) NATrk++;
00356 if((BTOF_MATCH[i] == 1) && (BEMC_MATCH[i] == 1)) { BTOF_EMC_MATCH[i] = 1; NBTrk++; }
00357 if((ETOF_MATCH[i] == 1) && (EEMC_MATCH[i] == 1)) ETOF_EMC_MATCH[i] = 1;
00358 if((WTOF_MATCH[i] == 1) && (WEMC_MATCH[i] == 1)) WTOF_EMC_MATCH[i] = 1;
00359 if(m_pIBGT->getEndCapMode() == 0) {
00360 if(ETOF_MATCH[i] == 1) NCTrk++;
00361 if(WTOF_MATCH[i] == 1) NCTrk++;
00362 }
00363 else {
00364 if(ETOF_EMC_MATCH[i] == 1) NCTrk++;
00365 if(WTOF_EMC_MATCH[i] == 1) NCTrk++;
00366 }
00367 }
00368
00369 bool NATrk1 = false;
00370 bool NATrk2 = false;
00371 bool ATrk_BB = false;
00372 bool NBTrk1 = false;
00373 bool NBTrk2 = false;
00374 bool BTrk_BB = false;
00375 bool NCTrk1 = false;
00376 bool NCTrk2 = false;
00377 bool CTrk_BB = false;
00378
00379 if(NATrk >= 1) NATrk1 = true;
00380 if(NATrk >= 2) NATrk2 = true;
00381 if(NBTrk >= 1) NBTrk1 = true;
00382 if(NBTrk >= 2) NBTrk2 = true;
00383 if(NCTrk >= 1) NCTrk1 = true;
00384 if(NCTrk >= 2) NCTrk2 = true;
00385
00386 for(int i = 0; i < 64; i++) {
00387 if(BTOF_MATCH[i] == 1) {
00388 for(int j=0; j < 7; j++)
00389 {
00390 int id;
00391 if((i+j+29) > 63)
00392 {
00393 id = i+j+29-64;
00394 }
00395 else
00396 {
00397 id = i+j+29;
00398 }
00399 if(BTOF_MATCH[id] == 1) ATrk_BB = true;
00400 }
00401 }
00402 if(BTOF_EMC_MATCH[i] == 1) {
00403 for(int j=0; j < 7; j++)
00404 {
00405 int id;
00406 if((i+j+29) > 63)
00407 {
00408 id = i+j+29-64;
00409 }
00410 else
00411 {
00412 id = i+j+29;
00413 }
00414 if(BTOF_EMC_MATCH[id] == 1) BTrk_BB = true;
00415 }
00416 }
00417 if(m_pIBGT->getEndCapMode() == 0) {
00418 if((ETOF_MATCH[i] == 1) || (WTOF_MATCH[i] == 1)) {
00419 for(int j=0; j < 7; j++)
00420 {
00421 int id;
00422 if((i+j+29) > 63)
00423 {
00424 id = i+j+29-64;
00425 }
00426 else
00427 {
00428 id = i+j+29;
00429 }
00430 if((ETOF_MATCH[id] == 1) || (WTOF_MATCH[id] == 1)) CTrk_BB = true;
00431 }
00432 }
00433 }
00434 else {
00435 if((ETOF_EMC_MATCH[i] == 1) || (WTOF_EMC_MATCH[i] == 1)) {
00436 for(int j=0; j < 7; j++)
00437 {
00438 int id;
00439 if((i+j+29) > 63)
00440 {
00441 id = i+j+29-64;
00442 }
00443 else
00444 {
00445 id = i+j+29;
00446 }
00447 if((ETOF_EMC_MATCH[id] == 1) || (WTOF_EMC_MATCH[id] == 1)) CTrk_BB = true;
00448 }
00449 }
00450 }
00451 }
00452
00453 m_pIBGT->setTMNATrk1(NATrk1);
00454 m_pIBGT->setTMNATrk2(NATrk2);
00455 m_pIBGT->setTMATrkBB(ATrk_BB);
00456 m_pIBGT->setTMNBTrk1(NBTrk1);
00457 m_pIBGT->setTMNBTrk2(NBTrk2);
00458 m_pIBGT->setTMBTrkBB(BTrk_BB);
00459 m_pIBGT->setTMNCTrk1(NCTrk1);
00460 m_pIBGT->setTMNCTrk2(NCTrk2);
00461 m_pIBGT->setTMCTrkBB(CTrk_BB);
00462 }