22 #include "StFttClusterMaker.h"
25 #include "StEvent/StFttRawHit.h"
26 #include "StEvent/StFttCluster.h"
27 #include "StEvent/StEvent.h"
28 #include "StEvent/StFttCollection.h"
30 #include "StFttDbMaker/StFttDb.h"
34 StFttClusterMaker::StFttClusterMaker(
const char* name )
41 LOG_DEBUG <<
"StFttClusterMaker::ctor" << endm;
45 StFttClusterMaker::~StFttClusterMaker()
52 StFttClusterMaker::Init()
54 LOG_INFO <<
"StFttClusterMaker::Init" << endm;
61 StFttClusterMaker::InitRun( Int_t runnumber )
63 mRunYear = ( runnumber + 727000 ) / 1000000 + 1999;
65 LOG_INFO <<
"runnumber: " << runnumber <<
" --> year: " << mRunYear << endm;
72 StFttClusterMaker::FinishRun( Int_t runnumber )
89 mEvent = (
StEvent*)GetInputDS(
"StEvent");
92 LOG_WARN<<
"No StEvent!"<<endm;
95 mFttCollection=mEvent->fttCollection();
97 LOG_WARN <<
"No StFttCollection" << endm;
101 mFttDb =
static_cast<StFttDb*
>(GetDataSet(
"fttDb"));
104 LOG_DEBUG <<
"Found " << mFttCollection->rawHits().size() <<
" Ftt Hits" << endm;
116 std::map< UChar_t, std::vector<StFttRawHit *> > hStripsPerRob;
117 std::map< UChar_t, std::vector<StFttRawHit *> > vStripsPerRob;
118 std::map< UChar_t, std::vector<StFttRawHit *> > dhStripsPerRob;
119 std::map< UChar_t, std::vector<StFttRawHit *> > dvStripsPerRob;
121 size_t nStripsHit = 0;
123 UChar_t rob = mFttDb->rob(
hit );
124 UChar_t so = mFttDb->orientation(
hit );
127 if ( !PassTimeCut(
hit ) )
continue;
129 if ( kFttHorizontal == so ){
130 hStripsPerRob[ rob ].push_back(
hit);
133 if ( kFttVertical == so ){
134 vStripsPerRob[ rob ].push_back(
hit);
137 if ( kFttDiagonalH == so ){
138 dhStripsPerRob[ rob ].push_back(
hit);
141 if ( kFttDiagonalV == so ){
142 dvStripsPerRob[ rob ].push_back(
hit);
147 size_t nClusters = 0;
148 LOG_DEBUG <<
"StFttClusterMaker::Make{ nStripsHit = " << nStripsHit <<
" }" << endm;
149 if ( nStripsHit > 0 ){
150 for ( UChar_t iRob = 1; iRob < StFttDb::nRob+1; iRob++ ){
152 auto hClusters = FindClusters( hStripsPerRob[iRob] );
155 mFttCollection->addCluster( clu );
158 auto vClusters = FindClusters( vStripsPerRob[iRob] );
161 mFttCollection->addCluster( clu );
164 auto hdClusters = FindClusters( dhStripsPerRob[iRob] );
167 mFttCollection->addCluster( clu );
170 auto vdClusters = FindClusters( dvStripsPerRob[iRob] );
173 mFttCollection->addCluster( clu );
178 LOG_DEBUG <<
"Found " << nClusters <<
" clusters this event" << endm;
183 void StFttClusterMaker::InjectTestData(){
184 mFttCollection->rawHits().clear();
187 hit->setMapping( 1, 1, 1, 23, kFttHorizontal );
188 mFttCollection->addRawHit( hit );
190 hit =
new StFttRawHit( 1, 1, 1, 1, 1, 90, 1, 1, 0 );
191 hit->setMapping( 1, 1, 1, 24, kFttHorizontal );
192 mFttCollection->addRawHit( hit );
194 hit =
new StFttRawHit( 1, 1, 1, 1, 1, 60, 1, 1, 0 );
195 hit->setMapping( 1, 1, 1, 27, kFttHorizontal );
196 mFttCollection->addRawHit( hit );
198 hit =
new StFttRawHit( 1, 1, 1, 1, 1, 95, 1, 1, 0 );
199 hit->setMapping( 1, 1, 1, 25, kFttHorizontal );
200 mFttCollection->addRawHit( hit );
202 hit =
new StFttRawHit( 1, 1, 1, 1, 1, 93, 1, 1, 0 );
203 hit->setMapping( 1, 1, 1, 26, kFttHorizontal );
204 mFttCollection->addRawHit( hit );
206 hit =
new StFttRawHit( 1, 1, 1, 1, 1, 19, 1, 1, 0 );
207 hit->setMapping( 1, 1, 1, 28, kFttHorizontal );
208 mFttCollection->addRawHit( hit );
212 bool StFttClusterMaker::PassTimeCut(
StFttRawHit * hit ){
213 int time_cut0 = -999;
217 mFttDb->getTimeCut(hit, time_cutm, time_cut0, time_cut1);
218 if ( time_cutm == 0 )
219 return (hit->time() <= time_cut1 && hit->time() >= time_cut0);
222 return (hit->tb() <= time_cut1 && hit->tb() >= time_cut0);
226 StFttRawHit * StFttClusterMaker::FindMaxAdc( std::vector<StFttRawHit *> hits,
size_t &pos ){
227 auto itMax = std::max_element(hits.begin(),
231 pos = (itMax - hits.begin());
232 if ( itMax == hits.end() )
return nullptr;
236 void StFttClusterMaker::SearchClusterEdges( std::vector< StFttRawHit * > hits,
238 size_t &left,
size_t &right ){
243 auto lastHitLeft = hits[start];
244 auto lastHitRight = hits[start];
246 bool searchRight =
true;
247 bool searchLeft =
true;
249 StFttRawHit *hitLeft =
nullptr, *hitRight =
nullptr;
251 while ( searchRight || searchLeft ){
252 LOG_DEBUG <<
"LEFT: " << left <<
", RIGHT: " << right <<
", start = " << start <<
", size=" << hits.size() << endm;
254 if ( right == hits.size() || right == hits.size() - 1 ){
259 hitRight = hits[right+1];
260 if ( hitRight->adc() > lastHitRight->adc() || hitRight->adc() < GetThresholdFor( hitRight ) ){
263 if ( hitRight->row() != lastHitRight->row() || abs( hitRight->strip() - lastHitRight->strip() ) > 1 ){
269 lastHitRight = hitRight;
278 hitLeft = hits[left-1];
279 if ( hitLeft->adc() > lastHitLeft->adc() || hitLeft->adc() < GetThresholdFor( hitLeft ) ){
282 if ( hitLeft->row() != lastHitLeft->row() || abs( hitLeft->strip() - lastHitLeft->strip() ) > 1 ){
288 lastHitLeft = hitLeft;
296 void StFttClusterMaker::CalculateClusterInfo(
StFttCluster * clu ){
298 clu->setNStrips( clu->rawHits().size() );
305 std::for_each (clu->rawHits().begin(), clu->rawHits().end(), [&](
const StFttRawHit *h) {
306 float x = ( h->strip() * 3.2 - 1.6 );
309 m1Sum += (h->adc() * x);
310 m2Sum += ( h->adc() * x * x );
314 LOG_INFO <<
"m0Sum = " << m0Sum << endm;
315 LOG_INFO <<
"m1Sum = " << m1Sum << endm;
316 LOG_INFO <<
"m2Sum = " << m2Sum << endm;
323 clu->setSumAdc( m0Sum );
324 clu->setX( m1Sum / m0Sum );
325 float var = (m2Sum - m1Sum*m1Sum / m0Sum) / m0Sum;
326 clu->setSigma( sqrt( var ) );
331 std::vector<StFttCluster*> StFttClusterMaker::FindClusters( std::vector< StFttRawHit * > hits ){
332 std::vector<StFttCluster*> clusters;
340 const bool dedup =
false;
344 return a->plane() < b->plane() ||
345 a->quadrant() < b->quadrant() ||
346 a->row() < b->row() ||
347 a->strip() < b->strip() ||
348 a->orientation() < b->orientation();
352 set<StFttRawHit*, decltype(cmp)> s(cmp);
353 unsigned size = hits.size();
354 for(
auto h : hits ) s.insert( h );
355 hits.assign( s.begin(), s.end() );
360 size_t indexA = a->orientation() + StFttDb::nStripOrientations * ( a->strip() + a->row() * StFttDb::maxStripPerRow);
361 size_t indexB = b->orientation() + StFttDb::nStripOrientations * ( b->strip() + b->row() * StFttDb::maxStripPerRow);
362 return indexA < indexB;
366 LOG_INFO <<
"We have " << hits.size() <<
" hits after removing duplicates" << endm;
371 size_t anchor = hits.size()+1;
372 auto maxAdcHit = FindMaxAdc( hits, anchor );
379 LOG_DEBUG <<
"CLUSTER FIND START WITH HITS:" << endm;
381 for (
auto *h : hits ){
382 LOG_DEBUG <<
"[" << i <<
"]" << *h;
388 clu->setPlane ( maxAdcHit->plane ( ) );
389 clu->setQuadrant ( maxAdcHit->quadrant ( ) );
390 clu->setRow ( maxAdcHit->row ( ) );
391 clu->setOrientation ( maxAdcHit->orientation ( ) );
394 size_t left = anchor, right = anchor;
395 SearchClusterEdges( hits, anchor, left, right);
397 LOG_DEBUG <<
"Cluster points ( " << left <<
", " << anchor <<
", " << right <<
" )" << endm;
401 for (
size_t i = left; i < right + 1; i++ ){
402 clu->addRawHit( hits[i] );
406 CalculateClusterInfo( clu );
409 LOG_INFO << *clu << endm;;
411 clusters.push_back( clu );
414 hits.erase( hits.begin() + left, hits.begin() + right + 1 );
415 maxAdcHit = FindMaxAdc( hits, anchor );
422 void StFttClusterMaker::ApplyHardwareMap(){
423 for (
StFttRawHit* rawHit : mFttCollection->rawHits() ) {
424 mFttDb->hardwareMap( rawHit );