Print

Print


Commit in lcsim/src/org/lcsim/contrib/SteveMagill on MAIN
HighPTemplate.java+322-1551.2 -> 1.3


lcsim/src/org/lcsim/contrib/SteveMagill
HighPTemplate.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- HighPTemplate.java	29 May 2008 22:34:39 -0000	1.2
+++ HighPTemplate.java	20 Aug 2008 20:17:30 -0000	1.3
@@ -6,7 +6,7 @@
 import org.lcsim.event.util.*;
 import org.lcsim.util.hitmap.*;
 
-import org.lcsim.recon.cluster.util.CalHitMapDriver;
+import org.lcsim.recon.cluster.util.*;
 import org.lcsim.digisim.DigiSimDriver;
 import org.lcsim.digisim.SimCalorimeterHitsDriver;
 import org.lcsim.util.hitmap.HitListToHitMapDriver;
@@ -42,11 +42,13 @@
        
 //  **********************INITIALIZATION****************************************
        //  use DIGISIM to get hits after timing, threshold, etc. cuts 
+       //  output of DigiSim is hit collections - 
+       //  EcalBarrDigiHits, EcalEndcapDigiHits, HcalBarrDigiHits, HcalEndcapDigiHits
        add(new CalHitMapDriver());
        DigiSimDriver digi = new DigiSimDriver();
        add(digi);
        add(new SimCalorimeterHitsDriver());
-       //  output of DigiSim is hit collections - EcalBarrDigiHits, EcalEndcapDigiHits, HcalBarrDigiHits, HcalEndcapDigiHits
+//  ****************************************************************************
        
 //  OPTIONAL - make subdetector hitmaps from DigiSim collections so both are available for PFA
        HitListToHitMapDriver ebhitmap = new HitListToHitMapDriver();
@@ -68,67 +70,98 @@
 
 //  also OPTIONAL - 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("OrigDigiHitMap");
-       add(digiHitMap);
-       
-//  ***********************Perfect PFA******************************************
-//  form Perfect Reconstructed Particles (Perfect PFA) from MC
+       HitListToHitMapDriver allHitMap = new HitListToHitMapDriver();
+       allHitMap.addInputList("EcalBarrDigiHits");
+       allHitMap.addInputList("EcalEndcapDigiHits");
+       allHitMap.addInputList("HcalBarrDigiHits");
+       allHitMap.addInputList("HcalEndcapDigiHits");
+       allHitMap.setOutput("Allhitmap");
+       add(allHitMap);
+       
+//  also, make combined EM and HAD hitmaps
+       HitListToHitMapDriver emHitMap = new HitListToHitMapDriver();
+       emHitMap.addInputList("EcalBarrDigiHits");
+       emHitMap.addInputList("EcalEndcapDigiHits");
+       emHitMap.setOutput("AllEMhitmap");
+       add(emHitMap);
+       HitListToHitMapDriver hadHitMap = new HitListToHitMapDriver();       
+       hadHitMap.addInputList("HcalBarrDigiHits");
+       hadHitMap.addInputList("HcalEndcapDigiHits");
+       hadHitMap.setOutput("AllHADhitmap");
+       add(hadHitMap);
+       
+//  *****************Perfect PFA definition*************************************
+       //  form Perfect Reconstructed Particles (Perfect PFA) from MC
+       //  Perfect Reconstructed Particle list - PerfectRecoParticles
+       //  also have PerfectCheatClusters and PerfectTracks (FSReconTracks)       
        String CCname = "PerfectCheatClusters";
        String CRPname = "CheatReconstructedParticles";
+       String Trname = "PerfectTracks";
+       String PerfRP = "PerfectRecoParticles";
        
        //  do cheat reconstruction
        CheatReconDriver crd = new CheatReconDriver();
        crd.setCheatReconstructedParticleOutputName(CRPname);
        crd.setCheatClusterOutputName(CCname);
-       crd.setCheatFSTrackOutputName("PerfectTracks");
+       crd.setCheatFSTrackOutputName(Trname);
        add(crd);
        
-       // now make (more realistic) cheated tracks, etc with PPR driver
-       String outName = "PerfectRecoParticles";
-       add(new PPRDriver(CRPname,outName));
-//  Perfect Reconstructed Particle list - PerfectReconstructedParticles
-//  also have PerfectCheatClusters and Perfect Tracks (FSReconTracks)
+       //  now make (more realistic) cheated tracks, etc with PPR driver
+       //  use standard calibration for energies
+       PPRDriver pprd = new PPRDriver(CRPname,PerfRP);
+       ClusterEnergyCalculator pcec = new QPhotonClusterEnergyCalculator();
+       pprd.setPhotonClusterEnergyCalculator(pcec);
+       ClusterEnergyCalculator nhcec = new QNeutralHadronClusterEnergyCalculator();
+       pprd.setNeutralHadronClusterEnergyCalculator(nhcec);
+       add(pprd);
+//  ****************************************************************************
 
 //  **************************TRACK Selection Here******************************
-       //  when ready, add real track reconstruction driver here
+       //  when ready, add real track reconstruction driver here, for now, use
+       //  PerfectTracks
 //       RealTrackDriver realtrack = new RealTrackDriver();
 //       realtrack.setTrackNames("RealTracks");
 //       add(realtrack);
+//  ****************************************************************************
 
-       //  Utility to get some SpacePoints of extrapolated track positions -
-       //  useful for many algorithms
-       //  So far, 3 output maps - TrkXE0Map (Track pos at ECAL layer 0),
-       //  TrkXEShMaxMap (Track pos at Shower Max), and TrkXH0Map (Track
-       //  pos at HCAL layer 0)
+//  ***************PFA Utility Algorithm****************************************
+       //  Utility to get some Track/SpacePoint maps of extrapolated track
+       //  positions - So far, 3 output maps <Track, SpacePoint> 
+       //  TrkXE0Map (Track pos at ECAL layer 0)
+       //  TrkXEShMaxMap (Track pos at ECAL Shower Max)
+       //  TrkXH0Map (Track pos at HCAL layer 0)
        TrkXPosDriver txpdriver = new TrkXPosDriver();
-       txpdriver.setInputTrackList("PerfectTracks");
+       txpdriver.setInputTrackList(Trname);
        add(txpdriver);       
        
-//  *******************TRACK-MIP ASSOCIATION Driver*****************************
-//  this is an example of a PFA algorithm running on hit collections
-//  hitmaps are modified by the algorithm - mip hits are removed from hitmaps
+//  *******************TRACK-MIP ASSOCIATION algorithm*****************************
+       //  PFA algorithm running on hit collections, corresponding hitmaps are
+       //  modified by the algorithm - mip hits are removed from hitmaps
+       //  outputs are mip clusters (TMClusters)
+       //  maps : TrackMipMap <Track, BasicCluster> Track - mip cluster link
+       //  TrackILMap <Track, Integer> Track - CAL Interaction Layer link
+       //  MipClusILMap <BasicCluster, Integer> Mip cluster - CAL IL link
+       //  TrackILPosMap <Track, SpacePoint> Track - IL pos link
+       //  TrackMipEPMap <Track, SpacePoint> Track - mip cluster endpoint link
+       String mipclusters = "TMClusters";
        double dminE = 0.005;  // hard-coded now - change to detector independent value
        double dminH = 3*dminE;  //  same here
        double dminTrC = 0.01;  // default range is 0.0175 - 0.0225 tuned with muons
-       double mincd = 3.5;  // min density to make mip - default is 3.5 tuned with muons
+       double mincd = 2.25;  // min density to make mip - default is 3.5 tuned with muons
        TrackMipClusterDriver TMdriver = new TrackMipClusterDriver(dminE, dminH, dminTrC, mincd);
        String[] tmcollnames = {"EcalBarrDigiHits","HcalBarrDigiHits","EcalEndcapDigiHits","HcalEndcapDigiHits"};
 //       String[] tmcollnames = {"EBHits","HBHits","EEHits","HEHits"};
        TMdriver.setCollectionNames(tmcollnames);
-       TMdriver.setClusterNameExtension("TMClusters");
+       TMdriver.setClusterNameExtension(mipclusters);
        add(TMdriver);
-       //  Output of this driver is mip clusters attached to tracks - TMClusters
+//  ****************************************************************************
 
+//  *******************PFA Diagnostic algorithm************************************
        //  OPTIONAL - checks purity of mip clusters - diagnostic routine only
        TrMipCompDriver tmcdriver = new TrMipCompDriver();
-       String tmnames = ("TMClusters");
-       tmcdriver.setTrMipClusName(tmnames);
-       add(tmcdriver);       
+       tmcdriver.setTrMipClusName(mipclusters);
+       add(tmcdriver); 
+//  ****************************************************************************
        
        //  Convert modified hitmaps to new hit collections for clustering after mips removed
        HitMapToHitListDriver embconverter = new HitMapToHitListDriver();
@@ -148,156 +181,290 @@
        hadeconverter.setOutputList("HECTMHits");
        add(hadeconverter);
        
-//  **********************HMATRIX PHOTON FINDER*********************************************
-       //  Combine barrel, endcap EM hits into hitmap
-       HitListToHitMapDriver NMHitMap = new HitListToHitMapDriver();
-       NMHitMap.addInputList("EBTMHits");
-       NMHitMap.addInputList("EECTMHits");
-       NMHitMap.setOutput("EMNMHitMap");
-       add(NMHitMap);
-       
-       //  also, make a combined barrel,EC had hitmap
-       HitListToHitMapDriver NMPHitMap = new HitListToHitMapDriver();
-       NMPHitMap.addInputList("HBTMHits");
-       NMPHitMap.addInputList("HECTMHits");
-       NMPHitMap.setOutput("NMPHhitmap");
-       add(NMPHitMap);
-       
-       //  Directed Tree clusterer for HM Photon Finder
-       int minsize = 16;
-       DirectedTreeDriver DTPhdriver = new DirectedTreeDriver();
-       DTPhdriver.setInputHitMap("EMNMHitMap");
-       DTPhdriver.setOutputClusterList("NMEMDTClus");
-       DTPhdriver.setMinimumClusterSize(minsize);
-       add(DTPhdriver);     
-       
-       // add HMatrix Photon Finder PFA algorithm here - takes above clusters as input,
-       // runs NN 11110 on the cluster hits and applies HMatrix
-       int mincells = 20;  // default is 20-25, clear break in hits vs e at 20-25, 500 MeV
-       double dTrcl = 0.025;  // min distance from nearest track (0.05 - 0.08 is shoulder)
-       double phminE = 0.75;  // see above for mincells
-       HMPhoDriver HMdriver = new HMPhoDriver(mincells,dTrcl,phminE);
-       String CALclname = ("NMEMDTClus");
-       HMdriver.setInputClusterName(CALclname);
-       HMdriver.setOutputClusterName("HMPhoClusters");
-       add(HMdriver);
-               
-       //  OPTIONAL checks purity of photon clusters - diagnostic routine only
-       PhoCompDriver phdriver = new PhoCompDriver();
-       String phonames = ("HMPhoClusters");       
-       phdriver.setPhoClusNames(phonames);
-       add(phdriver);       
-       
-//  ******************************end of HMPhoton Finder************************************
-       
-       //  Now, modify hitmap taking out hits in Photons, then make collectons for hadron shower clustering
-       ClusterListToHitMapDriver PhotoHitDriver = new ClusterListToHitMapDriver();
-       PhotoHitDriver.addInputList("HMPhoClusters");
-       PhotoHitDriver.setOutputHitMap("PhHitMap");
-       add(PhotoHitDriver);
-       HitMapSubtractDriver TMPdriver = new HitMapSubtractDriver();
-       TMPdriver.setFirstHitMap("EMNMHitMap");
-       TMPdriver.setSecondHitMap("PhHitMap");
-       TMPdriver.setOutputHitMap("NMPEMhitmap");
-       add(TMPdriver);
-       HitMapToHitListDriver tmpconverter = new HitMapToHitListDriver();
-       tmpconverter.setInputHitMap("NMPEMhitmap");
-       tmpconverter.setOutputList("NMPEMHits");
-       add(tmpconverter);
-       
-       HitMapToHitListDriver htmpconverter = new HitMapToHitListDriver();
-       htmpconverter.setInputHitMap("NMPHhitmap");
-       htmpconverter.setOutputList("NMPHHits");
-       add(htmpconverter);       
-
-//  **********************TRACK - CLUSTER MATCHING driver ***********************************
-
-       // make a single hitmap for merge algorithm
+       // modify single hitmap for track cluster matching
        HitListToHitMapDriver mHitMap = new HitListToHitMapDriver();
-       mHitMap.addInputList("NMPEMHits");
-       mHitMap.addInputList("NMPHHits");
-       mHitMap.setOutput("AllNMPHitMap");
+       mHitMap.addInputList("EBTMHits");
+       mHitMap.addInputList("EECTMHits");
+       mHitMap.addInputList("HBTMHits");
+       mHitMap.addInputList("HECTMHits");
+       mHitMap.setOutput("Allhitmap");
        add(mHitMap);
        
-       // cluster with DT 
+       //  modify EM and HAD hitmaps also
+       HitListToHitMapDriver memHitMap = new HitListToHitMapDriver();
+       memHitMap.addInputList("EBTMHits");
+       memHitMap.addInputList("EECTMHits");
+       memHitMap.setOutput("AllEMhitmap");
+       add(memHitMap);       
+       HitListToHitMapDriver mhadHitMap = new HitListToHitMapDriver();
+       mhadHitMap.addInputList("HBTMHits");
+       mhadHitMap.addInputList("HECTMHits");
+       mhadHitMap.setOutput("AllHADhitmap");
+       add(mhadHitMap);       
+       
+//  *****************TRACK-CAL SHOWER ASSOCIATION Algorithm*********************
+       //  first, choose cluster algorithm to form cluster inputs
+       // Directed Tree (DT) clusterer 
        int allsize = 3;
        DirectedTreeDriver DTAlldriver = new DirectedTreeDriver();
-       DTAlldriver.setInputHitMap("AllNMPHitMap");
-       DTAlldriver.setOutputClusterList("AllDTNMPClus");
+       DTAlldriver.setInputHitMap("Allhitmap");
+       DTAlldriver.setOutputClusterList("AllDTClus");
        DTAlldriver.setMinimumClusterSize(allsize);
        add(DTAlldriver);
        
-       //  add matching driver here
-       double minsep = 0.01; // default for scin 0.025
+       //  add TrCAL matching driver here
+       String trshclus = "TrackCALClusters";
+       double dcore = 0.01;  // distance of hits from track for core clusters
+       double minsep = 0.0185; // distance of shower from track - default for scin 0.025
        int nloop = 5;  // default 5
-       double minEp = 0.75;  // default .65
-       double maxEp = 1.8;  // default 1.5
-
-       //  use track core only driver here
-//       TrCoreDriver trcdriver = new TrCoreDriver(minsep, maxEp);
-//       String[] shclnames = {"AllDTNMPClus"};  
-//       trcdriver.setClusterNames(shclnames);
-//       String outcllist = ("TrackCoreClusters");
-//       trcdriver.setOutputClusterList(outcllist);
-//       add(trcdriver);
-       
-       //  OPTIONAL - checks purity of track shower clusters - diagnostic routine only
-//       TrCoreCompDriver tccdriver = new TrCoreCompDriver();
-//       String tcnames = ("TrackCoreClusters");
-//       tccdriver.setTrCoreClusName(tcnames);
-//       add(tccdriver);              
-       
-       //  use full track shower driver here (includes core)
-       TSCDriver TrShdriver = new TSCDriver(minsep, nloop, minEp, maxEp);
-       String[] shclnames = {"AllDTNMPClus"};  
+       double cres = 0.70;  // cal resolution stoch factor 0.7 for rpc, 0.5 for scint
+       double mintp = 1.0;  // 1 GeV is default (means min eop for rpc is 0.3)
+       //  use full forward track shower driver here (includes core)
+       TSCForDriver TrShdriver = new TSCForDriver(dcore, minsep, nloop, cres, mintp);       
+       String[] shclnames = {"AllDTClus"};  
        TrShdriver.setClusterNames(shclnames);
-       String outcllist = ("TrackCALClusters");
-       TrShdriver.setOutputClusterList(outcllist);
+       TrShdriver.setOutputClusterList(trshclus);
        add(TrShdriver);
+//  ****************************************************************************
        
-       //  OPTIONAL - checks purity of track shower clusters - diagnostic routine only
-       TrShowCompDriver tscdriver = new TrShowCompDriver();
-       String tsnames = ("TrackCALClusters");
-       tscdriver.setTrShowClusName(tsnames);
-       add(tscdriver);       
-       
-       //  subtract track-cal clusters from input hitmap
+       //  subtract shower clusters only (mips already missing) from input hitmap
        ClusterListToHitMapDriver TrShowerHitDriver = new ClusterListToHitMapDriver();
-       TrShowerHitDriver.addInputList("TrackCALClusters");
-       TrShowerHitDriver.setOutputHitMap("TrCALHitMap");
+       TrShowerHitDriver.addInputList("TrackShowerClusters");
+       TrShowerHitDriver.setOutputHitMap("TrCALShowHitMap");
        add(TrShowerHitDriver);
        HitMapSubtractDriver TSsubdriver = new HitMapSubtractDriver();
-       TSsubdriver.setFirstHitMap("AllNMPHitMap");
-       TSsubdriver.setSecondHitMap("TrCALHitMap");
-       TSsubdriver.setOutputHitMap("AMPhTrCalhitmap");
+       TSsubdriver.setFirstHitMap("Allhitmap");
+       TSsubdriver.setSecondHitMap("TrCALShowHitMap");
+       TSsubdriver.setOutputHitMap("Allhitmap");
        add(TSsubdriver);
+              
+       //  separate into ECAL,HCAL hitmaps for additional photon finder
+       MyHitInECALDecision decisionEcal = new MyHitInECALDecision();       
+       HitMapFilter EMFilter = new HitMapFilter();
+       HitMapFilter HADFilter = new HitMapFilter();
+       EMFilter.setDecisionOnHit(decisionEcal);
+       HADFilter.setDecisionOnHit(new NotDecisionMakerSingle(decisionEcal));
+       
+       HitMapFilterDriver emfdriver = new HitMapFilterDriver();
+       emfdriver.setInputHitMap("Allhitmap");
+       emfdriver.setFilter(EMFilter);
+       emfdriver.setOutputHitMap("AllEMhitmap");
+       add(emfdriver);
+       
+       HitMapToHitListDriver ptsemconverter = new HitMapToHitListDriver();
+       ptsemconverter.setInputHitMap("AllEMhitmap");
+       ptsemconverter.setOutputList("NMTSEMHits");
+       add(ptsemconverter);       
+
+       HitMapFilterDriver hadfdriver = new HitMapFilterDriver();
+       hadfdriver.setInputHitMap("Allhitmap");
+       hadfdriver.setFilter(HADFilter);
+       hadfdriver.setOutputHitMap("AllHADhitmap");
+       add(hadfdriver);
+       
+       HitMapToHitListDriver ptshadconverter = new HitMapToHitListDriver();
+       ptshadconverter.setInputHitMap("AllHADhitmap");
+       ptshadconverter.setOutputList("NMTSHADHits");
+       add(ptshadconverter);
+       
+//  ************PHOTON FINDER algorithm*****************************************
+       //  For photon finders, use only EM hits, combine barrel, endcap EM hits into 1 hitmap
+       //  uses all except mip hits - resolve overlaps with track clusters later
+//       HitListToHitMapDriver NMHitMap = new HitListToHitMapDriver();
+//       NMHitMap.addInputList("EBTMHits");
+//       NMHitMap.addInputList("EECTMHits");
+//       NMHitMap.setOutput("EMNMHitMap");
+//       add(NMHitMap);
+       
+       //  also make corresponding HCAL map (don't need for analysis)
+//       HitListToHitMapDriver NMPHitMap = new HitListToHitMapDriver();
+//       NMPHitMap.addInputList("HBTMHits");
+//       NMPHitMap.addInputList("HECTMHits");
+//       NMPHitMap.setOutput("HADNMhitmap");
+//       add(NMPHitMap);
+                      
+       //  add modified Ron's Photon algorithm here - use either all hitmap
+       //  or hitmap after track clusters subtracted
+       String phCl = "DTPhotonClusters";
+       //  modified Ron's SiD01 photon finder to only use input hitmap
+       add(new ModRonDTPhotonFinderSid01("AllEMhitmap", "ARPFhitmap", phCl ));
+//  ****************************************************************************
        
-//  *************************Continue here with photons, N Hadrons*******************************       
+       //  Now, modify hitmap taking out hits in Photons, then make collectons for hadron shower clustering
+       ClusterListToHitMapDriver PhotoHitDriver = new ClusterListToHitMapDriver();
+       PhotoHitDriver.addInputList(phCl);
+       PhotoHitDriver.setOutputHitMap("PhHitMap");
+       add(PhotoHitDriver);
+       HitMapSubtractDriver TMPdriver = new HitMapSubtractDriver();
+       TMPdriver.setFirstHitMap("AllEMhitmap");
+       TMPdriver.setSecondHitMap("PhHitMap");
+       TMPdriver.setOutputHitMap("AllEMhitmap");
+       add(TMPdriver);
+       HitMapToHitListDriver tmpconverter = new HitMapToHitListDriver();
+       tmpconverter.setInputHitMap("AllEMhitmap");
+       tmpconverter.setOutputList("NMTSPEMHits");
+       add(tmpconverter);       
        
+//  ****************Low Energy Photon Algorithm*********************************
+       //  cluster EM hits again with DT
        int nem = 3;
        DirectedTreeDriver apedriver = new DirectedTreeDriver();
        apedriver.setMinimumClusterSize(nem);
-       apedriver.setInputHitMap("AMPhTrCalhitmap");
-       apedriver.setOutputClusterList("NPCandClusters");
+       apedriver.setInputHitMap("AllEMhitmap");
+       apedriver.setOutputClusterList("PCandClusters");
        add(apedriver);
+
+       // add Low Energy Photon Finder PFA algorithm here - takes above clusters as input
+       int minc = 5;  // default is 20-25, clear break in hits vs e at 20-25, 500 MeV
+       double minclE = 0.075;  // see above for mincells
+       double maxclE = 1.0;  // maximum E for cluster 
+       int minl = 9;  // max layer for start of pho shower
+       LEPhoDriver ledriver = new LEPhoDriver(minc,minclE,maxclE,minl);
+       String clname = ("PCandClusters");
+       ledriver.setInputClusterName(clname);
+       ledriver.setOutputClusterName("LEPhotonClusters");
+       add(ledriver); 
+//  ****************************************************************************
+       
+       //  remove LEPho hits from hitmap and continue
+       ClusterListToHitMapDriver lepdriver = new ClusterListToHitMapDriver();
+       lepdriver.addInputList("LEPhotonClusters");
+       lepdriver.setOutputHitMap("LEPHitMap");
+       add(lepdriver);
+       HitMapSubtractDriver LEPdriver = new HitMapSubtractDriver();
+       LEPdriver.setFirstHitMap("AllEMhitmap");
+       LEPdriver.setSecondHitMap("LEPHitMap");
+       LEPdriver.setOutputHitMap("AllEMhitmap");
+       add(LEPdriver);
+       
+       //  modify allhitmap
+       HitMapAddDriver HEMdriver = new HitMapAddDriver();
+       HEMdriver.addInputHitMap("AllEMhitmap");
+       HEMdriver.addInputHitMap("AllHADhitmap");
+       HEMdriver.setOutputHitMap("Allhitmap");
+       add(HEMdriver);
+
+       //  try perfect clusters from PPR list if wanted
+       PPFAPhotonClusterDriver pphodriver = new PPFAPhotonClusterDriver();
+       String pprclname = ("PPRClusters");
+       pphodriver.setInputClusName(pprclname);
+       pphodriver.setOutputClusName("PCPhotonClusters");
+       add(pphodriver);
+       
+//  ********************Photon-Track Comparison Driver**************************
+       //  check photons now with closeness to tracks and eoverp ratio, combine
+       //  final selection into single photon cluster list
+       String phonames = "PhotonClusters";
+       int dsize = 0;  // can make min cell requirement
+       double emin = 0.075;  // min energy requirement
+       double dtc = 0.005;  // dist from track to merge with track
+       DTPhoAcceptDriver dtdriver = new DTPhoAcceptDriver(dsize, dtc, emin);
+//       String[] innames = {"DTPhotonClusters"};
+       String[] innames = {"DTPhotonClusters","LEPhotonClusters"};
+       dtdriver.setInputClusNames(innames);
+       dtdriver.setOutputClusNames(phonames);
+       add(dtdriver);
+//  ****************************************************************************
        
-       //  add remaining cluster cheat ID here instead of PFA
-       //  combines HMPhoClusters and MorePhoClusters into PhotonClusters
-       ChClusIDDriver ccidriver = new ChClusIDDriver();
-       String clname = ("NPCandClusters");
-       ccidriver.setInputClusterName(clname);
-       ccidriver.setOutputPhoClusterName("MorePhoClusters");
-       ccidriver.setOutputNHClusterName("NeutralHadronClusters");
-       ccidriver.setOutputCHClusterName("UnusedCHClusters");
-       add(ccidriver);
+//  ********************PFA Diagnostic Algorithm********************************
+       //  OPTIONAL checks purity of photon clusters - diagnostic routine only
+       PhoCompDriver phdriver = new PhoCompDriver();
+       phdriver.setPhoClusNames(phonames);
+       add(phdriver); 
+//  ****************************************************************************
 
-       //  Make Reconstructed Particle List from tracks, clusters
+       //  get perfect neutral hadron clusters from PPR list if wanted
+       PPFANeuHClusterDriver pnhdriver = new PPFANeuHClusterDriver();
+       pnhdriver.setInputClusName(pprclname);
+       pnhdriver.setOutputClusName("PNeutralHadronClusters");
+       add(pnhdriver);
+       
+       //  cluster remaining hits with DT for NH algorithm - em and had separately
+       int esize = 5;
+       DirectedTreeDriver dtnemdriver = new DirectedTreeDriver();
+       dtnemdriver.setInputHitMap("AllEMhitmap");
+       dtnemdriver.setOutputClusterList("NHEMCandClusters");
+       dtnemdriver.setMinimumClusterSize(esize);
+       add(dtnemdriver);
+       int hsize = 5;
+       DirectedTreeDriver dtnhaddriver = new DirectedTreeDriver();
+       dtnhaddriver.setInputHitMap("AllHADhitmap");
+       dtnhaddriver.setOutputClusterList("NHHADCandClusters");
+       dtnhaddriver.setMinimumClusterSize(hsize);
+       add(dtnhaddriver);
+       
+//  ***********************PFA Utility algorithm********************************
+       // form a single list after merging clusters - 3 types of merging, EM-EM,
+       //  HAD-HAD, and EM-HAD
+       double mdistee = 0.075;
+       double mdisthh = 0.075;
+       double mdisteh = 0.075;
+       int mhits = 8;
+       ClMergeDriver clmdriver = new ClMergeDriver(mdistee,mdisthh,mdisteh,mhits);
+       clmdriver.setInputEMClusterName("NHEMCandClusters");
+       clmdriver.setInputHADClusterName("NHHADCandClusters");
+       clmdriver.setOutputClusterName("NHCandClusters");
+       add(clmdriver);
+//  ****************************************************************************
+
+//  ****************NEUTRAL HADRON FINDER Algorithm*****************************
+       //  add neutral hadron cluster driver here
+       String nhclusters = "NeutralHadronClusters";
+       int nsize = 8;
+       double nemin = 0.20;
+       double ndtr = 0.07;
+       NHCandClusterDriver nhdriver = new NHCandClusterDriver(nsize, nemin, ndtr);
+       nhdriver.setInputClusterName("NHCandClusters");
+       nhdriver.setOutputClusterName(nhclusters);
+       add(nhdriver);
+//  ****************************************************************************
+       
+       ClusterListToHitMapDriver nhcdriver = new ClusterListToHitMapDriver();
+       nhcdriver.addInputList("NeutralHadronClusters");
+       nhcdriver.setOutputHitMap("NHHitMap");
+       add(nhcdriver);
+       
+//       HitMapToHitListDriver lconverter = new HitMapToHitListDriver();
+//       lconverter.setInputHitMap("AllEMhitmap");
+//       lconverter.setOutputList("LEMHits");
+//       add(lconverter);
+//       HitMapToHitListDriver hconverter = new HitMapToHitListDriver();
+//       hconverter.setInputHitMap("AllHADhitmap");
+//       hconverter.setOutputList("NHADHits");
+//       add(hconverter);       
+//       HitListToHitMapDriver bnhHitMap = new HitListToHitMapDriver();
+//       bnhHitMap.addInputList("LEMHits");
+//       bnhHitMap.addInputList("NHADHits");
+//       bnhHitMap.setOutput("Allhitmap");
+//       add(bnhHitMap);
+
+       HitMapSubtractDriver Ldriver = new HitMapSubtractDriver();
+       Ldriver.setFirstHitMap("Allhitmap");
+       Ldriver.setSecondHitMap("NHHitMap");
+       Ldriver.setOutputHitMap("Allhitmap");
+       add(Ldriver);
+       HitMapToHitListDriver fconverter = new HitMapToHitListDriver();
+       fconverter.setInputHitMap("Allhitmap");
+       fconverter.setOutputList("LeftOverHits");
+       add(fconverter);
+       
+//  *****************Reconstructed Particle List Algorithm**********************
+       //  Make Reconstructed Particle List from tracks, photon clusters, and
+       //  neutral hadron clusters
        ClusterToReconstructedParticleDriver ClRPdriver = new ClusterToReconstructedParticleDriver();
        ClRPdriver.setTrackNames("PerfectTracks");
        ClRPdriver.setPhotonNames("PhotonClusters");
        ClRPdriver.setNeutralHadNames("NeutralHadronClusters");
        ClRPdriver.setRecoParticleName("AllRecoParticles");
        add(ClRPdriver);
-
+//  ****************************************************************************
+       
+//  ***************PFA Diagnostic algorithm*************************************
+       //  OPTIONAL - checks purity of track shower clusters - diagnostic routine only
+       TrShowCompDriver tscdriver = new TrShowCompDriver();
+       String tsnames = ("TrackCALClusters");
+       tscdriver.setTrShowClusName(tsnames);
+       add(tscdriver);         
+       
    }
 }
CVSspam 0.2.8