/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Trigger/Trigger/Trigger-00-01-05/src/EmcCCount.cxx

Go to the documentation of this file.
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   //reset values
00039   EClus_Z = false;
00040   WClus_Z = false;
00041   //barrel
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   //endcaps
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         //check cluster z balance for charge track
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   //Find cluster position in endcap
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   //Find phi position of cluster in barrel
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   //Find phi position of cluster in west endcap 
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   //Find phi position of cluster in east endcap
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  // for(int i=0;i<TrigConf::TCPHINO_E/2;i++) cout<<"ClusterId output "<<EEClusterPhi[i]<<" "<<WEClusterPhi[i]<<endl;
00117     
00118     //set number of cluster in barrel and endcaps for service
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   //double L1TC_THRESH = m_pIBGT->getL1TC_THRESH();
00174   /*for(int i = 0; ; i++) {
00175     double theshold = RandGauss::shoot(m_pIBGT->getL1TC_THRESH(),3.3);
00176     if(theshold < m_pIBGT->getL1TC_THRESH()) {
00177       L1TC_THRESH = theshold;
00178       break;
00179     } 
00180   }*/
00181   
00182   //double energy0,energy1,energy2,energy3,energy4,energy5,energy6,energy7,energy8;
00183   int clus0,clus1,clus3,clus4,clus8;
00184  /* if(partId==1)
00185   {
00186 // Cluster Finder Logic
00187 //              Phi--->
00188 //              |---|----|----|
00189 //              | 5 |  1 | 6  |
00190 //              |---|----|----|
00191 //              | 2 |  0 | 3  |   
00192 //              |---|----|----|   ^
00193 //              | 7 |  4 | 8  |   |
00194 //              |---|----|----| Theta
00195      energy0 = m_EmcTCFinder->getBTCEnergy(TCThetaNb,TCPhiNb);
00196      if(energy0>L1TC_THRESH)
00197      {
00198        //trigger cell index from 0, not 1, so TrigConf::TCTHETANO_B - 1 or TrigConf::TCPHINO_B - 1 needed 
00199        if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)) energy1 = m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,TCPhiNb);
00200        else energy1 = 0.0;
00201                         
00202        if(TCPhiNb!=0) energy2 = m_EmcTCFinder->getBTCEnergy(TCThetaNb,TCPhiNb-1);
00203        else energy2 = m_EmcTCFinder->getBTCEnergy(TCThetaNb,TrigConf::TCPHINO_B-1);
00204                         
00205        if(TCPhiNb!=(TrigConf::TCPHINO_B-1)) energy3 = m_EmcTCFinder->getBTCEnergy(TCThetaNb,TCPhiNb+1);
00206        else energy3 = m_EmcTCFinder->getBTCEnergy(TCThetaNb,0);
00207                         
00208        if(TCThetaNb!=0) energy4 = m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,TCPhiNb);
00209        else energy4 = 0.0;
00210                         
00211        if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb!=0) energy5 = m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,TCPhiNb-1);
00212        if(TCThetaNb==(TrigConf::TCTHETANO_B-1)) energy5 = 0.0;
00213        if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb==0) energy5 = m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,TrigConf::TCPHINO_B-1);
00214                         
00215        if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb!=(TrigConf::TCPHINO_B-1)) energy6 = m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,TCPhiNb+1);
00216        if(TCThetaNb==(TrigConf::TCTHETANO_B-1)) energy6 = 0.0;
00217        if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb==(TrigConf::TCPHINO_B-1)) energy6 = m_EmcTCFinder->getBTCEnergy(TCThetaNb+1,0);
00218  
00219        if(TCThetaNb!=0&&TCPhiNb!=0) energy7 = m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,TCPhiNb-1);
00220        if(TCThetaNb==0) energy7=0;
00221        if(TCThetaNb!=0&&TCPhiNb==0) energy7 = m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,TrigConf::TCPHINO_B-1);
00222  
00223        if(TCThetaNb!=0&&TCPhiNb!=(TrigConf::TCPHINO_B-1)) energy8 = m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,TCPhiNb+1);
00224        if(TCThetaNb==0) energy8 = 0.0;
00225        if(TCThetaNb!=0&&TCPhiNb==(TrigConf::TCPHINO_B-1)) energy8 = m_EmcTCFinder->getBTCEnergy(TCThetaNb-1,0);
00226  
00227        if((energy3>=L1TC_THRESH)||(energy1>=L1TC_THRESH)||((energy4>=L1TC_THRESH)&&(energy8>=L1TC_THRESH)))
00228        {        
00229          return false;
00230        }
00231        else return true;
00232     }
00233     else return false;
00234   }*/
00235   if(partId==1)
00236   {
00237 // Cluster Finder Logic
00238 //              <---Theta
00239 //              |---|----|----|
00240 //              | 5 |  1 | 6  |
00241 //              |---|----|----|
00242 //              | 2 |  0 | 3  |  Phi 
00243 //              |---|----|----|   |
00244 //              | 7 |  4 | 8  |   |
00245 //              |---|----|----|   ^
00246      clus0 = m_EmcTCFinder->getBTC(TCThetaNb,TCPhiNb);
00247      if(clus0 > 0)
00248      {
00249        //trigger cell index from 0, not 1, so TrigConf::TCTHETANO_B - 1 or TrigConf::TCPHINO_B - 1 needed 
00250        if(TCPhiNb != 0) clus1 = m_EmcTCFinder->getBTC(TCThetaNb,TCPhiNb - 1);
00251        else clus1 = m_EmcTCFinder->getBTC(TCThetaNb,TrigConf::TCPHINO_B-1);
00252 
00253 //       if(TCPhiNb!=0) clus2 = m_EmcTCFinder->getBTC(TCThetaNb,TCPhiNb-1);
00254 //       else clus2 = m_EmcTCFinder->getBTC(TCThetaNb,TrigConf::TCPHINO_B-1);
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 //       if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb!=0) clus5 = m_EmcTCFinder->getBTC(TCThetaNb+1,TCPhiNb-1);
00263 //       if(TCThetaNb==(TrigConf::TCTHETANO_B-1)) clus5 = 0;
00264 //       if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb==0) clus5 = m_EmcTCFinder->getBTC(TCThetaNb+1,TrigConf::TCPHINO_B-1);
00265 
00266 //       if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb!=(TrigConf::TCPHINO_B-1)) clus6 = m_EmcTCFinder->getBTC(TCThetaNb+1,TCPhiNb+1);
00267 //       if(TCThetaNb==(TrigConf::TCTHETANO_B-1)) clus6 = 0;
00268 //       if(TCThetaNb!=(TrigConf::TCTHETANO_B-1)&&TCPhiNb==(TrigConf::TCPHINO_B-1)) clus6 = m_EmcTCFinder->getBTC(TCThetaNb+1,0);
00269 
00270 //       if(TCThetaNb!=0&&TCPhiNb!=0) clus7 = m_EmcTCFinder->getBTC(TCThetaNb-1,TCPhiNb-1);
00271 //       if(TCThetaNb==0) clus7 = 0;
00272 //       if(TCThetaNb!=0&&TCPhiNb==0) clus7 = m_EmcTCFinder->getBTC(TCThetaNb-1,TrigConf::TCPHINO_B-1);
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        //if((clus3 > 0)||(clus1 > 0)||((clus4 > 0)&&(clus8 > 0)))
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 /* Cluster Finder Logic (1)
00289              <---phi
00290       |---|
00291       | 1 |      
00292       |---|---| /|\
00293       | 0 | 2 |  |
00294       |---|---| theta
00295   if(partId==0)
00296   {
00297     if(TCThetaNb==0)
00298     {
00299       energy0 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TCPhiNb);
00300       energy1 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb+1,TCPhiNb);
00301       if(TCPhiNb!=0) energy2 =m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TCPhiNb-1);
00302       else energy2 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TrigConf::TCPHINO_E-1);
00303       if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)&&(energy2<L1TC_THRESH)) return true;
00304       else return false;
00305     }
00306     if(TCThetaNb==(TrigConf::TCTHETANO_E-1))
00307     {
00308       energy0 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TCPhiNb);
00309       if(TCPhiNb!=0) energy1 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TCPhiNb-1);
00310       else energy1 = m_EmcTCFinder->GetEETCEnergy(TCThetaNb,TrigConf::TCPHINO_E-1);
00311       if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)) return true;
00312       else return false;
00313     }
00314   }
00315   if(partId==2)
00316   {
00317     if(TCThetaNb==0)
00318     {
00319       energy0 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TCPhiNb);
00320       energy1 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb+1,TCPhiNb);
00321       if(TCPhiNb!=0) energy2 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TCPhiNb-1);
00322       else energy2 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TrigConf::TCPHINO_E-1);
00323       if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)&&(energy2<L1TC_THRESH)) return true;
00324       else return false;
00325     }
00326     if(TCThetaNb==(TrigConf::TCTHETANO_E-1))
00327     {
00328       energy0 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TCPhiNb);
00329       if(TCPhiNb!=0) energy1 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TCPhiNb-1);
00330       else energy1 = m_EmcTCFinder->GetWETCEnergy(TCThetaNb,TrigConf::TCPHINO_E-1);
00331       if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)) return true;
00332       else return false;
00333     }
00334   }
00335 */
00336   //------------------------------------------------------------------------------------
00337 /*Cluster Finder Logic (1) 
00338              <---phi
00339             
00340       |---|---| /|\
00341       | 0 | 1 |  |
00342       |---|---| theta
00343   //if(partId==0)
00344   //{
00345   //  energy0 = m_EmcTCFinder->getEETCEnergy(TCThetaNb,TCPhiNb);
00346   //  if(TCPhiNb!=0) {
00347   //    energy1 = m_EmcTCFinder->getEETCEnergy(TCThetaNb,TCPhiNb-1);
00348   //  }
00349   //  else {
00350   //    energy1 = m_EmcTCFinder->getEETCEnergy(TCThetaNb,(TrigConf::TCPHINO_E-1));
00351   //  }
00352   //  if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)) return true;
00353   //  else return false;
00354   //}
00355 
00356   if(partId==0)
00357   {
00358     clus0 = m_EmcTCFinder->getEETC(TCThetaNb,TCPhiNb);
00359     if(TCPhiNb!=0) {
00360       clus1 = m_EmcTCFinder->getEETC(TCThetaNb,TCPhiNb-1);
00361     }
00362     else {
00363       clus1 = m_EmcTCFinder->getEETC(TCThetaNb,(TrigConf::TCPHINO_E-1));
00364     }
00365     if((clus0 > 0)&&(clus1 == 0)) return true;
00366     else return false;
00367   }
00368 
00369   //if(partId==2)
00370   //{
00371   //  energy0 = m_EmcTCFinder->getWETCEnergy(TCThetaNb,TCPhiNb);
00372   //  if(TCPhiNb!=0) {
00373   //    energy1 = m_EmcTCFinder->getWETCEnergy(TCThetaNb,TCPhiNb-1);
00374   //  }
00375   //  else {
00376   //    energy1 = m_EmcTCFinder->getWETCEnergy(TCThetaNb,(TrigConf::TCPHINO_E-1));
00377   //  }
00378   //  if((energy0>=L1TC_THRESH)&&(energy1<L1TC_THRESH)) return true;
00379   //  else return false;
00380   //}
00381 
00382   if(partId==2)
00383   {
00384     clus0 = m_EmcTCFinder->getWETC(TCThetaNb,TCPhiNb);
00385     if(TCPhiNb!=0) {
00386       clus1 = m_EmcTCFinder->getWETC(TCThetaNb,TCPhiNb-1);
00387     }
00388     else {
00389       clus1 = m_EmcTCFinder->getWETC(TCThetaNb,(TrigConf::TCPHINO_E-1));
00390     }
00391     if((clus0 > 0)&&(clus1 == 0)) return true;
00392     else return false;
00393   }
00394 */
00395 
00396 /*Cluster Finder Logic (2) 
00397              <---phi
00398             
00399       |---|---| /|\
00400       | 0 | 1 |  |
00401       |---|---| theta
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 /*Cluster Finder Logic (2) 
00429              <---phi
00430             
00431       |---|---| /|\
00432       | 1 | 0 |  |
00433       |---|---| theta
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 }

Generated on Tue Nov 29 23:14:40 2016 for BOSS_7.0.2 by  doxygen 1.4.7