1
2
3
4
5
6
7 package org.lcsim.recon.tracking.seedtracker;
8
9 import java.util.ArrayList;
10 import java.util.List;
11
12 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
13 import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
14
15
16
17
18
19
20 public class MergeSeedLists {
21
22 private ISeedTrackerDiagnostics _diag = null;
23
24
25 public MergeSeedLists() {
26 }
27
28 public void setDiagnostic(ISeedTrackerDiagnostics diagnostic) {
29 _diag = diagnostic;
30 }
31
32 public boolean Merge(List<SeedCandidate> seedlist, SeedCandidate newseed, SeedStrategy strategy) {
33
34
35
36 boolean best = true;
37
38
39 List<SeedCandidate> duplist = new ArrayList<SeedCandidate>();
40
41
42 for (SeedCandidate seed : seedlist) {
43
44
45 boolean dupe = isDuplicate(newseed, seed);
46
47 if (dupe) {
48
49
50 boolean better = isBetter(newseed, seed, strategy);
51
52 if (better) {
53
54
55 duplist.add(seed);
56
57 } else {
58
59
60 best = false;
61 if (_diag != null) _diag.fireMergeKillingNewSeed(seed, newseed);
62 break;
63 }
64 }
65 }
66
67
68 if (best) {
69 seedlist.add(newseed);
70 for (SeedCandidate seed : duplist) {
71 seedlist.remove(seed);
72 if (_diag != null) _diag.fireMergeKillingOldSeed(seed, newseed);
73 }
74 }
75
76 return best;
77 }
78
79 public boolean isDuplicate(SeedCandidate seed1, SeedCandidate seed2) {
80 int nduplicate = 0;
81 for (HelicalTrackHit hit1 : seed1.getHits()) {
82 for (HelicalTrackHit hit2 : seed2.getHits()) {
83 if (hit1 == hit2) {
84 nduplicate++;
85 if (nduplicate > 1) {
86 return true;
87 }
88 }
89 }
90 }
91 return false;
92 }
93
94 public boolean isBetter(SeedCandidate newseed, SeedCandidate oldseed, SeedStrategy strategy) {
95 int hitdif = newseed.getHits().size() - oldseed.getHits().size();
96 double chisqdif = newseed.getHelix().chisqtot() - oldseed.getHelix().chisqtot();
97 if (hitdif > 1) {
98 return true;
99 }
100 if (hitdif == 1) {
101 return chisqdif < strategy.getBadHitChisq();
102 }
103 if (hitdif == 0) {
104 return chisqdif < 0.;
105 }
106 if (hitdif == -1) {
107 return chisqdif < -strategy.getBadHitChisq();
108 }
109 return false;
110 }
111 }