LCOV - code coverage report
Current view: top level - STEER/ESD - AliFMDMap.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 2 26 7.7 %
Date: 2016-06-14 17:26:59 Functions: 3 37 8.1 %

          Line data    Source code
       1             : #ifndef ALIFMDMAP_H
       2             : #define ALIFMDMAP_H
       3             : /* Copyright(c) 1998-2000, ALICE Experiment at CERN, All rights
       4             :  * reserved. 
       5             :  *
       6             :  * See cxx source for full Copyright notice                               
       7             :  */
       8             : #ifndef ROOT_TObject
       9             : # include <TObject.h>
      10             : #endif 
      11             : class TFile;
      12             : 
      13             : //____________________________________________________________________
      14             : /** @class AliFMDMap
      15             :     @brief Base class for caches of per-strip information.
      16             :     @ingroup FMD_data
      17             :     This is used to index a strip. Data stored depends on derived
      18             :     class.  */
      19           0 : class AliFMDMap : public TObject 
      20             : {
      21             : public:
      22             :   enum { 
      23             :     /** Default maximum detector number */
      24             :     kMaxDetectors = 3, 
      25             :     /** Default maximum number of rings */
      26             :     kMaxRings     = 2, 
      27             :     /** Default maximum number of sectors */
      28             :     kMaxSectors   = 40, 
      29             :     /** Default maximum number of strips */
      30             :     kMaxStrips    = 512
      31             :   };
      32             :   enum { 
      33             :     /** Number used for inner rings */
      34             :     kInner = 0, 
      35             :     /** Number used for outer rings */
      36             :     kOuter
      37             :   };
      38             :   enum { 
      39             :     /** Number of strips in outer rings */ 
      40             :     kNStripOuter = 256, 
      41             :     /** Number of strips in the inner rings */ 
      42             :     kNStripInner = 512
      43             :   };
      44             :   enum { 
      45             :     /** Number of sectors in the inner rings */ 
      46             :     kNSectorInner = 20, 
      47             :     /** Number of sectorts in the outer rings */ 
      48             :     kNSectorOuter = 40
      49             :  };
      50             :   enum { 
      51             :     /** Base index for inner rings */ 
      52             :     kBaseInner = 0, 
      53             :     /** Base index for outer rings */
      54             :     kBaseOuter = kNSectorInner * kNStripInner
      55             :   };
      56             :   enum { 
      57             :     /** Base for FMD1 index */ 
      58             :     kFMD1Base = 0, 
      59             :     /** Base for FMD2 index */ 
      60             :     kFMD2Base = kNSectorInner * kNStripInner, 
      61             :     /** Base for FMD3 index */ 
      62             :     kFMD3Base = (kBaseOuter + kNSectorOuter * kNStripOuter + kFMD2Base)
      63             :   };
      64             :   /** 
      65             :    * Class to do stuff on each element of a map in an efficient
      66             :    * way. 
      67             :    */ 
      68           0 :   class ForOne 
      69             :   {
      70             :   public:
      71             :   /** Destructor */
      72           0 :     virtual ~ForOne() { }
      73             :     /** 
      74             :      * Called for each element considered a floating point number 
      75             :      *
      76             :      * @param d   Detector number
      77             :      * @param r   Ring identifier 
      78             :      * @param s   Sector number
      79             :      * @param t   Strip number
      80             :      * @param v   Value (as a floating point number)
      81             :      * 
      82             :      * @return Should return @c true on success, @c false otherwise
      83             :      */
      84             :     virtual Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
      85             :                               Float_t v);
      86             :     /** 
      87             :      * Called for each element considered an integer
      88             :      *
      89             :      * @param d   Detector number
      90             :      * @param r   Ring identifier 
      91             :      * @param s   Sector number
      92             :      * @param t   Strip number
      93             :      * @param v   Value (as an integer)
      94             :      * 
      95             :      * @return Should return @c true on success, @c false otherwise
      96             :      */
      97             :     virtual Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
      98             :                               Int_t v);
      99             :     /** 
     100             :      * Called for each element considered an integer
     101             :      *
     102             :      * @param d   Detector number
     103             :      * @param r   Ring identifier 
     104             :      * @param s   Sector number
     105             :      * @param t   Strip number
     106             :      * @param v   Value (as an unsigned short integer)
     107             :      * 
     108             :      * @return Should return @c true on success, @c false otherwise
     109             :      */
     110             :     virtual Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
     111             :                               UShort_t v);
     112             :     /** 
     113             :      * Called for each element considered an integer
     114             :      *
     115             :      * @param d   Detector number
     116             :      * @param r   Ring identifier 
     117             :      * @param s   Sector number
     118             :      * @param t   Strip number
     119             :      * @param v   Value (as a boolean)
     120             :      * 
     121             :      * @return Should return @c true on success, @c false otherwise
     122             :      */
     123             :     virtual Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
     124             :                               Bool_t v);
     125             :   };
     126             :   /**
     127             :    * Class to print content of map 
     128             :    * 
     129             :    */
     130             :   class Printer : public ForOne
     131             :   {
     132             :   public:
     133             :     /** 
     134             :      * Constructor 
     135             :      * 
     136             :      * @param format Output format (argument to printf)
     137             :      */
     138             :     Printer(const char* format);
     139             :     /** 
     140             :      * Destructor 
     141             :      */
     142           0 :     virtual ~Printer() {}
     143             :     /** 
     144             :      * Print a floating point entry
     145             :      * 
     146             :      * @return true
     147             :      */
     148             :     Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t m);
     149             :     /** 
     150             :      * Print a integer entry
     151             :      * 
     152             :      * @return true
     153             :      */
     154             :     Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Int_t m);
     155             :     /** 
     156             :      * Print a integer entry
     157             :      * 
     158             :      * @return true
     159             :      */
     160             :     Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, UShort_t m);
     161             :     /** 
     162             :      * Print a boolean entry
     163             :      * 
     164             :      * @return true
     165             :      */
     166             :     Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Bool_t m);
     167             :   private:
     168             :     /** 
     169             :      * Copy constructor
     170             :      * 
     171             :      * @param p Object to copy from 
     172             :      */
     173             :     Printer(const Printer& p);
     174             :     /** 
     175             :      * Assignment operator
     176             :      * 
     177             :      * @return Reference to this 
     178             :      */
     179             :     Printer& operator=(const Printer&) { return *this; }
     180             :     /** 
     181             :      * Print headings 
     182             :      * 
     183             :      * @param d Current detector
     184             :      * @param r Current ring 
     185             :      * @param s Current sector
     186             :      * @param t Current strip
     187             :      */
     188             :     virtual void PrintHeadings(UShort_t d, Char_t r, UShort_t s, UShort_t t);
     189             :     /** Printf like format */
     190             :     const char* fFormat;
     191             :     /** Last detector */
     192             :     UShort_t    fOldD;
     193             :     /** Last ring */
     194             :     Char_t      fOldR;
     195             :     /** Last sector */
     196             :     UShort_t    fOldS;
     197             :   };
     198             : 
     199             :   /** 
     200             :    * Constructor 
     201             :    * 
     202             :    * @param maxDet  Maximum allowed detector number
     203             :    * @param maxRing Maximum number of rings
     204             :    * @param maxSec  Maximum number of sectors
     205             :    * @param maxStr  Maximum number of strips
     206             :    */
     207             :   AliFMDMap(UShort_t maxDet = 0, 
     208             :             UShort_t maxRing= 0, 
     209             :             UShort_t maxSec = 0, 
     210             :             UShort_t maxStr = 0);
     211             :   /** 
     212             :    * Copy constructor
     213             :    * 
     214             :    * @param other Object to construct from
     215             :    */  
     216             :   AliFMDMap(const AliFMDMap& other);
     217             :   /** Destructor */
     218          88 :   virtual ~AliFMDMap() {}
     219             :   /** @return  Maximum detector number */
     220           0 :   UShort_t MaxDetectors() const { return fMaxDetectors==0 ?   3 :fMaxDetectors;}
     221             :   /** @return  Maximum number of rings */
     222           0 :   UShort_t MaxRings()     const { return fMaxRings    ==0 ?   2 :fMaxRings; }
     223             :   /** @return  Maximum number of sectors */
     224           0 :   UShort_t MaxSectors()   const { return fMaxSectors  ==0 ?  40 :fMaxSectors; }
     225             :   /** @return  Maximum number of strip */
     226           0 :   UShort_t MaxStrips()    const { return fMaxStrips   ==0 ? 512 :fMaxStrips; }
     227             :   /** 
     228             :    * Calculate the detector coordinates for a given index number
     229             :    * 
     230             :    * @param idx  Index to find cooresponding detector coordinates for
     231             :    * @param det  On return, contain the detector number 
     232             :    * @param ring On return, contain the ring identifier
     233             :    * @param sec  On return, contain the sector number
     234             :    * @param str  On return, contain the strip number 
     235             :    */
     236             :   void CalcCoords(Int_t     idx, 
     237             :                   UShort_t& det, 
     238             :                   Char_t&   ring, 
     239             :                   UShort_t& sec, 
     240             :                   UShort_t& str) const;
     241             :   /** 
     242             :    * Calculate index and return 
     243             :    *
     244             :    * @param det  Detector number
     245             :    * @param ring Ring identifier 
     246             :    * @param sec  Sector number 
     247             :    * @param str  Strip number 
     248             :    * 
     249             :    * @return  Index (not checked) 
     250             :    */
     251             :   Int_t CalcIndex(UShort_t det, Char_t ring, 
     252             :                   UShort_t sec, UShort_t str) const;
     253             :   /** 
     254             :    * Calculate index and return 
     255             :    *
     256             :    * @param det  Detector number
     257             :    * @param ring Ring identifier 
     258             :    * @param sec  Sector number 
     259             :    * @param str  Strip number 
     260             :    * 
     261             :    * @return  Index or -1 if the coordinates are invalid
     262             :    */
     263             :   Int_t  CheckIndex(UShort_t det, Char_t ring, 
     264             :                     UShort_t sec, UShort_t str) const;
     265             :   /** 
     266             :    * Check if we need UShort_t hack 
     267             :    * 
     268             :    * @param file File this object was read from 
     269             :    */
     270             :   void CheckNeedUShort(TFile* file);
     271             :   /** 
     272             :    * Right multiplication operator
     273             :    * 
     274             :    * @param o Other map to multuiply with
     275             :    * 
     276             :    * @return Reference to this object
     277             :    */
     278             :   AliFMDMap& operator*=(const AliFMDMap& o);
     279             :   /** 
     280             :    * Right division operator
     281             :    * 
     282             :    * @param o Other map to divide with
     283             :    * 
     284             :    * @return Reference to this object
     285             :    */
     286             :   AliFMDMap& operator/=(const AliFMDMap& o);
     287             :   /** 
     288             :    * Right addision operator
     289             :    * 
     290             :    * @param o Other map to add to this
     291             :    * 
     292             :    * @return Reference to this object
     293             :    */
     294             :   AliFMDMap& operator+=(const AliFMDMap& o);
     295             :   /** 
     296             :    * Right subtraction operator
     297             :    * 
     298             :    * @param o Other map to substract from this
     299             :    * 
     300             :    * @return Reference to this object
     301             :    */
     302             :   AliFMDMap& operator-=(const AliFMDMap& o);
     303             :   /** 
     304             :    * For each element of the map, call the user defined overloaded
     305             :    * @c ForOne::operator() 
     306             :    * 
     307             :    * @param algo Algorithm to use
     308             :    * 
     309             :    * @return @c true on success, @c false if for any element, @c
     310             :    * algo(d,r,s,t,v) returns false. 
     311             :    */
     312             :   virtual Bool_t  ForEach(ForOne& algo) const;
     313             :   /** 
     314             :    * Get the total size of the internal array - that is the maximum
     315             :    * index possible plus one. 
     316             :    * 
     317             :    * @return maximum index, plus 1
     318             :    */
     319             :   virtual Int_t MaxIndex() const = 0;
     320             :   /** 
     321             :    * Print content of the map 
     322             :    * 
     323             :    * @param option If not null or empty string, print map 
     324             :    */
     325             :   virtual void Print(Option_t* option="") const;
     326             :   /** 
     327             :    * Virtal function to get the value at index @a idx as a floating
     328             :    * point number.  
     329             :    * 
     330             :    * @note 
     331             :    * Even if the map is not floating point valued the
     332             :    * sub-class can define this member function to allow non l-value
     333             :    * usage of the data in the map.   That is, if @c a is a floating
     334             :    * point valued map, and @c b is not, then if the class @c B of @c b 
     335             :    * implements this member function, expression like 
     336             :    *
     337             :    * @verbatim
     338             :    *   a += b;
     339             :    * @endverbatim 
     340             :    *
     341             :    * multiplies each element of @c a (floating points) with each
     342             :    * element of @c c according to the definition of @c B::AtAsFloat
     343             :    * (@c const version).   
     344             :    *
     345             :    * @param idx Index number
     346             :    * 
     347             :    * @return Value at index as a floating point number 
     348             :    */
     349             :   virtual Float_t AtAsFloat(Int_t idx) const;
     350             :   /** 
     351             :    * Virtal function to get the value at index @a idx as a floating
     352             :    * point number.  
     353             :    * 
     354             :    * This member function should only be defined if the map is a
     355             :    * floating point valued, and can be assigned floating point valued
     356             :    * values.  That is, if the map's elements are anything but @c
     357             :    * float then this member function should not be defined in the
     358             :    * derived class.  That will prevent expressions like 
     359             :    *
     360             :    * @code 
     361             :    *   a += b;
     362             :    * @endcode
     363             :    * 
     364             :    * where @c a is non-floating point valued, and @c b is floating
     365             :    * point valued (only).
     366             :    *
     367             :    * @param idx Index number
     368             :    * 
     369             :    * @return Value at index as a floating point number 
     370             :    */
     371             :   virtual Float_t& AtAsFloat(Int_t idx);
     372             :   /** 
     373             :    * Virtal function to get the value at index @a idx as an integer
     374             :    * 
     375             :    * @see Float_t AliFMDMap::AtAsFloat(Int_t) const
     376             :    *
     377             :    * @param idx Index number
     378             :    * 
     379             :    * @return Value at index as an integer
     380             :    */
     381             :   virtual Int_t   AtAsInt(Int_t idx) const;
     382             :   /** 
     383             :    * Virtal function to get the value at index @a idx as an integer
     384             :    * 
     385             :    * @see Float_t& AliFMDMap::AtAsFloat(Int_t)
     386             :    *
     387             :    * @param idx Index number
     388             :    * 
     389             :    * @return Value at index as an integer
     390             :    */
     391             :   virtual Int_t&   AtAsInt(Int_t idx);
     392             :   /** 
     393             :    * Virtal function to get the value at index @a idx as an boolean  
     394             :    * 
     395             :    * @see Float_t AliFMDMap::AtAsFloat(Int_t) const
     396             :    *
     397             :    * @param idx Index number
     398             :    * 
     399             :    * @return Value at index as a boolean
     400             :    */
     401             :   virtual UShort_t   AtAsUShort(Int_t idx) const;
     402             :   /** 
     403             :    * Virtal function to get the value at index @a idx as an boolean
     404             :    * 
     405             :    * @see Float_t& AliFMDMap::AtAsFloat(Int_t)
     406             :    *
     407             :    * @param idx Index number
     408             :    * 
     409             :    * @return Value at index as a boolean
     410             :    */
     411             :   virtual UShort_t&   AtAsUShort(Int_t idx);
     412             :   /** 
     413             :    * Virtal function to get the value at index @a idx as an unsigned
     414             :    * short integer  
     415             :    * 
     416             :    * @see Float_t AliFMDMap::AtAsFloat(Int_t) const
     417             :    *
     418             :    * @param idx Index number
     419             :    * 
     420             :    * @return Value at index as an unsigned short integer
     421             :    */
     422             :   virtual Bool_t   AtAsBool(Int_t idx) const;
     423             :   /** 
     424             :    * Virtal function to get the value at index @a idx as an unsigned
     425             :    * short integer
     426             :    * 
     427             :    * @see Float_t& AliFMDMap::AtAsFloat(Int_t)
     428             :    *
     429             :    * @param idx Index number
     430             :    * 
     431             :    * @return Value at index as an unsigned short integer
     432             :    */
     433             :   virtual Bool_t&   AtAsBool(Int_t idx);
     434             :   /**
     435             :    * Whether this map is floating point valued - that is, it can be
     436             :    * assigned floating point valued values.
     437             :    * 
     438             :    * @return @c true if the map is floating point valued 
     439             :    */
     440           0 :   virtual Bool_t IsFloat() const { return kFALSE; }
     441             :   /**
     442             :    * Whether this map is floating point valued or integer valued -
     443             :    * that is, it can be assigned integer valued values
     444             :    * 
     445             :    * @return @c true if the map is integer valued 
     446             :    */
     447           0 :   virtual Bool_t IsInt() const { return kFALSE; }
     448             :   /**
     449             :    * Whether this map is unsigned short integer valued - that is it
     450             :    * can be assigned unsigned short integer values
     451             :    * 
     452             :    * @return @c true if the map is unsigned short integer valued 
     453             :    */
     454           0 :   virtual Bool_t IsUShort() const { return kFALSE; }
     455             :   /**
     456             :    * Whether this map is boolean valued - that is it can be assigned
     457             :    * boolean values
     458             :    * 
     459             :    * @return @c true if the map is boolean valued 
     460             :    */
     461           0 :   virtual Bool_t IsBool() const { return kFALSE; }
     462             :   /** 
     463             :    * Get raw data pointer. 
     464             :    * 
     465             :    * @return Raw data pointer 
     466             :    */
     467             :   virtual void* Ptr() const = 0;
     468             :   enum {
     469             :     /** In case of version 2 of this class, this bit should be set. */
     470             :     kNeedUShort = 14
     471             :   };
     472             : protected:
     473             :   /** 
     474             :    * Calculate, check, and return index for strip.  If the index is
     475             :    * invalid, -1 is returned
     476             :    * 
     477             :    * This is only used when a full map is used, signalled by
     478             :    * fMaxDetector = 0
     479             :    * 
     480             :    * @param det   Detector number
     481             :    * @param ring  Ring identifier
     482             :    * @param sec   Sector number 
     483             :    * @param str   Strip number
     484             :    * 
     485             :    * @return  Unique index, or -1 in case of errors 
     486             :    */
     487             :   Int_t  Coords2Index(UShort_t det, Char_t ring, 
     488             :                   UShort_t sec, UShort_t str) const;
     489             :   /** 
     490             :    * Calculate, check, and return index for strip.  If the index is
     491             :    * invalid, -1 is returned
     492             :    * 
     493             :    * This is for back-ward compatibility and for when a map does not
     494             :    * cover all of the FMD strips
     495             :    * 
     496             :    * @param det   Detector number
     497             :    * @param ring  Ring identifier
     498             :    * @param sec   Sector number 
     499             :    * @param str   Strip number
     500             :    *
     501             :    * @return  Unique index, or -1 in case of errors 
     502             :    */
     503             :   Int_t  Coords2IndexOld(UShort_t det, Char_t ring, 
     504             :                          UShort_t sec, UShort_t str) const;
     505             :   /** 
     506             :    * Calculate the detector coordinates from an array index. 
     507             :    * 
     508             :    * This is used for backward compatibility and for when a map does not
     509             :    * cover all of the FMD strips
     510             :    * 
     511             :    * @param idx  Index to convert
     512             :    * @param det  Detector number on return
     513             :    * @param ring Ring identifier on return
     514             :    * @param sec  Sector number on return
     515             :    * @param str  Strip number on return
     516             :    */
     517             :   void Index2CoordsOld(Int_t     idx, 
     518             :                        UShort_t& det, 
     519             :                        Char_t&   ring, 
     520             :                        UShort_t& sec, 
     521             :                        UShort_t& str) const;
     522             :   /** 
     523             :    * Calculate the detector coordinates from an array index. 
     524             :    * 
     525             :    * This is used for a full map only, signalled by fMaxDetector = 0
     526             :    * 
     527             :    * @param idx  Index to convert
     528             :    * @param det  Detector number on return
     529             :    * @param ring Ring identifier on return
     530             :    * @param sec  Sector number on return
     531             :    * @param str  Strip number on return
     532             :    */
     533             :   void Index2Coords(Int_t     idx, 
     534             :                     UShort_t& det, 
     535             :                     Char_t&   ring, 
     536             :                     UShort_t& sec, 
     537             :                     UShort_t& str) const;
     538             :   UShort_t fMaxDetectors;             // Maximum # of detectors
     539             :   UShort_t fMaxRings;                 // Maximum # of rings
     540             :   UShort_t fMaxSectors;               // Maximum # of sectors
     541             :   UShort_t fMaxStrips;                // Maximum # of strips
     542             : 
     543         250 :   ClassDef(AliFMDMap, 4) // Cache of per strip information
     544             : };
     545             : 
     546             : inline Float_t
     547             : AliFMDMap::AtAsFloat(Int_t) const
     548             : {
     549           0 :   return 0;
     550             : }
     551             : inline Float_t&
     552             : AliFMDMap::AtAsFloat(Int_t)
     553             : {
     554             :   static Float_t d;
     555           0 :   return d;
     556             : }
     557             : inline Int_t
     558             : AliFMDMap::AtAsInt(Int_t) const
     559             : {
     560           0 :   return 0;
     561             : }
     562             : inline Int_t&
     563             : AliFMDMap::AtAsInt(Int_t)
     564             : {
     565             :   static Int_t d;
     566           0 :   return d;
     567             : }
     568             : inline UShort_t
     569             : AliFMDMap::AtAsUShort(Int_t) const
     570             : {
     571           0 :   return 0;
     572             : }
     573             : inline UShort_t&
     574             : AliFMDMap::AtAsUShort(Int_t)
     575             : {
     576             :   static UShort_t d;
     577           0 :   return d;
     578             : }
     579             : inline Bool_t
     580             : AliFMDMap::AtAsBool(Int_t) const
     581             : {
     582           0 :   return kFALSE;
     583             : }
     584             : inline Bool_t&
     585             : AliFMDMap::AtAsBool(Int_t)
     586             : {
     587             :   static Bool_t d;
     588           0 :   return d;
     589             : }
     590             : inline Bool_t
     591             : AliFMDMap::ForOne::operator()(UShort_t, Char_t, UShort_t, UShort_t, Float_t)
     592             : {
     593           0 :   return kTRUE;
     594             : }
     595             : inline Bool_t
     596             : AliFMDMap::ForOne::operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t)
     597             : {
     598           0 :   return kTRUE;
     599             : }
     600             : inline Bool_t
     601             : AliFMDMap::ForOne::operator()(UShort_t, Char_t, UShort_t, UShort_t, UShort_t)
     602             : {
     603           0 :   return kTRUE;
     604             : }
     605             : inline Bool_t
     606             : AliFMDMap::ForOne::operator()(UShort_t, Char_t, UShort_t, UShort_t, Bool_t)
     607             : {
     608           0 :   return kTRUE;
     609             : }
     610             : 
     611             : 
     612             : 
     613             : #endif 
     614             : //____________________________________________________________________
     615             : //
     616             : // Local Variables:
     617             : //   mode: C++
     618             : // End:
     619             : //
     620             : // EOF
     621             : //
     622             : 
     623             : 

Generated by: LCOV version 1.11