lcsim/src/org/lcsim/recon/ztracking/cheater
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); }
+}