Commit in lcsim/src/org/lcsim/contrib/uiowa on MAIN
MinimalRunPFA.java+17-31.4 -> 1.5
SetUpDTreeForReclustering.java+150-2231.9 -> 1.10
+167-226
2 modified files
MJC: (contrib) Partial refactoring of PFA

lcsim/src/org/lcsim/contrib/uiowa
MinimalRunPFA.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- MinimalRunPFA.java	15 Aug 2008 22:18:21 -0000	1.4
+++ MinimalRunPFA.java	13 Oct 2008 06:34:03 -0000	1.5
@@ -9,6 +9,7 @@
 import org.lcsim.recon.cluster.structural.likelihood.LikelihoodEvaluatorWrapper;
 import org.lcsim.recon.cluster.directedtree.*;
 import org.lcsim.util.hitmap.*;
+import org.lcsim.recon.pfa.identifier.*;
 import org.lcsim.recon.pfa.output.EnergySumPlotter;
 import org.lcsim.recon.cluster.util.*;
 import org.lcsim.event.util.*;
@@ -27,10 +28,24 @@
 	// Prepare to run PFA: Tracks (includes DigiSim)
 	add(new org.lcsim.contrib.Cassell.recon.Cheat.CheatReconDriver());
 	// Prepare to run PFA: Photon-finding and DirectedTree
-	add(new org.lcsim.contrib.uiowa.SetUpDTreeForReclustering());
+	List<String> recoHitLists = new Vector<String>(); // Hits to use in main clustering
+	List<String> allHitLists = new Vector<String>(); // All hits (used in muon-finding)
+	List<String> mstHitLists = new Vector<String>(); // Hits from subsystems where we have to use MST
+	recoHitLists.add("EcalBarrDigiHits");
+	recoHitLists.add("EcalEndcapDigiHits");
+	recoHitLists.add("HcalBarrDigiHits");
+	recoHitLists.add("HcalEndcapDigiHits");
+	recoHitLists.add("MuonEndcapDigiHits");
+	allHitLists.addAll(recoHitLists);
+	allHitLists.add("MuonBarrDigiHits");
+	mstHitLists.add("MuonEndcapDigiHits");
+	//HelixExtrapolator findCluster = new org.lcsim.recon.pfa.identifier.TrackHelixPlusHitExtrapolator();
+	HelixExtrapolator findCluster = new org.lcsim.recon.pfa.identifier.LocalHelixExtrapolator();
+	add(findCluster);
+	add(new org.lcsim.contrib.uiowa.SetUpDTreeForReclustering(allHitLists, recoHitLists, mstHitLists, findCluster));
 
 	// Set up and run PFA
-	ReclusterDTreeDriver reclusTree = new ReclusterDTreeDriver("DTreeClusters", "FSReconTracks", "ReconFSParticles");
+	ReclusterDTreeDriver reclusTree = new ReclusterDTreeDriver("DTreeClusters", "FSReconTracksWithoutMuons", "ReconFSParticles", "MuonTrackClusterMap", findCluster);
 	reclusTree.writeExtraEventOutput(writeExtraOutput);
 	add(reclusTree);
 
@@ -161,7 +176,6 @@
     int count = 0;
     public void process(EventHeader event) {
 	System.out.println("DEBUG: Looking at event "+count); count++;
-	//if (count != 326) { return; }
         boolean passesTruthAcceptanceCut = false;
         MCParticle partZTovv = null;
         MCParticle partZToqq = null;

lcsim/src/org/lcsim/contrib/uiowa
SetUpDTreeForReclustering.java 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- SetUpDTreeForReclustering.java	28 Sep 2008 06:18:16 -0000	1.9
+++ SetUpDTreeForReclustering.java	13 Oct 2008 06:34:03 -0000	1.10
@@ -8,242 +8,169 @@
 import org.lcsim.recon.cluster.directedtree.*;
 import org.lcsim.util.hitmap.*;
 import org.lcsim.util.decision.*;
+import org.lcsim.contrib.uiowa.MuonFinder.*;
+import org.lcsim.recon.pfa.identifier.*;
 
 public class SetUpDTreeForReclustering extends Driver
 {
-    boolean useOldRonPhotonFinder = false;
-    boolean useForwardEcal = false;
+    // Dummy -- fix these
+    public SetUpDTreeForReclustering() {}
 
-    public SetUpDTreeForReclustering() {
-	{
-	    // Convert DigiSim's lists to hitmaps:
-	    HitListToHitMapDriver converter1 = new HitListToHitMapDriver();
-	    HitListToHitMapDriver converter2 = new HitListToHitMapDriver();
-	    HitListToHitMapDriver converter3 = new HitListToHitMapDriver();
-	    HitListToHitMapDriver converter4 = new HitListToHitMapDriver();
-	    converter1.addInputList("EcalBarrDigiHits");
-	    converter2.addInputList("EcalEndcapDigiHits");
-	    converter3.addInputList("HcalBarrDigiHits");
-	    converter4.addInputList("HcalEndcapDigiHits");
-	    converter1.setOutput("EcalBarrDigiHitMap");
-	    converter2.setOutput("EcalEndcapDigiHitMap");
-	    converter3.setOutput("HcalBarrDigiHitMap");
-	    converter4.setOutput("HcalEndcapDigiHitMap");
-	    add(converter1);
-	    add(converter2);
-	    add(converter3);
-	    add(converter4);
-	    // Convert muon lists to hitmaps:
-	    HitListToHitMapDriver converter5 = new HitListToHitMapDriver();
-	    HitListToHitMapDriver converter6 = new HitListToHitMapDriver();
-	    converter5.addInputList("MuonBarrDigiHits");
-	    converter6.addInputList("MuonEndcapDigiHits");
-	    converter5.setOutput("MuonBarrDigiHitMap");
-	    converter6.setOutput("MuonEndcapDigiHitMap");
-	    add(converter5);
-	    add(converter6);
-	    if (useForwardEcal) {
-		// Convert forward EM endcap hits:
-		HitListToHitMapDriver converter7 = new HitListToHitMapDriver();
-		converter7.addInputList("ForwardEcalEndcapDigiHits");
-		converter7.setOutput("ForwardEcalEndcapDigiHitMap");
-		add(converter7);
-	    }
-	}
-
-        // Find muons
-        {
-            HitMapAddDriver combineCal = new HitMapAddDriver();
-            HitMapAddDriver combineMuDet = new HitMapAddDriver();
-            combineCal.addInputHitMap("EcalBarrDigiHitMap");
-            combineCal.addInputHitMap("HcalBarrDigiHitMap");
-            combineCal.addInputHitMap("EcalEndcapDigiHitMap");
-            combineCal.addInputHitMap("HcalEndcapDigiHitMap");
-            combineMuDet.addInputHitMap("MuonBarrDigiHitMap");
-            combineMuDet.addInputHitMap("MuonEndcapDigiHitMap");
-            combineCal.setOutputHitMap("CalDigiHitMap");
-            combineMuDet.setOutputHitMap("MuDetDigiHitMap");
-            add(combineCal);
-            add(combineMuDet);
- 
-            org.lcsim.contrib.uiowa.MuonFinder.MuonFinder muonFinder =new org.lcsim.contrib.uiowa.MuonFinder.MuonFinder("FSReconTracks","CalDigiHitMap", "MuDetDigiHitMap", "MuonClustersDigiHitMap", "MuonClusters");
-            add(muonFinder);
-             
-            HitMapSubtractDriver separateEcal1 = new HitMapSubtractDriver("EcalBarrDigiHitMap", "MuonClustersDigiHitMap", "EcalBarrDigiHitMap");
-            HitMapSubtractDriver separateEcal2 = new HitMapSubtractDriver("EcalEndcapDigiHitMap", "MuonClustersDigiHitMap", "EcalEndcapDigiHitMap");
-            HitMapSubtractDriver separateEcal3 = new HitMapSubtractDriver("HcalBarrDigiHitMap", "MuonClustersDigiHitMap", "HcalBarrDigiHitMap");
-            HitMapSubtractDriver separateEcal4 = new HitMapSubtractDriver("HcalEndcapDigiHitMap", "MuonClustersDigiHitMap", "HcalEndcapDigiHitMap");
-            HitMapSubtractDriver separateEcal5 = new HitMapSubtractDriver("MuonBarrDigiHitMap", "MuonClustersDigiHitMap", "MuonBarrDigiHitMap");
-            HitMapSubtractDriver separateEcal6 = new HitMapSubtractDriver("MuonEndcapDigiHitMap", "MuonClustersDigiHitMap", "MuonEndcapDigiHitMap");
-
-            add(separateEcal1); 
-            add(separateEcal2); 
-            add(separateEcal3); 
-            add(separateEcal4); 
-            add(separateEcal5);  
-            add(separateEcal6);
-        }     
-
-        // Merge barrel & endcap hits
-        {
-            HitMapAddDriver combineEcal = new HitMapAddDriver();
-            HitMapAddDriver combineHcal = new HitMapAddDriver();
-            combineEcal.addInputHitMap("EcalBarrDigiHitMap");
-            combineHcal.addInputHitMap("HcalBarrDigiHitMap");
-            combineEcal.addInputHitMap("EcalEndcapDigiHitMap");
-            combineHcal.addInputHitMap("HcalEndcapDigiHitMap");
-            if (useForwardEcal) {
-                combineEcal.addInputHitMap("ForwardEcalEndcapDigiHitMap"); // Include forward endcap
-            }
-            combineEcal.setOutputHitMap("EcalDigiHitMap");
-            combineHcal.setOutputHitMap("HcalDigiHitMap");
-            add(combineEcal);
-            add(combineHcal);
-        }
+    public SetUpDTreeForReclustering(Collection<String> allHitLists, Collection<String> recoHitLists, Collection<String> hitsForMST, HelixExtrapolator findCluster) {
+	// Convert DigiSim's lists to hitmaps:
+	Map<String,String> mapListToHitMap = new HashMap<String,String>();
+	for (String inputName : allHitLists) {
+	    String outputName = (new String(inputName)).replace("DigiHits", "DigiHitMap");
+	    mapListToHitMap.put(inputName, outputName);
+	    HitListToHitMapDriver converter = new HitListToHitMapDriver();
+	    converter.addInputList(inputName);
+	    converter.setOutput(outputName);
+	    add(converter);
+	}
+	// Convenience: Merge ECAL barrel & ECAL endcap
+	HitMapAddDriver combineEcal = new HitMapAddDriver();
+	combineEcal.addInputHitMap("EcalBarrDigiHitMap");
+	combineEcal.addInputHitMap("EcalEndcapDigiHitMap");
+	combineEcal.setOutputHitMap("EcalDigiHitMap");
+	add(combineEcal);
+	// Convenience: Merge HCAL barrel & HCAL endcap
+	HitMapAddDriver combineHcal = new HitMapAddDriver();
+	combineHcal.addInputHitMap("HcalBarrDigiHitMap");
+	combineHcal.addInputHitMap("HcalEndcapDigiHitMap");
+	combineHcal.setOutputHitMap("HcalDigiHitMap");
+	add(combineHcal);
+	// Make combined hitmap of all hits (for muon searches)
+	HitMapAddDriver combineAll = new HitMapAddDriver();
+	for (String inputName : allHitLists) {
+	    combineAll.addInputHitMap(mapListToHitMap.get(inputName));
+	    combineAll.setOutputHitMap("AllDigiHitMap");
+	}
+	add(combineAll);
+	// Make combined hitmap of all reconstructable hits
+	HitMapAddDriver combineReco = new HitMapAddDriver();
+	for (String inputName : recoHitLists) {
+	    combineReco.addInputHitMap(mapListToHitMap.get(inputName));
+	    combineReco.setOutputHitMap("RecoDigiHitMap");
+	}
+	add(combineReco);
+
+	// Find muons
+	MuonFinderWrapper muonFinder = new MuonFinderWrapper("FSReconTracks", "AllDigiHitMap", "MuonTrackClusterMap", "AllDigiHitMapWithoutMuons", "FSReconTracksWithoutMuons");
+	muonFinder.skip(); // TEST
+	add(muonFinder);
+	add(new HitMapSubtractDriver("RecoDigiHitMap", "AllDigiHitMapWithoutMuons", "RecoDigiHitMapMuons")); // Identify the muon hits within useable hit block
+	add(new HitMapSubtractDriver("RecoDigiHitMap", "RecoDigiHitMapMuons", "RecoDigiHitMapWithoutMuons")); // Non-muon hits within useable hit block
+
+	// TJ's pre-shower MIP-finder
+	ShowerPointFinderDriver showerFinder = new ShowerPointFinderDriver(findCluster, "RecoDigiHitMapWithoutMuons", "FSReconTracksWithoutMuons", "ShowerFinderMapTrackToMip", "RecoDigiHitMapWithoutMuonsOrMips", "ShowerFinderMips");
+	add(showerFinder);
+	add(new CheckDisjoint("RecoDigiHitMapWithoutMuonsOrMips", "ShowerFinderMips"));
+	// Steve's pre-shower MIP-finder
+	add(new SteveMipWrapper());
 
 	// Find photons in ECAL
-	if (useOldRonPhotonFinder) {
-	    // Make photons in barrel & endcap separately
-	    org.lcsim.contrib.uiowa.RonPhotonFinder.RonPhotonFinderSid01 photonFinderEcalBarrel = new org.lcsim.contrib.uiowa.RonPhotonFinder.RonPhotonFinderSid01("EcalBarrDigiHitMap", "EcalBarrDigiHitMapWithoutPhotons", "EcalBarrPhotonClusters");
-	    org.lcsim.contrib.uiowa.RonPhotonFinder.RonPhotonFinderSid01 photonFinderEcalEndcap = new org.lcsim.contrib.uiowa.RonPhotonFinder.RonPhotonFinderSid01("EcalEndcapDigiHitMap", "EcalEndcapDigiHitMapWithoutPhotons", "EcalEndcapPhotonClusters");
-	    add(photonFinderEcalBarrel);
-	    add(photonFinderEcalEndcap);
-	    add(new TransientFlagDriver("EcalBarrPhotonClusters"));
-	    add(new TransientFlagDriver("EcalEndcapPhotonClusters"));
-	    // Merge to a single list of photons
-	    ListAddDriver<Cluster> mergePhotonClusters = new ListAddDriver<Cluster>(Cluster.class);
-	    mergePhotonClusters.addInputList("EcalBarrPhotonClusters");
-	    mergePhotonClusters.addInputList("EcalEndcapPhotonClusters");
-	    mergePhotonClusters.setOutputList("PhotonClustersForDTree");
-	    add(mergePhotonClusters);
-	    add(new TransientFlagDriver("PhotonClustersForDTree"));
-	} else {
-	    // Make photons in barrel & endcap together
-	    org.lcsim.contrib.Cassell.recon.DTPhotons.RonDTPhotonFinderSid01 photonFinder = new org.lcsim.contrib.Cassell.recon.DTPhotons.RonDTPhotonFinderSid01("EcalDigiHitMap", "EcalDigiHitMapWithoutPhotons", "PhotonClustersForDTree");
+	{
+	    // We have to use ALL hits for the photon-finder -- this is because it uses the
+            // presence of hits in early layers to veto on charged particles.
+	    org.lcsim.contrib.Cassell.recon.DTPhotons.RonDTPhotonFinderSid01 photonFinder = new org.lcsim.contrib.Cassell.recon.DTPhotons.RonDTPhotonFinderSid01("EcalDigiHitMap", "EcalDigiHitMapMinusPreliminaryPhotons", "PreliminaryPhotonClustersForDTree");
 	    add(photonFinder);
+	    add(new TransientFlagDriver("PreliminaryPhotonClustersForDTree"));
+
+	    // Now go back and ensure that no photon uses hits from a charged particle's MIP.
+	    // We can either remove those individual hits or veto entire clusters.
+	    boolean remove = false;
+	    boolean findVetoedPhotons = true;
+	    if (remove) {
+		add(new RemoveHitsFromClusters("PreliminaryPhotonClustersForDTree", "MuonTrackClusterMap", "PhotonsMinusMuonHits"));
+		add(new RemoveHitsFromClusters("PhotonsMinusMuonHits", "ShowerFinderMapTrackToMip", "PhotonClustersForDTree"));
+	    } else {
+		add(new VetoHitsFromClusters("PreliminaryPhotonClustersForDTree", "MuonTrackClusterMap", "PhotonsMinusMuonHits"));
+		add(new VetoHitsFromClusters("PhotonsMinusMuonHits", "ShowerFinderMapTrackToMip", "PhotonClustersForDTree"));
+		if (findVetoedPhotons) {
+		    // Test: pick out vetoed clusters
+		    add(new ListSubtractDriver("PreliminaryPhotonClustersForDTree", "PhotonClustersForDTree", "VetoedPhotonClusters"));
+		    add(new CheckDisjoint("PhotonClustersForDTree", "VetoedPhotonClusters"));
+		    add(new RemoveHitsFromClusters("VetoedPhotonClusters", "MuonTrackClusterMap", "VetoedPhotonClustersMinusMuonHits"));
+		    add(new RemoveHitsFromClusters("VetoedPhotonClustersMinusMuonHits", "ShowerFinderMapTrackToMip", "VetoedPhotonClustersMinusMuonHitsAndMipHits"));
+		    add(new ClusterListToHitMapDriver("VetoedPhotonClustersMinusMuonHitsAndMipHits", "PhotonVetoHitMap"));
+		}
+	    }
+	    add(new TransientFlagDriver("PhotonsMinusMuonHits"));
 	    add(new TransientFlagDriver("PhotonClustersForDTree"));
-	    // Split back into barrel & endcap
-	    // This is a little fiddly -- need to do one subtraction to 
-	    // identify the photon hits, then a second to remove the photon
-	    // hits from the previous hitmaps.
-	    HitMapSubtractDriver separateEcal1 = new HitMapSubtractDriver("EcalBarrDigiHitMap", "EcalDigiHitMapWithoutPhotons", "EcalBarrel_photonHits");
-	    HitMapSubtractDriver separateEcal2 = new HitMapSubtractDriver("EcalEndcapDigiHitMap", "EcalDigiHitMapWithoutPhotons", "EcalEndcap_photonHits");
-	    HitMapSubtractDriver separateEcal3 = new HitMapSubtractDriver("EcalBarrDigiHitMap", "EcalBarrel_photonHits", "EcalBarrDigiHitMapWithoutPhotons");
-	    HitMapSubtractDriver separateEcal4 = new HitMapSubtractDriver("EcalEndcapDigiHitMap", "EcalEndcap_photonHits", "EcalEndcapDigiHitMapWithoutPhotons");
-	    add(separateEcal1);
-	    add(separateEcal2);
-	    add(separateEcal3);
-	    add(separateEcal4);
-	    if (useForwardEcal) {
-		HitMapSubtractDriver separateEcal5 = new HitMapSubtractDriver("ForwardEcalEndcapDigiHitMap", "EcalDigiHitMapWithoutPhotons", "ForwardEcalEndcap_photonHits");
-		HitMapSubtractDriver separateEcal6 = new HitMapSubtractDriver("ForwardEcalEndcapDigiHitMap", "ForwardEcalEndcap_photonHits", "ForwardEcalEndcapDigiHitMapWithoutPhotons");
-		add(separateEcal5);
-		add(separateEcal6);
+
+	    // Identify which hits were used for photons
+	    add(new ClusterListToHitMapDriver("PhotonClustersForDTree", "PhotonHitMap"));
+	    add(new CheckDisjoint("ShowerFinderMips", "PhotonHitMap"));
+
+	    // Identify remaining hits not used for photons or muons or mips
+	    if (!remove && findVetoedPhotons) {
+		add(new HitMapSubtractDriver("RecoDigiHitMapWithoutMuonsOrMips", "PhotonHitMap", "TmpRecoDigiHitMapWithoutMuonsOrMipsOrPhotons"));
+		add(new HitMapSubtractDriver("TmpRecoDigiHitMapWithoutMuonsOrMipsOrPhotons", "PhotonVetoHitMap", "RecoDigiHitMapWithoutMuonsOrMipsOrPhotons"));
+	    } else {
+		add(new HitMapSubtractDriver("RecoDigiHitMapWithoutMuonsOrMips", "PhotonHitMap", "RecoDigiHitMapWithoutMuonsOrMipsOrPhotons")); // Remove Muon/MIP hits
+		//add(new HitMapSubtractDriver("RecoDigiHitMap", "PhotonHitMap", "RecoDigiHitMapWithoutMuonsOrMipsOrPhotons")); // Keep all non-photon hits
 	    }
+	    add(new CheckDisjoint("RecoDigiHitMapWithoutMuonsOrMipsOrPhotons", "PhotonHitMap"));
 	}
 
-	// Run DTree
-	{
-	    DirectedTreeDriver treeDriverEcalBarr = new DirectedTreeDriver();
-	    treeDriverEcalBarr.setInputHitMap("EcalBarrDigiHitMapWithoutPhotons");
-	    treeDriverEcalBarr.setOutputClusterList("EcalBarrDTrees");
-	    treeDriverEcalBarr.setOutputHitMap("EcalBarrDigiHitMapAfterDTree");
-	    DirectedTreeDriver treeDriverEcalEndcap = new DirectedTreeDriver();
-	    treeDriverEcalEndcap.setInputHitMap("EcalEndcapDigiHitMapWithoutPhotons");
-	    treeDriverEcalEndcap.setOutputClusterList("EcalEndcapDTrees");
-	    treeDriverEcalEndcap.setOutputHitMap("EcalEndcapDigiHitMapAfterDTree");
-	    DirectedTreeDriver treeDriverHcalBarr = new DirectedTreeDriver();
-	    treeDriverHcalBarr.setInputHitMap("HcalBarrDigiHitMap");
-	    treeDriverHcalBarr.setOutputClusterList("HcalBarrDTrees");
-	    treeDriverHcalBarr.setOutputHitMap("HcalBarrDigiHitMapAfterDTree");
-	    DirectedTreeDriver treeDriverHcalEndcap = new DirectedTreeDriver();
-	    treeDriverHcalEndcap.setInputHitMap("HcalEndcapDigiHitMap");
-	    treeDriverHcalEndcap.setOutputClusterList("HcalEndcapDTrees");
-	    treeDriverHcalEndcap.setOutputHitMap("HcalEndcapDigiHitMapAfterDTree");
-	    add(treeDriverEcalBarr);
-	    add(treeDriverEcalEndcap);
-	    add(treeDriverHcalBarr);
-	    add(treeDriverHcalEndcap);
-	    add(new TransientFlagDriver("EcalBarrDTrees"));
-	    add(new TransientFlagDriver("EcalEndcapDTrees"));
-	    add(new TransientFlagDriver("HcalBarrDTrees"));
-	    add(new TransientFlagDriver("HcalEndcapDTrees"));
+	// Run DTree on each subdetector separately:
+	Map<String,String> mapInputListToDTreeClusterList = new HashMap<String,String>();
+	for (String rawInputName : recoHitLists) {
+	    String rawInputHitMapName = mapListToHitMap.get(rawInputName);
+	    String filteredInputHitMapName = (new String(rawInputName)).replace("DigiHits", "DigiHitMapForDTree");
+	    String outputHitMapName = new String(rawInputHitMapName+"AfterDTree");
+	    String outputClusterListName = new String(rawInputHitMapName+"Clusters");
+	    mapInputListToDTreeClusterList.put(rawInputName, outputClusterListName);
+	    // Filter hitmap to only contain hits from this subdet that are not muon/mip/photon hits
+	    add(new HitMapAndDriver(rawInputHitMapName, "RecoDigiHitMapWithoutMuonsOrMipsOrPhotons", filteredInputHitMapName));
+	    if (hitsForMST.contains(rawInputName)) {
+		// Run MST
+		org.lcsim.recon.cluster.mst.MSTClusterDriver mstDriver = new org.lcsim.recon.cluster.mst.MSTClusterDriver(outputHitMapName, outputClusterListName);
+		mstDriver.addInputHitMap(filteredInputHitMapName);
+		mstDriver.setThreshold(1500.0); // FIXME: This is not optimal
+		mstDriver.registerMetrics(new org.lcsim.recon.cluster.mst.MinimumHitToHitDistance());
+		add(mstDriver);
+	    } else {
+		// Run DTree
+		DirectedTreeDriver treeDriver = new DirectedTreeDriver();
+		treeDriver.setInputHitMap(filteredInputHitMapName);
+		treeDriver.setOutputClusterList(outputClusterListName);
+		treeDriver.setOutputHitMap(outputHitMapName);
+		add(treeDriver);
+	    }
+	    add(new TransientFlagDriver(outputClusterListName));
 	}
-
-	// Run DTree on MUCAL -- this is currently rather tricky.
-	{
-	    org.lcsim.recon.cluster.mst.MSTClusterDriver mstMcalBarrel = new org.lcsim.recon.cluster.mst.MSTClusterDriver("MuonBarrDigiHitMapAfterDTree", "MuonBarrDTrees");
-	    org.lcsim.recon.cluster.mst.MSTClusterDriver mstMcalEndcap = new org.lcsim.recon.cluster.mst.MSTClusterDriver("MuonEndcapDigiHitMapAfterDTree", "MuonEndcapDTrees");
-	    mstMcalBarrel.addInputHitMap("MuonBarrDigiHitMap");
-	    mstMcalEndcap.addInputHitMap("MuonEndcapDigiHitMap");
-	    mstMcalBarrel.setThreshold(1500.0); // 3x3cm segmentation transversely, 6.5cm longitudinally
-	    mstMcalEndcap.setThreshold(1500.0); // 3x3cm segmentation transversely, 6.5cm longitudinally
-	    mstMcalBarrel.registerMetrics(new org.lcsim.recon.cluster.mst.MinimumHitToHitDistance());
-	    mstMcalEndcap.registerMetrics(new org.lcsim.recon.cluster.mst.MinimumHitToHitDistance());
-	    add(mstMcalBarrel);
-	    add(mstMcalEndcap);
-	    add(new TransientFlagDriver("MuonBarrDTrees"));
-	    add(new TransientFlagDriver("MuonEndcapDTrees"));
-	}
-
-	// Run DTree on FCAL -- this is currently rather tricky.
-	if (useForwardEcal) {
-	    org.lcsim.recon.cluster.mst.MSTClusterDriver mstFcalEndcap = new org.lcsim.recon.cluster.mst.MSTClusterDriver("ForwardEcalEndcapDigiHitMapAfterDTree", "ForwardEcalEndcapDTrees");
-	    mstFcalEndcap.addInputHitMap("ForwardEcalEndcapDigiHitMap");
-	    mstFcalEndcap.setThreshold(12.5); // 3.5x3.5cm segmentation transversely, 3.7mm longitudinally
-	    mstFcalEndcap.registerMetrics(new org.lcsim.recon.cluster.mst.MinimumHitToHitDistance());
-	    add(mstFcalEndcap);
-	    add(new TransientFlagDriver("ForwardEcalEndcapDTrees"));
+	
+	// Merge/categorize & write out
+	ListAddDriver<Cluster> mergeDTreeClustersECAL = new ListAddDriver<Cluster>(Cluster.class);
+	ListAddDriver<Cluster> mergeDTreeClustersHCAL = new ListAddDriver<Cluster>(Cluster.class);
+	ListAddDriver<Cluster> mergeDTreeClustersMCAL = new ListAddDriver<Cluster>(Cluster.class);
+	ListAddDriver<Cluster> mergeDTreeClustersAll  = new ListAddDriver<Cluster>(Cluster.class);
+	for (String inputName : recoHitLists) {
+	    String clusterListName = mapInputListToDTreeClusterList.get(inputName);
+	    mergeDTreeClustersAll.addInputList(clusterListName);
+	    if (inputName.contains("Ecal")) {
+		mergeDTreeClustersECAL.addInputList(clusterListName);
+	    }
+	    if (inputName.contains("Hcal")) {
+		mergeDTreeClustersHCAL.addInputList(clusterListName);
+	    }
+	    if (inputName.contains("MuonEndcap") || inputName.contains("MuonBarr")) {
+		mergeDTreeClustersMCAL.addInputList(clusterListName);
+	    }
 	}
+	mergeDTreeClustersECAL.setOutputList("DTreeClustersECAL");
+	mergeDTreeClustersHCAL.setOutputList("DTreeClustersHCAL");
+	mergeDTreeClustersMCAL.setOutputList("DTreeClustersMCAL");
+	mergeDTreeClustersAll .setOutputList("DTreeClusters");
+	add(mergeDTreeClustersECAL);
+	add(mergeDTreeClustersHCAL);
+	add(mergeDTreeClustersMCAL);
+	add(mergeDTreeClustersAll);
+	add(new TransientFlagDriver("DTreeClustersECAL"));
+	add(new TransientFlagDriver("DTreeClustersHCAL"));
+	add(new TransientFlagDriver("DTreeClustersMCAL"));
+	add(new TransientFlagDriver("DTreeClusters"));
 
-	// Merge & write out
-	{
-	    ListAddDriver<Cluster> mergeDTreeClustersECAL = new ListAddDriver<Cluster>(Cluster.class);
-	    mergeDTreeClustersECAL.addInputList("EcalBarrDTrees");
-	    mergeDTreeClustersECAL.addInputList("EcalEndcapDTrees");
-	    mergeDTreeClustersECAL.setOutputList("DTreeClustersECAL");
-	    add(mergeDTreeClustersECAL);
-	    add(new TransientFlagDriver("DTreeClustersECAL"));
-
-	    ListAddDriver<Cluster> mergeDTreeClustersHCAL = new ListAddDriver<Cluster>(Cluster.class);
-	    mergeDTreeClustersHCAL.addInputList("HcalBarrDTrees");
-	    mergeDTreeClustersHCAL.addInputList("HcalEndcapDTrees");
-	    mergeDTreeClustersHCAL.setOutputList("DTreeClustersHCAL");
-	    add(mergeDTreeClustersHCAL);
-	    add(new TransientFlagDriver("DTreeClustersHCAL"));
-
-	    ListAddDriver<Cluster> mergeDTreeClustersMCAL = new ListAddDriver<Cluster>(Cluster.class);
-	    //mergeDTreeClustersMCAL.addInputList("MuonBarrDTrees");
-	    mergeDTreeClustersMCAL.addInputList("MuonEndcapDTrees");
-	    mergeDTreeClustersMCAL.setOutputList("DTreeClustersMCAL");
-	    add(mergeDTreeClustersMCAL);
-	    add(new TransientFlagDriver("DTreeClustersMCAL"));
-
-            ListAddDriver<Cluster> DTreeClustersMCALmuonID = new ListAddDriver<Cluster>(Cluster.class);
-            DTreeClustersMCALmuonID.addInputList("MuonBarrDTrees");
-            DTreeClustersMCALmuonID.addInputList("MuonEndcapDTrees");
-            DTreeClustersMCALmuonID.setOutputList("DTreeClustersMCALforMuonID");
-            add(DTreeClustersMCALmuonID);
-            add(new TransientFlagDriver("DTreeClustersMCALforMuonID"));
-
-	    if (useForwardEcal) {
-		ListAddDriver<Cluster> mergeDTreeClustersFCAL = new ListAddDriver<Cluster>(Cluster.class);
-		mergeDTreeClustersFCAL.addInputList("ForwardEcalEndcapDTrees");
-		mergeDTreeClustersFCAL.setOutputList("DTreeClustersFCAL");
-		add(mergeDTreeClustersFCAL);
-		add(new TransientFlagDriver("DTreeClustersFCAL"));
-	    }
-
-	    ListAddDriver<Cluster> mergeDTreeClusters = new ListAddDriver<Cluster>(Cluster.class);
-	    mergeDTreeClusters.addInputList("DTreeClustersECAL");
-	    mergeDTreeClusters.addInputList("DTreeClustersHCAL");
-	    mergeDTreeClusters.addInputList("DTreeClustersMCAL");
-	    if (useForwardEcal) {
-		mergeDTreeClusters.addInputList("DTreeClustersFCAL");
-	    }
-	    mergeDTreeClusters.setOutputList("DTreeClusters");
-	    add(mergeDTreeClusters);
-	    add(new TransientFlagDriver("DTreeClusters"));
-	}
     }
 }
CVSspam 0.2.8