Commit in lcsim on MAIN
src/org/lcsim/contrib/seedtracker/SeedStrategy.java+151.7 -> 1.8
src/org/lcsim/contrib/seedtracker/strategybuilder/RunStrategyBuilder.java+6-21.5 -> 1.6
                                                 /StrategyBuilder.java+135-441.8 -> 1.9
                                                 /SubsetScorer.java+6-21.3 -> 1.4
resources/org/lcsim/contrib/seedtracker/strategybuilder/weights/default_weights_sid01.xml+100added 1.1
+262-48
1 added + 4 modified, total 5 files
CD - Added forced symmetrization to StrategyBuilder and changed algorithm for choosing confirmation layers.

lcsim/src/org/lcsim/contrib/seedtracker
SeedStrategy.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- SeedStrategy.java	11 Jul 2008 21:40:10 -0000	1.7
+++ SeedStrategy.java	12 Aug 2008 23:13:00 -0000	1.8
@@ -229,6 +229,21 @@
         return layers;
     }
      
+    /**
+     * Copies all the cutoffs (minpt, numhits etc.) from another strategy.
+     * Does not modify the name or the layer list. 
+     * @param other Another SeedStrategy
+     */ 
+    public void copyCutoffsFromStrategy(SeedStrategy other) {
+        this.putBadHitChisq(other.getBadHitChisq());
+        this.putMaxChisq(other.getMaxChisq());
+        this.putMaxDCA(other.getMaxDCA()); 
+        this.putMaxZ0(other.getMaxZ0());; 
+        this.putMinConfirm(other.getMinConfirm());
+        this.putMinHits(other.getMinHits());
+        this.putMinPT(other.getMinPT());
+    }
+     
      @Override
      public boolean equals(Object other) {
          

lcsim/src/org/lcsim/contrib/seedtracker/strategybuilder
RunStrategyBuilder.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- RunStrategyBuilder.java	7 Aug 2008 00:50:00 -0000	1.5
+++ RunStrategyBuilder.java	12 Aug 2008 23:13:00 -0000	1.6
@@ -34,6 +34,7 @@
         int prototypeN = -1; 
         boolean verbose = StrategyBuilder.defaultVerbose; 
         boolean flag = StrategyBuilder.defaultDivideByTwo; 
+        boolean symmetrize = StrategyBuilder.defaultSymmetrize; 
         String lwfn = ""; 
         int mintrks = StrategyBuilder.defaultMinUnweightedScore;
         String filterClassName = ""; 
@@ -59,9 +60,9 @@
                     prototypeFile = args[++i];
                     prototypeN = Integer.valueOf(args[++i]); 
                 } else if (arg.equals("-v")) {
-                    verbose = true; 
+                    verbose = !verbose; 
                 } else if (arg.equals("-d")) {
-                    flag = true; 
+                    flag = !flag; 
                 } else if (arg.equals("-l")) {
                     lwfn = args[++i]; 
                 } else if (arg.equals("-m")) {
@@ -70,6 +71,8 @@
                     filterClassName = args[++i]; 
                 } else if (arg.equals("-a")) {
                     altDriver = args[++i]; 
+                } else if (arg.equals("-y")) {
+                    symmetrize = !symmetrize; 
                 } else if (arg.startsWith("-")){
                     throw new Exception(); 
                 } else {
@@ -171,6 +174,7 @@
         System.out.println("Usage: RunStrategyBuilder INPUTRECORD [flags]");
         System.out.println(" -h \t\t\t\tPrint this message");
         System.out.println(" -v \t\t\t\tBe verbose");
+        System.out.println(" -y \t\t\t\tDon't auto-symmetrize north/south. \n\t\t\t\t You may want to do this is starting strategies\n\t\t\t\t aren't symmetric.");
         System.out.println(" -d \t\t\t\tDivide tracker endcap/forward layers\n\t\t\t\t by two. This is necessary for sid01.");
         System.out.println(" -o OUTPUTFILE \t\t\tset output XML file to OUTPUTFILE\n\t\t\t\t (default is in TEMP dir)");
         System.out.println(" -e NUM_EVENTS \t\t\tRun only NUM_EVENTS events instead of all"); 

lcsim/src/org/lcsim/contrib/seedtracker/strategybuilder
StrategyBuilder.java 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- StrategyBuilder.java	7 Aug 2008 00:50:00 -0000	1.8
+++ StrategyBuilder.java	12 Aug 2008 23:13:00 -0000	1.9
@@ -55,9 +55,10 @@
     public static final int defaultSeedLayers =3; 
     public static final boolean defaultDivideByTwo=false;
     public static final int defaultMinUnweightedScore = 1; 
-    
+    public static final boolean defaultSymmetrize = true;  
    
-    private boolean verbose = false; 
+    private boolean verbose = defaultVerbose; 
+    private boolean symmetrize = defaultSymmetrize; 
     private int min_layers = defaultMinLayers;  
     private int confirm_layers = defaultConfirmLayers;  
     private int seed_layers = defaultSeedLayers; 
@@ -74,9 +75,10 @@
     private List<Set<DumbLayer>> setlist = new ArrayList<Set<DumbLayer>>();
     private String detectorName; 
     private IParticleFilter filter; 
-    private List<Set<DumbLayer>> adjacentlist = new ArrayList<Set<DumbLayer>>(); 
+    private List<List<DumbLayer>> adjacentlist = new ArrayList<List<DumbLayer>>(); 
+    //4:26
     private Random random = new Random(); 
-    
+    private BarrelEndcapFlag[] beArray = new BarrelEndcapFlag[]{BarrelEndcapFlag.ENDCAP_NORTH, BarrelEndcapFlag.ENDCAP_SOUTH}; 
 
     @Override 
     protected void startOfData(){
@@ -90,7 +92,7 @@
     
     //In the process step, we build two maps lists of sets:
     //      The set list is a list of the sets of layers hit by MCParticles hitting over 7 layers
-    //      The adjacence list is a list of a sets that are determined to be adjacent based on MCParticle trajectory
+    //      The adjacence list is a list of a list of hits that are determined to be adjacent based on MCParticle trajectory
     @Override
     protected void process(EventHeader event){
 
@@ -101,16 +103,20 @@
             System.out.println("Processed "+event.getEventNumber()+" events.");
         }
         
-        
         filter.setEvent(event);
         
         //Build MC Map from SimTrackerHits
         Map<MCParticle, List<SimTrackerHit>> mcmap = new HashMap<MCParticle, List<SimTrackerHit>>(); 
         List<SimTrackerHit> allhits = new ArrayList<SimTrackerHit>(); 
 
-        
+
         for (List<SimTrackerHit> l : event.get(SimTrackerHit.class)) {
-            //simulate inefficiency per collection here....
+
+           /**
+            * We simulate inefficiency in SimTrackerHit => TrackerHit conversion, 
+            * otherwise the strategies will miss certain classes of hits
+            */
+
             EventHeader.LCMetaData meta = event.getMetaData(l); 
             String readout = meta.getName();
             double efficiency = weighter.getReadoutEfficiency(readout); 
@@ -121,8 +127,6 @@
         } 
        
         for (SimTrackerHit h : allhits){
-            
-            
             MCParticle p = h.getMCParticle(); 
             List<SimTrackerHit> these_hits; 
             if (mcmap.containsKey(p)) {
@@ -144,11 +148,11 @@
             }
         }
         
-        //Build and add layer sets, as well as adjacent sets
+        //Build and add layer sets, as well as adjacent lists
         for(List<SimTrackerHit> l : mcmap.values()) {
             Set<DumbLayer> set = new HashSet<DumbLayer>(); 
             
-            //sort by time, which allows creation of adjacent sets. 
+            //sort by time, which allows creation of adjacent lists. 
             Collections.sort(l, new Comparator() {
 
                 public int compare(Object o1, Object o2) {
@@ -158,9 +162,8 @@
                 }
             });
             
-            //this will store all the working adjacent sets
-            LinkedList<Set<DumbLayer>> tempAdjacentLayersList = new LinkedList<Set<DumbLayer>>(); 
-            
+            //this will store all the working adjacent lists
+            LinkedList<List<DumbLayer>> tempAdjacentLayersList = new LinkedList<List<DumbLayer>>(); 
             
             for (SimTrackerHit h : l) {
                 IDetectorElementContainer cont = DetectorElementStore.getInstance().find(h.getIdentifier());
@@ -171,25 +174,27 @@
                 BarrelEndcapFlag be = ID.getBarrelEndcapFlag(de); 
                 //kludgy divide by two thing
                 if (divideByTwoFlag && be.isEndcap() && 
-                        (detname.indexOf("Tracker") > 0 || detname.indexOf("Tkr") > 0) ) {
+                        (detname.indexOf("Tracker") > -1 || detname.indexOf("Tkr") > -1) ) {
                     lyr/=2;  // sid01 doubles up on layer numbering in the endcap. 
                 }
-
+                
+                //if symmetrizing, we want to treat North and South layers equivalently. 
+                if (symmetrize && be.isEndcap()) be = BarrelEndcapFlag.ENDCAP; 
                 DumbLayer dl = new DumbLayer(detname, lyr, be); 
                 set.add(dl);
                 
-                //create a new adjacent set that starts with this layer if none already exists
+                //create a new adjacent list that starts with this layer if none already exists
                 //(This is necessary because of the doubling of SimTrackerHits in the tracker endcap)
                 if (tempAdjacentLayersList.isEmpty() || !tempAdjacentLayersList.getLast().contains(dl)) {
-                    Set<DumbLayer> adjacentLayers = new HashSet<DumbLayer>(); 
+                    List<DumbLayer> adjacentLayers = new ArrayList<DumbLayer>(); 
                     tempAdjacentLayersList.addLast(adjacentLayers);
                 }
                 
-                                //see which adjacent sets already have enough layers, and add those to the list
-                Iterator<Set<DumbLayer>> it = tempAdjacentLayersList.iterator(); 
+                //see which adjacent lists already have enough layers, and add those to the list
+                Iterator<List<DumbLayer>> it = tempAdjacentLayersList.iterator(); 
                 while (it.hasNext()) {
-                    Set<DumbLayer> s = it.next(); 
-                    s.add(dl);
+                    List<DumbLayer> s = it.next(); 
+                    if(!s.contains(dl)) s.add(dl); //otherwise we get doubled layers in the forward region of the tracker 
                     if (s.size() == confirm_layers + seed_layers) {
                         adjacentlist.add(s); 
                         it.remove(); 
@@ -280,7 +285,7 @@
             iter = setset.iterator(); 
             
             //Now we let the scoring algorithm ignore anything that we already found. 
-            while (iter.hasNext()){
+            while (iter.hasNext()) {
                 Set<DumbLayer> this_set = iter.next(); 
                 
                 if (this_set.containsAll(max)) { //If this set contains all the layers in max, it should be findable! 
@@ -309,24 +314,75 @@
         List<SeedStrategy> strat_list = new ArrayList<SeedStrategy>(); 
         strat_list.addAll(startingStrategies); 
         
+        
+        //create Strategies from final_sets... this part is klunky right now. 
         for (Set<DumbLayer> s : final_sets) {
 
             List<DumbLayer> dlyrlst = new ArrayList<DumbLayer>(); 
             dlyrlst.addAll(s); 
             
-            //sort the list from smallest to largest weight. Use smallest weight(s) for confirmation layer(s). 
-            Collections.sort(dlyrlst, new Comparator() {
-
-                public int compare(Object o1, Object o2) {
-                    DumbLayer dl1 = (DumbLayer) o1;
-                    DumbLayer dl2 = (DumbLayer) o2; 
-                    double s1 = weighter.getWeight(dl1);
-                    double s2 = weighter.getWeight(dl2);
-                    return Double.compare(s1, s2); 
+            /**
+             * Here we figure out which layers to use for seeding and which to use
+             * for confirming. Since it is highly advantageous for the seed layers 
+             * to be adjacent, we will try to enforce that if possible. 
+             */
+            
+            //get adjacence info if set is adjacent. 
+            List<DumbLayer> adjacenceInfo = null; 
+            for (List<DumbLayer> l : adjacentlist) {
+                if (s.containsAll(l) && l.containsAll(s)) {
+                    adjacenceInfo = l; 
+                    break; 
+                }
+            }
+            
+            //if not all layers are adjacent, then perhaps a subset of size seed_layers is... 
+            if (adjacenceInfo == null) {
+                for (Set<DumbLayer> ss : generateAllPossibleSubsets(s, seed_layers)){
+                    for (List<DumbLayer> l : adjacentlist) {
+                        if (ss.containsAll(l) && l.containsAll(ss)) {
+                            adjacenceInfo = l; 
+                            break; 
+                        }
+                    }
                 }
-            }); 
+            }
+                        
+            /**
+             * The following operations manipulate dlyrlst such that the first num_confirm items will be
+             * used for confirmation and the rest will be used for seeding.  
+             * 
+             * This is kind of kludgy and it might be less confusing if it were changed. 
+             */
+            
+            //if these layers aren't adjacent, just use the weights to figure out which layers to confirm with
+            if (adjacenceInfo == null) {
+                //sort the list from smallest to largest weight. Use smallest weight(s) for confirmation layer(s). 
+                Collections.sort(dlyrlst, new Comparator() {
+                
+                    public int compare(Object o1, Object o2) {
+                        DumbLayer dl1 = (DumbLayer) o1;
+                        DumbLayer dl2 = (DumbLayer) o2; 
+                        double s1 = weighter.getWeight(dl1);
+                        double s2 = weighter.getWeight(dl2);
+                        return Double.compare(s1, s2); 
+                    }
+                }); 
+                
+            } 
+            //If all layers are adjacent, we use either the first or last layers to confirm, depending on the layer weights
+            else if (adjacenceInfo.size() == dlyrlst.size()) { 
+                dlyrlst = adjacenceInfo; 
+                if (weighter.getWeight(dlyrlst.get(0)) > weighter.getWeight(dlyrlst.get(dlyrlst.size()-1)))
+                    Collections.reverse(dlyrlst);
+                    
+            //Otherwise, use the adjacent layers as seeds and not the others... 
+            } else {
+                dlyrlst.removeAll(adjacenceInfo);
+                dlyrlst.addAll(adjacenceInfo); 
+            }
                      
-            int confirmed = 0; 
+            int confirmed = 0; //add the first num_confirm as confirmed... the rest as seed. 
 
             List<SeedLayer> lyrlst = new ArrayList<SeedLayer>(); 
 
@@ -334,7 +390,7 @@
             for (DumbLayer lyr : extendmap.get(s)){
                 lyrlst.add(new SeedLayer(lyr.detectorName, lyr.layer, lyr.be, SeedType.Extend)); 
             }
-
+            
             //get seed/confirmation layers
             for (DumbLayer lyr : dlyrlst){
                 SeedType type;
@@ -352,13 +408,7 @@
             
             //copy over cutoff info from prototype
             SeedStrategy stgy = new SeedStrategy(name,lyrlst);
-            stgy.putBadHitChisq(prototype.getBadHitChisq()); 
-            stgy.putMaxChisq(prototype.getMaxChisq()); 
-            stgy.putMaxDCA(prototype.getMaxDCA()); 
-            stgy.putMaxZ0(prototype.getMaxZ0());
-            stgy.putMinConfirm(prototype.getMinConfirm());
-            stgy.putMinHits(prototype.getMinHits()); 
-            stgy.putMinPT(prototype.getMinPT()); 
+            stgy.copyCutoffsFromStrategy(prototype); 
             strat_list.add(stgy); 
         }
         
@@ -367,7 +417,31 @@
         meta.targetDetector =  detectorName; 
         meta.comment = comment;
         
+        //If symmetrizing, make Endcap Layers for both north and south
+        if (symmetrize) {
+            if (verbose) System.out.println("Symmetrizing..."); 
+            List<SeedStrategy> symmetrized = new ArrayList<SeedStrategy>(); 
+            Iterator<SeedStrategy> it = strat_list.iterator(); 
+            while (it.hasNext()) {
+                SeedStrategy next = it.next(); 
+                for (SeedLayer l : next.getLayerList()) {
+                    //Anything with BarrelEndcapFlag ENDCAP should be mirrored for both sides
+                    if (l.getBarrelEndcapFlag()==BarrelEndcapFlag.ENDCAP) {
+                        it.remove(); //remove this strategy... we will replace it with the other two symmetrized ones
+                        //loop through both north and south configurations
+                        for (BarrelEndcapFlag be : beArray) {
+                            SeedStrategy newstrat = makeMirroredLayer(next, be);
+                            symmetrized.add(newstrat); 
+                        }
+                        break; 
+                    }
+                }
+            }
+            strat_list.addAll(symmetrized); 
+        }
+        
         StrategyXMLUtils.writeStrategyListToFile(strat_list, new File(outputFile), meta);
+        if (verbose) System.out.println(strat_list.size()+" strategies generated."); 
         if (verbose) System.out.println("Strategies XML file written at "+outputFile); 
     }
     
@@ -422,7 +496,8 @@
     public void setParticleFilter(IParticleFilter pfilter){
         filter = pfilter; 
     }
-    
+
+   
     //========privates ============//
     
     private boolean startingCanFind(Set<DumbLayer> set){
@@ -435,6 +510,22 @@
         return false; 
     }
     
+    private SeedStrategy makeMirroredLayer(SeedStrategy next, BarrelEndcapFlag be) {
+        List<SeedLayer> symmlyrs = new ArrayList<SeedLayer>(); //store the new layers here
+        for (SeedLayer ll : next.getLayerList()) {
+            if (ll.getBarrelEndcapFlag().isBarrel()) {
+                // if it's a barrel layer, we can just add it
+                symmlyrs.add(ll);
+            } else {
+                //otherwise change from ENDCAP to either ENDCAP_NORTH or ENDCAP_SOUTH
+                SeedLayer newlyr = new SeedLayer(ll.getDetName(), ll.getLayer(), be, ll.getType());
+                symmlyrs.add(newlyr);
+            }
+        }
+        SeedStrategy newstrat = new SeedStrategy(next.getName() + be.toString(), symmlyrs); //create new strategy
+        newstrat.copyCutoffsFromStrategy(next); //copy parameters
+        return newstrat;
+    }
 
     private static List<Set<DumbLayer>> generateAllPossibleSubsets(Set<DumbLayer> allLayers, int subset_size) {
         

lcsim/src/org/lcsim/contrib/seedtracker/strategybuilder
SubsetScorer.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- SubsetScorer.java	21 Jul 2008 21:21:12 -0000	1.3
+++ SubsetScorer.java	12 Aug 2008 23:13:00 -0000	1.4
@@ -6,6 +6,7 @@
 package org.lcsim.contrib.seedtracker.strategybuilder;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -20,7 +21,7 @@
         LayerWeight weighter = new LayerWeight(); 
         Map<Set<DumbLayer>,Integer> adjacencemap = new HashMap<Set<DumbLayer>,Integer>(); 
         
-        public SubsetScorer(List<Set<DumbLayer>> setlist, List<Set<DumbLayer>> adjacentSets) {
+        public SubsetScorer(List<Set<DumbLayer>> setlist, List<List<DumbLayer>> adjacentSets) {
             
             for (Set<DumbLayer> set : setlist) {
                 if(setmap.containsKey(set)){
@@ -30,7 +31,10 @@
                 }
             }
             
-           for (Set<DumbLayer> set : adjacentSets) {
+           for (List<DumbLayer> list : adjacentSets) {
+               //convert to a set because of faster lookup? (actually it might not be since the collection sizes are so small?)
+               Set<DumbLayer> set = new HashSet<DumbLayer>(list.size());
+               set.addAll(list); 
                 if(adjacencemap.containsKey(set)){
                     adjacencemap.put(set,adjacencemap.get(set).intValue()+1);  
                 } else {

lcsim/resources/org/lcsim/contrib/seedtracker/strategybuilder/weights
default_weights_sid01.xml added at 1.1
diff -N default_weights_sid01.xml
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ default_weights_sid01.xml	12 Aug 2008 23:13:00 -0000	1.1
@@ -0,0 +1,100 @@
+<?xml veron="1.0" encoding="UTF-8"?>
+<LayerWeight xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+xs:noNamespaceSchemaLocation="http://lcm.org/contrib/seedtracker/strategybuilder/layerweights.xsd">
+   
+     
+<!-- 
+    By Cosmin Deaconu
+    
+    These weights were found to work satisfactorily with ngle
+    muon events. They should certainly not be condered optimal... 
+    
+    Unfortunately, coming up with good weights seems to be a little bit of
+    black magic... 
+    
+    Score is calculated with the following formula:
+    
+    N*w*(c+m*a^e)
+    
+    N = Number of new tracks that could theoretically be found
+    w = Average weight of subset layers
+    a = Adjacence, the number of times in the training event that the 
+        subset layers are adjacent (i.e., they are hit consecutively by an
+        MCParticle). 
+    c = AdjacenceConstant
+    m = AdjacenceMultiplier
+    e = AdjacenceExponent
+    
+        
+    -->
+    
+
+
+      <!--Default used for any not already defined-->
+      <DefaultReadoutEfficiency>0.99</DefaultReadoutEfficiency>
+      <DefaultWeight>1.0</DefaultWeight>
+     
+      <TargetDetector>sid01</TargetDetector>
+
+      
+      <!-- Adjacence modifiers (see above for formula)-->
+      <AdjacenceConstant>2</AdjacenceConstant>
+      <AdjacenceMultiplier>1</AdjacenceMultiplier>
+      <AdjacenceExponent>0.1</AdjacenceExponent>
+
+      
+  <ReadoutEfficiencies>
+          <ReadoutEfficiency readout="VtxBarrHits">0.9</ReadoutEfficiency>
+          <ReadoutEfficiency readout="VtxEndcapHits">0.9</ReadoutEfficiency>
+  </ReadoutEfficiencies>
+  
+  <Layers>
+       
+      <!--Barrel-->
+
+        <Layer layer_number="4" detector_name="TrackerBarrel" be_flag="BARREL">3.0</Layer>
+        <Layer layer_number="3" detector_name="TrackerBarrel" be_flag="BARREL">2.08</Layer>
+        <Layer layer_number="2" detector_name="TrackerBarrel" be_flag="BARREL">2.07</Layer>
+        <Layer layer_number="1" detector_name="TrackerBarrel" be_flag="BARREL">2.06</Layer>
+        <Layer layer_number="0" detector_name="TrackerBarrel" be_flag="BARREL">2</Layer>
+        <Layer layer_number="4" detector_name="VertexBarrel" be_flag="BARREL">1</Layer>
+        <Layer layer_number="3" detector_name="VertexBarrel" be_flag="BARREL">1.01</Layer>
+        <Layer layer_number="2" detector_name="VertexBarrel" be_flag="BARREL">1.02</Layer>
+        <Layer layer_number="1" detector_name="VertexBarrel" be_flag="BARREL">1.03</Layer>
+        <Layer layer_number="0" detector_name="VertexBarrel" be_flag="BARREL">1.04</Layer>
+
+
+      <!--North Endcap-->
+
+        <Layer layer_number="3" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.59</Layer>
+        <Layer layer_number="2" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.58</Layer>
+        <Layer layer_number="1" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.57</Layer>
+        <Layer layer_number="0" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.06</Layer>
+
+        <Layer layer_number="2" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.02</Layer>
+        <Layer layer_number="1" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.41</Layer>
+        <Layer layer_number="0" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.5</Layer>
+
+        <Layer layer_number="3" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">0.0053</Layer>
+        <Layer layer_number="2" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">0.0052</Layer>
+        <Layer layer_number="1" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">0.0051</Layer>
+        <Layer layer_number="0" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">0.005</Layer>
+
+      <!--South Endcap-->
+
+        <Layer layer_number="3" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.59</Layer>
+        <Layer layer_number="2" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.58</Layer>
+        <Layer layer_number="1" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.57</Layer>
+        <Layer layer_number="0" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.06</Layer>
+
+        <Layer layer_number="2" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.02</Layer>
+        <Layer layer_number="1" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.41</Layer>
+        <Layer layer_number="0" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.5</Layer>
+
+        <Layer layer_number="3" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">0.0053</Layer>
+        <Layer layer_number="2" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">0.0052</Layer>
+        <Layer layer_number="1" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">0.0051</Layer>
+        <Layer layer_number="0" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">0.005</Layer>
+    </Layers>
+</LayerWeight>
+
CVSspam 0.2.8