8 modified files
lcsim/src/org/lcsim/recon/tracking/seedtracker/strategybuilder
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
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
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
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
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
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
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
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