98c538a255b692d398976c2994be81fed94bf4b6
[u/mrichter/AliRoot.git] / HLT / src / AliL3MemHandler.h
1 #ifndef ALIL3_MEMHANDLER_H
2 #define ALIL3_MEMHANDLER_H
3
4 #include "AliL3RootTypes.h"
5 #include "AliL3Transform.h"
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include "AliL3DigitData.h"
9
10 class AliL3SpacePointData;
11 class AliL3DigitRowData;
12 class AliL3TrackSegmentData;
13 class AliL3TrackArray;
14 class AliL3RandomPointData;
15
16 class AliL3MemHandler{
17  private:
18   
19   Byte_t *fPt;//!
20   UInt_t fSize;
21
22   AliL3RandomDigitData **fDPt;//!
23   AliL3RandomDigitData *fDigits;//!
24   Bool_t IsRandom;
25   Int_t fNRandom;
26   Int_t fNGenerate;
27   Int_t fNUsed;
28   Int_t fNDigits;
29
30   void Write(UInt_t *comp, UInt_t & index, UInt_t & subindex, UShort_t value);
31   UShort_t Read(UInt_t *comp, UInt_t & index, UInt_t & subindex);
32   UShort_t Test(UInt_t *comp, UInt_t index, UInt_t subindex); 
33   
34   void DigitizePoint(Int_t row,Int_t pad, Int_t time,Int_t charge);
35   void QSort(AliL3RandomDigitData **a, Int_t first, Int_t last);
36   Int_t ComparePoints(UInt_t row,UShort_t pad,UShort_t time);
37   Int_t CompareDigits(AliL3RandomDigitData *a,AliL3RandomDigitData *b);
38   void AddData(AliL3DigitData *data,UInt_t & ndata,
39                       UInt_t row,UShort_t pad,UShort_t time,UShort_t charge);
40   void AddRandom(AliL3DigitData *data,UInt_t & ndata);
41   void MergeDataRandom(AliL3DigitData *data,UInt_t & ndata,
42                       UInt_t row,UShort_t pad,UShort_t time,UShort_t charge);
43   void AddDataRandom(AliL3DigitData *data,UInt_t & ndata,
44                       UInt_t row,UShort_t pad,UShort_t time,UShort_t charge);
45   
46
47  protected:
48   Int_t fRowMin;
49   Int_t fRowMax;
50   Int_t fSlice;
51   Int_t fPatch;
52
53   Int_t fEtaMinTimeBin[176];
54   Int_t fEtaMaxTimeBin[176];
55   
56   FILE *fInBinary;//!
57   FILE *fOutBinary;//!
58   
59  public:
60   AliL3MemHandler();
61   virtual ~AliL3MemHandler();
62   
63   void Reset(){CloseBinaryInput();CloseBinaryOutput();Free();}  
64   void Init(Int_t s,Int_t p, Int_t *r=0);
65
66   Bool_t SetBinaryInput(char *name);
67   Bool_t SetBinaryInput(FILE *file);
68   void CloseBinaryInput();
69   
70   Bool_t SetBinaryOutput(char *name);
71   Bool_t SetBinaryOutput(FILE *file);
72   void CloseBinaryOutput();
73
74   //Random cluster
75   void SetRandomCluster(Int_t maxnumber);
76   void SetRandomSeed(UInt_t seed){srand(seed);}
77   void SetRandomSeed();
78
79   void ResetRandom(){fNDigits = 0; fNUsed = 0;}
80   void Generate(Int_t row);
81   void SetNGenerate(Int_t number){(number>fNRandom)?fNGenerate=fNRandom:fNGenerate = number;}
82
83   void SetROI(Float_t *eta,Int_t *slice);
84   void ResetROI();
85
86   //Digit IO
87   Bool_t Memory2Binary(UInt_t nrow,AliL3DigitRowData *data);
88   Bool_t Binary2Memory(UInt_t & nrow,AliL3DigitRowData *data);
89
90   Int_t Memory2CompMemory(UInt_t nrow,AliL3DigitRowData *data,UInt_t *comp);
91   Int_t CompMemory2Memory(UInt_t nrow,AliL3DigitRowData *data,UInt_t *comp);
92   Bool_t CompMemory2CompBinary(UInt_t nrow,UInt_t *comp, UInt_t size=0);
93   Bool_t CompBinary2CompMemory(UInt_t & nrow,UInt_t *comp);
94
95   virtual AliL3DigitRowData *CompBinary2Memory(UInt_t & nrow);
96   virtual Bool_t Memory2CompBinary(UInt_t nrow,AliL3DigitRowData *data);
97   
98   UInt_t GetNRow(UInt_t *comp,UInt_t size);
99
100   //Point IO
101   Bool_t Memory2Binary(UInt_t npoint,AliL3SpacePointData *data);
102   Bool_t Binary2Memory(UInt_t & npoint,AliL3SpacePointData *data);
103   Bool_t Transform(UInt_t npoint,AliL3SpacePointData *data,Int_t slice);
104   static void UpdateRowPointer(AliL3DigitRowData *&tempPt);
105   
106   //Track IO
107   Bool_t Memory2Binary(UInt_t ntrack,AliL3TrackSegmentData *data);
108   Bool_t Binary2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data);
109   Bool_t TrackArray2Binary(AliL3TrackArray *array);
110   Bool_t Binary2TrackArray(AliL3TrackArray *array);
111   Bool_t TrackArray2Memory(UInt_t & ntrack,AliL3TrackSegmentData *data,
112                                              AliL3TrackArray *array);
113   Bool_t Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,
114                                              AliL3TrackArray *array);
115   Bool_t Memory2TrackArray(UInt_t ntrack,AliL3TrackSegmentData *data,
116                            AliL3TrackArray *array,Int_t slice);
117     
118   //Memory Allocation
119   UInt_t GetAllocatedSize(){return fSize;}  
120   UInt_t GetFileSize();
121   UInt_t GetMemorySize(UInt_t nrow,UInt_t *comp);
122   UInt_t GetCompMemorySize(UInt_t nrow,AliL3DigitRowData *data);
123   UInt_t GetRandomSize();
124
125   Byte_t *Allocate(UInt_t size);
126   Byte_t *Allocate();  // allocate size of Binary Input File
127   Byte_t *Allocate(AliL3TrackArray *array);
128   Byte_t *GetDataPointer(UInt_t &size) {size = fSize; return fPt;}
129   void   Free();
130   
131   //Getters:
132   Int_t GetRowMin(){return fRowMin;}
133   Int_t GetRowMax(){return fRowMax;}
134   Int_t GetSlice(){return fSlice;}
135   Int_t GetPatch(){return fPatch;}
136   
137   //virtual functions:
138   virtual void FreeDigitsTree() {return;}
139   virtual Bool_t SetAliInput(char *name){return 0;}
140   virtual void CloseAliInput(){return;} 
141   virtual Bool_t IsDigit(){return 0;}
142   virtual Bool_t SetMCOutput(char *name){return 0;}
143   virtual Bool_t SetMCOutput(FILE *file){return 0;}
144   virtual void CloseMCOutput(){return;}
145   virtual Bool_t AliDigits2Binary(Int_t event=0){return 0;}
146   virtual AliL3DigitRowData *AliDigits2Memory(UInt_t & nrow,Int_t event=0){return 0;}
147   virtual Bool_t AliDigits2CompBinary(Int_t event=0){return 0;}  
148   virtual void AliDigits2RootFile(AliL3DigitRowData *rowPt,Char_t *new_digitsfile){return;}
149   virtual Bool_t AliPoints2Binary(){return 0;}
150   virtual AliL3SpacePointData *AliPoints2Memory(UInt_t & npoint){return 0;}
151
152   ClassDef(AliL3MemHandler,1) // Memory handler class
153 };
154
155 inline Int_t  AliL3MemHandler::ComparePoints(UInt_t row,UShort_t pad,UShort_t time){
156   if(fNUsed>=fNDigits) return -2;
157
158   if(pad==fDPt[fNUsed]->fPad&&time==fDPt[fNUsed]->fTime) return 0;
159
160   if(pad<fDPt[fNUsed]->fPad) return -1;
161   if(pad==fDPt[fNUsed]->fPad&&time<fDPt[fNUsed]->fTime)  return -1;
162
163   return 1;
164 }
165
166 inline Int_t AliL3MemHandler::CompareDigits(AliL3RandomDigitData *a,AliL3RandomDigitData *b){
167   if(a->fPad==b->fPad && a->fTime == b->fTime) return 0;
168
169   if(a->fPad<b->fPad) return -1;
170   if(a->fPad==b->fPad && a->fTime<b->fTime) return -1;
171   
172   return 1;
173 }
174
175 #endif