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
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
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
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 }