1 #ifndef ALIFLATESDFRIEND_H
2 #define ALIFLATESDFRIEND_H
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 */
9 * See implementation file for documentation
14 #include "AliVfriendEvent.h"
15 #include "AliFlatESDFriendTrack.h"
19 //class AliESDVZEROfriend;
20 //class AliESDTZEROfriend;
23 //_____________________________________________________________________________
24 class AliFlatESDFriend : public AliVfriendEvent {
27 ~AliFlatESDFriend() {}
29 // constructor and method for reinitialisation of virtual table
30 AliFlatESDFriend( AliVConstructorReinitialisationFlag );
31 void Reinitialize(){ new (this) AliFlatESDFriend(AliVReinitialize); }
33 // Implementation of virtual methods of AliVfriend
35 Int_t GetNumberOfTracks() const { return fNTracks; }
36 const AliVfriendTrack* GetTrack(Int_t i) const {return GetFlatTrack(i); }
37 Int_t GetEntriesInTracks() const { return fNTrackEntries; }
39 //AliESDVZEROfriend *GetVZEROfriend(){ return NULL; }
40 //AliESDTZEROfriend *GetTZEROfriend(){ return NULL; }
45 // bit manipulation for filtering
46 void SetSkipBit(Bool_t skip){ fBitFlags = skip; }
47 Bool_t TestSkipBit() const { return (fBitFlags!=0); }
49 //TPC cluster occupancy
50 Int_t GetNclustersTPC(UInt_t sector) const { return (sector<72)?fNclustersTPC[sector]:0; }
51 Int_t GetNclustersTPCused(UInt_t sector) const { return (sector<72)?fNclustersTPCused[sector]:0; }
57 Int_t SetFromESDfriend( size_t allocatedMemorySize, const AliESDfriend *esdFriend );
59 void SetNclustersTPC(UInt_t sector, Int_t occupancy ) { if (sector<72) fNclustersTPC[sector]=occupancy; }
60 void SetNclustersTPCused(UInt_t sector, Int_t occupancy ) {if (sector<72) fNclustersTPCused[sector]=occupancy; }
62 Int_t SetTracksStart( AliFlatESDFriendTrack* &t, Long64_t* &table, Int_t nTracks, size_t freeMem );
63 void SetTracksEnd( Int_t nTracks, Int_t nTrackEntries, size_t tracksSize );
67 const AliFlatESDFriendTrack *GetFlatTrack( Int_t i ) const {
68 const Long64_t *table = reinterpret_cast<const Long64_t*> (fContent + fTrackTablePointer);
69 if( i<0 || i>fNTracks || table[i]<0 ) return NULL;
70 return reinterpret_cast<const AliFlatESDFriendTrack*>( fContent + table[i] );
73 const AliFlatESDFriendTrack *GetFlatTrackEntry( Int_t i ) const {
74 if( i<0 || i>fNTrackEntries ) return NULL;
75 return reinterpret_cast<const AliFlatESDFriendTrack*>( fContent + i );
80 ULong64_t GetSize() const { return fContent - reinterpret_cast<const Byte_t*>(this) + fContentSize; }
85 AliFlatESDFriend(const AliFlatESDFriend&);
86 AliFlatESDFriend& operator=(const AliFlatESDFriend& );
88 AliFlatESDFriendTrack *GetFlatTrackNonConst( Int_t i ){
89 const Long64_t *table = reinterpret_cast<const Long64_t*> (fContent + fTrackTablePointer);
90 if( i<0 || i>fNTracks || table[i]<0 ) return NULL;
91 return reinterpret_cast<AliFlatESDFriendTrack*>( fContent + table[i] );
94 AliFlatESDFriendTrack *GetFlatTrackEntryNonConst( Int_t i ){
95 if( i<0 || i>fNTrackEntries ) return NULL;
96 return reinterpret_cast< AliFlatESDFriendTrack*>( fContent + i );
99 size_t fContentSize; // Size of fContent
100 UInt_t fBitFlags; // bit flags
101 Int_t fNTracks; // Number of tracks in vector
102 Int_t fNTrackEntries; // Number of non-empty track friends in vector
103 Int_t fNclustersTPC[72]; //cluster occupancy per sector per sector
104 Int_t fNclustersTPCused[72]; //number of clusters used in tracking per sector
106 // Pointers to specific data in fContent
108 size_t fTrackTablePointer; // position of the first track in fContent
109 size_t fTracksPointer; // position of the first track in fContent
111 // -- Variable Size Object
113 Byte_t fContent[1]; // Variale size object, which contains all data
115 ClassDef(AliFlatESDFriend,0)
119 inline AliFlatESDFriend::AliFlatESDFriend()
125 fTrackTablePointer(0),
128 // Default constructor
132 inline void AliFlatESDFriend::Reset()
137 fTrackTablePointer = 0;
139 for( int i=0; i<72; i++ ){
141 fNclustersTPCused[i]=0;
143 // We set size of the fContent array such, that it reaches the end of the AliFlatESDFriend structure.
144 // To be sure that actual GetSize() is always >= size of the structure.
145 // First, it makes the memory alignment better. Second, just for a case..
146 fContentSize = sizeof(AliFlatESDFriend) - (fContent - reinterpret_cast<const Byte_t*>(this));
147 for( UInt_t i=0; i<fContentSize; i++ ) fContent[i]=0;
150 #pragma GCC diagnostic ignored "-Weffc++"
151 inline AliFlatESDFriend::AliFlatESDFriend(AliVConstructorReinitialisationFlag f)
155 //special constructor, used to restore the vtable pointer
156 for( int i=0; i<fNTrackEntries; i++ ){
157 AliFlatESDFriendTrack *tr = GetFlatTrackEntryNonConst(i);
158 if( tr ) tr->Reinitialize();
161 #pragma GCC diagnostic warning "-Weffc++"
164 inline Int_t AliFlatESDFriend::SetTracksStart( AliFlatESDFriendTrack* &t, Long64_t* &table, Int_t nTracks, size_t freeMem)
168 if( nTracks*sizeof(Long64_t) > freeMem ) return -1;
169 fTrackTablePointer = fContentSize;
170 fContentSize += nTracks*sizeof(Long64_t);
171 fTracksPointer = fContentSize;
172 table = reinterpret_cast< Long64_t* >( fContent + fTrackTablePointer );
173 t = reinterpret_cast< AliFlatESDFriendTrack* >( fContent + fTracksPointer );
177 inline void AliFlatESDFriend::SetTracksEnd( Int_t nTracks, Int_t nTrackEntries, size_t tracksSize )
179 if( nTracks<0 ) return;
180 Long64_t *table = reinterpret_cast< Long64_t*> (fContent + fTrackTablePointer);
181 for( int i=0; i<nTracks; i++ ) table[i]+=fTracksPointer;
183 fNTrackEntries = nTrackEntries;
184 fContentSize += tracksSize;