Commit in lcsim/src/org/lcsim/contrib/uiowa on MAIN
NonTrivialPFA.java+63-141.22 -> 1.23
MJC: Various changes and tweaks to PFA. Handle a couple of pathological cases.

lcsim/src/org/lcsim/contrib/uiowa
NonTrivialPFA.java 1.22 -> 1.23
diff -u -r1.22 -r1.23
--- NonTrivialPFA.java	5 Oct 2007 18:08:23 -0000	1.22
+++ NonTrivialPFA.java	12 Oct 2007 21:47:19 -0000	1.23
@@ -57,6 +57,7 @@
 import org.lcsim.recon.cluster.util.HitInECALDecision;
 import org.lcsim.recon.cluster.structural.LikelihoodFindingStructuralDriver;
 import org.lcsim.recon.pfa.structural.HitBookKeeper;
+import org.lcsim.event.base.*;
 
 public class NonTrivialPFA extends Driver
 {
@@ -173,9 +174,13 @@
 	    add (new MCFastTracking());
 	    String nonCheatingTrackList = EventHeader.TRACKS;
 	    
+	    // Find tracks (really cheating)
+            String cheatingTrackList = "Tracks_by_cheat";
+	    add (new ImprovisedTrackCheater(mcListName, cheatingTrackList));
+
 	    // Find tracks (cheating)
             // Code taken from Steve Magill
-            String cheatingTrackList = "Tracks_by_ron";
+	    String ronTrackList = "Tracks_by_ron";
             {
                 // Make cheat tracks and cheat clusters
                 String Tname = "RefinedCheatTracks";
@@ -201,17 +206,23 @@
                 add(d);
 
 		// Make up list of tracks
-		org.lcsim.mc.fast.tracking.MCFastTracking ronFastMC = new org.lcsim.mc.fast.tracking.MCFastTracking();
-		ronFastMC.setOutputList(cheatingTrackList);
-		ronFastMC.setFSList("PerfectRecoMCParticles");
-		add(ronFastMC);   
+		// Don't use fast MC here since Ron has already sifted the tracks for
+		// reconstructability, and applying the fast MC will double-count inefficiency.
+		//org.lcsim.mc.fast.tracking.MCFastTracking ronFastMC = new org.lcsim.mc.fast.tracking.MCFastTracking();
+		//ronFastMC.setOutputList(ronTrackList);
+		//ronFastMC.setFSList("PerfectRecoMCParticles");
+		//add(ronFastMC);   
+		add (new ImprovisedTrackCheater("PerfectRecoMCParticles", ronTrackList));
             }
 	    
 	    // Choose which track list to use
 	    boolean useRonTrackList = false;
+	    boolean useCheatingTrackList = false;
 	    if (useRonTrackList) {
-		trackList = cheatingTrackList;
+		trackList = ronTrackList;
 		mcListName = "PerfectRecoMCParticles";
+	    } else if (useCheatingTrackList) {
+		trackList = cheatingTrackList;
 	    } else {
 		trackList = nonCheatingTrackList;
 	    }
@@ -228,7 +239,7 @@
 	    String prefix = "photonfinder__";
 	    String inputTrackList = trackList;
 	    boolean cheatOnPhotons = false;
-	    boolean useRonPhotonFinder = false;
+	    boolean useRonPhotonFinder = true;
 	   if (cheatOnPhotons) {
 		addCheatingPhotonFinder(prefix, eventHitMapEcal, inputTrackList, eventPhotonClusters, eventHitMapEcalWithoutPhotons, mcListName);
 	    } else if (useRonPhotonFinder) {
@@ -357,11 +368,17 @@
 	    {
 		LocalHelixExtrapolationTrackClusterMatcher extrapolate = new LocalHelixExtrapolationTrackClusterMatcher();
 		extrapolate.setCutSeparation(14.0); // about two cells
+		org.lcsim.recon.pfa.identifier.SimpleTrackClusterMatcher simpleExtrapolate = new org.lcsim.recon.pfa.identifier.SimpleTrackClusterMatcher(14.0);
+		org.lcsim.recon.pfa.identifier.SimpleTrackClusterMatcher simpleCheatExtrapolate = new org.lcsim.recon.pfa.identifier.CheatHelixTrackClusterMatcher(14.0);
 		CheatTrackClusterMatcher cheater = new CheatTrackClusterMatcher(mcListName);
-		CheckSkeletonsForMultipleTracks separate = new CheckSkeletonsForMultipleTracks(evalWrapper, trackList, eventSkeletonClusters, eventSplitSkeletonClusters, eventMips, eventClumps, extrapolate);
-		//CheckSkeletonsForMultipleTracks separate = new CheckSkeletonsForMultipleTracks(evalWrapper, trackList, eventSkeletonClusters, eventSplitSkeletonClusters, eventMips, eventClumps, cheater);
+		CheckSkeletonsForMultipleTracks separate = new CheckSkeletonsForMultipleTracks(evalWrapper, trackList, eventSkeletonClusters, eventSplitSkeletonClusters, eventMips, eventClumps, extrapolate); // LOCAL HELIX EXTRAPOLATION BASED ON SimTrackerHits
+		//CheckSkeletonsForMultipleTracks separate = new CheckSkeletonsForMultipleTracks(evalWrapper, trackList, eventSkeletonClusters, eventSplitSkeletonClusters, eventMips, eventClumps, cheater); // CHEATING
+		//CheckSkeletonsForMultipleTracks separate = new CheckSkeletonsForMultipleTracks(evalWrapper, trackList, eventSkeletonClusters, eventSplitSkeletonClusters, eventMips, eventClumps, simpleExtrapolate); // HELIX EXTRAPOLATION FROM ORIGIN BASED ON TRACK PARAMETERS
+		//CheckSkeletonsForMultipleTracks separate = new CheckSkeletonsForMultipleTracks(evalWrapper, trackList, eventSkeletonClusters, eventSplitSkeletonClusters, eventMips, eventClumps, simpleCheatExtrapolate); // HELIX EXTRAPOLATION FROM ORIGIN BASED ON TRUTH MOMENTUM
 		add(cheater);
 		add(extrapolate);
+		add(simpleExtrapolate);
+		add(simpleCheatExtrapolate);
 		add(separate);
 	    }
 
@@ -399,9 +416,9 @@
 	    String eventOutputParticles = "UnflushedPFAReconstructedParticles";
 	    String prefixHadronsMain = "merge_ron_ron__";
 	    if (cheatOnFragments) {
-		addHadronFinders(prefixHadronsMain, eventOutputParticles, fragIDCheat, fragMerge, eventMips, eventHaloMinusPhotonClusters, eventSmallClustersNotPhotons, trackList, eventSmallPhotonParticles, largePhotonParticleList, ronNeutralHadronCalib, ronNeutralHadronCalib, false, mcListName);
+		addHadronFinders(prefixHadronsMain, eventOutputParticles, fragIDCheat, fragMerge, eventMips, eventHaloMinusPhotonClusters, eventSmallClustersNotPhotons, trackList, eventSmallPhotonParticles, largePhotonParticleList, ronNeutralHadronCalib, ronNeutralHadronCalib, false, mcListName, eventUnusedHitsMinusHalo);
 	    } else {
-		addHadronFinders(prefixHadronsMain, eventOutputParticles, fragID, fragMerge, eventMips, eventHaloMinusPhotonClusters, eventSmallClustersNotPhotons, trackList, eventSmallPhotonParticles, largePhotonParticleList, ronNeutralHadronCalib, ronChargedHadronCalib, false, mcListName);
+		addHadronFinders(prefixHadronsMain, eventOutputParticles, fragID, fragMerge, eventMips, eventHaloMinusPhotonClusters, eventSmallClustersNotPhotons, trackList, eventSmallPhotonParticles, largePhotonParticleList, ronNeutralHadronCalib, ronChargedHadronCalib, false, mcListName, eventUnusedHitsMinusHalo);
 	    }
 
 	    // Flush the output list to make sure it's LCIO-compatible
@@ -774,6 +791,9 @@
 	// First try the MIPs...
 	MIPChargedParticleMaker hadIDmip = new MIPChargedParticleMaker();
 	LocalHelixExtrapolationTrackMIPClusterMatcher mipMatch = new LocalHelixExtrapolationTrackMIPClusterMatcher();
+	mipMatch.setDebug(debug);
+	//org.lcsim.recon.pfa.identifier.SimpleTrackMIPClusterMatcher mipMatch = new org.lcsim.recon.pfa.identifier.SimpleTrackMIPClusterMatcher();
+	//org.lcsim.recon.pfa.identifier.SimpleTrackMIPClusterMatcher mipMatch = new org.lcsim.recon.pfa.identifier.CheatHelixTrackMIPClusterMatcher();
 	add(mipMatch);
 	hadIDmip.setTrackMatcher(mipMatch);
 	hadIDmip.setInputTrackList(trackList);
@@ -793,6 +813,8 @@
 	// Then try the clusters generically:
 	SimpleChargedParticleMaker hadID = new SimpleChargedParticleMaker();
 	LocalHelixExtrapolationTrackClusterMatcher clusMatch = new LocalHelixExtrapolationTrackClusterMatcher();
+	//org.lcsim.recon.pfa.identifier.SimpleTrackClusterMatcher clusMatch = new org.lcsim.recon.pfa.identifier.SimpleTrackClusterMatcher();
+	//org.lcsim.recon.pfa.identifier.SimpleTrackClusterMatcher clusMatch = new org.lcsim.recon.pfa.identifier.CheatHelixTrackClusterMatcher();
 	add(clusMatch);
 	hadID.setTrackMatcher(clusMatch);
 	hadID.setInputTrackList(prefix+"tracksMinusMipAssociations");
@@ -803,6 +825,7 @@
 	    CheckEoverP check = new CheckEoverP(calibration,3.0);
 	    check.setDebug(debug);
 	    clusMatch.setExtraCheck(check);
+	    //clusMatch.setCalibration(calibration); clusMatch.setCheckEoverP(true); // for use with SimpleTrackClusterMatcher
 	}
 	hadID.setDebug(debug);
 	add(hadID);
@@ -861,15 +884,17 @@
 	add(smallPhotonMaker);	
     }
     
-    protected void addFragmentHandling(String prefix, FragmentIdentifier fragID, FragmentMerger fragMerge, String haloMinusPhotonClusterList, String smallClusterMinusPhotonClusterList, String outputClusterList, String outputHitMap)
+    protected void addFragmentHandling(String prefix, FragmentIdentifier fragID, FragmentMerger fragMerge, String haloMinusPhotonClusterList, String smallClusterMinusPhotonClusterList, String outputClusterList, String outputHitMap, String inputHitMap)
     {
 	FragmentHandler fragDriver = new FragmentHandler();
 	fragDriver.addInputClusterList(haloMinusPhotonClusterList);
 	fragDriver.addInputClusterList(smallClusterMinusPhotonClusterList);
+	fragDriver.addInputHitMap(inputHitMap);
 	fragDriver.setOutputClusterList(outputClusterList);
 	fragDriver.setOutputHitMap(outputHitMap);
 	fragDriver.setFragmentIdentifier(fragID);
 	fragDriver.setFragmentMerger(fragMerge);
+	fragDriver.setAllowAllFragments(false);
 	add(fragDriver);
     }
 
@@ -932,12 +957,13 @@
 				    ClusterEnergyCalculator calibration,
 				    ClusterEnergyCalculator calibrationForEoverP,
 				    boolean trackDebug,
-				    String mcListName)
+				    String mcListName,
+				    String inputHitMapName)
     {
 	// Fragment handling
 	String clusterList = prefix+"clustersAfterFragmentHandling";
 	String hitMap = prefix+"hitsLeftOverAfterFragmentHandling";
-	addFragmentHandling(prefix+"FragmentHandling__", fragID, fragMerge, haloMinusPhotonClusterList, smallClusterMinusPhotonClusterList, clusterList, hitMap);
+	addFragmentHandling(prefix+"FragmentHandling__", fragID, fragMerge, haloMinusPhotonClusterList, smallClusterMinusPhotonClusterList, clusterList, hitMap, inputHitMapName);
 
 	// Repeat the hadron ID step with the revised cluster list after fragment handling
 	String tempChargedParticleList = prefix+"chargedHadronParticlesAfterFragmentHandling";
@@ -959,4 +985,27 @@
 	String[] mergeThese = { tempChargedParticleList, tempNeutralParticleList, largePhotonParticleList, smallPhotonParticleList } ;
 	addMerger(mergeThese, outputList);
     }
+
+    // This belongs somewhere central
+    private class ImprovisedTrackCheater extends Driver {
+	String m_inputMCListName;
+	String m_outputTrackListName;
+	public ImprovisedTrackCheater(String inputMCList, String outputTrackList) {
+	    m_inputMCListName = inputMCList;
+	    m_outputTrackListName = outputTrackList;
+	}
+	protected void process(EventHeader event) {
+	    List<MCParticle> mcList = event.get(MCParticle.class, m_inputMCListName);
+	    List<Track> trackList = new Vector<Track>();
+	    for (MCParticle part : mcList) {
+		if (part.getCharge() != 0) {
+		    BaseTrackMC track = new BaseTrackMC(part);
+		    trackList.add(track);
+		}
+	    }
+	    event.put(m_outputTrackListName, trackList);
+	}
+    }
 }
+
+
CVSspam 0.2.8