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