Skip to content
Snippets Groups Projects
CbmTrdModuleAbstract.h 5.40 KiB
/* Copyright (C) 2018-2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Florian Uhlig [committer], Alexandru Bercuci */

#ifndef CBMTRDMODULEABSTRACT_H
#define CBMTRDMODULEABSTRACT_H

#include "CbmTrdParModDigi.h"  // for CbmTrdParModDigi
#include "CbmTrdParModGeo.h"   // for CbmTrdParModGeo
#include "CbmTrdParSetAsic.h"  // for CbmTrdParSetAsic

#include <Rtypes.h>      // for THashConsistencyHolder, ClassDef
#include <RtypesCore.h>  // for Int_t, Double_t, Char_t, UChar_t, USho...
#include <TNamed.h>      // for TNamed

class CbmTrdParModGain;
class CbmTrdParModGas;

/**
  * \brief Abstract class for TRD module
  **/
class CbmTrdModuleAbstract : public TNamed {
public:
  enum eCbmTrdModuleDef
  {
    kTrd2d = 0  ///< toggle pad-plane type of the chamber
      ,
    kFasp = 1  ///< toggle FEE type for the module
  };
  /** \brief Default constructor.*/
  CbmTrdModuleAbstract();
  /** \brief Constructor with placement */
  CbmTrdModuleAbstract(Int_t mod, Int_t ly, Int_t rot);

  virtual ~CbmTrdModuleAbstract();

  /** \brief Shortcut getter size x/2 [cm] */
  virtual Double_t GetDx() const { return fGeoPar ? fGeoPar->GetDX() : 0.; }
  /** \brief Shortcut getter size y/2 [cm] */
  virtual Double_t GetDy() const { return fGeoPar ? fGeoPar->GetDY() : 0.; }
  /** \brief Shortcut getter size z/2 [cm] */
  virtual Double_t GetDz() const { return fGeoPar ? fGeoPar->GetDZ() : 0.; }
  /** \brief Shortcut getter ASICs number module wise */
  virtual Int_t GetNasics() const { return fAsicPar ? fAsicPar->GetNofAsics() : 0; }
  /** \brief Shortcut getter column size */
  virtual Int_t GetNcols() const { return fDigiPar ? fDigiPar->GetNofColumns() : 0; }
  /** \brief Shortcut getter row wise */
  virtual Int_t GetNrows() const { return fDigiPar ? fDigiPar->GetNofRows() : 0; }
  /** \brief Addressing ASIC on module based on id
   * \param[in] id module wise ASIC identifier
   * \return ASIC address within experiment
   */
  virtual Int_t GetAsicAddress(Int_t id) const { return fModAddress * 1000 + id; }
  /** \brief Addressing read-out pads on module based on (row,col)
   * \param[in] r global row id (not sector wise)
   * \param[in] c global column id
   * \return pad address within module
   */
  virtual Int_t GetPadAddress(Int_t r, Int_t c) const { return r * GetNcols() + c; }
  /** \brief Addressing read-out pads based on module address
   * \param[in] address pad address within module
   * \param[in] c on return global column id
   * \return global row address within module
   */
  virtual inline Int_t GetPadRowCol(Int_t address, Int_t& c) const;
  virtual const Char_t* GetPath() const { return fGeoPar ? fGeoPar->GetTitle() : ""; }
  /** \brief Inquire the FEE read-out type of the module
   * \return false for SPADIC and true for FASP
   */
  bool HasFaspFEE() const { return TESTBIT(fModConfig, eCbmTrdModuleDef::kFasp); }
  /** \brief Inquire the pad-plane type of the chamber
   * \return false for TRD-1D and true for TRD-2D
   */
  bool Has2dPadPlane() const { return TESTBIT(fModConfig, eCbmTrdModuleDef::kTrd2d); }

  virtual void LocalToMaster(Double_t in[3], Double_t out[3]);

  virtual void SetAsicPar(CbmTrdParSetAsic* p = nullptr) { fAsicPar = p; }
  virtual void SetChmbPar(const CbmTrdParModGas* p) { fChmbPar = p; }
  virtual void SetDigiPar(const CbmTrdParModDigi* p) { fDigiPar = p; }
  virtual void SetGainPar(const CbmTrdParModGain* p) { fGainPar = p; }
  virtual void SetGeoPar(const CbmTrdParModGeo* p) { fGeoPar = p; }

  /** \brief Define the read-out FEE type of the module
   * \param[in] set true for FASP and false [default] for SPADIC
   */
  void SetFEE(bool set = true)
  {
    set ? SETBIT(fModConfig, eCbmTrdModuleDef::kFasp) : CLRBIT(fModConfig, eCbmTrdModuleDef::kFasp);
  }
  /** \brief Define the pad-plane type of the chamber
   * \param[in] set true for TRD-2D and false [default] for TRD-1D
   */
  void SetPadPlane(bool set = true)
  {
    set ? SETBIT(fModConfig, eCbmTrdModuleDef::kTrd2d) : CLRBIT(fModConfig, eCbmTrdModuleDef::kTrd2d);
  }

protected:
  /** 8 bits bit map for module configuration
   * [0] - chamber's pad-plane type; 0 rectangular pads, 1 triangular pads, \see SetRO
   * [1] - chamber's FEE type; 0 SPADIC, 1 FASP, \see SetFEE
   * [2] -  
   * [3] -  
   * [4] -  
   * [5] -  
   * [6] -  
   * [7] -  
   */
  uint8_t fModConfig;
  // geometrical definitions imported from CbmTrdGeoHandler
  UShort_t fModAddress;  ///< unique identifier for current module
  Char_t fLayerId;       ///< layer identifier
  UChar_t fRotation;     ///< rotation angle for current module

  // calibration objects
  const CbmTrdParModDigi* fDigiPar;  ///< read-out description of module
  const CbmTrdParModGas* fChmbPar;   ///< detection description (HV, drift) of module
  CbmTrdParSetAsic* fAsicPar;        ///< the set of ASIC operating on the module (owned)
  const CbmTrdParModGain* fGainPar;  ///< Analog to digital conversion for module
  const CbmTrdParModGeo* fGeoPar;    ///< link to gGeometry for module

private:
  CbmTrdModuleAbstract(const CbmTrdModuleAbstract& ref);
  const CbmTrdModuleAbstract& operator=(const CbmTrdModuleAbstract& ref);

  ClassDef(CbmTrdModuleAbstract, 2)
};

//_______________________________________________________________________________
Int_t CbmTrdModuleAbstract::GetPadRowCol(Int_t address, Int_t& c) const
{
  if (!fDigiPar) {
    c = -1;
    return -1;
  }
  c = address % GetNcols();
  return address / GetNcols();
}
#endif