// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
//*-- Copyright © ASV
-#include <iostream.h>
-#include <math.h>
+
+#include "AliL3StandardIncludes.h"
+
#include "AliL3Logging.h"
#include "AliL3ClustFinderNew.h"
#include "AliL3DigitData.h"
#include "AliL3SpacePointData.h"
#include "AliL3MemHandler.h"
+#if GCCVERSION == 3
+using namespace std;
+#endif
+
+/** \class AliL3ClustFinderNew
+//<pre>
//_____________________________________________________________
// AliL3ClustFinderNew
//
// The current cluster finder for HLT
// Based on STAR L3
+//</pre> */
ClassImp(AliL3ClustFinderNew)
AliL3ClustFinderNew::AliL3ClustFinderNew()
{
- fMatch = 4;
- fThreshold =10;
+ fMatch = 2;
+ 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)
fCurrentPatch = patch;
fFirstRow = firstrow;
fLastRow = lastrow;
- fDeconvTime = kTRUE;
- fDeconvPad = kTRUE;
}
void AliL3ClustFinderNew::InitSlice(Int_t slice,Int_t patch,Int_t nmaxpoints)
void AliL3ClustFinderNew::SetOutputArray(AliL3SpacePointData *pt)
{
-
fSpacePointData = pt;
}
-
void AliL3ClustFinderNew::Read(UInt_t ndigits,AliL3DigitRowData *ptr)
{
fNDigitRowData = ndigits;
fDigitRowData = ptr;
-
}
void AliL3ClustFinderNew::ProcessDigits()
ClusterData *pad2[2500]; //2 lists for internal memory=2pads
ClusterData clusterlist[5000]; //Clusterlist
- ClusterData **currentPt; //List of pointers to the current pad
+ ClusterData **currentPt; //List of pointers to the current pad
ClusterData **previousPt; //List of pointers to the previous pad
currentPt = pad2;
previousPt = pad1;
//Loop over sequences of this row:
for(UInt_t bin=0; bin<tempPt->fNDigit; bin++)
{
-
AliL3DigitData *data = tempPt->fDigitData;
if(data[bin].fPad != last_pad)
{
{
currentPt = pad1;
previousPt = pad2;
-
}
else
{
}
Bool_t new_cluster = kTRUE;
-
- UInt_t seq_charge=0,seq_average=0;
-
+ 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.
last_was_falling = 0;
}
-
while(1) //Loop over current sequence
{
if(data[bin].fTime >= AliL3Transform::GetNTimeBins())
//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;
//Calculate mean in pad direction:
Int_t pad_mean = seq_charge*data[bin].fPad;
-
+ Int_t pad_error = data[bin].fPad*pad_mean;
+
//Compare with results on previous pad:
for(UInt_t p=0; p<n_previous; p++)
{
+ //dont merge sequences on the same pad twice
+ if(previousPt[p]->fLastMergedPad==data[bin].fPad) continue;
+
Int_t difference = seq_mean - previousPt[p]->fMean;
- if(difference < -fMatch)
- break;
+ if(difference < -fMatch) break;
- if(difference <= fMatch)//There is a match here!!
+ 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
+ if(local->fChargeFalling) //The previous pad was falling
{
- break;//create a new cluster
+ break; //create a new cluster
}
}
else
new_cluster = kFALSE;
//Update cluster on current pad with the matching one:
- //currentPt[n_current] = previousPt[p];
-
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.
+ } //Checking for match at previous pad
+ } //Loop over results on previous pad.
if(new_cluster)
{
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;
n_total++;
n_current++;
}
+
if(fDeconvTime)
if(new_bin >= 0) goto redo;
-
}//Loop over digits on this padrow
WriteClusters(n_total,clusterlist);
if(list[j].fTotalCharge < fThreshold) continue; //noise cluster
Float_t xyz[3];
- Float_t fpad=(Float_t)list[j].fPad/(Float_t)list[j].fTotalCharge;
- Float_t ftime=(Float_t)list[j].fTime/(Float_t)list[j].fTotalCharge;
-
- //cout<<"WriteCluster: padrow "<<fCurrentRow<<" pad "<<fpad<<" time "<<ftime<<" charge "<<list[j].fTotalCharge<<endl;
+ Float_t fpad =(Float_t)list[j].fPad /(Float_t)list[j].fTotalCharge;
+ Float_t fpad2=fXYErr;
+ Float_t ftime =(Float_t)list[j].fTime /(Float_t)list[j].fTotalCharge;
+ Float_t ftime2=fZErr;
+
+ if(fcalcerr) {
+ fpad2=(Float_t)list[j].fPad2/(Float_t)list[j].fTotalCharge - fpad*fpad;
+ fpad2 = sqrt(fpad2);
+ ftime2=(Float_t)list[j].fTime2/(Float_t)list[j].fTotalCharge - ftime*ftime;
+ ftime2 = sqrt(ftime2);
+ }
+
+ if(fstdout==kTRUE)
+ cout<<"WriteCluster: padrow "<<fCurrentRow<<" pad "<<fpad << " +- "<<fpad2<<" time "<<ftime<<" +- "<<ftime2<<" charge "<<list[j].fTotalCharge<<endl;
AliL3Transform::Slice2Sector(fCurrentSlice,fCurrentRow,thissector,thisrow);
AliL3Transform::Raw2Local(xyz,thissector,thisrow,fpad,ftime);
fSpacePointData[counter].fY = xyz[1];
fSpacePointData[counter].fZ = xyz[2];
fSpacePointData[counter].fPadRow = fCurrentRow;
- fSpacePointData[counter].fXYErr = fXYErr;
- fSpacePointData[counter].fZErr = fZErr;
+ fSpacePointData[counter].fXYErr = fpad2;
+ fSpacePointData[counter].fZErr = ftime2;
fSpacePointData[counter].fID = counter
+((fCurrentSlice&0x7f)<<25)+((fCurrentPatch&0x7)<<22);//Uli
#ifdef do_mc
Int_t trackID[3];
GetTrackID((Int_t)rint(fpad),(Int_t)rint(ftime),trackID);
- cout<<"padrow "<<fCurrentRow<<" pad "<<(Int_t)rint(fpad)<<" time "<<(Int_t)rint(ftime)<<" Trackid "<<trackID[0]<<endl;
+ //cout<<"padrow "<<fCurrentRow<<" pad "<<(Int_t)rint(fpad)<<" time "<<(Int_t)rint(ftime)<<" Trackid "<<trackID[0]<<endl;
fSpacePointData[counter].fTrackID[0] = trackID[0];
fSpacePointData[counter].fTrackID[1] = trackID[1];
fSpacePointData[counter].fTrackID[2] = trackID[2];
#endif
+
fNClusters++;
counter++;
}