BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
calibrate_wfm.cpp
Go to the documentation of this file.
1#include "TCutG.h"
2
3#include <TCanvas.h>
4#include <TF1.h>
5#include <TFile.h>
6#include <TGraph.h>
7#include <TH1F.h>
8#include <TNtuple.h>
9#include <TTree.h>
10#include <algorithm>
11#include <fstream>
12#include <iostream>
13#include <map>
14#include <numeric>
15#include <stdio.h>
16#include <vector>
17// #include "utils.h"
18#include "TH1D.h"
19#include "TH2.h"
20#include "TMultiGraph.h"
21#include "TString.h"
22#include "TStyle.h"
23
24void calibrate_wfm(TString converted_root_file,
25 TString branch_name,
26 TString calib_file,
27 int max_events_show,
28 int max_entries)
29{
30 // ##################################
31 const int model_order = 2;
32 const int exponents = 2;
33 // ##################################
34
35 std::vector<TH2F*> harmHistVect;
36 harmHistVect.resize(exponents);
37 for (int i = 0; i < exponents; i++)
38 harmHistVect.at(i) = new TH2F(Form("harmonic%i", i + 1), Form("harmonic%i", i + 1), 100, 0, 1, 100, -1, 1);
39
40 TFile* _file0 = TFile::Open(converted_root_file, "READONLY");
41 TTree* tree = (TTree*)_file0->Get("bmndata");
42
43 TClonesArray* DigiArray = nullptr; // leave nullptr!!!
44 tree->SetBranchAddress(branch_name, &DigiArray);
45
46 // TODO think about parameter handling
48 auto digiPars = Mm->GetDigiPars();
49 delete Mm;
50 if (branch_name.Contains("ScWall")) {
52 Mapper->ParseCalibration(calib_file);
53 digiPars = Mapper->GetDigiPars();
54 delete Mapper;
55 } else if (branch_name.Contains("FHCal")) {
57 Mapper->ParseCalibration(calib_file);
58 digiPars = Mapper->GetDigiPars();
59 delete Mapper;
60 } else if (branch_name.Contains("Hodo")) {
61 BmnHodoRaw2Digit* Mapper = new BmnHodoRaw2Digit();
62 Mapper->ParseCalibration(calib_file);
63 digiPars = Mapper->GetDigiPars();
64 delete Mapper;
65 } else if (branch_name.Contains("Ndet")) {
66 BmnNdetRaw2Digit* Mapper = new BmnNdetRaw2Digit();
67 Mapper->ParseCalibration(calib_file);
68 digiPars = Mapper->GetDigiPars();
69 delete Mapper;
70 } else if (branch_name.Contains("Ndet")) {
71 BmnNdetRaw2Digit* Mapper = new BmnNdetRaw2Digit();
72 Mapper->ParseCalibration(calib_file);
73 digiPars = Mapper->GetDigiPars();
74 delete Mapper;
75 }
76
77 int counter = 0;
78 int n_events = (tree->GetEntries() > max_entries) ? max_entries : tree->GetEntries();
79 cout << n_events << endl;
80 for (int ev = 0; ev < n_events; ev++) ////nt1->GetEntries() //get entries from .root
81 {
82 tree->GetEntry(ev);
83 for (int i = 0; i < DigiArray->GetEntriesFast(); i++) {
84 BmnDigiContainerTemplate* ThisDigi = (BmnDigiContainerTemplate*)DigiArray->At(i);
85 auto wfm = ThisDigi->GetWfm();
86 if (wfm.empty())
87 continue;
88
89 // ##################################
90 // SELECTION
91 // if(BmnHodoAddress::GetStripId(ThisDigi->GetAddress()) == 9) continue;
92 // if(BmnScWallAddress::GetCellId(ThisDigi->GetAddress()) == 29) continue;
93 // if(BmnScWallAddress::GetCellId(ThisDigi->GetAddress()) == 40) continue;
94 // if(BmnScWallAddress::GetCellId(ThisDigi->GetAddress()) == 112) continue;
95 // ##################################
96
97 PsdSignalFitting::PronyFitter Pfitter(model_order, exponents, digiPars.gateBegin, digiPars.gateEnd);
98 // Pfitter.SetDebugMode(1);
99 Pfitter.SetWaveform(wfm, ThisDigi->fZL);
100 int best_signal_begin = Pfitter.ChooseBestSignalBeginHarmonics(digiPars.gateBegin, ThisDigi->fTimeMax);
101 complex<float>* harmonics;
102 Pfitter.SetSignalBegin(best_signal_begin);
103 Pfitter.CalculateFitHarmonics();
104 Pfitter.CalculateFitAmplitudes();
105 harmonics = Pfitter.GetHarmonics();
106 Float_t fit_integral = Pfitter.GetIntegral(digiPars.gateBegin, digiPars.gateEnd);
107 Float_t fit_chi2 = Pfitter.GetChiSquare(digiPars.gateBegin, digiPars.gateEnd, ThisDigi->fTimeMax);
108 Float_t fit_R2 = Pfitter.GetRSquare(digiPars.gateBegin, digiPars.gateEnd);
109 if (false)
110 printf("fit integral %.0f integral %.0d chi2 %.1f R2 %.3f\n", fit_integral, ThisDigi->fIntegral,
111 fit_chi2, fit_R2);
112 auto fit_wfm = Pfitter.GetFitWfm();
113
114 if (fit_R2 < 0.05) {
115 counter++;
116 for (int i = 0; i < exponents; i++)
117 harmHistVect.at(i)->Fill(real(harmonics[i + 1]), imag(harmonics[i + 1]));
118
119 // ##################################
120 TString signal_name = Form("channel %i fit_integral %.0f integral %.0d chi2 %.1f fit_R2 %.3f",
121 BmnFHCalAddress::GetModuleId(ThisDigi->GetAddress()), fit_integral,
122 ThisDigi->fIntegral, fit_chi2, fit_R2);
123 // ##################################
124
125 if (counter > max_events_show)
126 continue;
127 TCanvas* canv_ptr = new TCanvas();
128 std::vector<float> points(wfm.size());
129 std::iota(std::begin(points), std::end(points), 0); // Fill with 0, 1, ..., wfm.back().
130 TGraph* tgr_ptr = new TGraph(wfm.size(), &points[0], &wfm[0]);
131 tgr_ptr->SetTitle(signal_name.Data());
132 tgr_ptr->Draw();
133 if (!fit_wfm.empty()) {
134 TGraph* tgr_ptr_fit = new TGraph(fit_wfm.size(), &points[0], &fit_wfm[0]);
135 tgr_ptr_fit->SetLineColor(kRed);
136 tgr_ptr_fit->SetLineWidth(2);
137 tgr_ptr_fit->Draw("same");
138 }
139 }
140 }
141 }
142
143 for (int i = 0; i < exponents; i++) {
144 TCanvas* canv_ptr = new TCanvas();
145 harmHistVect.at(i)->Draw("colz");
146 }
147}
int i
Definition P4_F32vec4.h:22
float Float_t
kRed
char * Form(const char *fmt,...)
Data class for Bmn digi container template.
int fZL
Amplitude from waveform [adc counts].
std::vector< float > GetWfm() const
Waveform.
int fTimeMax
Energy deposition from waveform [adc counts].
int fIntegral
ZeroLevel from waveform [adc counts].
static uint32_t GetModuleId(uint32_t address)
Return Module id from address.
void ParseCalibration(TString calibrationFile)
BmnStatus ParseCalibration(const std::string &file)
void ParseCalibration(TString calibrationFile)
BmnStatus ParseCalibration(const std::string &file)
void SetSignalBegin(int SignalBeg)
float GetRSquare(int gate_beg, int gate_end)
void SetWaveform(std::vector< float > &Wfm, float ZeroLevel)
std::complex< float > * GetHarmonics()
int ChooseBestSignalBeginHarmonics(int first_sample, int last_sample)
float GetChiSquare(int gate_beg, int gate_end, int time_max)
std::vector< float > GetFitWfm()
Definition PronyFitter.h:88
float GetIntegral(int gate_beg, int gate_end)
virtual void SetLineWidth(Width_t lwidth)
virtual void SetLineColor(Color_t lcolor)
T * Get(const char *namecycle)
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
void Draw(Option_t *chopt="") override
void SetTitle(const char *title="") override
Int_t GetEntriesFast() const
TObject * At(Int_t idx) const override
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual Int_t GetEntry(Long64_t entry, Int_t getall=0)
virtual Long64_t GetEntries() const
Int_t SetBranchAddress(const char *bname, T **add, TBranch **ptr=nullptr)
void calibrate_wfm(TString converted_root_file, TString branch_name, TString calib_file, int max_events_show, int max_entries)