1 package org.lcsim.recon.tracking.vsegment.digitization;
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.hit.DigiTrackerHit;
11 import org.lcsim.recon.tracking.vsegment.hit.base.DigiTrackerHitComposite;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public class MergeDriver extends Driver {
33
34
35
36
37 public MergeDriver() {}
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 public void set(String name, Object value) {
59 try {
60 if (name.equalsIgnoreCase("ADD_INPUT_COLLECTION")) {
61 _inMapNames.add((String)value);
62 } else if (name.equalsIgnoreCase("OUTPUT_MAP_NAME")) {
63 _outMapName = (String)value;
64 } else {
65 throw new NoSuchParameterException(name, this.getClass());
66 }
67 } catch (ClassCastException x) {
68 throw new IllegalArgumentException("Value of incompatible type", x);
69 }
70 }
71
72
73
74
75 public void process(EventHeader event) {
76
77 if (_inMapNames == null) throw new RuntimeException("No input collection names provided");
78 if (_outMapName == null) throw new RuntimeException("No output collection name provided");
79
80 ArrayList<HashMap<Sensor, ArrayList<DigiTrackerHit>>> inMaps =
81 new ArrayList<HashMap<Sensor, ArrayList<DigiTrackerHit>>>(_inMapNames.size());
82 for (String name : _inMapNames) {
83 inMaps.add((HashMap<Sensor, ArrayList<DigiTrackerHit>>) event.get(name));
84 }
85
86 HashMap<Sensor, ArrayList<DigiTrackerHit>> outMap = merge(inMaps);
87 event.put(_outMapName, outMap);
88 }
89
90
91
92
93
94
95 public HashMap<Sensor, ArrayList<DigiTrackerHit>> merge(Collection<HashMap<Sensor, ArrayList<DigiTrackerHit>>> hitMaps) {
96 HashMap<Sensor, ArrayList<DigiTrackerHit>> outMap = new HashMap<Sensor, ArrayList<DigiTrackerHit>>();
97 for (HashMap<Sensor, ArrayList<DigiTrackerHit>> inMap : hitMaps) {
98 for (Sensor sensor : inMap.keySet()) {
99 ArrayList<DigiTrackerHit> inList = inMap.get(sensor);
100 ArrayList<DigiTrackerHit> outList = outMap.get(sensor);
101 if (outList == null) {
102 outList = new ArrayList<DigiTrackerHit>(inList.size());
103 outMap.put(sensor, outList);
104 }
105 outList.addAll(inList);
106 }
107 }
108 for (Sensor sensor : outMap.keySet()) {
109 outMap.put(sensor, merge(outMap.get(sensor)));
110 }
111 return outMap;
112 }
113
114
115
116
117
118 public ArrayList<DigiTrackerHit> merge(ArrayList<DigiTrackerHit> hitList) {
119 Collections.sort(hitList);
120 ArrayList<DigiTrackerHit> outList = new ArrayList<DigiTrackerHit>(hitList.size());
121 int channel = -1;
122 ArrayList<DigiTrackerHit> buffer = new ArrayList<DigiTrackerHit>();
123 for (DigiTrackerHit hit : hitList) {
124 int newChannel = hit.getChannel();
125 if (buffer.isEmpty()) {
126 buffer.add(hit);
127 channel = newChannel;
128 } else if (channel == newChannel) {
129 buffer.add(hit);
130 } else {
131 if (buffer.size() == 1) {
132 outList.add(buffer.get(0));
133 } else {
134 outList.add(new DigiTrackerHitComposite(buffer));
135 }
136 buffer.clear();
137 buffer.add(hit);
138 channel = newChannel;
139 }
140 }
141 if (! buffer.isEmpty()) {
142 if (buffer.size() == 1) {
143 outList.add(buffer.get(0));
144 } else {
145 outList.add(new DigiTrackerHitComposite(buffer));
146 }
147 }
148 outList.trimToSize();
149 return outList;
150 }
151
152
153
154 ArrayList<String> _inMapNames;
155 String _outMapName;
156 }