Skip to content
Snippets Groups Projects
THcScintillatorPlane.h 9.41 KiB
Newer Older
#ifndef ROOT_THcScintillatorPlane
#define ROOT_THcScintillatorPlane

//////////////////////////////////////////////////////////////////////////////
// THcScintillatorPlane
//
// A Hall C scintillator plane
//
// May want to later inherit from a THcPlane class if there are similarities
// in what a plane is shared with other detector types (shower, etc.)
//////////////////////////////////////////////////////////////////////////////

#include "THaSubDetector.h"
#include "TClonesArray.h"
Ak1508's avatar
Ak1508 committed
using namespace std;

class THaSignalHit;

class THcScintillatorPlane : public THaSubDetector {
 public:
  THcScintillatorPlane( const char* name, const char* description,
			Int_t planenum, THaDetectorBase* parent = NULL);
  virtual ~THcScintillatorPlane();

  virtual void    Clear( Option_t* opt="" );
  virtual Int_t Decode( const THaEvData& );
  virtual EStatus Init( const TDatime& run_time );
  virtual Int_t CoarseProcess( TClonesArray& tracks );
  virtual Int_t FineProcess( TClonesArray& tracks );
          Bool_t   IsTracking() { return kFALSE; }
  virtual Bool_t   IsPid()      { return kFALSE; }

  virtual Int_t ProcessHits(TClonesArray* rawhits, Int_t nexthit);
Stephen A. Wood's avatar
Stephen A. Wood committed
  virtual Int_t AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit);
  virtual void  CalculatePedestals( );
  Int_t GetNelem() {return fNelem;}; // return number of paddles in this plane
  Int_t GetNScinHits() {return fNScinHits;}; // Get # hits in plane (that pass min/max TDC cuts)
  Int_t GetNGoodHits() {return fNGoodHits;}; // Get # hits in plane (used in determining focal plane time)
  Double_t GetHitDistance() {return fHitDistance;}; // Distance between track and hit paddle
  Double_t GetTrackXPosition() {return fTrackXPosition;}; // Distance track X position at plane
  Double_t GetTrackYPosition() {return fTrackYPosition;}; // Distance track Y position at plane
  Double_t GetSpacing() {return fSpacing;}; // spacing of paddles
  Double_t GetSize() {return fSize;};    // paddle size
  Double_t GetHodoSlop() {return fHodoSlop;}; // hodo slop
  Double_t GetZpos() {return fZpos;};   //return the z position
  Double_t GetDzpos() {return fDzpos;};
  Double_t GetPosLeft() {return fPosLeft;};
  Double_t GetPosRight() {return fPosRight;};
  Double_t GetPosOffset() {return fPosOffset;};
  Double_t GetPosCenter(Int_t PaddleNo) {return fPosCenter[PaddleNo];}; // counting from zero!
  void SetFpTime(Double_t f) {fFptime=f;};
  void SetNGoodHits(Int_t ng) {fNGoodHits=ng;};
  void SetHitDistance(Double_t f) {fHitDistance=f;}; // Distance between track and hit paddle
  void SetTrackXPosition(Double_t f) {fTrackXPosition=f;}; // Distance track X position at plane
  void SetTrackYPosition(Double_t f) {fTrackYPosition=f;}; // Distance track Y position at plane
  TClonesArray* fParentHitList;

  TClonesArray* GetHits() { return fHodoHits;};
  TClonesArray* frPosAdcErrorFlag;
  TClonesArray* frNegAdcErrorFlag;

  TClonesArray* frPosTDCHits;
  TClonesArray* frNegTDCHits;
  TClonesArray* frPosADCHits;
  TClonesArray* frNegADCHits;
  TClonesArray* frPosADCSums;
  TClonesArray* frNegADCSums;
  TClonesArray* frPosADCPeds;
  TClonesArray* frNegADCPeds;
  TClonesArray* frPosTdcTimeRaw;
  TClonesArray* frPosAdcPedRaw;
  TClonesArray* frPosAdcPulseIntRaw;
  TClonesArray* frPosAdcPulseAmpRaw;
  TClonesArray* frPosAdcPulseTimeRaw;

  TClonesArray* frPosTdcTime;
  TClonesArray* frPosAdcPed;
  TClonesArray* frPosAdcPulseInt;
  TClonesArray* frPosAdcPulseAmp;
  TClonesArray* frPosAdcPulseTime;

  TClonesArray* frNegTdcTimeRaw;
  TClonesArray* frNegAdcPedRaw;
  TClonesArray* frNegAdcPulseIntRaw;
  TClonesArray* frNegAdcPulseAmpRaw;
  TClonesArray* frNegAdcPulseTimeRaw;

  TClonesArray* frNegTdcTime;
  TClonesArray* frNegAdcPed;
  TClonesArray* frNegAdcPulseInt;
  TClonesArray* frNegAdcPulseAmp;
  TClonesArray* frNegAdcPulseTime;
Ak1508's avatar
Ak1508 committed
  //Hodoscopes Multiplicities
  Int_t fTotNumPosAdcHits;
  Int_t fTotNumNegAdcHits;
  Int_t fTotNumAdcHits;

  Int_t fTotNumPosTdcHits;
  Int_t fTotNumNegTdcHits;
  Int_t fTotNumTdcHits;

  Int_t fTotNumGoodPosAdcHits;
  Int_t fTotNumGoodNegAdcHits;
  Int_t fTotNumGoodAdcHits;

  Int_t fTotNumGoodPosTdcHits;
  Int_t fTotNumGoodNegTdcHits;
  Int_t fTotNumGoodTdcHits;
  
  //Hodoscope "GOOD" Occupancies
  vector<Int_t>    fNumGoodPosAdcHits;
  vector<Int_t>    fNumGoodNegAdcHits;
  
  vector<Int_t>    fNumGoodPosTdcHits;
  vector<Int_t>    fNumGoodNegTdcHits;

  //Hodoscopoe "GOOD" ADC Ped/Amps/Ints/Time
  vector<Double_t>  fGoodPosAdcPed;
  vector<Double_t>  fGoodNegAdcPed;

  vector<Double_t>  fGoodPosAdcMult;
  vector<Double_t>  fGoodNegAdcMult;

  vector<Double_t>  fGoodPosAdcHitUsed;
  vector<Double_t>  fGoodNegAdcHitUsed;

Ak1508's avatar
Ak1508 committed
  vector<Double_t>  fGoodPosAdcPulseAmp;
  vector<Double_t>  fGoodNegAdcPulseAmp;

  vector<Double_t>  fGoodPosAdcPulseInt;
  vector<Double_t>  fGoodNegAdcPulseInt;

  vector<Double_t>  fGoodPosAdcPulseTime;
  vector<Double_t>  fGoodNegAdcPulseTime;
 
  vector<Double_t>  fGoodPosAdcTdcDiffTime;
  vector<Double_t>  fGoodNegAdcTdcDiffTime;
Ak1508's avatar
Ak1508 committed

  //Hodoscopoe "GOOD" TDC Variables
  vector<Double_t>  fGoodPosTdcTimeUnCorr;
Ak1508's avatar
Ak1508 committed
  vector<Double_t>  fGoodPosTdcTimeCorr;
  vector<Double_t>  fGoodPosTdcTimeTOFCorr;
  
  vector<Double_t>  fGoodNegTdcTimeUnCorr;
Ak1508's avatar
Ak1508 committed
  vector<Double_t>  fGoodNegTdcTimeCorr;
  vector<Double_t>  fGoodNegTdcTimeTOFCorr;
  
Yero1990's avatar
Yero1990 committed
  //Time Walk Corrected
  vector<Double_t>  fGoodPosTdcTimeWalkCorr;
  vector<Double_t>  fGoodNegTdcTimeWalkCorr;
  vector<Double_t>  fGoodDiffDistTrack;
Ak1508's avatar
Ak1508 committed

  Double_t fHitDistance;
  Double_t fTrackXPosition;
  Double_t fTrackYPosition;
Stephen A. Wood's avatar
Stephen A. Wood committed
  Int_t fPlaneNum;		/* Which plane am I 1-4 */
  UInt_t fTotPlanes;            /* so we can read variables that are not indexed by plane id */
  UInt_t fNelem;		/* Need since we don't inherit from
Stephen A. Wood's avatar
Stephen A. Wood committed
				 detector base class */
  Int_t fNScinHits;                 /* number of hits in plane (that pass min/max TDC cuts) */
  Int_t fNGoodHits;                 /* number of hits in plane (used in determining focal plane time) */
  Int_t fADCMode;		// 0: standard, 1: use FADC ped, 2: integrate sample
                                // 3: integrate sample, subract dynamic pedestal
  static const Int_t kADCStandard=0;
  static const Int_t kADCDynamicPedestal=1;
  static const Int_t kADCSampleIntegral=2;
  static const Int_t kADCSampIntDynPed=3;
  Double_t fADCPedScaleFactor;	// Multiply dynamic pedestal by this before subtracting
  Int_t fADCDiagCut;		// Cut for ADC in hit maps.  Defaults to 50
  Int_t fTdcOffset;		/* Overall offset to raw tdc */
  Double_t fAdcTdcOffset;	/* Overall offset to raw adc times */
Gabriel Niculescu's avatar
Gabriel Niculescu committed
  Int_t fMaxHits;               /* maximum number of hits to be considered - useful for dimensioning arrays */
  Double_t fSpacing;            /* paddle spacing */
  Double_t fSize;               /* paddle size */
  Double_t fDzpos;
  Double_t fHodoSlop;           /* max allowed slop for this plane */
  Double_t fPosLeft;            /* NOTE: "left" = "bottom" for a Y scintillator */
  Double_t fPosRight;           /* NOTE: "right" = "top" for a Y scintillator */
  Double_t *fPosCenter;         /* array with centers for all scintillators in the plane */
  Double_t fScinTdcMin;
  Double_t fScinTdcMax;
  Double_t fStartTimeCenter;
  Double_t fStartTimeSlop;
  Double_t fScinTdcToTime;
  Double_t fTofTolerance;
  Double_t fBetaNominal;
  Double_t *fHodoPosMinPh;	// Minimum pulse height per paddle for this plane
  Double_t *fHodoNegMinPh;	// Minimum pulse height per paddle for this plane
  Double_t *fHodoPosPhcCoeff;    // Pulse height to time coefficient per paddle for this plane
  Double_t *fHodoNegPhcCoeff;    // Pulse height to time coefficient per paddlefor this plane
  Double_t *fHodoPosTimeOffset;
  Double_t *fHodoNegTimeOffset;
  Int_t fTofUsingInvAdc;
  Double_t *fHodoVelLight;
  Double_t *fHodoPosInvAdcOffset;
  Double_t *fHodoNegInvAdcOffset;
  Double_t *fHodoPosAdcTimeWindowMin;    
  Double_t *fHodoPosAdcTimeWindowMax;
  Double_t *fHodoNegAdcTimeWindowMin;    
  Double_t *fHodoNegAdcTimeWindowMax;
  Double_t *fHodoPosInvAdcLinear;
  Double_t *fHodoNegInvAdcLinear;
  Double_t *fHodoPosInvAdcAdc;
  Double_t *fHodoNegInvAdcAdc;
Yero1990's avatar
Yero1990 committed
  //Time-Walk Parameters
  Double_t* fHodoVelFit;
  Double_t* fHodoCableFit;
  Double_t* fHodo_LCoeff;
  Double_t* fHodoPos_c1;
  Double_t* fHodoNeg_c1;
  Double_t* fHodoPos_c2;
  Double_t* fHodoNeg_c2;
  Double_t  fTdc_Thrs;  

  Double_t tw_corr_pos;
  Double_t tw_corr_neg;

  Double_t *fHodoSigma;
  Double_t fTolerance; /* need this for Focal Plane Time estimation */
Stephen A. Wood's avatar
Stephen A. Wood committed
  Int_t fNPedestalEvents;	/* Number of pedestal events */
  Int_t fMinPeds;		/* Only analyze/update if num events > */
  Int_t *fPosPedSum;		/* Accumulators for pedestals */
  Int_t *fPosPedSum2;
  Int_t *fPosPedLimit;
  Int_t *fPosPedCount;
  Int_t *fNegPedSum;
  Int_t *fNegPedSum2;
  Int_t *fNegPedLimit;
  Int_t *fNegPedCount;

  Double_t *fPosPed;
  Double_t *fPosSig;
  Double_t *fPosThresh;
  Double_t *fNegPed;
  Double_t *fNegSig;
  Double_t *fNegThresh;
Gabriel Niculescu's avatar
Gabriel Niculescu committed

  //
  Int_t fNScinGoodHits; // number of hits for which both ends of the paddle fired in time!
  Double_t fpTime; // the original code only has one fpTime per plane!
Gabriel Niculescu's avatar
Gabriel Niculescu committed

  virtual Int_t  ReadDatabase( const TDatime& date );
  virtual Int_t  DefineVariables( EMode mode = kDefine );
Stephen A. Wood's avatar
Stephen A. Wood committed
  virtual void  InitializePedestals( );
  ClassDef(THcScintillatorPlane,0); // Scintillator bars in a plane