lcsim/src/org/lcsim/contrib/SteveMagill
diff -u -r1.2 -r1.3
--- PFATemplate.java 20 Feb 2007 20:41:43 -0000 1.2
+++ PFATemplate.java 23 Apr 2007 18:05:01 -0000 1.3
@@ -1,42 +1,55 @@
-package org.lcsim.contrib.SteveMagill;
-
import java.util.*;
import org.lcsim.util.*;
+import org.lcsim.event.*;
+import org.lcsim.event.util.*;
import org.lcsim.util.hitmap.*;
-import org.lcsim.util.aida.AIDA;
+
import org.lcsim.recon.cluster.util.CalHitMapDriver;
import org.lcsim.digisim.DigiSimDriver;
import org.lcsim.digisim.SimCalorimeterHitsDriver;
+import org.lcsim.util.hitmap.HitListToHitMapDriver;
+import org.lcsim.util.hitmap.HitMapToHitListDriver;
+import org.lcsim.event.util.CreateFinalStateMCParticleList;
+import org.lcsim.recon.cluster.cheat.PerfectClusterer;
+import org.lcsim.recon.pfa.cheat.PerfectIdentifier;
+
+import org.lcsim.recon.cluster.cheat.CheatClusterDriver;
+import org.lcsim.recon.tracking.cheat.CheatTrackDriver;
+import org.lcsim.recon.particle.CheatParticleDriver;
+import org.lcsim.contrib.Cassell.recon.Cheat.PPRParticleDriver;
+
import org.lcsim.recon.cluster.fixedcone.*;
import org.lcsim.recon.cluster.nn.*;
+import org.lcsim.recon.cluster.directedtree.DirectedTreeDriver;
+
+import hep.physics.jet.*;
public class PFATemplate extends Driver
{
- private AIDA aida = AIDA.defaultInstance();
+// String FSname = "SimFinalStateParticles";
+// String Tname = "RefinedCheatTracks";
+// String Cname = "CombinedDigiCheatClusters";
+// String defRname = "CheatReconstructedParticles";
+ boolean FullPFA = true;
+
public PFATemplate()
{
-// INITIALIZE Analysis - use DIGISIM to get hits after timing, threshold, etc. cuts
+// use DIGISIM to get hits after timing, threshold, etc. cuts
// this implementation allows individual steering file to be used
add(new CalHitMapDriver());
DigiSimDriver digi = new DigiSimDriver();
// set steering file - CHANGE THIS TO YOUR DIRECTORY
- digi.setSteeringFile("C:\\Documents and Settings\\adminsrm\\.JAS3\\java\\WSc0005.steer");
+// digi.setSteeringFile("C:\\Documents and Settings\\adminsrm\\.JAS3\\java\\WSc0005.steer");
+// digi.setSteeringFile("C:\\Documents and Settings\\adminsrm\\.JAS3\\java\\WSc000225.steer");
+// digi.setSteeringFile("C:\\Documents and Settings\\adminsrm\\.JAS3\\java\\WSc001.steer");
+ digi.setSteeringFile("C:\\Documents and Settings\\adminsrm\\.JAS3\\java\\WRPCnothr.steer");
add(digi);
add(new SimCalorimeterHitsDriver());
// output of DigiSim is hit collections - EcalBarrDigiHits, EcalEndcapDigiHits, HcalBarrDigiHits, HcalEndcapDigiHits
-
-// MCFILTER here, PERFECT PFA here, etc.
- // add a MC Filter if wanted
-// add(new ZPoleMCFilter()); //my old ZPole filter, but needs changed to reflect changes in Perfect PFA
- // add Perfect PFA calculation here - make perfect charged clusters, neutral clusters and photon clusters
-// PerfectPFADriver ppfadriver = new PerfectPFADriver();
-// String[] ppcollnames = {"EcalBarrDigiHits","HcalBarrDigiHits","EcalEndcapDigiHits","HcalEndcapDigiHits"};
-// ppfadriver.setCollectionNames(ppcollnames);
-// add(ppfadriver);
-
-// To start PFA, make hitmaps - for now, separate by subdetector - uses DigiSim output collections
+
+// make subdetector hitmaps from DigiSim collections
HitListToHitMapDriver ebhitmap = new HitListToHitMapDriver();
ebhitmap.addInputList("EcalBarrDigiHits");
ebhitmap.setOutput("EMBarrhitmap");
@@ -53,19 +66,78 @@
hehitmap.addInputList("HcalEndcapDigiHits");
hehitmap.setOutput("HADEndcaphitmap");
add(hehitmap);
+
+// make a combined hitmap for the digisim output hits - now have 5 hitmaps, 1 for each cal subdetector and 1 with all hits
+ HitListToHitMapDriver digiHitMap = new HitListToHitMapDriver();
+ digiHitMap.addInputList("EcalBarrDigiHits");
+ digiHitMap.addInputList("EcalEndcapDigiHits");
+ digiHitMap.addInputList("HcalBarrDigiHits");
+ digiHitMap.addInputList("HcalEndcapDigiHits");
+ digiHitMap.setOutput("digi hitmap");
+ add(digiHitMap);
+
+ // Set up the MC list for perfect PFA
+// double rcut = 730.; // can have 3 hits in tracker (layer 3 is at 727 for ACME 0605)
+// double zcut = 730.; // can have 3 hits in tracker (layer 3 is at 727 for ACME 0605)
+ double rcut = 300.; // Bruce said 400 mm at meeting March 13
+ double zcut = 300.;
+ CreateFinalStateMCParticleList mcListMakerGen = new CreateFinalStateMCParticleList("Gen");
+ CreateFinalStateMCParticleList mcListMakerSim = new CreateFinalStateMCParticleList("Sim");
+ mcListMakerSim.setRadiusCut(rcut);
+ mcListMakerSim.setZCut(zcut);
+// mcListMakerSim.setKeepContinuousElectrons();
+// mcListMakerSim.setKeepContinuousHadrons();
+// mcListMakerSim.setKeepContinuousPhotons();
+ add(mcListMakerGen);
+ add(mcListMakerSim);
+ String mcListGen = "GenFinalStateParticles";
+ String mcListSim = "SimFinalStateParticles";
+ String mcList = mcListSim; // Can choose the Gen or Sim list here
+
+ String Tname = "RefinedCheatTracks";
+ add(new CheatTrackDriver());
+
+ String Cname = "PerfectCheatClusters";
+ String[] collections = {"EcalBarrDigiHits","EcalEndcapDigiHits","HcalBarrDigiHits","HcalEndcapDigiHits"};
+ add (new CheatClusterDriver(collections,Cname));
+
+ String CRPname = "CheatReconstructedParticles";
+ CheatParticleDriver cpd = new CheatParticleDriver(Cname,Tname,mcList);
+ // Inputs Cheated Tracks, Cheated Clusters, and MC particle list to create Cheated Particles
+ cpd.setOutputName(CRPname);
+ add(cpd);
+
+ // now make (more realistic) cheat tracks, etc with PPR driver
+ String outName = "PerfectRecoParticles";
+ int minT = 0;
+ int minC = 0;
+ PPRParticleDriver d = new PPRParticleDriver(CRPname, outName);
+ d.setMinTrackerHits(minT);
+ d.setMinCalorimeterHits(minC);
+ add(d);
+
+ // this makes perfect tracks from the perfect particles
+ PerfectTrackDriver perftrk = new PerfectTrackDriver();
+// perftrk.setParticleNames(CRPname);
+ perftrk.setParticleNames(outName);
+ perftrk.setTrackNames("PerfectTracks");
+ add(perftrk);
+
+ // when ready, add real tracks here
// TRACK-MIP ASSOCIATION driver - this is an example of a PFA algorithm running on collections
// hitmaps are modified by the algorithm - mip hits are removed from hitmaps
-// double dminE = 0.005;
-// double dminH = 3*dminE;
-// double dminTrC = 0.008; // original default is 0.0075
-// TrackMipClusterDriver TMdriver = new TrackMipClusterDriver(dminE, dminH, dminTrC);
-// String[] tmcollnames = {"EcalBarrDigiHits","HcalBarrDigiHits","EcalEndcapDigiHits","HcalEndcapDigiHits"};
-// TMdriver.setCollectionNames(tmcollnames);
-// TMdriver.setClusterNameExtension("TMClusters");
-// add(TMdriver);
+ double dminE = 0.005;
+ double dminH = 3*dminE;
+ double dminTrC = 0.0075; // original default is 0.0075, .008
+ double mincd = 2.5; // min density to make mip
+ TrackMipClusterDriver TMdriver = new TrackMipClusterDriver(dminE, dminH, dminTrC, mincd);
+ String[] tmcollnames = {"EcalBarrDigiHits","HcalBarrDigiHits","EcalEndcapDigiHits","HcalEndcapDigiHits"};
+ TMdriver.setCollectionNames(tmcollnames);
+ TMdriver.setClusterNameExtension("TMClusters");
+ add(TMdriver);
-// Convert modified hitmaps to new hit collections for clustering
+ // Convert modified hitmap to hit list for clustering after mips removed
HitMapToHitListDriver embconverter = new HitMapToHitListDriver();
embconverter.setInputHitMap("EMBarrhitmap");
embconverter.setOutputList("EBTMHits");
@@ -83,110 +155,166 @@
hadeconverter.setOutputList("HECTMHits");
add(hadeconverter);
-// PHOTON FINDER - another example algorithm - starts with clusters from selected collections
- double radius = 0.05;
- double seed = 0.;
- double minE = 0.;
- FixedConeClusterDriver FCdriver = new FixedConeClusterDriver(radius, seed, minE);
- String[] fchitcollnames = {"EBTMHits","EECTMHits"};
- FCdriver.setCollectionNames(fchitcollnames);
- FCdriver.setClusterNameExtension("FCClus");
- add(FCdriver);
-
-// add photon finder here - takes above clusters as input, output is photon clusters
-// int mincells = 10;
-// PhotonFinderDriver Phdriver = new PhotonFinderDriver(mincells);
-// String[] phclusnames = {"EBTMHitsFCClus","EECTMHitsFCClus"};
-// Phdriver.setClusterNames(phcollnames);
+// PHOTON FINDER
+ // Fixed Cone (use for photons now until DT is fixed)
+// double radius = 0.04;
+// double seed = 0.;
+// double minE = 0.;
+// FixedConeClusterDriver FCdriver = new FixedConeClusterDriver(radius, seed, minE);
+ // for now, use digihits, but will use EMBarrTMHits and EMEndcapTMHits eventually
+// String[] fchitcollnames = {"EBTMHits","EECTMHits"};
+// FCdriver.setCollectionNames(fchitcollnames);
+// FCdriver.setClusterNameExtension("FCClus");
+// add(FCdriver);
+
+ // Use Directed Tree clusterer first to set up photon finding
+ // this is setup differently than NN - no choice in hit collections - does all hits
+ DirectedTreeDriver DTBdriver = new DirectedTreeDriver();
+ DTBdriver.setInputHitMap("EMBarrhitmap");
+ DTBdriver.setOutputClusterList("EBTMHitsFCClus");
+ add(DTBdriver);
+
+ DirectedTreeDriver DTECdriver = new DirectedTreeDriver();
+ DTECdriver.setInputHitMap("EMEndcaphitmap");
+ DTECdriver.setOutputClusterList("EECTMHitsFCClus");
+ add(DTECdriver);
+
+ // add photon finder here - takes above DT (or fixed cone) clusters as input,
+ // runs NN 11110 on the cluster hits and applies HMatrix
+ // output is photon clusters had mincells=40?, cluster must be more than dTrcl from track
+ int mincells = 20;
+ double dTrcl = 0.05; // Graham says photons are 0.06 wide
+ PhotonFinderDriver Phdriver = new PhotonFinderDriver(mincells,dTrcl);
+// String[] phcollnames = {"EMBarrTMHits","EMEndcapTMHits"};
+// Phdriver.setCollectionNames(phcollnames);
// Phdriver.setClusterNameExtension("PhoClus");
-// add(Phdriver);
+ add(Phdriver);
-// Now, first make photon clusters into a hitmap, then modify original hitmap by subtracting Photon hitmaps from original
-// then make collectons for clustering again (ONLY WORKS WHEN PHOTONS ARE FOUND)
+ // Now, modify hitmap taking out hits in Photons, then make collectons for hadron shower clustering
// barrel
-// ClusterListToHitMapDriver BPhotoHitDriver = new ClusterListToHitMapDriver();
-// BPhotoHitDriver.addInputList("PhotonBClusters");
-// BPhotoHitDriver.setOutputHitMap("BPHitMap");
-// add(BPhotoHitDriver);
-// HitMapSubtractDriver TMBPhodriver = new HitMapSubtractDriver();
-// TMBPhodriver.setFirstHitMap("EMBarrhitmap");
-// TMBPhodriver.setSecondHitMap("BPHitMap");
-// TMBPhodriver.setOutputHitMap("EMBarrhitmap");
-// add(TMBPhodriver);
+ ClusterListToHitMapDriver BPhotoHitDriver = new ClusterListToHitMapDriver();
+ BPhotoHitDriver.addInputList("PhotonBClusters");
+ BPhotoHitDriver.setOutputHitMap("BPHitMap");
+ add(BPhotoHitDriver);
+ HitMapSubtractDriver TMBPhodriver = new HitMapSubtractDriver();
+ TMBPhodriver.setFirstHitMap("EMBarrhitmap");
+ TMBPhodriver.setSecondHitMap("BPHitMap");
+ TMBPhodriver.setOutputHitMap("EBTMPhitmap");
+ add(TMBPhodriver);
HitMapToHitListDriver btmphoconverter = new HitMapToHitListDriver();
- btmphoconverter.setInputHitMap("EMBarrhitmap");
+ btmphoconverter.setInputHitMap("EBTMPhitmap");
btmphoconverter.setOutputList("EBTMPHits");
add(btmphoconverter);
// endcap
-// ClusterListToHitMapDriver ECPhotoHitDriver = new ClusterListToHitMapDriver();
-// ECPhotoHitDriver.addInputList("PhotonECClusters");
-// ECPhotoHitDriver.setOutputHitMap("ECPHitMap");
-// add(ECPhotoHitDriver);
-// HitMapSubtractDriver TMECPhodriver = new HitMapSubtractDriver();
-// TMECPhodriver.setFirstHitMap("EMEndcaphitmap");
-// TMECPhodriver.setSecondHitMap("ECPHitMap");
-// TMECPhodriver.setOutputHitMap("EMEndcaphitmap");
-// add(TMECPhodriver);
+ ClusterListToHitMapDriver ECPhotoHitDriver = new ClusterListToHitMapDriver();
+ ECPhotoHitDriver.addInputList("PhotonECClusters");
+ ECPhotoHitDriver.setOutputHitMap("ECPHitMap");
+ add(ECPhotoHitDriver);
+ HitMapSubtractDriver TMECPhodriver = new HitMapSubtractDriver();
+ TMECPhodriver.setFirstHitMap("EMEndcaphitmap");
+ TMECPhodriver.setSecondHitMap("ECPHitMap");
+ TMECPhodriver.setOutputHitMap("EECTMPhitmap");
+ add(TMECPhodriver);
HitMapToHitListDriver ectmphoconverter = new HitMapToHitListDriver();
- ectmphoconverter.setInputHitMap("EMEndcaphitmap");
+ ectmphoconverter.setInputHitMap("EECTMPhitmap");
ectmphoconverter.setOutputList("EECTMPHits");
add(ectmphoconverter);
-// TRACK - CLUSTER MATCHING Algorithm here, first cluster remaining hits in ECAL, HCAL
- // HCALs
- int dU = 6;
- int dV = 6;
- int dLayer = 6;
- int ncells = 6;
- double thresh = 0;
- NearestNeighborClusterDriver NNHdriver = new NearestNeighborClusterDriver(dU, dV, dLayer, ncells, thresh);
+// TRACK - CLUSTER MATCHING Algorithm here
+ // cluster remaining hits in ECAL, HCAL for track matching -
+ // use loose NN clusterer 10,10,10,10?
+ int hdU = 2;
+ int hdV = 2;
+ int hdLayer = 2;
+ int hncells = 5;
+ double hthresh = 0;
+ NearestNeighborClusterDriver NNHdriver = new NearestNeighborClusterDriver(hdU, hdV, hdLayer, hncells, hthresh);
String[] nnhhitcollnames = {"HBTMHits","HECTMHits"};
NNHdriver.setCollectionNames(nnhhitcollnames);
NNHdriver.setClusterNameExtension("NNHClus");
add(NNHdriver);
+
+ // try fixed cone in HCAL - picks up more hits - probably worse for higher E
+// double hradius = 0.25;
+// double hseed = 0.0;
+// double hminE = 0.05;
+// FixedConeClusterDriver HFCdriver = new FixedConeClusterDriver(hradius, hseed, hminE);
+// String[] hfchitcollnames = {"HBTMHits","HECTMHits"};
+// HFCdriver.setCollectionNames(hfchitcollnames);
+// HFCdriver.setClusterNameExtension("FCClus");
+// add(HFCdriver);
+
+ DirectedTreeDriver DTHBdriver = new DirectedTreeDriver();
+ DTHBdriver.setInputHitMap("HADBarrhitmap");
+ DTHBdriver.setOutputClusterList("HBDTClus");
+ add(DTHBdriver);
+
+ DirectedTreeDriver DTHECdriver = new DirectedTreeDriver();
+ DTHECdriver.setInputHitMap("HADEndcaphitmap");
+ DTHECdriver.setOutputClusterList("HECDTClus");
+ add(DTHECdriver);
- // ECALs
- dU = 5;
- dV = 5;
- dLayer = 5;
- ncells = 5;
- thresh = 0;
+ // now do EM also - use NN here
+ int dU = 2;
+ int dV = 2;
+ int dLayer = 2;
+ int ncells = 5;
+ double thresh = 0;
NearestNeighborClusterDriver NNEdriver = new NearestNeighborClusterDriver(dU, dV, dLayer, ncells, thresh);
String[] nnehitcollnames = {"EBTMPHits","EECTMPHits"};
NNEdriver.setCollectionNames(nnehitcollnames);
NNEdriver.setClusterNameExtension("NNEClus");
- add(NNEdriver);
+ add(NNEdriver);
+
+ // put all clusters into 1 collection?
-// add track/shower matching driver here
-// TrackShowerClusterDriver TrShdriver = new TrackShowerClusterDriver();
+ // add matching driver here
+ TrackShowerClusterDriver TrShdriver = new TrackShowerClusterDriver();
+ String[] shclnames = {"EBTMPHitsNNEClus","EECTMPHitsNNEClus","HBDTClus","HECDTClus"};
// String[] shclnames = {"EBTMPHitsNNEClus","EECTMPHitsNNEClus","HBTMHitsNNHClus","HECTMHitsNNHClus"};
-// TrShdriver.setClusterNames(shclnames);
-// add(TrShdriver);
+ TrShdriver.setClusterNames(shclnames);
+ add(TrShdriver);
-// more hitmap manipulation here if needed
-// add neutral hadron finder driver here
-// NeutralHadronDriver NHdriver = new NeutralHadronDriver();
-// String[] nshclnames = {"EBTMPHitsNNEClus","EECTMPHitsNNEClus","HBTMHitsNNHClus","HECTMHitsNNHClus"};
-// NHdriver.setClusterNames(nshclnames);
-// add(NHdriver);
+ if (FullPFA)
+ {
+ // Do dijet mass for PFA after making Reconstructed Particle List
+ ClusterToReconstructedParticleDriver ClRPdriver = new ClusterToReconstructedParticleDriver();
+ ClRPdriver.setTrackNames("PerfectTracks");
+ String[] phnames = {"PhotonBClusters","PhotonECClusters"};
+ ClRPdriver.setPhotonNames(phnames);
+ ClRPdriver.setNeutralHadNames("NeuHClusters");
+ add(ClRPdriver);
- }
-
-// if you need event loop, add here (shows how filter is applied
-// protected void process(EventHeader event)
-// {
-
-// super.process(event); // executes all added drivers
-
-// boolean mcfltr = true;
-// mcfltr = (Boolean)event.get("MCFilt");
-// System.out.println("MCFilt is " +mcfltr);
-// if (mcfltr)
-// {
- // put processing here
-
-// }
+ // now find jets with real Reco Particles
+ JetDriver PFAjet = new JetDriver();
+ PFAjet.setInputCollectionName("AllRecoParticles");
+ PFAjet.setOutputCollectionName("PFAJets");
+ JetFinder tworealjets = new FixNumberOfJetsFinder(2);
+ PFAjet.setFinder(tworealjets);
+ // for Durham jet, ycut = 0.25 at ZPole, 0.01 at 500 GeV ZZ
+// JetFinder rktjet = new DurhamJetFinder(0.0003);
+// PFAjet.setFinder(rktjet);
+ add(PFAjet);
+
+ // make perfect jets out of perfect particles
+ JetDriver j = new JetDriver();
+ j.setInputCollectionName(outName);
+ j.setOutputCollectionName("PerfectJets");
+ JetFinder twojet = new FixNumberOfJetsFinder(2);
+ j.setFinder(twojet);
+ // for Durham jet, ycut = 0.25 at ZPole, 0.01 at 500 GeV ZZ
+// JetFinder ktjet = new DurhamJetFinder(0.0003);
+// j.setFinder(ktjet);
+ add(j);
+
+ // make plots etc. from results
+ PPFAPlotDriver ppfaplots = new PPFAPlotDriver();
+ ppfaplots.setMCPartName(CRPname);
+ ppfaplots.setPerfJetName("PerfectJets");
+ ppfaplots.setPFAJetName("PFAJets");
+ ppfaplots.setPerfPartName(outName);
+ add(ppfaplots);
+ }
- // end of everything in event
-// }
+ }
}