Print

Print


Commit in lcsim/src/org/lcsim/contrib/Cassell/recon/Cheat on MAIN
QCalibrationFromData.java+582-5441.1 -> 1.2
Fix histgramming error

lcsim/src/org/lcsim/contrib/Cassell/recon/Cheat
QCalibrationFromData.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- QCalibrationFromData.java	8 Sep 2008 23:11:30 -0000	1.1
+++ QCalibrationFromData.java	16 Nov 2008 02:44:06 -0000	1.2
@@ -1,544 +1,582 @@
-package org.lcsim.contrib.Cassell.recon.Cheat;
-import org.lcsim.recon.cluster.analysis.*;
-import java.util.*;
-import org.lcsim.geometry.Detector;
-import org.lcsim.geometry.Subdetector;
-import org.lcsim.util.Driver;
-import org.lcsim.event.EventHeader;
-import org.lcsim.event.util.*;
-import org.lcsim.event.*;
-import org.lcsim.event.base.*;
-import org.lcsim.recon.cluster.util.*;
-import org.lcsim.geometry.IDDecoder;
-import org.lcsim.util.aida.AIDA;
-import hep.physics.vec.*;
-import Jama.Matrix;
-
-/**
- * Calculate neutral sampling fractions for each calorimeter using
- * physics data minimizing event dE/rootE squared, then a response
- * correction
- *    Ron Cassell
- */
-public class QCalibrationFromData extends Driver
-{
-    private AIDA aida = AIDA.defaultInstance();
-    IDDecoder _decoder;
-    int ievt;
-    int mx = 2000000;
-    double[][] Aph;
-    double[][] Bph;
-    double[][] Anh;
-    double[][] Bnh;
-    double ctcut = .9;
-    double Ecutnh = 2.;
-    double Ecutg = 1.;
-    double phEtot;
-    double nhEtot;
-    int hitcut = 10;
-    int nsumsph = 4;
-    int nsumsnh = 6;
-    double alphanh = -.23;
-    double alphaph = .036;
-    double phres = .17;
-    double nhres = .7;
-    int nphcbins = 20;
-    int nnhcbins = 15;
-    int nfrontecallayers = 21;
-    List<MyDoubleArray> phl;
-    List<MyDoubleArray> nhl;
-    String CheatReconRname = "ReconPerfectReconParticles";
-    String PPRPflowRname = "PPRReconParticles";
-//
-// Only allow 1 detector
-//
-    boolean dchanged;
-
-    public QCalibrationFromData()
-    {
-       Aph = new double[nsumsph][nsumsph];
-       Bph = new double[nsumsph][1];
-       Anh = new double[nsumsnh][nsumsnh];
-       Bnh = new double[nsumsnh][1];
-       phl = new ArrayList<MyDoubleArray>();
-       nhl = new ArrayList<MyDoubleArray>();
-       phEtot = 0.;
-       nhEtot = 0.;
-       dchanged = false;
-//
-// Do the cheating reconstruction (includes Digisim)
-//
-        CheatReconDriver crd = new CheatReconDriver();
-        crd.setCheatReconstructedParticleOutputName(CheatReconRname);
-        add(crd);
-        PPRDriver pprd = new PPRDriver(CheatReconRname,PPRPflowRname);
-        TrivialClusterEnergyCalculator t = new TrivialClusterEnergyCalculator();
-        pprd.setPhotonClusterEnergyCalculator(t);
-        pprd.setNeutralHadronClusterEnergyCalculator(t);
-        add(pprd);
-       ievt = 0;
-    }
-    protected void process(EventHeader event)
-    {
-       System.out.println(" Processing event "+ievt);
-       super.process(event);
-       ievt ++;
-       List<ReconstructedParticle> rlist = event.get(ReconstructedParticle.class,PPRPflowRname);
-//
-// Pick out the photons and neutral hadrons
-//
-       for(ReconstructedParticle p:rlist)
-       {
-          double E = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getEnergy(); 
-          Hep3Vector mom = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getMomentum();
-          double Mass = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getMass();
-          double Charge = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getCharge();
-          Hep3Vector Origin = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getOrigin();
-          if( (p.getMass() == 0.)&&(p.getCharge() == 0.)&&(Mass == 0) )
-          {
-             if( Math.abs(mom.z())/mom.magnitude() < ctcut)
-             {
-//
-// Have a photon to use
-//
-                double dE = p.getEnergy() - E;
-                double[] gsums = new double[nsumsph];
-                for(Cluster c:p.getClusters())
-                {
-                   for(CalorimeterHit hit:c.getCalorimeterHits())
-                   {
-                      IDDecoder idc = hit.getIDDecoder();
-                      idc.setID(hit.getCellID());
-                      int detector_index = idc.getValue("system");
-                      double[] pos = hit.getPosition();
-                      double R = Math.sqrt(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);
-                      double ctheta = Math.abs(pos[2])/R;
-                      double st = Math.sqrt(1.-ctheta*ctheta);
-                      double cb  = 1. + alphaph*(1./st - 1.);
-                      double ce  = 1. + alphaph*(1./ctheta - 1.);
-                      if(detector_index == 2)
-                      {
-                         int layer = idc.getValue("layer");
-                         if(layer < nfrontecallayers)
-                         {
-                            gsums[0] += hit.getRawEnergy()/cb;
-                         }
-                         else
-                         {
-                            gsums[1] += hit.getRawEnergy()/cb;
-                         }
-                      }
-                      else if(detector_index == 6)
-                      {
-                         int layer = idc.getValue("layer");
-                         if(layer < nfrontecallayers)
-                         {
-                            gsums[2] += hit.getRawEnergy()/ce;
-                         }
-                         else
-                         {
-                            gsums[3] += hit.getRawEnergy()/ce;
-                         }
-                      }
-                   }
-                }
-                phl.add(new MyDoubleArray(gsums,E));
-                if(E > Ecutg)
-                {
-                   phEtot += E;
-                   for(int row=0;row<nsumsph;row++)
-                   {
-                      Bph[row][0] += gsums[row];
-                      for(int col=0;col<nsumsph;col++)
-                      {
-                         Aph[row][col] += gsums[row]*gsums[col]/E;
-                      }
-                   }
-                }
-             }
-          }
-          else if( (Mass > 0.)&&(Mass < 1.)&&(p.getCharge() == 0.)&&(Charge == 0)&&(Origin.magnitude() < 10.) )
-          {
-             if( Math.abs(mom.z())/mom.magnitude() < ctcut)
-             {
-//
-// Have a neutral hadron to use
-//
-                double[] gsums = new double[nsumsnh];
-                for(Cluster c:p.getClusters())
-                {
-                   for(CalorimeterHit hit:c.getCalorimeterHits())
-                   {
-                      IDDecoder idc = hit.getIDDecoder();
-                      idc.setID(hit.getCellID());
-                      int detector_index = idc.getValue("system");
-                      if(detector_index == 2)
-                      {
-                         int layer = idc.getValue("layer");
-                         if(layer < nfrontecallayers)
-                         {
-                            gsums[0] += hit.getRawEnergy();
-                         }
-                         else
-                         {
-                            gsums[1] += hit.getRawEnergy();
-                         }
-                      }
-                      else if(detector_index == 6)
-                      {
-                         int layer = idc.getValue("layer");
-                         if(layer < nfrontecallayers)
-                         {
-                            gsums[2] += hit.getRawEnergy();
-                         }
-                         else
-                         {
-                            gsums[3] += hit.getRawEnergy();
-                         }
-                      }
-                      else if(detector_index == 3)
-                      {
-                         double[] pos = hit.getPosition();
-                         double R = Math.sqrt(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);
-                         double ctheta = Math.abs(pos[2])/R;
-                         double st = Math.sqrt(1.-ctheta*ctheta);
-                         gsums[4] += 1./(1. + alphanh*(1./st - 1.));
-                      }
-                      else if(detector_index == 7)
-                      {
-                         double[] pos = hit.getPosition();
-                         double R = Math.sqrt(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);
-                         double st = Math.abs(pos[2])/R;
-                         gsums[5] += 1./(1. + alphanh*(1./st - 1.));
-                      }
-                   }
-                }
-                nhl.add(new MyDoubleArray(gsums,E));
-                if(E > Ecutnh)
-                {
-                   nhEtot += E;
-                   for(int row=0;row<nsumsnh;row++)
-                   {
-                      Bnh[row][0] += gsums[row];
-                      for(int col=0;col<nsumsnh;col++)
-                      {
-                         Anh[row][col] += gsums[row]*gsums[col]/E;
-                      }
-                   }
-                }
-             }
-          }
-       }
-    }
-   protected void suspend()
-   {
-      Matrix mA = new Matrix(Aph);
-      Matrix mB = new Matrix(Bph);
-      Matrix x = mA.solve(mB);
-      double[] phsf = new double[nsumsph];
-      double phEmtot = 0.;
-      for(int i=0;i<nsumsph;i++)
-      {
-         phEmtot += x.get(i,0)*Bph[i][0];
-      }
-      double rat = phEmtot/phEtot;
-      for(int i=0;i<nsumsph;i++)
-      {
-         phsf[i] = rat/x.get(i,0);
-      }
-      System.out.println("*** Photons ***;");
-      System.out.println("nFrontLayersEcal: "+nfrontecallayers);
-      System.out.println("alpha: "+alphaph);
-      String sfout = "SFs: ";
-      for(int i=0;i<nsumsph-1;i++)
-      {
-         sfout += phsf[i]+",";
-      }
-      sfout += phsf[nsumsph-1];
-      System.out.println(sfout);
-      double Em = 0.;
-      for(int i=0;i<nsumsph;i++)
-      {
-         Em += phl.get(0).getVal(i)/phsf[i];
-      }
-      List<Double> phEm = new ArrayList<Double>();
-      List<Double> phE = new ArrayList<Double>();
-      Double xx = new Double(Em);
-      phEm.add(0,xx);
-      phE.add(0,new Double(phl.get(0).getE()));
-      for(int i=1;i<phl.size();i++)
-      {
-         Em = 0.;
-         for(int j=0;j<nsumsph;j++)
-         {
-            Em += phl.get(i).getVal(j)/phsf[j];
-         }
-         int k = 0;
-         for(int j=0;j<phEm.size();j++)
-         {
-            if(Em > phEm.get(j).doubleValue())break;
-            k++;
-         }
-         phEm.add(k,new Double(Em));
-         phE.add(k,new Double(phl.get(i).getE()));
-      }
-      double totEm = 0.;
-      for(int i=0;i<phEm.size();i++)
-      {
-         totEm += phEm.get(i).doubleValue();
-      }
-      double[] sEm = new double[nphcbins];
-      double[] sE = new double[nphcbins];
-      int[] N = new int[nphcbins];
-      double Emt = 0.;
-      int bin = 0;
-      double[] pbmax = {0.2,0.4,0.7,1.5,3.,8.,15.,40.,65.,1000.};
-      for(int i=0;i<phEm.size();i++)
-      {
-         double Egen = phE.get(i).doubleValue();
-         double Emeas = phEm.get(i).doubleValue();
-         double dE = Emeas - Egen;
-         int pbin = 0;
-         for(int k=0;k<pbmax.length;k++)
-	 {
-	    if(Emeas < pbmax[k])break;
-            pbin++;
-         }
-         aida.cloud1D("Photon/E",mx).fill(Egen);
-         aida.cloud1D("Photon/dE",mx).fill(dE);
-         aida.cloud1D("Photon/dE over E",mx).fill(dE/Egen);
-         aida.cloud1D("Photon/dE over rootE",mx).fill(dE/Math.sqrt(Egen));
-         aida.cloud1D("Photon/wted E",mx).fill(Egen,Egen);
-         aida.cloud1D("Photon/wted dE",mx).fill(dE,Egen);
-         aida.cloud1D("Photon/wted dE over E",mx).fill(dE/Egen,Egen);
-         aida.cloud1D("Photon/wted dE over rootE",mx).fill(dE/Math.sqrt(Egen),Egen);
-         aida.cloud1D("Photon/bin "+pbin+" dE",mx).fill(dE);
-         aida.cloud1D("Photon/bin "+pbin+" E",mx).fill(Egen);
-         aida.cloud1D("Photon/bin "+pbin+" dE over E",mx).fill(dE/Egen);
-         aida.cloud1D("Photon/bin "+pbin+" dE over rootE",mx).fill(dE/Math.sqrt(Egen));
-         aida.cloud1D("Photon/bin "+pbin+" wted E",mx).fill(Egen,Egen);
-         aida.cloud1D("Photon/bin "+pbin+" wted dE",mx).fill(dE,Egen);
-         aida.cloud1D("Photon/bin "+pbin+" wted dE over E",mx).fill(dE/Egen,Egen);
-         aida.cloud1D("Photon/bin "+pbin+" wted dE over rootE",mx).fill(dE/Math.sqrt(Egen),Egen);
-         sEm[bin] += phEm.get(i).doubleValue();
-         sE[bin] += phE.get(i).doubleValue();
-         N[bin]++;
-         Emt += phEm.get(i).doubleValue();
-         if(Emt > totEm/nphcbins*(bin+1))bin++;
-      }
-      double[] mEm = new double[nphcbins];
-      double[] mE = new double[nphcbins];
-      for(int i=0;i<nphcbins;i++)
-      {
-         int j = nphcbins - 1 - i;
-         mEm[j] = sEm[i]/N[i];
-         mE[j] = sE[i]/N[i];
-      }
-      String Emstr = "Emeas: ";
-      String Ecstr = "Ecorr: ";
-      for(int i=0;i<nphcbins-1;i++)
-      {
-         Emstr += mEm[i]+",";
-         Ecstr += mE[i]+",";
-      }
-      Emstr += mEm[nphcbins-1];
-      Ecstr += mE[nphcbins-1];
-      System.out.println(Emstr);
-      System.out.println(Ecstr);
-      mA = new Matrix(Anh);
-      mB = new Matrix(Bnh);
-      x = mA.solve(mB);
-      double[] nhsf = new double[nsumsnh];
-      double nhEmtot = 0.;
-      for(int i=0;i<nsumsnh;i++)
-      {
-         nhEmtot += x.get(i,0)*Bnh[i][0];
-      }
-      rat = nhEmtot/nhEtot;
-      for(int i=0;i<nsumsnh;i++)
-      {
-         nhsf[i] = rat/x.get(i,0);
-      }
-      System.out.println("*** Neutral hadrons ***;");
-      System.out.println("nFrontLayersEcal: "+nfrontecallayers);
-      System.out.println("alpha: "+alphanh);
-      sfout = "SFs: ";
-      for(int i=0;i<nsumsnh-1;i++)
-      {
-         sfout += nhsf[i]+",";
-      }
-      sfout += nhsf[nsumsnh-1];
-      System.out.println(sfout);
-      Em = 0.;
-      for(int i=0;i<nsumsnh;i++)
-      {
-         Em += nhl.get(0).getVal(i)/nhsf[i];
-      }
-      List<Double> nhEm = new ArrayList<Double>();
-      List<Double> nhE = new ArrayList<Double>();
-      xx = new Double(Em);
-      nhEm.add(0,xx);
-      nhE.add(0,new Double(nhl.get(0).getE()));
-      for(int i=1;i<nhl.size();i++)
-      {
-         Em = 0.;
-         for(int j=0;j<nsumsnh;j++)
-         {
-            Em += nhl.get(i).getVal(j)/nhsf[j];
-         }
-         int k = 0;
-         for(int j=0;j<nhEm.size();j++)
-         {
-            if(Em > nhEm.get(j).doubleValue())break;
-            k++;
-         }
-         nhEm.add(k,new Double(Em));
-         nhE.add(k,new Double(nhl.get(i).getE()));
-      }
-      totEm = 0.;
-      for(int i=0;i<nhEm.size();i++)
-      {
-         totEm += nhEm.get(i).doubleValue();
-      }
-      sEm = new double[nnhcbins];
-      sE = new double[nnhcbins];
-      N = new int[nnhcbins];
-      Emt = 0.;
-      bin = 0;
-      for(int i=0;i<nhEm.size();i++)
-      {
-         sEm[bin] += nhEm.get(i).doubleValue();
-         sE[bin] += nhE.get(i).doubleValue();
-         N[bin]++;
-         Emt += nhEm.get(i).doubleValue();
-         if(Emt > totEm/nnhcbins*(bin+1))bin++;
-      }
-      mEm = new double[nnhcbins];
-      mE = new double[nnhcbins];
-      for(int i=0;i<nnhcbins;i++)
-      {
-         int j = nnhcbins-1-i;
-         mEm[j] = sEm[i]/N[i];
-         mE[j] = sE[i]/N[i];
-      }
-      Emstr = "Emeas: ";
-      Ecstr = "Ecorr: ";
-      for(int i=0;i<nnhcbins-1;i++)
-      {
-         Emstr += mEm[i] + ",";
-         Ecstr += mE[i] + ",";
-      }
-      Emstr += mEm[nnhcbins-1];
-      Ecstr += mE[nnhcbins-1];
-      System.out.println(Emstr);
-      System.out.println(Ecstr);
-      Emt = 0.;
-      bin = 0;
-      double[] nbmax = {3.,8.,15.,25.,40.,60.,100.,1000.};
-       for(int i=0;i<nhEm.size();i++)
-       {
-         double Ec;
-         int ib = 0;
-         if(nhEm.get(i).doubleValue() <= mEm[0])
-         {
-            ib = -1;
-            Ec = nhEm.get(i).doubleValue()*mE[0]/mEm[0];
-         }
-         else if(nhEm.get(i).doubleValue() >= mEm[nnhcbins-1])
-         {
-            ib = 19;
-            Ec = nhEm.get(i).doubleValue()*mE[nnhcbins-1]/mEm[nnhcbins-1];
-         }
-         else
-         {
-            for(int j=1;j<nnhcbins;j++)
-            {
-               if(nhEm.get(i).doubleValue() < mEm[j])break;
-               ib++;
-            }
-            Ec = mE[ib] + (nhEm.get(i).doubleValue() - mEm[ib])*(mE[ib+1] - mE[ib])/(mEm[ib+1] - mEm[ib]);
-         }
-         int jb = bin;
-         double Egen = nhE.get(i).doubleValue();
-         double dE = (Ec - Egen);
-         int pbin = 0;
-         for(int k=0;k<nbmax.length;k++)
-	 {
-	    if(Egen < nbmax[k])break;
-            pbin++;
-         }
-         aida.cloud1D("NH/E",mx).fill(Egen);
-         aida.cloud1D("NH/dE",mx).fill(dE);
-         aida.cloud1D("NH/dE over E",mx).fill(dE/Egen);
-         aida.cloud1D("NH/dE over rootE",mx).fill(dE/Math.sqrt(Egen));
-         aida.cloud1D("NH/wted E",mx).fill(Egen,Egen);
-         aida.cloud1D("NH/wted dE",mx).fill(dE,Egen);
-         aida.cloud1D("NH/wted dE over E",mx).fill(dE/Egen,Egen);
-         aida.cloud1D("NH/wted dE over rootE",mx).fill(dE/Math.sqrt(Egen),Egen);
-         aida.cloud1D("NH/bin "+pbin+" E",mx).fill(Egen);
-         aida.cloud1D("NH/bin "+pbin+" dE",mx).fill(dE);
-         aida.cloud1D("NH/bin "+pbin+" dE over E",mx).fill(dE/Egen);
-         aida.cloud1D("NH/bin "+pbin+" dE over rootE",mx).fill(dE/Math.sqrt(Egen));
-         aida.cloud1D("NH/bin "+pbin+" wted E",mx).fill(Egen,Egen);
-         aida.cloud1D("NH/bin "+pbin+" wted dE",mx).fill(dE,Egen);
-         aida.cloud1D("NH/bin "+pbin+" wted dE over E",mx).fill(dE/Egen,Egen);
-         aida.cloud1D("NH/bin "+pbin+" wted dE over rootE",mx).fill(dE/Math.sqrt(Egen),Egen);
-         Emt += nhEm.get(i).doubleValue();
-         if(Emt > totEm/nnhcbins*(bin+1))bin++;
-      }
-   }
-   public void detectorChanged(Detector detector)
-   {
-      if(dchanged)
-      {
-	  System.out.println("Only 1 detector allowed for calibration!! Aborting");
-          System.exit(0);
-      }
-      dchanged = true;
-      Subdetector subdetector = detector.getSubdetector("EMBarrel");
-      List<Integer> changeLayers = new ArrayList<Integer>();
-      double thickness = -1.;			
-      for (int i=0, n=subdetector.getLayering().getLayerCount(); i<n; i++)
-      {
-         double thisThickness = subdetector.getLayering().getLayer(i).getThickness();
-	 if (i==0)
-	 {
-	    thickness = thisThickness;
-	 }
-								
-	 if (thisThickness != thickness)
-	 {
-	    changeLayers.add(i);
-	    thickness = thisThickness;
-	 }
-      }
-      int maxch = 1;
-      if(changeLayers.get(0) == 1)maxch = 2;
-      if(changeLayers.size() > maxch)
-      {
-	  System.out.println("Too many changes in Ecal! Aborting");
-          System.exit(0);
-      }
-      nfrontecallayers = changeLayers.get(maxch-1);
-   }
-}
-class MyDoubleArray
-{
-   double[] x;
-   double E;
-   public MyDoubleArray(double[] a,double e)
-   {
-      x = a;
-      E = e;
-   }
-   public double getVal(int i)
-   {
-      if(i < x.length)return x[i];
-      System.out.println("getVal("+i+"): out of range, returning 0.");
-      return 0.;
-   }
-   public double getE()
-   {
-      return E;
-   }
-}
+package org.lcsim.contrib.Cassell.recon.Cheat;
+import org.lcsim.recon.cluster.analysis.*;
+import java.util.*;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.Subdetector;
+import org.lcsim.util.Driver;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.util.*;
+import org.lcsim.event.*;
+import org.lcsim.event.base.*;
+import org.lcsim.recon.cluster.util.*;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.util.aida.AIDA;
+import hep.physics.vec.*;
+import Jama.Matrix;
+
+/**
+ * Calculate neutral sampling fractions for each calorimeter using
+ * physics data minimizing event dE/rootE squared, then a response
+ * correction
+ *    Ron Cassell
+ */
+public class QCalibrationFromData extends Driver
+{
+    private AIDA aida = AIDA.defaultInstance();
+    IDDecoder _decoder;
+    int ievt;
+    int mx = 2000000;
+    double[][] Aph;
+    double[][] Bph;
+    double[][] Anh;
+    double[][] Bnh;
+    double ctcut = .9;
+    double Ecutnh = 2.;
+    double Ecutg = 1.;
+    double phEtot;
+    double nhEtot;
+    int hitcut = 10;
+    int nsumsph = 4;
+    int nsumsnh = 6;
+    double alphanh = -.23;
+    double alphaph = .036;
+    double phres = .17;
+    double nhres = .7;
+    int nphcbins = 20;
+    int nnhcbins = 15;
+    int nfrontecallayers = 21;
+    List<MyDoubleArray> phl;
+    List<MyDoubleArray> nhl;
+    String CheatReconRname = "ReconPerfectReconParticles";
+    String PPRPflowRname = "PPRReconParticles";
+//
+// Only allow 1 detector
+//
+    boolean dchanged;
+
+    public QCalibrationFromData()
+    {
+       Aph = new double[nsumsph][nsumsph];
+       Bph = new double[nsumsph][1];
+       Anh = new double[nsumsnh][nsumsnh];
+       Bnh = new double[nsumsnh][1];
+       phl = new ArrayList<MyDoubleArray>();
+       nhl = new ArrayList<MyDoubleArray>();
+       phEtot = 0.;
+       nhEtot = 0.;
+       dchanged = false;
+//
+// Do the cheating reconstruction (includes Digisim)
+//
+        CheatReconDriver crd = new CheatReconDriver();
+        crd.setCheatReconstructedParticleOutputName(CheatReconRname);
+        add(crd);
+        PPRDriver pprd = new PPRDriver(CheatReconRname,PPRPflowRname);
+        TrivialClusterEnergyCalculator t = new TrivialClusterEnergyCalculator();
+        pprd.setPhotonClusterEnergyCalculator(t);
+        pprd.setNeutralHadronClusterEnergyCalculator(t);
+        add(pprd);
+       ievt = 0;
+    }
+    protected void process(EventHeader event)
+    {
+       System.out.println(" Processing event "+ievt);
+       super.process(event);
+       ievt ++;
+       List<ReconstructedParticle> rlist = event.get(ReconstructedParticle.class,PPRPflowRname);
+//
+// Pick out the photons and neutral hadrons
+//
+       for(ReconstructedParticle p:rlist)
+       {
+          double E = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getEnergy(); 
+          Hep3Vector mom = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getMomentum();
+          double Mass = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getMass();
+          double Charge = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getCharge();
+          Hep3Vector Origin = ( (MCReconstructedParticle) p.getParticles().get(0)).getMCParticle().getOrigin();
+          if( (p.getMass() == 0.)&&(p.getCharge() == 0.)&&(Mass == 0) )
+          {
+             if( Math.abs(mom.z())/mom.magnitude() < ctcut)
+             {
+//
+// Have a photon to use
+//
+                double dE = p.getEnergy() - E;
+                double[] gsums = new double[nsumsph];
+                for(Cluster c:p.getClusters())
+                {
+                   for(CalorimeterHit hit:c.getCalorimeterHits())
+                   {
+                      IDDecoder idc = hit.getIDDecoder();
+                      idc.setID(hit.getCellID());
+                      int detector_index = idc.getValue("system");
+                      double[] pos = hit.getPosition();
+                      double R = Math.sqrt(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);
+                      double ctheta = Math.abs(pos[2])/R;
+                      double st = Math.sqrt(1.-ctheta*ctheta);
+                      double cb  = 1. + alphaph*(1./st - 1.);
+                      double ce  = 1. + alphaph*(1./ctheta - 1.);
+                      if(detector_index == 2)
+                      {
+                         int layer = idc.getValue("layer");
+                         if(layer < nfrontecallayers)
+                         {
+                            gsums[0] += hit.getRawEnergy()/cb;
+                         }
+                         else
+                         {
+                            gsums[1] += hit.getRawEnergy()/cb;
+                         }
+                      }
+                      else if(detector_index == 6)
+                      {
+                         int layer = idc.getValue("layer");
+                         if(layer < nfrontecallayers)
+                         {
+                            gsums[2] += hit.getRawEnergy()/ce;
+                         }
+                         else
+                         {
+                            gsums[3] += hit.getRawEnergy()/ce;
+                         }
+                      }
+                   }
+                }
+                phl.add(new MyDoubleArray(gsums,E));
+                if(E > Ecutg)
+                {
+                   phEtot += E;
+                   for(int row=0;row<nsumsph;row++)
+                   {
+                      Bph[row][0] += gsums[row];
+                      for(int col=0;col<nsumsph;col++)
+                      {
+                         Aph[row][col] += gsums[row]*gsums[col]/E;
+                      }
+                   }
+                }
+             }
+          }
+          else if( (Mass > 0.)&&(Mass < 1.)&&(p.getCharge() == 0.)&&(Charge == 0)&&(Origin.magnitude() < 10.) )
+          {
+             if( Math.abs(mom.z())/mom.magnitude() < ctcut)
+             {
+//
+// Have a neutral hadron to use
+//
+                double[] gsums = new double[nsumsnh];
+                for(Cluster c:p.getClusters())
+                {
+                   for(CalorimeterHit hit:c.getCalorimeterHits())
+                   {
+                      IDDecoder idc = hit.getIDDecoder();
+                      idc.setID(hit.getCellID());
+                      int detector_index = idc.getValue("system");
+                      if(detector_index == 2)
+                      {
+                         int layer = idc.getValue("layer");
+                         if(layer < nfrontecallayers)
+                         {
+                            gsums[0] += hit.getRawEnergy();
+                         }
+                         else
+                         {
+                            gsums[1] += hit.getRawEnergy();
+                         }
+                      }
+                      else if(detector_index == 6)
+                      {
+                         int layer = idc.getValue("layer");
+                         if(layer < nfrontecallayers)
+                         {
+                            gsums[2] += hit.getRawEnergy();
+                         }
+                         else
+                         {
+                            gsums[3] += hit.getRawEnergy();
+                         }
+                      }
+                      else if(detector_index == 3)
+                      {
+                         double[] pos = hit.getPosition();
+                         double R = Math.sqrt(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);
+                         double ctheta = Math.abs(pos[2])/R;
+                         double st = Math.sqrt(1.-ctheta*ctheta);
+                         gsums[4] += 1./(1. + alphanh*(1./st - 1.));
+                      }
+                      else if(detector_index == 7)
+                      {
+                         double[] pos = hit.getPosition();
+                         double R = Math.sqrt(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);
+                         double st = Math.abs(pos[2])/R;
+                         gsums[5] += 1./(1. + alphanh*(1./st - 1.));
+                      }
+                   }
+                }
+                nhl.add(new MyDoubleArray(gsums,E));
+                if(E > Ecutnh)
+                {
+                   nhEtot += E;
+                   for(int row=0;row<nsumsnh;row++)
+                   {
+                      Bnh[row][0] += gsums[row];
+                      for(int col=0;col<nsumsnh;col++)
+                      {
+                         Anh[row][col] += gsums[row]*gsums[col]/E;
+                      }
+                   }
+                }
+             }
+          }
+       }
+    }
+   protected void suspend()
+   {
+      Matrix mA = new Matrix(Aph);
+      Matrix mB = new Matrix(Bph);
+      Matrix x = mA.solve(mB);
+      double[] phsf = new double[nsumsph];
+      double phEmtot = 0.;
+      for(int i=0;i<nsumsph;i++)
+      {
+         phEmtot += x.get(i,0)*Bph[i][0];
+      }
+      double rat = phEmtot/phEtot;
+      for(int i=0;i<nsumsph;i++)
+      {
+         phsf[i] = rat/x.get(i,0);
+      }
+      System.out.println("*** Photons ***;");
+      System.out.println("nFrontLayersEcal: "+nfrontecallayers);
+      System.out.println("alpha: "+alphaph);
+      String sfout = "SFs: ";
+      for(int i=0;i<nsumsph-1;i++)
+      {
+         sfout += phsf[i]+",";
+      }
+      sfout += phsf[nsumsph-1];
+      System.out.println(sfout);
+      double Em = 0.;
+      for(int i=0;i<nsumsph;i++)
+      {
+         Em += phl.get(0).getVal(i)/phsf[i];
+      }
+      List<Double> phEm = new ArrayList<Double>();
+      List<Double> phE = new ArrayList<Double>();
+      Double xx = new Double(Em);
+      phEm.add(0,xx);
+      phE.add(0,new Double(phl.get(0).getE()));
+      for(int i=1;i<phl.size();i++)
+      {
+         Em = 0.;
+         for(int j=0;j<nsumsph;j++)
+         {
+            Em += phl.get(i).getVal(j)/phsf[j];
+         }
+         int k = 0;
+         for(int j=0;j<phEm.size();j++)
+         {
+            if(Em > phEm.get(j).doubleValue())break;
+            k++;
+         }
+         phEm.add(k,new Double(Em));
+         phE.add(k,new Double(phl.get(i).getE()));
+      }
+      double totEm = 0.;
+      for(int i=0;i<phEm.size();i++)
+      {
+         totEm += phEm.get(i).doubleValue();
+      }
+      double[] sEm = new double[nphcbins];
+      double[] sE = new double[nphcbins];
+      int[] N = new int[nphcbins];
+      double Emt = 0.;
+      int bin = 0;
+      double[] pbmax = {0.2,0.4,0.7,1.5,3.,8.,15.,40.,65.,1000.};
+      aida.cloud1D("Photon/E",mx).reset();
+      aida.cloud1D("Photon/dE",mx).reset();
+      aida.cloud1D("Photon/dE over E",mx).reset();
+      aida.cloud1D("Photon/dE over rootE",mx).reset();
+      aida.cloud1D("Photon/wted E",mx).reset();
+      aida.cloud1D("Photon/wted dE",mx).reset();
+      aida.cloud1D("Photon/wted dE over E",mx).reset();
+      aida.cloud1D("Photon/wted dE over rootE",mx).reset();
+      for(int pbin=0;pbin<pbmax.length+1;pbin++)
+      {
+         aida.cloud1D("Photon/bin "+pbin+" dE",mx).reset();
+         aida.cloud1D("Photon/bin "+pbin+" E",mx).reset();
+         aida.cloud1D("Photon/bin "+pbin+" dE over E",mx).reset();
+         aida.cloud1D("Photon/bin "+pbin+" dE over rootE",mx).reset();
+         aida.cloud1D("Photon/bin "+pbin+" wted E",mx).reset();
+         aida.cloud1D("Photon/bin "+pbin+" wted dE",mx).reset();
+         aida.cloud1D("Photon/bin "+pbin+" wted dE over E",mx).reset();
+         aida.cloud1D("Photon/bin "+pbin+" wted dE over rootE",mx).reset();
+      }
+      for(int i=0;i<phEm.size();i++)
+      {
+         double Egen = phE.get(i).doubleValue();
+         double Emeas = phEm.get(i).doubleValue();
+         double dE = Emeas - Egen;
+         int pbin = 0;
+         for(int k=0;k<pbmax.length;k++)
+	 {
+	    if(Emeas < pbmax[k])break;
+            pbin++;
+         }
+         aida.cloud1D("Photon/E",mx).fill(Egen);
+         aida.cloud1D("Photon/dE",mx).fill(dE);
+         aida.cloud1D("Photon/dE over E",mx).fill(dE/Egen);
+         aida.cloud1D("Photon/dE over rootE",mx).fill(dE/Math.sqrt(Egen));
+         aida.cloud1D("Photon/wted E",mx).fill(Egen,Egen);
+         aida.cloud1D("Photon/wted dE",mx).fill(dE,Egen);
+         aida.cloud1D("Photon/wted dE over E",mx).fill(dE/Egen,Egen);
+         aida.cloud1D("Photon/wted dE over rootE",mx).fill(dE/Math.sqrt(Egen),Egen);
+         aida.cloud1D("Photon/bin "+pbin+" dE",mx).fill(dE);
+         aida.cloud1D("Photon/bin "+pbin+" E",mx).fill(Egen);
+         aida.cloud1D("Photon/bin "+pbin+" dE over E",mx).fill(dE/Egen);
+         aida.cloud1D("Photon/bin "+pbin+" dE over rootE",mx).fill(dE/Math.sqrt(Egen));
+         aida.cloud1D("Photon/bin "+pbin+" wted E",mx).fill(Egen,Egen);
+         aida.cloud1D("Photon/bin "+pbin+" wted dE",mx).fill(dE,Egen);
+         aida.cloud1D("Photon/bin "+pbin+" wted dE over E",mx).fill(dE/Egen,Egen);
+         aida.cloud1D("Photon/bin "+pbin+" wted dE over rootE",mx).fill(dE/Math.sqrt(Egen),Egen);
+         sEm[bin] += phEm.get(i).doubleValue();
+         sE[bin] += phE.get(i).doubleValue();
+         N[bin]++;
+         Emt += phEm.get(i).doubleValue();
+         if(Emt > totEm/nphcbins*(bin+1))bin++;
+      }
+      double[] mEm = new double[nphcbins];
+      double[] mE = new double[nphcbins];
+      for(int i=0;i<nphcbins;i++)
+      {
+         int j = nphcbins - 1 - i;
+         mEm[j] = sEm[i]/N[i];
+         mE[j] = sE[i]/N[i];
+      }
+      String Emstr = "Emeas: ";
+      String Ecstr = "Ecorr: ";
+      for(int i=0;i<nphcbins-1;i++)
+      {
+         Emstr += mEm[i]+",";
+         Ecstr += mE[i]+",";
+      }
+      Emstr += mEm[nphcbins-1];
+      Ecstr += mE[nphcbins-1];
+      System.out.println(Emstr);
+      System.out.println(Ecstr);
+      mA = new Matrix(Anh);
+      mB = new Matrix(Bnh);
+      x = mA.solve(mB);
+      double[] nhsf = new double[nsumsnh];
+      double nhEmtot = 0.;
+      for(int i=0;i<nsumsnh;i++)
+      {
+         nhEmtot += x.get(i,0)*Bnh[i][0];
+      }
+      rat = nhEmtot/nhEtot;
+      for(int i=0;i<nsumsnh;i++)
+      {
+         nhsf[i] = rat/x.get(i,0);
+      }
+      System.out.println("*** Neutral hadrons ***;");
+      System.out.println("nFrontLayersEcal: "+nfrontecallayers);
+      System.out.println("alpha: "+alphanh);
+      sfout = "SFs: ";
+      for(int i=0;i<nsumsnh-1;i++)
+      {
+         sfout += nhsf[i]+",";
+      }
+      sfout += nhsf[nsumsnh-1];
+      System.out.println(sfout);
+      Em = 0.;
+      for(int i=0;i<nsumsnh;i++)
+      {
+         Em += nhl.get(0).getVal(i)/nhsf[i];
+      }
+      List<Double> nhEm = new ArrayList<Double>();
+      List<Double> nhE = new ArrayList<Double>();
+      xx = new Double(Em);
+      nhEm.add(0,xx);
+      nhE.add(0,new Double(nhl.get(0).getE()));
+      for(int i=1;i<nhl.size();i++)
+      {
+         Em = 0.;
+         for(int j=0;j<nsumsnh;j++)
+         {
+            Em += nhl.get(i).getVal(j)/nhsf[j];
+         }
+         int k = 0;
+         for(int j=0;j<nhEm.size();j++)
+         {
+            if(Em > nhEm.get(j).doubleValue())break;
+            k++;
+         }
+         nhEm.add(k,new Double(Em));
+         nhE.add(k,new Double(nhl.get(i).getE()));
+      }
+      totEm = 0.;
+      for(int i=0;i<nhEm.size();i++)
+      {
+         totEm += nhEm.get(i).doubleValue();
+      }
+      sEm = new double[nnhcbins];
+      sE = new double[nnhcbins];
+      N = new int[nnhcbins];
+      Emt = 0.;
+      bin = 0;
+      for(int i=0;i<nhEm.size();i++)
+      {
+         sEm[bin] += nhEm.get(i).doubleValue();
+         sE[bin] += nhE.get(i).doubleValue();
+         N[bin]++;
+         Emt += nhEm.get(i).doubleValue();
+         if(Emt > totEm/nnhcbins*(bin+1))bin++;
+      }
+      mEm = new double[nnhcbins];
+      mE = new double[nnhcbins];
+      for(int i=0;i<nnhcbins;i++)
+      {
+         int j = nnhcbins-1-i;
+         mEm[j] = sEm[i]/N[i];
+         mE[j] = sE[i]/N[i];
+      }
+      Emstr = "Emeas: ";
+      Ecstr = "Ecorr: ";
+      for(int i=0;i<nnhcbins-1;i++)
+      {
+         Emstr += mEm[i] + ",";
+         Ecstr += mE[i] + ",";
+      }
+      Emstr += mEm[nnhcbins-1];
+      Ecstr += mE[nnhcbins-1];
+      System.out.println(Emstr);
[truncated at 1000 lines; 130 more skipped]
CVSspam 0.2.8