ROOT logo
// Author: Cvetan Cheshkov  11/05/2009

/**************************************************************************
 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// AliRawEventV2                                                          //
//                                                                      //
// Set of classes defining the ALICE RAW event format. The AliRawEventV2  //
// class defines a RAW event. It consists of an AliEventHeader object   //
// an AliEquipmentHeader object, an AliRawData object and an array of   //
// sub-events, themselves also being AliRawEventV2s. The number of        //
// sub-events depends on the number of DATE LDC's.                      //
// The AliRawEventV2 objects are written to a ROOT file using different   //
// technologies, i.e. to local disk via AliRawDB or via rfiod using     //
// AliRawRFIODB or via rootd using AliRawRootdDB or to CASTOR via       //
// rootd using AliRawCastorDB (and for performance testing there is     //
// also AliRawNullDB).                                                  //
// The AliStats class provides statics information that is added as     //
// a single keyed object to each raw file.                              //
// The AliTagDB provides an interface to a TAG database.                //
// The AliMDC class is usid by the "alimdc" stand-alone program         //
// that reads data directly from DATE.                                  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include <TObjArray.h>
#include <TClass.h>

#include "AliLog.h"

#include "AliRawEventHeaderBase.h"
#include "AliRawEquipmentV2.h"

#include "AliRawEventV2.h"


ClassImp(AliRawEventV2)


//______________________________________________________________________________
AliRawEventV2::AliRawEventV2():
AliRawVEvent(),
fEquipments("AliRawEquipmentV2",1000),
fEvtHdrs(NULL),
fIndex(0),
fNAllocHdrs(0),
fNAllocEqs(0)
{
   // Create ALICE event object. If ownData is kFALSE we will use a static
   // raw data object, otherwise a private copy will be made.

}

//______________________________________________________________________________
AliRawEventHeaderBase *AliRawEventV2::GetHeader(char*& data)
{
  // Get event header part of AliRawEventV2.
  // First the DATE version is identified and then the
  // corresponding event header version object is created

  AliRawEventHeaderBase *hdr = NULL;

  if (!fEvtHdrs) {
    hdr = AliRawEventHeaderBase::Create(data);
    hdr->IsA()->IgnoreTObjectStreamer();
    fEvtHdrs = new TClonesArray(hdr->IsA()->GetName(),100);
    delete hdr;
  }

  if (fIndex < fNAllocHdrs) {
    TClonesArray &arr = *fEvtHdrs;
    return (AliRawEventHeaderBase *)arr[fIndex];
  }
  else {
    fNAllocHdrs = fIndex + 1;
    return (AliRawEventHeaderBase *)fEvtHdrs->New(fIndex);
  }
}

//______________________________________________________________________________
AliRawEventHeaderBase *AliRawEventV2::GetHeader()
{
  AliRawEventHeaderBase *hdr = NULL;
  if (!fEvtHdrs || !(hdr = (AliRawEventHeaderBase *)fEvtHdrs->UncheckedAt(fIndex))) {
    AliFatal("Event header does not exist!");
    return NULL;
  }

  return hdr;
}

//______________________________________________________________________________
AliRawEquipmentV2 *AliRawEventV2::NextEquipment()
{
   // Returns next equipment object.

  AliRawEventHeaderBase *hdr = (AliRawEventHeaderBase *)fEvtHdrs->UncheckedAt(fIndex);
  Int_t nEquipments = fEquipments.GetEntriesFast();
  hdr->AddEqIndex(nEquipments);

  if (nEquipments < fNAllocEqs) {
    return (AliRawEquipmentV2 *)fEquipments[nEquipments];
  }
  else {
    fNAllocEqs = nEquipments + 1;
    return new (fEquipments[nEquipments]) AliRawEquipmentV2();
  }
}

//______________________________________________________________________________
AliRawVEquipment *AliRawEventV2::GetEquipment(Int_t index) const
{
   // Get specified equipment. Returns 0 if equipment does not exist.

  //   if (!fEquipments)
  //      return NULL;

   AliRawEventHeaderBase *hdr = NULL;
   if (!fEvtHdrs || !(hdr = (AliRawEventHeaderBase *)fEvtHdrs->UncheckedAt(fIndex))) {
     AliFatal("Header is not yet initialized!");
     return NULL;
   }

   if ((index + hdr->GetFirstEqIndex()) > hdr->GetLastEqIndex()) {
     AliFatal("Equipment index out of scope!");
     return NULL;
   }     

   return (AliRawVEquipment *) fEquipments.UncheckedAt(index+hdr->GetFirstEqIndex());
}


//______________________________________________________________________________
Int_t AliRawEventV2::GetNEquipments() const
{
  //   if (!fEquipments)
  //      return 0;
  
   AliRawEventHeaderBase *hdr = NULL;
   if (!fEvtHdrs || !(hdr = (AliRawEventHeaderBase *)fEvtHdrs->UncheckedAt(fIndex))) {
     AliFatal("Header is not yet initialized!");
     return 0;
   }

   return (hdr->GetFirstEqIndex() < 0) ? 0 : (hdr->GetLastEqIndex() - hdr->GetFirstEqIndex() + 1);
}

//______________________________________________________________________________
AliRawEventV2 *AliRawEventV2::NextSubEvent()
{
   // Returns next sub-event object.

  fIndex++;

  return this;
}

//______________________________________________________________________________
AliRawVEvent *AliRawEventV2::GetSubEvent(Int_t index)
{
   // Get specified sub event. Returns 0 if sub event does not exist.

  if (!fEvtHdrs) {
    AliFatal("Headers are not yet initialized!");
    return NULL;
  }

  fIndex = index + 1;

  return this;
}

//______________________________________________________________________________
void AliRawEventV2::Reset()
{
   // Reset the event in case it needs to be re-used (avoiding costly
   // new/delete cycle). We reset the size marker for the AliRawData
   // objects and the sub event counter.

  fEquipments.Clear();

  if (fEvtHdrs) {
    for (int i = 0; i < fEvtHdrs->GetEntriesFast(); i++) {
      AliRawEventHeaderBase *hdr = (AliRawEventHeaderBase *)fEvtHdrs->UncheckedAt(i);
      hdr->Reset();
    }
    fEvtHdrs->Clear();
  }
  fIndex = 0;
}

//______________________________________________________________________________
AliRawEventV2::~AliRawEventV2()
{
   // Clean up event object. Delete also, possible, private raw data.

  //   if (fEquipments)
  fEquipments.Delete();
  //   delete fEquipments;
   if (fEvtHdrs)
      fEvtHdrs->Delete();
   delete fEvtHdrs;
}

//______________________________________________________________________________
void AliRawEventV2::Clear(Option_t*)
{
   // Clear the event in case it needs to be re-used (avoiding costly
   // new/delete cycle). Can be used inside the event loop.

  fEquipments.Clear("C");

  if (fEvtHdrs) {
    for (int i = 0; i < fEvtHdrs->GetEntriesFast(); i++) {
      AliRawEventHeaderBase *hdr = (AliRawEventHeaderBase *)fEvtHdrs->UncheckedAt(i);
      hdr->Reset();
    }
    fEvtHdrs->Clear();
  }
  fIndex = 0;
}

 AliRawEventV2.cxx:1
 AliRawEventV2.cxx:2
 AliRawEventV2.cxx:3
 AliRawEventV2.cxx:4
 AliRawEventV2.cxx:5
 AliRawEventV2.cxx:6
 AliRawEventV2.cxx:7
 AliRawEventV2.cxx:8
 AliRawEventV2.cxx:9
 AliRawEventV2.cxx:10
 AliRawEventV2.cxx:11
 AliRawEventV2.cxx:12
 AliRawEventV2.cxx:13
 AliRawEventV2.cxx:14
 AliRawEventV2.cxx:15
 AliRawEventV2.cxx:16
 AliRawEventV2.cxx:17
 AliRawEventV2.cxx:18
 AliRawEventV2.cxx:19
 AliRawEventV2.cxx:20
 AliRawEventV2.cxx:21
 AliRawEventV2.cxx:22
 AliRawEventV2.cxx:23
 AliRawEventV2.cxx:24
 AliRawEventV2.cxx:25
 AliRawEventV2.cxx:26
 AliRawEventV2.cxx:27
 AliRawEventV2.cxx:28
 AliRawEventV2.cxx:29
 AliRawEventV2.cxx:30
 AliRawEventV2.cxx:31
 AliRawEventV2.cxx:32
 AliRawEventV2.cxx:33
 AliRawEventV2.cxx:34
 AliRawEventV2.cxx:35
 AliRawEventV2.cxx:36
 AliRawEventV2.cxx:37
 AliRawEventV2.cxx:38
 AliRawEventV2.cxx:39
 AliRawEventV2.cxx:40
 AliRawEventV2.cxx:41
 AliRawEventV2.cxx:42
 AliRawEventV2.cxx:43
 AliRawEventV2.cxx:44
 AliRawEventV2.cxx:45
 AliRawEventV2.cxx:46
 AliRawEventV2.cxx:47
 AliRawEventV2.cxx:48
 AliRawEventV2.cxx:49
 AliRawEventV2.cxx:50
 AliRawEventV2.cxx:51
 AliRawEventV2.cxx:52
 AliRawEventV2.cxx:53
 AliRawEventV2.cxx:54
 AliRawEventV2.cxx:55
 AliRawEventV2.cxx:56
 AliRawEventV2.cxx:57
 AliRawEventV2.cxx:58
 AliRawEventV2.cxx:59
 AliRawEventV2.cxx:60
 AliRawEventV2.cxx:61
 AliRawEventV2.cxx:62
 AliRawEventV2.cxx:63
 AliRawEventV2.cxx:64
 AliRawEventV2.cxx:65
 AliRawEventV2.cxx:66
 AliRawEventV2.cxx:67
 AliRawEventV2.cxx:68
 AliRawEventV2.cxx:69
 AliRawEventV2.cxx:70
 AliRawEventV2.cxx:71
 AliRawEventV2.cxx:72
 AliRawEventV2.cxx:73
 AliRawEventV2.cxx:74
 AliRawEventV2.cxx:75
 AliRawEventV2.cxx:76
 AliRawEventV2.cxx:77
 AliRawEventV2.cxx:78
 AliRawEventV2.cxx:79
 AliRawEventV2.cxx:80
 AliRawEventV2.cxx:81
 AliRawEventV2.cxx:82
 AliRawEventV2.cxx:83
 AliRawEventV2.cxx:84
 AliRawEventV2.cxx:85
 AliRawEventV2.cxx:86
 AliRawEventV2.cxx:87
 AliRawEventV2.cxx:88
 AliRawEventV2.cxx:89
 AliRawEventV2.cxx:90
 AliRawEventV2.cxx:91
 AliRawEventV2.cxx:92
 AliRawEventV2.cxx:93
 AliRawEventV2.cxx:94
 AliRawEventV2.cxx:95
 AliRawEventV2.cxx:96
 AliRawEventV2.cxx:97
 AliRawEventV2.cxx:98
 AliRawEventV2.cxx:99
 AliRawEventV2.cxx:100
 AliRawEventV2.cxx:101
 AliRawEventV2.cxx:102
 AliRawEventV2.cxx:103
 AliRawEventV2.cxx:104
 AliRawEventV2.cxx:105
 AliRawEventV2.cxx:106
 AliRawEventV2.cxx:107
 AliRawEventV2.cxx:108
 AliRawEventV2.cxx:109
 AliRawEventV2.cxx:110
 AliRawEventV2.cxx:111
 AliRawEventV2.cxx:112
 AliRawEventV2.cxx:113
 AliRawEventV2.cxx:114
 AliRawEventV2.cxx:115
 AliRawEventV2.cxx:116
 AliRawEventV2.cxx:117
 AliRawEventV2.cxx:118
 AliRawEventV2.cxx:119
 AliRawEventV2.cxx:120
 AliRawEventV2.cxx:121
 AliRawEventV2.cxx:122
 AliRawEventV2.cxx:123
 AliRawEventV2.cxx:124
 AliRawEventV2.cxx:125
 AliRawEventV2.cxx:126
 AliRawEventV2.cxx:127
 AliRawEventV2.cxx:128
 AliRawEventV2.cxx:129
 AliRawEventV2.cxx:130
 AliRawEventV2.cxx:131
 AliRawEventV2.cxx:132
 AliRawEventV2.cxx:133
 AliRawEventV2.cxx:134
 AliRawEventV2.cxx:135
 AliRawEventV2.cxx:136
 AliRawEventV2.cxx:137
 AliRawEventV2.cxx:138
 AliRawEventV2.cxx:139
 AliRawEventV2.cxx:140
 AliRawEventV2.cxx:141
 AliRawEventV2.cxx:142
 AliRawEventV2.cxx:143
 AliRawEventV2.cxx:144
 AliRawEventV2.cxx:145
 AliRawEventV2.cxx:146
 AliRawEventV2.cxx:147
 AliRawEventV2.cxx:148
 AliRawEventV2.cxx:149
 AliRawEventV2.cxx:150
 AliRawEventV2.cxx:151
 AliRawEventV2.cxx:152
 AliRawEventV2.cxx:153
 AliRawEventV2.cxx:154
 AliRawEventV2.cxx:155
 AliRawEventV2.cxx:156
 AliRawEventV2.cxx:157
 AliRawEventV2.cxx:158
 AliRawEventV2.cxx:159
 AliRawEventV2.cxx:160
 AliRawEventV2.cxx:161
 AliRawEventV2.cxx:162
 AliRawEventV2.cxx:163
 AliRawEventV2.cxx:164
 AliRawEventV2.cxx:165
 AliRawEventV2.cxx:166
 AliRawEventV2.cxx:167
 AliRawEventV2.cxx:168
 AliRawEventV2.cxx:169
 AliRawEventV2.cxx:170
 AliRawEventV2.cxx:171
 AliRawEventV2.cxx:172
 AliRawEventV2.cxx:173
 AliRawEventV2.cxx:174
 AliRawEventV2.cxx:175
 AliRawEventV2.cxx:176
 AliRawEventV2.cxx:177
 AliRawEventV2.cxx:178
 AliRawEventV2.cxx:179
 AliRawEventV2.cxx:180
 AliRawEventV2.cxx:181
 AliRawEventV2.cxx:182
 AliRawEventV2.cxx:183
 AliRawEventV2.cxx:184
 AliRawEventV2.cxx:185
 AliRawEventV2.cxx:186
 AliRawEventV2.cxx:187
 AliRawEventV2.cxx:188
 AliRawEventV2.cxx:189
 AliRawEventV2.cxx:190
 AliRawEventV2.cxx:191
 AliRawEventV2.cxx:192
 AliRawEventV2.cxx:193
 AliRawEventV2.cxx:194
 AliRawEventV2.cxx:195
 AliRawEventV2.cxx:196
 AliRawEventV2.cxx:197
 AliRawEventV2.cxx:198
 AliRawEventV2.cxx:199
 AliRawEventV2.cxx:200
 AliRawEventV2.cxx:201
 AliRawEventV2.cxx:202
 AliRawEventV2.cxx:203
 AliRawEventV2.cxx:204
 AliRawEventV2.cxx:205
 AliRawEventV2.cxx:206
 AliRawEventV2.cxx:207
 AliRawEventV2.cxx:208
 AliRawEventV2.cxx:209
 AliRawEventV2.cxx:210
 AliRawEventV2.cxx:211
 AliRawEventV2.cxx:212
 AliRawEventV2.cxx:213
 AliRawEventV2.cxx:214
 AliRawEventV2.cxx:215
 AliRawEventV2.cxx:216
 AliRawEventV2.cxx:217
 AliRawEventV2.cxx:218
 AliRawEventV2.cxx:219
 AliRawEventV2.cxx:220
 AliRawEventV2.cxx:221
 AliRawEventV2.cxx:222
 AliRawEventV2.cxx:223
 AliRawEventV2.cxx:224
 AliRawEventV2.cxx:225
 AliRawEventV2.cxx:226
 AliRawEventV2.cxx:227
 AliRawEventV2.cxx:228
 AliRawEventV2.cxx:229
 AliRawEventV2.cxx:230
 AliRawEventV2.cxx:231
 AliRawEventV2.cxx:232
 AliRawEventV2.cxx:233
 AliRawEventV2.cxx:234
 AliRawEventV2.cxx:235
 AliRawEventV2.cxx:236