Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:14:49

0001 #ifndef __Proto4ShowerCalib_H__
0002 #define __Proto4ShowerCalib_H__
0003 
0004 #include <TFile.h>
0005 #include <TNtuple.h>
0006 #include <fun4all/SubsysReco.h>
0007 #include <stdint.h>
0008 #include <fstream>
0009 #include <string>
0010 
0011 class PHCompositeNode;
0012 class PHG4HitContainer;
0013 class Fun4AllHistoManager;
0014 class TH1F;
0015 class TH2F;
0016 class TTree;
0017 class TChain;
0018 class SvtxEvalStack;
0019 class PHG4Particle;
0020 class RawTowerGeom;
0021 class RawTowerContainer;
0022 class SvtxTrack;
0023 
0024 /// \class Proto4ShowerCalib to help you get started
0025 class Proto4ShowerCalib : public SubsysReco
0026 {
0027  public:
0028   //! constructor
0029   Proto4ShowerCalib(const std::string &filename = "Proto4ShowerCalib.root");
0030 
0031   //! destructor
0032   virtual ~Proto4ShowerCalib();
0033 
0034   //! Standard function called at initialization
0035   int Init(PHCompositeNode *topNode);
0036 
0037   //! Standard function called when a new run is processed
0038   int InitRun(PHCompositeNode *topNode);
0039 
0040   //! Standard function called at each event
0041   int process_event(PHCompositeNode *topNode);
0042 
0043   //! Standard function called at the end of processing. Save your stuff here.
0044   int End(PHCompositeNode *topNode);
0045 
0046   //! Is processing simulation files?
0047   void
0048   is_sim(bool b)
0049   {
0050     _is_sim = b;
0051   }
0052 
0053   // ShowerCalib Analysis
0054   int InitAna();
0055 
0056   int MakeAna();
0057 
0058   int FinishAna();
0059 
0060   void set_runID(std::string runID)
0061   {
0062     _mRunID = runID;
0063   }
0064 
0065 
0066   class Eval_Run : public TObject
0067   {
0068    public:
0069     Eval_Run()
0070     {
0071       reset();
0072     }
0073     virtual ~Eval_Run()
0074     {
0075     }
0076 
0077     void
0078     reset()
0079     {
0080       run = -31454;
0081       event = -31454;
0082       beam_mom = -0;
0083       hodo_h = -31454;
0084       hodo_v = -31454;
0085       C2_sum = -31454;
0086       C1 = -31454;
0087 
0088       valid_hodo_v = false;
0089       valid_hodo_h = false;
0090       trigger_veto_pass = false;
0091       good_e = false;
0092       good_anti_e = false;
0093 
0094       beam_2CH_mm = -31454;
0095       beam_2CV_mm = -31454;
0096 
0097       truth_y = -31454;
0098       truth_z = -31454;
0099 
0100       sum_E_CEMC = -31454;
0101       sum_E_HCAL_OUT = -31454;
0102       sum_E_HCAL_IN = -31454;
0103     }
0104 
0105     int run;
0106     int event;
0107 
0108     //! beam momentum with beam charge
0109     float beam_mom;
0110 
0111     //! hodoscope index
0112     int hodo_h;
0113     int hodo_v;
0114 
0115     //! Cherenkov sums
0116     float C2_sum;
0117     float C1;
0118 
0119     //! has valid hodoscope?
0120     bool valid_hodo_v;
0121     bool valid_hodo_h;
0122 
0123     //! has valid veto counter?
0124     bool trigger_veto_pass;
0125 
0126     //! Good electrons?
0127     bool good_e;
0128 
0129     //! Good hadron and muons?
0130     bool good_anti_e;
0131 
0132     //! 2C motion table positions
0133     float beam_2CH_mm;
0134     float beam_2CV_mm;
0135 
0136     //! Turth beam position. Simulation only.
0137     float truth_y;
0138     float truth_z;
0139 
0140     //! Sum energy of all towers
0141     double sum_E_CEMC;
0142     double sum_E_HCAL_OUT;
0143     double sum_E_HCAL_IN;
0144 
0145     ClassDef(Eval_Run, 10)
0146   };
0147 
0148   class HCAL_Tower : public TObject
0149   {
0150     public:
0151       HCAL_Tower()
0152       {
0153     reset();
0154       }
0155 
0156       virtual ~HCAL_Tower(){}
0157 
0158       void reset()
0159       {
0160     // HCALIN
0161     hcalin_e_sim = 0.;
0162 
0163     hcalin_lg_e_raw = 0.;
0164     hcalin_lg_e_calib = 0.;
0165 
0166     for(int itwr=0; itwr<16; itwr++)
0167     {
0168       hcalin_twr_sim[itwr] = 0.;
0169       hcalin_lg_twr_raw[itwr] = 0.;
0170       hcalin_lg_twr_calib[itwr] = 0.;
0171     }
0172 
0173     // HCALOUT
0174     hcalout_e_sim = 0.;
0175 
0176     hcalout_lg_e_raw = 0.;
0177     hcalout_lg_e_calib = 0.;
0178 
0179     hcalout_hg_e_raw = 0.;
0180     hcalout_hg_e_calib = 0.;
0181 
0182     for(int itwr=0; itwr<16; itwr++)
0183     {
0184       hcalout_twr_sim[itwr] = 0.;
0185 
0186       hcalout_lg_twr_raw[itwr] = 0.;
0187       hcalout_lg_twr_calib[itwr] = 0.;
0188 
0189       hcalout_hg_twr_raw[itwr] = 0.;
0190       hcalout_hg_twr_calib[itwr] = 0.;
0191     }
0192 
0193     // total energy and asymmetry
0194     hcal_total_sim = -999.;
0195     hcal_total_raw = -999.;
0196     hcal_total_calib = -999.;
0197 
0198     hcal_asym_sim = -999.;
0199     hcal_asym_raw = -999.;
0200     hcal_asym_calib = -999.;
0201       }
0202 
0203 
0204       // HCALIN
0205       float hcalin_e_sim;
0206       float hcalin_twr_sim[16];
0207 
0208       float hcalin_lg_e_raw;
0209       float hcalin_lg_twr_raw[16];
0210 
0211       float hcalin_lg_e_calib;
0212       float hcalin_lg_twr_calib[16];
0213 
0214       // HCALOUT
0215       float hcalout_e_sim;
0216       float hcalout_twr_sim[16];
0217 
0218       float hcalout_lg_e_raw;
0219       float hcalout_lg_twr_raw[16];
0220 
0221       float hcalout_lg_e_calib;
0222       float hcalout_lg_twr_calib[16];
0223 
0224       float hcalout_hg_e_raw;
0225       float hcalout_hg_twr_raw[16];
0226 
0227       float hcalout_hg_e_calib;
0228       float hcalout_hg_twr_calib[16];
0229 
0230       // total energy and asymmetry
0231       float hcal_total_sim;
0232       float hcal_total_raw;
0233       float hcal_total_calib;
0234 
0235       float hcal_asym_sim;
0236       float hcal_asym_raw;
0237       float hcal_asym_calib;
0238 
0239       ClassDef(HCAL_Tower, 10)
0240   };
0241 
0242  private:
0243   // calorimeter size
0244   enum
0245   {
0246     n_size = 8
0247   };
0248 
0249   //! is processing simulation files?
0250   bool _is_sim;
0251 
0252   //! get manager of histograms
0253   Fun4AllHistoManager *
0254   get_HistoManager();
0255 
0256   std::pair<int, int>
0257   find_max(RawTowerContainer *towers, int cluster_size);
0258 
0259   //! output root file name
0260   std::string _filename;
0261 
0262   //! simple event counter
0263   unsigned long _ievent;
0264 
0265   //! run infomation. To be copied to output TTree T
0266   Eval_Run _eval_run;
0267 
0268   //! hcal infromation. To be copied to output TTree T
0269   HCAL_Tower _tower;
0270 
0271   // TowerCalib Analysis
0272   TFile *mFile_OutPut;
0273   TChain *mChainInPut;
0274   unsigned long _mStartEvent;
0275   unsigned long _mStopEvent;
0276   int _mInPut_flag;
0277   std::string _mList;
0278   std::string _mRunID;
0279 
0280   Eval_Run *_mInfo;
0281   HCAL_Tower *_mTower;
0282 
0283   // TH2F *h_mAsymmEnergy_mixed_sim_wo_cut; // sim
0284   TH2F *h_mAsymmEnergy_pion_sim_wo_cut;
0285 
0286   // TH2F *h_mAsymmEnergy_mixed_sim;
0287   TH2F *h_mAsymmEnergy_pion_sim;
0288 
0289   TH2F *h_mAsymmAdc_mixed; // production
0290   TH2F *h_mAsymmAdc_electron;
0291   TH2F *h_mAsymmAdc_pion;
0292 
0293   TH2F *h_mAsymmEnergy_mixed_wo_cut;
0294   TH2F *h_mAsymmEnergy_electron_wo_cut;
0295   TH2F *h_mAsymmEnergy_pion_wo_cut;
0296 
0297   TH2F *h_mAsymmEnergy_mixed; // MIP study
0298   TH2F *h_mAsymmEnergy_electron;
0299   TH2F *h_mAsymmEnergy_pion;
0300 
0301   // balancing
0302   TH2F *h_mAsymmEnergy_mixed_balancing;
0303   TH2F *h_mAsymmEnergy_electron_balancing;
0304   TH2F *h_mAsymmEnergy_pion_balancing;
0305 
0306   // leveling correction
0307   TH2F *h_mAsymmEnergy_mixed_leveling;
0308   TH2F *h_mAsymmEnergy_electron_leveling;
0309   TH2F *h_mAsymmEnergy_pion_leveling;
0310 
0311   // shower calib
0312   TH2F *h_mAsymmEnergy_mixed_ShowerCalib;
0313   TH2F *h_mAsymmEnergy_electron_ShowerCalib;
0314   TH2F *h_mAsymmEnergy_pion_ShowerCalib;
0315 
0316   // Outer HCal only study
0317   TH2F *h_mAsymmEnergy_mixed_MIP;
0318   TH1F *h_mEnergyOut_electron; // hadron MIP through inner HCal
0319   TH1F *h_mEnergyOut_pion;
0320   TH1F *h_mEnergyOut_electron_ShowerCalib;
0321   TH1F *h_mEnergyOut_pion_ShowerCalib;
0322 
0323   int getChannelNumber(int column, int row);
0324   int setTowerCalibParas();
0325 
0326   // correction factors
0327   const double samplefrac_in = 0.09267; 
0328   const double samplefrac_out = 0.02862;
0329 
0330   // inner HCAL MIP energy extracted from muon
0331   const double MIP_mean  = 0.654927;
0332   const double MIP_width = 0.151484;
0333 
0334   // const double samplefrac_in = 0.0631283;  // from Songkyo
0335   // const double samplefrac_out = 0.0338021;
0336 
0337   double towercalib_lg_in[16];
0338   double towercalib_lg_out[16];
0339   double towercalib_hg_out[16];
0340 
0341   // const double showercalib = 3.03185; // extracted with 12 GeV Test Beam Data
0342   const double showercalib = 2.92243; // extracted with 8 GeV Test Beam Data
0343   const double showercalib_ohcal = 3.37511; // extracted with 8 GeV Test Beam Data
0344 
0345   float find_range();
0346   int find_energy();
0347 
0348   // used by RAW
0349 };
0350 
0351 #endif  // __Proto4ShowerCalib_H__