FairRoot/PandaRoot
PndLmdHitMergeTask.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndLmdHitMergeTask source file -----
3 // -------------------------------------------------------------------------
4 
5 #include <cmath>
6 #include <map>
7 #include <vector>
8 
9 #include "FairRootManager.h"
10 #include "FairRun.h"
11 #include "FairRuntimeDb.h"
12 #include "TClonesArray.h"
13 
14 #include "PndLmdHitMergeTask.h"
15 #include "PndSdsHit.h"
16 #include "PndSdsMergedHit.h"
17 
18 #include "TH2D.h"
19 
20 // ----- Default constructor -------------------------------------------
22  : FairTask("LMD Hit Merging Task"), fHitArray(0), fMergedHitArray(0) {
23  fHitBranchName = "LMDHitsPixel";
24  hdxdy = new TH2D("hdxdy", "; #deltax, #mum; #deltay, #mum", 4e2, -100, 100,
25  4e2, -100, 100);
26  hdz = new TH1D("hdz", ";#deltaz, #mum", 2e3, -1000, 1000);
27 }
28 
29 // ----- Named constructor -------------------------------------------
31  : FairTask(name), fHitArray(0), fMergedHitArray(0) {
32  fHitBranchName = "LMDHitsPixel";
33  hdxdy = new TH2D("hdxdy", "; #deltax, #mum; #deltay, #mum", 4e2, -100, 100,
34  4e2, -100, 100);
35  hdz = new TH1D("hdz", ";#deltaz, #mum", 2e3, -1000, 1000);
36 }
37 
38 // ----- Destructor ----------------------------------------------------
40 // -------------------------------------------------------------------------
41 
42 // ----- Public method Init --------------------------------------------
44  FairRootManager* ioman = FairRootManager::Instance();
45  if (!ioman) {
46  std::cout << "-E- PndLmdHitMergeTask::Init: "
47  << "RootManager not instantiated!" << std::endl;
48  return kFATAL;
49  }
50 
51  // Get input array
52  fHitArray = (TClonesArray*)ioman->GetObject(fHitBranchName);
53  //
54  if (!fHitArray) {
55  std::cout << "-W- PndLmdHitMergeTask::Init: "
56  << "No LmdHitsPixel array!" << std::endl;
57  return kERROR;
58  }
59 
60  // set output arrays
61  // fMergedHitArray = new TClonesArray("PndSdsHit");
62  fMergedHitArray = new TClonesArray("PndSdsMergedHit");
63  ioman->Register("LMDHitsMerged", "PndLmd", fMergedHitArray, true);
64  Info("Init", "Initialisation successfull");
65  return kSUCCESS;
66 }
67 // -------------------------------------------------------------------------
68 
69 // ----- Public method Exec --------------------------------------------
70 void PndLmdHitMergeTask::Exec(Option_t*) {
71  if (fVerbose > 2)
72  std::cout << " **Starting PndLmdHitMergeTask::Exec()**" << std::endl;
73 
74  // Reset output array
75  // fMergedHitArray = FairRootManager::Instance()->GetTClonesArray("LmdHits");
76  // if ( ! fMergedHitArray ) Fatal("Exec", "No OutputArray");
77  fMergedHitArray->Delete();
78 
79  // Get input array
80  fHitArray =
81  (TClonesArray*)FairRootManager::Instance()->GetObject(fHitBranchName);
82  if (!fHitArray) {
83  std::cout << "-W- PndLmdHitMergeTask::Init: "
84  << "No Hit array!" << std::endl;
85  return;
86  }
87 
88  // when we have no hits, we can end the event here.
89  if (fHitArray->GetEntriesFast() == 0) return;
90 
91  // ------- SEARCH Close Hits ------
92  std::vector<unsigned int> mergewithIDs, mergedHits;
93  // std::map<unsigned int, std::vector<unsigned int>> backmap;
94  // PndSdsHit* tmphit;
95  PndSdsMergedHit* tmphit;
96  unsigned int newHits = 0;
97  for (Int_t iHit = 0; iHit < fHitArray->GetEntriesFast(); iHit++) {
98  if (fVerbose > 2) {
99  if (iHit == 0) std::cout << "#### NEW event ####" << std::endl;
100  }
101  bool skip = false;
102  for (unsigned int ijk = 0; ijk < mergedHits.size();
103  ijk++) // check if already merged
104  if (iHit == (int)mergedHits.at(ijk)) skip = true;
105  if (skip) continue;
106  mergewithIDs.clear();
107  PndSdsHit* myHit1 = (PndSdsHit*)(fHitArray->At(iHit));
108 
109  for (Int_t jHit = iHit + 1; jHit < fHitArray->GetEntriesFast();
110  jHit++) { // check other hits
111  PndSdsHit* myHit2 = (PndSdsHit*)(fHitArray->At(jHit));
112 
113  double dz = (myHit1->GetZ()) - (myHit2->GetZ());
114  // if(fabs(dz)<0.1 ){ //actually same Hit: merge
115  // if(fabs((myHit1->GetX())-(myHit2->GetX()))<0.016 &&
116  //fabs((myHit1->GetY())-(myHit2->GetY()))<0.016){
117  double dx = (myHit1->GetX()) - (myHit2->GetX());
118  double dy = (myHit1->GetY()) - (myHit2->GetY());
119 
120  if (fabs(dx) < 0.0075 &&
121  fabs(dy) < 0.0075) { // 3*sigma_dx, sigma_dx=25mkm
122  hdxdy->Fill(1e4 * dx, 1e4 * dy);
123  hdz->Fill(1e4 * dz);
124 
125  if (dz < 0.01 || dz > 0.1) continue;
126  mergewithIDs.push_back(jHit);
127  mergedHits.push_back(jHit);
128  }
129  }
130 
131  if (mergewithIDs.size() > 0) { // merge hits
132  if (fVerbose > 4)
133  std::cout << "hit merged with: " << mergewithIDs.size() << " hits"
134  << std::endl;
135  // tmphit = new((*fMergedHitArray)[newHits]) PndSdsHit(*myHit1);
136  tmphit = new ((*fMergedHitArray)[newHits]) PndSdsMergedHit(*myHit1, 0);
137 
138  double x = tmphit->GetX(), y = tmphit->GetY(), z = tmphit->GetZ();
139  for (unsigned int iMerge = 0; iMerge < mergewithIDs.size();
140  iMerge++) { // loop over hits to merge in
141  PndSdsHit* myHit2 =
142  (PndSdsHit*)(fHitArray->At(mergewithIDs.at(iMerge)));
143  x += myHit2->GetX();
144  y += myHit2->GetY();
145  z += myHit2->GetZ();
146  tmphit->SetSecondMCHit(
147  myHit2->GetRefIndex());
148  tmphit->SetIsMerged(true);
149  }
150  x /= (mergewithIDs.size() + 1);
151  y /= (mergewithIDs.size() + 1);
152  z /= (mergewithIDs.size() + 1);
153  tmphit->SetX(x);
154  tmphit->SetY(y);
155  tmphit->SetZ(z);
156  if (fVerbose > 4) {
157  std::cout << "!!! Merged hit !!!" << std::endl;
158  tmphit->Print();
159  }
160  } else { // dont merge, just use original hit
161  // tmphit = new((*fMergedHitArray)[newHits]) PndSdsHit(*myHit1);
162  tmphit = new ((*fMergedHitArray)[newHits]) PndSdsMergedHit(*myHit1, -1);
163  tmphit->SetIsMerged(false);
164  }
165 
166  newHits++;
167  }
168 
169  if (fVerbose > 1)
170  std::cout << "-I- PndLmdHitMergeTask: out of "
171  << fHitArray->GetEntriesFast() << " Hits "
172  << fMergedHitArray->GetEntriesFast() << " Hits merged."
173  << std::endl;
174  return;
175 }
176 
int fVerbose
Definition: poormantracks.C:24
double dy
virtual void Print(const Option_t *opt=0) const
Definition: PndSdsHit.cxx:66
TClonesArray * fHitArray
void SetSecondMCHit(Int_t secMChit)
virtual InitStatus Init()
TClonesArray * fMergedHitArray
void SetIsMerged(bool fflag)
Double_t z
friend F32vec4 fabs(const F32vec4 &a)
Definition: P4_F32vec4.h:47
TString name
double dx
Double_t x
ClassImp(PndAnaContFact)
Double_t y
virtual void Exec(Option_t *opt)