Added possibility to compile and run with mc information. This was done
authorvestbo <vestbo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 5 Jul 2002 16:08:03 +0000 (16:08 +0000)
committervestbo <vestbo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 5 Jul 2002 16:08:03 +0000 (16:08 +0000)
by adding a new data member to AliL3ClusterModel (in AliL3Models.h), and
a function AliL3Modeller::GetTrackID.

HLT/comp/AliL3Compress.cxx
HLT/comp/AliL3ModelTrack.cxx
HLT/comp/AliL3ModelTrack.h
HLT/comp/AliL3Modeller.cxx
HLT/comp/AliL3Modeller.h
HLT/comp/AliL3Models.h

index dc636f8..a4b35ef 100644 (file)
@@ -129,7 +129,7 @@ void AliL3Compress::ReadFile(Char_t which)
     delete fTracks;
   fTracks = new AliL3TrackArray("AliL3ModelTrack");
   
-  cout<<"Reading file "<<fname<<endl;
+  //cout<<"Reading file "<<fname<<endl;
   while(!feof(file))
     {
       AliL3ModelTrack *track = (AliL3ModelTrack*)fTracks->NextTrack();
@@ -146,7 +146,7 @@ void AliL3Compress::ReadFile(Char_t which)
     }
 
   fTracks->RemoveLast();
-  cout<<"Read "<<fTracks->GetNTracks()<<" tracks from file"<<endl;
+  //cout<<"Read "<<fTracks->GetNTracks()<<" tracks from file"<<endl;
   fclose(file);
 }
 
index b8945df..f92813d 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <stream.h>
 #include <string.h>
+#include <stdlib.h>
 #include <math.h>
 
 #include "AliL3ModelTrack.h"
@@ -26,6 +27,7 @@ AliL3ModelTrack::AliL3ModelTrack()
   fTime=0;
   fClusterCharge=0;
   fTrackModel=0;
+  fLabel=0;
 }
 
 
@@ -54,14 +56,17 @@ void AliL3ModelTrack::Init(Int_t slice,Int_t patch)
   fTime = new Float_t[nrows];
   fTrackModel = new AliL3TrackModel;
   fOverlap = new Int_t[nrows];
-  
+
   memset(fClusters,0,nrows*sizeof(AliL3ClusterModel));
   memset(fPad,0,nrows*sizeof(Float_t));
   memset(fTime,0,nrows*sizeof(Float_t));
   memset(fTrackModel,0,sizeof(AliL3TrackModel));
   for(Int_t i=0; i<nrows; i++)
     fOverlap[i]=-1;
-
+#ifdef do_mc
+  for(Int_t i=0; i<nrows; i++)
+    fClusters[i].fTrackID[0]=fClusters[i].fTrackID[1]=fClusters[i].fTrackID[2]=-2;
+#endif
   fClusterCharge = 100;
   
   // 100 micrometers:
@@ -178,6 +183,20 @@ void AliL3ModelTrack::FillTrack()
     }
 }
 
+
+void AliL3ModelTrack::SetTrackID(Int_t row,Int_t *trackID)
+{
+#ifdef do_mc
+  AliL3ClusterModel *cluster = GetClusterModel(row);
+  cluster->fTrackID[0] = trackID[0];
+  cluster->fTrackID[1] = trackID[1];
+  cluster->fTrackID[2] = trackID[2];
+  return;
+#endif
+  cerr<<"AliL3ModelTrack::SetTrackID : Compile with do_mc flag"<<endl;
+}
+
+
 void AliL3ModelTrack::SetPadHit(Int_t row,Float_t pad)
 {
   Int_t index = row-AliL3Transform::GetFirstRow(fPatch);
@@ -212,6 +231,18 @@ void AliL3ModelTrack::SetOverlap(Int_t row,Int_t id)
   fOverlap[index]=id;
 }
 
+
+Int_t AliL3ModelTrack::GetTrackID(Int_t row,Int_t index)
+{
+  
+#ifdef do_mc
+  AliL3ClusterModel *cl = GetClusterModel(row);
+  return cl->fTrackID[index];
+#endif
+  cerr<<"AliL3ModelTrack::GetTrackID : Compile with do_mc flag"<<endl;
+}
+
+
 Int_t AliL3ModelTrack::GetNPads(Int_t row)
 {
   AliL3ClusterModel *cl = GetClusterModel(row);
@@ -428,3 +459,59 @@ Double_t AliL3ModelTrack::GetParSigmaZ2(Int_t row)
   return sigmaZ2;
   
 }
+
+void AliL3ModelTrack::AssignTrackID(Float_t wrong=0.10)
+{
+  //Assign a track ID to the track, corresponding to the MC TParticle ID.
+  //Can only be done if you compiled with do_mc flag, of course.
+  //The function loops over the assigned clusters, and finds the label (ID)
+  //of each clusters, and assigns the ID with the most hits to the track.
+  //If there are more than wrong% clusters of a different ID, the track is
+  //considered to be fake, and label will be assigned as negative.
+  
+#ifdef do_mc
+  Int_t *lb = new Int_t[GetNClusters()];
+  Int_t *mx = new Int_t[GetNClusters()];
+
+  Int_t i,j;
+  for(Int_t i=0; i<GetNClusters(); i++) 
+    lb[i]=mx[i]=0;
+  
+  Int_t lab=123456789;
+  
+  for(i=0; i<GetNClusters(); i++) 
+    {
+      lab = abs(GetTrackID(i,0));
+      for (j=0; j<GetNClusters(); j++) 
+       if (lb[j]==lab || mx[j]==0) break;
+      lb[j]=lab;
+      (mx[j])++;
+    }
+  
+  Int_t max=0;
+  for (i=0; i<GetNClusters(); i++) 
+    {
+      if(mx[i] > max) 
+       {
+         max=mx[i]; 
+         lab=lb[i];
+       }
+    }
+  
+  for (i=0; i<GetNClusters(); i++) 
+    {
+      if(abs(GetTrackID(i,1)) == lab ||
+        abs(GetTrackID(i,2)) == lab)
+       max++;
+    }
+
+  if ((1.- Float_t(max)/GetNClusters()) > wrong) lab=-lab;
+
+  SetLabel(lab);
+
+  delete[] lb;
+  delete[] mx;
+  return;
+#endif
+  cerr<<"AliL3ModelTrack::AssignTrackID : Compile with do_mc flag"<<endl;
+}
index b889adc..6bd40b2 100644 (file)
@@ -21,6 +21,7 @@ class AliL3ModelTrack : public AliL3Track {
   Float_t fZWidthQ;
   Int_t fSlice;
   Int_t fPatch;
+  Int_t fLabel;
   
   //Crossing points with padrows
   Float_t *fPad; //!
@@ -35,14 +36,19 @@ class AliL3ModelTrack : public AliL3Track {
   void FillModel();
   void FillTrack();
   void Print();
+  void AssignTrackID(Float_t wrong=0.10);
   
+  void SetTrackID(Int_t row,Int_t *trackID);
   void SetPadHit(Int_t row,Float_t f);
   void SetTimeHit(Int_t row,Float_t f);
   void SetOverlap(Int_t row,Int_t id);
   void SetXYResolution(Float_t f) {fXYResolution=f;}
   void SetZResolution(Float_t f) {fZResolution=f;}
+  void SetLabel(Int_t i) {fLabel = i;}
   Int_t CheckClustersQuality(UInt_t npads=3);
   
+
+  Int_t GetTrackID(Int_t row,Int_t idindex);
   AliL3ClusterModel *GetClusters() {return fClusters;}
   AliL3TrackModel *GetModel() {return fTrackModel;}
   AliL3ClusterModel *GetClusterModel(Int_t row);
@@ -60,7 +66,8 @@ class AliL3ModelTrack : public AliL3Track {
   Bool_t GetXYWidthResidual(Int_t row,Float_t &res);
   Bool_t GetZWidthResidual(Int_t row,Float_t &res);
   Int_t GetNClusters() {return fNClusters;}
-  
+  Int_t GetLabel() {return fLabel;}
+
   Double_t GetParSigmaY2(Int_t row);
   Double_t GetParSigmaZ2(Int_t row);
   
index cf79b1d..5e19671 100644 (file)
@@ -9,6 +9,9 @@
 
 #include "AliL3Modeller.h"
 #include "AliL3MemHandler.h"
+#ifdef use_aliroot
+#include "AliL3FileHandler.h"
+#endif
 #include "AliL3TrackArray.h"
 #include "AliL3ModelTrack.h"
 #include "AliL3DigitData.h"
@@ -45,7 +48,7 @@ AliL3Modeller::~AliL3Modeller()
     delete fTracks;
 }
 
-void AliL3Modeller::Init(Int_t slice,Int_t patch,Char_t *trackdata,Char_t *path,Bool_t houghtracks)
+void AliL3Modeller::Init(Int_t slice,Int_t patch,Char_t *trackdata,Char_t *path,Bool_t houghtracks,Bool_t binary=kTRUE)
 {
   fSlice = slice;
   fPatch = patch;
@@ -60,7 +63,8 @@ void AliL3Modeller::Init(Int_t slice,Int_t patch,Char_t *trackdata,Char_t *path,
   
   Char_t fname[100];
   AliL3MemHandler *file = new AliL3MemHandler();
-  sprintf(fname,"%s/tracks_tr_%d_0.raw",trackdata,fSlice); //output tracks from the tracker (no merging)
+  //sprintf(fname,"%s/tracks_tr_%d_0.raw",trackdata,fSlice); //output tracks from the tracker (no merging)
+  sprintf(fname,"%s/tracks_ho_%d.raw",trackdata,fSlice);
   if(!file->SetBinaryInput(fname))
     {
       cerr<<"AliL3Modeller::Init : Error opening trackfile: "<<fname<<endl;
@@ -96,15 +100,34 @@ void AliL3Modeller::Init(Int_t slice,Int_t patch,Char_t *trackdata,Char_t *path,
   if(!houghtracks)
     CheckForOverlaps();
 
+  UInt_t ndigits=0;
+  AliL3DigitRowData *digits=0;
+#ifdef use_aliroot
+  fMemHandler = new AliL3FileHandler();
+  if(binary == kFALSE)
+    {
+      sprintf(fname,"%s/digitfile",fPath);
+      fMemHandler->SetAliInput(fname);
+      digits = fMemHandler->AliDigits2Memory(ndigits);
+    }
+#else
   fMemHandler = new AliL3MemHandler();
-  sprintf(fname,"%sdigits_%d_%d.raw",fPath,fSlice,fPatch);
-  if(!fMemHandler->SetBinaryInput(fname))
+  if(binary == kFALSE)
     {
-      cerr<<"AliL3Modeller::Init : Error opening file "<<fname<<endl;
+      cerr<<"AliL3Modeller::Init : Compile with AliROOT if you want rootfile as input"<<endl;
       return;
     }
-  UInt_t ndigits;
-  AliL3DigitRowData *digits=(AliL3DigitRowData*)fMemHandler->CompBinary2Memory(ndigits);
+  else
+    {
+      sprintf(fname,"%sdigits_%d_%d.raw",fPath,fSlice,fPatch);
+      if(!fMemHandler->SetBinaryInput(fname))
+       {
+         cerr<<"AliL3Modeller::Init : Error opening file "<<fname<<endl;
+         return;
+       }
+    }
+  digits=(AliL3DigitRowData*)fMemHandler->CompBinary2Memory(ndigits);
+#endif
   
   SetInputData(digits);
 }
@@ -138,6 +161,7 @@ void AliL3Modeller::FindClusters()
 
   for(Int_t i=AliL3Transform::GetFirstRow(fPatch); i<=AliL3Transform::GetLastRow(fPatch); i++)
     {
+      fCurrentPadRow = i;
       memset((void*)row,0,ntimes*npads*sizeof(Digit));
       digPt = (AliL3DigitData*)rowPt->fDigitData;
       for(UInt_t j=0; j<rowPt->fNDigit; j++)
@@ -324,8 +348,44 @@ void AliL3Modeller::FillCluster(AliL3ModelTrack *track,Cluster *cluster,Int_t ro
   Float_t sigmaY2,sigmaZ2;
   CalcClusterWidth(cluster,sigmaY2,sigmaZ2);
   track->SetCluster(row,fpad,ftime,fcharge,sigmaY2,sigmaZ2,npads);
+#ifdef do_mc
+  Int_t trackID[3];
+  GetTrackID((Int_t)rint(fpad),(Int_t)rint(ftime),trackID);
+  track->SetTrackID(fCurrentPadRow,trackID);
+#endif
+}
+
+#ifdef do_mc
+void AliL3Modeller::GetTrackID(Int_t pad,Int_t time,Int_t *trackID)
+{
+
+  AliL3DigitRowData *rowPt = (AliL3DigitRowData*)fRowData;
   
+  trackID[0]=trackID[1]=trackID[2]=-2;
+
+  for(Int_t i=AliL3Transform::GetFirstRow(fPatch); i<=AliL3Transform::GetLastRow(fPatch); i++)
+    {
+      if(rowPt->fRow < (UInt_t)fCurrentPadRow)
+       {
+         AliL3MemHandler::UpdateRowPointer(rowPt);
+         continue;
+       }
+      AliL3DigitData *digPt = (AliL3DigitData*)rowPt->fDigitData;
+      for(UInt_t j=0; j<rowPt->fNDigit; j++)
+       {
+         Int_t cpad = digPt[j].fPad;
+         Int_t ctime = digPt[j].fTime;
+         if(cpad != pad) continue;
+         if(ctime != time) continue;
+         trackID[0] = digPt[j].fTrackID[0];
+         trackID[1] = digPt[j].fTrackID[1];
+         trackID[2] = digPt[j].fTrackID[2];
+         break;
+       }
+      break;
+    }
 }
+#endif
 
 void AliL3Modeller::FillZeros(AliL3DigitRowData *rowPt,Digit *row)
 {
index 59fd30f..e2210eb 100644 (file)
@@ -32,6 +32,7 @@ class AliL3Modeller {
   
   Int_t fNClusters;
   Int_t fMaxClusters;
+  Int_t fCurrentPadRow;
   
   Float_t fPadOverlap;
   Float_t fTimeOverlap;
@@ -44,13 +45,16 @@ class AliL3Modeller {
   void FillCluster(AliL3ModelTrack *track,Cluster *cluster,Int_t row,Int_t npads);
   void CalcClusterWidth(Cluster *cl,Float_t &sigmaY2,Float_t &sigmaZ2);
   void FillZeros(AliL3DigitRowData *digPt,Digit *row);
-
+#ifdef do_mc
+  void GetTrackID(Int_t pad,Int_t time,Int_t *trackID);
+#endif
+    
  public:
   
   AliL3Modeller();
   virtual ~AliL3Modeller();
   
-  void Init(Int_t slice,Int_t patch,Char_t *trackdata,Char_t *path,Bool_t houghtracks=kFALSE);
+  void Init(Int_t slice,Int_t patch,Char_t *trackdata,Char_t *path,Bool_t houghtracks,Bool_t binary=kTRUE);
   void FindClusters();
   void CheckForOverlaps();
   void CalculateCrossingPoints();
index 529b10a..64a0b5b 100644 (file)
@@ -13,6 +13,9 @@ struct AliL3ClusterModel {
   Float_t fDSigmaY2;
   Float_t fDSigmaZ2;
   UInt_t fNPads;
+#ifdef do_mc
+  Int_t fTrackID[3];
+#endif
 };
 typedef struct AliL3ClusterModel AliL3ClusterModel;