File indexing completed on 2025-08-05 08:17:41
0001 #include "LightCollectionModel.h"
0002
0003 #include <fun4all/Fun4AllServer.h>
0004
0005 #include <ffamodules/CDBInterface.h>
0006
0007 #include <phool/recoConsts.h>
0008
0009 #include <TAxis.h> // for TAxis
0010 #include <TFile.h>
0011 #include <TH1.h>
0012 #include <TH2.h>
0013 #include <TObject.h> // for TObject
0014 #include <TSystem.h>
0015
0016 #include <cassert>
0017 #include <iostream>
0018
0019 LightCollectionModel::~LightCollectionModel()
0020 {
0021 delete data_grid_light_guide_efficiency;
0022 delete data_grid_fiber_trans;
0023 }
0024
0025 void LightCollectionModel::load_data_from_CDB(
0026 const std::string &domain,
0027 const std::string &histogram_light_guide_model,
0028 const std::string &histogram_fiber_model)
0029 {
0030 recoConsts *rc = recoConsts::instance();
0031 std::string url = CDBInterface::instance()->getUrl(domain);
0032 if (url.empty())
0033 {
0034 std::cout << "No calibration for domain " << domain << " for timestamp " << rc->get_uint64Flag("TIMESTAMP") << std::endl;
0035 gSystem->Exit(1);
0036 }
0037 TFile *fin = TFile::Open(url.c_str());
0038 if (!fin)
0039 {
0040 std::cout << "could not open " << url << std::endl;
0041 gSystem->Exit(1);
0042 }
0043 delete data_grid_light_guide_efficiency;
0044 data_grid_light_guide_efficiency = dynamic_cast<TH2 *>(fin->Get(histogram_light_guide_model.c_str()));
0045 assert(data_grid_light_guide_efficiency);
0046 data_grid_light_guide_efficiency->SetDirectory(nullptr);
0047 delete data_grid_fiber_trans;
0048 data_grid_fiber_trans = dynamic_cast<TH1 *>(fin->Get(histogram_fiber_model.c_str()));
0049 assert(data_grid_fiber_trans);
0050 data_grid_fiber_trans->SetDirectory(nullptr);
0051 delete fin;
0052 }
0053
0054 void LightCollectionModel::load_data_file(
0055 const std::string &input_file,
0056 const std::string &histogram_light_guide_model,
0057 const std::string &histogram_fiber_model)
0058 {
0059 TFile *fin = TFile::Open(input_file.c_str());
0060
0061 assert(fin);
0062 assert(fin->IsOpen());
0063
0064 delete data_grid_light_guide_efficiency;
0065 data_grid_light_guide_efficiency = dynamic_cast<TH2 *>(fin->Get(histogram_light_guide_model.c_str()));
0066 assert(data_grid_light_guide_efficiency);
0067 data_grid_light_guide_efficiency->SetDirectory(nullptr);
0068
0069 delete data_grid_fiber_trans;
0070 data_grid_fiber_trans = dynamic_cast<TH1 *>(fin->Get(histogram_fiber_model.c_str()));
0071 assert(data_grid_fiber_trans);
0072 data_grid_fiber_trans->SetDirectory(nullptr);
0073
0074 delete fin;
0075 }
0076
0077 double LightCollectionModel::get_light_guide_efficiency(const double x_fraction, const double y_fraction)
0078 {
0079 assert(data_grid_light_guide_efficiency);
0080 assert(x_fraction >= 0);
0081 assert(x_fraction <= 1);
0082 assert(y_fraction >= 0);
0083 assert(y_fraction <= 1);
0084
0085 const double eff = data_grid_light_guide_efficiency->Interpolate(x_fraction,
0086 y_fraction);
0087
0088 if (!data_grid_light_guide_efficiency_verify)
0089 {
0090 data_grid_light_guide_efficiency_verify = new TH2F("data_grid_light_guide_efficiency_verify",
0091 "light collection efficiency as used in LightCollectionModel;x positio fraction;y position fraction",
0092 100, 0., 1., 100, 0., 1.);
0093 Fun4AllServer::instance()->registerHisto(data_grid_light_guide_efficiency_verify);
0094 }
0095
0096 data_grid_light_guide_efficiency_verify->SetBinContent(
0097 data_grid_light_guide_efficiency_verify->GetXaxis()->FindBin(x_fraction),
0098 data_grid_light_guide_efficiency_verify->GetYaxis()->FindBin(y_fraction),
0099 eff
0100 );
0101
0102 return eff;
0103 }
0104
0105 double LightCollectionModel::get_fiber_transmission(const double z_distance)
0106 {
0107 assert(data_grid_fiber_trans);
0108
0109 const double eff = data_grid_fiber_trans->Interpolate(z_distance);
0110 if (!data_grid_fiber_trans_verify)
0111 {
0112 data_grid_fiber_trans_verify = new TH1F("data_grid_fiber_trans",
0113 "SCSF-78 Fiber Transmission as used in LightCollectionModel;position in fiber (cm);Effective transmission",
0114 100, -15, 15);
0115 Fun4AllServer::instance()->registerHisto(data_grid_fiber_trans_verify);
0116 }
0117
0118 data_grid_fiber_trans_verify->SetBinContent(
0119 data_grid_fiber_trans_verify->GetXaxis()->FindBin(z_distance),
0120 eff
0121 );
0122
0123 return eff;
0124 }