• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

beamtime/cosy-jan12/go4/STS/TSTSClusterizer.cxx (r4864/r3090)

Go to the documentation of this file.
00001 #include "TSTSClusterizer.h"
00002 #include "TMath.h"
00003 
00004 TSTSClusterizer::TSTSClusterizer( Int_t det, Int_t side ) :
00005         fDetector( det ),
00006         fSide( side )
00007 {
00008         fTimeTolerance = kDefTimeTolerance;
00009         fSpaceTolerance = kDefSpaceTolerance;
00010         fTimeWindow = kDefTimeWindow;
00011         fLatestDigiTime = 0;
00012         CheckTimeWindowGtTimeTol();
00013 }
00014 
00015 
00016 
00017 TSTSClusterizer::~TSTSClusterizer()
00018 {
00019 
00020 }
00021 
00022 
00023 
00024 void TSTSClusterizer::CheckTimeWindowSufficient( const TSTSDigi & newDigi )
00025 {
00026     if( - (newDigi.GetTime() - fLatestDigiTime ) + fTimeTolerance >= fTimeWindow ) {
00027         fTimeWindow = fTimeWindow * 2;
00028         printf("Error in TSTSClusterizer::CheckTimeWindowSufficient: Time window is too small. Increasing by factor of 2... New time window is %lld. Happened at time %lld\n", fTimeWindow, newDigi.GetTime() );
00029     }
00030     if( newDigi.GetTime() > fLatestDigiTime ) {
00031         fLatestDigiTime = newDigi.GetTime();
00032     }
00033 }
00034 
00035 void TSTSClusterizer::CheckTimeWindowGtTimeTol() {
00036     if( fTimeTolerance >= fTimeWindow ) {
00037         printf("Error in TSTSClusterizer: fTimeWindow is not larger than fTimeTolerance. Setting fTimeWindow = fTimeTolerance, which is %lld\n", fTimeTolerance );
00038         fTimeWindow = fTimeTolerance;
00039     }
00040 }
00041 
00042 
00043 
00044 Bool_t TSTSClusterizer::Match( const TSTSDigi & digi1, const TSTSDigi & digi2 ) const
00045 {
00046         return ( TMath::Abs( digi1.GetTime() - digi2.GetTime() ) <= fTimeTolerance )
00047                         && ( TMath::Abs( digi1.GetStrip() - digi2.GetStrip() ) <= fSpaceTolerance );
00048 }
00049 
00050 
00051 
00052 Bool_t TSTSClusterizer::Match( const TSTSCluster & cluster, const TSTSDigi & digi ) const
00053 {
00054         for( Int_t iDigi = 0; iDigi < cluster.GetNDigis(); iDigi++ ) {
00055                 if( Match( digi, cluster.GetDigi( iDigi ) ) ) {
00056                         return kTRUE;
00057                 }
00058         }
00059         return kFALSE;
00060 }
00061 
00062 
00063 /*
00064  * Expects that: cluster exists, itDigi valid
00065  */
00066 void TSTSClusterizer::MoveDigiToCluster( TSTSCluster & cluster, const std::deque<TSTSDigi>::iterator & itDigi )
00067 {
00068    cluster.AddDigi(*itDigi);
00069    fDigis.erase(itDigi);
00070 }
00071 
00072 
00073 
00074 void TSTSClusterizer::InsertDigiSorted( const TSTSDigi & digi )
00075 {
00076     std::deque<TSTSDigi>::iterator it = fDigis.end();
00077     while( it != fDigis.begin() && ( it - 1 )->GetTime() > digi.GetTime() ) {
00078         --it;
00079     }
00080     fDigis.insert( it, digi );
00081 }
00082 
00083 
00084 void TSTSClusterizer::PrintBuffer() const
00085 {
00086     printf( "===> Printing clusterizer buffer. Side=%c, Det=%d\n", TSTSTopology::GetSideName( fSide ), fDetector );
00087     for( std::deque<TSTSDigi>::const_iterator it = fDigis.begin(); it != fDigis.end(); ++it) {
00088         it->Print();
00089     }
00090 }
00091 
00092 
00093 
00094 void TSTSClusterizer::FeedDigi( TSTSDigi const & digi )
00095 {
00096     InsertDigiSorted( digi );
00097     CheckTimeWindowSufficient( digi );
00098     // if( fTimeWindow > 10000 && fSide == 1 ) PrintBuffer();
00099 }
00100 
00101 
00102 
00103 Bool_t TSTSClusterizer::IsDigiBufferFilled( Bool_t noTrigger ) const
00104 {
00105     if( fDigis.size() == 0 ) {
00106         return kFALSE;
00107     }
00108     if( noTrigger ) {
00109         if( fDigis.back().GetTime() - fDigis.front().GetTime() < fTimeWindow ) {
00110             return kFALSE;
00111         }
00112     }
00113     return kTRUE;
00114 }
00115 
00116 
00117 
00118 /*
00119  * When noTrigger is kFALSE, has to be called only when all Digis are fed.
00120  */
00121 Bool_t TSTSClusterizer::FetchCluster( Bool_t noTrigger, TSTSCluster & cluster )
00122 {
00123     cluster.Reset();
00124     if( ! IsDigiBufferFilled( noTrigger ) ) {
00125         return kFALSE;
00126     }
00127 
00128     Long64_t clustMaxTime = fDigis.front().GetTime();
00129     MoveDigiToCluster( cluster, fDigis.begin() );
00130 
00131     Bool_t matchingDigiFound;
00132     do {
00133         matchingDigiFound = kFALSE;
00134         std::deque<TSTSDigi>::iterator fitDigiIter = fDigis.begin();
00135 
00136         while( fitDigiIter != fDigis.end() && fitDigiIter->GetTime() - clustMaxTime <= fTimeTolerance ) {
00137             if( Match( cluster, *fitDigiIter ) ) {
00138                 if( noTrigger ) {
00139                     if( (fDigis.back().GetTime() - fitDigiIter->GetTime()) < fTimeTolerance ) {
00140                         fTimeWindow = fTimeWindow * 2;
00141                         printf("Error in TClusterizer::FetchCluster: Too small time window. Increasing by factor of 2. New fTimeWindow is %lld\n", fTimeWindow );
00142                     }
00143                 }
00144                 clustMaxTime = fitDigiIter->GetTime();
00145                 MoveDigiToCluster( cluster, fitDigiIter );
00146                 matchingDigiFound = kTRUE;
00147                 break;
00148             }
00149             fitDigiIter++;
00150         }
00151 
00152     } while (matchingDigiFound );
00153 
00154     return kTRUE;
00155 }
00156 
00157 
00158 
00159 void TSTSClusterizer::SetTimeTolerance( Long64_t timeTolerance )
00160 {
00161     fTimeTolerance = timeTolerance;
00162     CheckTimeWindowGtTimeTol();
00163 }
00164 
00165 
00166 
00167 void TSTSClusterizer::SetTimeWindow( Long64_t timeWindow )
00168 {
00169     fTimeWindow = timeWindow;
00170     CheckTimeWindowGtTimeTol();
00171 }

Generated on Tue Dec 10 2013 04:52:18 for ROCsoft by  doxygen 1.7.1