]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/src/AliL3ClustFinderNew.cxx
Default match should be 2
[u/mrichter/AliRoot.git] / HLT / src / AliL3ClustFinderNew.cxx
index c60b5ac71f9238d39c884533c248d787acd23317..fd6b4a2a019e364a1fa7fb9eac4cacd9ecde8a87 100644 (file)
@@ -3,8 +3,9 @@
 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
 //*-- Copyright &copy 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)
@@ -42,8 +52,6 @@ void AliL3ClustFinderNew::InitSlice(Int_t slice,Int_t patch,Int_t firstrow, Int_
   fCurrentPatch = patch;
   fFirstRow = firstrow;
   fLastRow = lastrow;
-  fDeconvTime = kTRUE;
-  fDeconvPad = kTRUE;
 }
 
 void AliL3ClustFinderNew::InitSlice(Int_t slice,Int_t patch,Int_t nmaxpoints)
@@ -56,16 +64,13 @@ 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()
@@ -98,7 +103,7 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
   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;
@@ -107,7 +112,6 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
   //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)
        {
@@ -118,7 +122,6 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
            {
              currentPt = pad1;
              previousPt = pad2;
-             
            }
          else 
            {
@@ -136,11 +139,10 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
        }
 
       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.
@@ -154,7 +156,6 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
          last_was_falling = 0;
        }
       
-
       while(1) //Loop over current sequence
        {
          if(data[bin].fTime >= AliL3Transform::GetNTimeBins())
@@ -185,7 +186,8 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
          //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; 
@@ -209,25 +211,28 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
       
       //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
@@ -239,20 +244,21 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
              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)
        {
@@ -264,9 +270,12 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
          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;
@@ -278,9 +287,9 @@ void AliL3ClustFinderNew::ProcessRow(AliL3DigitRowData *tempPt)
          n_total++;
          n_current++;
        }
+
       if(fDeconvTime)
        if(new_bin >= 0) goto redo;
-      
     }//Loop over digits on this padrow
   
   WriteClusters(n_total,clusterlist);
@@ -297,10 +306,20 @@ void AliL3ClustFinderNew::WriteClusters(Int_t n_clusters,ClusterData *list)
       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);
@@ -317,18 +336,19 @@ void AliL3ClustFinderNew::WriteClusters(Int_t n_clusters,ClusterData *list)
       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++;
     }