BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnDataAnalRun7.cxx
Go to the documentation of this file.
1#include "BmnDataAnalRun7.h"
2
5 , mAnal(nullptr)
6 , fAna(nullptr)
7 , fGeomFile("")
8 , fNFiles(0)
9{
10
11 mAnal = new BmnMassSpectrumAnal(dir);
12 fAna = new FairRunAna();
13}
14
16{
17 const Int_t nRes = 2;
18
19 for (Int_t iRes = 0; iRes < nRes; iRes++) {
20 for (Int_t iStat = 0; iStat < silicon->GetNStations(); iStat++)
21 for (Int_t iMod = 0; iMod < silicon->GetStation(iStat)->GetNModules(); iMod++)
22 hResSil[iRes][iStat][iMod]->Reset();
23
24 for (Int_t iStat = 0; iStat < gem->GetNStations(); iStat++)
25 for (Int_t iMod = 0; iMod < gem->GetStation(iStat)->GetNModules(); iMod++)
26 hResGem[iRes][iStat][iMod]->Reset();
27 }
28}
29
31{
32 const Int_t nRes = 2;
33
34 TFile* f = new TFile(out.Data(), "recreate");
35 for (Int_t iRes = 0; iRes < nRes; iRes++) {
36 for (Int_t iStat = 0; iStat < silicon->GetNStations(); iStat++)
37 for (Int_t iMod = 0; iMod < silicon->GetStation(iStat)->GetNModules(); iMod++) {
38 DoNormalization(hResSil[iRes][iStat][iMod]);
39 hResSil[iRes][iStat][iMod]->Write();
40 }
41
42 for (Int_t iStat = 0; iStat < gem->GetNStations(); iStat++)
43 for (Int_t iMod = 0; iMod < gem->GetStation(iStat)->GetNModules(); iMod++) {
44 DoNormalization(hResGem[iRes][iStat][iMod]);
45 hResGem[iRes][iStat][iMod]->Write();
46 }
47 }
48
49 delete f;
50}
51
53{
54 BmnEfficiency* eff = new BmnEfficiency(fAna, dst);
55
56 // Doing assignment ...
57 *(BmnEfficiency*)this = *eff;
58
59 cout << "Processing file# " << dst << endl;
60
61 for (Int_t iEvent = 0; iEvent < ((fNEvents == 0) ? dstChain->GetEntries() : fNEvents); iEvent++) {
62 dstChain->GetEntry(iEvent);
63
64 if (iEvent % 1000 == 0)
65 cout << "Event# " << iEvent << endl;
66
67 BmnVertex* Vp = (BmnVertex*)fVertices->UncheckedAt(0);
68
69 Double_t zVp = Vp->GetZ();
70 Int_t nTracks = Vp->GetNTracks();
71
72 if (TMath::Abs(zVp) > 6. || nTracks < 2)
73 continue;
74
75 // Loop over glob. tracks ...
76 for (Int_t iTrack = 0; iTrack < fGlobTracks->GetEntriesFast(); iTrack++) {
77 BmnGlobalTrack* track = (BmnGlobalTrack*)fGlobTracks->UncheckedAt(iTrack);
78
79 if (track->GetNHits() < fNHits)
80 continue;
81
82 // cout << "Track#" << endl;
83
84 vector<BmnHit> hits;
85
86 // Loop over silicon hits ...
87 if (track->GetSilTrackIndex() != -1) {
88 BmnTrack* silTrack = (BmnTrack*)fSiliconTracks->UncheckedAt(track->GetSilTrackIndex());
89
90 for (Int_t iHit = 0; iHit < silTrack->GetNHits(); iHit++) {
91 BmnHit* hit = (BmnHit*)fSiliconHits->UncheckedAt(silTrack->GetHitIndex(iHit));
92 hits.push_back(*hit);
93 }
94 }
95
96 // Loop over gem hits ...
97 if (track->GetGemTrackIndex() != -1) {
98 BmnTrack* gemTrack = (BmnTrack*)fGemTracks->UncheckedAt(track->GetGemTrackIndex());
99
100 for (Int_t iHit = 0; iHit < gemTrack->GetNHits(); iHit++) {
101 BmnHit* hit = (BmnHit*)fGemHits->UncheckedAt(gemTrack->GetHitIndex(iHit));
102 hits.push_back(*hit);
103 }
104 }
105
106 // Loop over collected track hits ...
107 for (auto it = hits.begin(); it != hits.end(); it++) {
108 BmnHit hit = *it;
109
110 Int_t stat = hit.GetStation();
111 Int_t mod = hit.GetModule();
112
113 Double_t Z = hit.GetZ();
114 TString det = (Z > 30.) ? "GEM" : "SILICON";
115
116 Double_t xOrig, yOrig = 0.;
117 doKalman(track, Z, xOrig, yOrig);
118
119 // Excluding current hit from the track connected hits ...
120 vector<BmnHit> hits0;
121
122 for (auto it1 = hits.begin(); it1 != hits.end(); it1++) {
123 if (it == it1)
124 continue;
125
126 hits0.push_back(*it1);
127 }
128
129 // Trying to update track. params and get resid. with the hit excluded at Z position of the hit excluded
130 // ...
131 Double_t xUpdated, yUpdated = 0.;
132 doKalman(track, hits0, Z, xUpdated, yUpdated);
133
134 // Filling histos ...
135 TH1F**** h = det.Contains("GEM") ? hResGem : hResSil;
136
137 h[0][stat][mod]->Fill(xOrig - xUpdated); // tr - fit
138 h[1][stat][mod]->Fill(yOrig - yUpdated);
139 }
140 }
141 }
142
143 delete eff;
144}
145
147{
148 const Int_t nRes = 2;
149
150 hResGem = new TH1F***[nRes];
151 hResSil = new TH1F***[nRes];
152
153 for (Int_t iRes = 0; iRes < nRes; iRes++) {
154 TString res = (iRes == 0) ? TString::Format("X").Data() : TString::Format("Y").Data();
155
156 // SILICON
157 hResSil[iRes] = new TH1F**[silicon->GetNStations()];
158 for (Int_t iStat = 0; iStat < silicon->GetNStations(); iStat++) {
159 hResSil[iRes][iStat] = new TH1F*[silicon->GetStation(iStat)->GetNModules()];
160
161 for (Int_t iMod = 0; iMod < silicon->GetStation(iStat)->GetNModules(); iMod++)
162 hResSil[iRes][iStat][iMod] =
163 new TH1F(Form("SILICON, Res %s, Stat %d, Mod %d", res.Data(), iStat, iMod),
164 Form("SILICON, Res %s, Stat %d, Mod %d", res.Data(), iStat, iMod), 200, -1., +1.);
165 }
166
167 // GEM
168 hResGem[iRes] = new TH1F**[gem->GetNStations()];
169 for (Int_t iStat = 0; iStat < gem->GetNStations(); iStat++) {
170 hResGem[iRes][iStat] = new TH1F*[gem->GetStation(iStat)->GetNModules()];
171
172 for (Int_t iMod = 0; iMod < gem->GetStation(iStat)->GetNModules(); iMod++)
173 hResGem[iRes][iStat][iMod] =
174 new TH1F(Form("GEM, Res %s, Stat %d, Mod %d", res.Data(), iStat, iMod),
175 Form("GEM, Res %s, Stat %d, Mod %d", res.Data(), iStat, iMod), 200, -1., +1.);
176 }
177 }
178
179 // Setting inn. tracker geometry ...
180 if (fGeomFile.IsNull())
181 Fatal("BmnDataAnalRun7::doResidAnal()", "No geometry file passed!!!");
182 else
184
185 vector<TString> fList;
186
187 // Processing monte Carlo if needed and passed ...
188 if (!fMcDataPath.IsNull()) {
189 resetHistos(); // Not needed but for sure since it is fast:)
191
192 fList = mcAnal->GetFileList();
193
194 for (auto itFile = fList.begin(); itFile != fList.end(); itFile++) {
195 if (fNFiles && distance(fList.begin(), itFile) == fNFiles)
196 break;
197
198 calcResiduals(*itFile);
199 }
200
201 writeHistos("residMc.root");
202
203 delete mcAnal;
204 }
205
206 // Setting necessary target / targets ...
207 mAnal->SetTarget(fTarget);
208
209 fList = mAnal->createFilelist();
210 if (!fNFiles)
211 fNFiles = fList.size();
212
213 // Processing data ...
214 resetHistos();
215 for (auto itFile = fList.begin(); itFile != fList.end(); itFile++) {
216 if (fNFiles && distance(fList.begin(), itFile) == fNFiles)
217 break;
218
219 calcResiduals(*itFile);
220 }
221
222 // Writing histos ...
223 writeHistos(TString::Format("residData_%s.root", fTarget.Data()));
224}
225
227{
228 FairTrackParam* first = track->GetParamFirst();
229 FairTrackParam* last = track->GetParamLast();
230
231 FairTrackParam par = *first;
232 BmnStatus status = fKalman->TGeoTrackPropagate(&par, Z, last->GetQp() > 0. ? 2212 : -211, nullptr, nullptr, kTRUE);
233 if (status == kBMNSUCCESS) {
234 xOrig = par.GetX();
235 yOrig = par.GetY();
236 }
237}
238
240 vector<BmnHit> hits,
241 Double_t Z,
242 Double_t& xUpdated,
243 Double_t& yUpdated)
244{
245
246 FairTrackParam* first = track->GetParamFirst();
247 FairTrackParam* last = track->GetParamLast();
248
249 FairTrackParam par = *first;
250
251 // Updating track params ...
252 for (BmnHit hit : hits) {
253 BmnStatus status =
254 fKalman->TGeoTrackPropagate(&par, hit.GetZ(), last->GetQp() > 0. ? 2212 : -211, nullptr, nullptr, kTRUE);
255 if (status == kBMNERROR)
256 continue;
257
258 Double_t chi2 = 0.;
259 fKalman->Update(&par, &hit, chi2);
260 }
261
262 // Prediction at Z of the excluded hit ...
263 if (fKalman->TGeoTrackPropagate(&par, Z, last->GetQp() > 0. ? 2212 : -211, nullptr, nullptr, kTRUE) == kBMNSUCCESS)
264 {
265 xUpdated = par.GetX();
266 yUpdated = par.GetY();
267 }
268}
269
271{
272 if (h->GetEntries() == 0)
273 return;
274
275 // Collecting all bin contents ...
276 Double_t contentAll = 0.;
277
278 for (Int_t iBin = 1; iBin < h->GetNbinsX() + 1; iBin++)
279 contentAll += h->GetBinContent(iBin);
280
281 // Normalizing histo ...
282 for (Int_t iBin = 1; iBin < h->GetNbinsX() + 1; iBin++) {
283 h->SetBinContent(iBin, h->GetBinContent(iBin) / contentAll);
284 h->SetBinError(iBin, 0.);
285 }
286
287 h->GetYaxis()->SetRangeUser(0., 1.1 * h->GetMaximum());
288}
int Int_t
double Double_t
constexpr Bool_t kTRUE
char * Form(const char *fmt,...)
BmnStatus
Define status code.
Definition BmnEnums.h:93
@ kBMNERROR
Error.
Definition BmnEnums.h:95
@ kBMNSUCCESS
Success.
Definition BmnEnums.h:94
void calcResiduals(TString)
BmnMassSpectrumAnal * mAnal
void writeHistos(TString)
FairRunAna * fAna
void doKalman(BmnGlobalTrack *, Double_t, Double_t &, Double_t &)
void DoNormalization(TH1F *)
BmnKalmanFilter * fKalman
BmnGemStripStationSet * gem
TClonesArray * fSiliconTracks
BmnSiliconStationSet * silicon
TClonesArray * fGemTracks
TClonesArray * fVertices
TClonesArray * fGemHits
TClonesArray * fSiliconHits
TChain * dstChain
TClonesArray * fGlobTracks
BmnGlobalTrack.h.
Int_t GetGemTrackIndex() const
Accessors.
Int_t GetModule()
Definition BmnHit.h:36
Short_t GetStation() const
Definition BmnHit.h:35
vector< TString > GetFileList()
FairTrackParam * GetParamFirst()
Definition BmnTrack.h:63
Int_t GetNHits() const
Accessors.
Definition BmnTrack.h:49
Int_t GetHitIndex(Int_t iHit) const
Definition BmnTrack.h:51
FairTrackParam * GetParamLast()
Definition BmnTrack.h:65
Int_t GetNTracks() const
Definition BmnVertex.h:60
Double_t GetZ() const
Definition BmnVertex.h:57
virtual void SetRangeUser(Double_t ufirst, Double_t ulast)
static TGeoManager * Import(const char *filename, const char *name="", Option_t *option="")
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
virtual Int_t GetNbinsX() const
virtual void SetBinError(Int_t bin, Double_t error)
TAxis * GetYaxis()
virtual Int_t Fill(const char *name, Double_t w)
virtual void SetBinContent(Int_t bin, Double_t content)
virtual Double_t GetEntries() const
virtual Double_t GetBinContent(Int_t bin) const
virtual void Fatal(const char *method, const char *msgfmt,...) const
const char * Data() const
static TString Format(const char *fmt,...)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Double_t Abs(Double_t d)