From 6f17c3eea26e51356f7f5b3a8df9ee9bc9b0f31c Mon Sep 17 00:00:00 2001 From: Dominik Smith <smith@th.physik.uni-frankfurt.de> Date: Mon, 2 Nov 2020 16:25:56 +0100 Subject: [PATCH] CbmMuchDigitizerQa: Added safeguards to prevent access attempts to absent MC data trees. --- macro/mcbm/mcbm_qa.C | 4 +- sim/detectors/much/qa/CbmMuchDigitizerQa.cxx | 407 ++++++++++--------- 2 files changed, 219 insertions(+), 192 deletions(-) diff --git a/macro/mcbm/mcbm_qa.C b/macro/mcbm/mcbm_qa.C index a447c508a0..7a0283d61e 100644 --- a/macro/mcbm/mcbm_qa.C +++ b/macro/mcbm/mcbm_qa.C @@ -32,8 +32,8 @@ #endif void mcbm_qa(Int_t nEvents = 0, - TString dataset = "data/mcbm_beam_2020_03_test", - TString setup = "mcbm_beam_2020_03") { + TString dataset = "data/mcbm_beam_2020_03_test", + TString setup = "mcbm_beam_2020_03") { // ======================================================================== // Adjust this part according to your requirements diff --git a/sim/detectors/much/qa/CbmMuchDigitizerQa.cxx b/sim/detectors/much/qa/CbmMuchDigitizerQa.cxx index 69fa3bcc08..62345f61de 100644 --- a/sim/detectors/much/qa/CbmMuchDigitizerQa.cxx +++ b/sim/detectors/much/qa/CbmMuchDigitizerQa.cxx @@ -111,6 +111,12 @@ InitStatus CbmMuchDigitizerQa::Init() { FairRootManager* fManager = FairRootManager::Instance(); fMCTracks = (TClonesArray*) fManager->GetObject("MCTrack"); fPoints = (TClonesArray*) fManager->GetObject("MuchPoint"); + if (fMCTracks && fPoints) { + LOG(info) << " CbmMuchDigitizerQa: MC data read."; + } else { + LOG(info) << " CbmMuchDigitizerQa: No MC data found."; + } + // Reading Much Digis from CbmMuchDigiManager which are stored as vector fDigiManager = CbmDigiManager::Instance(); fDigiManager->Init(); @@ -465,8 +471,6 @@ void CbmMuchDigitizerQa::InitFits() { fFitPr->SetLineColor(kBlack); } -// ------------------------------------------------------------------------- - // ------------------------------------------------------------------------- void CbmMuchDigitizerQa::SetParContainers() { // Get run and runtime database @@ -487,7 +491,6 @@ void CbmMuchDigitizerQa::SetParContainers() { // bool mcbmFlag = geoTag.Contains("mcbm", TString::kIgnoreCase); // CbmMuchGeoScheme::Instance()->Init(stations, mcbmFlag); } -// ------------------------------------------------------------------------- // -------------------------------------------------------------------------x void CbmMuchDigitizerQa::Exec(Option_t*) { @@ -506,46 +509,187 @@ void CbmMuchDigitizerQa::Exec(Option_t*) { gDirectory = oldDirectory; return; } + // ------------------------------------------------------------------------- +void CbmMuchDigitizerQa::OccupancyQa() { + // Filling occupancy plots + for (Int_t i = 0; i < fDigiManager->GetNofDigis(ECbmModuleId::kMuch); i++) { + CbmMuchDigi* digi = (CbmMuchDigi*) fDigiManager->Get<CbmMuchDigi>(i); + assert(digi); + UInt_t address = digi->GetAddress(); + CbmMuchModule* module = fGeoScheme->GetModuleByDetId(address); + if (!module) continue; + Double_t r0 = 0; + if (module->GetDetectorType() != 4 && module->GetDetectorType() != 3) + continue; + CbmMuchModuleGem* module1 = (CbmMuchModuleGem*) module; + CbmMuchPad* pad = module1->GetPad( + address); // fGeoScheme->GetPadByDetId(detectorId, channelId); + assert(pad); + Double_t x0 = pad->GetX(); + Double_t y0 = pad->GetY(); + r0 = TMath::Sqrt(x0 * x0 + y0 * y0); + fvUsPadsFiredR[CbmMuchAddress::GetStationIndex(address)]->Fill(r0); + fvUsPadsFiredXY[CbmMuchAddress::GetStationIndex(address)]->Fill(x0, y0); + } +} -void CbmMuchDigitizerQa::PrintFrontLayerPoints() { - for (int i = 0; i < fPoints->GetEntriesFast(); i++) { +// ------------------------------------------------------------------------- +void CbmMuchDigitizerQa::DigitizerQa() { + + if (!fMCTracks || !fPoints) { + LOG(debug) + << " CbmMuchDigitizerQa::DigitizerQa(): Found no MC data. Skipping."; + return; + } + TVector3 vIn; // in position of the track + TVector3 vOut; // out position of the track + TVector3 p; // track momentum + fPointInfos->Clear(); + + for (Int_t i = 0; i < fPoints->GetEntriesFast(); i++) { CbmMuchPoint* point = (CbmMuchPoint*) fPoints->At(i); Int_t stId = CbmMuchAddress::GetStationIndex(point->GetDetectorID()); - if (stId != 0) continue; - Int_t layerId = CbmMuchAddress::GetLayerIndex(point->GetDetectorID()); - if (layerId != 0) continue; - printf("point %4i xin=%6.2f yin=%6.2f xout=%6.2f yout=%6.2f zin=%6.2f\n", - i, - point->GetXIn(), - point->GetYIn(), - point->GetXOut(), - point->GetYOut(), - point->GetZIn()); + + // Check if the point corresponds to a certain MC Track + Int_t trackId = point->GetTrackID(); + if (trackId < 0) { + new ((*fPointInfos)[i]) CbmMuchPointInfo(0, 0, 0, 0, 0); + continue; + } + CbmMCTrack* mcTrack = (CbmMCTrack*) fMCTracks->At(trackId); + if (!mcTrack) { + new ((*fPointInfos)[i]) CbmMuchPointInfo(0, 0, 0, 0, 0); + continue; + } + + Int_t motherId = mcTrack->GetMotherId(); + Int_t pdgCode = mcTrack->GetPdgCode(); + TParticlePDG* particle = TDatabasePDG::Instance()->GetParticle(pdgCode); + if (!particle || pdgCode == 22 || // photons + pdgCode == 2112) // neutrons + { + new ((*fPointInfos)[i]) CbmMuchPointInfo(0, 0, 0, 0, 0); + continue; + } + + Double_t mass = particle->Mass(); + point->PositionIn(vIn); + point->PositionOut(vOut); + point->Momentum(p); + Double_t length = (vOut - vIn).Mag(); // Track length + Double_t kine = sqrt(p.Mag2() + mass * mass) - mass; // Kinetic energy + // Get mother pdg code + Int_t motherPdg = 0; + CbmMCTrack* motherTrack = NULL; + if (motherId != -1) motherTrack = (CbmMCTrack*) fMCTracks->At(motherId); + if (motherTrack) motherPdg = motherTrack->GetPdgCode(); + new ((*fPointInfos)[i]) + CbmMuchPointInfo(pdgCode, motherPdg, kine, length, stId); } + + FillChargePerPoint(); + FillDigitizerPerformancePlots(); } + // ------------------------------------------------------------------------- +void CbmMuchDigitizerQa::FillChargePerPoint() { -void CbmMuchDigitizerQa::PrintFrontLayerDigis() { + if (!fMCTracks || !fPoints) { + LOG(debug) << " CbmMuchDigitizerQa::FillChargePerPoint()): Found no MC " + "data. Skipping."; + return; + } for (Int_t i = 0; i < fDigiManager->GetNofDigis(ECbmModuleId::kMuch); i++) { CbmMuchDigi* digi = (CbmMuchDigi*) fDigiManager->Get<CbmMuchDigi>(i); - UInt_t address = digi->GetAddress(); - Int_t stId = CbmMuchAddress::GetStationIndex(address); - if (stId != 0) continue; - Int_t layerId = CbmMuchAddress::GetLayerIndex(address); - if (layerId != 0) continue; - CbmMuchModuleGem* module = - (CbmMuchModuleGem*) fGeoScheme->GetModuleByDetId(address); + assert(digi); + CbmMatch* match = + (CbmMatch*) fDigiManager->GetMatch(ECbmModuleId::kMuch, i); + assert(match); + CbmMuchModule* module = fGeoScheme->GetModuleByDetId(digi->GetAddress()); + assert(module); if (!module) continue; - CbmMuchPad* pad = module->GetPad(address); - Double_t x0 = pad->GetX(); - Double_t y0 = pad->GetY(); - UInt_t charge = digi->GetAdc(); - printf("digi %4i x0=%5.1f y0=%5.1f charge=%3i\n", i, x0, y0, charge); + Double_t area = 0; + if (module->GetDetectorType() != 4 && module->GetDetectorType() != 3) + continue; /// rpc + LOG(debug) << GetName() << " Processing MuchDigi " << i << " at address " + << digi->GetAddress() << " Module number " + << module->GetDetectorType(); + + CbmMuchModuleGem* module1 = (CbmMuchModuleGem*) module; + assert(module1); + CbmMuchPad* pad = module1->GetPad(digi->GetAddress()); + assert(pad); + area = pad->GetDx() * pad->GetDy(); + Int_t nofLinks = match->GetNofLinks(); + for (Int_t pt = 0; pt < nofLinks; pt++) { + Int_t pointId = match->GetLink(pt).GetIndex(); + Int_t charge = match->GetLink(pt).GetWeight(); + CbmMuchPointInfo* info = (CbmMuchPointInfo*) fPointInfos->At(pointId); + if (info->GetPdgCode() == 0) continue; + info->AddCharge(charge); + info->AddArea(area); + } } } + // ------------------------------------------------------------------------- +void CbmMuchDigitizerQa::FillDigitizerPerformancePlots() { + if (!fMCTracks || !fPoints) { + LOG(debug) << " CbmMuchDigitizerQa::FillDigitizerPerformancePlots(): Found " + "no MC data. Skipping."; + return; + } + Bool_t verbose = (fVerbose > 2); + for (Int_t i = 0; i < fPointInfos->GetEntriesFast(); i++) { + CbmMuchPointInfo* info = (CbmMuchPointInfo*) fPointInfos->At(i); + if (verbose) { + printf("%i", i); + info->Print(); + } + Double_t length = info->GetLength(); + Double_t kine = 1000 * (info->GetKine()); + Double_t charge = info->GetCharge(); + Int_t pdg = info->GetPdgCode(); + if (pdg == 0) continue; + if (charge <= 0) continue; + Double_t log_kine = TMath::Log10(kine); + Double_t log_charge = TMath::Log10(charge); + charge = charge / 1.e+4; // measure charge in 10^4 electrons + + Int_t nPads = info->GetNPads(); + Double_t area = info->GetArea() / nPads; + // printf("%f %i\n",TMath::Log2(area),nPads); + fhNpadsVsS->Fill(TMath::Log2(area), nPads); + fhMcPointCharge->Fill(charge); + fvMcPointCharge[info->GetStationId()]->Fill(charge); + fhMcPointChargeLog->Fill(log_charge); + fhMcPointChargeVsTrackEnergyLog->Fill(log_kine, charge); + fhMcPointChargeVsTrackLength->Fill(length, charge); + fhTrackLength->Fill(length); + + if (pdg == 2212) { + fhMcPointChargeVsTrackEnergyLogPr->Fill(log_kine, charge); + fhMcPointChargeVsTrackLengthPr->Fill(length, charge); + fhTrackLengthPr->Fill(length); + } else if (pdg == 211 || pdg == -211) { + fhMcPointChargeVsTrackEnergyLogPi->Fill(log_kine, charge); + fhMcPointChargeVsTrackLengthPi->Fill(length, charge); + fhTrackLengthPi->Fill(length); + } else if (pdg == 11 || pdg == -11) { + fhMcPointChargeVsTrackEnergyLogEl->Fill(log_kine, charge); + fhMcPointChargeVsTrackLengthEl->Fill(length, charge); + fhTrackLengthEl->Fill(length); + } + if (pdg == 2212 && length > 0.3 && length < 0.32 && kine > 1000 + && kine < 1020) + fhMcPointChargePr_1GeV_3mm->Fill(charge); + } +} + + +// ------------------------------------------------------------------------- void CbmMuchDigitizerQa::DrawCanvases() { fCanvCharge->cd(1); @@ -626,6 +770,50 @@ void CbmMuchDigitizerQa::DrawCanvases() { fhNpadsVsS->DrawCopy("colz", ""); } + +void CbmMuchDigitizerQa::PrintFrontLayerPoints() { + + if (!fMCTracks || !fPoints) { + LOG(debug) << " CbmMuchDigitizerQa::PrintFrontLayerPoints(): Found no MC " + "data. Skipping."; + return; + } + for (int i = 0; i < fPoints->GetEntriesFast(); i++) { + CbmMuchPoint* point = (CbmMuchPoint*) fPoints->At(i); + Int_t stId = CbmMuchAddress::GetStationIndex(point->GetDetectorID()); + if (stId != 0) continue; + Int_t layerId = CbmMuchAddress::GetLayerIndex(point->GetDetectorID()); + if (layerId != 0) continue; + printf("point %4i xin=%6.2f yin=%6.2f xout=%6.2f yout=%6.2f zin=%6.2f\n", + i, + point->GetXIn(), + point->GetYIn(), + point->GetXOut(), + point->GetYOut(), + point->GetZIn()); + } +} + +// ------------------------------------------------------------------------- +void CbmMuchDigitizerQa::PrintFrontLayerDigis() { + for (Int_t i = 0; i < fDigiManager->GetNofDigis(ECbmModuleId::kMuch); i++) { + CbmMuchDigi* digi = (CbmMuchDigi*) fDigiManager->Get<CbmMuchDigi>(i); + UInt_t address = digi->GetAddress(); + Int_t stId = CbmMuchAddress::GetStationIndex(address); + if (stId != 0) continue; + Int_t layerId = CbmMuchAddress::GetLayerIndex(address); + if (layerId != 0) continue; + CbmMuchModuleGem* module = + (CbmMuchModuleGem*) fGeoScheme->GetModuleByDetId(address); + if (!module) continue; + CbmMuchPad* pad = module->GetPad(address); + Double_t x0 = pad->GetX(); + Double_t y0 = pad->GetY(); + UInt_t charge = digi->GetAdc(); + printf("digi %4i x0=%5.1f y0=%5.1f charge=%3i\n", i, x0, y0, charge); + } +} + // ------------------------------------------------------------------------- void CbmMuchDigitizerQa::FinishTask() { @@ -643,9 +831,7 @@ void CbmMuchDigitizerQa::FinishTask() { gROOT->SetBatch(kFALSE); gStyle->SetPaperSize(20, 20); - if (fVerbose > 1) { - OutputNvsS(); - } + if (fVerbose > 1) { OutputNvsS(); } FairSink* sink = FairRootManager::Instance()->GetSink(); sink->WriteObject(&fOutFolder, nullptr); gDirectory = oldDirectory; @@ -696,166 +882,7 @@ Double_t CbmMuchDigitizerQa::LandauMPV(Double_t* lg_x, Double_t* par) { Double_t x = TMath::Power(10, lg_x[0]); return gaz_gain_mean * MPV_n_e(x, mass); } -// ------------------------------------------------------------------------- - -// ------------------------------------------------------------------------- -void CbmMuchDigitizerQa::DigitizerQa() { - TVector3 vIn; // in position of the track - TVector3 vOut; // out position of the track - TVector3 p; // track momentum - fPointInfos->Clear(); - - for (Int_t i = 0; i < fPoints->GetEntriesFast(); i++) { - CbmMuchPoint* point = (CbmMuchPoint*) fPoints->At(i); - Int_t stId = CbmMuchAddress::GetStationIndex(point->GetDetectorID()); - - // Check if the point corresponds to a certain MC Track - Int_t trackId = point->GetTrackID(); - if (trackId < 0) { - new ((*fPointInfos)[i]) CbmMuchPointInfo(0, 0, 0, 0, 0); - continue; - } - CbmMCTrack* mcTrack = (CbmMCTrack*) fMCTracks->At(trackId); - if (!mcTrack) { - new ((*fPointInfos)[i]) CbmMuchPointInfo(0, 0, 0, 0, 0); - continue; - } - - Int_t motherId = mcTrack->GetMotherId(); - Int_t pdgCode = mcTrack->GetPdgCode(); - TParticlePDG* particle = TDatabasePDG::Instance()->GetParticle(pdgCode); - if (!particle || pdgCode == 22 || // photons - pdgCode == 2112) // neutrons - { - new ((*fPointInfos)[i]) CbmMuchPointInfo(0, 0, 0, 0, 0); - continue; - } - - Double_t mass = particle->Mass(); - point->PositionIn(vIn); - point->PositionOut(vOut); - point->Momentum(p); - Double_t length = (vOut - vIn).Mag(); // Track length - Double_t kine = sqrt(p.Mag2() + mass * mass) - mass; // Kinetic energy - // Get mother pdg code - Int_t motherPdg = 0; - CbmMCTrack* motherTrack = NULL; - if (motherId != -1) motherTrack = (CbmMCTrack*) fMCTracks->At(motherId); - if (motherTrack) motherPdg = motherTrack->GetPdgCode(); - new ((*fPointInfos)[i]) - CbmMuchPointInfo(pdgCode, motherPdg, kine, length, stId); - } - FillChargePerPoint(); - FillDigitizerPerformancePlots(); -} -// ------------------------------------------------------------------------- -void CbmMuchDigitizerQa::FillChargePerPoint() { - for (Int_t i = 0; i < fDigiManager->GetNofDigis(ECbmModuleId::kMuch); i++) { - CbmMuchDigi* digi = (CbmMuchDigi*) fDigiManager->Get<CbmMuchDigi>(i); - assert(digi); - CbmMatch* match = - (CbmMatch*) fDigiManager->GetMatch(ECbmModuleId::kMuch, i); - assert(match); - CbmMuchModule* module = fGeoScheme->GetModuleByDetId(digi->GetAddress()); - assert(module); - if (!module) continue; - Double_t area = 0; - if (module->GetDetectorType() != 4 && module->GetDetectorType() != 3) - continue; /// rpc - LOG(debug) << GetName() << " Processing MuchDigi " << i << " at address " - << digi->GetAddress() << " Module number " - << module->GetDetectorType(); - - CbmMuchModuleGem* module1 = (CbmMuchModuleGem*) module; - assert(module1); - CbmMuchPad* pad = module1->GetPad(digi->GetAddress()); - assert(pad); - area = pad->GetDx() * pad->GetDy(); - Int_t nofLinks = match->GetNofLinks(); - for (Int_t pt = 0; pt < nofLinks; pt++) { - Int_t pointId = match->GetLink(pt).GetIndex(); - Int_t charge = match->GetLink(pt).GetWeight(); - CbmMuchPointInfo* info = (CbmMuchPointInfo*) fPointInfos->At(pointId); - if (info->GetPdgCode() == 0) continue; - info->AddCharge(charge); - info->AddArea(area); - } - } -} - -void CbmMuchDigitizerQa::FillDigitizerPerformancePlots() { - Bool_t verbose = (fVerbose > 2); - for (Int_t i = 0; i < fPointInfos->GetEntriesFast(); i++) { - CbmMuchPointInfo* info = (CbmMuchPointInfo*) fPointInfos->At(i); - if (verbose) { - printf("%i", i); - info->Print(); - } - Double_t length = info->GetLength(); - Double_t kine = 1000 * (info->GetKine()); - Double_t charge = info->GetCharge(); - Int_t pdg = info->GetPdgCode(); - if (pdg == 0) continue; - if (charge <= 0) continue; - Double_t log_kine = TMath::Log10(kine); - Double_t log_charge = TMath::Log10(charge); - charge = charge / 1.e+4; // measure charge in 10^4 electrons - - Int_t nPads = info->GetNPads(); - Double_t area = info->GetArea() / nPads; - // printf("%f %i\n",TMath::Log2(area),nPads); - fhNpadsVsS->Fill(TMath::Log2(area), nPads); - fhMcPointCharge->Fill(charge); - fvMcPointCharge[info->GetStationId()]->Fill(charge); - fhMcPointChargeLog->Fill(log_charge); - fhMcPointChargeVsTrackEnergyLog->Fill(log_kine, charge); - fhMcPointChargeVsTrackLength->Fill(length, charge); - fhTrackLength->Fill(length); - - if (pdg == 2212) { - fhMcPointChargeVsTrackEnergyLogPr->Fill(log_kine, charge); - fhMcPointChargeVsTrackLengthPr->Fill(length, charge); - fhTrackLengthPr->Fill(length); - } else if (pdg == 211 || pdg == -211) { - fhMcPointChargeVsTrackEnergyLogPi->Fill(log_kine, charge); - fhMcPointChargeVsTrackLengthPi->Fill(length, charge); - fhTrackLengthPi->Fill(length); - } else if (pdg == 11 || pdg == -11) { - fhMcPointChargeVsTrackEnergyLogEl->Fill(log_kine, charge); - fhMcPointChargeVsTrackLengthEl->Fill(length, charge); - fhTrackLengthEl->Fill(length); - } - if (pdg == 2212 && length > 0.3 && length < 0.32 && kine > 1000 - && kine < 1020) - fhMcPointChargePr_1GeV_3mm->Fill(charge); - } -} - -// ------------------------------------------------------------------------- -void CbmMuchDigitizerQa::OccupancyQa() { - // Filling occupancy plots - for (Int_t i = 0; i < fDigiManager->GetNofDigis(ECbmModuleId::kMuch); i++) { - CbmMuchDigi* digi = (CbmMuchDigi*) fDigiManager->Get<CbmMuchDigi>(i); - assert(digi); - UInt_t address = digi->GetAddress(); - CbmMuchModule* module = fGeoScheme->GetModuleByDetId(address); - if (!module) continue; - Double_t r0 = 0; - if (module->GetDetectorType() != 4 && module->GetDetectorType() != 3) - continue; - CbmMuchModuleGem* module1 = (CbmMuchModuleGem*) module; - CbmMuchPad* pad = module1->GetPad( - address); // fGeoScheme->GetPadByDetId(detectorId, channelId); - assert(pad); - Double_t x0 = pad->GetX(); - Double_t y0 = pad->GetY(); - r0 = TMath::Sqrt(x0 * x0 + y0 * y0); - fvUsPadsFiredR[CbmMuchAddress::GetStationIndex(address)]->Fill(r0); - fvUsPadsFiredXY[CbmMuchAddress::GetStationIndex(address)]->Fill(x0, y0); - } -} -// ------------------------------------------------------------------------- // ------------------------------------------------------------------------- Int_t CbmMuchDigitizerQa::GetNChannels(Int_t iStation) { -- GitLab