]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliFMDMap.h
Using the event range in the selectors mode as well. To be used in CAF reco in order...
[u/mrichter/AliRoot.git] / STEER / AliFMDMap.h
index 6ffdc68dc5b6685afc955aeb4d46e817a516970b..f25f736326ac3b3738459c09e859b55961381e26 100755 (executable)
@@ -29,59 +29,504 @@ public:
     /** Default maximum number of strips */
     kMaxStrips    = 512
   };
-  /** Constructor 
-      @param maxDet  Maximum allowed detector number
-      @param maxRing Maximum number of rings
-      @param maxSec  Maximum number of sectors
-      @param maxStr  Maximum number of strips
-      @return  */
-  AliFMDMap(UShort_t maxDet = kMaxDetectors, 
-           UShort_t maxRing= kMaxRings, 
-           UShort_t maxSec = kMaxSectors, 
-           UShort_t maxStr = kMaxStrips);
+  enum { 
+    /** Number used for inner rings */
+    kInner = 0, 
+    /** Number used for outer rings */
+    kOuter
+  };
+  enum { 
+    /** Number of strips in outer rings */ 
+    kNStripOuter = 256, 
+    /** Number of strips in the inner rings */ 
+    kNStripInner = 512
+  };
+  enum { 
+    /** Number of sectors in the inner rings */ 
+    kNSectorInner = 20, 
+    /** Number of sectorts in the outer rings */ 
+    kNSectorOuter = 40
+ };
+  enum { 
+    /** Base index for inner rings */ 
+    kBaseInner = 0, 
+    /** Base index for outer rings */
+    kBaseOuter = kNSectorInner * kNStripInner
+  };
+  enum { 
+    /** Base for FMD1 index */ 
+    kFMD1Base = 0, 
+    /** Base for FMD2 index */ 
+    kFMD2Base = kNSectorInner * kNStripInner, 
+    /** Base for FMD3 index */ 
+    kFMD3Base = (kBaseOuter + kNSectorOuter * kNStripOuter + kFMD2Base)
+  };
+  /** 
+   * Class to do stuff on each element of a map in an efficient
+   * way. 
+   */ 
+  class ForOne 
+  {
+  public:
+  /** Destructor */
+    virtual ~ForOne() { }
+    /** 
+     * Called for each element considered a floating point number 
+     *
+     * @param d   Detector number
+     * @param r   Ring identifier 
+     * @param s   Sector number
+     * @param t   Strip number
+     * @param v   Value (as a floating point number)
+     * 
+     * @return Should return @c true on success, @c false otherwise
+     */
+    virtual Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
+                             Float_t v);
+    /** 
+     * Called for each element considered an integer
+     *
+     * @param d   Detector number
+     * @param r   Ring identifier 
+     * @param s   Sector number
+     * @param t   Strip number
+     * @param v   Value (as an integer)
+     * 
+     * @return Should return @c true on success, @c false otherwise
+     */
+    virtual Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
+                             Int_t v);
+    /** 
+     * Called for each element considered an integer
+     *
+     * @param d   Detector number
+     * @param r   Ring identifier 
+     * @param s   Sector number
+     * @param t   Strip number
+     * @param v   Value (as an unsigned short integer)
+     * 
+     * @return Should return @c true on success, @c false otherwise
+     */
+    virtual Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
+                             UShort_t v);
+    /** 
+     * Called for each element considered an integer
+     *
+     * @param d   Detector number
+     * @param r   Ring identifier 
+     * @param s   Sector number
+     * @param t   Strip number
+     * @param v   Value (as a boolean)
+     * 
+     * @return Should return @c true on success, @c false otherwise
+     */
+    virtual Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
+                             Bool_t v);
+  };
+
+  /** 
+   * Constructor 
+   * 
+   * @param maxDet  Maximum allowed detector number
+   * @param maxRing Maximum number of rings
+   * @param maxSec  Maximum number of sectors
+   * @param maxStr  Maximum number of strips
+   */
+  AliFMDMap(UShort_t maxDet = 0, 
+           UShort_t maxRing= 0, 
+           UShort_t maxSec = 0, 
+           UShort_t maxStr = 0);
+  /** 
+   * Copy constructor
+   * 
+   * @param other Object to construct from
+   */  
+  AliFMDMap(const AliFMDMap& other);
   /** Destructor */
   virtual ~AliFMDMap() {}
   /** @return  Maximum detector number */
-  UShort_t MaxDetectors() const { return fMaxDetectors}
+  UShort_t MaxDetectors() const { return fMaxDetectors==0 ?   3 :fMaxDetectors;}
   /** @return  Maximum number of rings */
-  UShort_t MaxRings()     const { return fMaxRings; }
+  UShort_t MaxRings()     const { return fMaxRings    ==0 ?   2 :fMaxRings; }
   /** @return  Maximum number of sectors */
-  UShort_t MaxSectors()   const { return fMaxSectors; }
+  UShort_t MaxSectors()   const { return fMaxSectors  ==0 ?  40 :fMaxSectors; }
   /** @return  Maximum number of strip */
-  UShort_t MaxStrips()    const { return fMaxStrips; }
-  /** Calculate, check, and return index for strip.  If the index is
-      invalid, -1 is returned
-      @param det   Detector number
-      @param ring  Ring identifier
-      @param sec   Sector number 
-      @param str   Strip number
-      @return  Unique index, or -1 in case of errors */
+  UShort_t MaxStrips()    const { return fMaxStrips   ==0 ? 512 :fMaxStrips; }
+  /** 
+   * Calculate the detector coordinates for a given index number
+   * 
+   * @param idx  Index to find cooresponding detector coordinates for
+   * @param det  On return, contain the detector number 
+   * @param ring On return, contain the ring identifier
+   * @param sec  On return, contain the sector number
+   * @param str  On return, contain the strip number 
+   */
+  void CalcCoords(Int_t     idx, 
+                 UShort_t& det, 
+                 Char_t&   ring, 
+                 UShort_t& sec, 
+                 UShort_t& str) const;
+  /** 
+   * Calculate index and return 
+   *
+   * @param det  Detector number
+   * @param ring Ring identifier 
+   * @param sec  Sector number 
+   * @param str  Strip number 
+   * 
+   * @return  Index (not checked) 
+   */
+  Int_t CalcIndex(UShort_t det, Char_t ring, 
+                 UShort_t sec, UShort_t str) const;
+  /** 
+   * Calculate index and return 
+   *
+   * @param det  Detector number
+   * @param ring Ring identifier 
+   * @param sec  Sector number 
+   * @param str  Strip number 
+   * 
+   * @return  Index or -1 if the coordinates are invalid
+   */
   Int_t  CheckIndex(UShort_t det, Char_t ring, 
                    UShort_t sec, UShort_t str) const;
-  /** Check if we need UShort_t hack 
-      @param file File this object was read from */
+  /** 
+   * Check if we need UShort_t hack 
+   * 
+   * @param file File this object was read from 
+   */
   void CheckNeedUShort(TFile* file);
+  /** 
+   * Right multiplication operator
+   * 
+   * @param o Other map to multuiply with
+   * 
+   * @return Reference to this object
+   */
+  AliFMDMap& operator*=(const AliFMDMap& o);
+  /** 
+   * Right division operator
+   * 
+   * @param o Other map to divide with
+   * 
+   * @return Reference to this object
+   */
+  AliFMDMap& operator/=(const AliFMDMap& o);
+  /** 
+   * Right addision operator
+   * 
+   * @param o Other map to add to this
+   * 
+   * @return Reference to this object
+   */
+  AliFMDMap& operator+=(const AliFMDMap& o);
+  /** 
+   * Right subtraction operator
+   * 
+   * @param o Other map to substract from this
+   * 
+   * @return Reference to this object
+   */
+  AliFMDMap& operator-=(const AliFMDMap& o);
+  /** 
+   * For each element of the map, call the user defined overloaded
+   * @c ForOne::operator() 
+   * 
+   * @param algo Algorithm to use
+   * 
+   * @return @c true on success, @c false if for any element, @c
+   * algo(d,r,s,t,v) returns false. 
+   */
+  virtual Bool_t  ForEach(ForOne& algo) const;
+  /** 
+   * Get the total size of the internal array - that is the maximum
+   * index possible plus one. 
+   * 
+   * @return maximum index, plus 1
+   */
+  virtual Int_t MaxIndex() const = 0;
+  /** 
+   * Virtal function to get the value at index @a idx as a floating
+   * point number.  
+   * 
+   * @note 
+   * Even if the map is not floating point valued the
+   * sub-class can define this member function to allow non l-value
+   * usage of the data in the map.   That is, if @c a is a floating
+   * point valued map, and @c b is not, then if the class @c B of @c b 
+   * implements this member function, expression like 
+   *
+   * @verbatim
+   *   a += b;
+   * @endverbatim 
+   *
+   * multiplies each element of @c a (floating points) with each
+   * element of @c c according to the definition of @c B::AtAsFloat
+   * (@c const version).   
+   *
+   * @param idx Index number
+   * 
+   * @return Value at index as a floating point number 
+   */
+  virtual Float_t AtAsFloat(Int_t idx) const;
+  /** 
+   * Virtal function to get the value at index @a idx as a floating
+   * point number.  
+   * 
+   * This member function should only be defined if the map is a
+   * floating point valued, and can be assigned floating point valued
+   * values.  That is, if the map's elements are anything but @c
+   * float then this member function should not be defined in the
+   * derived class.  That will prevent expressions like 
+   *
+   * @code 
+   *   a += b;
+   * @endcode
+   * 
+   * where @c a is non-floating point valued, and @c b is floating
+   * point valued (only).
+   *
+   * @param idx Index number
+   * 
+   * @return Value at index as a floating point number 
+   */
+  virtual Float_t& AtAsFloat(Int_t idx);
+  /** 
+   * Virtal function to get the value at index @a idx as an integer
+   * 
+   * @see Float_t AliFMDMap::AtAsFloat(Int_t) const
+   *
+   * @param idx Index number
+   * 
+   * @return Value at index as an integer
+   */
+  virtual Int_t   AtAsInt(Int_t idx) const;
+  /** 
+   * Virtal function to get the value at index @a idx as an integer
+   * 
+   * @see Float_t& AliFMDMap::AtAsFloat(Int_t)
+   *
+   * @param idx Index number
+   * 
+   * @return Value at index as an integer
+   */
+  virtual Int_t&   AtAsInt(Int_t idx);
+  /** 
+   * Virtal function to get the value at index @a idx as an boolean  
+   * 
+   * @see Float_t AliFMDMap::AtAsFloat(Int_t) const
+   *
+   * @param idx Index number
+   * 
+   * @return Value at index as a boolean
+   */
+  virtual UShort_t   AtAsUShort(Int_t idx) const;
+  /** 
+   * Virtal function to get the value at index @a idx as an boolean
+   * 
+   * @see Float_t& AliFMDMap::AtAsFloat(Int_t)
+   *
+   * @param idx Index number
+   * 
+   * @return Value at index as a boolean
+   */
+  virtual UShort_t&   AtAsUShort(Int_t idx);
+  /** 
+   * Virtal function to get the value at index @a idx as an unsigned
+   * short integer  
+   * 
+   * @see Float_t AliFMDMap::AtAsFloat(Int_t) const
+   *
+   * @param idx Index number
+   * 
+   * @return Value at index as an unsigned short integer
+   */
+  virtual Bool_t   AtAsBool(Int_t idx) const;
+  /** 
+   * Virtal function to get the value at index @a idx as an unsigned
+   * short integer
+   * 
+   * @see Float_t& AliFMDMap::AtAsFloat(Int_t)
+   *
+   * @param idx Index number
+   * 
+   * @return Value at index as an unsigned short integer
+   */
+  virtual Bool_t&   AtAsBool(Int_t idx);
+  /**
+   * Whether this map is floating point valued - that is, it can be
+   * assigned floating point valued values.
+   * 
+   * @return @c true if the map is floating point valued 
+   */
+  virtual Bool_t IsFloat() const { return kFALSE; }
+  /**
+   * Whether this map is floating point valued or integer valued -
+   * that is, it can be assigned integer valued values
+   * 
+   * @return @c true if the map is integer valued 
+   */
+  virtual Bool_t IsInt() const { return kFALSE; }
+  /**
+   * Whether this map is unsigned short integer valued - that is it
+   * can be assigned unsigned short integer values
+   * 
+   * @return @c true if the map is unsigned short integer valued 
+   */
+  virtual Bool_t IsUShort() const { return kFALSE; }
+  /**
+   * Whether this map is boolean valued - that is it can be assigned
+   * boolean values
+   * 
+   * @return @c true if the map is boolean valued 
+   */
+  virtual Bool_t IsBool() const { return kFALSE; }
+
   enum {
     /** In case of version 2 of this class, this bit should be set. */
     kNeedUShort = 14
   };
 protected:
-  /** Calculate index and return 
-      @param det  Detector number
-      @param ring Ring identifier 
-      @param sec  Sector number 
-      @param str  Strip number 
-      @return  Index (not checked) */
-  Int_t CalcIndex(UShort_t det, Char_t ring, 
+  /** 
+   * Calculate, check, and return index for strip.  If the index is
+   * invalid, -1 is returned
+   * 
+   * This is only used when a full map is used, signalled by
+   * fMaxDetector = 0
+   * 
+   * @param det   Detector number
+   * @param ring  Ring identifier
+   * @param sec   Sector number 
+   * @param str   Strip number
+   * 
+   * @return  Unique index, or -1 in case of errors 
+   */
+  Int_t  Coords2Index(UShort_t det, Char_t ring, 
                  UShort_t sec, UShort_t str) const;
+  /** 
+   * Calculate, check, and return index for strip.  If the index is
+   * invalid, -1 is returned
+   * 
+   * This is for back-ward compatibility and for when a map does not
+   * cover all of the FMD strips
+   * 
+   * @param det   Detector number
+   * @param ring  Ring identifier
+   * @param sec   Sector number 
+   * @param str   Strip number
+   *
+   * @return  Unique index, or -1 in case of errors 
+   */
+  Int_t  Coords2IndexOld(UShort_t det, Char_t ring, 
+                        UShort_t sec, UShort_t str) const;
+  /** 
+   * Calculate the detector coordinates from an array index. 
+   * 
+   * This is used for backward compatibility and for when a map does not
+   * cover all of the FMD strips
+   * 
+   * @param idx  Index to convert
+   * @param det  Detector number on return
+   * @param ring Ring identifier on return
+   * @param sec  Sector number on return
+   * @param str  Strip number on return
+   */
+  void Index2CoordsOld(Int_t     idx, 
+                      UShort_t& det, 
+                      Char_t&   ring, 
+                      UShort_t& sec, 
+                      UShort_t& str) const;
+  /** 
+   * Calculate the detector coordinates from an array index. 
+   * 
+   * This is used for a full map only, signalled by fMaxDetector = 0
+   * 
+   * @param idx  Index to convert
+   * @param det  Detector number on return
+   * @param ring Ring identifier on return
+   * @param sec  Sector number on return
+   * @param str  Strip number on return
+   */
+  void Index2Coords(Int_t     idx, 
+                   UShort_t& det, 
+                   Char_t&   ring, 
+                   UShort_t& sec, 
+                   UShort_t& str) const;
   UShort_t fMaxDetectors;             // Maximum # of detectors
   UShort_t fMaxRings;                 // Maximum # of rings
   UShort_t fMaxSectors;               // Maximum # of sectors
   UShort_t fMaxStrips;                // Maximum # of strips
 
-  ClassDef(AliFMDMap, 3) // Cache of per strip information
+  ClassDef(AliFMDMap, 4) // Cache of per strip information
 };
 
+inline Float_t
+AliFMDMap::AtAsFloat(Int_t) const
+{
+  return 0;
+}
+inline Float_t&
+AliFMDMap::AtAsFloat(Int_t)
+{
+  static Float_t d;
+  return d;
+}
+inline Int_t
+AliFMDMap::AtAsInt(Int_t) const
+{
+  return 0;
+}
+inline Int_t&
+AliFMDMap::AtAsInt(Int_t)
+{
+  static Int_t d;
+  return d;
+}
+inline UShort_t
+AliFMDMap::AtAsUShort(Int_t) const
+{
+  return 0;
+}
+inline UShort_t&
+AliFMDMap::AtAsUShort(Int_t)
+{
+  static UShort_t d;
+  return d;
+}
+inline Bool_t
+AliFMDMap::AtAsBool(Int_t) const
+{
+  return kFALSE;
+}
+inline Bool_t&
+AliFMDMap::AtAsBool(Int_t)
+{
+  static Bool_t d;
+  return d;
+}
+inline Bool_t
+AliFMDMap::ForOne::operator()(UShort_t, Char_t, UShort_t, UShort_t, Float_t)
+{
+  return kTRUE;
+}
+inline Bool_t
+AliFMDMap::ForOne::operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t)
+{
+  return kTRUE;
+}
+inline Bool_t
+AliFMDMap::ForOne::operator()(UShort_t, Char_t, UShort_t, UShort_t, UShort_t)
+{
+  return kTRUE;
+}
+inline Bool_t
+AliFMDMap::ForOne::operator()(UShort_t, Char_t, UShort_t, UShort_t, Bool_t)
+{
+  return kTRUE;
+}
+
+
+
 #endif 
 //____________________________________________________________________
 //