1
2
3
4
5
6 package org.lcsim.recon.tracking.seedtracker.strategybuilder;
7
8 import java.util.ArrayList;
9 import java.util.Comparator;
10 import java.util.HashSet;
11 import java.util.Iterator;
12 import java.util.List;
13 import java.util.Set;
14 import org.lcsim.recon.tracking.seedtracker.SeedLayer;
15 import org.lcsim.recon.tracking.seedtracker.SeedLayer.SeedType;
16 import org.lcsim.recon.tracking.seedtracker.SeedStrategy;
17 import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
18 import org.lcsim.recon.tracking.seedtracker.StrategyXMLMetadata;
19
20
21
22
23
24 public class StrategyBuilderUtils {
25
26 private static final BarrelEndcapFlag[] beArray =
27 new BarrelEndcapFlag[]{BarrelEndcapFlag.ENDCAP_NORTH, BarrelEndcapFlag.ENDCAP_SOUTH};
28
29
30
31
32
33
34
35
36
37
38
39 static void symmetrizeStrategies (List<SeedStrategy> strat_list, StrategyXMLMetadata meta) {
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 List<SeedStrategy> symmetrized = new ArrayList<SeedStrategy>();
61 Iterator<SeedStrategy> it = strat_list.iterator();
62
63 List<SeedLayer> additionalExtendLayers = new ArrayList<SeedLayer>();
64 List<SeedLayer> removeLayers = new ArrayList<SeedLayer>();
65 while (it.hasNext()) {
66 SeedStrategy next = it.next();
67 boolean extendOnlyFlag = true;
68
69 additionalExtendLayers.clear();
70 removeLayers.clear();
71 for (SeedLayer l : next.getLayerList()) {
72
73 if (l.getBarrelEndcapFlag()==BarrelEndcapFlag.ENDCAP && l.getType()!=SeedType.Extend) {
74 it.remove();
75
76 for (BarrelEndcapFlag be : beArray) {
77 SeedStrategy newstrat = makeMirroredLayer(next, be);
78 symmetrized.add(newstrat);
79 meta.strategyComments.put(newstrat, meta.strategyComments.get(next)+
80 "\n\t\t\tNOTE: These layers are combined for both endcaps of this symmetrized strategy\n\t\t");
81 }
82 meta.strategyComments.remove(next);
83 extendOnlyFlag = false;
84 break;
85
86 } else if (l.getBarrelEndcapFlag()==BarrelEndcapFlag.ENDCAP) {
87 removeLayers.add(l);
88 additionalExtendLayers.add(new SeedLayer(l.getDetName(), l.getLayer(), beArray[0], l.getType()));
89 additionalExtendLayers.add(new SeedLayer(l.getDetName(), l.getLayer(), beArray[1], l.getType()));
90 }
91 }
92
93 if (extendOnlyFlag) {
94 next.getLayerList().addAll(additionalExtendLayers);
95 next.getLayerList().removeAll(removeLayers);
96 }
97
98 }
99 strat_list.addAll(symmetrized);
100 }
101
102
103 private static SeedStrategy makeMirroredLayer(SeedStrategy next, BarrelEndcapFlag be) {
104 List<SeedLayer> symmlyrs = new ArrayList<SeedLayer>();
105 for (SeedLayer ll : next.getLayerList()) {
106 if (ll.getBarrelEndcapFlag().isBarrel()) {
107
108 symmlyrs.add(ll);
109 } else {
110
111 SeedLayer newlyr = new SeedLayer(ll.getDetName(), ll.getLayer(), be, ll.getType());
112 symmlyrs.add(newlyr);
113 }
114 }
115 SeedStrategy newstrat = new SeedStrategy(next.getName() + be.toString(), symmlyrs);
116 newstrat.copyCutoffsFromStrategy(next);
117 return newstrat;
118 }
119
120
121
122
123
124
125
126
127 public static List<Set<DumbLayer>> generateAllPossibleDumbLayerSubsetsList(Set<DumbLayer> allLayers, int subset_size) {
128 Set<Object> set = new HashSet<Object>();
129 set.addAll(allLayers);
130 Set<Set> subsets = generateAllPossibleSubsets(set, subset_size);
131 List<Set<DumbLayer>> ret = new ArrayList<Set<DumbLayer>>();
132 for (Set<DumbLayer> subset : subsets) {
133 ret.add(subset);
134 }
135 return ret;
136 }
137
138
139
140
141
142
143
144 public static Set<DumbLayer> getRelevantSet(SeedStrategy strategy, boolean ignoreNorthSouth) {
145 Set<DumbLayer> subset = new HashSet<DumbLayer>();
146 for (SeedLayer lyr : strategy.getLayers(SeedLayer.SeedType.Seed)) {
147
148 BarrelEndcapFlag be = lyr.getBarrelEndcapFlag();
149 if (ignoreNorthSouth && be.isEndcap()) be = BarrelEndcapFlag.ENDCAP;
150 subset.add(new DumbLayer(lyr.getDetName(), lyr.getLayer(), be));
151
152 }
153 for (SeedLayer lyr : strategy.getLayers(SeedLayer.SeedType.Confirm)) {
154 BarrelEndcapFlag be = lyr.getBarrelEndcapFlag();
155 if (ignoreNorthSouth && be.isEndcap()) be = BarrelEndcapFlag.ENDCAP;
156 subset.add(new DumbLayer(lyr.getDetName(), lyr.getLayer(), be));
157 }
158 return subset;
159 }
160
161
162
163
164
165
166
167
168
169 public static Set<Set> generateAllPossibleSubsets(Set allObjects, int subset_size) {
170
171 assert(subset_size > 0 && subset_size <= allObjects.size());
172
173 if (subset_size == 1){
174 Set<Set> ret = new HashSet<Set>();
175 for (Object o : allObjects){
176 Set set = new HashSet();
177 set.add(o);
178 ret.add(set);
179 }
180 return ret;
181 }
182
183 else {
184 Set<Set> ret = new HashSet<Set>();
185 for(Object o : allObjects) {
186 Set newSet = new HashSet();
187 newSet.addAll(allObjects);
188 newSet.remove(o);
189 Set<Set> partial = generateAllPossibleSubsets(newSet, subset_size-1);
190 for (Set s : partial) s.add(o);
191 ret.addAll(partial);
192 }
193 return ret;
194 }
195 }
196
197 }