10#include "BmnHistManager.h"
12#include "FairRootManager.h"
13#include "FairMCPoint.h"
14#include "CbmMCTrack.h"
16#include "FairMCEventHeader.h"
18#include "BmnGemStripStation.h"
19#include "BmnGemStripStationSet_RunSpring2017.h"
20#include "BmnSiliconStationSet.h"
24#include "TClonesArray.h"
30#include "TProfile2D.h"
32#include <boost/assign/list_of.hpp>
39using std::binary_search;
40using boost::assign::list_of;
51 fGemDigitMatches(NULL),
63 fDch1HitMatches(NULL),
78 TString gPathConfig = gSystem->Getenv(
"VMCWORKDIR");
79 TString gPathSiConfig = gPathConfig +
"/silicon/XMLConfigs/";
80 TString confSi =
"SiliconRunSpring2018.xml";
82 TString gPathGemConfig = gPathConfig +
"/gem/XMLConfigs/";
83 TString confGem =
"GemRunSpring2018.xml";
94 fHM->
H1(
"hen_EventNo_ClusteringQa")->Fill(0.5);
97 ProcessPoints(fGemPoints,
"Gem",
kGEM);
106 ProcessHits(fGemHits, fGemHitMatches,
"Gem",
kGEM);
112 FillResidualAndPullHistograms(fGemPoints, fGemHits, fGemHitMatches,
"Gem",
kGEM);
118 FillHitEfficiencyHistograms(fGemPoints, fGemHits, fGemHitMatches,
"Gem",
kGEM);
133 report->
Create(fHM, fOutputDir);
137void BmnClusteringQa::ReadEventHeader() {
138 FairMCEventHeader* evHead = (FairMCEventHeader*) FairRootManager::Instance()->GetObject(
"MCEventHeader.");
139 fHM->
H1(
"Impact parameter")->Fill(evHead->GetB());
141 fHM->
H1(
"Multiplicity")->Fill(evHead->GetNPrim());
142 fHM->
H2(
"Impact_Mult")->Fill(evHead->GetB(), evHead->GetNPrim());
145void BmnClusteringQa::ReadDataBranches() {
146 FairRootManager* ioman = FairRootManager::Instance();
147 assert(ioman != NULL);
149 fMCTracks = (TClonesArray*) ioman->GetObject(
"MCTrack");
151 fGemPoints = (TClonesArray*) ioman->GetObject(
"StsPoint");
152 fSilPoints = (TClonesArray*) ioman->GetObject(
"SiliconPoint");
155 fDch1Points = (TClonesArray*) ioman->GetObject(
"DCHPoint");
158 fGemHits = (TClonesArray*) ioman->GetObject(
"BmnGemStripHit");
159 fSilHits = (TClonesArray*) ioman->GetObject(
"BmnSiliconHit");
165 fGemHitMatches = (TClonesArray*) ioman->GetObject(
"BmnGemStripHitMatch");
166 fSilHitMatches = (TClonesArray*) ioman->GetObject(
"BmnSiliconHitMatch");
174Int_t BmnClusteringQa::GetStationId(Int_t address,
DetectorId detId) {
179void BmnClusteringQa::ProcessPoints(
const TClonesArray* points,
const string& detName,
DetectorId detId) {
180 string histName =
"_hno_NofObjects_" + detName +
"Points_Station";
181 if (NULL == points || !fHM->
Exists(histName))
return;
182 for (Int_t
i = 0;
i < points->GetEntriesFast();
i++) {
189void BmnClusteringQa::ProcessDigis(
190 const TClonesArray* digis,
191 const TClonesArray* digiMatches,
192 const string& detName,
205void BmnClusteringQa::ProcessClusters(
206 const TClonesArray* clusters,
207 const TClonesArray* clusterMatches,
208 const string& detName,
224void BmnClusteringQa::ProcessHits(
const TClonesArray* hits,
const TClonesArray* hitMatches,
const string& detName,
DetectorId detId) {
240 for (Int_t iSt = 0; iSt < fGemDetector->
GetNStations(); ++iSt) {
241 TString resXname = Form(
"ResX_%dst_gem", iSt);
242 TString resYname = Form(
"ResY_%dst_gem", iSt);
243 TString pntXhitXname = Form(
"PntX_vs_HitX_%dst_gem", iSt);
244 TString pntYhitYname = Form(
"PntY_vs_HitY_%dst_gem", iSt);
245 TString occupname = Form(
"Occupancy_%dst_gem", iSt);
246 TString pullXname = Form(
"PullX_%dst_gem", iSt);
247 TString pullYname = Form(
"PullY_%dst_gem", iSt);
257 for (Int_t
i = 0;
i < fGemHits->GetEntriesFast(); ++
i) {
262 const Float_t resX = pnt->GetX() - hit->GetX();
263 const Float_t resY = pnt->GetY() - hit->GetY();
264 fHM->
H1(resXname.Data())->Fill(resX);
265 fHM->
H1(resYname.Data())->Fill(resY);
266 fHM->
H2(pntXhitXname.Data())->Fill(pnt->GetX(), hit->GetX());
267 fHM->
H2(pntYhitYname.Data())->Fill(pnt->GetY(), hit->GetY());
269 fHM->
H1(pullXname)->Fill(resX / hit->GetDx());
270 fHM->
H1(pullYname)->Fill(resY / hit->GetDy());
273 fHM->
H2(occupname.Data())->Fill(pnt->GetX(), pnt->GetY());
277 for (Int_t iSt = 0; iSt < fSilDetector->
GetNStations(); ++iSt) {
279 TString occupname = Form(
"Occupancy_%dst_sil", iSt);
280 TString resXname = Form(
"ResX_%dst_sil", iSt);
281 TString resYname = Form(
"ResY_%dst_sil", iSt);
282 TString pntXhitXname = Form(
"PntX_vs_HitX_%dst_sil", iSt);
283 TString pntYhitYname = Form(
"PntY_vs_HitY_%dst_sil", iSt);
284 TString pullXname = Form(
"PullX_%dst_sil", iSt);
285 TString pullYname = Form(
"PullY_%dst_sil", iSt);
288 for (Int_t
i = 0;
i < fSilHits->GetEntriesFast(); ++
i) {
294 const Float_t resX = pnt->GetX() - hit->GetX();
295 const Float_t resY = pnt->GetY() - hit->GetY();
297 fHM->
H1(resXname.Data())->Fill(resX);
298 fHM->
H1(resYname.Data())->Fill(resY);
299 fHM->
H2(pntXhitXname.Data())->Fill(pnt->GetX(), hit->GetX());
300 fHM->
H2(pntYhitYname.Data())->Fill(pnt->GetY(), hit->GetY());
302 fHM->
H1(pullXname)->Fill(resX / hit->GetDx());
303 fHM->
H1(pullYname)->Fill(resY / hit->GetDy());
305 fHM->
H2(occupname.Data())->Fill(pnt->GetX(), pnt->GetY());
326void BmnClusteringQa::FillEventCounterHistograms() {
348void BmnClusteringQa::FillResidualAndPullHistograms(
const TClonesArray* points,
const TClonesArray* hits,
const TClonesArray* hitMatches,
const string& detName,
DetectorId detId) {
349 if (NULL == points || NULL == hits || NULL == hitMatches)
return;
350 string nameResidualX =
"_hrp_" + detName +
"_ResidualX_H2";
351 string nameResidualY =
"_hrp_" + detName +
"_ResidualY_H2";
352 string namePullX =
"_hrp_" + detName +
"_PullX_H2";
353 string namePullY =
"_hrp_" + detName +
"_PullY_H2";
354 if (!fHM->
Exists(nameResidualX) || !fHM->
Exists(nameResidualY) || !fHM->
Exists(namePullX) || !fHM->
Exists(namePullY))
return;
356 for (Int_t iHit = 0; iHit < hits->GetEntriesFast(); iHit++) {
358 const FairMCPoint* point = (
const FairMCPoint*) (points->At(
match->GetMatchedLink().GetIndex()));
359 if (point == NULL)
continue;
361 Float_t residualX = point->GetX() - hit->GetX();
362 Float_t residualY = point->GetY() - hit->GetY();
364 fHM->
H2(nameResidualX)->Fill(stationId, residualX);
365 fHM->
H2(nameResidualY)->Fill(stationId, residualY);
366 fHM->
H2(namePullX)->Fill(stationId, residualX / hit->GetDx());
367 fHM->
H2(namePullY)->Fill(stationId, residualY / hit->GetDy());
371void BmnClusteringQa::FillHitEfficiencyHistograms(
const TClonesArray* points,
const TClonesArray* hits,
const TClonesArray* hitMatches,
const string& detName,
DetectorId detId) {
372 if (NULL == points || NULL == hits || NULL == hitMatches)
return;
373 string accName =
"_hhe_" + detName +
"_All_Acc_Station";
374 if (NULL == points || !fHM->
Exists(accName))
return;
375 for (Int_t
i = 0;
i < points->GetEntriesFast();
i++) {
376 const FairMCPoint* point = (
const FairMCPoint*) (points->At(
i));
377 fHM->
H1(accName)->Fill(GetStationId(point->GetDetectorID(), detId));
380 string recName =
"_hhe_" + detName +
"_All_Rec_Station";
381 string cloneName =
"_hhe_" + detName +
"_All_Clone_Station";
382 set<Int_t> mcPointSet;
383 Int_t nofHits = hits->GetEntriesFast();
384 for (Int_t iHit = 0; iHit < nofHits; iHit++) {
387 if (mcPointSet.find(
match->GetMatchedLink().GetIndex()) == mcPointSet.end()) {
389 mcPointSet.insert(
match->GetMatchedLink().GetIndex());
396void BmnClusteringQa::CreateHistograms() {
400 Int_t nStationsDCH1 = 3;
402 for (Int_t iSt = 0; iSt < nStationsGEM; ++iSt) {
403 TString occupname = Form(
"Occupancy_%dst_gem", iSt);
404 TString resXname = Form(
"ResX_%dst_gem", iSt);
405 TString resYname = Form(
"ResY_%dst_gem", iSt);
406 TString pntXhitXname = Form(
"PntX_vs_HitX_%dst_gem", iSt);
407 TString pntYhitYname = Form(
"PntY_vs_HitY_%dst_gem", iSt);
408 TString pullXname = Form(
"PullX_%dst_gem", iSt);
409 TString pullYname = Form(
"PullY_%dst_gem", iSt);
411 CreateH1(resXname.Data(),
"ResX, cm",
"Counter", 200, -5, 5);
412 CreateH1(resYname.Data(),
"ResY, cm",
"Counter", 200, -5, 5);
413 CreateH2(pntXhitXname.Data(),
"X_{MC}, cm",
"X_{reco}, cm",
"", 400, -70, 70, 400, -70, 70);
414 CreateH2(pntYhitYname.Data(),
"Y_{MC}, cm",
"Y_{reco}, cm",
"", 400, -70, 70, 400, -70, 70);
416 CreateH2(occupname.Data(),
"X_{MC}, cm",
"Y_{MC}, cm",
"Occupancy, #frac{part}{event * cm^{2}}", 50, -100, 100, 50, -30, 30);
418 CreateH1(pullXname.Data(),
"PullX",
"Counter", 200, -10, 10);
419 CreateH1(pullYname.Data(),
"PullY",
"Counter", 200, -10, 10);
422 for (Int_t iSt = 0; iSt < nStationsSil; ++iSt) {
423 TString occupname = Form(
"Occupancy_%dst_sil", iSt);
424 TString resXname = Form(
"ResX_%dst_sil", iSt);
425 TString resYname = Form(
"ResY_%dst_sil", iSt);
426 TString pntXhitXname = Form(
"PntX_vs_HitX_%dst_sil", iSt);
427 TString pntYhitYname = Form(
"PntY_vs_HitY_%dst_sil", iSt);
428 TString pullXname = Form(
"PullX_%dst_sil", iSt);
429 TString pullYname = Form(
"PullY_%dst_sil", iSt);
432 CreateH1(resXname.Data(),
"ResX, cm",
"Counter", 200, -1, 1);
433 CreateH1(resYname.Data(),
"ResY, cm",
"Counter", 200, -1, 1);
434 CreateH2(pntXhitXname.Data(),
"X_{MC}, cm",
"X_{reco}, cm",
"", 400, -20, 20, 400, -20, 20);
435 CreateH2(pntYhitYname.Data(),
"Y_{MC}, cm",
"Y_{reco}, cm",
"", 400, -20, 20, 400, -20, 20);
437 CreateH2(occupname.Data(),
"X_{MC}, cm",
"Y_{MC}, cm",
"Occupancy, #frac{part}{event * cm^{2}}", 50, -20, 20, 50, -20, 20);
439 CreateH1(pullXname.Data(),
"PullX",
"Counter", 200, -10, 10);
440 CreateH1(pullYname.Data(),
"PullY",
"Counter", 200, -10, 10);
444 for (Int_t iSt = 0; iSt < nStationsDCH1; ++iSt) {
446 TString occupname = Form(
"Occupancy_%dst_dch1", iSt);
448 CreateH2(occupname.Data(),
"X_{MC}, cm",
"Y_{MC}, cm",
"Occupancy, #frac{part}{event * cm^{2}}", 50, -20, 20, 50, -20, 20);
452 CreateH1(
"hen_EventNo_ClusteringQa",
"",
"", 1, 0, 1.);
453 CreateH1(
"Impact parameter",
"b, fm",
"Counter", 50, 0.0, 0.0);
454 CreateH1(
"Multiplicity",
"N_{prim}",
"Counter", 60, 0.0, 0.0);
455 CreateH2(
"Impact_Mult",
"b, fm",
"N_{prim}",
"", 400, 0.0, 0.0, 400, 0.0, 0.0);
458void BmnClusteringQa::CreateH1(
const string& name,
const string& xTitle,
const string& yTitle, Int_t nofBins, Double_t minBin, Double_t maxBin) {
459 TH1F* h =
new TH1F(
name.c_str(),
string(name +
";" + xTitle +
";" + yTitle).c_str(), nofBins, minBin, maxBin);
463void BmnClusteringQa::CreateH2(
465 const string& xTitle,
466 const string& yTitle,
467 const string& zTitle,
474 TH2F* h =
new TH2F(
name.c_str(), (name +
";" + xTitle +
";" + yTitle +
";" + zTitle).c_str(), nofBinsX, minBinX, maxBinX, nofBinsY, minBinY, maxBinY);
Simulation report for clustering QA.
FairTask for clustering performance calculation.
Simulation report for clustering QA.
BmnClusteringQa()
Constructor.
virtual ~BmnClusteringQa()
Destructor.
virtual void Exec(Option_t *opt)
Derived from FairTask.
virtual void Finish()
Derived from FairTask.
virtual InitStatus Init()
Derived from FairTask.
void Add(const TString &name, TNamed *object)
Add new named object to manager.
Bool_t Exists(const TString &name) const
Check existence of histogram in manager.
TH2 * H2(const TString &name) const
Return pointer to TH2 histogram.
void WriteToFile()
Write all histograms to current opened file.
TH1 * H1(const TString &name) const
Return pointer to TH1 histogram.
Short_t GetStation() const
const BmnLink & GetMatchedLink() const
Base class for simulation reports.
void Create(BmnHistManager *histManager, const string &outputDir)
Main function which creates report data.