3 /**************************************************************************
4 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6 * Author: The ALICE Off-line Project. *
7 * Contributors are mentioned in the code where appropriate. *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
19 * >> Flat structure representing an ESD <<
21 * To be used in the online and offline calibration schema.
23 * Class provides interface methods for
24 * - Filling from AliESDEvent, but also from HLT (to be added)
27 * In the online case, the structure can be directly written into a shared
28 * memory, in the offline case, the size has to be estimated first.
31 * Primary Authors : Sergey Gorbunov, Jochen Thaeder, Chiara Zampolli
33 * ************************************************************************
37 * AliESDEvent* esd = ....;
38 * Bool_t useESDFriends = kTRUE;
40 * // -- Book memory for AliFlatESDEvent
41 * Byte_t *mem = new Byte_t[AliFlatESDEvent::EstimateSize(esd, useESDFriends)];
42 * AliFlatESDEvent *flatEsd = reinterpret_cast<AliFlatESDEvent*>(mem);
44 * // -- Fill AliFlatESDEvent
45 * flatEsd->Fill(esd, useESDFriends);
48 **************************************************************************/
50 #include "AliESDEvent.h"
51 #include "AliESDtrack.h"
52 #include "AliESDfriend.h"
55 #include "AliFlatESDEvent.h"
56 #include "AliFlatESDTrack.h"
57 #include "AliFlatTPCCluster.h"
58 #include "AliFlatExternalTrackParam.h"
59 #include "Riostream.h"
60 #include "AliFlatESDVertex.h"
62 // _______________________________________________________________________________________________________
63 AliFlatESDEvent::AliFlatESDEvent() :
64 // Default constructor
65 fPrimaryVertexMask(0),
75 // _______________________________________________________________________________________________________
76 AliFlatESDEvent::AliFlatESDEvent(Bool_t)
78 //special constructor, used to restore the vtable pointer
79 //uses the special dummy constructors of contained objects
80 AliFlatESDVertex* vertexSPD = const_cast<AliFlatESDVertex*>(GetPrimaryVertexSPD());
81 if (vertexSPD ) { new (vertexSPD) AliFlatESDVertex(1); }
82 AliFlatESDVertex* vertexTracks = const_cast<AliFlatESDVertex*>(GetPrimaryVertexTracks());
83 if (vertexTracks ) { new (vertexTracks) AliFlatESDVertex(1); }
84 AliFlatESDTrack* track = GetTracks();
85 for (Int_t i=0; i<GetNumberOfTracks(); i++)
87 new (track) AliFlatESDTrack(1);
88 track += track->GetSize();
90 AliFlatESDV0* v0 = GetV0s();
91 for (Int_t i=0; i<GetNumberOfV0s(); i++)
93 new (v0) AliFlatESDV0(1);
94 v0 += sizeof(AliFlatESDV0);
99 AliFlatESDEvent::AliFlatESDEvent(const AliFlatESDEvent& ev) :
100 // Default constructor
101 fPrimaryVertexMask(ev.fPrimaryVertexMask),
102 fNTracks(ev.fNTracks),
103 fTracksPointer(ev.fTracksPointer),
105 fV0Pointer(ev.fV0Pointer),
111 // _______________________________________________________________________________________________________
112 AliFlatESDEvent::AliFlatESDEvent(AliESDEvent *esd) :
114 fPrimaryVertexMask(0),
125 // _______________________________________________________________________________________________________
126 AliFlatESDEvent::AliFlatESDEvent(AliESDEvent *esd, Bool_t useESDFriends) :
128 fPrimaryVertexMask(0),
136 Fill(esd, useESDFriends);
139 // _______________________________________________________________________________________________________
140 AliFlatESDEvent::~AliFlatESDEvent()
145 // _______________________________________________________________________________________________________
146 ULong64_t AliFlatESDEvent::EstimateSize(AliESDEvent *esd, Bool_t useESDFriends, Bool_t fillV0s)
148 // Estimate upper limit of the object size
149 // -> Added objects have to be added here as well
151 ULong64_t size = sizeof(AliFlatESDEvent);
152 size += 2 * sizeof( AliFlatESDVertex );
153 size += esd->GetNumberOfTracks() * AliFlatESDTrack::EstimateSize(useESDFriends);
154 if( fillV0s ) size += esd->GetNumberOfV0s()*sizeof(AliFlatESDV0);
158 void AliFlatESDEvent::FillPrimaryVertices( const AliESDVertex *vertexSPD,
159 const AliESDVertex *vertexTracks )
161 // fill primary vertices
163 fPrimaryVertexMask = 0;
167 FillPrimaryVertex(vertexSPD, flag);
170 FillPrimaryVertex(vertexTracks, flag);
172 fTracksPointer = fSize;
176 void AliFlatESDEvent::FillPrimaryVertex(const AliESDVertex *v, Byte_t flag)
179 // Fill primary vertex parameters
183 AliFlatESDVertex *vtx = reinterpret_cast<AliFlatESDVertex*> (fContent + fSize);
184 new(vtx) AliFlatESDVertex;
186 fPrimaryVertexMask |= flag;
187 fSize += sizeof(AliFlatESDVertex);
191 Int_t AliFlatESDEvent::FillNextTrack( const AliESDtrack* esdTrack, AliESDfriendTrack* friendTrack)
195 AliFlatESDTrack * flatTrack = reinterpret_cast<AliFlatESDTrack*>(fContent+fSize);
196 new(flatTrack) AliFlatESDTrack;
197 flatTrack->Fill(esdTrack, friendTrack);
198 fSize += flatTrack->GetSize();
203 void AliFlatESDEvent::Reset()
208 fPrimaryVertexMask = 0;
213 // _______________________________________________________________________________________________________
214 Int_t AliFlatESDEvent::Fill(const AliESDEvent *esd, const Bool_t useESDFriends, const Bool_t fillV0s )
216 // Fill flat ESD event from normal ALiESDEvent
217 // - Fill tracks + friends (if requested)
218 // -> Added objects have to be added here as well
222 FillPrimaryVertices( esd->GetPrimaryVertexSPD(), esd->GetPrimaryVertexTracks() );
224 // -- Get ESD friends
225 // -------------------------------------------------------
226 Bool_t connectESDFriends = useESDFriends;
227 AliESDfriend* esdFriend = NULL;
229 if (connectESDFriends) {
230 esdFriend = dynamic_cast<AliESDfriend*>(esd->FindListObject("AliESDfriend"));
232 connectESDFriends = kFALSE;
233 Printf("WARNING: friends not available, cluster information will not be included");
236 Printf("INFO: friends are available, cluster information will be included");
239 // -- Track loop, fill AliFlatESDTrack sub structure
240 // -------------------------------------------------------
241 for (Int_t idxTrack = 0; idxTrack < esd->GetNumberOfTracks(); ++idxTrack) {
242 AliESDtrack *esdTrack = esd->GetTrack(idxTrack);
243 AliESDfriendTrack *friendTrack = NULL;
246 if (connectESDFriends){
247 friendTrack = esdFriend->GetTrack(idxTrack);
249 FillNextTrack( esdTrack, friendTrack);
258 for( int i=0; i < esd->GetNumberOfV0s(); i++){
259 AliESDv0 *esdV0 = esd->GetV0( i );
260 AliFlatESDV0 *v0 = GetNextV0Pointer();
262 v0->fNegTrackID = esdV0->GetNindex();
263 v0->fPosTrackID = esdV0->GetNindex();
271 UInt_t AliFlatESDEvent::CountBits(Byte_t field, UInt_t mask) const {
272 // Count bits in field
279 for (count = 0; reg; count++)