]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliDetector.cxx
Introducing some effective C++ suggestions
[u/mrichter/AliRoot.git] / STEER / AliDetector.cxx
index 3b64bd66948ce8f6ec219f41efd47a3f944212a4..1e2c2eec0cf00e8a3763658cd8aad69b50e5c21a 100644 (file)
 
 /*
 $Log$
+Revision 1.21  2002/10/22 15:02:15  alibrary
+Introducing Riostream.h
+
+Revision 1.20  2002/10/14 14:57:32  hristov
+Merging the VirtualMC branch to the main development branch (HEAD)
+
+Revision 1.16.8.3  2002/10/14 09:45:57  hristov
+Updating VirtualMC to v3-09-02
+
+Revision 1.19  2002/09/23 09:19:54  hristov
+FirsTrackReference updated (M.Ivanov)
+
+Revision 1.18  2002/08/26 13:51:17  hristov
+Remaping of track references at the end of each primary particle (M.Ivanov)
+
+Revision 1.17  2002/05/24 13:29:58  hristov
+AliTrackReference added, AliDisplay modified
+
+Revision 1.16  2001/10/04 15:30:56  hristov
+Changes to accommodate the set of PHOS folders and tasks (Y.Schutz)
+
+Revision 1.15  2001/07/27 13:03:13  hristov
+Default Branch split level set to 99
+
+Revision 1.14  2001/05/21 17:22:51  buncic
+Fixed problem with missing AliConfig while reading galice.root
+
+Revision 1.13  2001/05/16 14:57:22  alibrary
+New files for folders and Stack
+
+Revision 1.12  2001/03/12 17:47:03  hristov
+Changes needed on Sun with CC 5.0
+
+Revision 1.11  2001/01/26 19:58:46  hristov
+Major upgrade of AliRoot code
+
+Revision 1.10  2001/01/17 10:50:50  hristov
+Corrections to destructors
+
+Revision 1.9  2000/12/12 18:19:06  alibrary
+Introduce consistency check when loading points
+
+Revision 1.8  2000/11/30 07:12:48  alibrary
+Introducing new Rndm and QA classes
+
 Revision 1.7  2000/10/02 21:28:14  fca
 Removal of useless dependecies via forward declarations
 
@@ -44,36 +89,65 @@ Introduction of the Copyright and cvs Log
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
+#include <assert.h>
+
+#include <TBrowser.h>
+#include <TFile.h>
+#include <TFolder.h>
+#include <TROOT.h>
 #include <TTree.h>
-#include "TBrowser.h"
+#include <Riostream.h>
 
+#include "AliConfig.h"
 #include "AliDetector.h"
-#include "AliRun.h"
 #include "AliHit.h"
 #include "AliPoints.h"
+#include "AliRun.h"
+#include "AliTrackReference.h"
+
+
 // Static variables for the hit iterator routines
 static Int_t sMaxIterHit=0;
 static Int_t sCurIterHit=0;
 
+
 ClassImp(AliDetector)
  
-//_____________________________________________________________________________
-AliDetector::AliDetector()
+//_______________________________________________________________________
+AliDetector::AliDetector():
+  fTimeGate(200.e-9),
+  fIshunt(0),
+  fNhits(0),
+  fNdigits(0),
+  fBufferSize(1600),
+  fHits(0),
+  fDigits(0),
+  fDigitsFile(0),
+  fPoints(0),
+  fTrackReferences(0),
+  fMaxIterTrackRef(0),
+  fCurrentIterTrackRef(0)
 {
   //
   // Default constructor for the AliDetector class
   //
-  fNhits      = 0;
-  fNdigits    = 0;
-  fPoints     = 0;
-  fHits       = 0;
-  fDigits     = 0;
-  fTimeGate   = 200.e-9;
-  fBufferSize = 16000;
 }
  
 //_____________________________________________________________________________
-AliDetector::AliDetector(const char* name,const char *title):AliModule(name,title)
+AliDetector::AliDetector(const char* name,const char *title):
+  AliModule(name,title),
+  fTimeGate(200.e-9),
+  fIshunt(0),
+  fNhits(0),
+  fNdigits(0),
+  fBufferSize(1600),
+  fHits(0),
+  fDigits(0),
+  fDigitsFile(0),
+  fPoints(0),
+  fTrackReferences(new TClonesArray("AliTrackReference", 100)),
+  fMaxIterTrackRef(0),
+  fCurrentIterTrackRef(0)
 {
   //
   // Normal constructor invoked by all Detectors.
@@ -81,32 +155,140 @@ AliDetector::AliDetector(const char* name,const char *title):AliModule(name,titl
   // Add this Detector to the global list of Detectors in Run.
   //
 
-  fTimeGate   = 200.e-9;
   fActive     = kTRUE;
-  fNhits      = 0;
-  fHits       = 0;
-  fDigits     = 0;
-  fNdigits    = 0;
-  fPoints     = 0;
-  fBufferSize = 16000;
+  AliConfig::Instance()->Add(this);
+
 }
  
-//_____________________________________________________________________________
+//_______________________________________________________________________
 AliDetector::~AliDetector()
 {
   //
   // Destructor
   //
-  fNhits      = 0;
-  fNdigits    = 0;
-  //
+
   // Delete space point structure
-  if (fPoints) fPoints->Delete();
-  delete fPoints;
-  fPoints     = 0;
+  if (fPoints) {
+    fPoints->Delete();
+    delete fPoints;
+    fPoints     = 0;
+  }
+  // Delete digits structure
+  if (fDigits) {
+    fDigits->Delete();
+    delete fDigits;
+    fDigits     = 0;
+  }
+  if (fDigitsFile) delete [] fDigitsFile;
 }
-//_____________________________________________________________________________
+
+//_______________________________________________________________________
+void AliDetector::Publish(const char *dir, void *address, const char *name)
+{
+  //
+  // Register pointer to detector objects. 
+  // 
+  TFolder *topFolder = (TFolder *)gROOT->FindObjectAny("/Folders");
+  if  (topFolder) { 
+    TFolder *folder = (TFolder *)topFolder->FindObjectAny(dir);
+    // TFolder *folder = (TFolder *)gROOT->FindObjectAny(dir);
+    if (!folder)  {
+      cerr << "Cannot register: Missing folder: " << dir << endl;
+    } else {
+      TFolder *subfolder = (TFolder *) folder->FindObjectAny(this->GetName()); 
+
+      if(!subfolder)
+         subfolder = folder->AddFolder(this->GetName(),this->GetTitle());
+      if (address) {
+        TObject **obj = (TObject **) address;
+        if ((*obj)->InheritsFrom(TCollection::Class())) {
+           TCollection *collection = (TCollection *) (*obj); 
+           if (name)
+             collection->SetName(name);
+        } 
+        subfolder->Add(*obj);
+      } 
+    }  
+  }
+}
+
+//_______________________________________________________________________
+TBranch* AliDetector::MakeBranchInTree(TTree *tree, const char* name, 
+                                       void* address, Int_t size,
+                                       const char *file)
+{ 
+    return(MakeBranchInTree(tree,name,0,address,size,99,file));
+}
+
+//_______________________________________________________________________
+TBranch* AliDetector::MakeBranchInTree(TTree *tree, const char* name, 
+                                       const char *classname, 
+                                       void* address,Int_t size, 
+                                       Int_t splitlevel, const char *file)
+{ 
+    //
+    // Makes branch in given tree and diverts them to a separate file
+    //  
+    if (GetDebug()>1)
+      printf("* MakeBranch * Making Branch %s \n",name);
+      
+    TDirectory *cwd = gDirectory;
+    TBranch *branch = 0;
+    
+    if (classname) {
+      branch = tree->Branch(name,classname,address,size,splitlevel);
+    } else {
+      branch = tree->Branch(name,address,size);
+    }
+       
+    if (file) {
+        char * outFile = new char[strlen(gAlice->GetBaseFile())+strlen(file)+2];
+        sprintf(outFile,"%s/%s",gAlice->GetBaseFile(),file);
+        branch->SetFile(outFile);
+        TIter next( branch->GetListOfBranches());
+        while ((branch=(TBranch*)next())) {
+           branch->SetFile(outFile);
+        } 
+       delete outFile;
+        
+       cwd->cd();
+        
+       if (GetDebug()>1)
+           printf("* MakeBranch * Diverting Branch %s to file %s\n",name,file);
+    }
+    char *folder = 0;
+    TString folderName(name);  
+    
+    if (!strncmp(tree->GetName(),"TreeE",5)) folder = "RunMC/Event/Data";
+    if (!strncmp(tree->GetName(),"TreeK",5)) folder = "RunMC/Event/Data";
+    if (!strncmp(tree->GetName(),"TreeH",5)) {
+      folder     = "RunMC/Event/Data/Hits";
+      folderName = "Hits" ; 
+    }
+    if (!strncmp(tree->GetName(),"TreeTrackReferences",5)) {
+      folder     = "RunMC/Event/Data/TrackReferences";
+      folderName = "TrackReferences" ; 
+    }
+
+    if (!strncmp(tree->GetName(),"TreeD",5)) {
+      folder     = "Run/Event/Data";
+      folderName = "Digits" ; 
+    }
+    if (!strncmp(tree->GetName(),"TreeS",5)) {
+      folder     = "RunMC/Event/Data/SDigits";
+      folderName = "SDigits" ; 
+    }
+    if (!strncmp(tree->GetName(),"TreeR",5)) folder = "Run/Event/RecData";
+
+    if (folder) {
+      if (GetDebug())
+          printf("%15s: Publishing %s to %s\n",ClassName(),name,folder);
+      Publish(folder,address, folderName.Data());
+    }  
+    return branch;
+}
+
+//_______________________________________________________________________
 void AliDetector::Browse(TBrowser *b)
 {
   //
@@ -125,7 +307,7 @@ void AliDetector::Browse(TBrowser *b)
   }
 }
 
-//_____________________________________________________________________________
+//_______________________________________________________________________
 void AliDetector::Copy(AliDetector &det) const
 {
   //
@@ -134,7 +316,7 @@ void AliDetector::Copy(AliDetector &det) const
   Fatal("Copy","Not implemented~\n");
 }
 
-//_____________________________________________________________________________
+//_______________________________________________________________________
 void AliDetector::FinishRun()
 {
   //
@@ -142,7 +324,26 @@ void AliDetector::FinishRun()
   //
 }
 
-//_____________________________________________________________________________
+//_______________________________________________________________________
+void AliDetector::RemapTrackReferencesIDs(Int_t *map)
+{
+  // 
+  // Remapping track reference
+  // Called at finish primary
+  //
+  if (!fTrackReferences) return;
+  for (Int_t i=0;i<fTrackReferences->GetEntries();i++){
+    AliTrackReference * ref = (AliTrackReference*) fTrackReferences->UncheckedAt(i);
+    if (ref) {
+      Int_t newID = map[ref->GetTrack()];
+      if (newID>=0) ref->SetTrack(newID);
+      else ref->SetTrack(-1);
+      
+    }
+  }
+}
+
+//_______________________________________________________________________
 AliHit* AliDetector::FirstHit(Int_t track)
 {
   //
@@ -163,7 +364,29 @@ AliHit* AliDetector::FirstHit(Int_t track)
   else            return 0;
 }
 
-//_____________________________________________________________________________
+
+//_______________________________________________________________________
+AliTrackReference* AliDetector::FirstTrackReference(Int_t track)
+{
+  //
+  // Initialise the hit iterator
+  // Return the address of the first hit for track
+  // If track>=0 the track is read from disk
+  // while if track<0 the first hit of the current
+  // track is returned
+  // 
+  if(track>=0) {
+    gAlice->ResetTrackReferences();
+    gAlice->TreeTR()->GetEvent(track);
+  }
+  //
+  fMaxIterTrackRef     = fTrackReferences->GetEntriesFast();
+  fCurrentIterTrackRef = 0;
+  if(fMaxIterTrackRef) return (AliTrackReference*) fTrackReferences->UncheckedAt(0);
+  else            return 0;
+}
+
+//_______________________________________________________________________
 AliHit* AliDetector::NextHit()
 {
   //
@@ -180,7 +403,24 @@ AliHit* AliDetector::NextHit()
   }
 }
 
-//_____________________________________________________________________________
+//_______________________________________________________________________
+AliTrackReference* AliDetector::NextTrackReference()
+{
+  //
+  // Return the next hit for the current track
+  //
+  if(fMaxIterTrackRef) {
+    if(++fCurrentIterTrackRef<fMaxIterTrackRef) 
+      return (AliTrackReference*) fTrackReferences->UncheckedAt(fCurrentIterTrackRef);
+    else        
+      return 0;
+  } else {
+    printf("* AliDetector::NextTrackReference * TrackReference  Iterator called without calling FistTrackReference before\n");
+    return 0;
+  }
+}
+
+//_______________________________________________________________________
 void AliDetector::LoadPoints(Int_t)
 {
   //
@@ -212,6 +452,7 @@ void AliDetector::LoadPoints(Int_t)
   for (Int_t hit=0;hit<nhits;hit++) {
     ahit = (AliHit*)fHits->UncheckedAt(hit);
     trk=ahit->GetTrack();
+    assert(trk<=tracks);
     if(ntrk[trk]==limi[trk]) {
       //
       // Initialise a new track
@@ -249,26 +490,55 @@ void AliDetector::LoadPoints(Int_t)
   delete [] limi;
 }
 
-//_____________________________________________________________________________
-void AliDetector::MakeBranch(Option_t *option)
+//_______________________________________________________________________
+void AliDetector::MakeBranch(Option_t *option, const char *file)
 {
   //
   // Create a new branch in the current Root Tree
   // The branch of fHits is automatically split
   //
   char branchname[10];
   sprintf(branchname,"%s",GetName());
   //
   // Get the pointer to the header
-  char *cH = strstr(option,"H");
+  const char *cH = strstr(option,"H");
   //
-  if (fHits   && gAlice->TreeH() && cH) {
-    gAlice->TreeH()->Branch(branchname,&fHits, fBufferSize);
-    printf("* AliDetector::MakeBranch * Making Branch %s for hits\n",branchname);
+  if (fHits && gAlice->TreeH() && cH) {
+    MakeBranchInTree(gAlice->TreeH(), 
+                     branchname, &fHits, fBufferSize, file) ;              
   }    
+  
+  const char *cD = strstr(option,"D");
+
+  if (cD) {
+    if (file) {
+       fDigitsFile = new char[strlen (file)];
+       strcpy(fDigitsFile,file);
+    }
+  }
+}
+//_______________________________________________________________________
+void AliDetector::MakeBranchTR(Option_t *option, const char *file)
+{
+  //
+  // Create a new branch in the current Root Tree
+  // The branch of fHits is automatically split
+  //
+  char branchname[10];
+  sprintf(branchname,"%s",GetName());
+  //
+  // Get the pointer to the header
+  const char *cTR = strstr(option,"T");
+  //
+  if (fTrackReferences && gAlice->TreeTR() && cTR) {
+    MakeBranchInTree(gAlice->TreeTR(), 
+                     branchname, &fTrackReferences, fBufferSize, file) ;              
+  }      
 }
 
-//_____________________________________________________________________________
+//_______________________________________________________________________
 void AliDetector::ResetDigits()
 {
   //
@@ -278,7 +548,7 @@ void AliDetector::ResetDigits()
   if (fDigits)   fDigits->Clear();
 }
 
-//_____________________________________________________________________________
+//_______________________________________________________________________
 void AliDetector::ResetHits()
 {
   //
@@ -288,7 +558,17 @@ void AliDetector::ResetHits()
   if (fHits)   fHits->Clear();
 }
 
-//_____________________________________________________________________________
+//_______________________________________________________________________
+void AliDetector::ResetTrackReferences()
+{
+  //
+  // Reset number of hits and the hits array
+  //
+  fMaxIterTrackRef   = 0;
+  if (fTrackReferences)   fTrackReferences->Clear();
+}
+
+//_______________________________________________________________________
 void AliDetector::ResetPoints()
 {
   //
@@ -301,7 +581,7 @@ void AliDetector::ResetPoints()
   }
 }
 
-//_____________________________________________________________________________
+//_______________________________________________________________________
 void AliDetector::SetTreeAddress()
 {
   //
@@ -324,41 +604,13 @@ void AliDetector::SetTreeAddress()
     branch = treeD->GetBranch(branchname);
     if (branch) branch->SetAddress(&fDigits);
   }
-}
 
-//_____________________________________________________________________________
-void AliDetector::Streamer(TBuffer &R__b)
-{
-  //
-  // Stream an object of class Detector.
-  //
-  if (R__b.IsReading()) {
-    Version_t R__v = R__b.ReadVersion(); if (R__v) { }
-    TNamed::Streamer(R__b);
-    TAttLine::Streamer(R__b);
-    TAttMarker::Streamer(R__b);
-    AliModule::Streamer(R__b);
-    R__b >> fTimeGate;
-    R__b >> fIshunt;
-    //R__b >> fNhits;
-    //
-    // Stream the pointers but not the TClonesArrays
-    R__b >> fHits; // diff
-    R__b >> fDigits; // diff
-    
-  } else {
-    R__b.WriteVersion(AliDetector::IsA());
-    TNamed::Streamer(R__b);
-    TAttLine::Streamer(R__b);
-    TAttMarker::Streamer(R__b);
-    AliModule::Streamer(R__b);
-    R__b << fTimeGate;
-    R__b << fIshunt;
-    //R__b << fNhits;
-    //
-    // Stream the pointers but not the TClonesArrays
-    R__b << fHits; // diff
-    R__b << fDigits; // diff
+  // Branch address for tr  tree
+  TTree *treeTR = gAlice->TreeTR();
+  if (treeTR && fTrackReferences) {
+    branch = treeTR->GetBranch(branchname);
+    if (branch) branch->SetAddress(&fTrackReferences);
   }
 }
+