]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - FMD/AliFMDInput.h
Adding calibration object for the sharing efficiency
[u/mrichter/AliRoot.git] / FMD / AliFMDInput.h
index 718cb1c5bbfe30bea0e756cd644fa22b05186ce1..8a931bcdd5091c5b326b4aff1aec6266156975c1 100644 (file)
 // normal libraries.  The classes are intended to be used as base
 // classes for customized class that do some sort of analysis on the
 // various types of data produced by the FMD. 
-//
-#include <TObject.h>
+/** @file    AliFMDInput.h
+    @author  Christian Holm Christensen <cholm@nbi.dk>
+    @date    Mon Mar 27 12:42:40 2006
+    @brief   FMD utility classes for reading FMD data
+*/
+//___________________________________________________________________
+/** @defgroup FMD_util Utility classes. 
+
+    The classes defined here, are utility classes for reading in data
+    for the FMD.  They are put in a seperate library to not polute the
+    normal libraries.  The classes are intended to be used as base
+    classes for customized class that do some sort of analysis on the
+    various types of data produced by the FMD.
+*/
+#include <TNamed.h>
 #ifndef ROOT_TString
 # include <TString.h>
 #endif
+#ifndef ROOT_TArrayF
+# include <TArrayF.h>
+#endif
+class AliTrackReference;
 class AliRunLoader;
 class AliLoader;
 class AliStack;
 class AliRun;
+class AliRawReader;
+class AliFMDRawReader;
 class AliFMD;
 class AliFMDHit;
+class AliFMDDigit;
+class AliFMDSDigit;
+class AliFMDRecPoint;
+class AliESDEvent;
+class AliESDFMD;
+class AliHeader;
 class TString;
 class TClonesArray;
 class TTree;
 class TGeoManager;
 class TParticle;
-
+class TChain;
 
 //___________________________________________________________________
-class AliFMDInput : public TObject
+/** @class AliFMDInput 
+    @brief Base class for reading in various FMD data. 
+    The class loops over all found events.  For each event the
+    specified data is read in.   The class then loops over all
+    elements of the read data, and process these with user defined
+    code. 
+    @code 
+    struct DigitInput : public AliFMDInput 
+    { 
+      DigitInput() 
+      { 
+         // Load digits 
+         AddLoad(kDigits);
+        // Make a histogram 
+         fHist = new TH1F("adc", "ADC spectra", 1024, -.5, 1023.5);
+      }
+      // Process one digit. 
+      Bool_t ProcessDigit(AliFMDDigit* d)
+      { 
+         fHist->Fill(d->Counts());
+        return kTRUE;
+      }
+      // After processing all events, display spectrum
+      Bool_t Finish()
+      {
+        fHist->Draw();
+      }
+      TH1F* fHist;
+    };
+
+    void AdcSpectrum()
+    { 
+       DigitInput di;
+       di.Run();
+    }
+    @endcode
+    This class allows for writing small scripts, that can be compiled
+    with AcLIC, to do all sorts of tests, quick prototyping, and so
+    on.  It has proven to be quiet useful.   One can load more than
+    one type of data in one derived class, to for example to make
+    comparisons between hits and reconstructed points.   See also the
+    various scripts in @c FMD/scripts. 
+    @ingroup FMD_util
+ */
+class AliFMDInput : public TNamed
 {
 public:
+  /** The kinds of data that can be read in. */
   enum ETrees {
     kHits       = 1,  // Hits
     kKinematics,      // Kinematics (from sim)
@@ -41,96 +111,273 @@ public:
     kSDigits,         // Summable digits 
     kHeader,          // Header information 
     kRecPoints,       // Reconstructed points
-    kGeometry         // Not really a tree 
+    kESD,             // Load ESD's
+    kRaw,             // Read raw data 
+    kGeometry,        // Not really a tree 
+    kTracks,         // Hits and tracs - for BG study  
+    kTrackRefs,       // Track references - also for BG study
+    kRawCalib,        // Read raws and calibrate them
+    kUser
   };
+  /** CTOR  */
   AliFMDInput();
+  /** CTOR
+      @param gAliceFile galice file  */
   AliFMDInput(const char* gAliceFile);
+  /** DTOR */
   virtual ~AliFMDInput() {}
 
+  /** Add a data type to load 
+      @param tree Data to load */
   virtual void   AddLoad(ETrees tree)     { SETBIT(fTreeMask, tree); }
+  /** Remove a data type to load 
+      @param tree Data to @e not load */
   virtual void   RemoveLoad(ETrees tree)  { CLRBIT(fTreeMask, tree); }
+  /** @return # of available events */
   virtual Int_t  NEvents() const;
 
+  /** Initialize the class.  If a user class overloads this member
+      function, then this @e must be explicitly called
+      @return @c false on error */
   virtual Bool_t Init();
+  /** Callled at the beginning of each event. If a user class
+      overloads this member  function, then this @e must be explicitly
+      called. 
+      @param event Event number
+      @return @c false on error */
   virtual Bool_t Begin(Int_t event);
-  virtual Bool_t Event() = 0;
+  /** Process one event.  This loops over all the loaded data.   Users
+      can overload this member function, but then it's @e strongly
+      recommended to explicitly call this classes version. 
+      @return @c false on error  */
+  virtual Bool_t Event();
+  /** Called at the end of each event. 
+      @return @c false on error  */
   virtual Bool_t End();
+  /** Called at the end of the run.
+      @return  @c false on error */
   virtual Bool_t Finish() { return kTRUE; }
+  /** Run a full job. 
+      @return @c false on error  */
   virtual Bool_t Run();
-protected:
-  TString       fGAliceFile; // File name of gAlice file
-  AliRunLoader* fLoader;     // Loader of FMD data 
-  AliRun*       fRun;        // Run information
-  AliStack*     fStack;      // Stack of particles 
-  AliLoader*    fFMDLoader;  // Loader of FMD data 
-  AliFMD*       fFMD;        // FMD object
-  TTree*        fTreeE;      // Header tree 
-  TTree*        fTreeH;      // Hits tree
-  TTree*        fTreeD;      // Digit tree 
-  TTree*        fTreeS;      // SDigit tree 
-  TTree*        fTreeR;      // RecPoint tree
-  TClonesArray* fArrayE;     // Event info array
-  TClonesArray* fArrayH;     // Hit info array
-  TClonesArray* fArrayD;     // Digit info array
-  TClonesArray* fArrayS;     // SDigit info array
-  TClonesArray* fArrayN;     // Mult (single) info array
-  TClonesArray* fArrayP;     // Mult (region) info array
-  TGeoManager*  fGeoManager; // Geometry manager
-  Int_t         fTreeMask;   // Which tree's to load
-  Bool_t        fIsInit;
-  ClassDef(AliFMDInput,0)  //Hits for detector FMD
-};
 
+  /** Loop over all hits, and call ProcessHit with that hit, and
+      optionally the corresponding kinematics track. 
+      @return @c false on error  */
+  virtual Bool_t ProcessHits();
+  /** Loop over all track refs, and call ProcessTrackRef with that hit, and
+      optionally the corresponding kinematics track. 
+      @return @c false on error  */
+  virtual Bool_t ProcessTrackRefs();
+  /** Loop over all tracks, and call ProcessTrack with each hit for
+      that track
+      @return @c false on error  */
+  virtual Bool_t ProcessTracks();
+  /** Loop over all digits, and call ProcessDigit for each digit.
+      @return @c false on error  */
+  virtual Bool_t ProcessDigits();
+  /** Loop over all summable digits, and call ProcessSDigit for each
+      digit. 
+      @return @c false on error  */
+  virtual Bool_t ProcessSDigits();
+  /** Loop over all digits read from raw data files, and call
+      ProcessRawDigit for each digit. 
+      @return @c false on error  */
+  virtual Bool_t ProcessRawDigits();
+  /** Loop over all digits read from raw data files, and call
+      ProcessRawDigit for each digit. 
+      @return @c false on error  */
+  virtual Bool_t ProcessRawCalibDigits();
+  /** Loop over all reconstructed points, and call ProcessRecPoint for
+      each reconstructed point. 
+      @return @c false on error  */
+  virtual Bool_t ProcessRecPoints();
+  /** Loop over all ESD data, and call ProcessESD for each entry.
+      @return  @c false on error  */
+  virtual Bool_t ProcessESDs();
+  /** Loop over all strips and ask user routine to supply the data.
+      @return  @c false on error  */
+  virtual Bool_t ProcessUsers();
 
-//____________________________________________________________________
-class AliFMDHit;
-class AliFMDInputHits : public AliFMDInput 
-{
-public:
-  AliFMDInputHits(const char* file="galice.root") 
-    : AliFMDInput(file) { AddLoad(kHits); }
-  virtual Bool_t Event();
-  virtual Bool_t ProcessHit(AliFMDHit* hit, TParticle* track) = 0;
-  ClassDef(AliFMDInputHits, 0);
-};
+  /** Process one hit, and optionally it's corresponding kinematics
+      track.  Users should over this to process each hit. 
+      @param h Hit 
+      @param p Associated track
+      @return  @c false on error   */
+  virtual Bool_t ProcessHit(AliFMDHit* h, TParticle* p);
+  /** Process one track reference, and optionally it's corresponding kinematics
+      track.  Users should overload this to process each track reference. 
+      @param trackRef Track Reference 
+      @param track Associated track
+      @return  @c false on error   */
+  virtual Bool_t ProcessTrackRef(AliTrackReference* trackRef, TParticle* track);
+  /** Process one hit per track. Users should over this to process
+      each hit. 
+      @param i Track number 
+      @param p Track  
+      @param h Associated Hit
+      @return  @c false on error   */
+  virtual Bool_t ProcessTrack(Int_t i, TParticle* p, AliFMDHit* h);
+  /** Process one digit.  Users should over this to process each
+      digit. 
+      @param digit Digit
+      @return  @c false on error   */
+  virtual Bool_t ProcessDigit(AliFMDDigit* digit);
+  /** Process one summable digit.  Users should over this to process
+      each summable digit.  
+      @param sdigit Summable digit
+      @return  @c false on error   */
+  virtual Bool_t ProcessSDigit(AliFMDSDigit* sdigit);
+  /** Process one digit from raw data files.  Users should over this
+      to process each raw digit.  
+      @param digit Raw digit
+      @return  @c false on error   */
+  virtual Bool_t ProcessRawDigit(AliFMDDigit* digit);
+  /** Process one digit from raw data files.  Users should over this
+      to process each raw digit.  
+      @param digit Raw digit
+      @return  @c false on error   */
+  virtual Bool_t ProcessRawCalibDigit(AliFMDDigit* digit);
+  /** Process one reconstructed point.  Users should over this to
+      process each reconstructed point.  
+      @param point Reconstructed point 
+      @return  @c false on error   */
+  virtual Bool_t ProcessRecPoint(AliFMDRecPoint* point);
+  /** Process ESD data for the FMD.  Users should overload this to
+      deal with ESD data. 
+      @param d    Detector number (1-3)
+      @param r    Ring identifier ('I' or 'O')
+      @param s    Sector number (0-19, or 0-39)
+      @param t    Strip number (0-511, or 0-255)
+      @param eta  Psuedo-rapidity 
+      @param mult Psuedo-multiplicity 
+      @return  @c false on error  */
+  virtual Bool_t ProcessESD(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
+                           Float_t eta, Float_t mult);
+  /** Process User data for the FMD.  Users should overload this to
+      deal with ESD data. 
+      @param d    Detector number (1-3)
+      @param r    Ring identifier ('I' or 'O')
+      @param s    Sector number (0-19, or 0-39)
+      @param t    Strip number (0-511, or 0-255)
+      @param v    Value
+      @return  @c false on error  */
+  virtual Bool_t ProcessUser(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
+                            Float_t v);
+  /** Service function to make a logarithmic axis. 
+      @param n    Number of bins 
+      @param min  Minimum of axis 
+      @param max  Maximum of axis. 
+      @return An array with the bin boundaries. */
+  static TArrayF MakeLogScale(Int_t n, Double_t min, Double_t max);
 
-//____________________________________________________________________
-class AliFMDDigit;
-class AliFMDInputDigits : public AliFMDInput 
-{
-public:
-  AliFMDInputDigits(const char* file="galice.root")
-    : AliFMDInput(file) { AddLoad(kDigits); }
-  virtual Bool_t Event();
-  virtual Bool_t ProcessDigit(AliFMDDigit* digit) = 0;
-  ClassDef(AliFMDInputDigits, 0);
-};
+  /** Set the raw data input 
+      @param file File name - if empty, assume simulated raw. */
+  void SetRawFile(const char* file) { if (file) fRawFile = file; }
+     
+protected:
+  /** Copy ctor 
+      @param o Object to copy from  */
+  AliFMDInput(const AliFMDInput& o) 
+    : TNamed(o),
+      fGAliceFile(""),
+      fLoader(0),
+      fRun(0),
+      fStack(0),
+      fFMDLoader(0),
+      fReader(0),
+      fFMDReader(0),
+      fFMD(0),
+      fESD(0),
+      fESDEvent(0),
+      fTreeE(0),
+      fTreeH(0),
+      fTreeTR(0),
+      fTreeD(0),
+      fTreeS(0),
+      fTreeR(0),
+      fTreeA(0),
+      fChainE(0),
+      fArrayE(0),
+      fArrayH(0),
+      fArrayTR(0),
+      fArrayD(0),
+      fArrayS(0),
+      fArrayR(0),
+      fArrayA(0),
+      fHeader(0),
+      fGeoManager(0),
+      fTreeMask(0),
+      fRawFile(""),      
+      fIsInit(kFALSE),
+      fEventCount(0)
+  {}
+  /** Assignement operator 
+      @return  REference to this */
+  AliFMDInput& operator=(const AliFMDInput&) { return *this; }
+  /** 
+   * Get user supplued data
+   * 
+   * @param d Detector
+   * @param r Ring
+   * @param s Sector
+   * @param t Strip
+   * 
+   * @return Value
+   */
+  virtual Float_t GetSignal(UShort_t d, Char_t r, UShort_t s, UShort_t t);
 
-//____________________________________________________________________
-class AliFMDSDigit;
-class AliFMDInputSDigits : public AliFMDInput 
-{
-public:
-  AliFMDInputSDigits(const char* file="galice.root") 
-    : AliFMDInput(file) { AddLoad(kSDigits); }
-  virtual Bool_t Event();
-  virtual Bool_t ProcessSDigit(AliFMDSDigit* sdigit) = 0;
-  ClassDef(AliFMDInputSDigits, 0);
+  TString          fGAliceFile; // File name of gAlice file
+  AliRunLoader*    fLoader;     // Loader of FMD data 
+  AliRun*          fRun;        // Run information
+  AliStack*        fStack;      // Stack of particles 
+  AliLoader*       fFMDLoader;  // Loader of FMD data 
+  AliRawReader*    fReader;     // Raw data reader 
+  AliFMDRawReader* fFMDReader;  // FMD raw reader
+  AliFMD*          fFMD;        // FMD object
+  AliESDFMD*       fESD;        // FMD ESD data  
+  AliESDEvent*     fESDEvent;   // ESD Event object. 
+  TTree*           fTreeE;      // Header tree 
+  TTree*           fTreeH;      // Hits tree
+  TTree*           fTreeTR;     // Track Reference tree
+  TTree*           fTreeD;      // Digit tree 
+  TTree*           fTreeS;      // SDigit tree 
+  TTree*           fTreeR;      // RecPoint tree
+  TTree*           fTreeA;      // Raw data tree
+  TChain*          fChainE;     // Chain of ESD's
+  TClonesArray*    fArrayE;     // Event info array
+  TClonesArray*    fArrayH;     // Hit info array
+  TClonesArray*    fArrayTR;    // Hit info array
+  TClonesArray*    fArrayD;     // Digit info array
+  TClonesArray*    fArrayS;     // SDigit info array
+  TClonesArray*    fArrayR;     // Rec points info array
+  TClonesArray*    fArrayA;     // Raw data (digits) info array
+  AliHeader*       fHeader;     // Header 
+  TGeoManager*     fGeoManager; // Geometry manager
+  Int_t            fTreeMask;   // Which tree's to load
+  TString          fRawFile;    // Raw input file
+  Bool_t           fIsInit;     // Have we been initialized 
+  Int_t            fEventCount; // Event counter 
+  ClassDef(AliFMDInput,0)  //Hits for detector FMD
 };
 
-//____________________________________________________________________
-class AliFMDMultStrip;
-class AliFMDMultRegion;
-class AliFMDInputRecPoints : public AliFMDInput 
-{
-public:
-  AliFMDInputRecPoints(const char* file="galice.root") 
-    : AliFMDInput(file) { AddLoad(kRecPoints); }
-  virtual Bool_t Event();
-  virtual Bool_t ProcessStrip(AliFMDMultStrip* mult) = 0;
-  virtual Bool_t ProcessRegion(AliFMDMultRegion* mult) = 0;
-  ClassDef(AliFMDInputRecPoints, 0);
-};
+inline Bool_t AliFMDInput::ProcessHit(AliFMDHit*,TParticle*) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessTrackRef(AliTrackReference*, 
+                                          TParticle*) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessTrack(Int_t,TParticle*,
+                                       AliFMDHit*) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessDigit(AliFMDDigit*) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessSDigit(AliFMDSDigit*) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessRawDigit(AliFMDDigit*) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessRawCalibDigit(AliFMDDigit*) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessRecPoint(AliFMDRecPoint*) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessESD(UShort_t,Char_t,UShort_t,UShort_t,
+                                     Float_t,Float_t) { return kTRUE; }
+inline Bool_t AliFMDInput::ProcessUser(UShort_t,Char_t,UShort_t,UShort_t,
+                                      Float_t) { return kTRUE; }
+inline Float_t AliFMDInput::GetSignal(UShort_t, Char_t, UShort_t, UShort_t) { 
+  return 0.; }
+
 
 #endif
 //____________________________________________________________________