1 // Author: Cvetan Cheshkov 10/10/2005
3 /**************************************************************************
4 * Copyright(c) 1998-2003, 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 **************************************************************************/
18 //////////////////////////////////////////////////////////////////////////
20 // AliRawEventHeaderBase //
21 // This a new versioning scheme for raw data root-ification and reading //
22 // For details look at offline weekly meeting 20/10/2005 //
24 //////////////////////////////////////////////////////////////////////////
29 #include <TDataMember.h>
30 #include <TMethodCall.h>
33 #include "AliRawEventHeaderBase.h"
36 ClassImp(AliRawEventHeaderBase)
39 //______________________________________________________________________________
40 void *AliRawEventHeaderBase::HeaderBegin()
42 // Returns the pointer to the first data member
43 // beyond the base class data members
45 TList *datalist = IsA()->GetListOfDataMembers();
47 TDataMember *member = (TDataMember *)next();
49 if(!strcmp(member->GetTypeName(),"TClass"))
50 member = (TDataMember *)next();
52 return (void *)((char *)this+member->GetOffset());
55 //______________________________________________________________________________
56 Int_t AliRawEventHeaderBase::HeaderSize() const
58 // Returns the size of the data members list
59 // beyond the base class data members
63 TList *datalist = IsA()->GetListOfDataMembers();
66 while ((member=(TDataMember *)next()) != 0x0) {
67 if (!strcmp(member->GetTypeName(),"TClass")) continue;
68 UInt_t unitsize = member->GetUnitSize();
69 UInt_t ndim = member->GetArrayDim();
73 for(UInt_t i=0;i<ndim;i++) size += member->GetMaxIndex(i)*unitsize;
79 //______________________________________________________________________________
80 void AliRawEventHeaderBase::Swap()
82 // Swap base header data.
83 // Update the fIsSwapped flag which
84 // is then use to copy in an appropriate way
85 // the rest of the header data from the raw data stream
89 fSize = net2host(fSize);
90 fMagic = net2host(fMagic);
91 fHeadSize = net2host(fHeadSize);
92 fVersion = net2host(fVersion);
96 //______________________________________________________________________________
97 const char *AliRawEventHeaderBase::GetTypeName()
99 // Get event type as a string.
100 // Will fail in case data header
101 // does not contain eventType field
102 Int_t eventType = Get("Type");
106 return "START_OF_RUN";
111 case kStartOfRunFiles:
112 return "START_OF_RUN_FILES";
115 return "END_OF_RUN_FILES";
118 return "START_OF_BURST";
121 return "END_OF_BURST";
124 return "PHYSICS_EVENT";
126 case kCalibrationEvent:
127 return "CALIBRATION_EVENT";
130 return "EVENT_FORMAT_ERROR";
133 return "UNKNOWN EVENT TYPE NUMBER";
138 //______________________________________________________________________________
139 AliRawEventHeaderBase* AliRawEventHeaderBase::Create(char*& data)
141 // Static method to create AliRawEventHeaderVX object
142 // The actual header class version is taken from the
145 // First create AlirawEVentHeaderBase class object
146 AliRawEventHeaderBase header;
148 // Copy the first common part of the raw data header
149 memcpy(header.HeaderBaseBegin(), data, header.HeaderBaseSize());
151 // Swap header data if needed
152 if (header.IsSwapped())
155 // Is header valid...
156 if (!header.IsValid()) {
157 AliFatalClass("Invalid header format!");
158 // try recovery... how?
162 if (header.GetEventSize() < (UInt_t)header.HeaderBaseSize()) {
163 AliFatalClass("Invalid header base size!");
164 // try recovery... how?
168 // Now check the DATE version and create the corresponding header
170 UInt_t version = header.GetVersion();
171 UInt_t majorversion = (version>>16)&0x0000ffff;
172 UInt_t minorversion = version&0x0000ffff;
174 classname.Form("AliRawEventHeaderV%d_%d",majorversion,minorversion);
176 TClass *tcl = TClass::GetClass(classname.Data());
178 AliFatalClass(Form("Unknown header version (%s)!",classname.Data()));
182 // header.Dump(); tcl->Dump();
184 AliRawEventHeaderBase *hdr = (AliRawEventHeaderBase *)tcl->New();
186 AliFatalClass(Form("Can not create object of class %s",classname.Data()));
190 // Copy the base header data members and initialize other data members
191 memcpy(hdr->HeaderBaseBegin(),header.HeaderBaseBegin(), header.HeaderBaseSize());
192 memset(hdr->HeaderBegin(),0, hdr->HeaderSize());
193 hdr->fIsSwapped = header.fIsSwapped;
196 if (hdr->GetEventSize() < ((UInt_t)hdr->HeaderBaseSize() + (UInt_t)hdr->HeaderSize())) {
197 AliFatalClass(Form("Invalid header size (%d < %d +%d)!",
198 hdr->GetEventSize(),hdr->HeaderBaseSize(),hdr->HeaderSize()));
199 // try recovery... how?
203 // Check for the presence of header extension and its size
204 Int_t extsize = (Int_t)hdr->GetHeadSize() - (hdr->HeaderBaseSize() + hdr->HeaderSize());
206 AliFatalClass(Form("Invalid header size (%d < %d +%d)!",
207 hdr->GetHeadSize(),hdr->HeaderBaseSize(),hdr->HeaderSize()));
208 // try recovery... how?
213 hdr->SetExtendedDataSize(extsize);
214 char *extdata = new char[extsize];
215 memset(extdata,0,extsize);
216 hdr->SetExtendedData(extdata);
223 //______________________________________________________________________________
224 Int_t AliRawEventHeaderBase::ReadHeader(char*& data)
226 // Read header info from DATE data stream.
227 // Returns bytes read
229 Long_t start = (Long_t)data;
230 // Swap header data if needed
231 if (DataIsSwapped()) {
232 swab(data,HeaderBaseBegin(), HeaderBaseSize());
233 data += HeaderBaseSize();
234 swab(data, HeaderBegin(), HeaderSize());
235 data += HeaderSize();
236 if(GetExtendedDataSize()>0) {
237 swab(data, GetExtendedData(), GetExtendedDataSize());
238 data += GetExtendedDataSize();
242 memcpy(HeaderBaseBegin(), data, HeaderBaseSize());
243 data += HeaderBaseSize();
244 memcpy(HeaderBegin(), data, HeaderSize());
245 data += HeaderSize();
246 if(GetExtendedDataSize()>0) {
247 memcpy(GetExtendedData(), data, GetExtendedDataSize());
248 data += GetExtendedDataSize();
252 return (Int_t)((Long_t)data - start);
255 //______________________________________________________________________________
256 UInt_t AliRawEventHeaderBase::Get(const char *datamember)
258 // The method to get a data member from the header object
259 // Except for the data members of the base class, all the
260 // other header data should be retrieved ONLY by this method
261 // The name of the data member should be supplied without "f"
265 strcat(buf,datamember);
267 TDataMember *member = IsA()->GetDataMember(buf);
269 AliFatal(Form("No data member %s is found! Check the raw data version!",buf));
273 if (member->GetArrayDim() != 0) {
274 AliFatal(Form("Member %s is an array! Use the GetP() method!",buf));
278 if (strcmp(member->GetTypeName(),"UInt_t") != 0) {
279 AliFatal(Form("Member %s is not of type UInt_t!",buf));
283 const void *pointer = (char *)this+member->GetOffset();
285 return *((UInt_t *)pointer);
288 //______________________________________________________________________________
289 const UInt_t* AliRawEventHeaderBase::GetP(const char *datamember)
291 // The method to get a data member from the header object
292 // Except for the data members of the base class, all the
293 // other header data should be retrieved ONLY by this method
294 // The name of the data member should be supplied without "f"
298 strcat(buf,datamember);
300 TDataMember *member = IsA()->GetDataMember(buf);
302 AliFatal(Form("No data member %s is found! Check the raw data version!",buf));
306 if (member->GetArrayDim() == 0) {
307 AliFatal(Form("Member %s is not an array! Use the Get() method!",buf));
311 if (strcmp(member->GetTypeName(),"UInt_t") != 0) {
312 AliFatal(Form("Member %s is not of type UInt_t*!",buf));
316 const void *pointer = (char *)this+member->GetOffset();
318 return (const UInt_t*)pointer;