Print

Print


Commit in lcsim/src/org/lcsim/contrib/SteveMagill on MAIN
PPFAPlotDriver.java+219added 1.1


lcsim/src/org/lcsim/contrib/SteveMagill
PPFAPlotDriver.java added at 1.1
diff -N PPFAPlotDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PPFAPlotDriver.java	23 Apr 2007 20:05:34 -0000	1.1
@@ -0,0 +1,219 @@
+package org.lcsim.contrib.SteveMagill;
+
+import java.util.*;
+import org.lcsim.util.aida.AIDA;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.SimCalorimeterHit;
+import org.lcsim.recon.cluster.util.BasicCluster;
+import org.lcsim.geometry.util.CalorimeterIDDecoder;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.BasicHep3Vector;
+import org.lcsim.event.Track;
+import org.lcsim.util.hitmap.HitMap;
+import org.lcsim.recon.cluster.util.BasicCluster;
+
+import org.lcsim.event.ReconstructedParticle;
+import org.lcsim.event.base.MCReconstructedParticle;
+import org.lcsim.event.ParticleID;
+import org.lcsim.recon.cluster.cheat.CheatCluster;
+
+/**
+ *  Defines perfect particle flow objects - perfect charged particles, perfect photons and perfect neutral hadrons
+ */
+
+public class PPFAPlotDriver extends Driver
+{
+  public PPFAPlotDriver() {
+  }
+
+  private String _perfname;
+  private String _mcname;
+  private String _perfjetname;
+  private String _pfajetname;
+  private AIDA aida = AIDA.defaultInstance();
+  private boolean perfPFAD = true;
+  
+  public void process(EventHeader event) 
+  {
+      List<ReconstructedParticle> perfrps = event.get(ReconstructedParticle.class,_perfname);
+      List<MCReconstructedParticle> mcrps = event.get(MCReconstructedParticle.class,_mcname);
+      List<ReconstructedParticle> perfjets = event.get(ReconstructedParticle.class,_perfjetname);
+      List<ReconstructedParticle> pfajets = event.get(ReconstructedParticle.class, _pfajetname);
+      List<CheatCluster> chclusters = event.get(CheatCluster.class,"PerfectCheatClusters");
+      List<BasicCluster> phobcls = event.get(BasicCluster.class,"PhotonBClusters");
+      List<BasicCluster> phoeccls = event.get(BasicCluster.class,"PhotonECClusters");
+      List<ReconstructedParticle> ppjets = event.get(ReconstructedParticle.class,"PerfectJets");
+      
+//      List<CheatCluster> chHADclusters = event.get(CheatCluster.class,"HcalBarrDigiHitsCheatClusters");
+
+      //  here's some jet stuff for perfect jets
+      double jESum = 0;
+      double jPXSum = 0;
+      double jPYSum = 0;
+      double jPZSum = 0;
+      double djm = 0;
+      double[] jpz = new double[2];
+      double[] jp = new double[2];
+      int j = 0;
+      if (perfPFAD) aida.cloud1D("Number of Perfect Jets").fill(perfjets.size());
+      if (perfjets.size() == 2)
+      {
+          //  calculate dijet mass - don't we have something that does this?
+          for (ReconstructedParticle perfjet : perfjets)
+          {   
+              if (perfPFAD) aida.cloud1D("Perfect Jet Energy").fill(perfjet.getEnergy());
+              jESum += perfjet.getEnergy();
+              Hep3Vector j3v = perfjet.getMomentum();
+              jPXSum += j3v.x();
+              jPYSum += j3v.y();
+              jPZSum += j3v.z();
+              jp[j] = Math.sqrt(j3v.x()*j3v.x()+j3v.y()*j3v.y()+j3v.z()*j3v.z());
+              jpz[j] = j3v.z();
+              j++;
+          }    
+          double jE2 = jESum*jESum;
+          double jP2 = jPXSum*jPXSum+jPYSum*jPYSum+jPZSum*jPZSum;
+          djm += Math.sqrt(jE2-jP2);
+          if (perfPFAD && jpz[0]/jp[0]<0.8 && jpz[1]/jp[1]<0.8) aida.cloud1D("Perf Barrel DiJet Mass").fill(djm);
+          if (perfPFAD) aida.cloud1D("Perfect Dijet Mass").fill(djm);
+          if (perfPFAD) aida.cloud1D("Diff Perfect Dijet Mass").fill((djm-91)/9.5); 
+      }
+      
+      //  now real PFA jets
+      double rjESum = 0;
+      double rjPXSum = 0;
+      double rjPYSum = 0;
+      double rjPZSum = 0;
+      double rdjm = 0;
+      double[] jrpz = new double[2];
+      double[] jrp = new double[2];
+      int k = 0;
+      if (perfPFAD) aida.cloud1D("Number of PFA Jets").fill(pfajets.size());
+      if (pfajets.size() == 2)
+      {
+          //  calculate dijet mass - don't we have something that does this?
+          for (ReconstructedParticle pfajet : pfajets)
+          {
+              if (perfPFAD) aida.cloud1D("PFA Jet Energy").fill(pfajet.getEnergy());
+              rjESum += pfajet.getEnergy();
+              Hep3Vector rj3v = pfajet.getMomentum();
+              rjPXSum += rj3v.x();
+              rjPYSum += rj3v.y();
+              rjPZSum += rj3v.z();
+              jrp[k] = Math.sqrt(rj3v.x()*rj3v.x()+rj3v.y()*rj3v.y()+rj3v.z()*rj3v.z());
+              jrpz[k] = rj3v.z();
+              k++;
+         }
+         double rjE2 = rjESum*rjESum;
+         double rjP2 = rjPXSum*rjPXSum+rjPYSum*rjPYSum+rjPZSum*rjPZSum;
+         rdjm += Math.sqrt(rjE2-rjP2);
+         if (perfPFAD) aida.cloud1D("PFA Dijet Mass").fill(rdjm);
+         if (perfPFAD) aida.cloud1D("Diff PFA Dijet Mass").fill((rdjm-91)/9.5);
+         if (perfPFAD && jrpz[0]/jrp[0]<0.8 && jrpz[1]/jrp[1]<0.8) aida.cloud1D("PFA Barrel DiJet Mass").fill(rdjm);
+         if (perfPFAD && rdjm>0 && djm>0) aida.cloud1D("Difference PFAJet and PerfJet DiJet Mass").fill((rdjm-djm)/Math.sqrt(djm));
+      }
+      
+      // Check some particle comparisons - photons first
+      int NPFAPho = phobcls.size()+phoeccls.size();
+      double PFAPhoClE = 0;
+      for (BasicCluster phobcl : phobcls)
+      {
+          PFAPhoClE += phobcl.getEnergy()*1.015*1.013;
+      }
+      for (BasicCluster phoeccl : phoeccls)
+      {
+          PFAPhoClE += phoeccl.getEnergy()*1.015*1.013;
+      }
+      
+      //  now some stuff to compare perfect reco particles to true particles
+      double perfpho = 0;
+      double perfchpE = 0;
+      double perfchpP = 0;
+      double perfneu = 0;
+      for (ReconstructedParticle perfrp : perfrps)
+      {
+          double perfpCh = perfrp.getCharge();
+//          ParticleID perfpID = perfrp.getParticleIDUsed();
+          int perfpID = Math.abs(perfrp.getParticleIDUsed().getPDG());
+//          System.out.println("Particle ID = " + perfpID);
+          double perfpE = perfrp.getEnergy();
+          Hep3Vector perfpP = perfrp.getMomentum();
+          double pP = perfpP.magnitude();
+          if (perfpCh == 0)
+          {
+              if (perfpID == 22) 
+              {
+                  perfpho += perfpE;
+              }else
+              {
+                  perfneu += perfpE;
+              }
+          } else
+          {
+              perfchpE += perfpE;
+              perfchpP += pP;
+          }
+          for (MCReconstructedParticle mcrp : mcrps)
+          {
+              MCParticle mcp = mcrp.getMCParticle();
+          }
+      }
+      
+      //  Check the cheated clusters also
+      double chclusE = 0;
+      int NPerfPho = 0;
+      double PerfPhoClE = 0;
+      for (CheatCluster chclus : chclusters)
+      {
+          chclusE += chclus.getEnergy();
+          if (chclus.getMCParticle().getCharge() == 0 && chclus.getMCParticle().getPDGID() == 22)
+          {
+              NPerfPho++;
+              PerfPhoClE += chclus.getEnergy();
+          }
+          if (chclus.getMCParticle().getCharge() != 0) 
+          {
+              double chclchpE = chclus.getEnergy();
+              double chclchpP = chclus.getMCParticle().getMomentum().magnitude();
+              if (perfPFAD) aida.cloud1D("Cheated Cluster Charge E over P").fill(chclchpE/chclchpP);
+          }
+      }
+      if (perfPFAD) aida.cloud1D("Cheated CLuster E").fill(chclusE);
+      if (perfPFAD) aida.cloud1D("Difference NPFAPhotons NPerfPhotons").fill(NPFAPho-NPerfPho);
+      if (perfPFAD) aida.cloud1D("Difference PFAPhoE PerfPhoE").fill(PFAPhoClE-PerfPhoClE);
+
+      double TPESum = perfpho+perfchpP+perfneu;
+      if (perfPFAD) aida.cloud1D("Total Perfect ESum").fill(TPESum);
+      if (perfPFAD) aida.cloud1D("Perfect Photon ESum").fill(perfpho);
+      if (perfPFAD) aida.cloud1D("Perfect Charge P ESum").fill(perfchpE);
+      if (perfPFAD) aida.cloud1D("Perfect Charge P PSum").fill(perfchpP);
+      if (perfPFAD) aida.cloud1D("Perfect E over P for Charge P").fill(perfchpP/perfchpE);
+      if (perfPFAD) aida.cloud1D("Perfect Neutral H ESum").fill(perfneu);
+      if (perfPFAD) aida.cloud1D("Perfect Charge P + Photon ESum").fill(perfchpP+perfpho);
+      if (perfPFAD) aida.cloud1D("Perf Pho ESum Ratio").fill(perfpho/TPESum);
+      if (perfPFAD) aida.cloud1D("Perf Ch P ESum Ratio").fill(perfchpP/TPESum);
+      if (perfPFAD) aida.cloud1D("Perf Neu H ESum Ratio").fill(perfneu/TPESum);
+  }
+  
+  public void setPerfPartName(String perfname)
+  {
+      _perfname = perfname;
+  }
+  public void setMCPartName(String mcname)
+  {
+      _mcname = mcname;
+  }
+  public void setPerfJetName(String perfjetname)
+  {
+      _perfjetname = perfjetname;
+  }  
+  public void setPFAJetName(String pfajetname)
+  {
+      _pfajetname = pfajetname;
+  }
+  
+}
CVSspam 0.2.8