#include "AliESD.h"
#include "AliRawEvent.h"
+#include "AliRawDataArray.h"
#include "AliRawEventHeaderBase.h"
+#include "AliRawEquipment.h"
+#include "AliRawEquipmentHeader.h"
#include "AliStats.h"
#include "AliRawDB.h"
{
// 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
{
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) {
{
// 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)
#include <TString.h>
#endif
+#include "AliDAQ.h"
// Forward class declarations
class AliRawEvent;
+class AliRawDataArray;
class AliStats;
class TFile;
class AliESD;
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; }
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)
--- /dev/null
+// 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!");
+}
--- /dev/null
+#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
// //
//////////////////////////////////////////////////////////////////////////
+#include <AliRawDataArray.h>
+
#include "AliRawEquipmentHeader.h"
#include "AliRawData.h"
//______________________________________________________________________________
AliRawEquipment::AliRawEquipment():
fEqpHdr(NULL),
-fRawData(NULL)
+fRawData(NULL),
+fRawDataRef(NULL)
{
// Create ALICE equipment object.
{
// 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;
}
//______________________________________________________________________________
if (fEqpHdr) fEqpHdr->Reset();
GetRawData()->SetSize(0);
+ fRawDataRef = NULL;
}
//______________________________________________________________________________
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;
+ }
+}
#ifndef ROOT_TObject
#include <TObject.h>
#endif
-
+#include <TRef.h>
// Forward class declarations
+class AliRawDataArray;
class AliRawEquipmentHeader;
class AliRawData;
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
#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+;
SRCS:= AliRawEventHeaderBase.cxx AliRawEquipmentHeader.cxx \
AliRawData.cxx AliRawEquipment.cxx AliRawEvent.cxx \
+ AliRawDataArray.cxx \
AliStats.cxx AliRawEventTag.cxx \
AliAltroMapping.cxx AliCaloAltroMapping.cxx \
AliDAQ.cxx