Belle II Software  release-05-02-19
DATCONTrackingFunctions.cc
1 /**************************************************************************
2 * BASF2 (Belle Analysis Framework 2) *
3 * Copyright(C) 2013 - Belle II Collaboration *
4 * *
5 * Author: The Belle II Collaboration *
6 * Contributors: Michael Schnell, Christian Wessel *
7 * *
8 * This software is provided "as is" without any warranty. *
9 **************************************************************************/
10 
11 #include <tracking/modules/DATCON/DATCONTrackingModule.h>
12 
13 #include <tracking/gfbfield/GFGeant4Field.h>
14 
15 using namespace std;
16 using namespace Belle2;
17 
21 void
22 DATCONTrackingModule::findandcombine3d()
23 {
24  unsigned int tracks;
25 
26  TVector3 houghMomentum;
27 
28  if (storeDATCONTracks.isValid()) {
29  storeDATCONTracks.clear();
30  }
31 
32  tracks = 0;
33 
34  for (auto it = vTrackCand.begin(); it != vTrackCand.end(); ++it) {
35  for (auto it_in = uTrackCand.begin(); it_in != uTrackCand.end(); ++it_in) {
36  vector<unsigned int> v_idList = it->getIdList();
37  vector<unsigned int> u_idList = it_in->getIdList();
38 
39  if (compareList(u_idList, v_idList)) {
40 
41  int curvsign = 0;
42  int charge = -curvsign;
43 
44  ++tracks;
45 
46  TVector2 TrackCandV = it->getCoord();
47  TVector2 TrackCandU = it_in->getCoord();
48  double TrackRadius = 1.0 / TrackCandU.Y();
49  double TrackPhi = TrackCandU.X();
50  double TrackTheta = TrackCandV.X();
51  double TrackZzero = TrackCandV.Y();
52 
53  if (m_usePhase2Simulation) {
54  // ATTENTION TODO FIXME : This still has to be implemented!!!
55  // So far no phase 2 specific algorithms have been implemented and tested!
56  B2WARNING("This mode is not yet implemented, nothing will happen! Return...");
57  return;
58  } else { // begin of "else" belonging to "if(m_usePhase2Simulation)"
59  if (TrackRadius < 0.0) {
60  charge = -1;
61  curvsign = -charge;
62  TrackPhi = TrackPhi + M_PI / 2.0;
63  } else {
64  charge = 1;
65  curvsign = -charge;
66  TrackPhi = (TrackPhi + M_PI / 2.0) - M_PI;
67  }
68  if (TrackPhi > M_PI) {
69  TrackPhi -= 2.0 * M_PI;
70  } //else if (TrackPhi < -1.0 * M_PI) {
71  if (TrackPhi < -1.0 * M_PI) {
72  TrackPhi += 2.0 * M_PI;
73  }
74 
75  if (TrackCandV.Y() > 0.0) {
76  TrackTheta = -1.0 * TrackTheta;
77  } else {
78  TrackTheta = M_PI - TrackTheta;
79  }
80 
81  if (TrackTheta < 0.0) {
82  TrackTheta += M_PI;
83  } else if (TrackTheta > M_PI) {
84  TrackTheta -= M_PI;
85  }
86 
87  if (fabs(TrackRadius) < 5000) {
88  storeDATCONTracks.appendNew(DATCONTrack(tracks, TrackRadius, TrackPhi, TrackZzero, TrackTheta, charge, curvsign));
89  DATCONTracks.push_back(DATCONTrack(tracks, TrackRadius, TrackPhi, TrackZzero, TrackTheta, charge, curvsign));
90  }
91 
92  B2Vector3D magField = BFieldManager::getFieldInTesla({0, 0, 0});
93  double BFieldStrength = magField.Mag();
94 
95  double pX = 0.299792458 * BFieldStrength * TrackRadius * cos(TrackPhi);
96  double pY = 0.299792458 * BFieldStrength * TrackRadius * sin(TrackPhi);
97  double pZ = 0.299792458 * BFieldStrength * TrackRadius / tan(TrackTheta);
98 
99  houghMomentum.SetXYZ(pX, pY, pZ);
100 
101 // saveHitsToRecoTrack(u_idList, houghMomentum);
102 
103  }
104  }
105  }
106  }
107 }
108 
109 
113 void
114 DATCONTrackingModule::saveHitsToRecoTrack(std::vector<unsigned int>& idList, TVector3 momentum)
115 {
116  unsigned int sortingParameter = 0;
117 
118  TVector3 seedPosition(0.0, 0.0, 0.0);
119  TVector3 seedMomentum = momentum;
120 
121  RecoTrack* recoTrack = storeDATCONRecoTracks.appendNew(seedPosition, seedMomentum, 1., "", m_storeDATCONSVDClusterName, "", "", "",
122  m_storeRecoHitInformationName);
123 
124  for (auto it = idList.begin(); it != idList.end(); it++) {
125  int spacePointIndex = (int)(*it) - (((int)(*it) / 10000) * 10000);
126 
127  DATCONSVDSpacePoint* spacepoint = storeDATCONSVDSpacePoints[spacePointIndex];
128  vector<SVDCluster> DATCONSVDClusters = spacepoint->getAssignedDATCONSVDClusters();
129  for (auto& datconsvdcluster : DATCONSVDClusters) {
130 
131  for (auto& svdcluster : storeDATCONSVDCluster) {
132  if (svdcluster.getSensorID() == datconsvdcluster.getSensorID() &&
133  svdcluster.isUCluster() == datconsvdcluster.isUCluster() &&
134  svdcluster.getPosition() == datconsvdcluster.getPosition() &&
135  svdcluster.getCharge() == datconsvdcluster.getCharge() &&
136  svdcluster.getSize() == datconsvdcluster.getSize()) {
137 
138  RecoHitInformation* recohitinfo = storeRecoHitInformation.appendNew(&svdcluster, RecoHitInformation::OriginTrackFinder::c_other,
139  sortingParameter);
140  recohitinfo->addRelationTo(&svdcluster);
141  svdcluster.addRelationTo(recohitinfo);
142  recoTrack->addRelationTo(recohitinfo);
143  svdcluster.addRelationTo(recoTrack);
144  recoTrack->addSVDHit(&svdcluster, sortingParameter);
145  recoTrack->setChargeSeed(svdcluster.getSeedCharge());
146  }
147  }
148  sortingParameter++;
149  }
150  }
151 }
152 
153 
157 void
158 DATCONTrackingModule::trackCandMerger()
159 {
160  int count;
161  vector<unsigned int> idList;
162 
163  std::vector<DATCONTrackCand> uTrackCandCopy;
164  std::vector<DATCONTrackCand> vTrackCandCopy;
165  std::vector<DATCONTrackCand> uTrackCandMerged;
166  std::vector<DATCONTrackCand> vTrackCandMerged;
167 
168  vTrackCandCopy = vTrackCand;
169  uTrackCandCopy = uTrackCand;
170 
171  /* Begin of u-side trackCand merger */
172  if (m_useTrackCandMerger && m_useTrackCandMergerU) {
173 
174  while (uTrackCandCopy.size() > 0) {
175  auto it = uTrackCandCopy.begin();
176  idList = it->getIdList();
177  TVector2 TrackCandU = it->getCoord();
178  double TrackRadius = 1.0 / TrackCandU.Y();
179  double inverseTrackRadius = TrackCandU.Y();
180  double TrackPhi = TrackCandU.X();
181  count = 1;
182 
183  bool cancelflag = false;
184  while (true) {
185 
186  for (auto it_in = (uTrackCandCopy.begin() + 1); it_in != uTrackCandCopy.end(); ++it_in) {
187  TVector2 TrackCandU_in = it_in->getCoord();
188  cancelflag = false;
189  if (fabs(TrackCandU.X() - TrackCandU_in.X()) < m_mergeThresholdU) {
190  TrackPhi += TrackCandU_in.X();
191  TrackRadius += 1.0 / TrackCandU_in.Y();
192  inverseTrackRadius += TrackCandU_in.Y();
193  ++count;
194  uTrackCandCopy.erase(it_in);
195  break;
196  }
197  // cppcheck-suppress redundantAssignment
198  cancelflag = true;
199  }
200 
201  if (cancelflag == true || ((uTrackCandCopy.begin() + 1) == uTrackCandCopy.end())) {
202  break;
203  }
204  }
205  if (uTrackCandCopy.size() > 0) {
206  uTrackCandCopy.erase(it);
207  }
208 
209  /* Add to list */
210  uTrackCandMerged.push_back(DATCONTrackCand(idList, TVector2(TrackPhi / ((double) count), inverseTrackRadius / ((double) count))));
211  }
212  uTrackCand = uTrackCandMerged;
213  }
214  /* End of u-side trackCand merger */
215 
216  /* Begin of v-side trackCand merger */
217  if (m_useTrackCandMerger && m_useTrackCandMergerV) {
218 
219  while (vTrackCandCopy.size() > 0) {
220  auto it = vTrackCandCopy.begin();
221  idList = it->getIdList();
222  TVector2 TrackCandV = it->getCoord();
223  double TrackZzero = TrackCandV.Y();
224  double TrackTheta = TrackCandV.X();
225  count = 1;
226 
227  bool cancelflag = false;
228  while (true) {
229 
230  for (auto it_in = (vTrackCandCopy.begin() + 1); it_in != vTrackCandCopy.end(); ++it_in) {
231  TVector2 TrackCandV_in = it_in->getCoord();
232  cancelflag = false;
233  if (fabs(TrackCandV.X() - TrackCandV_in.X()) < m_mergeThresholdV) {
234  TrackTheta += TrackCandV_in.X();
235  TrackZzero += TrackCandV_in.Y();
236  ++count;
237  vTrackCandCopy.erase(it_in);
238  break;
239  }
240  // cppcheck-suppress redundantAssignment
241  cancelflag = true;
242  }
243 
244  if (cancelflag == true || ((vTrackCandCopy.begin() + 1) == vTrackCandCopy.end())) {
245  break;
246  }
247  }
248  if (vTrackCandCopy.size() > 0) {
249  vTrackCandCopy.erase(it);
250  }
251 
252  /* Add to list */
253  vTrackCandMerged.push_back(DATCONTrackCand(idList, TVector2(TrackTheta / ((double) count), TrackZzero / ((double) count))));
254 
255  }
256  vTrackCand = vTrackCandMerged;
257  }
258  /* End of v-side trackCand merger */
259 
260 }
261 
265 void
266 DATCONTrackingModule::trackMerger()
267 {
268 
269  std::vector<DATCONTrack> TracksCopy;
270  std::vector<DATCONTrack> TracksMerged;
271 
272  int trackID = 1;
273 
274  if (storeDATCONTracks.isValid()) {
275  storeDATCONTracks.clear();
276  }
277 
278  TracksCopy = DATCONTracks;
279 
280  trackID = 1;
281 
282  while (TracksCopy.size() > 0) {
283  auto it = TracksCopy.begin();
284  double trackPhi = it->getTrackPhi();
285  double trackRadius = it->getTrackRadius();
286  double trackTheta = it->getTrackTheta();
287  double TrackZzero = it->getTrackZzero();
288  int trackCharge = it->getTrackCharge();
289 
290  double PhiAverage = trackPhi;
291  double RadiusAverage = trackRadius;
292  double ThetaAverage = trackTheta;
293  double ZzeroAverage = TrackZzero;
294 
295  int count = 1;
296 
297  bool cancelflag = false;
298  while (true) {
299 
300  for (auto it_in = (TracksCopy.begin() + 1); it_in != TracksCopy.end(); ++it_in) {
301  double trackPhi_in = it_in->getTrackPhi();
302  double trackRadius_in = it_in->getTrackRadius();
303  double trackTheta_in = it_in->getTrackTheta();
304  double TrackZzero_in = it_in->getTrackZzero();
305  int trackCharge_in = it_in->getTrackCharge();
306 
307  cancelflag = false;
308  if (fabs(PhiAverage - trackPhi_in) < m_mergeThresholdPhi && fabs(ThetaAverage - trackTheta_in) < m_mergeThresholdTheta
309  && trackCharge == trackCharge_in) {
310  PhiAverage += trackPhi_in;
311  RadiusAverage += trackRadius_in;
312  ThetaAverage += trackTheta_in;
313  ZzeroAverage += TrackZzero_in;
314 
315  ++count;
316  TracksCopy.erase(it_in);
317  break;
318  }
319  // cppcheck-suppress redundantAssignment
320  cancelflag = true;
321  }
322 
323  if (cancelflag == true || ((TracksCopy.begin() + 1) == TracksCopy.end())) {
324  break;
325  }
326  }
327 
328  if (TracksCopy.size() > 0) {
329  TracksCopy.erase(it);
330  }
331 
332  /* Add to list */
333  PhiAverage /= (double)count;
334  RadiusAverage /= (double)count;
335  ThetaAverage /= (double)count;
336  ZzeroAverage /= (double)count;
337  int curvatureSign = -trackCharge;
338  TracksMerged.push_back(DATCONTrack(trackID, RadiusAverage, PhiAverage, ZzeroAverage, ThetaAverage, trackCharge, curvatureSign));
339  storeDATCONTracks.appendNew(DATCONTrack(trackID, RadiusAverage, PhiAverage, ZzeroAverage, ThetaAverage, trackCharge,
340  curvatureSign));
341  trackID++;
342 
343  PhiAverage = 0.;
344  RadiusAverage = 0.;
345  ThetaAverage = 0.;
346  ZzeroAverage = 0.;
347  count = 1;
348 
349  }
350 
351  DATCONTracks = TracksMerged;
352 }
Belle2::RecoTrack::setChargeSeed
void setChargeSeed(const short int chargeSeed)
Set the charge seed stored in the reco track. ATTENTION: This is not the fitted charge.
Definition: RecoTrack.h:513
Belle2::DATCONSVDSpacePoint
DATCONSVDSpacePoint typically is build from 1-2 DATCONSimpleSVDClusters.
Definition: DATCONSVDSpacePoint.h:51
Belle2::RelationsInterface::addRelationTo
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
Definition: RelationsObject.h:144
Belle2::DATCONTrack
The DATCON Track class.
Definition: DATCONTrack.h:35
Belle2::B2Vector3< double >
Belle2::RecoTrack
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:78
Belle2::RecoTrack::addSVDHit
bool addSVDHit(const UsedSVDHit *svdHit, const unsigned int sortingParameter, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds a svd hit with the given information to the reco track.
Definition: RecoTrack.h:269
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::DATCONTrackCand
The DATCONTrackCand represents the candidates of tracks found by the DATCON algoritms for u-side and ...
Definition: DATCONTrackCand.h:38
Belle2::RecoHitInformation
This class stores additional information to every CDC/SVD/PXD hit stored in a RecoTrack.
Definition: RecoHitInformation.h:48
Belle2::B2Vector3::Mag
DataType Mag() const
The magnitude (rho in spherical coordinate system).
Definition: B2Vector3.h:158
Belle2::DATCONSVDSpacePoint::getAssignedDATCONSVDClusters
std::vector< SVDCluster > getAssignedDATCONSVDClusters()
Getter function for the DATCONSVDClusters assigned to this DATCONSVDSpacePoint.
Definition: DATCONSVDSpacePoint.h:233