diff --git a/src/Shower2.cxx b/src/Shower2.cxx new file mode 100644 index 0000000000000000000000000000000000000000..1e9f16b63af856f98df15e42b0ad100026aba330 --- /dev/null +++ b/src/Shower2.cxx @@ -0,0 +1,110 @@ +#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 diff --git a/src/Shower2.h b/src/Shower2.h new file mode 100644 index 0000000000000000000000000000000000000000..a33e6961d104ef48d3cede926498b40fd956a359 --- /dev/null +++ b/src/Shower2.h @@ -0,0 +1,44 @@ +#ifndef ROOT_hcana_Shower2 +#define ROOT_hcana_Shower2 + +/////////////////////////////////////////////////////////////////////////////// +// // +// hcana::Shower // +// // +/////////////////////////////////////////////////////////////////////////////// + +#include "THcShower.h" +#include "TObject.h" + +namespace hcana { + +class Shower2 : public THcShower { + +public: + Shower2(const char *name, const char *description = "", + THaApparatus *a = nullptr) + : THcShower(name, description, a) {} + + virtual ~Shower2(){} + + virtual THaAnalysisObject::EStatus Init(const TDatime &run_time); + + int _run_number = 0; + std::vector<double> _neg_gain_cor; + std::vector<double> _pos_gain_cor; + std::vector<double> _arr_gain_cor; + + void SetRunNumber(int rn) { _run_number = rn;} + void LoadJsonCalibration(int rn, std::string fname = "PARAM/SHMS/CAL/pcal_calib.json"); + + // virtual void Clear( Option_t* opt="" ); + // virtual Int_t Decode( const THaEvData& ); + // virtual Int_t CoarseProcess( TClonesArray& tracks ); + // virtual Int_t FineProcess( TClonesArray& tracks ); + + ClassDef(Shower2, 1) // Shower counter detector +}; + +} // namespace hcana + +#endif diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx index b1042b46cebe6c8afba08b5a98f9964e078b2e43..a2a71d2f1e559f87d8fa4f785d05c85e8b8ad9d0 100644 --- a/src/THcCherenkov.cxx +++ b/src/THcCherenkov.cxx @@ -292,10 +292,8 @@ Int_t THcCherenkov::DefineVariables( EMode mode ) RVarDef vars[] = { {"adcCounter", "ADC counter numbers", "frAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}, {"adcErrorFlag", "Error Flag for When FPGA Fails", "fAdcErrorFlag.THcSignalHit.GetData()"}, - {"numGoodAdcHits", "Number of Good ADC Hits Per PMT", "fNumGoodAdcHits"}, // Cherenkov occupancy {"totNumGoodAdcHits", "Total Number of Good ADC Hits", "fTotNumGoodAdcHits"}, // Cherenkov multiplicity - {"numTracksMatched", "Number of Tracks Matched Per Region", "fNumTracksMatched"}, {"numTracksFired", "Number of Tracks that Fired Per Region", "fNumTracksFired"}, {"totNumTracksMatched", "Total Number of Tracks Matched Per Region", "fTotNumTracksMatched"}, diff --git a/src/THcCherenkov.h b/src/THcCherenkov.h index 47845c55575ec2d79630afbc8c667bd564d50be3..30f3d6cfe54726ef37bba0d9b326bccf5e49dcbf 100644 --- a/src/THcCherenkov.h +++ b/src/THcCherenkov.h @@ -15,6 +15,8 @@ class THcHodoscope; class THcCherenkov : public THaNonTrackingDetector, public THcHitList { + using vec = std::vector<Double_t>; + public: THcCherenkov(const char* name, const char* description = "", THaApparatus* a = NULL); virtual ~THcCherenkov(); @@ -65,15 +67,15 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList { vector<Int_t> fNumGoodAdcHits; vector<Int_t> fNumTracksMatched; vector<Int_t> fNumTracksFired; - vector<Double_t> fGoodAdcPed; - vector<Double_t> fGoodAdcMult; - vector<Double_t> fGoodAdcHitUsed; - vector<Double_t> fGoodAdcPulseInt; - vector<Double_t> fGoodAdcPulseIntRaw; - vector<Double_t> fGoodAdcPulseAmp; - vector<Double_t> fGoodAdcPulseTime; - vector<Double_t> fGoodAdcTdcDiffTime; - vector<Double_t> fNpe; + vec fGoodAdcPed; + vec fGoodAdcMult; + vec fGoodAdcHitUsed; + vec fGoodAdcPulseInt; + vec fGoodAdcPulseIntRaw; + vec fGoodAdcPulseAmp; + vec fGoodAdcPulseTime; + vec fGoodAdcTdcDiffTime; + vec fNpe; Int_t fNRegions; Int_t fRegionsValueMax; diff --git a/src/THcShowerArray.h b/src/THcShowerArray.h index 1f055138ebaf5f58c2623e5de6468e4795d4e17e..3bee02916546bc2c6d1f6b64321aea95594ccaa6 100644 --- a/src/THcShowerArray.h +++ b/src/THcShowerArray.h @@ -81,7 +81,9 @@ public: Double_t GetEarray() { return fEarray; - }; + } + + Double_t* GetGains(){ return fGain; } // Fiducial volume limits. Double_t fvXmin(); diff --git a/src/include/HallC_LinkDef.h b/src/include/HallC_LinkDef.h index 36bbc62da68ae38a4bc7c8918f715495433f35a3..245129dc6cbef21424b5a2508a348975b3096ac2 100644 --- a/src/include/HallC_LinkDef.h +++ b/src/include/HallC_LinkDef.h @@ -6,6 +6,14 @@ #pragma link off all classes; #pragma link off all functions; + +#pragma link C++ nestedclass; +#pragma link C++ nestedtypedef; + +#pragma link C++ namespace hallc; +#pragma link C++ namespace hcana; + + #pragma link C++ global gHcParms; #pragma link C++ global gHcDetectorMap; @@ -48,6 +56,7 @@ #pragma link C++ class THcRawHit+; #pragma link C++ class THcRawHodoHit+; #pragma link C++ class THcRawShowerHit+; +#pragma link C++ class THcRawShowerHit+; #pragma link C++ class THcRawTdcHit+; #pragma link C++ class THcReactionPoint+; #pragma link C++ class THcRun+; @@ -66,5 +75,8 @@ #pragma link C++ class THcTrigDet+; #pragma link C++ class THcTrigRawHit+; #pragma link C++ class Decoder::TIBlobModule+; + +#pragma link C++ class hcana::Shower2+; + // Postamble for HallC_Linkdef.h file #endif