Commit in lcsim/src/org/lcsim/recon/pfa/structural on MAIN
ReclusterDTreeDriver.java+36-71.18 -> 1.19
MJC: Make sure each output ReconstructedParticle corresponds to one real track, not to a logical track which contains multiple bundled subtracks

lcsim/src/org/lcsim/recon/pfa/structural
ReclusterDTreeDriver.java 1.18 -> 1.19
diff -u -r1.18 -r1.19
--- ReclusterDTreeDriver.java	22 Oct 2008 17:55:16 -0000	1.18
+++ ReclusterDTreeDriver.java	24 Oct 2008 23:05:57 -0000	1.19
@@ -35,7 +35,7 @@
   * in this package, which uses the implementation in
   * org.lcsim.recon.cluster.directedtree developed by NIU).
   *
-  * @version $Id: ReclusterDTreeDriver.java,v 1.18 2008/10/22 17:55:16 mcharles Exp $
+  * @version $Id: ReclusterDTreeDriver.java,v 1.19 2008/10/24 23:05:57 mcharles Exp $
   * @author Mat Charles <[log in to unmask]>
   */
 
@@ -1483,13 +1483,32 @@
 	    Set<Cluster> clusters = newMapTrackToShowerComponents.get(tr);
 	    Cluster sharedHitClus = makeClusterOfSharedHits(clusters, allSharedClusters);
 	    if (sharedHitClus.getCalorimeterHits().size()>0) { clusters.add(sharedHitClus); }
-	    ReconstructedParticle part = null;
-	    if (tr.getCharge() > 0) {
-		part = makeSingleChargedParticle(tr, clusters, pdg_piplus);
+	    // Remember to handle case where >1 physical track is bundled into one logical track:
+	    Set<Track> finalStateTracks = new HashSet<Track>();
+	    if (tr instanceof MultipleTrackTrack) {
+		finalStateTracks.addAll(tr.getTracks());
 	    } else {
-		part = makeSingleChargedParticle(tr, clusters, pdg_piminus);
+		finalStateTracks.add(tr);
+	    }
+	    // Loop over final-state track(s) and make particles.
+	    // Only the first one gets clusters (to avoid double-counting).
+	    boolean firstTrack = true;
+	    for (Track subTr : finalStateTracks) {
+		// Assign clusters to first track.
+		Set<Cluster> clustersForThisTrack = new HashSet<Cluster>();
+		if (firstTrack) {
+		    clustersForThisTrack.addAll(clusters);
+		    firstTrack = false;
+		}
+		// Make particle (assume pion)
+		ReconstructedParticle part = null;
+		if (subTr.getCharge() > 0) {
+		    part = makeSingleChargedParticle(subTr, clustersForThisTrack, pdg_piplus);
+		} else {
+		    part = makeSingleChargedParticle(subTr, clustersForThisTrack, pdg_piminus);
+		}
+		outputParticleList.add(part);
 	    }
-	    outputParticleList.add(part);
 	}
 	return outputParticleList;
     }
@@ -1499,8 +1518,18 @@
 	int pdg_piminus = -211;
 	List<ReconstructedParticle> outputParticleList = new Vector<ReconstructedParticle>();
 	for (Set<Track> jet : newMapJetToShowerComponents.keySet()) {
-	    boolean firstTrackInJet = true;
+	    // Remember to handle case where >1 physical track is bundled into one logical track:
+	    Set<Track> finalStateTracks = new HashSet<Track>();
 	    for (Track tr : jet) {
+		if (tr instanceof MultipleTrackTrack) {
+		    finalStateTracks.addAll(tr.getTracks());
+		} else {
+		    finalStateTracks.add(tr);
+		}
+	    }
+	    // Loop over final-state tracks and make particles:
+	    boolean firstTrackInJet = true;
+	    for (Track tr : finalStateTracks) {
 		Set<Cluster> clusters = null;
 		if (firstTrackInJet) {
 		    // Assign all clusters to first track in jet
CVSspam 0.2.8