10#include <TClonesArray.h>
20#include <TStopwatch.h>
22#include <FairMCEventHeader.h>
23#include <DigiRunHeader.h>
31#include <BmnEventHeader.h>
32#include <DstEventHeader.h>
33#include <BmnSiliconDigit.h>
34#include <BmnGemStripDigit.h>
35#include <BmnCSCDigit.h>
36#include <BmnSiliconHit.h>
37#include <BmnGemStripHit.h>
39#include <BmnGlobalTrack.h>
41#include "BmnGemStripStationSet.h"
42#include "BmnSiliconStationSet.h"
43#include "BmnCSCStationSet.h"
44#include "BmnGemStripConfiguration.h"
45#include "BmnGemStripStationSet_RunSpring2017.h"
46#include "BmnGemStripStationSet_RunSummer2016.h"
47#include "BmnGemStripStationSet_RunWinter2016.h"
99 UInt_t periodId, UInt_t runId,
101 Double_t ClusterSizeThr = 0,
109 return fStripGemRescale;
113 return fStripSilRescale;
117 return fStripCSCRescale;
121 return fStripGemInfoEx;
125 return fStripSilInfoEx;
129 return fStripCSCInfoEx;
137 static const UInt_t Pad_Width = 640;
138 static const UInt_t Pad_Height = 360;
143 Double_t fClusterSizeThr;
150 vector<vector<vector<BmnSigInfo* > > > fStripGemInfoMC;
151 vector<vector<vector<BmnSigInfo* > > > fStripSilInfoMC;
152 vector<vector<vector<BmnSigInfo* > > > fStripCSCInfoMC;
153 vector<vector<vector<BmnSigInfo* > > > fStripGemInfoEx;
154 vector<vector<vector<BmnSigInfo* > > > fStripSilInfoEx;
155 vector<vector<vector<BmnSigInfo* > > > fStripCSCInfoEx;
156 vector<vector<vector<TF1* > > > fStripGemRescale;
157 vector<vector<vector<TF1* > > > fStripSilRescale;
158 vector<vector<vector<TF1* > > > fStripCSCRescale;
160 template<
class ClStationSet,
class ClSt,
class ClMod>
161 TCanvas * GetCanvas(ClStationSet * ss) {
164 for (Int_t iStation = 0; iStation < ss->GetNStations(); iStation++) {
167 for (Int_t iModule = 0; iModule < st->GetNModules(); iModule++) {
168 ClMod *mod = st->GetModule(iModule);
169 if (maxLayers < mod->GetNStripLayers())
170 maxLayers = mod->GetNStripLayers();
173 TString
name = Form(
"Strip_Digit_%d", rand());
174 TString title =
"Canvas";
175 TCanvas *
can =
new TCanvas(name, title, Pad_Width * maxLayers, Pad_Height * sumMods);
176 can->Divide(maxLayers, sumMods);
180 BmnStatus LoadDigitDistributionsFromFile(
182 vector<TString> digiNames,
183 vector<vector<vector<vector<BmnSigInfo* > > > > digiVecs);
184 BmnStatus LoadClusterDistributionsFromFile(
186 vector<TString> clusterNames,
187 vector<vector<vector<vector<BmnSigInfo* > > > > clusterVecs);
188 BmnStatus LoadClustersOfTrackDistributionsFromFile(
190 TString globalTrackNames,
191 vector<TString> subTrackNames,
192 vector<TString> hitNames,
193 vector<vector<vector<vector<BmnSigInfo* > > > > clusterVecs);
194 void CreateStripVectors();
197 void FreeVector3D(vector<vector<vector<cl*> > > vvv) {
198 for (
auto &row : vvv)
199 for (auto &col : row)
209 template<
class ClStationSet,
class ClSt,
class ClMod>
210 void FillInfoVector(ClStationSet *ss, vector<vector<vector<BmnSigInfo* > > > &vvv) {
211 for (Int_t iStation = 0; iStation < ss->GetNStations(); iStation++) {
212 vector<vector<BmnSigInfo*> > rowGEM;
213 ClSt * st = ss->GetStation(iStation);
214 for (Int_t iModule = 0; iModule < st->GetNModules(); iModule++) {
215 vector<BmnSigInfo*> colGEM;
216 ClMod *mod = st->GetModule(iModule);
217 for (Int_t iLayer = 0; iLayer < mod->GetNStripLayers(); iLayer++) {
221 rowGEM.push_back(colGEM);
223 vvv.push_back(rowGEM);
227 template<
class ClStationSet,
class ClSt,
class ClMod>
228 void FillRescaleVector(
230 vector<vector<vector<BmnSigInfo* > > > &vMC,
231 vector<vector<vector<BmnSigInfo* > > > &vEx,
232 vector<vector<vector<TF1* > > > &vRescale) {
233 for (Int_t iStation = 0; iStation < ss->GetNStations(); iStation++) {
234 vector<vector<TF1*> > rowGEM;
235 ClSt * st = ss->GetStation(iStation);
236 for (Int_t iModule = 0; iModule < st->GetNModules(); iModule++) {
238 ClMod *mod = st->GetModule(iModule);
239 for (Int_t iLayer = 0; iLayer < mod->GetNStripLayers(); iLayer++) {
241 if ((vMC[iStation][iModule][iLayer]->func) && (vEx[iStation][iModule][iLayer]->func))
244 vEx[iStation][iModule][iLayer]->func->GetName()),
245 vMC[iStation][iModule][iLayer]->func,
246 vEx[iStation][iModule][iLayer]->func);
248 printf(
"st %d mod %d l %d func %08X of MC %08X Ex %08X \n",
249 iStation, iModule, iLayer, (UInt_t)(
size_t) r,
250 (UInt_t)(
size_t) vMC[iStation][iModule][iLayer]->func,
251 (UInt_t)(
size_t) vEx[iStation][iModule][iLayer]->func);
253 rowGEM.push_back(colGEM);
255 vRescale.push_back(rowGEM);
258 void CreateDigitDistributions(
259 TTree *treeDig, TClonesArray *digits,
260 vector<vector<vector<BmnSigInfo* > > > &infoVec);
271 template <
class ClHit,
class ClStationSet,
class ClSt,
class ClMod,
class ClLay>
272 void CreateClusterDistributions(
273 TTree *treeDST, TClonesArray* globTracks, TClonesArray* subTracks, TClonesArray *gemHits, ClStationSet *ss,
274 vector<vector<vector<BmnSigInfo* > > > &infoVec) {
275 printf(
"CreateClusterDistributions started for %s\n", gemHits->GetClass()->GetName());
284 for (Long64_t iEv = 0; iEv < treeDST->GetEntries(); iEv++) {
285 treeDST->GetEntry(iEv);
287 for (Int_t iTrack = 0; iTrack < globTracks->GetEntriesFast(); iTrack++) {
294 if ((!subTrack) && (!isCSC))
296 vector<Int_t> vrange;
298 isCSC ? 1 : subTrack->GetNHits(),
299 isCSC ? track->GetCscHitIndex(0) : 0);
301 for (
size_t i = 0;
i < vrange.size();
i++)
306 for (Int_t iHit : vrange) {
307 ClHit *hit =
static_cast<ClHit*
> (gemHits->UncheckedAt(iHit));
308 Int_t iSt = hit->GetStation();
309 Int_t iMod = hit->GetModule();
312 ClMod * mod = ss->GetStation(iSt)->GetModule(iMod);
315 for (
size_t iLay = 0; iLay < mod->GetStripLayers().size(); iLay++) {
316 ClLay lay = mod->GetStripLayer(iLay);
317 Double_t x = hit->GetX();
318 Double_t y = hit->GetY();
322 if ((lay.IsPointInsideStripLayer(x * (-1), y))) {
324 Int_t iLayCorr = (isSil && (iSt > 0)) ? (iLay / 2) : iLay;
325 BmnSigInfo* info = infoVec[iSt][iMod][iLayCorr];
326 Double_t
val = (lay.GetType() ==
UpperStripLayer) ? hit->GetStripTotalSignalInUpperLayer() : hit->GetStripTotalSignalInLowerLayer();
327 Double_t cs = (lay.GetType() ==
UpperStripLayer) ? hit->GetClusterSizeInUpperLayer() : hit->GetClusterSizeInLowerLayer();
330 if ((val > fLowThr) && (cs > fClusterSizeThr)) {
342 for (
size_t iStation = 0; iStation < infoVec.size(); iStation++) {
343 printf(
"iStation %zu\n", iStation);
344 for (
size_t iModule = 0; iModule < infoVec[iStation].size(); iModule++) {
345 printf(
"\tiModule %zu\n", iModule);
346 for (
size_t iLayer = 0; iLayer < infoVec[iStation][iModule].size(); iLayer++) {
347 printf(
"\t\tiLayer %zu\n", iLayer);
348 BmnSigInfo* info = infoVec[iStation][iModule][iLayer];
349 Double_t minVal = info->
minVal;
350 Double_t maxVal = info->
maxVal;
351 printf(
"\t\t\tMin = %f max = %f\n", minVal, maxVal);
354 TString
name = Form(
"Sig_exp_%s_%zu_%zu_%zu",
355 gemHits->GetName(), iStation, iModule, iLayer);
356 info->
hSig =
new TH1D(name, name, fNBins,
357 minVal - 0.5 * (maxVal - minVal) / (Double_t) fNBins,
358 maxVal + 0.5 * (maxVal - minVal) / (Double_t) fNBins);
359 name = Form(
"IntSignal_%s_%zu_%zu_%zu",
360 gemHits->GetName(), iStation, iModule, iLayer);
361 info->
hIntSig =
new TH1D(name, name, fNBins,
362 minVal - 0.5 * (maxVal - minVal) / (Double_t) fNBins,
363 maxVal + 0.5 * (maxVal - minVal) / (Double_t) fNBins);
368 for (Long64_t iEv = 0; iEv < treeDST->GetEntries(); iEv++) {
369 treeDST->GetEntry(iEv);
370 for (Int_t iTrack = 0; iTrack < globTracks->GetEntriesFast(); iTrack++) {
377 if ((!subTrack) && (!isCSC))
379 vector<Int_t> vrange;
381 isCSC ? 1 : subTrack->GetNHits(),
382 isCSC ? track->GetCscHitIndex(0) : 0);
384 for (
size_t i = 0;
i < vrange.size();
i++)
389 for (Int_t iHit : vrange) {
390 ClHit *hit =
static_cast<ClHit*
> (gemHits->UncheckedAt(iHit));
392 if (hit->GetFlag() == kFALSE)
397 Int_t iSt = hit->GetStation();
398 Int_t iMod = hit->GetModule();
399 ClMod * mod = ss->GetStation(iSt)->GetModule(iMod);
400 for (
size_t iLay = 0; iLay < mod->GetStripLayers().size(); iLay++) {
401 ClLay lay = mod->GetStripLayer(iLay);
402 Double_t x = hit->GetX();
403 Double_t y = hit->GetY();
404 if (lay.IsPointInsideStripLayer(x * (-1), y)) {
405 hit->SetFlag(kFALSE);
408 Int_t iLayCorr = (isSil && (iSt > 0)) ? (iLay / 2) : iLay;
409 BmnSigInfo* info = infoVec[iSt][iMod][iLayCorr];
412 Double_t
val = (lay.GetType() ==
UpperStripLayer) ? hit->GetStripTotalSignalInUpperLayer() : hit->GetStripTotalSignalInLowerLayer();
413 Int_t cs = (lay.GetType() ==
UpperStripLayer) ? hit->GetClusterSizeInUpperLayer() : hit->GetClusterSizeInLowerLayer();
414 if ((val > fLowThr) && (cs > fClusterSizeThr)) {
415 info->
hSig->Fill(val);
422 for (Int_t iHit = 0; iHit < gemHits->GetEntriesFast(); iHit++) {
423 BmnHit *hit =
static_cast<BmnHit*
> (gemHits->UncheckedAt(iHit));
428 for (
size_t iStation = 0; iStation < infoVec.size(); iStation++) {
429 for (
size_t iModule = 0; iModule < infoVec[iStation].size(); iModule++) {
430 for (
size_t iLayer = 0; iLayer < infoVec[iStation][iModule].size(); iLayer++) {
431 BmnSigInfo* info = infoVec[iStation][iModule][iLayer];
435 for (Int_t
i = 0;
i < fNBins;
i++) {
436 bc += info->
hSig->GetBinContent(
i);
437 info->
hIntSig->SetBinContent(
i, bc);
442 info->
hIntSig->SetLineColor(kRed);
443 info->
func =
new TF1(
444 Form(
"%s_%zu_%zu_%zu", gemHits->GetName(), iStation, iModule, iLayer),
445 [info, bc](Double_t *x, Double_t * p) {
447 if (x[0] >= info->maxVal) return 1.0;
448 Int_t iBin = info->hIntSig->GetXaxis()->FindBin(x[0]);
449 Int_t jBin = iBin + ((x[0] > info->hIntSig->GetBinCenter(iBin)) ? 1 : -1);
450 Double_t v = info->hIntSig->GetBinContent(iBin) +
451 (info->hIntSig->GetBinContent(jBin) - info->hIntSig->GetBinContent(iBin))*
452 2 * abs(x[0] - info->hIntSig->GetBinCenter(iBin)) /
453 (info->hIntSig->GetBinWidth(iBin) + info->hIntSig->GetBinWidth(jBin));
456 info->
func->SetNpx(fNBins);
457 info->
func->SetLineColor(kBlue);
462 Double_t rtime = timer.RealTime();
463 Double_t ctime = timer.CpuTime();
464 printf(
"Real time %f s,\n CPU time %f s\n", rtime, ctime);
474 template <
class ClHit,
class ClStationSet,
class ClSt,
class ClMod,
class ClLay>
475 void CreateClusterDistributions(
476 TTree *treeDST, TClonesArray *gemHits, ClStationSet *ss,
477 vector<vector<vector<BmnSigInfo* > > > &infoVec) {
478 printf(
"CreateClusterDistributions started for %s\n", gemHits->GetClass()->GetName());
481 printf(
"isGem = %d \n", isGem);
483 printf(
"isSil = %d \n", isSil);
486 for (Long64_t iEv = 0; iEv < treeDST->GetEntries(); iEv++) {
487 treeDST->GetEntry(iEv);
488 for (Int_t iHit = 0; iHit < gemHits->GetEntriesFast(); iHit++) {
490 ClHit *hit =
static_cast<ClHit*
> (gemHits->UncheckedAt(iHit));
492 Int_t iMod = hit->GetModule();
495 ClMod * mod = ss->GetStation(iSt)->GetModule(iMod);
498 for (
size_t iLay = 0; iLay < mod->GetStripLayers().size(); iLay++) {
499 ClLay lay = mod->GetStripLayer(iLay);
500 Double_t x = hit->GetX();
501 Double_t y = hit->GetY();
505 if ((lay.IsPointInsideStripLayer(x * (-1), y))) {
507 Int_t iLayCorr = (isSil && (iSt > 0)) ? (iLay / 2) : iLay;
508 BmnSigInfo* info = infoVec[iSt][iMod][iLayCorr];
509 Double_t
val = (lay.GetType() ==
UpperStripLayer) ? hit->GetStripTotalSignalInUpperLayer() : hit->GetStripTotalSignalInLowerLayer();
510 Double_t cs = (lay.GetType() ==
UpperStripLayer) ? hit->GetClusterSizeInUpperLayer() : hit->GetClusterSizeInLowerLayer();
513 if ((val > fLowThr) && (cs > fClusterSizeThr)) {
524 for (
size_t iStation = 0; iStation < infoVec.size(); iStation++) {
525 printf(
"iStation %zu\n", iStation);
526 for (
size_t iModule = 0; iModule < infoVec[iStation].size(); iModule++) {
527 printf(
"\tiModule %zu\n", iModule);
528 for (
size_t iLayer = 0; iLayer < infoVec[iStation][iModule].size(); iLayer++) {
529 printf(
"\t\tiLayer %zu\n", iLayer);
530 BmnSigInfo* info = infoVec[iStation][iModule][iLayer];
531 Double_t minVal = info->
minVal;
532 Double_t maxVal = info->
maxVal;
533 printf(
"\t\t\tMin = %f max = %f\n", minVal, maxVal);
536 TString
name = Form(
"Sig_exp_%s_%zu_%zu_%zu",
537 gemHits->GetName(), iStation, iModule, iLayer);
538 info->
hSig =
new TH1D(name, name, fNBins,
539 minVal - 0.5 * (maxVal - minVal) / (Double_t) fNBins,
540 maxVal + 0.5 * (maxVal - minVal) / (Double_t) fNBins);
541 name = Form(
"IntSignal_%s_%zu_%zu_%zu",
542 gemHits->GetName(), iStation, iModule, iLayer);
543 info->
hIntSig =
new TH1D(name, name, fNBins,
544 minVal - 0.5 * (maxVal - minVal) / (Double_t) fNBins,
545 maxVal + 0.5 * (maxVal - minVal) / (Double_t) fNBins);
550 for (Long64_t iEv = 0; iEv < treeDST->GetEntries(); iEv++) {
551 treeDST->GetEntry(iEv);
552 for (Int_t iHit = 0; iHit < gemHits->GetEntriesFast(); iHit++) {
553 ClHit *hit =
static_cast<ClHit*
> (gemHits->UncheckedAt(iHit));
554 Int_t iSt = hit->GetStation();
555 Int_t iMod = hit->GetModule();
556 ClMod * mod = ss->GetStation(iSt)->GetModule(iMod);
557 for (
size_t iLay = 0; iLay < mod->GetStripLayers().size(); iLay++) {
558 ClLay lay = mod->GetStripLayer(iLay);
559 Double_t x = hit->GetX();
560 Double_t y = hit->GetY();
561 if (lay.IsPointInsideStripLayer(x * (-1), y)) {
562 Int_t iLayCorr = (isSil && (iSt > 0)) ? (iLay / 2) : iLay;
563 BmnSigInfo* info = infoVec[iSt][iMod][iLayCorr];
566 Double_t
val = (lay.GetType() ==
UpperStripLayer) ? hit->GetStripTotalSignalInUpperLayer() : hit->GetStripTotalSignalInLowerLayer();
567 Int_t cs = (lay.GetType() ==
UpperStripLayer) ? hit->GetClusterSizeInUpperLayer() : hit->GetClusterSizeInLowerLayer();
568 if ((val > fLowThr) && (cs > fClusterSizeThr)) {
569 info->
hSig->Fill(val);
576 for (
size_t iStation = 0; iStation < infoVec.size(); iStation++) {
577 for (
size_t iModule = 0; iModule < infoVec[iStation].size(); iModule++) {
578 for (
size_t iLayer = 0; iLayer < infoVec[iStation][iModule].size(); iLayer++) {
579 BmnSigInfo* info = infoVec[iStation][iModule][iLayer];
583 for (Int_t
i = 0;
i < fNBins;
i++) {
584 bc += info->
hSig->GetBinContent(
i);
585 info->
hIntSig->SetBinContent(
i, bc);
590 info->
hIntSig->SetLineColor(kRed);
591 info->
func =
new TF1(
592 Form(
"%s_%zu_%zu_%zu", gemHits->GetName(), iStation, iModule, iLayer),
593 [info, bc](Double_t *x, Double_t * p) {
595 if (x[0] >= info->maxVal) return 1.0;
596 Int_t iBin = info->hIntSig->GetXaxis()->FindBin(x[0]);
597 Int_t jBin = iBin + ((x[0] > info->hIntSig->GetBinCenter(iBin)) ? 1 : -1);
598 Double_t v = info->hIntSig->GetBinContent(iBin) +
599 (info->hIntSig->GetBinContent(jBin) - info->hIntSig->GetBinContent(iBin))*
600 2 * abs(x[0] - info->hIntSig->GetBinCenter(iBin)) /
601 (info->hIntSig->GetBinWidth(iBin) + info->hIntSig->GetBinWidth(jBin));
604 info->
func->SetNpx(fNBins);
605 info->
func->SetLineColor(kBlue);
BmnCSCStation * GetStation(Int_t station_num)
Int_t GetCscHitIndex(Int_t idx) const
Int_t GetGemTrackIndex() const
Int_t GetSilTrackIndex() const
Short_t GetStation() const
BmnStatus CreateRescales(TString fileNameMC, TString fileNameEx)
vector< vector< vector< TF1 * > > > GetSilRescaleVector()
TF1 * GetRescaleFunc(TString name, TF1 *mc, TF1 *ex)
vector< vector< vector< BmnSigInfo * > > > GetSilInfoVectorExp()
vector< vector< vector< BmnSigInfo * > > > GetGemInfoVectorExp()
vector< vector< vector< TF1 * > > > GetGemRescaleVector()
vector< vector< vector< BmnSigInfo * > > > GetCSCInfoVectorExp()
vector< vector< vector< TF1 * > > > GetCSCRescaleVector()
BmnRescale(UInt_t periodId, UInt_t runId, Double_t lowThr=0, Double_t ClusterSizeThr=0, Int_t nBins=1e6)
Int_t GetHitIndex(Int_t iHit) const