Print

Print


Commit in lcsim on MAIN
src/org/lcsim/recon/tracking/seedtracker/strategybuilder/LayerWeight.java+17-201.3 -> 1.4
                                                        /StrategyBuilder.java+75-341.3 -> 1.4
                                                        /SubsetScorer.java+2-51.2 -> 1.3
resources/org/lcsim/recon/tracking/seedtracker/strategybuilder/weights/default_weights_sid01.xml+6-81.2 -> 1.3
                                                                      /default_weights_sid01_planar_tracker.xml+4-61.2 -> 1.3
                                                                      /default_weights_sid01_planar_tracker_inside_out.xml-11.2 -> 1.3
resources/org/lcsim/recon/tracking/seedtracker/strategybuilder/layerweights.xsd+1-11.1 -> 1.2
src/org/lcsim/recon/tracking/seedtracker/StrategyXMLUtils.java+3-11.6 -> 1.7
+108-76
8 modified files
CD - Change weighing formula!!!!!!!,  fix sid02 TrackerForward handling, improve XML output, fix random seed for inefficiency

lcsim/src/org/lcsim/recon/tracking/seedtracker/strategybuilder
LayerWeight.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- LayerWeight.java	27 Aug 2008 19:28:50 -0000	1.3
+++ LayerWeight.java	22 Oct 2008 04:11:54 -0000	1.4
@@ -34,13 +34,13 @@
     
         private double default_weight = 1.0;
         private double adjacence_constant = 2.0;
-        private double adjacence_exponent = 0.1;
         private double adjacence_multiplier = 1.0;
         private Map<DumbLayer, Double> weights; 
         private Map<String, Double> readout_efficiencies; 
         private double defaultEfficiency = 1.0; 
         private String targetDetector = "None Specified"; 
-        private boolean divideByTwo = false; 
+        private boolean divideByTwoInTrackerEndcap = false; 
+        private boolean divideByTwoInTrackerForward = false; 
         
         public LayerWeight(){
             weights = new HashMap<DumbLayer,Double>(); 
@@ -107,13 +107,11 @@
         }
         
         public double getWeight(Set<DumbLayer> set) {
-            double ret = 0.0;
+            double ret = 1.0;
             
             for (DumbLayer lyr : set) {
-                ret+=getWeight(lyr); 
+                ret*=getWeight(lyr); 
             }
-            
-            ret /= (double) set.size(); 
             return ret; 
         }
         
@@ -133,23 +131,22 @@
             this.adjacence_constant = adjacence_constant;
         }
         
-        public double getAdjacenceExponent() {
-            return adjacence_exponent;
-        }
 
-        public void setAdjacenceExponent(double adjacence_exponent) {
-            this.adjacence_exponent = adjacence_exponent;
+        public boolean isDivideByTwoInTrackerEndcap() {
+            return divideByTwoInTrackerEndcap;
         }
 
-        public boolean isDivideByTwo() {
-            return divideByTwo;
+        public void setDivideByTwoInTrackerEndcap(boolean divideByTwo) {
+            this.divideByTwoInTrackerEndcap = divideByTwo;
         }
 
-        public void setDivideByTwo(boolean divideByTwo) {
-            this.divideByTwo = divideByTwo;
+        public boolean isDivideByTwoInTrackerForward() {
+            return divideByTwoInTrackerForward;
         }
 
-        
+        public void setDivideByTwoInTrackerForward(boolean divideByTwo) {
+            this.divideByTwoInTrackerForward = divideByTwo;
+        }
                 
         /**
          * Returns the prefix of the default resource path to where the 
@@ -255,9 +252,9 @@
                 lw.setDefaultReadoutEfficiency(Double.valueOf(root.getChildText("DefaultReadoutEfficiency")));
                 try {lw.setAdjacenceMultiplier(Double.valueOf(root.getChildText("AdjacenceMultiplier")).doubleValue());} catch(NullPointerException npe){}
                 try {lw.setAdjacenceConstant(Double.valueOf(root.getChildText("AdjacenceConstant")).doubleValue());} catch(NullPointerException npe){}
-                try {lw.setAdjacenceExponent(Double.valueOf(root.getChildText("AdjacenceExponent")).doubleValue());} catch(NullPointerException npe){}
                 try {lw.setTargetDetector(root.getChildText("TargetDetector"));} catch(NullPointerException npe){}
-                try {lw.setDivideByTwo(Boolean.valueOf(root.getChild("TargetDetector").getAttributeValue("divide_by_two_in_tracker_endcap")));} catch(NullPointerException npe){}
+                try {lw.setDivideByTwoInTrackerEndcap(Boolean.valueOf(root.getChild("TargetDetector").getAttributeValue("divide_by_two_in_tracker_endcap")));} catch(NullPointerException npe){}
+                try {lw.setDivideByTwoInTrackerForward(Boolean.valueOf(root.getChild("TargetDetector").getAttributeValue("divide_by_two_in_tracker_forward")));} catch(NullPointerException npe){}
                 Element layers = root.getChild("Layers"); 
                 for (Object o : layers.getChildren("Layer")){
                     
@@ -300,10 +297,10 @@
             root.setAttribute(new Attribute("noNamespaceSchemaLocation","http://lcsim.org/recon/tracking/seedtracker/strategybuilder/strategies.xsd",xs));
             root.addContent(new Element("DefaultWeight").addContent(String.valueOf(default_weight))); 
             root.addContent(new Element("DefaultReadoutEfficiency").addContent(String.valueOf(defaultEfficiency)));          
-            root.addContent(new Element("TargetDetector").addContent(String.valueOf(targetDetector)).setAttribute("divide_by_two_in_tracker_endcap", String.valueOf(divideByTwo))); 
+            root.addContent(new Element("TargetDetector").addContent(String.valueOf(targetDetector)).setAttribute("divide_by_two_in_tracker_endcap", String.valueOf(divideByTwoInTrackerEndcap))); 
+            root.addContent(new Element("TargetDetector").addContent(String.valueOf(targetDetector)).setAttribute("divide_by_two_in_tracker_forward", String.valueOf(divideByTwoInTrackerForward))); 
             root.addContent(new Element("AdjacenceConstant").addContent(String.valueOf(adjacence_constant))); 
             root.addContent(new Element("AdjacenceMultiplier").addContent(String.valueOf(adjacence_multiplier))); 
-            root.addContent(new Element("AdjacenceExponent").addContent(String.valueOf(adjacence_exponent))); 
             
             Element ro = new Element("ReadoutEfficiencies"); 
             

lcsim/src/org/lcsim/recon/tracking/seedtracker/strategybuilder
StrategyBuilder.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- StrategyBuilder.java	10 Oct 2008 06:10:46 -0000	1.3
+++ StrategyBuilder.java	22 Oct 2008 04:11:55 -0000	1.4
@@ -32,7 +32,6 @@
 import org.lcsim.fit.helicaltrack.HitIdentifier;
 import org.lcsim.geometry.Detector;
 import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
-import org.lcsim.util.Driver;
 
 /**
  * StrategyBuilder automatically generates strategies for a detector by
@@ -48,6 +47,8 @@
             System.getProperties().getProperty("file.separator")+
             "BuiltStrategies.xml"; 
     
+    public static final int RandomSeed = 1234; 
+    
     //these are defined separately because RunStrategyBuilder uses some of these too... 
     public static final boolean defaultVerbose = false; 
     public static final int defaultMinLayers = 7; 
@@ -75,8 +76,8 @@
     private IParticleFilter filter; 
     private List<List<DumbLayer>> adjacentlist = new ArrayList<List<DumbLayer>>(); 
     //4:26
-    private Random random = new Random(); 
-    
+    private Random random = new Random(RandomSeed); 
+    private Map<Set<DumbLayer>,SubsetScore> scoremap; 
 
     @Override 
     protected void startOfData(){
@@ -139,9 +140,12 @@
                 BarrelEndcapFlag be = ID.getBarrelEndcapFlag(de); 
                 
                 //kludgy divide by two thing
-                if (weighter.isDivideByTwo() && be.isEndcap() && 
-                        (detname.indexOf("Tracker") > -1 || detname.indexOf("Tkr") > -1) ) {
-                    lyr/=2;  // sid01 doubles up on layer numbering in the endcap. 
+                if (weighter.isDivideByTwoInTrackerForward() && be.isEndcap() && 
+                        (detname.indexOf("TrackerForward") > -1 || detname.indexOf("TkrForward") > -1) ) {
+                        lyr/=2;  // sid01/sid02 doubles up on layer numbering in the endcap. 
+                } else if (weighter.isDivideByTwoInTrackerForward() && be.isEndcap() && 
+                        (detname.indexOf("TrackerEndcap") > -1 || detname.indexOf("TkrEndcap") > -1) ) {
+                        lyr/=2;  // sid01 doubles up on layer numbering in the forward. 
                 }
                 
                 //if symmetrizing, we want to treat North and South layers equivalently. 
@@ -187,28 +191,30 @@
         
        //create startingSet... this will be used so that new strategies aren't extraneously generated
        for (SeedStrategy strategy : startingStrategies){
-            Set<DumbLayer> subset = new HashSet<DumbLayer>(); 
-            for (SeedLayer lyr : strategy.getLayers(SeedLayer.SeedType.Seed))
-                subset.add(new DumbLayer(lyr.getDetName(), lyr.getLayer(), lyr.getBarrelEndcapFlag())); 
-            
-            for (SeedLayer lyr: strategy.getLayers(SeedLayer.SeedType.Confirm))
-                subset.add(new DumbLayer(lyr.getDetName(), lyr.getLayer(), lyr.getBarrelEndcapFlag())); 
+            Set<DumbLayer> subset = getRelevantSet(strategy, true);
             startingSet.add(subset); 
         }
         if (verbose) System.out.println(startingStrategies.size()+" starting strategies defined.");
        
        //If any of the starting strategies can find a set, discard it.
-        Iterator<Set<DumbLayer>> iter = setlist.iterator(); 
-        while (iter.hasNext()){
-            Set<DumbLayer> this_set = iter.next();     
-            if (startingCanFind(this_set)){
-                iter.remove(); 
-            }
-         }
-        
+//        Iterator<Set<DumbLayer>> iter = setlist.iterator(); 
+//        while (iter.hasNext()){
+//            Set<DumbLayer> this_set = iter.next();     
+//            if (startingCanFind(this_set)) {
+//                iter.remove(); 
+//            }
+//         }
+      
         //Generate the scorer and assign its weighter
         SubsetScorer scorer = new SubsetScorer(setlist,adjacentlist); 
         scorer.setLayerWeight(weighter); 
+        scoremap = new HashMap<Set<DumbLayer>,SubsetScore>(); 
+        
+        
+        for (Set<DumbLayer> starter : startingSet) {
+            scoremap.put(starter, scorer.getScoreObject(starter)); 
+            scorer.markUsed(starter);
+        }
         
         //Generate all possible subsets of the right size of allLayers
         List<Set<DumbLayer>> all_subsets = StrategyBuilderUtils.generateAllPossibleDumbLayerSubsetsList(allLayers, confirm_layers+seed_layers); 
@@ -226,7 +232,6 @@
         if (verbose) System.out.println("Layer set has "+setset.size()+" entries.");
         //map from a final_set to all other associated layers to generate extension layers
         Map<Set<DumbLayer>, Set<DumbLayer>> extendmap = new HashMap<Set<DumbLayer>,Set<DumbLayer>>();
-        Map<Set<DumbLayer>,SubsetScore> scoremap = new HashMap<Set<DumbLayer>,SubsetScore>(); 
         
         
         SubsetScore score = new SubsetScore(0,0,0); 
@@ -259,7 +264,7 @@
                     
                     //add extension layers to extendmap
                     Set<DumbLayer> nw = new HashSet<DumbLayer>(); 
-                    for (DumbLayer dumb : this_set){
+                    for (DumbLayer dumb : this_set){                             
                         if(!max.contains(dumb)) nw.add(dumb);
                     }
                     Set<DumbLayer> old = extendmap.get(max); 
@@ -278,11 +283,15 @@
        
         //Generate the StrategyList 
         int counter = 0; 
+                
+        StrategyXMLMetadata meta = new StrategyXMLMetadata(); 
+        
         List<SeedStrategy> strat_list = new ArrayList<SeedStrategy>(); 
         strat_list.addAll(startingStrategies); 
-        
-        
-        StrategyXMLMetadata meta = new StrategyXMLMetadata(); 
+        for (SeedStrategy starter : startingStrategies) {
+            int unw_score = scoremap.get(getRelevantSet(starter,true)).numTracks(); 
+            meta.strategyComments.put(starter, "Num findable tracks (total, not additional): "+unw_score);
+        }
         
         //create Strategies from final_sets... this part is klunky right now. 
         for (Set<DumbLayer> s : final_sets) {
@@ -397,6 +406,19 @@
             StrategyBuilderUtils.symmetrizeStrategies(strat_list, meta);
         }
         
+        //sort Strategy list
+        
+        if (verbose) System.out.println("Sorting output"); 
+        Collections.sort(strat_list, new Comparator() {
+
+            public int compare(Object o1, Object o2) {
+                SeedStrategy one = (SeedStrategy) o1; 
+                SeedStrategy two = (SeedStrategy) o2;
+                return Double.compare(scoremap.get(getRelevantSet(two,true)).numTracks(), 
+                        scoremap.get(getRelevantSet(one,true)).numTracks());
+            }
+        }); 
+        
         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); 
@@ -503,16 +525,35 @@
 
         return mcmap;
     }
-    
-    private boolean startingCanFind(Set<DumbLayer> set){
-        
-        for (Set<DumbLayer> s : startingSet){
-            if (set.containsAll(s))
-                return true; 
-        }
-        
-        return false; 
+
+    private Set<DumbLayer> getRelevantSet(SeedStrategy strategy, boolean ignoreNorthSouth) {
+        Set<DumbLayer> subset = new HashSet<DumbLayer>();
+        for (SeedLayer lyr : strategy.getLayers(SeedLayer.SeedType.Seed)) {
+            
+            BarrelEndcapFlag be = lyr.getBarrelEndcapFlag(); 
+            if (ignoreNorthSouth && be.isEndcap()) be = BarrelEndcapFlag.ENDCAP; 
+            subset.add(new DumbLayer(lyr.getDetName(), lyr.getLayer(), be));
+           
+        }
+        for (SeedLayer lyr : strategy.getLayers(SeedLayer.SeedType.Confirm)) {
+            BarrelEndcapFlag be = lyr.getBarrelEndcapFlag(); 
+            if (ignoreNorthSouth && be.isEndcap()) be = BarrelEndcapFlag.ENDCAP; 
+            subset.add(new DumbLayer(lyr.getDetName(), lyr.getLayer(), be));
+        }
+        return subset;
     }
     
+    
+    
+//    private boolean startingCanFind(Set<DumbLayer> set){
+//        
+//        for (Set<DumbLayer> s : startingSet){
+//            if (set.containsAll(s))
+//                return true; 
+//        }
+//        
+//        return false; 
+//    }
+    
 
 }

lcsim/src/org/lcsim/recon/tracking/seedtracker/strategybuilder
SubsetScorer.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- SubsetScorer.java	10 Oct 2008 06:10:46 -0000	1.2
+++ SubsetScorer.java	22 Oct 2008 04:11:55 -0000	1.3
@@ -55,17 +55,14 @@
         }
         
         
-        //s * w * (a + b * adjacence ^ c)
+        //s * Pi(w) * (a + b * ln (adjacence))
         //
         public double getScore(Set<DumbLayer> testSet) {
           return getUnweightedScore(testSet) * weighter.getWeight(testSet)
                   * (  weighter.getAdjacenceConstant() + 
-                        Math.pow(getAdjacence(testSet), weighter.getAdjacenceExponent())
+                        Math.log(getAdjacence(testSet))
                          * weighter.getAdjacenceMultiplier() 
                     ); 
-            
-            
-         
         }
         
         public int getUnweightedScore(Set<DumbLayer> testSet){

lcsim/resources/org/lcsim/recon/tracking/seedtracker/strategybuilder/weights
default_weights_sid01.xml 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- default_weights_sid01.xml	27 Aug 2008 19:28:50 -0000	1.2
+++ default_weights_sid01.xml	22 Oct 2008 04:11:55 -0000	1.3
@@ -12,18 +12,17 @@
     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)
+    Scoring formula: 
+    N*w*(c+m*ln(a))
     
     N = Number of new tracks that could theoretically be found
-    w = Average weight of subset layers
+    w =Product of weights 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
+    
     
         
     -->
@@ -31,15 +30,14 @@
 
 
       <!--Default used for any not already defined-->
-      <DefaultReadoutEfficiency>0.99</DefaultReadoutEfficiency>
+      <DefaultReadoutEfficiency>1.0</DefaultReadoutEfficiency>
       <DefaultWeight>1.0</DefaultWeight>
      
-      <TargetDetector divide_by_two_in_tracker_endcap="true">sid01</TargetDetector>
+      <TargetDetector divide_by_two_in_tracker_endcap="true" divide_by_two_in_tracker_forward="true">sid01</TargetDetector>
       
       <!-- Adjacence modifiers (see above for formula)-->
       <AdjacenceConstant>2</AdjacenceConstant>
       <AdjacenceMultiplier>1</AdjacenceMultiplier>
-      <AdjacenceExponent>0.1</AdjacenceExponent>
   
   <Layers>
        

lcsim/resources/org/lcsim/recon/tracking/seedtracker/strategybuilder/weights
default_weights_sid01_planar_tracker.xml 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- default_weights_sid01_planar_tracker.xml	27 Aug 2008 19:28:50 -0000	1.2
+++ default_weights_sid01_planar_tracker.xml	22 Oct 2008 04:11:55 -0000	1.3
@@ -12,18 +12,17 @@
     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)
+    Scoring formula: 
+    N*w*(c+m*ln(a))
     
     N = Number of new tracks that could theoretically be found
-    w = Average weight of subset layers
+    w =Product of weights 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
+    
     
         
     -->
@@ -37,7 +36,6 @@
       <!-- Adjacence modifiers (see above for formula)-->
       <AdjacenceConstant>2</AdjacenceConstant>
       <AdjacenceMultiplier>1</AdjacenceMultiplier>
-      <AdjacenceExponent>0.1</AdjacenceExponent>
 
       
   <ReadoutEfficiencies>

lcsim/resources/org/lcsim/recon/tracking/seedtracker/strategybuilder/weights
default_weights_sid01_planar_tracker_inside_out.xml 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- default_weights_sid01_planar_tracker_inside_out.xml	27 Aug 2008 19:28:50 -0000	1.2
+++ default_weights_sid01_planar_tracker_inside_out.xml	22 Oct 2008 04:11:55 -0000	1.3
@@ -37,7 +37,6 @@
       <!-- Adjacence modifiers (see above for formula)-->
       <AdjacenceConstant>2</AdjacenceConstant>
       <AdjacenceMultiplier>1</AdjacenceMultiplier>
-      <AdjacenceExponent>0.1</AdjacenceExponent>
 
       
   <ReadoutEfficiencies>

lcsim/resources/org/lcsim/recon/tracking/seedtracker/strategybuilder
layerweights.xsd 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- layerweights.xsd	27 Aug 2008 19:08:21 -0000	1.1
+++ layerweights.xsd	22 Oct 2008 04:11:55 -0000	1.2
@@ -9,7 +9,6 @@
                     <xsd:element name="DivideByTwoInTrackerEndcap" type="xsd:boolean" minOccurs="0"/>
                     <xsd:element name="AdjacenceConstant" type="xsd:double" minOccurs="0"/>		
                     <xsd:element name="AdjacenceMultiplier" type="xsd:double" minOccurs="0"/>		
-                    <xsd:element name="AdjacenceExponent" type="xsd:double" minOccurs="0"/>		
                     <xsd:element name="DefaultWeight" type="xsd:double"/>
                     <xsd:element name="ReadoutEfficiencies" type="ReadoutEfficienciesType" minOccurs="0"/>
                     <xsd:element name="Layers" type="LayersType" minOccurs="0"/>
@@ -22,6 +21,7 @@
         <xsd:simpleContent>
             <xsd:extension base="xsd:string">
                 <xsd:attribute name="divide_by_two_in_tracker_endcap" type="xsd:boolean" default="false"/>
+                <xsd:attribute name="divide_by_two_in_tracker_forward" type="xsd:boolean" default="false"/>
             </xsd:extension>
         </xsd:simpleContent>
     </xsd:complexType>

lcsim/src/org/lcsim/recon/tracking/seedtracker
StrategyXMLUtils.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- StrategyXMLUtils.java	10 Oct 2008 23:10:33 -0000	1.6
+++ StrategyXMLUtils.java	22 Oct 2008 04:11:55 -0000	1.7
@@ -190,8 +190,10 @@
             } else listElement.addContent(new Element("TargetDetector").addContent("None specified")); 
         }  else listElement.addContent(new Element("TargetDetector").addContent("None specified")); 
         
+        int counter = 1; 
         for (SeedStrategy strat : strategyList){
-            
+            listElement.addContent("\n");
+            listElement.addContent(new Comment(String.valueOf(counter++)));
             Element strategy = new Element("Strategy");
             
             if (meta!=null && meta.strategyComments.containsKey(strat)){
CVSspam 0.2.8