View Javadoc

1   /*
2    * To change this template, choose Tools | Templates
3    * and open the template in the editor.
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   * StrategyBuilder was getting too bloated, so some of the code has been moved here
22   * @author cozzy
23   */
24  public class StrategyBuilderUtils {
25       
26      private static final BarrelEndcapFlag[] beArray = 
27              new BarrelEndcapFlag[]{BarrelEndcapFlag.ENDCAP_NORTH, BarrelEndcapFlag.ENDCAP_SOUTH}; 
28      
29      /**
30       * Symmetrizes the given StrategyList... Modifies 
31       * the original list rather than returning a new one. 
32       * 
33       * It is assumed that the  input list uses the beflag ENDCAP rather 
34       * than ENDCAP_NORTH or ENDCAP_SOUTH. Anything with ENDCAP_NORTH or 
35       * ENDCAP_SOUTH won't be touched... 
36       * 
37       * @param strat_list
38       */
39      static void symmetrizeStrategies (List<SeedStrategy> strat_list, StrategyXMLMetadata meta) {
40          
41          /**
42           * There are 3 interesting cases here:
43           * 
44           *   1) None of the layers are in the endcap. Symmetrization unnecessary.
45           *   2) Only extension layers are in the endcap. In this case we should 
46           *      modify the extension layers so that both endcaps appear. We remove
47           *      the old extension layer and replace it with two new ones. 
48           *   3) Extension layers appear in the seeds or confirm layers. 
49           *      In this case, we remove the old strategy and replace it with 
50           *      two new ones. 
51           * 
52           * 
53           *   We can't tell the difference between (2) and (3) until after we have
54           *   gone through the entire set, so the code keeps track of the changes
55           *   that would be necessary for (2) and apply them only if (3) doesn't
56           *   happen. 
57           * 
58           */
59  
60          List<SeedStrategy> symmetrized = new ArrayList<SeedStrategy>(); 
61          Iterator<SeedStrategy> it = strat_list.iterator(); 
62          //this will store additional extension layers in the case that there are no endcap Seed/Confirm layers
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; //If all the Seed/Confirm layers are BarrelOnly, then we can 
68                                             //just have both endcaps in the extend layers without creating a new strategy. 
69              additionalExtendLayers.clear(); 
70              removeLayers.clear(); 
71              for (SeedLayer l : next.getLayerList()) {
72                  //Anything with BarrelEndcapFlag ENDCAP in seed or confirm should be mirrored for both sides
73                  if (l.getBarrelEndcapFlag()==BarrelEndcapFlag.ENDCAP && l.getType()!=SeedType.Extend) {
74                      it.remove(); //remove this strategy... we will replace it with the other two symmetrized ones
75                      //loop through both north and south configurations
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>(); //store the new layers here
105         for (SeedLayer ll : next.getLayerList()) {
106             if (ll.getBarrelEndcapFlag().isBarrel()) {
107                 // if it's a barrel layer, we can just add it
108                 symmlyrs.add(ll);
109             } else {
110                 //otherwise change from ENDCAP to either ENDCAP_NORTH or ENDCAP_SOUTH
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); //create new strategy
116         newstrat.copyCutoffsFromStrategy(next); //copy parameters
117         return newstrat;
118     }
119     
120     
121    /**
122     * Returns a list of possible subsets of DumbLayers.... wrapper around generateAllPossibleSubsets
123     * @param allLayers
124     * @param subset_size
125     * @return
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      * Returns a set of DumbLayers consisting of the seed and confirm layers of the given SeedStrategy
140      * @param strategy SeedStrategy to extract layers from
141      * @param ignoreNorthSouth Whether or not the DumbLayers should know about North or South
142      * @return A set of DumbLayers
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      * Returns all possible subsets of a given size of the set allObjects
165      * @param allObjects The set to find subsets of
166      * @param subset_size The size desired of subsets. 
167      * @return A set of subsets, all of size sub_set size
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 }