11 #include <tracking/modules/DATCON/DATCONTrackingModule.h>
13 #include <tracking/gfbfield/GFGeant4Field.h>
22 DATCONTrackingModule::findandcombine3d()
26 TVector3 houghMomentum;
28 if (storeDATCONTracks.isValid()) {
29 storeDATCONTracks.clear();
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();
39 if (compareList(u_idList, v_idList)) {
42 int charge = -curvsign;
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();
53 if (m_usePhase2Simulation) {
56 B2WARNING(
"This mode is not yet implemented, nothing will happen! Return...");
59 if (TrackRadius < 0.0) {
62 TrackPhi = TrackPhi + M_PI / 2.0;
66 TrackPhi = (TrackPhi + M_PI / 2.0) - M_PI;
68 if (TrackPhi > M_PI) {
69 TrackPhi -= 2.0 * M_PI;
71 if (TrackPhi < -1.0 * M_PI) {
72 TrackPhi += 2.0 * M_PI;
75 if (TrackCandV.Y() > 0.0) {
76 TrackTheta = -1.0 * TrackTheta;
78 TrackTheta = M_PI - TrackTheta;
81 if (TrackTheta < 0.0) {
83 }
else if (TrackTheta > M_PI) {
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));
92 B2Vector3D magField = BFieldManager::getFieldInTesla({0, 0, 0});
93 double BFieldStrength = magField.
Mag();
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);
99 houghMomentum.SetXYZ(pX, pY, pZ);
114 DATCONTrackingModule::saveHitsToRecoTrack(std::vector<unsigned int>& idList, TVector3 momentum)
116 unsigned int sortingParameter = 0;
118 TVector3 seedPosition(0.0, 0.0, 0.0);
119 TVector3 seedMomentum = momentum;
121 RecoTrack* recoTrack = storeDATCONRecoTracks.appendNew(seedPosition, seedMomentum, 1.,
"", m_storeDATCONSVDClusterName,
"",
"",
"",
122 m_storeRecoHitInformationName);
124 for (
auto it = idList.begin(); it != idList.end(); it++) {
125 int spacePointIndex = (int)(*it) - (((int)(*it) / 10000) * 10000);
129 for (
auto& datconsvdcluster : DATCONSVDClusters) {
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()) {
138 RecoHitInformation* recohitinfo = storeRecoHitInformation.appendNew(&svdcluster, RecoHitInformation::OriginTrackFinder::c_other,
141 svdcluster.addRelationTo(recohitinfo);
143 svdcluster.addRelationTo(recoTrack);
144 recoTrack->
addSVDHit(&svdcluster, sortingParameter);
158 DATCONTrackingModule::trackCandMerger()
161 vector<unsigned int> idList;
163 std::vector<DATCONTrackCand> uTrackCandCopy;
164 std::vector<DATCONTrackCand> vTrackCandCopy;
165 std::vector<DATCONTrackCand> uTrackCandMerged;
166 std::vector<DATCONTrackCand> vTrackCandMerged;
168 vTrackCandCopy = vTrackCand;
169 uTrackCandCopy = uTrackCand;
172 if (m_useTrackCandMerger && m_useTrackCandMergerU) {
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();
183 bool cancelflag =
false;
186 for (
auto it_in = (uTrackCandCopy.begin() + 1); it_in != uTrackCandCopy.end(); ++it_in) {
187 TVector2 TrackCandU_in = it_in->getCoord();
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();
194 uTrackCandCopy.erase(it_in);
201 if (cancelflag ==
true || ((uTrackCandCopy.begin() + 1) == uTrackCandCopy.end())) {
205 if (uTrackCandCopy.size() > 0) {
206 uTrackCandCopy.erase(it);
210 uTrackCandMerged.push_back(
DATCONTrackCand(idList, TVector2(TrackPhi / ((
double) count), inverseTrackRadius / ((
double) count))));
212 uTrackCand = uTrackCandMerged;
217 if (m_useTrackCandMerger && m_useTrackCandMergerV) {
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();
227 bool cancelflag =
false;
230 for (
auto it_in = (vTrackCandCopy.begin() + 1); it_in != vTrackCandCopy.end(); ++it_in) {
231 TVector2 TrackCandV_in = it_in->getCoord();
233 if (fabs(TrackCandV.X() - TrackCandV_in.X()) < m_mergeThresholdV) {
234 TrackTheta += TrackCandV_in.X();
235 TrackZzero += TrackCandV_in.Y();
237 vTrackCandCopy.erase(it_in);
244 if (cancelflag ==
true || ((vTrackCandCopy.begin() + 1) == vTrackCandCopy.end())) {
248 if (vTrackCandCopy.size() > 0) {
249 vTrackCandCopy.erase(it);
253 vTrackCandMerged.push_back(
DATCONTrackCand(idList, TVector2(TrackTheta / ((
double) count), TrackZzero / ((
double) count))));
256 vTrackCand = vTrackCandMerged;
266 DATCONTrackingModule::trackMerger()
269 std::vector<DATCONTrack> TracksCopy;
270 std::vector<DATCONTrack> TracksMerged;
274 if (storeDATCONTracks.isValid()) {
275 storeDATCONTracks.clear();
278 TracksCopy = DATCONTracks;
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();
290 double PhiAverage = trackPhi;
291 double RadiusAverage = trackRadius;
292 double ThetaAverage = trackTheta;
293 double ZzeroAverage = TrackZzero;
297 bool cancelflag =
false;
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();
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;
316 TracksCopy.erase(it_in);
323 if (cancelflag ==
true || ((TracksCopy.begin() + 1) == TracksCopy.end())) {
328 if (TracksCopy.size() > 0) {
329 TracksCopy.erase(it);
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,
351 DATCONTracks = TracksMerged;