BmnRoot
Loading...
Searching...
No Matches
calibrate_wfm.cpp
Go to the documentation of this file.
1#include <iostream>
2#include <fstream>
3#include <vector>
4#include <TFile.h>
5#include <TNtuple.h>
6#include <TGraph.h>
7#include <TF1.h>
8#include <TTree.h>
9#include <TCanvas.h>
10#include <TH1F.h>
11#include "TCutG.h"
12#include <algorithm>
13#include <fstream>
14#include <iostream>
15#include <map>
16#include <numeric>
17#include <stdio.h>
18//#include "utils.h"
19#include "TString.h"
20#include "TH1D.h"
21#include "TMultiGraph.h"
22#include "TStyle.h"
23#include "TH2.h"
24
25
26void calibrate_wfm(TString converted_root_file, TString branch_name, TString calib_file, int max_events_show, int max_entries)
27{
28 //##################################
29 const int model_order = 2;
30 const int exponents = 2;
31 //##################################
32
33 std::vector<TH2F*> harmHistVect;
34 harmHistVect.resize(exponents);
35 for(int i =0; i < exponents; i++)
36 harmHistVect.at(i) = new TH2F(Form("harmonic%i", i+1),Form("harmonic%i", i+1), 100,0,1,100,-1,1);
37
38 TFile *_file0 = TFile::Open(converted_root_file, "READONLY");
39 TTree *tree = (TTree *)_file0->Get("bmndata");
40
41 TClonesArray *DigiArray = nullptr; //leave nullptr!!!
42 tree->SetBranchAddress(branch_name, &DigiArray);
43
44 // TODO think about parameter handling
46 auto digiPars = Mm->GetDigiPars();
47 delete Mm;
48 if (branch_name.Contains("ScWall")) {
50 Mapper->ParseCalibration(calib_file);
51 digiPars = Mapper->GetDigiPars();
52 delete Mapper;
53 }
54 else if (branch_name.Contains("FHCal")) {
56 Mapper->ParseCalibration(calib_file);
57 digiPars = Mapper->GetDigiPars();
58 delete Mapper;
59 }
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 }
66 else if (branch_name.Contains("Ndet")) {
67 BmnNdetRaw2Digit *Mapper = new BmnNdetRaw2Digit();
68 Mapper->ParseCalibration(calib_file);
69 digiPars = Mapper->GetDigiPars();
70 delete Mapper;
71 }
72 else if (branch_name.Contains("Ndet")) {
73 BmnNdetRaw2Digit *Mapper = new BmnNdetRaw2Digit();
74 Mapper->ParseCalibration(calib_file);
75 digiPars = Mapper->GetDigiPars();
76 delete Mapper;
77 }
78
79 int counter = 0;
80 int n_events = (tree->GetEntries() > max_entries)? max_entries : tree->GetEntries();
81 cout << n_events << endl;
82 for (int ev = 0; ev < n_events; ev++)
83 {
84 tree->GetEntry(ev);
85 for (int i = 0; i < DigiArray->GetEntriesFast(); i++)
86 {
87 BmnDigiContainerTemplate *ThisDigi = (BmnDigiContainerTemplate *)DigiArray->At(i);
88 auto wfm = ThisDigi->GetWfm();
89 if(wfm.empty()) continue;
90
91 //##################################
92 //SELECTION
93 //if(BmnHodoAddress::GetStripId(ThisDigi->GetAddress()) == 9) continue;
94 //if(BmnScWallAddress::GetCellId(ThisDigi->GetAddress()) == 29) continue;
95 //if(BmnScWallAddress::GetCellId(ThisDigi->GetAddress()) == 40) continue;
96 //if(BmnScWallAddress::GetCellId(ThisDigi->GetAddress()) == 112) continue;
97 //##################################
98
99 PsdSignalFitting::PronyFitter Pfitter(model_order, exponents, digiPars.gateBegin, digiPars.gateEnd);
100 //Pfitter.SetDebugMode(1);
101 Pfitter.SetWaveform(wfm, ThisDigi->fZL);
102 int best_signal_begin = Pfitter.ChooseBestSignalBeginHarmonics(digiPars.gateBegin, ThisDigi->fTimeMax);
103 complex<float> *harmonics;
104 Pfitter.SetSignalBegin(best_signal_begin);
105 Pfitter.CalculateFitHarmonics();
106 Pfitter.CalculateFitAmplitudes();
107 harmonics = Pfitter.GetHarmonics();
108 Float_t fit_integral = Pfitter.GetIntegral(digiPars.gateBegin, digiPars.gateEnd);
109 Float_t fit_chi2 = Pfitter.GetChiSquare(digiPars.gateBegin, digiPars.gateEnd, ThisDigi->fTimeMax);
110 Float_t fit_R2 = Pfitter.GetRSquare(digiPars.gateBegin, digiPars.gateEnd);
111 if(false) printf("fit integral %.0f integral %.0d chi2 %.1f R2 %.3f\n", fit_integral, ThisDigi->fIntegral, fit_chi2, fit_R2);
112 auto fit_wfm = Pfitter.GetFitWfm();
113
114 if(fit_R2<0.05)
115 {
116 counter++;
117 for(int i =0; i < exponents; i++)
118 harmHistVect.at(i)->Fill(real(harmonics[i+1]), imag(harmonics[i+1]));
119
120 //##################################
121 TString signal_name = Form("channel %i fit_integral %.0f integral %.0d chi2 %.1f fit_R2 %.3f",
122 BmnFHCalAddress::GetModuleId(ThisDigi->GetAddress()), fit_integral, ThisDigi->fIntegral, fit_chi2, fit_R2);
123 //##################################
124
125 if(counter > max_events_show) continue;
126 TCanvas *canv_ptr = new TCanvas();
127 std::vector<float> points(wfm.size());
128 std::iota(std::begin(points), std::end(points), 0); // Fill with 0, 1, ..., wfm.back().
129 TGraph *tgr_ptr = new TGraph(wfm.size(), &points[0], &wfm[0]);
130 tgr_ptr->SetTitle(signal_name.Data());
131 tgr_ptr->Draw();
132 if(!fit_wfm.empty()){
133 TGraph *tgr_ptr_fit = new TGraph(fit_wfm.size(), &points[0], &fit_wfm[0]);
134 tgr_ptr_fit->SetLineColor(kRed);
135 tgr_ptr_fit->SetLineWidth(2);
136 tgr_ptr_fit->Draw("same");
137 }
138
139 }
140
141 }
142 }
143
144 for(int i =0; i < exponents; i++){
145 TCanvas *canv_ptr = new TCanvas();
146 harmHistVect.at(i)->Draw("colz");
147 }
148
149}
int i
Definition P4_F32vec4.h:22
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)
void ParseCalibration(const std::string &file)
void ParseCalibration(TString calibrationFile)
void ParseCalibration(TString calibrationFile)
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:87
float GetIntegral(int gate_beg, int gate_end)
void calibrate_wfm(TString converted_root_file, TString branch_name, TString calib_file, int max_events_show, int max_entries)