Skip to content
Snippets Groups Projects
Shower2.cxx 2.84 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "Shower2.h"
    
    #include "THcShower.h"
    #include "THcHallCSpectrometer.h"
    #include "THaEvData.h"
    #include "THaDetMap.h"
    #include "THcDetectorMap.h"
    #include "THcGlobals.h"
    #include "THaCutList.h"
    #include "THcParmList.h"
    #include "VarDef.h"
    #include "VarType.h"
    #include "THaTrack.h"
    #include "TClonesArray.h"
    #include "THaTrackProj.h"
    #include "TMath.h"
    
    #include <cstring>
    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <numeric>
    
    #include "nlohmann/json.hpp" 
    
    using namespace std;
    
    namespace hcana {
    
    THaAnalysisObject::EStatus Shower2::Init(const TDatime &date) {
    
      auto res = THcShower::Init(date);
    
      LoadJsonCalibration(_run_number);
     
      // hard coding cal_*_cal_const  to 0.001. 
      // Not sure what their purpose is... 
    
      for (UInt_t i=0; i<fNTotBlocks; i++) {
        fPosGain[i] = 0.001 *  _pos_gain_cor[i];
        fNegGain[i] = 0.001 *  _neg_gain_cor[i];
      }
    
      if(fHasArray) {
        auto gains = fArray->GetGains();
        for (Int_t i=0; i<fArray->GetNelem(); i++) {
          gains[i] = 0.001 * _arr_gain_cor[i];
        }
      }
    
      return fStatus = res;
    }
    
    void Shower2::LoadJsonCalibration(int rn, std::string fname) {
      // file checks assumed already complete.
      using nlohmann::json;
      json j_database;
      {
        std::ifstream json_input_file(fname);
        json_input_file >> j_database;
      }
    
      std::cout << " runs : ";
      std::vector<int> runs;
      for (json::iterator it = j_database.begin(); it != j_database.end(); ++it) {
        std::cout << it.key() << ", ";
        runs.push_back(std::stoi(it.key()));
      }
      std::cout << "\n";
    
      auto closest = [](std::vector<int> const &vec, int value) {
        auto it = std::lower_bound(vec.begin(), vec.end(), value);
        if (*it > value) {
          it = it - 1;
        }
        if (it == vec.end()) {
          return -1;
        }
        return *it;
      };
      // auto best_run = std::upper_bound(runs.begin(), runs.end(), rn);
      // std::cout << "using run upper " << rn << " :::: " << *best_run << "\n";
      // auto best_run = std::lower_bound(runs.begin(), runs.end(), rn);
      // std::cout << "using run lower " << rn << " :::: " << *(best_run) << "\n";
    
      int best_run = closest(runs, rn);
      std::cout << " closest " << best_run << std::endl;
      json j = j_database[std::to_string(best_run)];
      // std::cout << j_database[std::to_string(best_run)] << "\n";;
      // std::cout << j.dump(-1) << "\n";
    
    
      if (j.find("histogram") != j.end()) {
      }
      if (j.find("cal") != j.end()) {
        json j_cal = j["cal"];
        if (j_cal.find("neg_gain_cor") != j_cal.end()) {
          // std::cout << " neg_gain_cor!!!\n";
          _neg_gain_cor = j["cal"]["neg_gain_cor"].get<std::vector<double>>();
        }
        if (j_cal.find("pos_gain_cor") != j_cal.end()) {
          _pos_gain_cor = j["cal"]["pos_gain_cor"].get<std::vector<double>>();
        }
        if (j_cal.find("arr_gain_cor") != j_cal.end()) {
          _arr_gain_cor = j["cal"]["arr_gain_cor"].get<std::vector<double>>();
        }
      }
    }
    
    } // namespace hcana