BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
rescaleAmplitude.C
Go to the documentation of this file.
1#include <Rtypes.h>
2#include <TCanvas.h>
3#include <TChain.h>
4#include <TClonesArray.h>
5#include <TFile.h>
6#include <TH2D.h>
7#include <TLegend.h>
8#include <TMathBase.h>
9#include <TString.h>
10#include <TTimeStamp.h>
11#include <vector>
12
13// #include "../../bmndata/math/BmnMath.h"
14
15// #include "../../bmndata/BmnStripDigit.h"
16
17R__ADD_INCLUDE_PATH($VMCWORKDIR)
18#include "macro/run/bmnloadlibs.C"
19
20/**
21 * rescaleAmplitudes
22 * Example of ADC signal rescaling procedures for GEM strip digits
23 * @param fileNameMC
24 * @param fileNameEx
25 * @param fileNameDST
26 */
27void rescaleAmplitude(TString fileNameMC, TString fileNameEx, TString fileNameDST)
28{
29 if (fileNameMC == "" || fileNameEx == "") {
30 cout << "Files need to be specified!" << endl;
31 return;
32 }
33 gStyle->SetOptStat(0);
34 Int_t ClusterSizeThr = 0;
35 Double_t lowThr = 0;
36 Int_t xBins = 400;
37 Double_t xLow = 0.0;
38 Double_t xUp = 2300.0;
39 Int_t nCSize = 5;
40 vector<EColor> cols = {kBlack, kBlue, kTeal, kViolet, kOrange};
41
42 bmnloadlibs(); // load libraries
43 // gSystem->Load("libBmnRecoTools");
44
45 // Load MC digits
46 TChain* chainMC = new TChain("bmndata");
47 chainMC->Add(fileNameMC.Data());
48 Long64_t NEventsMC = chainMC->GetEntries();
49 printf("#recorded MC entries = %lld\n", NEventsMC);
50 TClonesArray* gemMC = nullptr;
51 chainMC->SetBranchAddress("BmnGemStripDigit", &gemMC);
52
53 // Load Exp digits
54 TChain* chainEx = new TChain("bmndata");
55 chainEx->Add(fileNameEx.Data());
56 Long64_t NEventsEx = chainEx->GetEntries();
57 printf("#recorded Exp entries = %lld\n", NEventsEx);
58 TClonesArray* gemEx = nullptr;
59 chainEx->SetBranchAddress("GEM", &gemEx);
60
61 // Load tracks
62 TChain* chainDST = new TChain("bmndata");
63 chainDST->Add(fileNameDST.Data());
64 Long64_t NEventsDST = chainDST->GetEntries();
65 printf("#recorded Track entries = %lld\n", NEventsDST);
66 TClonesArray* tracks = nullptr;
67 TClonesArray* gemTracks = nullptr;
68 TClonesArray* gemHits = nullptr;
69 chainDST->SetBranchAddress("BmnGlobalTrack", &tracks);
70 chainDST->SetBranchAddress("BmnGemTrack", &gemTracks);
71 chainDST->SetBranchAddress("BmnGemStripHit", &gemHits);
72
73 TF1* mc = BmnRecoTools::GetSignalDistribution(chainMC, gemMC, nullptr, nullptr, nullptr, nullptr, lowThr, 0, 2e6);
74 TF1* ex = BmnRecoTools::GetSignalDistribution(chainEx, gemEx, chainDST, gemHits, gemTracks, tracks, 0,
75 ClusterSizeThr, 2e6);
76 TF1* funcRescale = BmnRecoTools::GetRescaleFunc(TString("RescaleGEM"), mc, ex);
77 printf("rescaling func created\n");
78
79 TString title = "GEM MC Rescaled";
80 TH1D* hGemMC = new TH1D("mc", title, xBins, xLow, xUp);
81 title = "GEM Exp ";
82 TH1D* hGemEx = new TH1D("digs", title, xBins, xLow, xUp);
83 title = "GEM Exp Hits' Digits";
84 TH1D* hGemExHits = new TH1D("digs-hits", title, xBins, xLow, xUp);
85 title = "GEM Exp Cluster Signal Lower";
86 TH1D* hGemExCS = new TH1D("cluster-signal-upper", title, xBins, xLow, xUp);
87 title = "GEM Exp Tracks' Digits";
88 TH1D* hGemExTracks = new TH1D("digs-tracks", title, xBins, xLow, xUp);
89 vector<TH1D*> hGemCluster;
90 for (Int_t i = 0; i < nCSize; i++) {
91 title = "GEM Cluster Size";
92 TH1D* h = new TH1D(Form("gem csize %.d", i), title, xBins, xLow, 1000);
93 hGemCluster.push_back(h);
94 }
95
96 for (Long64_t iEv = 0; iEv < NEventsEx; ++iEv) {
97 DrawBar((UInt_t)iEv, (UInt_t)NEventsEx);
98 chainEx->GetEntry(iEv);
99 chainDST->GetEntry(iEv);
100 /** summ strip signals */
101
102 /** digs all*/
103 for (UInt_t iDig = 0; iDig < gemEx->GetEntriesFast(); iDig++) {
104 BmnStripDigit* dig = (BmnStripDigit*)gemEx->At(iDig);
105 Double_t signal = dig->GetStripSignal();
106 dig->SetName(""); // clear marks
107 hGemEx->Fill(signal);
108 }
109
110 /** digs from hits*/
111 for (Int_t iHit = 0; iHit < gemHits->GetEntriesFast(); iHit++) {
112 BmnGemStripHit* hit = (BmnGemStripHit*)gemHits->UncheckedAt(iHit);
113 // fill cluster signal for different cluster sizes
114 hGemCluster[0]->Fill(hit->GetStripTotalSignalInLowerLayer());
115 Int_t csize = hit->GetClusterSizeInLowerLayer();
116 if (csize < hGemCluster.size())
117 hGemCluster[csize]->Fill(hit->GetStripTotalSignalInLowerLayer());
118 if (hit->GetClusterSizeInLowerLayer() <= ClusterSizeThr)
119 continue;
120 hGemExCS->Fill(hit->GetStripTotalSignalInLowerLayer());
121
123 const vector<BmnLink> links = match.GetLinks();
124 // printf("\t event %lld ihit %d: links = %d digi entries = %d\n",
125 // iEv, iHit, links.size(), gemEx->GetEntriesFast());
126 for (const BmnLink& link : links) {
127 if (link.GetIndex() > (gemEx->GetEntriesFast() - 1)) {
128 printf("Warning in event %lld hit %d! Hits Link index out of range! index = %d entries %d\n", iEv,
129 iHit, link.GetIndex(), gemEx->GetEntriesFast());
130 continue;
131 }
132 BmnStripDigit* dig = (BmnStripDigit*)gemEx->At(link.GetIndex());
133 if (strcmp(dig->GetName(), ""))
134 continue;
135 dig->SetName("used");
136 hGemExHits->Fill(dig->GetStripSignal());
137 }
138 }
139 // clear marks
140 for (UInt_t iDig = 0; iDig < gemEx->GetEntriesFast(); iDig++) {
141 BmnStripDigit* dig = (BmnStripDigit*)gemEx->At(iDig);
142 dig->SetName("");
143 }
144
145 /** digs from tracks*/
146 for (Int_t iTrack = 0; iTrack < tracks->GetEntriesFast(); iTrack++) {
147 BmnGlobalTrack* track = (BmnGlobalTrack*)tracks->UncheckedAt(iTrack);
148 if (track->GetGemTrackIndex() != -1) {
149 // for (Int_t iTrack = 0; iTrack < gemTrack->GetEntriesFast(); iTrack++) {
150 BmnTrack* gemTr = (BmnTrack*)gemTracks->UncheckedAt(track->GetGemTrackIndex());
151 for (Int_t iHit = 0; iHit < gemTr->GetNHits(); iHit++) {
152 BmnGemStripHit* hit = (BmnGemStripHit*)gemHits->UncheckedAt(gemTr->GetHitIndex(iHit));
153
155 const vector<BmnLink> links = match.GetLinks();
156 for (const BmnLink& link : links) {
157 if (link.GetIndex() > (gemEx->GetEntriesFast() - 1)) {
158 printf("Warning in event %lld!Tracks Link index out of range! index = %d entries %d\n",
159 iEv, link.GetIndex(), gemEx->GetEntriesFast());
160 continue;
161 }
162 BmnStripDigit* dig = (BmnStripDigit*)gemEx->At(link.GetIndex());
163 hGemExTracks->Fill(dig->GetStripSignal());
164 }
165 }
166 // }
167 }
168 }
169 }
170 printf("Exp histograms filled\n");
171
172 title = "GEM-rescaled";
173 TCanvas* can = new TCanvas(title, title, 1600, 900);
174 can->SetLogy();
175 hGemEx->SetLineColor(kBlack);
176 if (hGemEx->Integral() > 0)
177 hGemEx->Scale(1 / hGemEx->Integral());
178 hGemEx->SetMinimum(8e-5);
179 hGemEx->SetMaximum(1.2e-1);
180 hGemEx->Draw();
181 hGemExHits->SetLineColor(kBlue);
182 // hGemExHits->DrawNormalized("same");
183 hGemExCS->SetLineColor(kViolet);
184 hGemExCS->DrawNormalized("same");
185 hGemExTracks->SetLineColor(kTeal);
186 // hGemExTracks->DrawNormalized("same");
187
188 for (Long64_t iEv = 0; iEv < NEventsMC; ++iEv) {
189 DrawBar((UInt_t)iEv, (UInt_t)NEventsMC);
190 chainMC->GetEntry(iEv);
191 /** summ strip signals */
192 for (UInt_t iDig = 0; iDig < gemMC->GetEntriesFast(); iDig++) {
193 BmnStripDigit* dig = (BmnStripDigit*)gemMC->At(iDig);
194 if (dig->GetStripSignal() <= lowThr)
195 continue;
196 // if (dig->GetStripSignal() > 2)
197 // continue;
198 Double_t signal = funcRescale->Eval(dig->GetStripSignal());
199 hGemMC->Fill(signal);
200 }
201 }
202 printf("MC histogram filled\n");
203 hGemMC->SetLineColor(kRed);
204 hGemMC->DrawNormalized("same");
205
206 auto legend = new TLegend(0.6, 0.65, 0.8, 0.9);
207 legend->SetHeader("The Legend", "C");
208 legend->AddEntry(hGemEx, "All digits"); // lpfe
209 // legend->AddEntry(hGemExHits, "Digits from hits");
210 legend->AddEntry(hGemExCS, "Cluster signal lower");
211 // legend->AddEntry(hGemExTracks, "Digits from tracks");
212 legend->AddEntry(hGemMC, "MC rescaled by all exp digits");
213 legend->Draw();
214
215 can->Print(Form("%s-th-%.1f-cs-%d-Lower-2m2m.pdf", can->GetName(), lowThr, ClusterSizeThr));
216 can->Clear();
217
218 can->SetLogy(kFALSE);
219 auto legendCluster = new TLegend(0.6, 0.65, 0.8, 0.9);
220 for (Int_t i = 0; i < nCSize; i++) {
221 hGemCluster[i]->SetLineColor(cols[i]);
222 hGemCluster[i]->Draw(i == 0 ? "" : "same");
223 legendCluster->AddEntry(hGemCluster[i], hGemCluster[i]->GetName());
224 }
225 legendCluster->Draw();
226 can->Print(Form("%s-cluster-Lower.pdf", can->GetName()));
227 can->Clear();
228
229 delete can;
230 delete hGemEx;
231 delete hGemExHits;
232 delete hGemExTracks;
233 delete hGemMC;
234 delete legend;
235 delete legendCluster;
236 delete chainMC;
237 delete chainEx;
238}
void DrawBar(UInt_t iEv, UInt_t nEv)
Definition BmnMath.cxx:940
TCanvas * can(nullptr)
int i
Definition P4_F32vec4.h:22
int Int_t
unsigned int UInt_t
constexpr Bool_t kFALSE
double Double_t
long long Long64_t
#define R__ADD_INCLUDE_PATH(PATH)
kTeal
kRed
kOrange
kBlack
kBlue
kViolet
char * Form(const char *fmt,...)
R__EXTERN TStyle * gStyle
Int_t GetClusterSizeInLowerLayer()
Double_t GetStripTotalSignalInLowerLayer()
Strip layer characteristics of the hit (total signal, cluster size, strip position as the cluster mea...
BmnGlobalTrack.h.
Int_t GetGemTrackIndex() const
Accessors.
BmnMatch GetDigitNumberMatch()
Definition BmnHit.h:43
static TF1 * GetSignalDistribution(TTree *tree, TClonesArray *ar, TTree *treeDST=nullptr, TClonesArray *gemHits=nullptr, TClonesArray *gemTracks=nullptr, TClonesArray *tracks=nullptr, Double_t lowThr=0, Int_t ClusterSizeThr=0, Int_t nBins=100000)
static TF1 * GetRescaleFunc(TString name, TF1 *mc, TF1 *ex)
Class BmnStripDigit Base class for strip detector digits.
Double_t GetStripSignal()
Int_t GetNHits() const
Accessors.
Definition BmnTrack.h:49
Int_t GetHitIndex(Int_t iHit) const
Definition BmnTrack.h:51
virtual void SetLineColor(Color_t lcolor)
Int_t SetBranchAddress(const char *bname, T **add, TBranch **ptr=nullptr)
virtual Int_t Add(const char *name, Long64_t nentries=TTree::kMaxEntries)
Long64_t GetEntries() const override
Int_t GetEntry(Long64_t entry=0, Int_t getall=0) override
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
virtual TH1 * DrawNormalized(Option_t *option="", Double_t norm=1) const
virtual void SetMaximum(Double_t maximum=-1111)
void Draw(Option_t *option="") override
virtual Int_t Fill(const char *name, Double_t w)
virtual void SetMinimum(Double_t minimum=-1111)
virtual Double_t Integral(Int_t binx1, Int_t binx2, Option_t *option="") const
virtual void Scale(Double_t c1=1, Option_t *option="")
const char * GetName() const override
virtual void SetName(const char *name)
Int_t GetEntriesFast() const
TObject * At(Int_t idx) const override
TObject * UncheckedAt(Int_t i) const
const char * Data() const
void rescaleAmplitude(TString fileNameMC, TString fileNameEx, TString fileNameDST)
rescaleAmplitudes Example of ADC signal rescaling procedures for GEM strip digits