Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:18:16

0001 // Tell emacs that this is a C++ source
0002 //  -*- C++ -*-.
0003 #ifndef G4TPC_PHG4TPCDIGITIZER_H
0004 #define G4TPC_PHG4TPCDIGITIZER_H
0005 
0006 #include <fun4all/SubsysReco.h>
0007 
0008 #include <trackbase/TrkrDefs.h>
0009 #include <trackbase/TrkrHitSet.h>
0010 
0011 #include <map>
0012 #include <string>   // for string
0013 #include <utility>  // for pair, make_pair
0014 #include <vector>
0015 
0016 #include <gsl/gsl_rng.h>
0017 
0018 class PHCompositeNode;
0019 
0020 class PHG4TpcDigitizer : public SubsysReco
0021 {
0022  public:
0023   PHG4TpcDigitizer(const std::string &name = "PHG4TpcDigitizer");
0024   ~PHG4TpcDigitizer() override;
0025 
0026   //! module initialization
0027   int Init(PHCompositeNode * /*topNode*/) override { return 0; }
0028 
0029   //! run initialization
0030   int InitRun(PHCompositeNode *topNode) override;
0031 
0032   //! event processing
0033   int process_event(PHCompositeNode *topNode) override;
0034 
0035   //! end of process
0036   int End(PHCompositeNode * /*topNode*/) override { return 0; };
0037 
0038   void set_adc_scale(const int layer, const unsigned int max_adc, const float energy_per_adc)
0039   {
0040     _max_adc.insert(std::make_pair(layer, max_adc));
0041     _energy_scale.insert(std::make_pair(layer, energy_per_adc));
0042   }
0043 
0044   void SetTpcMinLayer(const int minlayer) { TpcMinLayer = minlayer; };
0045   void SetADCThreshold(const float thresh) { ADCThreshold = thresh; };
0046   void SetENC(const float enc) { TpcEnc = enc; };
0047   void set_drift_velocity(float vd) {_drift_velocity = vd;}
0048   void set_skip_noise_flag(const bool skip) {skip_noise = skip;}
0049 
0050  private:
0051   void CalculateCylinderCellADCScale(PHCompositeNode *topNode);
0052   void DigitizeCylinderCells(PHCompositeNode *topNode);
0053   float added_noise();
0054   float add_noise_to_bin(float signal);
0055   
0056   unsigned int TpcMinLayer;
0057   unsigned int TpcNLayers;
0058   float ADCThreshold;
0059   float ADCThreshold_mV = 0;
0060   float TpcEnc;
0061   float Pedestal;
0062   float ChargeToPeakVolts;
0063   float _drift_velocity = 8.0e-3;  // override from macro with simulation drift velocity
0064 
0065   float ADCSignalConversionGain;
0066   float ADCNoiseConversionGain;
0067 
0068   bool skip_noise = false;
0069 
0070   std::vector<std::vector<TrkrHitSet::ConstIterator> > phi_sorted_hits;
0071   std::vector<std::vector<TrkrHitSet::ConstIterator> > t_sorted_hits;
0072 
0073   std::vector<float> adc_input;
0074   std::vector<TrkrDefs::hitkey> adc_hitid;
0075   std::vector<int> is_populated;
0076 
0077   // settings
0078   std::map<int, unsigned int> _max_adc;
0079   std::map<int, float> _energy_scale;
0080 
0081   //! random generator that conform with sPHENIX standard
0082   gsl_rng *RandomGenerator;
0083 };
0084 
0085 #endif