2#include "BmnGlobalTrack.h"
5Int_t BmnQaOffline::fCurrentEvent = 0;
11 fSiliconHits(nullptr),
12 fSiliconTracks(nullptr),
23 fGlobalTracks(nullptr),
31 isDstRead = ReadDstTree(file);
34Bool_t BmnQaOffline::ReadDstTree(TString fileDst) {
35 fChainDst =
new TChain(
"bmndata");
36 fChainDst->Add(fileDst.Data());
39 fChainDst->SetBranchAddress(
"DstEventHeader.", &fDstHeader);
40 fChainDst->GetEntry(0);
42 fChainDst->SetBranchAddress(
"BmnDchHit", &fDchHits);
43 fChainDst->SetBranchAddress(
"BmnMwpcHit", &fMwpcHits);
44 fChainDst->SetBranchAddress(
"BmnTof400Hit", &fTof400Hits);
45 fChainDst->SetBranchAddress(
"BmnTof700Hit", &fTof700Hits);
46 fChainDst->SetBranchAddress(
"BmnCSCHit", &fCscHits);
47 fChainDst->SetBranchAddress(
"BmnSiliconHit", &fSiliconHits);
48 fChainDst->SetBranchAddress(
"BmnSiliconTrack", &fSiliconTracks);
49 fChainDst->SetBranchAddress(
"BmnGemStripHit", &fGemHits);
50 fChainDst->SetBranchAddress(
"BmnGemTrack", &fGemTracks);
51 fChainDst->SetBranchAddress(
"BmnDchTrack", &fDchTracks);
52 fChainDst->SetBranchAddress(
"BmnMwpcTrack", &fMwpcTracks);
53 fChainDst->SetBranchAddress(
"BmnGlobalTrack", &fGlobalTracks);
54 fChainDst->SetBranchAddress(
"BmnVertex", &fVertex);
56 if (fileDst.IsNull() || fChainDst->GetEntries() == 0)
63 cout <<
" BmnQaOffline::Init() " << endl;
65 ioman = FairRootManager::Instance();
67 fBmnHeader =
static_cast<BmnEventHeader*
>(ioman->GetObject(
"BmnEventHeader."));
69 printf(
"BmnEventHeader. found\n");
70 fRunId = fBmnHeader->GetRunId();
73 fDstHeader =
static_cast<DstEventHeader*
>(ioman->GetObject(
"DstEventHeader."));
74 printf(
"DstEventHeader. found\n");
75 fRunId = fDstHeader->GetRunId();
84 prefix = TString::Format(
"RUN%d_SETUP_%s_", period,
setup.Data());
90 DETECTORS =
new TClonesArray*[nDets];
91 TRIGGERS =
new TClonesArray*[nTrigs];
93 for (Int_t iDet = 0; iDet < nDets; iDet++)
94 DETECTORS[iDet] = (TClonesArray*) ioman->GetObject(fSteering->
GetDetectors(period,
setup)[iDet].Data());
96 for (Int_t iTrigger = 0; iTrigger < nTrigs; iTrigger++)
97 TRIGGERS[iTrigger] = (TClonesArray*) ioman->GetObject(fSteering->
GetTriggers(period,
setup)[iTrigger].Data());
104 for (Int_t iDet = 0; iDet < nCoordinate; iDet++)
108 for (Int_t iDet = nCoordinate; iDet < nCoordinate + nTime; iDet++)
112 for (Int_t iDet = nCoordinate + nTime; iDet < nCoordinate + nTime + nCalorimeter; iDet++)
115 for (Int_t iDet = 0; iDet < nTrigs; iDet++)
118 if (fTrigCorr.size() != 0)
124 Char_t* geoFileName = (Char_t*)
"current_geo_file.root";
127 cout <<
"Geometry file can't be read from the database" << endl;
130 TGeoManager::Import(geoFileName);
138 vector <TString> detectors;
141 for (Int_t iDet = 0; iDet < nDets; iDet++)
143 detectors.push_back(
"TRIGGERS");
146 vector <BmnQaHistoManager*> managers;
147 for (Int_t iDet = 0; iDet < nCoordinate; iDet++)
148 managers.push_back(coordinate[iDet]->
GetManager());
150 for (Int_t iDet = 0; iDet < nTime; iDet++)
153 for (Int_t iDet = 0; iDet < nCalorimeter; iDet++)
154 managers.push_back(calorimeter[iDet]->
GetManager());
158 TDirectory** directories =
new TDirectory*[nDets + 1];
159 for (Int_t iDet = 0; iDet < nDets + 1; iDet++) {
160 directories[iDet] = ioman->GetOutFile()->mkdir(detectors[iDet].Data());
161 directories[iDet]->cd();
162 managers[iDet]->WriteToFile();
165 ioman->GetOutFile()->mkdir(
"DST")->cd();
169 for (Int_t iDet = 0; iDet < nCoordinate; iDet++)
170 delete coordinate[iDet];
172 for (Int_t iDet = 0; iDet < nTime; iDet++)
175 for (Int_t iDet = 0; iDet < nCalorimeter; iDet++)
176 delete calorimeter[iDet];
184 if (fCurrentEvent > fChainDst->GetEntries() - 1)
187 fChainDst->GetEntry(fCurrentEvent);
190 if (fCurrentEvent % 1000 == 0)
191 cout <<
"Event# = " << fCurrentEvent << endl;
194 vector <TString> dets = {
"MWPC",
"SILICON",
"GEM",
"CSC",
"TOF400",
"TOF700",
"DCH"};
195 vector <TClonesArray*> hits = {fMwpcHits, fSiliconHits, fGemHits, fCscHits, fTof400Hits, fTof700Hits, fDchHits};
197 for (
size_t iDet = 0; iDet < dets.size(); iDet++)
198 for (
size_t iHit = 0; iHit < dets.size(); iHit++) {
202 doHitsDistributions(hits[iHit], dst, dets[iDet]);
205 GetBasicTrackDistributions();
207 doResidualsPullsAnal();
208 doAverageStripValuePerTrack();
210 for (
auto hit : hits) {
212 doAverageStripValuePerHit(hit);
217 for (Int_t iDet = 0; iDet < nCoordinate; iDet++) {
219 TClonesArray* detData = DETECTORS[iDet];
222 if (detName.Contains(
"GEM")) {
223 GetDistributionOfFiredStrips <BmnGemStripDigit> (detData, detQa, prefix + detName);
224 GetDistributionOfFiredStripsVsSignal <BmnGemStripDigit> (detData, detQa, prefix + detName);
225 }
else if (detName.Contains(
"SILICON")) {
226 GetDistributionOfFiredStrips <BmnSiliconDigit> (detData, detQa, prefix + detName);
227 }
else if (detName.Contains(
"CSC")) {
228 GetDistributionOfFiredStrips <BmnCSCDigit> (detData, detQa, prefix + detName);
233 for (Int_t iDet = nCoordinate; iDet < nCoordinate + nTime; iDet++) {
235 TClonesArray* detData = DETECTORS[iDet];
238 if (detName.Contains(
"TOF400")) {
239 GetCommonInfo <BmnTof1Digit> (detData, detQa, prefix + detName);
240 GetTofInfo <BmnTof1Digit> (detData, detQa, prefix + detName);
241 }
else if (detName.Contains(
"TOF700")) {
242 GetCommonInfo <BmnTof2Digit> (detData, detQa, prefix + detName);
243 GetTofInfo <BmnTof2Digit> (detData, detQa, prefix + detName);
244 }
else if (detName.Contains(
"DCH")) {
245 GetCommonInfo <BmnDchDigit> (detData, detQa, prefix + detName);
246 GetMwpcDchInfo <BmnDchDigit> (detData, detQa, prefix + detName);
247 }
else if (detName.Contains(
"MWPC")) {
248 GetCommonInfo <BmnMwpcDigit> (detData, detQa, prefix + detName);
249 GetMwpcDchInfo <BmnMwpcDigit> (detData, detQa, prefix + detName);
254 for (Int_t iDet = nCoordinate + nTime; iDet < nCoordinate + nTime + nCalorimeter; iDet++) {
256 TClonesArray* detData = DETECTORS[iDet];
259 if (detName.Contains(
"ECAL")) {
260 GetCommonInfo <BmnECALDigit> (detData, detQa, prefix + detName);
261 }
else if (detName.Contains(
"ZDC")) {
262 GetCommonInfo <BmnZDCDigit> (detData, detQa, prefix + detName);
267 for (
auto it : fTrigCorr)
268 GetCommonInfo <BmnTrigDigit> (it.first, triggers, it.second);
270 if (fCurrentEvent == fChainDst->GetEntries() - 1) {
281template <
class T>
void BmnQaOffline::GetDistributionOfFiredStrips(TClonesArray* digiArray,
BmnCoordinateDetQa* detHistoClass, TString detName) {
282 for (Int_t iDig = 0; iDig < digiArray->GetEntriesFast(); iDig++) {
283 T* dig = (T*) digiArray->UncheckedAt(iDig);
284 Int_t
module = dig->GetModule();
285 Int_t station = dig->GetStation();
286 Int_t layer = dig->GetStripLayer();
287 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of fired strips, Stat %d Mod %d Lay %d", detName.Data(), station, module, layer))->Fill(dig->GetStripNumber());
293template <
class T>
void BmnQaOffline::GetDistributionOfFiredStripsVsSignal(TClonesArray* digiArray,
BmnCoordinateDetQa* detHistoClass, TString detName) {
294 for (Int_t iDig = 0; iDig < digiArray->GetEntriesFast(); iDig++) {
295 T* dig = (T*) digiArray->UncheckedAt(iDig);
296 Int_t
module = dig->GetModule();
297 Int_t station = dig->GetStation();
298 Int_t layer = dig->GetStripLayer();
299 detHistoClass->
GetManager()->
H2(TString::Format(
"%s_2d, Distribution of fired strips vs. signal, Stat %d Mod %d Lay %d", detName.Data(), station, module, layer))->Fill(dig->GetStripNumber(), dig->GetStripSignal());
305template <
class T>
void BmnQaOffline::GetCommonInfo(TClonesArray* digiArray,
BmnTimeDetQa* detHistoClass, TString detName) {
306 for (Int_t iDig = 0; iDig < digiArray->GetEntriesFast(); iDig++) {
307 T* dig = (T*) digiArray->UncheckedAt(iDig);
308 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of planes", detName.Data()))->Fill(dig->GetPlane());
309 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of times", detName.Data()))->Fill(dig->GetTime());
313template <
class T>
void BmnQaOffline::GetMwpcDchInfo(TClonesArray* digiArray,
BmnTimeDetQa* detHistoClass, TString detName) {
314 for (Int_t iDig = 0; iDig < digiArray->GetEntriesFast(); iDig++) {
315 T* dig = (T*) digiArray->UncheckedAt(iDig);
316 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of wires", detName.Data()))->Fill(dig->GetWireNumber());
320template <
class T>
void BmnQaOffline::GetTofInfo(TClonesArray* digiArray,
BmnTimeDetQa* detHistoClass, TString detName) {
321 for (Int_t iDig = 0; iDig < digiArray->GetEntriesFast(); iDig++) {
322 T* dig = (T*) digiArray->UncheckedAt(iDig);
323 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of strips", detName.Data()))->Fill(dig->GetStrip());
324 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of amplitudes", detName.Data()))->Fill(dig->GetAmplitude());
330template <
class T>
void BmnQaOffline::GetCommonInfo(TClonesArray* digiArray,
BmnCalorimeterDetQa* detHistoClass, TString detName) {
331 for (Int_t iDig = 0; iDig < digiArray->GetEntriesFast(); iDig++) {
332 T* dig = (T*) digiArray->UncheckedAt(iDig);
333 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of iX", detName.Data()))->Fill(dig->GetIX());
334 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of iY", detName.Data()))->Fill(dig->GetIY());
335 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of X", detName.Data()))->Fill(dig->GetX());
336 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of Y", detName.Data()))->Fill(dig->GetY());
337 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of channels", detName.Data()))->Fill(dig->GetChannel());
338 detHistoClass->
GetManager()->
H1(TString::Format(
"%s_1d, Distribution of amplitudes", detName.Data()))->Fill(dig->GetAmp());
344template <
class T>
void BmnQaOffline::GetCommonInfo(TClonesArray* digiArray,
BmnTrigDetQa* detHistoClass, TString detName) {
345 for (Int_t iDig = 0; iDig < digiArray->GetEntriesFast(); iDig++) {
346 T* dig = (T*) digiArray->UncheckedAt(iDig);
347 detHistoClass->
GetManager()->
H1(TString::Format(
"%sTRIGGERS_1d, %s, Distribution of inn. channels", prefix.Data(), detName.Data()))->Fill(dig->GetMod());
348 detHistoClass->
GetManager()->
H1(TString::Format(
"%sTRIGGERS_1d, %s, Distribution of times", prefix.Data(), detName.Data()))->Fill(dig->GetTime());
349 detHistoClass->
GetManager()->
H1(TString::Format(
"%sTRIGGERS_1d, %s, Distribution of amplitudes", prefix.Data(), detName.Data()))->Fill(dig->GetAmp());
355void BmnQaOffline::GetBasicTrackDistributions() {
359 const Int_t nDims = 3;
360 TString
dim[nDims] = {
"X",
"Y",
"Z"};
362 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of total multiplicity", prefix.Data()))->Fill(fGlobalTracks->GetEntriesFast());
364 for (Int_t iTrack = 0; iTrack < fGlobalTracks->GetEntriesFast(); iTrack++) {
366 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of momenta", prefix.Data()))->Fill(1. / track->
GetParamFirst()->GetQp());
367 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of Nhits", prefix.Data()))->Fill(track->
GetNHits());
372 Double_t xyzFirst[nDims] = {parFirst->GetX(), parFirst->GetY(), parFirst->GetZ()};
373 Double_t xyzLast[nDims] = {parLast->GetX(), parLast->GetY(), parLast->GetZ()};
375 Double_t txtyFirst[] = {parFirst->GetTx(), parFirst->GetTy()};
376 Double_t txtyLast[] = {parLast->GetTx(), parLast->GetTy()};
378 for (Int_t iDim = 0; iDim < nDims; iDim++) {
379 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of start%s", prefix.Data(),
dim[iDim].Data()))->Fill(xyzFirst[iDim]);
380 if (!
dim[iDim].Contains(
"Z"))
381 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of start T%s", prefix.Data(),
dim[iDim].Data()))->Fill(txtyFirst[iDim]);
382 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of last%s", prefix.Data(),
dim[iDim].Data()))->Fill(xyzLast[iDim]);
383 if (!
dim[iDim].Contains(
"Z"))
384 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of last T%s", prefix.Data(),
dim[iDim].Data()))->Fill(txtyLast[iDim]);
389 for (Int_t iTrack = 0; iTrack < fSiliconTracks->GetEntriesFast(); iTrack++) {
391 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of Nhits, %s track", prefix.Data(),
"SILICON"))->Fill(track->
GetNHits());
395 for (Int_t iTrack = 0; iTrack < fGemTracks->GetEntriesFast(); iTrack++) {
397 dst->
GetManager()->
H1(Form(
"%sDST_1d, Distribution of Nhits, %s track", prefix.Data(),
"GEM"))->Fill(track->
GetNHits());
401 dst->
GetManager()->
H2(Form(
"%sDST_2d, Vp_{z} vs. Ntracks", prefix.Data()))->Fill(fGlobalTracks->GetEntriesFast(), ((
CbmVertex*) fVertex->UncheckedAt(0))->GetZ());
404void BmnQaOffline::doHitsDistributions(TClonesArray* hitsArray,
BmnDstQa* detHistoClass, TString detName) {
405 const Int_t nDims = 3;
406 TString
dim[nDims] = {
"X",
"Y",
"Z"};
412 for (Int_t iHit = 0; iHit < hitsArray->GetEntriesFast(); iHit++) {
415 for (Int_t iDim = 0; iDim < nDims; iDim++) {
416 detHistoClass->
GetManager()->
H1(Form(
"%sDST_1d, %s, Distribution of %s", prefix.Data(), detName.Data(),
dim[iDim].Data()))->Fill(
417 (iDim == 0) ? hit->GetX() : (iDim == 1) ? hit->GetY() : hit->GetZ());
420 detHistoClass->
GetManager()->
H1(Form(
"%sDST_1d, %s, Distribution of d%s", prefix.Data(), detName.Data(),
dim[iDim].Data()))->Fill(
421 (iDim == 0) ? hit->GetDx() : hit->GetDy());
426 if (detName.Contains(
"SILICON"))
427 for (Int_t iHit = 0; iHit < hitsArray->GetEntriesFast(); iHit++) {
435 }
else if (detName.Contains(
"GEM"))
436 for (Int_t iHit = 0; iHit < hitsArray->GetEntriesFast(); iHit++) {
444 }
else if (detName.Contains(
"CSC"))
445 for (Int_t iHit = 0; iHit < hitsArray->GetEntriesFast(); iHit++) {
456BmnHit* BmnQaOffline::MatchDetector(FairTrackParam* parTrack, TClonesArray* hits, Bool_t doUpdate, Int_t detNum) {
457 FairTrackParam minPar;
458 Double_t minDX = DBL_MAX;
459 Double_t minDY = DBL_MAX;
465 Double_t minZ = DBL_MAX;
468 map<Double_t, FairTrackParam> zParamMap;
469 for (Int_t iHit = 0; iHit < hits->GetEntriesFast(); ++iHit) {
473 minZ = Min(minZ, hit->GetZ());
474 zParamMap[hit->GetZ()] = FairTrackParam();
476 FairTrackParam par(*parTrack);
479 for (map<Double_t, FairTrackParam>::iterator it = zParamMap.begin(); it != zParamMap.end(); ++it) {
484 for (Int_t iHit = 0; iHit < hits->GetEntriesFast(); ++iHit) {
488 if (zParamMap.find(hit->GetZ()) == zParamMap.end()) {
489 std::cout <<
"-E- CbmLitNearestHitTofMerger::DoMerge: Z position " << hit->GetZ() <<
" not found in map. Something is wrong.\n";
491 FairTrackParam tpar(zParamMap[hit->GetZ()]);
492 Double_t dX = tpar.GetX() - hit->GetX();
493 Double_t dY = tpar.GetY() - hit->GetY();
494 if (Abs(dX) < xCut && Abs(dY) < yCut && Abs(dX) < minDX && Abs(dY) < minDY) {
505 *(parTrack) = minPar;
508 kalman->
Update(parTrack, minHit, chi);
516void BmnQaOffline::doMatchingAnal() {
517 for (Int_t iTrack = 0; iTrack < fGemTracks->GetEntriesFast(); iTrack++) {
520 const Int_t ndets = 4;
521 const Int_t nSeqs = 4;
522 TString dets[ndets] = {
"CSC",
"DCH1",
"TOF700",
"DCH2"};
523 TClonesArray * detSequence[ndets][nSeqs] = {
524 {fDchHits, fTof700Hits, fDchHits, fCscHits},
525 {fCscHits, fTof700Hits, fDchHits, fDchHits},
526 {fCscHits, fDchHits, fDchHits, fTof700Hits},
527 {fCscHits, fDchHits, fTof700Hits, fDchHits}
530 Int_t idx[ndets][nSeqs] = {
536 Bool_t doUpdate[ndets][nSeqs] = {
537 {kTRUE, kFALSE, kTRUE, kFALSE},
538 {kTRUE, kFALSE, kTRUE, kFALSE},
539 {kTRUE, kTRUE, kTRUE, kFALSE},
540 {kTRUE, kTRUE, kFALSE, kFALSE}
543 for (Int_t iDet = 0; iDet < ndets; iDet++) {
545 if (MatchDetector(&parLast, detSequence[iDet][0], doUpdate[iDet][0], idx[iDet][0]))
546 if (MatchDetector(&parLast, detSequence[iDet][1], doUpdate[iDet][1], idx[iDet][1]))
547 if (MatchDetector(&parLast, detSequence[iDet][2], doUpdate[iDet][2], idx[iDet][2])) {
548 BmnHit* hit = MatchDetector(&parLast, detSequence[iDet][3], doUpdate[iDet][3], idx[iDet][3]);
549 dst->
GetManager()->
H1(Form(
"%sDST_1d, hAllNo%s", prefix.Data(), dets[iDet].Data()))->Fill(1.0 / parLast.GetQp());
550 dst->
GetManager()->
H2(Form(
"%sDST_2d, hAllNo%sXY", prefix.Data(), dets[iDet].Data()))->Fill(parLast.GetX(), parLast.GetY());
552 dst->
GetManager()->
H1(Form(
"%sDST_1d, hAllYes%s", prefix.Data(), dets[iDet].Data()))->Fill(1.0 / parLast.GetQp());
553 dst->
GetManager()->
H2(Form(
"%sDST_2d, hAllYes%sXY", prefix.Data(), dets[iDet].Data()))->Fill(parLast.GetX(), parLast.GetY());
560void BmnQaOffline::doEfficiencyAnal() {
561 const Int_t ndets = 4;
562 TString dets[ndets] = {
"CSC",
"DCH1",
"TOF700",
"DCH2"};
564 for (Int_t iDet = 0; iDet < ndets; iDet++) {
565 TH1F* denom1 = (TH1F*) dst->
GetManager()->
H1(Form(
"%sDST_1d, hAllNo%s", prefix.Data(), dets[iDet].Data()));
568 TH1F* nom1 = (TH1F*) dst->
GetManager()->
H1(Form(
"%sDST_1d, hAllYes%s", prefix.Data(), dets[iDet].Data()));
571 TH1F* eff1 = (TH1F*) dst->
GetManager()->
H1(Form(
"%sDST_1d, hEff%s", prefix.Data(), dets[iDet].Data()));
572 eff1->Divide(nom1, denom1);
574 eff1->SetMaximum(110);
577 TH2F* denom2 = (TH2F*) dst->
GetManager()->
H2(Form(
"%sDST_2d, hAllNo%sXY", prefix.Data(), dets[iDet].Data()));
580 TH2F* nom2 = (TH2F*) dst->
GetManager()->
H2(Form(
"%sDST_2d, hAllYes%sXY", prefix.Data(), dets[iDet].Data()));
583 TH2F* eff2 = (TH2F*) dst->
GetManager()->
H2(Form(
"%sDST_2d, hEff%sXY", prefix.Data(), dets[iDet].Data()));
584 eff2->Divide(nom2, denom2);
588void BmnQaOffline::doResidualsPullsAnal() {
589 const Int_t ndets = 8;
590 TString dets[ndets] = {
"MWPC",
"SILICON",
"GEM",
"CSC",
"TOF400",
"DCH1",
"TOF700",
"DCH2"};
592 TClonesArray * detSequence[ndets] = {fMwpcHits, fSiliconHits, fGemHits, fCscHits, fTof400Hits, fDchHits, fTof700Hits, fDchHits};
595 for (Int_t iDet = 0; iDet < ndets; iDet++) {
596 if (!detSequence[iDet])
598 for (Int_t iHit = 0; iHit < detSequence[iDet]->GetEntriesFast(); iHit++) {
599 BmnHit* hit = (
BmnHit*) detSequence[iDet]->UncheckedAt(iHit);
601 if (dets[iDet].Contains(
"DCH")) {
602 dets[iDet] = (hit->
GetStation() == 0) ?
"DCH1" :
"DCH2";
603 dst->
GetManager()->
H1(Form(
"%sDST_1d, hResX%s", prefix.Data(), dets[iDet].Data()))->Fill(hit->
GetResX());
604 dst->
GetManager()->
H1(Form(
"%sDST_1d, hResY%s", prefix.Data(), dets[iDet].Data()))->Fill(hit->
GetResY());
606 dst->
GetManager()->
H1(Form(
"%sDST_1d, hResX%s", prefix.Data(), dets[iDet].Data()))->Fill(hit->
GetResX());
607 dst->
GetManager()->
H1(Form(
"%sDST_1d, hResY%s", prefix.Data(), dets[iDet].Data()))->Fill(hit->
GetResY());
613 for (Int_t iGlob = 0; iGlob < fGlobalTracks->GetEntriesFast(); iGlob++) {
622 for (Int_t iHit = 0; iHit < fDchHits->GetEntriesFast(); iHit++) {
627 Double_t X = hit->GetX();
628 Double_t dX = hit->GetDx();
630 Double_t Y = hit->GetY();
631 Double_t dY = hit->GetDy();
633 FairTrackParam par(*first);
636 TString det = (hit->
GetStation() == 0) ?
"DCH1" :
"DCH2";
637 dst->
GetManager()->
H1(Form(
"%sDST_1d, hPullX%s", prefix.Data(), det.Data()))->Fill(((par.GetX() - X) / dX));
638 dst->
GetManager()->
H1(Form(
"%sDST_1d, hPullY%s", prefix.Data(), det.Data()))->Fill(((par.GetY() - Y) / dY));
641 vector <TString> trackDets = {
"MWPC",
"SILICON",
"GEM"};
642 vector <TClonesArray*> tracks = {fMwpcTracks, fSiliconTracks, fGemTracks};
643 vector <TClonesArray*> trackHits = {fMwpcHits, fSiliconHits, fGemHits};
650 Int_t idxArr =
detector.Contains(
"MWPC") ? 0 :
detector.Contains(
"SILICON") ? 1 : 2;
655 for (Int_t iHit = 0; iHit < track->
GetNHits(); iHit++) {
658 Double_t X = hit->GetX();
659 Double_t dX = hit->GetDx();
661 Double_t Y = hit->GetY();
662 Double_t dY = hit->GetDy();
664 FairTrackParam par(*first);
667 dst->
GetManager()->
H1(Form(
"%sDST_1d, hPullX%s", prefix.Data(),
detector.Data()))->Fill(((par.GetX() - X) / dX));
668 dst->
GetManager()->
H1(Form(
"%sDST_1d, hPullY%s", prefix.Data(),
detector.Data()))->Fill(((par.GetY() - Y) / dY));
673 vector <TString> hitDets = {
"CSC",
"TOF400",
"TOF700"};
674 vector <TClonesArray*> hits = {fCscHits, fTof400Hits, fTof700Hits};
680 Int_t idxArr =
detector.Contains(
"CSC") ? 0 :
detector.Contains(
"TOF400") ? 1 : 2;
685 Double_t X = hit->GetX();
686 Double_t dX = hit->GetDx();
688 Double_t Y = hit->GetY();
689 Double_t dY = hit->GetDy();
691 FairTrackParam par(*first);
694 dst->
GetManager()->
H1(Form(
"%sDST_1d, hPullX%s", prefix.Data(),
detector.Data()))->Fill(((par.GetX() - X) / dX));
695 dst->
GetManager()->
H1(Form(
"%sDST_1d, hPullY%s", prefix.Data(),
detector.Data()))->Fill(((par.GetY() - Y) / dY));
702void BmnQaOffline::doOccupancy(TClonesArray* hits) {
706 const Double_t zBorder = 500.;
707 for (Int_t iHit = 0; iHit < hits->GetEntriesFast(); iHit++) {
710 Double_t x = hit->GetX();
711 Double_t y = hit->GetY();
712 Double_t z = hit->GetZ();
714 TString className = (TString) hit->GetName();
715 TString detName = (className.Contains(
"Gem")) ?
"GEM" :
716 (className.Contains(
"Silicon")) ?
"SILICON" :
717 (className.Contains(
"CSC")) ?
"CSC" :
"";
719 if (detName.IsNull()) {
720 if (className.Contains(
"Tof") && (z < zBorder))
722 else if (className.Contains(
"Tof") && (z > zBorder))
726 if (detName.Contains(
"GEM")) {
727 for (Int_t iStat = 0; iStat < fDetGem->
GetNStations(); iStat++)
729 dst->
GetManager()->
H2(Form(
"%sDST_2d, hOccupancy%s, stat %d", prefix.Data(), detName.Data(), iStat))->Fill(x, y);
730 }
else if (detName.Contains(
"SILICON")) {
731 for (Int_t iStat = 0; iStat < fDetSilicon->
GetNStations(); iStat++)
733 dst->
GetManager()->
H2(Form(
"%sDST_2d, hOccupancy%s, stat %d", prefix.Data(), detName.Data(), iStat))->Fill(x, y);
734 }
else if (detName.Contains(
"CSC")) {
735 for (Int_t iStat = 0; iStat < fDetCsc->
GetNStations(); iStat++)
737 dst->
GetManager()->
H2(Form(
"%sDST_2d, hOccupancy%s, stat %d", prefix.Data(), detName.Data(), iStat))->Fill(x, y);
738 }
else if (detName.Contains(
"TOF400") || detName.Contains(
"TOF700"))
739 dst->
GetManager()->
H2(Form(
"%sDST_2d, hOccupancy%s", prefix.Data(), detName.Data()))->Fill(x, y);
743void BmnQaOffline::doOccupancyAnal() {
744 const Int_t ndets = 5;
745 TString dets[ndets] = {
"SILICON",
"GEM",
"CSC",
"TOF400",
"TOF700"};
747 for (Int_t iDet = 0; iDet < ndets; iDet++) {
748 if (dets[iDet].Contains(
"GEM"))
749 for (Int_t iStat = 0; iStat < fDetGem->
GetNStations(); iStat++)
750 changeHistoContent((TH2F*) dst->
GetManager()->
H2(Form(
"%sDST_2d, hOccupancy%s, stat %d", prefix.Data(), dets[iDet].Data(), iStat)));
752 else if (dets[iDet].Contains(
"SILICON"))
753 for (Int_t iStat = 0; iStat < fDetSilicon->
GetNStations(); iStat++)
754 changeHistoContent((TH2F*) dst->
GetManager()->
H2(Form(
"%sDST_2d, hOccupancy%s, stat %d", prefix.Data(), dets[iDet].Data(), iStat)));
756 else if (dets[iDet].Contains(
"CSC"))
757 for (Int_t iStat = 0; iStat < fDetCsc->
GetNStations(); iStat++)
758 changeHistoContent((TH2F*) dst->
GetManager()->
H2(Form(
"%sDST_2d, hOccupancy%s, stat %d", prefix.Data(), dets[iDet].Data(), iStat)));
761 changeHistoContent((TH2F*) dst->
GetManager()->
H2(Form(
"%sDST_2d, hOccupancy%s", prefix.Data(), dets[iDet].Data())));
765void BmnQaOffline::changeHistoContent(TH2F* h) {
766 for (Int_t iBinX = 0; iBinX < h->GetNbinsX() + 1; iBinX++)
767 for (Int_t iBinY = 1; iBinY < h->GetNbinsY() + 1; iBinY++) {
768 Double_t wX = h->GetXaxis()->GetBinWidth(iBinX);
769 Double_t wY = h->GetYaxis()->GetBinWidth(iBinY);
770 Double_t content = h->GetBinContent(iBinX, iBinY);
772 content /= (wX * wY * fCurrentEvent);
773 h->SetBinContent(iBinX, iBinY, content);
777void BmnQaOffline::doAverageStripValuePerHit(TClonesArray* hits) {
781 const Int_t nLayers = 2;
782 TString layers[nLayers] = {
"X",
"X'"};
784 for (Int_t iHit = 0; iHit < hits->GetEntriesFast(); iHit++) {
787 TString className = (TString) hit->GetName();
788 TString detName = (className.Contains(
"Gem")) ?
"GEM" :
789 (className.Contains(
"Silicon")) ?
"SILICON" :
790 (className.Contains(
"CSC")) ?
"CSC" :
"";
792 if (detName.IsNull())
795 if (detName.Contains(
"GEM")) {
799 }
else if (detName.Contains(
"SILICON")) {
803 }
else if (detName.Contains(
"CSC")) {
811void BmnQaOffline::doAverageStripValuePerTrack() {
815 const Int_t nLayers = 2;
816 TString layers[nLayers] = {
"X",
"X'"};
818 vector <TString> trackDets = {
"SILICON",
"GEM"};
819 vector <TClonesArray*> tracks = {fSiliconTracks, fGemTracks};
820 vector <TClonesArray*> trackHits = {fSiliconHits, fGemHits};
822 for (Int_t iTrack = 0; iTrack < fGlobalTracks->GetEntriesFast(); iTrack++) {
829 for (Int_t iLayer = 0; iLayer < nLayers; iLayer++) {
837 Int_t idxArr =
detector.Contains(
"SILICON") ? 0 : 1;
844 Double_t sumLower = 0.;
845 Double_t sumUpper = 0.;
848 for (Int_t iHit = 0; iHit < track->
GetNHits(); iHit++) {
853 for (Int_t iLayer = 0; iLayer < nLayers; iLayer++) {
854 dst->
GetManager()->
H1(Form(
"%sDST_1d, Ave. strip value per track in %s (%s)", prefix.Data(),
detector.Data(), layers[0].Data()))->Fill(sumLower / track->
GetNHits());
855 dst->
GetManager()->
H1(Form(
"%sDST_1d, Ave. strip value per track in %s (%s)", prefix.Data(),
detector.Data(), layers[1].Data()))->Fill(sumUpper / track->
GetNHits());
858 for (Int_t iHit = 0; iHit < track->
GetNHits(); iHit++) {
863 for (Int_t iLayer = 0; iLayer < nLayers; iLayer++) {
864 dst->
GetManager()->
H1(Form(
"%sDST_1d, Ave. strip value per track in %s (%s)", prefix.Data(),
detector.Data(), layers[0].Data()))->Fill(sumLower / track->
GetNHits());
865 dst->
GetManager()->
H1(Form(
"%sDST_1d, Ave. strip value per track in %s (%s)", prefix.Data(),
detector.Data(), layers[1].Data()))->Fill(sumUpper / track->
GetNHits());
Double_t GetStripTotalSignalInLowerLayer()
Double_t GetStripTotalSignalInUpperLayer()
Int_t GetClusterSizeInLowerLayer()
Int_t GetClusterSizeInUpperLayer()
BmnQaHistoManager * GetManager()
BmnQaHistoManager * GetManager()
BmnQaHistoManager * GetManager()
Int_t GetClusterSizeInUpperLayer()
Double_t GetStripTotalSignalInUpperLayer()
Int_t GetClusterSizeInLowerLayer()
Double_t GetStripTotalSignalInLowerLayer()
Int_t GetTof2HitIndex() const
Int_t GetCscHitIndex(Int_t idx) const
Int_t GetGemTrackIndex() const
Int_t GetSilTrackIndex() const
Int_t GetTof1HitIndex() const
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
BmnStatus TGeoTrackPropagate(FairTrackParam *par, Double_t zOut, Int_t pdg, vector< Double_t > *F, Double_t *length, Bool_t isField)
BmnStatus Update(FairTrackParam *par, const BmnHit *hit, Double_t &chiSq)
void SetGeometriesByRunId(Int_t id, BmnGemStripStationSet *&gem, BmnSiliconStationSet *&silicon, BmnCSCStationSet *&csc)
Int_t GetNumberOfDets(Int_t period, TString setup, TString type)
vector< TString > GetDetectors(Int_t period, TString setup="BM@N")
pair< Int_t, TString > GetRunAndSetupByRunId(Int_t id)
vector< TString > GetTriggers(Int_t period, TString setup="BM@N")
virtual InitStatus Init()
virtual void Exec(Option_t *opt)
Double_t GetStripTotalSignalInLowerLayer()
Double_t GetStripTotalSignalInUpperLayer()
Int_t GetClusterSizeInLowerLayer()
Int_t GetClusterSizeInUpperLayer()
BmnQaHistoManager * GetManager()
FairTrackParam * GetParamFirst()
Int_t GetHitIndex(Int_t iHit) const
FairTrackParam * GetParamLast()
BmnQaHistoManager * GetManager()
static UniRun * GetRun(int period_number, int run_number)
get run from the database
static int ReadGeometryFile(int period_number, int run_number, char *geo_file_path, bool usePrevGeometryIfMissing=false)
double * GetFieldVoltage()
get field voltage of the current run