//$Id$ // Author: Anders Vestbo //*-- Copyright © ASV #include #include #include "AliL3Logging.h" #include "AliL3ClustFinderNew.h" #include "AliL3DigitData.h" #include "AliL3Transform.h" #include "AliL3SpacePointData.h" #include "AliL3MemHandler.h" /** \class AliL3ClustFinderNew //
//_____________________________________________________________
// AliL3ClustFinderNew
//
// The current cluster finder for HLT
// Based on STAR L3
//
*/ ClassImp(AliL3ClustFinderNew) AliL3ClustFinderNew::AliL3ClustFinderNew() { fMatch = 4; fThreshold = 10; fXYErr = 0.2; fZErr = 0.3; fDeconvPad = kTRUE; fDeconvTime = kTRUE; fstdout = kFALSE; fcalcerr = kTRUE; } AliL3ClustFinderNew::~AliL3ClustFinderNew() { } void AliL3ClustFinderNew::InitSlice(Int_t slice,Int_t patch,Int_t firstrow, Int_t lastrow,Int_t nmaxpoints) { fNClusters = 0; fMaxNClusters = nmaxpoints; fCurrentSlice = slice; fCurrentPatch = patch; fFirstRow = firstrow; fLastRow = lastrow; } void AliL3ClustFinderNew::InitSlice(Int_t slice,Int_t patch,Int_t nmaxpoints) { fNClusters = 0; fMaxNClusters = nmaxpoints; fCurrentSlice = slice; fCurrentPatch = patch; } void AliL3ClustFinderNew::SetOutputArray(AliL3SpacePointData *pt) { fSpacePointData = pt; } void AliL3ClustFinderNew::Read(UInt_t ndigits,AliL3DigitRowData *ptr) { fNDigitRowData = ndigits; fDigitRowData = ptr; } void AliL3ClustFinderNew::ProcessDigits() { //Loop over rows, and call processrow AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fDigitRowData; for(Int_t i=fFirstRow; i<=fLastRow; i++) { fCurrentRow = i; ProcessRow(tempPt); Byte_t *tmp = (Byte_t*)tempPt; Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData); tmp += size; tempPt = (AliL3DigitRowData*)tmp; } LOG(AliL3Log::kInformational,"AliL3ClustFinderNew::WriteClusters","Space points") <<"Cluster finder found "<fNDigit; bin++) { AliL3DigitData *data = tempPt->fDigitData; if(data[bin].fPad != last_pad) { //This is a new pad //Switch: if(currentPt == pad2) { currentPt = pad1; previousPt = pad2; } else { currentPt = pad2; previousPt = pad1; } n_previous = n_current; n_current = 0; if(bin[data].fPad != last_pad+1) { //this happens if there is a pad with no signal. n_previous = n_current = 0; } last_pad = data[bin].fPad; } Bool_t new_cluster = kTRUE; UInt_t seq_charge=0,seq_average=0,seq_error=0; UInt_t last_charge=0,last_was_falling=0; Int_t new_bin=-1; if(fDeconvTime) { redo: //This is a goto. if(new_bin > -1) { bin = new_bin; new_bin = -1; } last_charge=0; last_was_falling = 0; } while(1) //Loop over current sequence { if(data[bin].fTime >= AliL3Transform::GetNTimeBins()) { LOG(AliL3Log::kFatal,"AliL3ClustFinderNew::ProcessRow","Digits") <<"Timebin out of range "<<(Int_t)data[bin].fTime< last_charge) { if(last_was_falling) { new_bin = bin; break; } } else last_was_falling = 1; //last pixel was larger than this last_charge = charge; } //Sum the total charge of this sequence seq_charge += charge; seq_average += data[bin].fTime*charge; seq_error += data[bin].fTime*data[bin].fTime*charge; //Check where to stop: if(data[bin+1].fPad != data[bin].fPad) //new pad break; if(data[bin+1].fTime != data[bin].fTime+1) //end of sequence break; bin++; }//end loop over sequence //Calculate mean of sequence: Int_t seq_mean=0; if(seq_charge) seq_mean = seq_average/seq_charge; else { LOG(AliL3Log::kFatal,"AliL3ClustFinderNew::ProcessRow","Data") <<"Error in data given to the cluster finder"<fLastMergedPad==data[bin].fPad) continue; Int_t difference = seq_mean - previousPt[p]->fMean; if(difference < -fMatch) break; if(difference <= fMatch) //There is a match here!! { ClusterData *local = previousPt[p]; if(fDeconvPad) { if(seq_charge > local->fLastCharge) { if(local->fChargeFalling) //The previous pad was falling { break; //create a new cluster } } else local->fChargeFalling = 1; local->fLastCharge = seq_charge; } //Don't create a new cluster, because we found a match new_cluster = kFALSE; //Update cluster on current pad with the matching one: local->fTotalCharge += seq_charge; local->fPad += pad_mean; local->fPad2 += pad_error; local->fTime += seq_average; local->fTime2 += seq_error; local->fMean = seq_mean; local->fFlags++; //means we have more than one pad local->fLastMergedPad = data[bin].fPad; currentPt[n_current] = local; n_current++; break; } //Checking for match at previous pad } //Loop over results on previous pad. if(new_cluster) { //Start a new cluster. Add it to the clusterlist, and update //the list of pointers to clusters in current pad. //current pad will be previous pad on next pad. //Add to the clusterlist: ClusterData *tmp = &clusterlist[n_total]; tmp->fTotalCharge = seq_charge; tmp->fPad = pad_mean; tmp->fPad2 = pad_error; tmp->fTime = seq_average; tmp->fTime2 = seq_error; tmp->fMean = seq_mean; tmp->fFlags = 0; //flags for 1 pad clusters tmp->fLastMergedPad = data[bin].fPad; if(fDeconvPad) { tmp->fChargeFalling = 0; tmp->fLastCharge = seq_charge; } //Update list of pointers to previous pad: currentPt[n_current] = &clusterlist[n_total]; n_total++; n_current++; } if(fDeconvTime) if(new_bin >= 0) goto redo; }//Loop over digits on this padrow WriteClusters(n_total,clusterlist); } void AliL3ClustFinderNew::WriteClusters(Int_t n_clusters,ClusterData *list) { Int_t thisrow,thissector; UInt_t counter = fNClusters; for(int j=0; j= fMaxNClusters) { LOG(AliL3Log::kError,"AliL3ClustFinder::WriteClusters","Cluster Finder") <fRow < (UInt_t)fCurrentRow) { AliL3MemHandler::UpdateRowPointer(rowPt); continue; } AliL3DigitData *digPt = (AliL3DigitData*)rowPt->fDigitData; for(UInt_t j=0; jfNDigit; j++) { Int_t cpad = digPt[j].fPad; Int_t ctime = digPt[j].fTime; if(cpad != pad) continue; if(ctime != time) continue; //if(cpad != pad && ctime != ctime) continue; //cout<<"Reading row "<