16 fTrackBranchName(trackBranchName), fIdealTrackName(idealTrackName), fPndTrackOrTrackCand(pndTrackData), fPossibleTrack(0), fCleanFunctor(kFALSE), fNGhosts(0), fUseCorrectedSkewedHits(kFALSE),
fVerbose(0)
19 std::cout <<
"-I- PndTrackingQA::PndTrackingQA no PossibleTrackFunctor given. Taking Standard!" << std::endl;
20 if (trackBranchName ==
"MVDTrack" ){
22 }
else if (trackBranchName ==
"CombiTrackCand" ) {
32 fTrackBranchName(trackBranchName), fIdealTrackName(idealTrackName), fPndTrackOrTrackCand(pndTrackData), fPossibleTrack(posTrack), fCleanFunctor(kFALSE), fNGhosts(0), fUseCorrectedSkewedHits(kFALSE),
fVerbose(0)
35 std::cout <<
"-I- PndTrackingQA::PndTrackingQA no PossibleTrackFunctor given. Taking Standard!" << std::endl;
36 if (trackBranchName ==
"MVDTrack" ){
38 }
else if (trackBranchName ==
"CombiTrackCand" ) {
55 ioman = FairRootManager::Instance();
57 std::cout <<
"-E- PndTrackingQualityTask::Init: "
58 <<
"RootManager not instantiated!" << std::endl;
79 std::cout <<
"-I- PndTrackingQA::Init: PossibleTrackFunctor: ";
88 std::cout <<
"PndTrackingQA::AnalyseEvent() Track quality map before analysis: " << std::endl << std::endl;
92 for (Int_t
i = 0;
i <
fTrack->GetEntriesFast();
i++){
94 std::cout <<
"----------------------------------" << std::endl;
95 std::cout <<
"Analyse Track: " <<
i << std::endl;
97 std::map<TString, FairMultiLinkedData> trackInfo;
109 std::cout <<
"PndTrackingQA::AnalyseEvent Analyse track: " <<
i << std::endl;
110 std::cout <<
"mostProbableTrack " << mostProbableTrack << std::endl;
113 if (mostProbableTrack == -1)
continue;
122 int nof_asso_mctracks = trackInfo[
"AllHits"].GetNLinks();
124 int size = recoTrackInfo->GetEntriesFast();
130 if (iter->first > -1 && iter->second > 0) {
157 std::cout <<
"AnalyseEvent End" << std::endl;
162 FairMultiLinkedData result;
163 result.SetInsertHistory(kFALSE);
165 FairMultiLinkedData linksOfType = trackCand->GetLinksWithType(
ioman->GetBranchId(branchName));
168 for (
int j = 0; j < linksOfType.GetNLinks(); j++){
169 FairMultiLinkedData_Interface* linkData = (FairMultiLinkedData_Interface*)FairRootManager::Instance()->GetCloneOfLinkData(linksOfType.GetLink(j));
172 FairMultiLinkedData linkDataType = linkData->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack"));
173 linkDataType.SetAllWeights(1.);
174 result.AddLinks(linkDataType);
183 std::map<TString, FairMultiLinkedData> trackInfo;
186 std::cout <<
"PndTrackingQualityData::AnalyseTrackCand: TrackInfo" << std::endl;
187 std::cout << *trackCand << std::endl;
189 for (
size_t branchIndex = 0; branchIndex <
fBranchNames.size(); branchIndex++){
192 trackInfo[
"AllHits"].AddLinks(trackInfo[fBranchNames[branchIndex]]);
202 Int_t mostProbableTrack = -1;
204 std::cout <<
"PndTrackingQA::AnalyseTrackInfo: NMCLinks: " << trackInfo[
"AllHits"].GetNLinks() << std::endl;
206 std::cout <<
"PndTrackingQA::AnalyseTrackInfo " << trackInfo[
"AllHits"] << std::endl;
209 std::vector<FairLink> sortedMCTracks = trackInfo[
"AllHits"].GetSortedMCTracks();
211 if (sortedMCTracks.size() == 0)
return mostProbableTrack;
213 if (sortedMCTracks.size() == 1){
214 mostProbableTrack = sortedMCTracks[0].GetIndex();
216 std::cout <<
"-W- PndTrackingQA::AnalyseTrackInfo fMCIdIdealTrackId does not contain mostProbableTrack" << mostProbableTrack << std::endl;
220 std::cout <<
"-W- PndTrackingQA::AnalyseTrackInfo fMCIdIdealTrackId the ideal track is not in fIdealTrack. mostProbableTrack:" << mostProbableTrack <<
" idealTrack " <<
fMCIdIdealTrackId[mostProbableTrack] << std::endl;
226 if (nMCHits == sortedMCTracks[0].GetWeight()){
236 Int_t highestCount = sortedMCTracks[0].GetWeight();
237 mostProbableTrack = sortedMCTracks[0].GetIndex();
239 for (
size_t i = 0;
i < sortedMCTracks.size();
i++){
240 allCounts += sortedMCTracks[
i].GetWeight();
260 for (
size_t j = 0; j < sortedMCTracks.size(); j++){
261 FairLink myLink = sortedMCTracks[j];
264 if (
fVerbose > 1) std::cout <<
"Ideal Tracking: Track " << myLink.GetIndex() <<
": ";
267 std::cout <<
"Ideal Tracking: Track " << myLink.GetIndex() <<
" not available" << std::endl;
275 return mostProbableTrack;
293 Bool_t atLeastThreeHits = kFALSE;
299 nHits +=
GetNIdealHits(*(idealTrackCand->GetPointerToLinks()),
"MVDHitsPixel");
300 nHits +=
GetNIdealHits(*(idealTrackCand->GetPointerToLinks()),
"MVDHitsStrip");
301 nHits +=
GetNIdealHits(*(idealTrackCand->GetPointerToLinks()),
"STTHit");
302 nHits +=
GetNIdealHits(*(idealTrackCand->GetPointerToLinks()),
"GEMHit");
303 nHits +=
GetNIdealHits(*(idealTrackCand->GetPointerToLinks()),
"FTSHit");
306 if (nHits > 2) atLeastThreeHits = kTRUE;
308 if (atLeastThreeHits) {
317 else if (primaryTrack){
322 if ((*
fPossibleTrack)((FairMultiLinkedData*)entry->GetPointerToLinks(), primaryTrack))
332 std::cout <<
"-I- PndMCTestPatternRecoQuality::FillMapTrackQualifikation:" << std::endl;
359 for (
size_t branchIndex = 0; branchIndex <
fBranchNames.size(); branchIndex++){
361 FairMultiLinkedData gemHits = trackData->GetLinksWithType(
ioman->GetBranchId(
"GEMPoint"));
362 result += gemHits.GetNLinks();
364 result += trackData->GetLinksWithType(
ioman->GetBranchId(
fBranchNames[branchIndex])).GetNLinks();
373 if (mostProbableTrack < 0)
return;
375 std::cout <<
"PndTrackingQA::CalcEfficiencies() for mostProbableTrack " << mostProbableTrack
377 for (
size_t branchIndex = 0; branchIndex <
fBranchNames.size(); branchIndex++){
380 if (trackCand == 0)
return;
382 FairMultiLinkedData foundHits = trackInfo[
fBranchNames[branchIndex]];
383 for (
int i = 0;
i < foundHits.GetNLinks();
i++){
384 if (foundHits.GetLink(
i).GetIndex() == mostProbableTrack){
385 Double_t nFoundHits = foundHits.GetLink(
i).GetWeight();
386 if ((nFoundHits/nMcHits) >
fMapEfficiencies[mostProbableTrack][fBranchNames[branchIndex]].first){
387 std::pair<Double_t, Int_t> result(nFoundHits/nMcHits, nMcHits);
406 Int_t numberGemHits = 0;
407 if (branchName ==
"GEMHit"){
408 numberGemHits = track.GetLinksWithType(
ioman->GetBranchId(
"GEMPoint")).GetNLinks();
409 return numberGemHits;
411 return track.GetLinksWithType(
ioman->GetBranchId(branchName)).GetNLinks();
416 if (detailedInfo == kTRUE) std::cout << std::endl;
417 for (
size_t branchIndex = 0; branchIndex <
fBranchNames.size(); branchIndex++){
420 std::cout << branchName <<
" " <<
GetNIdealHits(trackData, branchName);
421 if (detailedInfo == kTRUE){
423 if (trackData.GetLinksWithType(
ioman->GetBranchId(branchName)).GetNLinks() > 0)
424 std::cout << trackData.GetLinksWithType(
ioman->GetBranchId(branchName));
425 std::cout << std::endl;
431 std::cout << std::endl;
436 for (
size_t branchIndex = 0; branchIndex <
fBranchNames.size(); branchIndex++){
438 std::cout << branchName <<
" " <<
GetNIdealHits(recoTrackData, branchName);
439 std::cout <<
"/" <<
GetNIdealHits(idealTrackData, branchName);
442 std::cout << std::endl;
450 if (iter->second < 0)
451 std::cout <<
" NOT FOUND ";
455 std::cout <<
" MCData: ";
458 if (iter->second < 0)
462 if (recoTrackCand != 0 && idealTrackCand != 0)
467 std::cout << std::endl;
472 std::cout <<
"PrintTrackMCStatusMap: " << std::endl;
475 std::cout << std::endl;
477 std::cout << std::endl;
483 std::cout <<
"TrackInfo: (MC-ID/NHits) : ";
484 for (std::map<TString, FairMultiLinkedData>::iterator iter = info.begin(); iter != info.end(); iter++){
485 std::cout << iter->first;
486 for (
int i = 0;
i < iter->second.GetNLinks();
i++){
487 std::cout <<
" : (" << iter->second.GetLink(
i).GetIndex() <<
"/" << iter->second.GetLink(
i).GetWeight() <<
")";
491 std::cout << std::endl;
511 std::cout <<
"PndTrackingQA::GetRecoInfoFromRecoTrack()" << std::endl;
513 std::map<int, int> noftruehits;
514 std::map<int, int> noffakehits;
515 std::map<int, int> nofmissinghits;
517 for (
size_t branchIndex = 0; branchIndex <
fBranchNames.size();
521 nofmissinghits.clear();
538 FairMultiLinkedData ptrlink = *trackcand->GetPointerToLinks();
540 FairMultiLinkedData links = ptrlink.GetLinksWithType(
543 Int_t
nHits = links.GetNLinks();
546 std::cout <<
"----- reco track " << trackId <<
" (mc track " << mctrackId<<
") has " << nHits <<
" from " <<
fBranchNames[branchIndex] << std::endl;
549 for (
int ihit = 0; ihit <
nHits; ihit++) {
550 FairLink link = links.GetLink(ihit);
551 int assomctrack = -1;
553 FairHit *
hit = (FairHit*) links.GetData(link);
555 std::cout <<
"ihit " << ihit <<
" " << link
556 <<
" is FAKE" << std::endl;
560 if (noffakehits.count(branchIndex) > 0)
561 noffakehits[branchIndex]++;
563 noffakehits[branchIndex] = 1;
568 FairMultiLinkedData hitlink = *hit->GetPointerToLinks();
570 FairMultiLinkedData mclinks = hitlink.GetLinksWithType(
571 ioman->GetBranchId(
"MCTrack"));
574 FairMultiLinkedData mvdstrhits = links.GetLinksWithType(
575 FairRootManager::Instance()->GetBranchId(
"MVDHitsStrip"));
576 FairMultiLinkedData gemhits = links.GetLinksWithType(
577 FairRootManager::Instance()->GetBranchId(
"GEMHit"));
578 if ((gemhits.GetNLinks() > 0 || mvdstrhits.GetNLinks() > 0) && mclinks.GetNLinks() > 1) {
581 for (
int imctrk = 0; imctrk < mclinks.GetNLinks(); imctrk++) {
582 FairLink mclink = mclinks.GetLink(imctrk);
583 assomctrack = mclink.GetIndex();
586 if (assomctrack == mctrackId)
592 if (isgood == kTRUE) {
594 if (noftruehits.count(branchIndex) > 0)
595 noftruehits[branchIndex]++;
597 noftruehits[branchIndex] = 1;
599 if (noffakehits.count(branchIndex) > 0)
600 noffakehits[branchIndex]++;
602 noffakehits[branchIndex] = 1;
613 Int_t nMcHits =
GetNIdealHits(*idealtrackcand->GetPointerToLinks(),
616 nofmissinghits[branchIndex] = nMcHits - noftruehits[branchIndex];
628 }
else if (
fBranchNames[branchIndex] ==
"MVDHitsStrip") {
void PrintTrackDataSummary(FairMultiLinkedData &trackData, Bool_t detailedInfo=kFALSE)
std::map< Int_t, Int_t > fMapTrackQualification
! TrackId vs TrackStatus after analysis of track finding
std::map< Int_t, Double_t > fMapPt
virtual Int_t AnalyseTrackInfo(std::map< TString, FairMultiLinkedData > &trackInfo, Int_t trackId)
Bool_t IsBetterTrackExisting(Int_t &mcIndex, int quality)
Bool_t fPndTrackOrTrackCand
std::map< Int_t, Double_t > fMapPlResolution
void AnalyseEvent(TClonesArray *recoTrackInfo)
void SetNofSttFakeHits(int nofstt)
void SetNofMvdStripFakeHits(int nofstr)
static const int kLessThanThreePrim
void SetNofMvdPixelTrueHits(int nofpix)
static const int kPossiblePrim
void SetNofMvdPixelMissingHits(int nofpix)
static const int kAtLeastThreeSec
void SetNofSttTrueHits(int nofstt)
TVector3 GetMomentum() const
std::map< Int_t, Int_t > fMCIdIdealTrackId
! map between MC id and ideal track id
FairMultiLinkedData GetMCInfoForBranch(TString branchName, PndTrackCand *trackCand)
returns which MCTracks and how often (marked by a FairLink) they were seen by the hits of a PndTrackC...
PndTrackFunctor * fPossibleTrack
void SetNofMvdStripMissingHits(int nofstr)
static const int kPartiallyFound
void SetNofMCTracks(Int_t nofmctracks)
std::vector< TString > fBranchNames
! branch names of hits taken into account in the analysis (e.g. MVDHitsPixel, STTHit, ...)
std::map< Int_t, TVector3 > fMapP
void SetNofMvdPixelFakeHits(int nofpix)
std::map< Int_t, Double_t > fMapPl
void AddHitsBranchName(TString name)
Adds branch names of detector data which should be taken into account in the analysis.
TClonesArray * fIdealTrack
std::map< Int_t, Double_t > fMapPlResolutionRel
void PrintTrackMCStatusMap()
Int_t GetSumOfAllValidMCHits(FairMultiLinkedData *trackData)
virtual void CalcEfficiencies(Int_t mostProbableTrack, std::map< TString, FairMultiLinkedData > &trackInfo)
static std::string QualityNumberToString(int qNumber)
static const int kPossibleSec
std::map< TString, FairMultiLinkedData > AnalyseTrackCand(PndTrackCand *trackCand)
returns a map which returns the FairLinks to MCTracks grouped by hit ...
void SetMomentumLast(TVector3 mom)
std::map< Int_t, Int_t > fMCTrackFound
! How often was a MC Track (key) found
void PrintTrackDataSummaryCompare(FairMultiLinkedData &recoTrackData, FairMultiLinkedData &idealTrackData)
void SetNofGemMissingHits(int nofgem)
void PrintTrackInfo(std::map< TString, FairMultiLinkedData > info)
static const int kAtLeastThreePrim
FairTrackParP GetParamLast()
virtual void FillMapTrackQualifikation()
std::map< Int_t, Double_t > fMapPResolution
std::map< Int_t, Double_t > fMapPResolutionRel
PndTrackingQA(TString trackBranchName, TString idealTrackName, Bool_t pndTrackData=kTRUE)
void SetPositionLast(TVector3 pos)
PndTrackingQualityRecoInfo GetRecoInfoFromRecoTrack(Int_t trackId, Int_t mctrackId)
std::map< Int_t, Int_t > fMapTrackMCStatus
! TrackId vs TrackStatus from MC
int hit(Int_t nEvents=0, TString inFile="sim.root", TString parFile="par.root", TString inDigi="digi.root", TString outFile="hit.root", Int_t timeBased=0)
static const int kFullyFound
std::map< Int_t, Double_t > fMapPtResolutionRel
void SetNofFtsTrueHits(int noffts)
std::map< Int_t, Int_t > fTrackIdMCId
! map between track id and most probable MC track id
std::map< Int_t, Int_t > fMCIdTrackId
! map between MC id and track id
void SetPositionFirst(TVector3 pos)
std::map< Int_t, std::map< TString, std::pair< Double_t, Int_t > > > fMapEfficiencies
! MostProbable TrackId, BranchName, Efficiency (#FoundHits / #MCHits), #MCHits
void SetNofFtsFakeHits(int noffts)
void SetNofMvdStripTrueHits(int nofstr)
void SetNofSttMissingHits(int nofstt)
Int_t GetNIdealHits(FairMultiLinkedData &track, TString branchName)
void SetMomentumFirst(TVector3 mom)
void SetNofGemTrueHits(int nofgem)
PndTrackCand * GetTrackCandPtr()
Int_t GetMotherID() const
void PrintTrackQualityMap(Bool_t detailedInfo=kFALSE)
void SetNofGemFakeHits(int nofgem)
std::map< Int_t, Double_t > fMapPtResolution
void SetMCTrackID(int mctrackid)
FairTrackParP GetParamFirst()
static const int kSpuriousFound
void SetNofFtsMissingHits(int nofgem)