BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
simple_analysis.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// #include "BmnHodoDigi.h"
24#include "../common/utilites.h"
25#include "TClonesArray.h"
26
27#define kNstrips 16
28#define kNsides 2
29#define kNgains 2
30
31int make_flat_index(uint32_t StripId, uint32_t StripSide, uint32_t Gain)
32{
33 uint32_t address = BmnHodoAddress::GetAddress(0, StripId, StripSide, Gain);
34 return BmnHodoAddress::GetFlatIndex(address);
35}
36
37void simple_analysis(TString converted_root_file, TString result_file_name, int max_entries)
38{
39 TObjArray* canvas_array = new TObjArray;
40 canvas_array->SetName("Canvas");
41 TObjArray* result_array = new TObjArray;
42 result_array->SetName("Histo");
43
44 int variantes = BmnHodoAddress::GetMaxFlatIndex();
45 std::vector<TH1F*> signalHistVect;
46 signalHistVect.resize(variantes);
47
48 for (uint32_t i = 1; i < kNstrips + 1; i++)
49 for (uint32_t j = 0; j < kNsides; j++)
50 for (uint32_t k = 0; k < kNgains; k++) {
51 auto idx = make_flat_index(i, j, k);
52 TString side = (j == 0) ? "DOWN" : "UP";
53 TString gain = (k == 0) ? "LOW" : "HIGH";
54 TString name = Form("strip%i side %s gain %s", i, side.Data(), gain.Data());
55 signalHistVect.at(idx) = new TH1F(Form("variant%i", idx), name.Data(), 300, 0, 4);
56
57 // cout << idx << " " << name << endl;
58 }
59
60 TFile* _file0 = TFile::Open(converted_root_file, "READONLY");
61 TTree* tree = (TTree*)_file0->Get("bmndata");
62
63 TClonesArray* DigiArray = nullptr; // leave nullptr!!!
64 tree->SetBranchAddress("HodoDigi", &DigiArray);
65
66 int counter = 0;
67 int n_events = (max_entries > 0 && tree->GetEntries() > max_entries) ? max_entries : tree->GetEntries();
68 cout << n_events << endl;
69 for (int ev = 0; ev < n_events; ev++) ////nt1->GetEntries() //get entries from .root
70 {
71 tree->GetEntry(ev);
72 if (ev % 10000 == 0)
73 cout << "Event: " << ev << endl;
74 for (int i = 0; i < DigiArray->GetEntriesFast(); i++) {
75 BmnHodoDigi* ThisDigi = (BmnHodoDigi*)DigiArray->At(i);
76
77 // ##################################
78 // SELECTION
79 // if(ThisDigi->GetStripId() == 9) continue;
80 if (ThisDigi->fFitR2 > 0.55)
81 continue;
82 if (ThisDigi->fTimeMax > 27 || ThisDigi->fTimeMax < 23)
83 continue;
84 // ##################################
85
86 auto strip = ThisDigi->GetStripId();
87 auto side = ThisDigi->GetStripSide();
88 auto gain = ThisDigi->GetGain();
89 auto idx = make_flat_index(strip, side, gain);
90 double signal = ThisDigi->GetSignal();
91
92 signalHistVect.at(idx)->Fill(signal);
93
94 // if(strip == 4 && side == 1 && gain == 1) cout<<ThisDigi->GetSignal()/ThisDigi->fAmpl<<endl;
95 }
96 }
97
98 BmnHodoRaw2Digit* Mapper = new BmnHodoRaw2Digit();
99 Mapper->ParseCalibration("HODO_S_calibration_2022.txt");
100
101 TCanvas* canv_total = new TCanvas("total", "total", 1600, 1600);
102 canv_total->DivideSquare(64);
103 canvas_array->Add(canv_total);
104 int cnter = 0;
105 for (uint32_t i = 1; i < kNstrips + 1; i++)
106 for (uint32_t j = 0; j < kNsides; j++)
107 for (uint32_t k = 0; k < kNgains; k++) {
108 cnter++;
109 auto idx = make_flat_index(i, j, k);
110 TCanvas* canv_ptr = new TCanvas();
111 canv_ptr->SetLogy();
112 canvas_array->Add(canv_ptr);
113 // if(k == 0) continue;
114
115 double range_low, range_high;
116 // if(k == 0) { range_low = 500; range_high= 2000; }
117 // if(k == 1) { range_low = 2000; range_high= 10000; }
118 range_low = 15;
119 range_high = 30;
120 double mean, sigma;
121 FitHistogrammSmartInMaxPeak(signalHistVect.at(idx), mean, sigma, 3, range_low, range_high);
122 double adj_now = 23.0 / mean;
123 TString new_name = Form("%s MEAN %.5f", signalHistVect.at(idx)->GetTitle(), adj_now);
124 signalHistVect.at(idx)->SetTitle(new_name.Data());
125 result_array->Add(signalHistVect.at(idx));
126 signalHistVect.at(idx)->Draw();
127
128 canv_total->cd(cnter);
129 signalHistVect.at(idx)->Draw();
130
131 uint32_t address = BmnHodoAddress::GetAddress(0, i, j, k);
132 auto calib_pair = Mapper->GetCalibPairFromAddress(address);
133 double new_calib = calib_pair.first * adj_now;
134 printf("calib = Q %i %i %i %.5f 0.0\n", i, j, k, new_calib);
135 }
136
137 TFile* result_file = new TFile((result_file_name + ".root").Data(), "RECREATE");
138 TIter nx_iter((TCollection*)(result_array));
139 TObject* obj_ptr;
140 while ((obj_ptr = (TObjArray*)nx_iter())) {
141 if (obj_ptr == nullptr)
142 continue;
143 printf("Writing %s object\n", obj_ptr->GetName());
144 obj_ptr->Write();
145 }
146 printf("file %s was written\n", (result_file_name + ".root").Data());
147 result_file->Close();
148 delete result_file;
149
150 for (Int_t i = 0; i < canvas_array->GetLast(); i++)
151 ((TCanvas*)canvas_array->At(i))->SaveAs((result_file_name + ".pdf(").Data());
152 ((TCanvas*)canvas_array->At(canvas_array->GetLast()))->SaveAs((result_file_name + ".pdf)").Data());
153 printf("file %s was written\n", (result_file_name + ".pdf").Data());
154}
int i
Definition P4_F32vec4.h:22
int Int_t
char * Form(const char *fmt,...)
double GetSignal() const
float fFitR2
Energy deposition from fit of waveform [adc counts].
int fTimeMax
Energy deposition from waveform [adc counts].
static uint32_t GetAddress(uint32_t StripId, uint32_t StripSide, uint32_t Gain)
Return address from system ID, StripId, StripSide, Gain.
Data class for BmnHodo digital signal processing.
Definition BmnHodoDigi.h:25
uint32_t GetGain() const
Gain.
Definition BmnHodoDigi.h:70
uint32_t GetStripSide() const
Strip Side.
Definition BmnHodoDigi.h:65
uint32_t GetStripId() const
std::optional< std::pair< float, float > > GetCalibPairFromAddress(uint32_t address)
BmnStatus ParseCalibration(const std::string &file)
TVirtualPad * cd(Int_t subpadnumber=0) override
void SetName(const char *name)
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 Close(Option_t *option="") override
Int_t GetEntriesFast() const
TObject * At(Int_t idx) const override
Int_t GetLast() const override
void Add(TObject *obj) override
virtual const char * GetName() const
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
virtual void SaveAs(const char *filename="", Option_t *option="") const
virtual void DivideSquare(Int_t n, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0)
void SetLogy(Int_t value=1) override
const char * Data() 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 Draw(Option_t *option="") override=0
Int_t FitHistogrammSmartInMaxPeak(TH1 *histogramm, Double_t &mean, Double_t &sigma, Double_t nRMSfit=2., Double_t RangeXmin=0., Double_t RangeXmax=0.)
Definition utilites.h:457
#define kNstrips
#define kNgains
#define kNsides
int make_flat_index(uint32_t StripId, uint32_t StripSide, uint32_t Gain)
void simple_analysis(TString converted_root_file, TString result_file_name, int max_entries)