FairRoot/PandaRoot
PndUnassignedHitsTask.cxx
Go to the documentation of this file.
1 /*
2  * PndUnassignedHitsTask.cpp
3  *
4  * Created on: Nov 11, 2018
5  * Author: Tobias Stockmanns <t.stockmanns@fz-juelich.de>
6  */
7 
9 
10 #include <FairRootManager.h>
11 
12 #include "TString.h"
13 #include "TClonesArray.h"
14 #include "PndTrackCand.h"
15 
16 #include "PndSttHit.h"
17 #include "PndGemHit.h"
18 #include "PndSdsHit.h"
19 #include "PndFtsHit.h"
20 
22 
24 }
25 
27 
28 
29  if (fHitBranches.size() == 0){
30  AddHitBranch("MVDHitsPixel");
31  AddHitBranch("MVDHitsStrip");
32  AddHitBranch("STTHit");
33  AddHitBranch("GEMHit");
34  AddHitBranch("FTSHit");
35  }
36 
39 
40  return kSUCCESS;
41 
42 }
43 
44 void PndUnassignedHitsTask::Exec(Option_t *opt)
45 {
47 // std::cout << "PndUnassignedHitsTask::Exec TrackCands filled!" << std::endl;
48  for(auto branch : fHitBranches){
49 // std::cout << "PndUnassignedHitsTask::Exec Fill unassigned hits: " << branch.first << std::endl;
50  FillUnassignedHits(branch.first);
51  }
52 }
53 
55  fHitBranches[branchName] = nullptr;
56 }
57 
59  fTrackCands[trackCandName] = nullptr;
60 }
61 
63 {
64  fHitsInTracks.Reset();
65  for (auto cands : fTrackCands){
66  for (int i = 0; i < cands.second->GetEntries(); i++){
67  PndTrackCand* cand = (PndTrackCand*)cands.second->At(i);
68  std::vector<PndTrackCandHit> hits = cand->GetSortedHits();
69  for (auto hit : hits) {
70  fHitsInTracks.AddLink(hit, kFALSE);
71  }
72  }
73  }
74 }
75 
77 {
78  FairRootManager* ioman = FairRootManager::Instance();
79 
80  for (auto branch : fHitBranches) {
81  branch.second = (TClonesArray*)ioman->GetObject(branch.first);
82  TString unassignedName = branch.first;
83  unassignedName += "Unassigned";
84  fHitBranches[branch.first] = branch.second;
85  std::cout << "PndUnassignedHitsTask::RegisterBranches " << branch.first << " " << branch.second << std::endl;
86  fUnassignedHitBranches[unassignedName] = ioman->Register(unassignedName, branch.second->GetClass()->GetName(), "UnassignedHits", GetPersistency());
87  }
88 
89 }
90 
92 {
93  FairRootManager* ioman = FairRootManager::Instance();
94 
95  std::cout << "PndUnassignedHitsTask::RegisterTrackCands" << std::endl;
96  for (auto cand : fTrackCands)
97  {
98  cand.second = (TClonesArray*) ioman->GetObject(cand.first);
99 // std::cout << "PndUnassignedHitsTask::RegisterTrackCands " << cand.first << " " << cand.second << std::endl;
100  fTrackCands[cand.first] = cand.second;
101  }
102 
103 }
104 
106  std::set<FairLink> usedHits = fHitsInTracks.GetLinksWithType(FairRootManager::Instance()->GetBranchId(branchName)).GetLinks();
107 // std::cout << "PndUnassignedHitsTask::FillUnassignedHits " << fHitsInTracks.GetLinksWithType(FairRootManager::Instance()->GetBranchId(branchName)) << std::endl;
108  TClonesArray* hits = fHitBranches[branchName];
109 
110  std::vector<int> unusedHits;
111  for (int i = 0; i < hits->GetEntries(); i++){
112  unusedHits.push_back(i);
113  }
114 
115  std::cout << "Hits: " << hits << std::endl;
116  std::cout << "Size of Hits: " << hits->GetEntries() << std::endl;
117  for (auto reviter = usedHits.rbegin(); reviter != usedHits.rend(); ++reviter){
118 // std::cout << "Index to remove: " << reviter->GetIndex() << std::endl;
119  unusedHits.erase(unusedHits.begin()+reviter->GetIndex());
120  }
121 
122  std::cout << "Size of UnusedHits: " << unusedHits.size() << std::endl;
123 
124  if (unusedHits.size() > 0){
125 // std::cout << "OutputBranch: " << branchName << " " << fUnassignedHitBranches[branchName += "Unassigned"] << std::endl;
126  FillOutputBranch(branchName, unusedHits);
127  }
128 
129  std::cout << "Size of UnassignedBranch: " << fUnassignedHitBranches[branchName += "Unassigned"]->GetEntries() << std::endl;
130 }
131 
132 void PndUnassignedHitsTask::FillOutputBranch(TString branchName, std::vector<int> unusedHits){
133 // std::cout << "FillOutputBranch: " << branchName << std::endl;
134  TString outputBranchName = branchName;
135  outputBranchName += "Unassigned";
136  TClonesArray* outputArray = fUnassignedHitBranches[outputBranchName];
137  std::cout << "OutputArray: " << outputArray << std::endl;
138  std::cout << "HitBranch size: " << fHitBranches[branchName]->GetEntries() << std::endl;
139  for (unsigned int i = 0; i < unusedHits.size(); i++){
140 // std::cout << i << " : " << unusedHits[i] << std::endl;
141  FairHit* myHit = (FairHit*)fHitBranches[branchName]->At(unusedHits[i]);
142  if (myHit == nullptr) continue;
143 // std::cout << *myHit << std::endl;
144  if (branchName.Contains("STTHit")){
145  new((*outputArray)[outputArray->GetEntries()]) PndSttHit(*(PndSttHit*)myHit);
146  } else if (branchName.Contains("GEMHit")){
147  new((*outputArray)[outputArray->GetEntries()]) PndGemHit(*(PndGemHit*)myHit);
148  } else if (branchName.Contains("MVDHitsPixel") || branchName.Contains("MVDHitsStrip")){
149  new((*outputArray)[outputArray->GetEntries()]) PndSdsHit(*(PndSdsHit*)myHit);
150  } else if (branchName.Contains("FTSHit")){
151  new((*outputArray)[outputArray->GetEntries()]) PndFtsHit(*(PndFtsHit*)myHit);
152  }
153  }
154 // fUnassignedHitBranches[branchName += "Unassigned"]->AbsorbObjects(fHitBranches[branchName],0,hits->GetEntries()-1);
155 }
Int_t i
Definition: run_full.C:25
std::vector< PndTrackCandHit > GetSortedHits()
FairMultiLinkedData fHitsInTracks
virtual void Exec(Option_t *opt)
cout<< "blue = Monte Carlo "<< endl;cout<< "red = Helix Hit "<< endl;cout<< "green = Center Of Tubes "<< endl;for(Int_t k=0;k< track->GetEntriesFast();k++){PndSttTrack *stttrack=(PndSttTrack *) track-> At(k)
Definition: checkhelixhit.C:56
ClassImp(PndUnassignedHitsTask)
std::map< TString, TClonesArray * > fHitBranches
virtual void AddHitBranch(TString branchName)
std::map< TString, TClonesArray * > fTrackCands
std::map< TString, TClonesArray * > fUnassignedHitBranches
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)
Definition: hit.C:1
virtual InitStatus Init()
void FillUnassignedHits(TString branchName)
virtual void AddTrackCands(TString trackCandName)
CbmHit * hits[nHits]
Definition: RiemannTest.C:19
void FillOutputBranch(TString branchName, std::vector< int > unusedHits)