Skip to content
Snippets Groups Projects
calibration.h 6.3 KiB
Newer Older
// Vijay Kumar, Univerity of Regina - 24/07/20
// vijay36361@gmail.com

#ifndef calibration_h
#define calibration_h

#include <TROOT.h>
#include <TChain.h>
#include <TFile.h>
#include <TSelector.h>
#include <TTreeReader.h>
#include <TTreeReaderValue.h>
#include <TTreeReaderArray.h>
#include <TH1.h>
#include <TH2.h>
const Int_t        fhgc_pmts = 4;
const Double_t     fhgc_zpos = 156.27;

class calibration : public TSelector {
 public :
  TTreeReader    fReader;
  TTree          *fChain = 0;   //!pointer to the analyzed TTree or TChain
  Bool_t          fFullRead;
  Bool_t          fFullShow;
  Bool_t          fTrack;
  Bool_t          fCut;
  Bool_t          fPions;
  Bool_t          frun;

  // Declaration of histograms
  TH1F          **fPulseInt;
  TH1F          **fPulseInt_poiss;
  TH1F         ***fPulseInt_quad;
  TH1F           *fBeta_Cut;
  TH1F           *fBeta_Full;
  TH1F           *fTiming_Full;
  TH1F            *fTim1;
  TH1F            *fTim2;
  TH1F            *fTim3;
  TH1F            *fTim4;
  TH1F            *fTim1_full;  
  TH1F            *fTim2_full;  
  TH1F            *fTim3_full;  
  TH1F            *fTim4_full;  
  // Declaration of histograms used in fitting/analysis
  TH1F *scaled_clone;
  TH1F *fscaled[4];
  TH1F *fscaled_nobackground[4];
  TH1F *fscaled_mk2[4];
  TH1F *fscaled_mk2_nobackground[4];
  TH1F *fscaled_temp[4];
  TH1F *fscaled_combined[4];
  TH1F *fscaled_total;
  TH1F *fscaled_temp_mk2[4];
  TH1F *fscaled_combined_mk2[4];
  TH1F *fscaled_total_mk2;
   
  // Declaration of canvases used in fitting/analysis
  TCanvas *t;
  TCanvas *quad_cuts_ipmt;
  TCanvas *quad_cuts[4];
  TCanvas *low_stats_ipmt;
  TCanvas *background_ipmt;
  TCanvas *Full_zoom_fit_ipmt;
  TCanvas *final_spectra_ipmt;
  TCanvas *background_mk2_ipmt;
  TCanvas *final_spectra_mk2_ipmt;
  TCanvas *final_spectra_combined;
  TCanvas *final_spectra_combined_mk2;
  TCanvas *scaled_poisson;
  TCanvas *scaled_total;  
 
  // Declaration of preprocessing quantities
  Double_t  timing_mean[4];
  Double_t  timing_std[4];
  Double_t x;

  // Readers to access the data
  // These leaves MUST all be present in your replay file for this scrip to run!
  TTreeReaderValue<Int_t>    Ndata_P_tr_beta            = {fReader, "Ndata.P.tr.beta"};
  TTreeReaderArray<Double_t> P_tr_beta                  = {fReader, "P.tr.beta"};
  TTreeReaderArray<Double_t> P_hgcer_goodAdcTdcDiffTime = {fReader, "P.hgcer.goodAdcTdcDiffTime"};
  TTreeReaderArray<Double_t> P_hgcer_goodAdcPulseInt    = {fReader, "P.hgcer.goodAdcPulseInt"};
  TTreeReaderArray<Double_t> P_hgcer_goodAdcPulseAmp    = {fReader, "P.hgcer.goodAdcPulseAmp"};
  TTreeReaderArray<Double_t> P_hgcer_numTracksFired     = {fReader, "P.hgcer.numTracksFired"};
  TTreeReaderValue<Double_t> P_cal_fly_earray           = {fReader, "P.cal.fly.earray"};
  TTreeReaderValue<Double_t> P_cal_pr_eplane            = {fReader, "P.cal.pr.eplane"};
  TTreeReaderValue<Double_t> P_cal_etotnorm             = {fReader, "P.cal.etotnorm"};
  TTreeReaderValue<Double_t> P_gtr_p                    = {fReader, "P.gtr.p"};
  TTreeReaderArray<Double_t> P_gtr_dp                   = {fReader, "P.gtr.dp"};
  TTreeReaderArray<Double_t> P_tr_x                     = {fReader, "P.tr.x"};
  TTreeReaderArray<Double_t> P_tr_ph                    = {fReader, "P.tr.ph"};
  TTreeReaderArray<Double_t> P_tr_y                     = {fReader, "P.tr.y"};
  TTreeReaderArray<Double_t> P_tr_th                    = {fReader, "P.tr.th"};
  TTreeReaderArray<Double_t> P_hgcer_xAtCer             = {fReader, "P.hgcer.xAtCer"};
  TTreeReaderArray<Double_t> P_hgcer_yAtCer             = {fReader, "P.hgcer.yAtCer"};
  
 calibration(TTree * /*tree*/ =0) : fChain(0) {fPulseInt = 0, fPulseInt_poiss = 0, fPulseInt_quad = 0, fBeta_Cut = 0, fBeta_Full = 0, fTiming_Full = 0,fTim1 =0, fTim1_full = 0,fTim2 =0, fTim2_full = 0, fTim3 = 0, fTim3_full = 0, fTim4 = 0, fTim4_full = 0, fFullRead = kFALSE, fFullShow = kFALSE, fTrack = kFALSE, fCut = kFALSE, fPions = kFALSE;}
  virtual ~calibration() { }
  virtual Int_t   Version() const { return 2; }
  virtual void    Begin(TTree *tree);
  virtual void    SlaveBegin(TTree *tree);
  virtual void    Init(TTree *tree);
  virtual Bool_t  Notify();
  virtual Bool_t  Process(Long64_t entry);
  virtual Int_t   GetEntry(Long64_t entry, Int_t getall = 0) { return fChain ? fChain->GetTree()->GetEntry(entry, getall) : 0; }
  virtual void    SetOption(const char *option) { fOption = option; }
  virtual void    SetObject(TObject *obj) { fObject = obj; }
  virtual void    SetInputList(TList *input) { fInput = input; }
  virtual TList  *GetOutputList() const { return fOutput; }
  virtual void    SlaveTerminate();
  virtual void    Terminate();

  ClassDef(calibration,0);
};

#endif

#ifdef calibration_cxx
void calibration::Init(TTree *tree)
{
}

Bool_t calibration::Notify()
{
//Poisson distribution is used to remove background from larger values of NPE
Double_t poisson(Double_t *x, Double_t *par)
{
  Double_t PoissFit1 = (par[1]*pow(par[0],x[0])*exp(-par[0]))/(tgamma(x[0]+1));                 
  return PoissFit1;
//Gaussian distribution is used to find the mean of the SPE and determine spacing between subsequent NPE
Double_t gauss(Double_t *x, Double_t *par)
{
  Double_t GaussFit1 = par[0]*exp((-0.5)*(pow((x[0] - par[1]),2)/pow((par[2]),2)));
  Double_t GaussFit2 = par[3]*exp((-0.5)*(pow((x[0] - par[4]),2)/pow((par[5]),2)));
  return GaussFit1 + GaussFit2;
}
 
// Function used for quality contron of the calibration
Double_t fun_4gauss_2poisson(Double_t *x, Double_t *par)
{
  Double_t GaussFit1 = par[0]*exp((-0.5)*(pow((x[0] - par[1]),2)/pow((par[2]),2)));
  Double_t GaussFit2 = par[3]*exp((-0.5)*(pow((x[0] - par[4]),2)/pow((par[5]),2)));
  Double_t GaussFit3 = par[6]*exp((-0.5)*(pow((x[0] - par[7]),2)/pow((par[8]),2)));
  Double_t GaussFit4 = par[9]*exp((-0.5)*(pow((x[0] - par[10]),2)/pow((par[11]),2)));
  Double_t PoissFit1 = (par[13]*pow(par[12],x[0])*exp(-par[12]))/(tgamma(x[0]+1)); 
  Double_t PoissFit2 = (par[15]*pow(par[14],x[0])*exp(-par[14]))/(tgamma(x[0]+1)); 
  return GaussFit1 + GaussFit2 + GaussFit3 + GaussFit4 + PoissFit1 + PoissFit2;
}

//A simple linear equation is used to determine how linear the means of the NPE are
Double_t linear(Double_t *x, Double_t *par)
{
  Double_t LinFit1 = par[0]*x[0] + par[1];
  return LinFit1;
#endif // #ifdef calibration_cxx