FairRoot/PandaRoot
PndTrkNeighboringMap.cxx
Go to the documentation of this file.
1 //
2 // PndTrkNeighboringMap.cxx
3 //
4 //
5 //
6 //
7 // authors: Lia Lavezzi - INFN Pavia (2012)
8 //
10 
11 #include "PndTrkNeighboringMap.h"
12 
13 #include "PndTrkHit.h"
14 #include "PndSttTube.h"
15 
16 using namespace std;
17 
18 
19 PndTrkNeighboringMap::PndTrkNeighboringMap(TClonesArray *tubearray) : fTubeArray(tubearray), fStandalone(TObjArray()), fOneNeigh(TObjArray()), fTwoNeigh(TObjArray()) {}
20 
22  *this = thismap;
23 }
24 
26  delete fTubeArray;
27 }
28 
29 // CHECK this might still have problems
31 
32  TMapIter *it = (TMapIter*) hit2neigh.MakeIterator();
33  TObjArray *hits;
34  while(PndTrkHit *hit = (PndTrkHit*) it->Next()) {
35  hits = (TObjArray*) thismap.hit2neigh.GetValue(hit);
36  hit2neigh.Add(hit, hits);
37  }
38 
39  TMapIter *it2 = (TMapIter*) hit2indiv.MakeIterator();
40  TObjArray *hits2;
41  while(PndTrkHit *hit = (PndTrkHit*) it2->Next()) {
42  hits2 = (TObjArray*) thismap.hit2indiv.GetValue(hit);
43  hit2indiv.Add(hit, hits2); //FIXME [R.K. 03/2017] Should here be hits or hits2? I put hits2 now.
44  }
45 
46 
47  fTubeArray = thismap.fTubeArray;
48  fStandalone = thismap.fStandalone;
49  fOneNeigh = thismap.fOneNeigh;
50  fTwoNeigh = thismap.fTwoNeigh;
51  return *this;
52 }
53 
55 
56  hit2neigh.Clear();
57  hit2indiv.Clear();
58  fStandalone.Clear(); // CHECK
59  fOneNeigh.Clear(); // CHECK
60  fTwoNeigh.Clear(); // CHECK
61  // fTubeArray->Clear(); // CHECK
62 
63 }
64 
66 
67  // hit->DrawTube(kGreen); // CHECK
68  TObjArray *neighs = new TObjArray(*hits);
69  hit2neigh.Add(hit, neighs);
70  int tubeID = hit->GetTubeID();
71  PndSttTube *tube = (PndSttTube*) fTubeArray->At(tubeID);
72 
73  if(hits->GetEntriesFast() == 0) fStandalone.Add(hit);
74  else if(hits->GetEntriesFast() == 1) fOneNeigh.Add(hit);
75  else if(hits->GetEntriesFast() == 2) fTwoNeigh.Add(hit);
76  else if(tube->GetLayerID() == 0) fTwoNeigh.Add(hit);
77 
78  // fill indivisible map -------------------------------------------
79 
80  // up to 2 hits
81  if(hits->GetEntriesFast() <= 2) {
82  hit2indiv.Add(hit, hits);
83  // cout << "Bset up map " << hit->GetHitID() << " " << hits->GetEntriesFast() << endl;
84  return;
85  }
86 
87  // more hits
88  std::vector< int > removefromlist;
89  int counter = 0;
90  for(int k = 0; k < hits->GetEntriesFast(); k++) {
91  PndTrkHit *hit2 = (PndTrkHit*) hits->At(k);
92  PndSttTube *tube2 = (PndSttTube* ) fTubeArray->At(hit2->GetTubeID());
93  if(tube->GetLayerID() == tube2->GetLayerID()) {
94  removefromlist.push_back(k);
95  continue;
96  }
97  counter++;
98  }
99 
100 
101  for(int k = removefromlist.size() - 1; k >=0; k--) {
102  int delk = removefromlist[k];
103  PndTrkHit *hit2 = (PndTrkHit*) hits->At(delk);
104  hits->Remove(hit2);
105  hits->Compress();
106  }
107 
108  if(counter > 2) {
109  TObjArray *hits2 = new TObjArray();
110  for(int iobj = 0; iobj < hits->GetEntriesFast(); iobj++) hits2->Add(hits->At(iobj));
111  if(counter > 2) {
112  for(int k = hits2->GetEntriesFast() - 1; k >=0; k--) {
113  PndTrkHit *hit2 = (PndTrkHit*) hits2->At(k);
114  hits2->Remove(hit2);
115  }
116  }
117  hit2indiv.Add(hit, hits2);
118  }
119  else hit2indiv.Add(hit, hits);
120 
121  // cout << "Aset up map " << hit->GetHitID() << " " << hits->GetEntriesFast() << endl;
122 
123 }
124 
126  TObjArray seeds;
127  for(int ihit = 0; ihit < fOneNeigh.GetEntriesFast(); ihit++) {
128  PndTrkHit *hit = (PndTrkHit*) fOneNeigh.At(ihit);
129  int tubeID = hit->GetTubeID();
130  PndSttTube *tube = (PndSttTube*) fTubeArray->At(tubeID);
131  TObjArray neighs = GetNeighboringsToHit(hit);
132 
133  // if it has only one neighboring tube
134  if(neighs.GetEntriesFast() == 1) {
135  PndTrkHit *hit2 = (PndTrkHit*) neighs.At(0);
136  int tubeID2 = hit2->GetTubeID();
137  PndSttTube *tube2 = (PndSttTube*) fTubeArray->At(tubeID2);
138  bool difflayer = false;
139  // if the k-neigh is on the same layer...
140  if(tube->GetLayerID() == tube2->GetLayerID()) {
141  TObjArray neighs2 = GetNeighboringsToHit(hit2);
142  if(neighs2.GetEntriesFast() <= 1) continue;
143  // ...and has more than 1 neighboring, then loop over them:
144  // if there is at least one on a different layer, then hit is not a seed
145  for(int jhit = 0; jhit < neighs2.GetEntriesFast(); jhit++) {
146  PndTrkHit *hit2b = (PndTrkHit*) neighs2.At(jhit);
147  if(hit2b == hit) continue;
148  Int_t tubeID2b = hit2b->GetTubeID();
149  PndSttTube *tube2b = (PndSttTube*) fTubeArray->At(tubeID2b);
150  if(tube2->GetLayerID() != tube2b->GetLayerID()) difflayer = true;
151  }
152  if(difflayer == true) continue;
153  }
154  seeds.Add(hit);
155  }
156  // else { // else, it means it belongs to the first layer
157 // bool difflayer = false;
158 // for(int jhit = 0; jhit < neighs->GetEntriesFast(); jhit++) {
159 // PndTrkHit *hit2 = (PndTrkHit*) neighs->At(jhit);
160 // int tubeID2 = hit2->GetTubeID();
161 // PndSttTube *tube2 = (PndSttTube*) fTubeArray->At(tubeID2);
162 // if(tube2->GetLayerID() != tube->GetLayerID()) difflayer = true;
163 // }
164 // if(difflayer == false) continue;
165 // seeds.Add(hit);
166 // }
167  }
168  return seeds;
169 }
170 
171 
173  TObjArray candidateseeds;
174 
175 
176  for(int ihit = 0; ihit < fTwoNeigh.GetEntriesFast(); ihit++) {
177  int samelayer = -1;
178  int standalone = -2;
179  PndTrkHit *hit = (PndTrkHit*) fTwoNeigh.At(ihit);
180  int tubeID = hit->GetTubeID();
181  PndSttTube *tube = (PndSttTube*) fTubeArray->At(tubeID);
182  TObjArray neighs = GetNeighboringsToHit(hit);
183 
184  // if it is a candidate seed because it comes from the 1st layer
185  if(tube->GetLayerID() == 0) {
186  bool difflayer = false;
187  for(int jhit = 0; jhit < neighs.GetEntriesFast(); jhit++) {
188  PndTrkHit *hit2 = (PndTrkHit*) neighs.At(jhit);
189  int tubeID2 = hit2->GetTubeID();
190  PndSttTube *tube2 = (PndSttTube*) fTubeArray->At(tubeID2);
191  if(tube2->GetLayerID() != tube->GetLayerID()) difflayer = true;
192  }
193  if(difflayer == false) continue;
194  candidateseeds.Add(hit);
195  }
196  else { // because it has 2 neigh, whose one on the same layer
197  for(int jhit = 0; jhit < neighs.GetEntriesFast(); jhit++) {
198  PndTrkHit *hit2 = (PndTrkHit*) neighs.At(jhit);
199  if(GetNeighboringsToHit(hit2).GetEntriesFast() == 1) standalone = jhit;
200  int tubeID2 = hit2->GetTubeID();
201  PndSttTube *tube2 = (PndSttTube*) fTubeArray->At(tubeID2);
202  if(tube->GetLayerID() == tube2->GetLayerID()) samelayer = jhit;
203  }
204  if(samelayer == standalone) candidateseeds.Add(hit);
205  }
206  }
207  return candidateseeds;
208 }
209 
211  return fTwoNeigh;
212 }
213 
215  TMapIter *it2 = (TMapIter*) hit2indiv.MakeIterator();
216  while(PndTrkHit *hit2 = (PndTrkHit*) it2->Next()) {
217  if(hit->GetHitID() == hit2->GetHitID() && hit->GetDetectorID() == hit2->GetDetectorID()) {
218  if(((TObjArray*) hit2indiv.GetValue(hit2))->GetEntriesFast() == 0) return TObjArray(0);
219  return *((TObjArray*) hit2indiv.GetValue(hit2));
220  }
221  }
222  return TObjArray(0);
223 }
224 
226  TMapIter *it2 = (TMapIter*) hit2indiv.MakeIterator();
227  TObjArray *hits2;
228  while(PndTrkHit *hit = (PndTrkHit*) it2->Next()) {
229  hits2 = (TObjArray*) hit2indiv.GetValue(hit);
230  cout << hit->GetHitID() << "(tube: " << hit->GetTubeID() << ") has " << hits2->GetEntriesFast() << " indivisibles: ";
231  for(int ihit = 0; ihit < hits2->GetEntriesFast(); ihit++) {
232  PndTrkHit *hit2 = (PndTrkHit*) hits2->At(ihit);
233  cout << " " << hit2->GetHitID() << "(tube: " << hit2->GetTubeID() << "), ";
234  }
235  cout << endl;
236  }
237 }
238 
239 // Returns 0 if not found.
241 // TObjArray *neighs = (TObjArray*) hit2neigh.GetValue(hit);
242 // if(neighs == NULL) return 0;
243 // return *(neighs);
244 
245  TMapIter *it2 = (TMapIter*) hit2neigh.MakeIterator();
246  while(PndTrkHit *hit2 = (PndTrkHit*) it2->Next()) {
247  if(hit->GetHitID() == hit2->GetHitID() && hit->GetDetectorID() == hit2->GetDetectorID()) {
248  if(((TObjArray*) hit2neigh.GetValue(hit2))->GetEntriesFast() == 0) return TObjArray(0);
249  return *((TObjArray*) hit2neigh.GetValue(hit2));
250  }
251  }
252  return TObjArray(0);
253 
254 
255 
256 }
257 
259  return (TMapIter*) hit2neigh.MakeIterator();
260 }
261 
263  TObjArray listofhits;
264 
265  TMapIter *it = (TMapIter*) hit2neigh.MakeIterator();
266  TObjArray *hits;
267  while(PndTrkHit *hit = (PndTrkHit*) it->Next()) {
268  hits = (TObjArray*) hit2neigh.GetValue(hit);
269  if(hits->GetEntriesFast() == nofhits) listofhits.Add(hit);
270  }
271  return listofhits;
272 }
void AddNeighboringsToHit(PndTrkHit *hit, TObjArray *hits)
TObjArray GetHitWithNNeighborings(int nofhits)
PndTrkNeighboringMap & operator=(const PndTrkNeighboringMap &thismap)
TObjArray GetNeighboringsToHit(PndTrkHit *hit)
cout<< "POINTs for new FwEndCap == "<< tsim-> GetEntriesFast()
Int_t GetHitID()
Definition: PndTrkHit.h:56
int GetLayerID()
Definition: PndSttTube.cxx:128
Int_t GetDetectorID()
Definition: PndTrkHit.h:57
int counter
Definition: ZeeAnalysis.C:59
PndTrkNeighboringMap(TClonesArray *tubearray)
TObjArray GetIndivisiblesToHit(PndTrkHit *hit)
PndSdsMCPoint * hit
Definition: anasim.C:70
CbmHit * hits[nHits]
Definition: RiemannTest.C:19
Int_t GetTubeID()
Definition: PndTrkHit.h:61