New raw-data format. For details, see http://indico.cern.ch/materialDisplay.py?contri...
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 29 Mar 2007 16:20:11 +0000 (16:20 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 29 Mar 2007 16:20:11 +0000 (16:20 +0000)
RAW/AliRawDB.cxx
RAW/AliRawDB.h
RAW/AliRawDataArray.cxx [new file with mode: 0644]
RAW/AliRawDataArray.h [new file with mode: 0644]
RAW/AliRawEquipment.cxx
RAW/AliRawEquipment.h
RAW/RAWbaseLinkDef.h
RAW/libRAWDatabase.pkg

index 1839761..eef1795 100644 (file)
 
 #include "AliESD.h"
 #include "AliRawEvent.h"
+#include "AliRawDataArray.h"
 #include "AliRawEventHeaderBase.h"
+#include "AliRawEquipment.h"
+#include "AliRawEquipmentHeader.h"
 #include "AliStats.h"
 
 #include "AliRawDB.h"
@@ -68,12 +71,28 @@ AliRawDB::AliRawDB(AliRawEvent *event,
 {
    // Create a new raw DB
 
+  for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++)
+    fDetRawData[iDet] = new AliRawDataArray(AliDAQ::NumberOfDdls(iDet));
+
+  fDetRawData[AliDAQ::kNDetectors] = new AliRawDataArray(100);
+
    if (fileName) {
       if (!Create(fileName))
          MakeZombie();
    }
 }
 
+
+//______________________________________________________________________________
+AliRawDB::~AliRawDB() {
+  // Destructor
+
+  if(Close()==-1) Error("~AliRawDB", "cannot close output file!");
+
+  for (Int_t iDet = 0; iDet < (AliDAQ::kNDetectors + 1); iDet++)
+    delete fDetRawData[iDet];
+}
+
 //______________________________________________________________________________
 Bool_t AliRawDB::FSHasSpace(const char *fs) const
 {
@@ -238,12 +257,23 @@ void AliRawDB::MakeTree()
    fTree = new TTree("RAW", Form("ALICE raw-data tree (%s)", GetAliRootTag()));
    fTree->SetAutoSave(2000000000);  // autosave when 2 Gbyte written
 
+   fTree->BranchRef();
+
    Int_t bufsize = 256000;
    // splitting 29.6 MB/s, no splitting 35.3 MB/s on P4 2GHz 15k SCSI
    //Int_t split   = 1;
    Int_t split   = 0;
    fTree->Branch("rawevent", "AliRawEvent", &fEvent, bufsize, split);
 
+   // Make brach for each sub-detector
+   for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
+     fTree->Branch(AliDAQ::DetectorName(iDet),"AliRawDataArray",
+                  &fDetRawData[iDet],bufsize,split);
+   }
+   // Make special branch for unrecognized raw-data payloads
+   fTree->Branch("Common","AliRawDataArray",
+                  &fDetRawData[AliDAQ::kNDetectors],bufsize,split);
+
    // Create tree which will contain the HLT ESD information
 
    if (fESD) {
@@ -305,6 +335,23 @@ Int_t AliRawDB::Fill()
 {
    // Fill the trees and return the number of written bytes
 
+  for (Int_t iDet = 0; iDet < (AliDAQ::kNDetectors + 1); iDet++)
+    fDetRawData[iDet]->ClearData();
+
+   // Move the raw-data payloads to the corresponding branches
+  for(Int_t iSubEvent = 0; iSubEvent < fEvent->GetNSubEvents(); iSubEvent++) {
+    AliRawEvent *subEvent = fEvent->GetSubEvent(iSubEvent);
+    for(Int_t iEquipment = 0; iEquipment < subEvent->GetNEquipments(); iEquipment++) {
+      AliRawEquipment *equipment = subEvent->GetEquipment(iEquipment);
+      UInt_t eqId = equipment->GetEquipmentHeader()->GetId();
+      Int_t ddlIndex;
+      Int_t iDet = AliDAQ::DetectorIDFromDdlID(eqId,ddlIndex);
+      if (iDet < 0 || iDet > AliDAQ::kNDetectors)
+       iDet = AliDAQ::kNDetectors;
+      equipment->SetRawDataRef(fDetRawData[iDet]);
+    }
+  }
+
    Double_t bytes = fRawDB->GetBytesWritten();
    Bool_t error = kFALSE;
    if (fTree->Fill() == -1)
index 8573777..28ca360 100644 (file)
 #include <TString.h>
 #endif
 
+#include "AliDAQ.h"
 
 // Forward class declarations
 class AliRawEvent;
+class AliRawDataArray;
 class AliStats;
 class TFile;
 class AliESD;
@@ -42,7 +44,7 @@ public:
            AliESD *esd,
            Int_t compress,
             const char* fileName = NULL);
-   virtual ~AliRawDB() { if(Close()==-1) Error("~AliRawDB", "cannot close output file!"); }
+   virtual ~AliRawDB();
 
    virtual const char *GetOpenOption() const { return "RECREATE"; }
    virtual Int_t       GetNetopt() const { return 0; }
@@ -75,6 +77,7 @@ protected:
    TFile         *fRawDB;         // DB to store raw data
    TTree         *fTree;          // tree used to store raw data
    AliRawEvent   *fEvent;         // AliRawEvent via which data is stored
+   AliRawDataArray  *fDetRawData[AliDAQ::kNDetectors+1]; // Detectors raw-data payload
    TTree         *fESDTree;       // tree for storing HLT ESD information
    AliESD        *fESD;           // pointer to HLT ESD object
    Int_t          fCompress;      // compression mode (1 default)
diff --git a/RAW/AliRawDataArray.cxx b/RAW/AliRawDataArray.cxx
new file mode 100644 (file)
index 0000000..1691060
--- /dev/null
@@ -0,0 +1,61 @@
+// Author: Cvetan Cheshkov 27/03/2007
+
+/**************************************************************************
+ * 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.                  *
+ **************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// AliRawDataArray                                                      //
+// A container object which is used in order to write the sub-detector  //
+// raw-data payloads into a separate branches                           //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+#include <TObjArray.h>
+
+#include "AliRawDataArray.h"
+
+
+ClassImp(AliRawDataArray)
+
+AliRawDataArray::AliRawDataArray():
+fRawDataArray(NULL)
+{
+  // Default constructor
+}
+
+AliRawDataArray::AliRawDataArray(Int_t n):
+fRawDataArray(new TObjArray(n))
+{
+  // Default constructor
+}
+
+AliRawDataArray::~AliRawDataArray()
+{
+  if (fRawDataArray) delete fRawDataArray;
+}
+
+void AliRawDataArray::ClearData()
+{
+  if (fRawDataArray) fRawDataArray->Clear();
+}
+
+void AliRawDataArray::Add(AliRawData *data)
+{
+  if (fRawDataArray)
+    fRawDataArray->Add((TObject *)data);
+  else
+    Error("Add", "TObjArray is not initialized! Cannot add raw-data payload!");
+}
diff --git a/RAW/AliRawDataArray.h b/RAW/AliRawDataArray.h
new file mode 100644 (file)
index 0000000..f289a3b
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef ALIRAWDATAARRAY_H
+#define ALIRAWDATAARRAY_H
+
+// Author: Cvetan Cheshkov  27/03/2007
+
+/* Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// AliRawDataArray                                                      //
+// A container object which is used in order to write the sub-detector  //
+// raw-data payloads into a separate branches                           //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+#ifndef ROOT_TObject
+#include <TObject.h>
+#endif
+
+class TObjArray;
+class AliRawData;
+
+class AliRawDataArray : public TObject {
+
+public:
+   AliRawDataArray();
+   AliRawDataArray(Int_t n);
+   virtual ~AliRawDataArray();
+
+   void ClearData();
+   void Add(AliRawData *data);
+
+private:
+   TObjArray *fRawDataArray; // Array containing raw-data payloads
+
+   AliRawDataArray(const AliRawDataArray &);      // not implemented, usage causes
+   AliRawDataArray &operator=(const AliRawDataArray &);  // link time error
+
+   ClassDef(AliRawDataArray,1)  // Alice raw event buffer
+};
+
+#endif
index 0bc6340..50e0229 100644 (file)
@@ -38,6 +38,8 @@
 //                                                                      //
 //////////////////////////////////////////////////////////////////////////
 
+#include <AliRawDataArray.h>
+
 #include "AliRawEquipmentHeader.h"
 #include "AliRawData.h"
 
@@ -50,7 +52,8 @@ ClassImp(AliRawEquipment)
 //______________________________________________________________________________
 AliRawEquipment::AliRawEquipment():
 fEqpHdr(NULL),
-fRawData(NULL)
+fRawData(NULL),
+fRawDataRef(NULL)
 {
    // Create ALICE equipment object.
 
@@ -72,10 +75,14 @@ AliRawData *AliRawEquipment::GetRawData()
 {
    // Get raw data part of AliRawEquipment.
 
-   if (!fRawData)
+  if (!fRawData) {
+    if (!fRawDataRef.IsValid())
       fRawData = new AliRawData;
-
-   return fRawData;
+    else {
+      fRawData = (AliRawData*)fRawDataRef.GetObject();
+    }
+  }
+  return fRawData;
 }
 
 //______________________________________________________________________________
@@ -87,6 +94,7 @@ void AliRawEquipment::Reset()
 
    if (fEqpHdr) fEqpHdr->Reset();
    GetRawData()->SetSize(0);
+   fRawDataRef = NULL;
 }
 
 //______________________________________________________________________________
@@ -97,3 +105,21 @@ AliRawEquipment::~AliRawEquipment()
    delete fEqpHdr;
    delete fRawData;
 }
+
+//______________________________________________________________________________
+void AliRawEquipment::SetRawDataRef(AliRawDataArray *array)
+{
+  // Set the TRef to the raw-data container
+  // before writing it to the branch
+  if (fRawData) {
+    fRawDataRef = fRawData;
+    array->Add(fRawData);
+    fRawData = NULL;
+    return;
+  }
+  else {
+    Error("SetRawDataRef", "Raw-data payload does not exist! Can not set a reference to it!");    
+    fRawDataRef = NULL;
+    return;
+  }
+}
index b0dfd1d..87bd484 100644 (file)
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
-
+#include <TRef.h>
 
 // Forward class declarations
+class AliRawDataArray;
 class AliRawEquipmentHeader;
 class AliRawData;
 
@@ -50,15 +51,17 @@ public:
    AliRawEquipmentHeader *GetEquipmentHeader();
    AliRawData            *GetRawData();
    void                   Reset();
+   void                   SetRawDataRef(AliRawDataArray *array);
 
 private:
    AliRawEquipmentHeader *fEqpHdr;      // equipment header
    AliRawData            *fRawData;     // raw data container
+   TRef                   fRawDataRef;  // reference to raw data container
 
    AliRawEquipment(const AliRawEquipment& rawEvent);
    AliRawEquipment& operator = (const AliRawEquipment& rawEvent);
 
-   ClassDef(AliRawEquipment,1)  // ALICE raw equipment object
+   ClassDef(AliRawEquipment,2)  // ALICE raw equipment object
 };
 
 #endif
index a20d511..8495b7d 100644 (file)
@@ -10,6 +10,7 @@
 #pragma link C++ class AliRawEquipmentHeader;
 #pragma link C++ class AliRawEquipment;
 #pragma link C++ class AliRawData;
+#pragma link C++ class AliRawDataArray;
 #pragma link C++ class AliStats;
 #pragma link C++ class AliRawEventTag;
 #pragma link C++ class AliAltroMapping+;
index d3acf3f..0709e1e 100644 (file)
@@ -2,6 +2,7 @@
 
 SRCS:=  AliRawEventHeaderBase.cxx AliRawEquipmentHeader.cxx \
        AliRawData.cxx AliRawEquipment.cxx AliRawEvent.cxx \
+       AliRawDataArray.cxx \
        AliStats.cxx AliRawEventTag.cxx \
        AliAltroMapping.cxx AliCaloAltroMapping.cxx \
        AliDAQ.cxx