1 package org.lcsim.recon.tracking.vsegment.hitmaking;
2
3 import java.util.*;
4
5 import org.lcsim.event.EventHeader;
6 import org.lcsim.recon.cat.util.NoSuchParameterException;
7 import org.lcsim.util.Driver;
8
9 import org.lcsim.recon.tracking.vsegment.geom.Sensor;
10 import org.lcsim.recon.tracking.vsegment.geom.SensorType;
11 import org.lcsim.recon.tracking.vsegment.hit.TrackerCluster;
12 import org.lcsim.recon.tracking.vsegment.hit.TrackerHit;
13
14 import static org.lcsim.recon.tracking.vsegment.hitmaking.HitMakingDriver.UsedClusters;
15
16
17
18
19
20
21
22
23 public class HitMakingDriver extends Driver {
24
25
26
27 public HitMakingDriver(TrackerHitMaker hitMaker) {
28 _clusterMapName = "INPUT_MAP_NAME";
29 _hitMapName= "OUTPUT_MAP_NAME";
30 _hitMaker = hitMaker;
31 _registerHitsWithClusters = false;
32 _usedClusters = UsedClusters.INCLUDE_NEW;
33
34 }
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 public void set(String name, String value) {
64 if (name.equalsIgnoreCase("INPUT_MAP_NAME")) {
65 _clusterMapName = value;
66 } else if (name.equalsIgnoreCase("OUTPUT_MAP_NAME")) {
67 _hitMapName = value;
68 } else if (name.equalsIgnoreCase("USED_CLUSTERS")) {
69 if (value.equalsIgnoreCase("SKIP")) {
70 _usedClusters = UsedClusters.SKIP;
71 } else if (value.equalsIgnoreCase("INCLUDE_OLD")) {
72 _usedClusters = UsedClusters.INCLUDE_OLD;
73 } else if (value.equalsIgnoreCase("INCLUDE_NEW")) {
74 _usedClusters = UsedClusters.INCLUDE_NEW;
75 } else if (value.equalsIgnoreCase("UPDATE_SKIP")) {
76 _usedClusters = UsedClusters.UPDATE_SKIP;
77 throw new IllegalArgumentException("Not yet implemented: set(" + name + ", " + value + ")");
78 } else if (value.equalsIgnoreCase("UPDATE_INCLUDE")) {
79 _usedClusters = UsedClusters.UPDATE_INCLUDE;
80 throw new IllegalArgumentException("Not yet implemented: set(" + name + ", " + value + ")");
81 } else {
82 throw new IllegalArgumentException("Illegal value: set(" + name + ", " + value + ")");
83 }
84 } else {
85 throw new NoSuchParameterException(name, this.getClass());
86 }
87 }
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 public void set(String name, boolean value) {
106 if (name.equalsIgnoreCase("REGISTER_HITS_WITH_CLUSTERS")) {
107 _registerHitsWithClusters = value;
108 } else {
109 throw new NoSuchParameterException(name, this.getClass());
110 }
111 }
112
113
114
115 public void process(EventHeader event) {
116
117
118
119
120 super.process(event);
121
122 HashMap<Sensor, ArrayList<TrackerCluster>> clusterMap =
123 (HashMap<Sensor, ArrayList<TrackerCluster>>) event.get(_clusterMapName);
124 HashMap<Sensor, ArrayList<TrackerHit>> hitMap = new HashMap<Sensor, ArrayList<TrackerHit>>();
125
126 for (Sensor sensor : clusterMap.keySet()) {
127 List<TrackerCluster> clusterList = clusterMap.get(sensor);
128 ArrayList<TrackerHit> hitList = new ArrayList<TrackerHit>(clusterList.size());
129 for (TrackerCluster cluster : clusterList) {
130 List<TrackerHit> oldHits = cluster.getTrackerHits();
131 if (oldHits.isEmpty() || _usedClusters == UsedClusters.INCLUDE_NEW) {
132 TrackerHit hit = _hitMaker.make(cluster);
133 hitList.add(hit);
134 if (_registerHitsWithClusters) {
135 cluster.addTrackerHit(hit);
136 }
137 } else if (_usedClusters == UsedClusters.INCLUDE_OLD) {
138 hitList.addAll(oldHits);
139 }
140 }
141 if (! hitList.isEmpty()) {
142 hitList.trimToSize();
143 hitMap.put(sensor, hitList);
144 }
145 }
146
147 event.put(_hitMapName, hitMap);
148 }
149
150
151
152 private String _clusterMapName;
153 private String _hitMapName;
154
155 protected boolean _registerHitsWithClusters;
156
157 protected TrackerHitMaker _hitMaker;
158
159 protected enum UsedClusters {SKIP, INCLUDE_OLD, INCLUDE_NEW, UPDATE_SKIP, UPDATE_INCLUDE}
160 protected UsedClusters _usedClusters;
161 }