// ------------------------------------------------------------------------- // ----- PndTrackingQualityTaskNewLinks source file ----- // ----- Created 18/07/08 by T.Stockmanns ----- // ------------------------------------------------------------------------- /** * The quality numbers, qualityNumbers, as used here are defined in PndTrackingQualityAnalysis.h */ // C++ includes #include #include // ROOT includes #include "TROOT.h" #include "TClonesArray.h" #include "THStack.h" // FairRoot includes #include "FairRootManager.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "FairHit.h" #include "FairMultiLinkedData.h" // PandaRoot includes #include "PndMCTrack.h" #include "PndTrack.h" #include "PndMCEntry.h" #include "RhoHistogram/RhoTuple.h" // Class includes #include "PndTrackingQualityTaskNewLinks.h" #include "PndTrackingQualityAnalysisNewLinks.h" // ----- Default constructor ------------------------------------------- PndTrackingQualityTaskNewLinks::PndTrackingQualityTaskNewLinks(TString trackBranchName, TString idealBranchName, Bool_t pndTrackData) : FairTask("Creates PndMC test"), fEventNr(0), fTrackBranchName(trackBranchName), fIdealTrackBranchName(idealBranchName), fPndTrackOrTrackCand(pndTrackData) { } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- PndTrackingQualityTaskNewLinks::~PndTrackingQualityTaskNewLinks() { } // ----- Public method Init -------------------------------------------- InitStatus PndTrackingQualityTaskNewLinks::Init() { InitializeHistograms(); ioman = FairRootManager::Instance(); if (!ioman) { std::cout << "-E- PndTrackingQualityTaskNewLinks::Init: " << "RootManager not instantiated!" << std::endl; return kFATAL; } fTrack = (TClonesArray*) ioman->GetObject(fTrackBranchName); fMCTrack = (TClonesArray*) ioman->GetObject("MCTrack"); fIdealTrackCand = (TClonesArray*) ioman->GetObject(fIdealTrackBranchName); fTuple = new RhoTuple("qaTuple", "QA Rho"); if (fBranchNames.size() == 0){ AddHitsBranchName("MVDHitsPixel"); AddHitsBranchName("MVDHitsStrip"); AddHitsBranchName("STTHit"); // AddHitsBranchName("GEMHit"); // std::cout << "PndTrackingQualityAnalysis::Init() CorrectedSkewedHits present: " << FairRootManager::Instance()->GetBranchId("CorrectedSkewedHits") << " "; // if (FairRootManager::Instance()->GetBranchId("CorrectedSkewedHits") > 0){ // std::cout << "kTRUE"; // AddHitsBranchName("CorrectedSkewedHits"); // } // std::cout << std::endl; } for (int i = 0; i < fBranchNames.size(); i++){ fMapEfficiencies[fBranchNames[i]] = new TH2D(fBranchNames[i], fBranchNames[i], 100, 0., 100., 50, 0, 1.1); fMapEfficiencies[fBranchNames[i]]->SetDrawOption("COLz"); } std::cout << "-I- PndTrackingQualityTaskNewLinks::Init: Initialization successfull" << std::endl; return kSUCCESS; } void PndTrackingQualityTaskNewLinks::InitializeHistograms() { fPHisto = new TH1D("fPHisto", "Momentum Resolution", 1000, -1, 1); fPHisto->GetXaxis()->SetTitle("p^{RECO} - p^{MC} / GeV"); fPHisto->GetYaxis()->SetTitle("counts"); fPRelHisto = new TH1D("fPRelHisto", "Relative Momentum Resolution", 1000, -1, 1); fPRelHisto->GetXaxis()->SetTitle("(p^{RECO} - p^{MC}) / p^{MC}"); fPRelHisto->GetYaxis()->SetTitle("counts"); fPtHisto = new TH1D("fPtHisto", "Transverse Momentum Resolution", 1000, -1, 1); fPtHisto->GetXaxis()->SetTitle("p_{t}^{RECO} - p_{t}^{MC} / GeV"); fPtHisto->GetYaxis()->SetTitle("counts"); fPtRelHisto = new TH1D("fPtRelHisto", "Relative Transverse Momentum Resolution", 1000, -1, 1); fPtRelHisto->GetXaxis()->SetTitle("(p_{t}^{RECO} - p_{t}^{MC}) / p_{t}^{MC}"); fPtRelHisto->GetYaxis()->SetTitle("counts"); fQualyHisto = new TH1I("fQualyHisto", "Quality of Trackfinding;;Counts", 26, -15.5, 10.5); fQualyHisto->SetDrawOption("TEXT HIST"); LabelQualyHistogram(fQualyHisto); fQualyHisto_all = new TH1I("fQualyHisto_pos", "Quality of Trackfinding;;Counts", 26, -15.5, 10.5); fQualyHisto_pos = new TH1I("fQualyHisto_pos", "Quality of Trackfinding;;Counts", 26, -15.5, 10.5); fQualyHisto_neg = new TH1I("fQualyHisto_pos", "Quality of Trackfinding;;Counts", 26, -15.5, 10.5); fQualyHisto_mc = new TH1I("fQualyHisto_pos", "Quality of Trackfinding;;Counts", 26, -15.5, 10.5); fQualyStack = new THStack(); } void PndTrackingQualityTaskNewLinks::LabelQualyHistogram(TH1 * hist) { hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kFullyFound), "Fully found"); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kPartiallyFound), "Partially found"); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kSpuriousFound), "Spurious found"); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kGhost), "Ghosts"); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kNotFound), "Total not found"); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kFound), "Total found"); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kPossibleSec), "Possible, Sec."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kPossiblePrim), "Possible, Prim."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kAtLeastThreeSec), ">= 3 Hits, Sec."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kAtLeastThreePrim), ">= 3 Hits, Prim."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kLessThanThreePrim), "< 3 Hits, Prim."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kMcPossibleSec), "MC: Possible, Sec."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kMcPossiblePrim), "MC: Possible, Prim."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kMcAtLeastThreeSec), "MC: >= 3 Hits, Sec."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kMcAtLeastThreePrim), "MC: >= 3 Hits, Prim."); hist->GetXaxis()->SetBinLabel(hist->FindFixBin(qualityNumbers::kMcLessThanThreePrim), "MC: < 3 Hits, Prim."); } // ------------------------------------------------------------------------- void PndTrackingQualityTaskNewLinks::SetParContainers() { } // ----- Public method Exec -------------------------------------------- void PndTrackingQualityTaskNewLinks::Exec(Option_t* opt) { std::cout << "----- Event " << fEventNr << " ------" << std::endl; PndTrackingQualityAnalysisNewLinks qaAna(fTrackBranchName, fIdealTrackBranchName, new CircleHoughTrackFunctor(), fPndTrackOrTrackCand); qaAna.SetVerbose(fVerbose); qaAna.SetHitsBranchNames(fBranchNames); qaAna.Init(); qaAna.AnalyseEvent(); std::map qualiMap = qaAna.GetTrackQualification(); std::map mcStatusMap = qaAna.GetTrackMCStatus(); std::map mcFoundMap = qaAna.GetMCTrackFound(); std::map recoPMap = qaAna.GetP(); // std::map recoPtMap = qaAna.GetPt(); FillQualyHisto(qualiMap, qaAna.GetNGhosts()); FillMCStatus(mcStatusMap); FillEfficiencies(qaAna.GetEfficiencies()); MapToHist(qaAna.GetPResolution(), fPHisto); MapToHist(qaAna.GetPResolutionRel(), fPRelHisto); MapToHist(qaAna.GetPtResolution(), fPtHisto); MapToHist(qaAna.GetPtResolutionRel(), fPtRelHisto); // Save the Tree (/RhoTuple) for some possible additional analysis for (std::map::iterator iter = qualiMap.begin(); iter != qualiMap.end(); iter++) { Int_t mcTrackId = iter->first; Int_t trackQuality = iter->second; TVector3 recoMomentum = recoPMap[mcTrackId]; PndMCTrack * myMcTrack = (PndMCTrack *) fMCTrack->At(mcTrackId); TVector3 mcMomentum = myMcTrack->GetMomentum(); Int_t pdgId = myMcTrack->GetPdgCode(); fTuple->Column("EvtNr", (Int_t) fEventNr); // number of the currently processed event fTuple->Column("McTrackId", (Int_t) mcTrackId); // id of the currently processed track fTuple->Column("McTrackFoundNTimes", (Int_t) mcFoundMap[mcTrackId]); // A given MC track was found N times fTuple->Column("TrackQuality", (Int_t) trackQuality); // the quality of the current track fTuple->Column("Mc_TrackQuality", (Int_t) mcStatusMap[mcTrackId] - 6); // the mc quality of the current track, -6 to match the global qualityNumbers fTuple->Column("PdgId", (Int_t) pdgId); fTuple->Column("Mc_px", (Double_t) mcMomentum.Px()); // To compare to the additionally saved pt histogram, call Draw("Reco_pt:Mc_pt","TrackQuality > 0") on the Tuple fTuple->Column("Mc_py", (Double_t) mcMomentum.Py()); fTuple->Column("Mc_pz", (Double_t) mcMomentum.Pz()); fTuple->Column("Mc_pt", (Double_t) mcMomentum.Pt()); fTuple->Column("Reco_px", (Double_t) recoMomentum.Px()); fTuple->Column("Reco_py", (Double_t) recoMomentum.Py()); fTuple->Column("Reco_pz", (Double_t) recoMomentum.Pz()); fTuple->Column("Reco_pt", (Double_t) recoMomentum.Pt()); // fTuple->Column("Reco_pt2", (Double_t) recoPtMap[mcTrackId]); // cross check fTuple->DumpData(); } // if (fVerbose > 1) qaAna.PrintTrackQualityMap(); fEventNr++; } Int_t PndTrackingQualityTaskNewLinks::GetSumOfAllValidMCHits(FairMultiLinkedData* trackData) { Int_t result = 0; for (int branchIndex = 0; branchIndex < fBranchNames.size(); branchIndex++){ result += trackData->GetLinksWithType(ioman->GetBranchId(fBranchNames[branchIndex])).GetNLinks(); } return result; } void PndTrackingQualityTaskNewLinks::FillQualyHisto(std::map trackQualifikation, Int_t nGhosts) { fQualyHisto->Fill(qualityNumbers::kGhost, nGhosts); for(std::map::iterator iter = trackQualifikation.begin(); iter != trackQualifikation.end(); iter++){ fQualyHisto->Fill(iter->second); if (iter->second > 0){ fQualyHisto->Fill(qualityNumbers::kFound); } else { fQualyHisto->Fill(qualityNumbers::kNotFound); } } } void PndTrackingQualityTaskNewLinks::FillMCStatus(std::map trackMCStatus) { int mcOffset = qualityNumbers::kPossibleSec - qualityNumbers::kMcPossibleSec; for(std::map::iterator iter = trackMCStatus.begin(); iter != trackMCStatus.end(); iter++){ fQualyHisto->Fill(iter->second - mcOffset); // mcOffset = 6 } } void PndTrackingQualityTaskNewLinks::FillEfficiencies(std::map > > efficiencies) { for (std::map > >::iterator iterTracks = efficiencies.begin(); iterTracks != efficiencies.end(); iterTracks++ ){ std::map > branchEfficiency = iterTracks->second; for (std::map >::iterator iterBranch = branchEfficiency.begin(); iterBranch != branchEfficiency.end(); iterBranch++ ){ fMapEfficiencies[iterBranch->first]->Fill(iterBranch->second.second, iterBranch->second.first); } } } void PndTrackingQualityTaskNewLinks::MapToHist (std::map map, TH1 * histo) { for (std::map::iterator iter = map.begin(); iter != map.end(); iter++ ){ histo->Fill(iter->second); } } void PndTrackingQualityTaskNewLinks::Finish() { ColorHistogram(); fQualyStack->Add(fQualyHisto_mc); fQualyStack->Add(fQualyHisto_neg); fQualyStack->Add(fQualyHisto_pos); fQualyStack->Add(fQualyHisto_all); fQualyStack->SetName("fQualyHistoColor"); fQualyStack->SetTitle(fQualyHisto->GetTitle()); // gROOT->SetBatch(kTRUE); // fQualyHisto->Draw(); // LabelQualyHistogram((TH1*) fQualyStack); for (int i = 0; i < fBranchNames.size(); i++){ fMapEfficiencies[fBranchNames[i]]->Write(); } fPHisto->Write(); fPRelHisto->Write(); fPtHisto->Write(); fPtRelHisto->Write(); fQualyHisto->Write(); fQualyStack->Write(); fTuple->GetInternalTree()->Write(); Int_t allTracksWithHits = 0; Int_t allPossibleTracksWithHits = 0; Int_t allTracksWithHitsNotFound = 0; allTracksWithHits += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcAtLeastThreePrim)); // Todo allTracksWithHits += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcAtLeastThreeSec)); allTracksWithHits += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossiblePrim)); allTracksWithHits += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossibleSec)); allPossibleTracksWithHits += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossiblePrim)); allPossibleTracksWithHits += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossibleSec)); allTracksWithHitsNotFound += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kAtLeastThreePrim)); allTracksWithHitsNotFound += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kAtLeastThreeSec)); allTracksWithHitsNotFound += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPossiblePrim)); allTracksWithHitsNotFound += fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPossibleSec)); std::cout << "fQualyHisto: All Tracks: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(-11)) + allTracksWithHits << std::endl << " Primary Tracks < 3 hits: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(-11)) << std::endl << " All Tracks with hits: " << allTracksWithHits << ". Not Found: " << allTracksWithHitsNotFound << std::endl << " Primary Tracks with >= 3 hits, but not a possible track: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcAtLeastThreePrim)) << ". Not Found: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kAtLeastThreePrim)) << std::endl << " Secondary Tracks with >= 3 hits, but not a possible track: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcAtLeastThreeSec)) << ". Not Found: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kAtLeastThreeSec)) << std::endl << " Primary Tracks possible: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossiblePrim)) << ". Not Found: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPossiblePrim)) << std::endl << " Secondary Tracks possible: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossibleSec)) << ". Not Found: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPossibleSec)) << std::endl << " FullyFound: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kFullyFound)) << " " << (Double_t)fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kFullyFound)) / allTracksWithHits * 100 << "% (of all tracks), " << (Double_t)fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kFullyFound)) / allPossibleTracksWithHits * 100 << "% (of all tracks possible)" << " PartlyFound: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPartiallyFound)) << " " << (Double_t)fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPartiallyFound)) / allTracksWithHits * 100 << "% " << (Double_t)fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPartiallyFound)) / allPossibleTracksWithHits * 100 << "% " << " Spurious: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kSpuriousFound)) << " " << (Double_t)fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kSpuriousFound)) / allTracksWithHits * 100 << "% " << (Double_t)fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kSpuriousFound)) / allPossibleTracksWithHits * 100 << "% " << " Ghosts: " << fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kGhost)) << " " << (Double_t)fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kGhost)) / allTracksWithHits * 100 << "% " << (Double_t)fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kGhost)) / allPossibleTracksWithHits * 100 << "% " << std::endl; } void PndTrackingQualityTaskNewLinks::ColorHistogram() { fQualyHisto_pos->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kGhost), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kGhost))); fQualyHisto_pos->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kSpuriousFound), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kSpuriousFound))); fQualyHisto_pos->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPartiallyFound), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPartiallyFound))); fQualyHisto_pos->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kFullyFound), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kFullyFound))); fQualyHisto_pos->SetLineColor(kGreen + 2); fQualyHisto_all->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kFound), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kFound))); fQualyHisto_all->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kNotFound), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kNotFound))); fQualyHisto_all->SetLineColor(kBlack); fQualyHisto_neg->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPossibleSec), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPossibleSec))); fQualyHisto_neg->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPossiblePrim), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kPossiblePrim))); fQualyHisto_neg->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kAtLeastThreeSec), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kAtLeastThreeSec))); fQualyHisto_neg->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kAtLeastThreePrim), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kAtLeastThreePrim))); fQualyHisto_neg->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kLessThanThreePrim), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kLessThanThreePrim))); fQualyHisto_neg->SetLineColor(kRed + 2); fQualyHisto_mc->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossibleSec), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossibleSec))); fQualyHisto_mc->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossiblePrim), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcPossiblePrim))); fQualyHisto_mc->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcAtLeastThreeSec), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcAtLeastThreeSec))); fQualyHisto_mc->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcAtLeastThreePrim), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcAtLeastThreePrim))); fQualyHisto_mc->SetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcLessThanThreePrim), fQualyHisto->GetBinContent(fQualyHisto->FindFixBin(qualityNumbers::kMcLessThanThreePrim))); fQualyHisto_mc->SetLineColor(kBlue); } ClassImp( PndTrackingQualityTaskNewLinks);