10 LOG(info) <<
Form(
"BmnFHCalRaw2Digit");
23 LOG(info) <<
Form(
"BmnFHCalRaw2Digit : Config file: %s", mappingFile.
Data());
24 LOG(info) <<
Form(
"BmnFHCalRaw2Digit : Calibration file: %s", CalibrationFile.
Data());
36 namespace po = boost::program_options;
38 TString dir = getenv(
"VMCWORKDIR");
43 std::vector<std::string> configuration;
46 po::options_description desc(
"Options");
47 desc.add_options()(
"VERSION.id", po::value<float>(&version),
48 "version identificator")(
"COMMENT.str", po::value<std::string>(&comment),
"comment")(
49 "CONFIGURATION.config", po::value<std::vector<std::string>>(&configuration)->multitoken(),
"configuration");
53 std::ifstream config_file((path + mappingFile).Data(), std::ifstream::in);
54 if (!config_file.is_open()) {
55 LOG(error) <<
Form(
"BmnFHCalRaw2Digit : Loading Config from file: %s - file open error!", mappingFile.
Data());
58 LOG(debug) <<
Form(
"BmnFHCalRaw2Digit : Loading Config from file: %s", mappingFile.
Data());
59 po::store(po::parse_config_file(config_file, desc), vm);
63 std::string board_serial;
70 for (
auto it : configuration) {
72 ss >> board_serial >> board_channel >> module_type >> module_id >> section_id;
74 auto key = std::make_pair(std::stoul(board_serial,
nullptr, 16), board_channel);
84 namespace po = boost::program_options;
86 TString dir = getenv(
"VMCWORKDIR");
87 TString path = dir +
"/parameters/fhcal/";
91 std::vector<std::string> harmonics;
92 std::vector<std::string> calibrations;
95 po::options_description desc(
"Options");
96 desc.add_options()(
"VERSION.id", po::value<float>(&version),
97 "version identificator")(
"COMMENT.str", po::value<std::string>(&comment),
"comment")(
98 "CHECKER.isWriteWfm", po::value<bool>(&
fdigiPars.isWriteWfm),
99 "writing waveforms")(
"PARAMETERS.gateBegin", po::value<int>(&
fdigiPars.gateBegin),
"digi parameters")(
100 "PARAMETERS.gateEnd", po::value<int>(&
fdigiPars.gateEnd),
101 "digi parameters")(
"PARAMETERS.threshold", po::value<float>(&
fdigiPars.threshold),
"digi parameters")(
102 "PARAMETERS.signalType", po::value<int>(&
fdigiPars.signalType),
103 "digi parameters")(
"PARAMETERS.doInvert", po::value<bool>(&
fdigiPars.doInvert),
"digi parameters")(
104 "FITPARAMETERS.isfit", po::value<bool>(&
fdigiPars.isfit),
"digi parameters")(
105 "FITPARAMETERS.harmonic", po::value<std::vector<std::string>>(&harmonics)->multitoken(),
"fit harmonics")(
106 "CALIBRATION.calib", po::value<std::vector<std::string>>(&calibrations)->multitoken(),
"calibrations");
109 po::variables_map vm;
110 std::ifstream calib_file((path + calibrationFile).Data(), std::ifstream::in);
111 if (!calib_file.is_open()) {
112 LOG(error) <<
Form(
"BmnFHCalRaw2Digit : Loading Calibration from file: %s - file open error!",
113 calibrationFile.
Data());
116 LOG(debug) <<
Form(
"BmnFHCalRaw2Digit : Loading Calibration from file: %s", calibrationFile.
Data());
117 po::store(po::parse_config_file(calib_file, desc), vm);
121 for (
auto str : harmonics) {
122 if (str.find(
',') != std::string::npos) {
124 std::string real_part_str, imaginary_part_str;
125 std::istringstream iss(str);
126 std::getline(iss, real_part_str,
',');
127 std::getline(iss, imaginary_part_str);
130 float real_part = std::stof(real_part_str);
131 float imaginary_part = std::stof(imaginary_part_str);
134 fdigiPars.harmonics.push_back(std::complex<float>(real_part, imaginary_part));
136 fdigiPars.harmonics.push_back(std::stof(str));
144 for (
auto it : calibrations) {
145 istringstream ss(it);
146 ss >> mod_id >> sec_id >> calibration >> calibError;
148 uint32_t address = addrMap.second;
150 fuoCalibMap[address] = std::make_pair(calibration, calibError);
156 int model_order =
fdigiPars.harmonics.size() + 1;
158 auto maxElement = std::max_element(
160 [](
const std::complex<float>& a,
const std::complex<float>& b) { return std::abs(a) < std::abs(b); });
161 if (maxElement !=
fdigiPars.harmonics.end()) {
163 int maxElementLength =
floor(5. / (-
log(real(*maxElement))));
168 fAZik =
new std::complex<float>*[model_order];
169 for (
int i = 0;
i < model_order;
i++) {
170 fAZik[
i] =
new std::complex<float>[model_order];
171 for (
int j = 0; j < model_order; j++)
186 }
catch (
const std::out_of_range& e) {
187 LOG(debug) <<
"BmnFHCalRaw2Digit:: GetAddressFromBoard. Board serial " << std::hex << key.first << std::dec
188 <<
" channel " << key.second <<
" is not connected. Skipping it";
197 }
catch (
const std::out_of_range& e) {
198 LOG(debug) <<
"BmnFHCalRaw2Digit:: GetCalibPairFromAddress " << std::bitset<32>(address)
199 <<
" is marked badly in calibration file.";
206 LOG(debug) <<
"BmnFHCalRaw2Digit::fillEvent";
212 if (!catch_address.has_value())
214 auto address = catch_address.value();
219 if (!catch_calib.has_value())
221 auto calib_pair = catch_calib.value();
230 LOG(debug4) <<
"BmnFHCalRaw2Digit::ProcessWfm Calibration";
char * Form(const char *fmt,...)
uint32_t GetSerial() const
vector< IntType > & GetValue()
uint16_t GetChannel() const
void SetAddress(uint32_t address)
void SetSignal(double signal)
int fIntegral
ZeroLevel from waveform [adc counts].
static uint32_t GetModuleId(uint32_t address)
Return Module id from address.
static uint32_t GetSectionId(uint32_t address)
Return Section id from address.
static uint32_t GetAddress(uint32_t ModuleType, uint32_t ModuleId, uint32_t SectionId, uint32_t ScintillatorId=0)
Return address from system ID, Module type, Module ID, Section ID, Scintillator ID (optional).
Data class for Bmn FHCal digital signal processing.
void reset() override final
std::unordered_map< std::pair< size_t, size_t >, uint32_t, boost::hash< std::pair< size_t, size_t > > > fuoChannelMap
std::optional< uint32_t > GetAddressFromBoard(std::pair< size_t, size_t > key)
void FillEvent(TClonesArray *data, TClonesArray *FHCaldigit)
std::unordered_map< uint32_t, std::pair< float, float > > fuoCalibMap
TString fcalibrationFileName
void ParseConfig(TString mappingFile)
void ParseCalibration(TString calibrationFile)
std::optional< std::pair< float, float > > GetCalibPairFromAddress(uint32_t address)
void SetExternalHarmonics(std::vector< std::complex< float > > harmonics)
void Initialize(int model_order, int exponent_number, int gate_beg, int gate_end)
void MakeInvHarmoMatrix(int signal_length, std::complex< float > **output)
Int_t GetEntriesFast() const
TObject * At(Int_t idx) const override
const char * Data() const
std::complex< float > ** fAZik
struct WfmProcessor::digiPars fdigiPars
void ProcessWfm(std::vector< float > &wfm, BmnDigiContainerTemplate *digi)
RVec< PromoteType< T > > floor(const RVec< T > &v)
RVec< PromoteType< T > > log(const RVec< T > &v)