Skip to content
Snippets Groups Projects
  • Carlos Yero's avatar
    4fe33ab7
    Updates to THcShowerPlane · 4fe33ab7
    Carlos Yero authored
      Add "Good" variables to calorimeter class
         occupancies and multiplicities
         required to pass time and threshold cut
      Change some variables from arrays to vectors
      Modify how thresholds are calculated
      Remove obsolete variables: posadchits, negadchits
      Add flash adc debug flag
      Correctly delete pointers in destructor
    4fe33ab7
    History
    Updates to THcShowerPlane
    Carlos Yero authored
      Add "Good" variables to calorimeter class
         occupancies and multiplicities
         required to pass time and threshold cut
      Change some variables from arrays to vectors
      Modify how thresholds are calculated
      Remove obsolete variables: posadchits, negadchits
      Add flash adc debug flag
      Correctly delete pointers in destructor
THcShowerArray.h 5.96 KiB
#ifndef ROOT_THcShowerArray
#define ROOT_THcShowerArray

//#define HITPIC 1
#ifdef HITPIC
#define NPERLINE 5
#endif

//////////////////////////////////////////////////////////////////////////////
//
// THcShowerArray
//
// A Hall C Fly's Eye Shower Array
//
// Subdetector for the fly's eye part of the SHMS shower counter.
//
//////////////////////////////////////////////////////////////////////////////

#include "THaSubDetector.h"
#include "THaTrack.h"
#include "TClonesArray.h"
#include "THcShowerHit.h"

#include <iostream>

#include <fstream>

class THaEvData;
class THaSignalHit;

class THcShowerArray : public THaSubDetector {

public:
  THcShowerArray( const char* name, const char* description,
		  Int_t planenum, THaDetectorBase* parent = NULL);
  virtual ~THcShowerArray();

  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);
  virtual Int_t CoarseProcessHits();
  virtual Int_t AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit);
  virtual void  CalculatePedestals( );
  virtual void  InitializePedestals( );
  virtual void  FillADC_DynamicPedestal( );
  virtual void  FillADC_SampleIntegral( );
  virtual void  FillADC_SampIntDynPed( );
  virtual void  FillADC_Standard( );
 
  // Cluster to track association method.
  Int_t MatchCluster(THaTrack*, Double_t&, Double_t&);

  // Get total energy deposited in the cluster matched to the given
  // spectrometer Track.

  Float_t GetShEnergy(THaTrack*);
  Double_t GetClMaxEnergyBlock() {
    return fMatchClMaxEnergyBlock;
  };
  Double_t GetClSize() {
    return fClustSize;
  };
  Double_t GetClX() {
    return fMatchClX;
  };
  Double_t GetClY() {
    return fMatchClY;
  };

  //  Double_t fSpacing;   not used

  //  TClonesArray* fParentHitList; not used

  Double_t GetEarray() {
    return fEarray;
  };

  // Fiducial volume limits.
  Double_t fvXmin();
  Double_t fvYmax();
  Double_t fvXmax();
  Double_t fvYmin();
  Double_t clMaxEnergyBlock(THcShowerCluster* cluster);

protected:

#ifdef HITPIC
  char **hitpic;
  Int_t piccolumn;
#endif


 


  //counting variables
  Int_t fTotNumAdcHits;              // Total number of ADC hits
  Int_t fTotNumGoodAdcHits;          // Total number of good ADC hits (pass threshold)

  vector<Int_t>         fNumGoodAdcHits;          // shower good occupancy
  vector<Double_t>      fGoodAdcPulseIntRaw;      // [fNelem] Good Raw ADC pulse Integrals of blocks
  
  vector<Double_t>      fGoodAdcPed;             // [fNelem] Event by event (FADC) good pulse pedestals
  vector<Double_t>      fGoodAdcPulseInt;       // [fNelem] good pedestal subtracted pulse integrals
  vector<Double_t>      fGoodAdcPulseAmp;
  vector<Double_t>      fGoodAdcPulseTime;

  vector<Double_t>      fE;                    //[fNelem] energy deposition in shower blocks

  Int_t* fBlock_ClusterID;              // [fNelem] Cluster ID of the block -1 then not in a cluster
  Double_t  fEarray;                          // Total Energy deposition in the array.
  TClonesArray* fADCHits;	// List of ADC hits

  // Parameters

  UInt_t fNRows;
  UInt_t fNColumns;
  Double_t fXFront;              // Front position X
  Double_t fYFront;              // Front position Y
  Double_t fZFront;              // Front position Z, from FP
  Double_t fXStep;               // distance btw centers of blocks along X
  Double_t fYStep;               // distance btw centers of blocks along Y
  Double_t fZSize;               // Block size along Z
  Double_t** fXPos;              // block X coordinates
  Double_t** fYPos;              // block Y coordinates
  Double_t** fZPos;              // block Z coordinates

  Int_t fUsingFADC;		// != 0 if using FADC in sample mode
   Int_t fADCMode;		//    
   //  1 == Use the pulse int - pulse ped
    //  2 == Use the sample integral - known ped
    //  3 == Use the sample integral - sample ped
 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 fAdcTimeWindowMin ;
  Double_t fAdcTimeWindowMax ;
  Double_t fAdcThreshold ;

  Int_t fDebugAdc;
  Int_t fPedSampLow;		// Sample range for
  Int_t fPedSampHigh;		// dynamic pedestal
  Int_t fDataSampLow;		// Sample range for
  Int_t fDataSampHigh;		// sample integration

  Int_t fLayerNum;		// 2 for SHMS

  // Accumulators for pedestals go here

  Int_t fNPedestalEvents;	/* Pedestal event counter */
  Int_t fMinPeds;		/* Only analyze/update if num events > */

  // 2D arrays

  Int_t *fPedSum;		/* Accumulators for pedestals */
  Int_t *fPedSum2;
  Int_t *fPedLimit;          // Analyze pedestal if ADC signal < PedLimit
  Int_t *fPedCount;          // [fNelem] counter of pedestal analysis

  Float_t *fPed;             // [fNelem] pedestal positions
  Float_t *fSig;             // [fNelem] pedestal rms-s
  Float_t *fThresh;          // [fNelem] ADC thresholds

  Double_t* fGain;           // [fNelem] Gain constants from calibration
  
  Int_t fNclust;             // Number of hit clusters
  Int_t fNtracks;            // Number of shower tracks, i.e. number of
                             // cluster-to-track associations

  Double_t fMatchClX;
  Double_t fMatchClY;
  Double_t fMatchClMaxEnergyBlock;
  Double_t fClustSize;

  THcShowerClusterList* fClusterList;   // List of hit clusters

  TClonesArray* frAdcPedRaw;
  TClonesArray* frAdcErrorFlag;
  TClonesArray* frAdcPulseIntRaw;
  TClonesArray* frAdcPulseAmpRaw;
  TClonesArray* frAdcPulseTimeRaw;

  TClonesArray* frAdcPed;
  TClonesArray* frAdcPulseInt;
  TClonesArray* frAdcPulseAmp;


  virtual Int_t  ReadDatabase( const TDatime& date );
  virtual Int_t  DefineVariables( EMode mode = kDefine );
  ClassDef(THcShowerArray,0); // Fly;s Eye calorimeter array
};

#endif