Possibility for decreasing size ordering of events
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 23 Nov 2011 10:02:07 +0000 (10:02 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 23 Nov 2011 10:02:07 +0000 (10:02 +0000)
RAW/AliRawReaderRoot.cxx
RAW/AliRawReaderRoot.h

index 1fde2b8..86c9bc1 100644 (file)
@@ -30,6 +30,7 @@
 
 #include <TFile.h>
 #include <TTree.h>
+#include <TTreeIndex.h>
 #include "AliRawReaderRoot.h"
 #include "AliRawVEvent.h"
 #include "AliRawEventHeaderBase.h"
@@ -39,6 +40,8 @@
 
 
 ClassImp(AliRawReaderRoot)
+Bool_t AliRawReaderRoot::fgUseOrder = kFALSE;
+
 
 AliRawReaderRoot::AliRawReaderRoot() :
   fFile(NULL),
@@ -52,7 +55,8 @@ AliRawReaderRoot::AliRawReaderRoot() :
   fEquipment(NULL),
   fRawData(NULL),
   fPosition(NULL),
-  fEnd(NULL)
+  fEnd(NULL),
+  fIndex(0x0)
 {
 // default constructor
 
@@ -70,7 +74,8 @@ AliRawReaderRoot::AliRawReaderRoot(const char* fileName, Int_t eventNumber) :
   fEquipment(NULL),
   fRawData(NULL),
   fPosition(NULL),
-  fEnd(NULL)
+  fEnd(NULL),
+  fIndex(0x0)
 {
 // create an object to read digits from the given input file for the
 // event with the given number
@@ -119,7 +124,8 @@ AliRawReaderRoot::AliRawReaderRoot(AliRawVEvent* event) :
   fEquipment(NULL),
   fRawData(NULL),
   fPosition(NULL),
-  fEnd(NULL)
+  fEnd(NULL),
+  fIndex(0x0)
 {
 // create an object to read digits from the given raw event
   if (!fEvent) fIsValid = kFALSE;
@@ -138,7 +144,8 @@ AliRawReaderRoot::AliRawReaderRoot(const AliRawReaderRoot& rawReader) :
   fEquipment(NULL),
   fRawData(NULL),
   fPosition(NULL),
-  fEnd(NULL)
+  fEnd(NULL),
+  fIndex(0x0)
 {
 // copy constructor
 
@@ -532,12 +539,20 @@ Bool_t AliRawReaderRoot::NextEvent()
 
   if (!fBranch) return kFALSE;
 
+  // check if it uses order or not
+  if (fgUseOrder && !fIndex) MakeIndex();
+
   do {
     delete fEvent;
     fEvent = NULL;
     fEventHeader = NULL;
     fBranch->SetAddress(&fEvent);
-    if (fBranch->GetEntry(fEventIndex+1) <= 0)
+    Int_t entryToGet = fEventIndex + 1;
+    if (fgUseOrder 
+       && fIndex 
+       && entryToGet<fBranch->GetEntries()
+       && entryToGet>-1 ) entryToGet = fIndex[entryToGet];
+    if (fBranch->GetEntry(entryToGet) <= 0)
       return kFALSE;
     fEventHeader = fEvent->GetHeader();
     fEventIndex++;
@@ -569,11 +584,19 @@ Bool_t  AliRawReaderRoot::GotoEvent(Int_t event)
 
   if (!fBranch) return kFALSE;
 
+  // check if it uses order or not
+  if (fgUseOrder && !fIndex) MakeIndex();
+
   delete fEvent;
   fEvent = NULL;
   fEventHeader = NULL;
   fBranch->SetAddress(&fEvent);
-  if (fBranch->GetEntry(event) <= 0)
+  Int_t entryToGet = event;
+  if (fgUseOrder 
+      && fIndex 
+      && entryToGet<fBranch->GetEntries()
+      && entryToGet>-1 ) entryToGet = fIndex[entryToGet];
+  if (fBranch->GetEntry(entryToGet) <= 0)
     return kFALSE;
   fEventHeader = fEvent->GetHeader();
   fEventIndex = event;
@@ -689,3 +712,15 @@ AliRawReader* AliRawReaderRoot::CloneSingleEvent() const
   }
   return NULL;
 }
+
+void AliRawReaderRoot::MakeIndex() {
+  // Make index
+  if (fBranch) {
+    TTree * rawTree = fBranch->GetTree();
+    if (rawTree) {
+      rawTree->BuildIndex("-fEvtHdrs[0].fSize"); // Minus sign to get largest first
+      TTreeIndex * treeInd = (TTreeIndex*)rawTree->GetTreeIndex();
+      if (treeInd) fIndex = treeInd->GetIndex();
+    }
+  }
+}
index ca6e95a..04b22ad 100644 (file)
@@ -66,6 +66,8 @@ class AliRawReaderRoot: public AliRawReader {
     virtual const AliRawVEvent* GetEvent() const {return fEvent;}
 
     virtual AliRawReader* CloneSingleEvent() const;
+    static Bool_t           GetUseOrder() {return fgUseOrder;}
+    static void             UseOrder() {fgUseOrder = kTRUE;}
 
   protected :
     TFile*           fFile;         // raw data root file
@@ -80,8 +82,11 @@ class AliRawReaderRoot: public AliRawReader {
     AliRawData*      fRawData;      // current raw data
     UChar_t*         fPosition;     // current position in the raw data
     UChar_t*         fEnd;          // end position of the current subevent
+    Long64_t*        fIndex;       // Index of the tree
+    static Bool_t    fgUseOrder;       // Flag to use or not sorting in decreased size order
 
     void SwapData(const void* inbuf, const void* outbuf, UInt_t size);
+    void MakeIndex();
 
 
     ClassDef(AliRawReaderRoot, 0) // class for reading raw digits from a root file