Commit in lcsim/src/org/lcsim/recon/ztracking/cheater on MAIN
TrackingCheater.java+226added 1.1
Initial

lcsim/src/org/lcsim/recon/ztracking/cheater
TrackingCheater.java added at 1.1
diff -N TrackingCheater.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TrackingCheater.java	2 Aug 2005 23:52:17 -0000	1.1
@@ -0,0 +1,226 @@
+/* TrackingCheater.java
+
+ Created by  Mike Ronan  Jul '00   
+ Modified by Mike Ronan  Jun '05  For org.lcsim package.
+
+*/
+
+package org.lcsim.recon.ztracking.cheater;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.recon.ztracking.FoundTrack;
+
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+import org.lcsim.util.loop.LCSimLoop;
+
+import hep.lcio.event.*;
+import hep.lcio.implementation.io.LCFactory;
+import hep.lcio.io.*;
+
+import java.io.File;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * The Tracking cheater works by finding perfectly reconstructed tracks 
+ * using the MC truth information associated with each hit.
+ * 
+ */
+public class TrackingCheater extends Driver
+// public class TrackingCheater extends AbstractTracker
+{
+    //static int MAXPoints=25000;
+
+    int NTracks = 0, NCombinedTracks = 0;
+
+
+    /** */
+    public TrackingCheater()
+    {
+	String text = ClassName+"  version 0.7";
+	System.out.println(text);
+
+	df.setMaximumFractionDigits(2);
+    }
+
+    public void process(EventHeader event)
+    {
+	nEvt++;
+	if (firstEvents) System.out.println(" Event #"+nEvt);
+	NTracks = NCombinedTracks = 0;
+
+	//if (first) System.out.println(ClassName+"\n"+" Find Tracker tracks");
+	if (first) System.out.println("  Find charged tracks");
+
+	//if (Hist) HistogramFolder.setDefaultFolder("/Tracking/Cheater");
+	boolean hist = true;
+
+	// Find tracks in each detector system.
+	List<List<SimTrackerHit>> collections = event.get(SimTrackerHit.class);
+	for (List<SimTrackerHit> collection : collections)
+	{
+	    String name = event.getMetaData(collection).getName();
+	    if (name.equals("TkrEndcapHits")||name.equals("VtxEndcapHits")) continue;
+	    if (first) System.out.println("   Find "+name+" tracks");
+	    Map<MCParticle,CheatTrack> result = findTracks(collection);
+	    if (result.size() > 0) event.put(name+"Tracks",new ArrayList(result.values()));
+	}
+
+	// Find combined tracks.
+	List<List<CheatTrack>> trackLists = event.get(CheatTrack.class);
+	if (first) System.out.println("   Find combined tracks.");
+	Map<MCParticle, CombinedTrack> combined = findCombinedTracks(trackLists);
+	if (combined.size() > 0) event.put("CombinedTracks",new ArrayList(combined.values()));
+
+	if (hist) {
+	    AIDA aida = AIDA.defaultInstance();
+	    aida.cloud1D("NTracks").fill(NTracks);
+	    aida.cloud1D("NCombined").fill(NCombinedTracks);
+
+	    List<List<FoundTrack>> foundTrackLists = event.get(FoundTrack.class);
+	    for (List<FoundTrack> tracks : foundTrackLists ) {
+		String name = event.getMetaData(tracks).getName();
+		if (name.equals("TkrBarrHitsTracks")) {
+		    if (first) System.out.println("   Plot "+name+" points");
+		    int np = 0;
+		    for (FoundTrack track : tracks) {
+			MCParticle mcP = track.getMCParticle();
+			int nPoints = track.getNPoints(); np+=nPoints;
+			aida.cloud1D("NBarrelPoints").fill(nPoints);
+		    }
+		    if (first) System.out.println("    Plotted "+np+" points on "+tracks.size()+" tracks.");
+		}
+		else if (name.equals("CombinedTracks")) {
+		    if (first) System.out.println("   Plot "+name+" points");
+		    int np=0;
+		    for (FoundTrack track : tracks) {
+			MCParticle mcP = track.getMCParticle();
+			CombinedTrack trk = (CombinedTrack) track;
+			int nPoints = 0;
+			for (int n=0; n<trk.getNTracks(); n++) {
+			    nPoints += trk.getTrack(n).getNPoints(); np+=nPoints;
+			}
+			aida.cloud1D("NTotalPoints").fill(nPoints);
+		    }
+		    if (first) System.out.println("    Plotted "+np+" points on "+tracks.size()+" tracks.");
+		}
+	    }
+	}
+
+	if (first) { first = false; trace = false; }
+	// if (first) { trackList.printTracks(); first = false; trace = false; }
+	if (nEvt>=3) firstEvents = false;
+    }
+
+    private Map<MCParticle,CheatTrack> findTracks(List<SimTrackerHit> hits)
+    {
+	Map<MCParticle,CheatTrack> result = new HashMap<MCParticle,CheatTrack>();
+	for (SimTrackerHit hit : hits)
+        {
+	    String system = hit.getSystem();
+	    double x[] = hit.getPoint();
+	    //System.out.println("    hit position: x,y,z = "+df.format(x[0])+", "+df.format(x[1])+", "+df.format(x[2]));
+	    MCParticle mcP = hit.getMCParticle();
+	    //if (first) System.out.println("    MCParticle PDGID,charge = "+mcP.getPDGID()+", "+mcP.getCharge());
+	    CheatTrack ct = result.get(mcP);
+	    if (ct == null) { result.put(mcP,ct = new CheatTrack(mcP)); NTracks++; }
+	    ct.addHit(hit);
+	}
+	return result;
+    }
+
+    private Map<MCParticle, CombinedTrack> findCombinedTracks(List<List<CheatTrack>> collections)
+    {
+	Map<MCParticle,CombinedTrack> result = new HashMap<MCParticle,CombinedTrack>();
+	for (List<CheatTrack> tracks : collections)
+        {
+	    for (CheatTrack track : tracks) {
+		MCParticle mcP = track.getMCParticle();
+		CombinedTrack ct = result.get(mcP);
+		if (ct == null) { result.put(mcP,ct = new CombinedTrack(mcP)); NCombinedTracks++; }
+		ct.add(track);
+	    }
+	}
+	return result;
+    }
+
+    /** Get fraction of hits from parent MC particle. */
+    public double getMCPFraction(int itrk)
+    {
+	return 1.0;
+    }
+
+    public static void main(String[] args) throws Exception
+    {
+	String JobName = "TestTrackingCheater";
+	String text = "Running "+JobName+" in Batch mode.";
+	System.out.println(text); System.err.println(text);
+    /*
+	ILCFactory factory = LCFactory.getInstance();
+	LCReader reader = factory.createLCReader();
+	reader.open(args[0]);
+	reader.registerLCEventListener(analysis);
+	reader.readStream();
+	reader.close();
+	System.out.println("Analyzed "+analysis.nEvents+" events");
+	analysis.tree.commit();
+     */
+	// Create an analysis job.
+	LCSimLoop loop = new LCSimLoop();
+	TrackingCheater analysis = new TrackingCheater();
+	loop.add(analysis);
+
+	File file = new File(args[0]);
+	loop.setLCIORecordSource(file);
+	loop.loop(1);
+	loop.dispose();
+    }
+
+    String ClassName = "TrackingCheater::"; String text;
+    int nEvt = 0;
+    static boolean first = true, firstEvents = true;
+    static boolean trace = true;
+    static boolean warnNoMCParticle = true;
+
+    private DecimalFormat df = new DecimalFormat();
+}
+
+
+class CheatTrack extends FoundTrack
+{
+    static boolean warnUnknownMCParticle = true;
+
+    CheatTrack(MCParticle particle)
+    {
+	super(particle);
+     /*
+	if (particle.hashCode()<0) {
+	    if (warnUnknownMCParticle) {
+		System.err.println("TrackingCheater::CheatTrack: Unknown MCParticle  - hashCode = "+particle.hashCode());
+		warnUnknownMCParticle = false;
+	    }
+	}
+     */
+    }
+}
+
+class CombinedTrack extends FoundTrack
+{
+    List list = new ArrayList();
+
+    CombinedTrack(MCParticle particle)
+    {
+	super(particle);
+    }
+    void add(FoundTrack track) { list.add(track); }
+    int  getNTracks() { return list.size(); }
+    FoundTrack getTrack(int n) { return (FoundTrack) list.get(n); }
+}
CVSspam 0.2.8