Bug fixed (Christian)
[u/mrichter/AliRoot.git] / RAW / AliRawEvent.cxx
1 // @(#)alimdc:$Name$:$Id$
2 // Author: Fons Rademakers  26/11/99
3
4 /**************************************************************************
5  * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
6  *                                                                        *
7  * Author: The ALICE Off-line Project.                                    *
8  * Contributors are mentioned in the code where appropriate.              *
9  *                                                                        *
10  * Permission to use, copy, modify and distribute this software and its   *
11  * documentation strictly for non-commercial purposes is hereby granted   *
12  * without fee, provided that the above copyright notice appears in all   *
13  * copies and that both the copyright notice and this permission notice   *
14  * appear in the supporting documentation. The authors make no claims     *
15  * about the suitability of this software for any purpose. It is          *
16  * provided "as is" without express or implied warranty.                  *
17  **************************************************************************/
18
19 //////////////////////////////////////////////////////////////////////////
20 //                                                                      //
21 // AliRawEvent                                                          //
22 //                                                                      //
23 // Set of classes defining the ALICE RAW event format. The AliRawEvent  //
24 // class defines a RAW event. It consists of an AliEventHeader object   //
25 // an AliEquipmentHeader object, an AliRawData object and an array of   //
26 // sub-events, themselves also being AliRawEvents. The number of        //
27 // sub-events depends on the number of DATE LDC's.                      //
28 // The AliRawEvent objects are written to a ROOT file using different   //
29 // technologies, i.e. to local disk via AliRawDB or via rfiod using     //
30 // AliRawRFIODB or via rootd using AliRawRootdDB or to CASTOR via       //
31 // rootd using AliRawCastorDB (and for performance testing there is     //
32 // also AliRawNullDB).                                                  //
33 // The AliRunDB class provides the interface to the run and file        //
34 // catalogues (AliEn or plain MySQL).                                   //
35 // The AliStats class provides statics information that is added as     //
36 // a single keyed object to each raw file.                              //
37 // The AliTagDB provides an interface to a TAG database.                //
38 // The AliMDC class is usid by the "alimdc" stand-alone program         //
39 // that reads data directly from DATE.                                  //
40 //                                                                      //
41 //////////////////////////////////////////////////////////////////////////
42
43 #include <TObjArray.h>
44
45 #include "AliLog.h"
46
47 #include "AliRawEventHeaderBase.h"
48 #include "AliRawEquipment.h"
49
50 #include "AliRawEvent.h"
51
52
53 ClassImp(AliRawEvent)
54
55
56 //______________________________________________________________________________
57 AliRawEvent::AliRawEvent():
58 fNEquipments(0),
59 fNSubEvents(0),
60 fEvtHdr(NULL),
61 fEquipments(NULL),
62 fSubEvents(NULL)
63 {
64    // Create ALICE event object. If ownData is kFALSE we will use a static
65    // raw data object, otherwise a private copy will be made.
66
67 }
68
69 //______________________________________________________________________________
70 AliRawEventHeaderBase *AliRawEvent::GetHeader(char*& data)
71 {
72   // Get event header part of AliRawEvent.
73   // First the DATE version is identified and then the
74   // corresponding event header version object is created
75   
76   if (!fEvtHdr) {
77     fEvtHdr = AliRawEventHeaderBase::Create(data);
78   }
79
80   return fEvtHdr;
81 }
82
83 //______________________________________________________________________________
84 AliRawEventHeaderBase *AliRawEvent::GetHeader()
85 {
86   if (!fEvtHdr) {
87       AliFatal("Header version not yet initialized!");
88       return 0x0;
89     }
90
91   return fEvtHdr;
92 }
93
94 //______________________________________________________________________________
95 AliRawEquipment *AliRawEvent::NextEquipment()
96 {
97    // Returns next equipment object.
98
99    if (!fEquipments)
100       fEquipments = new TObjArray(100); // arbitrary, probably enough to prevent resizing
101
102    if (fEquipments->GetSize() <= fNEquipments) {
103       fEquipments->Expand(fNEquipments+10);
104       Warning("NextEquipment", "expanded fEquipments by 10 to %d",
105               fEquipments->GetSize());
106    }
107
108    AliRawEquipment *eq;
109    if (!(eq = (AliRawEquipment *)fEquipments->At(fNEquipments))) {
110       eq = new AliRawEquipment;
111       fEquipments->AddAt(eq, fNEquipments);
112    }
113
114    fNEquipments++;
115
116    return eq;
117 }
118
119 //______________________________________________________________________________
120 AliRawEquipment *AliRawEvent::GetEquipment(Int_t index) const
121 {
122    // Get specified equipment. Returns 0 if equipment does not exist.
123
124    if (!fEquipments)
125       return 0;
126
127    return (AliRawEquipment *) fEquipments->At(index);
128 }
129
130 //______________________________________________________________________________
131 AliRawEvent *AliRawEvent::NextSubEvent()
132 {
133    // Returns next sub-event object.
134
135    if (!fSubEvents)
136       fSubEvents = new TObjArray(100); // arbitrary, probably enough to prevent resizing
137
138    if (fSubEvents->GetSize() <= fNSubEvents) {
139       fSubEvents->Expand(fNSubEvents+10);
140       Warning("NextSubEvent", "expanded fSubEvents by 10 to %d",
141               fSubEvents->GetSize());
142    }
143
144    AliRawEvent *ev;
145    if (!(ev = (AliRawEvent *)fSubEvents->At(fNSubEvents))) {
146       ev = new AliRawEvent;
147       fSubEvents->AddAt(ev, fNSubEvents);
148    }
149
150    fNSubEvents++;
151
152    return ev;
153 }
154
155 //______________________________________________________________________________
156 AliRawEvent *AliRawEvent::GetSubEvent(Int_t index) const
157 {
158    // Get specified sub event. Returns 0 if sub event does not exist.
159
160    if (!fSubEvents)
161       return 0;
162
163    return (AliRawEvent *) fSubEvents->At(index);
164 }
165
166 //______________________________________________________________________________
167 void AliRawEvent::Reset()
168 {
169    // Reset the event in case it needs to be re-used (avoiding costly
170    // new/delete cycle). We reset the size marker for the AliRawData
171    // objects and the sub event counter.
172
173    for (int i = 0; i < fNEquipments; i++) {
174       AliRawEquipment *eq = (AliRawEquipment *)fEquipments->At(i);
175       eq->Reset();
176    }
177    fNEquipments = 0;
178    for (int i = 0; i < fNSubEvents; i++) {
179       AliRawEvent *ev = (AliRawEvent *)fSubEvents->At(i);
180       ev->Reset();
181    }
182    fNSubEvents = 0;
183 }
184
185 //______________________________________________________________________________
186 AliRawEvent::~AliRawEvent()
187 {
188    // Clean up event object. Delete also, possible, private raw data.
189
190    delete fEvtHdr;
191    if (fEquipments)
192       fEquipments->Delete();
193    delete fEquipments;
194    if (fSubEvents)
195       fSubEvents->Delete();
196    delete fSubEvents;
197 }