]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/global/AliFlatESDEvent.h
flat esd event update
[u/mrichter/AliRoot.git] / HLT / global / AliFlatESDEvent.h
1 #ifndef ALIFLATESDEVENT_H
2 #define ALIFLATESDEVENT_H
3
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                               *
6  * Primary Authors : Sergey Gorbunov, Jochen Thaeder, Chiara Zampolli     */
7
8 /*
9  * See implementation file for documentation
10  */
11
12 #include "Rtypes.h"
13 #include "AliVVevent.h"
14 #include "AliFlatESDTrack.h"
15 #include "AliFlatESDVertex.h"
16
17 class AliFlatESDV0;
18 class AliFlatESDTrigger;
19
20 class AliESDEvent;
21 class AliESDVertex;
22
23 class AliFlatESDEvent :public AliVVevent {
24  public:
25   // --------------------------------------------------------------------------------
26   // -- Constructor / Destructors
27   AliFlatESDEvent();
28   ~AliFlatESDEvent() {}
29
30   // --------------------------------------------------------------------------------
31   // Interface to AliVVEvent
32
33   Double_t  GetMagneticField() const { return fMagneticField; }
34   UInt_t    GetPeriodNumber()  const { return fPeriodNumber; }
35   Int_t     GetRunNumber()     const { return fRunNumber; }
36   UInt_t    GetOrbitNumber()   const { return fOrbitNumber; }
37   UShort_t  GetBunchCrossNumber() const { return fBunchCrossNumber; }
38   ULong64_t GetTriggerMask()      const { return fTriggerMask; }  
39   ULong64_t GetTriggerMaskNext50()   const { return fTriggerMaskNext50; }  
40   TString   GetFiredTriggerClasses() const ;
41  
42   Int_t GetNumberOfTracks() const { return fNTracks; }
43   Int_t GetNumberOfV0s()    const { return fNV0s; }
44
45   void Reset();
46   void ConnectTracks(){} // initialisation, needed by the ESD event, part of VVevent interface
47
48   UInt_t GetTimeStamp()     const { return fTimeStamp; }
49   UInt_t GetEventSpecie()   const { return fEventSpecie; }
50   Int_t  GetNumberOfKinks() const { return 0; }  
51
52   const AliVVtrack* GetVVTrack(Int_t i) const { return GetFlatTrack(i); }
53   AliESDkink* GetKink(Int_t /*i*/) const { return NULL;}
54
55   // --------------------------------------------------------------------------------
56   // Own methods 
57
58   // -- Set methods
59
60   Int_t SetFromESD( size_t allocatedMemorySize, const AliESDEvent *esd, const Bool_t fillV0s=kTRUE );
61
62   void  SetMagneticField( Double_t mf ){ fMagneticField = mf; }
63   void  SetPeriodNumber( Int_t n ) { fPeriodNumber = n; }
64   void  SetRunNumber( Int_t n ) { fRunNumber = n; }
65   void  SetOrbitNumber( UInt_t n ) { fOrbitNumber = n; }
66   void  SetBunchCrossNumber( UShort_t n ) { fBunchCrossNumber = n; }
67   void  SetTimeStamp( UInt_t timeStamp ){ fTimeStamp = timeStamp; }
68   void  SetEventSpecie(UInt_t eventSpecie){ fEventSpecie = eventSpecie; }
69   void  SetTriggerMask(ULong64_t n) { fTriggerMask = n; }
70   void  SetTriggerMaskNext50(ULong64_t n) { fTriggerMaskNext50 = n; }
71   
72   Int_t  SetPrimaryVertexTracks( const AliESDVertex *v, size_t allocatedVtxMemory );
73   Int_t  SetPrimaryVertexSPD( const AliESDVertex *v, size_t allocatedVtxMemory  );
74
75   AliFlatESDTrigger *SetTriggersStart();
76   void SetTriggersEnd( Int_t nTriggerClasses, size_t triggersSize );
77
78   Int_t SetTracksStart( AliFlatESDTrack* &t, Long64_t* &table, Int_t nTracks, size_t freeMem);
79   void SetTracksEnd( Int_t nTracks, size_t tracksSize );
80
81   AliFlatESDV0 *SetV0sStart();
82   void SetV0sEnd( Int_t nV0s, size_t v0sSize );
83
84   // --------------------------------------------------------------------------------
85   // -- Getter methods
86
87   const AliFlatESDVertex* GetPrimaryVertexSPD() const ;
88   const AliFlatESDVertex* GetPrimaryVertexTracks() const ;
89
90   Int_t GetNumberOfTriggerClasses() const { return fNTriggerClasses; }
91    
92   const AliFlatESDTrigger *GetTriggerClasses() const { return reinterpret_cast<const AliFlatESDTrigger*>( fContent + fTriggerPointer ); }
93   const AliFlatESDTrack   *GetTracks() const { return reinterpret_cast<const AliFlatESDTrack*>( fContent + fTracksPointer ); }
94   const AliFlatESDV0      *GetV0s() const { return reinterpret_cast<const AliFlatESDV0*>( fContent + fV0Pointer ); }
95
96   const AliFlatESDTrack  *GetFlatTrack( Int_t i ) const ;
97
98   // --------------------------------------------------------------------------------
99   // -- Size methods
100
101   ULong64_t  GetSize()  const { return fContent + fContentSize - reinterpret_cast<const Byte_t*>(this); }
102
103   static ULong64_t EstimateSize(AliESDEvent*esd, Bool_t fillV0s=kTRUE );
104
105  private:
106
107   AliFlatESDEvent( const AliFlatESDEvent& );
108   AliFlatESDEvent& operator=( const AliFlatESDEvent& );
109
110   // --------------------------------------------------------------------------------
111
112   // -- Fixed size member objects ( try to align in memory )
113
114   size_t     fContentSize;     // Size of fContent
115   Double32_t fMagneticField;   // Solenoid Magnetic Field in kG : for compatibility with AliMagF
116   UInt_t     fPeriodNumber;    // PeriodNumber
117   Int_t      fRunNumber;       // Run Number
118   UInt_t     fOrbitNumber;     // Orbit Number
119   UInt_t     fTimeStamp;         // Time stamp
120   UInt_t     fEventSpecie;       // Reconstruction event specie (1-default,2-lowM,4-highM,8-cosmic,16-cal)
121   UShort_t   fBunchCrossNumber;  // Bunch Crossing Number
122   Byte_t     fPrimaryVertexMask;            // Bit mask specfifying which primary vertices are present
123   ULong64_t  fTriggerMask;      // Trigger mask, first 50 bits
124   ULong64_t  fTriggerMaskNext50;      // Trigger mask, next 50 bits
125
126   UInt_t  fNTriggerClasses;  // N trigger classes
127   UInt_t  fNPrimaryVertices; // Number of primary vertices in array
128   UInt_t  fNTracks;          // Number of tracks in array
129   UInt_t  fNV0s;             // Number of v0's
130   
131   // Pointers to specific data in fContent
132   
133   size_t fTriggerPointer;        // position of the first trigger description in fContent
134   size_t fPrimaryVertexTracksPointer; // position of primary vertex tracks in fContent
135   size_t fPrimaryVertexSPDPointer;  // position of primary vertex SPD in fContent
136   size_t fTrackTablePointer;     // position of the first track pointer in fContent
137   size_t fTracksPointer;         // position of the first track in fContent
138   size_t fV0Pointer;             // position of the first V0 in fContent  
139
140   // --------------------------------------------------------------------------------
141
142   // -- Variable Size Object
143
144   Byte_t fContent[1];                  // Variale size object, which contains all data
145 };
146
147 // Inline implementations 
148
149 inline const AliFlatESDTrack  *AliFlatESDEvent::GetFlatTrack( Int_t i ) const 
150
151   const Long64_t *table = reinterpret_cast<const Long64_t*> (fContent + fTrackTablePointer);
152   if( i<0 || i>(int) fNTracks || table[i]<0 ) return NULL;
153   return reinterpret_cast<const AliFlatESDTrack*>( fContent + table[i] );
154 }
155
156
157 inline Int_t AliFlatESDEvent::SetTracksStart( AliFlatESDTrack* &t, Long64_t* &table, Int_t nTracks, size_t freeMem)
158 {
159   fNTracks = 0;
160   if( nTracks*sizeof(Long64_t)  > freeMem ) return -1;
161   fTrackTablePointer = fContentSize;
162   fContentSize += nTracks*sizeof(Long64_t);
163   fTracksPointer = fContentSize;
164   table = reinterpret_cast< Long64_t* >( fContent + fTrackTablePointer );
165   t = reinterpret_cast< AliFlatESDTrack* >( fContent + fTracksPointer );
166   return 0;
167 }
168
169 inline void AliFlatESDEvent::SetTracksEnd( Int_t nTracks, size_t tracksSize )
170 {
171   if( nTracks<0 ) return;
172   Long64_t *table = reinterpret_cast< Long64_t*> (fContent + fTrackTablePointer);
173   for( int i=0; i<nTracks; i++ ) table[i]+=fTracksPointer;
174   fNTracks = nTracks;
175   fContentSize += tracksSize;
176 }
177
178 inline AliFlatESDV0 *AliFlatESDEvent::SetV0sStart()
179 {
180   fNV0s = 0;
181   fV0Pointer = fContentSize;
182   return reinterpret_cast< AliFlatESDV0* >( fContent + fContentSize );
183 }
184    
185 inline void AliFlatESDEvent::SetV0sEnd( Int_t nV0s, size_t v0sSize )
186 {
187   fNV0s = nV0s;
188   fContentSize += v0sSize;
189 }
190   
191 inline AliFlatESDTrigger *AliFlatESDEvent::SetTriggersStart()
192 {
193   fNTriggerClasses = 0;
194   fTriggerPointer = fContentSize;
195   return reinterpret_cast< AliFlatESDTrigger* >( fContent + fContentSize );
196 }
197
198 inline void AliFlatESDEvent::SetTriggersEnd( Int_t nTriggerClasses, size_t triggersSize )
199 {
200   fNTriggerClasses = nTriggerClasses;
201   fContentSize += triggersSize;
202 }
203
204 inline const AliFlatESDVertex* AliFlatESDEvent::GetPrimaryVertexSPD() const 
205 {
206   return (fPrimaryVertexMask & 0x1) ? reinterpret_cast<const AliFlatESDVertex*>(fContent + fPrimaryVertexSPDPointer) : NULL;
207
208
209 inline const AliFlatESDVertex* AliFlatESDEvent::GetPrimaryVertexTracks() const 
210
211   return (fPrimaryVertexMask & 0x2) ? (reinterpret_cast<const AliFlatESDVertex*>(fContent + fPrimaryVertexTracksPointer)  ) : NULL;
212
213
214 #endif