Print

Print


Author: [log in to unmask]
Date: Fri Dec 12 16:13:23 2014
New Revision: 1708

Log:
Snapshot of known good version of MIP analysis.

Added:
    java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/LandauFitFunction.java
      - copied, changed from r1707, java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeSignalFitFunction.java
    java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/MoyalFitFunction.java
Removed:
    java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeSignalFitFunction.java
Modified:
    java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/CosmicClusterDriver.java
    java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/CosmicClusterPlotsDriver.java
    java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeADCProfileDriver.java
    java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeHitSelectionDriver.java
    java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeSignalFitDriver.java

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/CosmicClusterDriver.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/CosmicClusterDriver.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/CosmicClusterDriver.java	Fri Dec 12 16:13:23 2014
@@ -45,8 +45,8 @@
     String inputHitCollectionName = "EcalCosmicCalHits";
     String outputClusterCollectionName = "EcalCosmicClusters";
     String ecalName = "Ecal";
-    HPSEcal3 ecal = null;
-    IIdentifierHelper helper = null;
+    HPSEcal3 ecal;
+    IIdentifierHelper helper;
     int minimumClusterSize = 3;
     int minimumRows = 3;
     int maximumHitsPerRow = 2;

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/CosmicClusterPlotsDriver.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/CosmicClusterPlotsDriver.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/CosmicClusterPlotsDriver.java	Fri Dec 12 16:13:23 2014
@@ -6,6 +6,7 @@
 import hep.aida.IFitter;
 import hep.aida.IFunction;
 import hep.aida.IFunctionFactory;
+import hep.aida.IHistogram1D;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterFactory;
 import hep.aida.IPlotterStyle;
@@ -41,8 +42,9 @@
  */
 public class CosmicClusterPlotsDriver extends Driver {
 
-    EcalConditions conditions = null;
-    EcalChannelCollection channels = null;
+    EcalConditions conditions;
+    EcalChannelCollection channels;
+    
     IProfile1D combinedSignalProfile;
     Map<EcalChannel, IProfile1D> adcProfiles = new HashMap<EcalChannel, IProfile1D>();
     AIDA aida = AIDA.defaultInstance();
@@ -50,6 +52,16 @@
     IFunctionFactory functionFactory = aida.analysisFactory().createFunctionFactory(null);
     IFitFactory fitFactory = aida.analysisFactory().createFitFactory();
     IPlotterFactory plotterFactory = aida.analysisFactory().createPlotterFactory();
+    IFitter channelFitter = fitFactory.createFitter();
+    IFunction channelFitFunction = new MoyalFitFunction();
+    IFitResult combinedFitResult;
+    double combinedMpv;
+    double combinedWidth;    
+    IHistogram1D fitMpvH1D;
+    IHistogram1D fitWidthH1D;
+    IHistogram1D fitMpvPullH1D;
+    IHistogram1D fitWidthPullH1D;
+    
     String inputClusterCollectionName = "EcalCosmicClusters";
     String rawHitsCollectionName = "EcalCosmicReadoutHits";
     boolean doFits = true;
@@ -83,14 +95,28 @@
     }
     
     public void startOfData() {
-        combinedSignalProfile = aida.profile1D(inputClusterCollectionName + "/Combined Signal Profile", 100, 0., 100.);
+        // Setup combined signal fit profile.
+        combinedSignalProfile = aida.profile1D(inputClusterCollectionName + "/Combined Signal Profile", 100, -0.5, 99.5);
+        
+        // Set channel fit global parameters.
+        channelFitFunction.setParameter("mpv", 48);
+        channelFitFunction.setParameter("width", 2);
+        channelFitFunction.setParameter("norm", 60.0);        
+        //channelFitter.fitParameterSettings("mpv").setFixed(true);
+        //channelFitter.fitParameterSettings("width").setFixed(true);
+        
+        fitMpvH1D = aida.histogram1D(inputClusterCollectionName + "/Fit MPV", 100, 40., 50.);
+        fitWidthH1D = aida.histogram1D(inputClusterCollectionName + "/Fit Width", 100, 1., 3.);
+        
+        fitMpvPullH1D = aida.histogram1D(inputClusterCollectionName + "/Fit MPV Pull", 200, -10., 10.);
+        fitWidthPullH1D = aida.histogram1D(inputClusterCollectionName + "/Fit Width Pull", 200, -10., 10.);
     }
 
     public void detectorChanged(Detector detector) {
         conditions = ConditionsManager.defaultInstance().getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
         channels = conditions.getChannelCollection();
         for (EcalChannel channel : conditions.getChannelCollection()) {
-            IProfile1D profile = aida.profile1D(inputClusterCollectionName + "/ADC Values : Channel " + String.format("%03d", channel.getChannelId()), 100, 0, 100);
+            IProfile1D profile = aida.profile1D(inputClusterCollectionName + "/ADC Values : Channel " + String.format("%03d", channel.getChannelId()), 100, -0.5, 99.5);
             profile.annotation().addItem("xAxisLabel", "ADC Sample");
             profile.annotation().addItem("yAxisLabel", "Counts");
             adcProfiles.put(channel, profile);
@@ -167,24 +193,26 @@
         buffer.append("ecal_channel_id t0 pulse_width");
         buffer.append('\n');
         
-        AbstractIFunction fitFunction = new RawModeSignalFitFunction();
-        functionFactory.catalog().add("ecal_fit_function", fitFunction);
+        // Do combined fit and set class variables so they are available in channel fit method.
+        combinedFitResult = fitCombinedSignalProfile(this.combinedSignalProfile);
+        combinedMpv = combinedFitResult.fittedFunction().parameter("mpv");
+        combinedWidth = combinedFitResult.fittedFunction().parameter("width");
+        
         for (Entry<EcalChannel, IProfile1D> entry : this.adcProfiles.entrySet()) {
-            doFit(entry.getKey(), entry.getValue());
-        }                
-        
-        fitCombinedSignalProfile(this.combinedSignalProfile);
-    }
-    
-    public void fitCombinedSignalProfile(IProfile1D combinedSignalProfile) {
-        IFunction function = functionFactory.createFunctionByName("ecal_fit_function", "ecal_fit_function");
-        function.setParameter("mean", 46);
-        function.setParameter("sigma", 2);
-        function.setParameter("pedestal", 100);
-        function.setParameter("norm", 60.0);
+            fitChannelProfile(entry.getKey(), entry.getValue());
+        }                                
+    }
+    
+    public IFitResult fitCombinedSignalProfile(IProfile1D combinedSignalProfile) {
+        
+        IFunction combinedFitFunction = new MoyalFitFunction();
+        combinedFitFunction.setParameter("mpv", 46);
+        combinedFitFunction.setParameter("width", 2);
+        combinedFitFunction.setParameter("pedestal", 100);
+        combinedFitFunction.setParameter("norm", 60.0);
                                
         IFitter fitter = fitFactory.createFitter();                       
-        IFitResult fitResult = fitter.fit(combinedSignalProfile, function);        
+        IFitResult fitResult = fitter.fit(combinedSignalProfile, combinedFitFunction);        
         
         if (printFitResults) {
             System.out.println();
@@ -204,6 +232,7 @@
         plotStyle.statisticsBoxStyle().setVisible(true);
         
         plotter.createRegion();
+        plotStyle.dataStyle().errorBarStyle().setVisible(false);
         plotter.region(0).plot(combinedSignalProfile, plotStyle);
         plotter.region(0).plot(fitResult.fittedFunction(), functionStyle);
         try {
@@ -212,27 +241,33 @@
             throw new RuntimeException(e);
         }        
                 
-        buffer.append("Combined Signal Profile " + fitResult.fittedFunction().parameter("mean") + " " + fitResult.fittedFunction().parameter("sigma"));
+        buffer.append("Combined Signal Profile " + fitResult.fittedFunction().parameter("mpv") + " " + fitResult.fittedFunction().parameter("width"));
         buffer.append('\n');
-    }
-    
-    public void doFit(EcalChannel channel, IProfile1D profile) {
-        
-        IFunction function = functionFactory.createFunctionByName("ecal_fit_function", "ecal_fit_function");
-        function.setParameter("mean", 48);
-        function.setParameter("sigma", 2);
-        function.setParameter("pedestal", conditions.getChannelConstants(channel).getCalibration().getPedestal());
-        function.setParameter("norm", 60.0);
+        
+        return fitResult;
+    }
+    
+    public void fitChannelProfile(EcalChannel channel, IProfile1D profile) {
+        
+        if (profile.entries() == 0) {
+            System.err.println("No data for channel " + channel.getChannelId() + " so fit is skipped!");
+            return;
+        }
+        
+        channelFitFunction.setParameter("pedestal", conditions.getChannelConstants(channel).getCalibration().getPedestal());        
                                
-        IFitter fitter = fitFactory.createFitter();                       
-        IFitResult fitResult = fitter.fit(profile, function);        
+        channelFitter = fitFactory.createFitter();                       
+        IFitResult fitResult = channelFitter.fit(profile, channelFitFunction);        
         
         if (printFitResults) {
-            System.out.println();
             System.out.println("Printing fit result for channel " + channel.getChannelId());
             ((FitResult)fitResult).printResult();
-            System.out.println();
-        }
+        }
+        
+        fitMpvH1D.fill(fitResult.fittedFunction().parameter("mpv"));
+        fitWidthH1D.fill(fitResult.fittedFunction().parameter("width"));        
+        fitMpvPullH1D.fill((fitResult.fittedFunction().parameter("mpv") - this.combinedMpv) / fitResult.errors()[0]);
+        fitWidthPullH1D.fill((fitResult.fittedFunction().parameter("width") - this.combinedWidth) / fitResult.errors()[1]);
                        
         IPlotter plotter = plotterFactory.create();
         IPlotterStyle functionStyle = plotterFactory.createPlotterStyle();
@@ -253,7 +288,7 @@
             throw new RuntimeException(e);
         }        
                 
-        buffer.append(channel.getChannelId() + " " + fitResult.fittedFunction().parameter("mean") + " " + fitResult.fittedFunction().parameter("sigma"));
-        buffer.append('\n');        
+        buffer.append(channel.getChannelId() + " " + fitResult.fittedFunction().parameter("mpv") + " " + fitResult.fittedFunction().parameter("width"));
+        buffer.append('\n');
     }
 }

Copied: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/LandauFitFunction.java (from r1707, java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeSignalFitFunction.java)
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeSignalFitFunction.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/LandauFitFunction.java	Fri Dec 12 16:13:23 2014
@@ -20,7 +20,7 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Tim Nelson <[log in to unmask]>
  */
-public class RawModeSignalFitFunction extends AbstractIFunction {
+public class LandauFitFunction extends AbstractIFunction {
 
     // This is the backing function used to get the Landau PDF values.
     LandauPdf landauPdf = new LandauPdf();    
@@ -28,7 +28,7 @@
     /**
      * No argument constructor.
      */
-    public RawModeSignalFitFunction() {
+    public LandauFitFunction() {
         this("");
     }
     
@@ -37,7 +37,7 @@
      * The no arg constructor uses this one.
      * @param title The title of the function.
      */
-    public RawModeSignalFitFunction(String title) {
+    public LandauFitFunction(String title) {
         super();                
         this.variableNames = new String[] { "x0" };
         this.parameterNames = new String[] { "mean", "sigma", "norm", "pedestal" };        

Added: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/MoyalFitFunction.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/MoyalFitFunction.java	(added)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/MoyalFitFunction.java	Fri Dec 12 16:13:23 2014
@@ -0,0 +1,31 @@
+package org.hps.analysis.ecal.cosmic;
+
+import hep.aida.ref.function.AbstractIFunction;
+
+public class MoyalFitFunction extends AbstractIFunction {
+
+    /**
+     * No argument constructor.
+     */
+    public MoyalFitFunction() {
+        this("");
+    }
+    
+    /**
+     * Constructor with function title.
+     * The no arg constructor uses this one.
+     * @param title The title of the function.
+     */
+    public MoyalFitFunction(String title) {
+        super();                
+        this.variableNames = new String[] { "x0" };
+        this.parameterNames = new String[] { "mpv", "width", "norm", "pedestal" };
+        init(title);
+    }
+    
+    @Override
+    public double value(double[] x) {
+        double a = -(x[0] - this.parameter("mpv")) / this.parameter("width");
+        return this.parameter("pedestal") + this.parameter("norm") * (1 / (Math.sqrt(2 * Math.PI) * this.parameter("width"))) * Math.exp(-0.5 * (Math.exp(a) - a));
+    }                  
+}

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeADCProfileDriver.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeADCProfileDriver.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeADCProfileDriver.java	Fri Dec 12 16:13:23 2014
@@ -39,7 +39,8 @@
         conditions = ConditionsManager.defaultInstance().getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
         channels = conditions.getChannelCollection();
         for (EcalChannel channel : conditions.getChannelCollection()) {            
-            adcProfiles.put(channel, aida.profile1D(inputHitsCollectionName + "/ADC Values : " + String.format("%03d", channel.getChannelId()), 100, 0, 100));
+            // Create ADC profile histogram, assuming ADC sample values of 0 to 99, with profile range -0.5 to 99.5, so bins are centered.
+            adcProfiles.put(channel, aida.profile1D(inputHitsCollectionName + "/ADC Values : " + String.format("%03d", channel.getChannelId()), 100, -0.5, 99.5));
         }
     }
 

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeHitSelectionDriver.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeHitSelectionDriver.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeHitSelectionDriver.java	Fri Dec 12 16:13:23 2014
@@ -30,21 +30,21 @@
  */
 public class RawModeHitSelectionDriver extends Driver {
 
-    EcalConditions conditions = null;
-    EcalChannelCollection channels = null;
-        
+    EcalConditions conditions;
+    EcalChannelCollection channels;
+    
+    HPSEcal3 ecal;
+    static String ecalName = "Ecal";
+    
     AIDA aida = AIDA.defaultInstance();
     IAnalysisFactory analysisFactory = aida.analysisFactory();
+    
     double sigmaThreshold = 2.5;
-    
     int minimumSelectedSamples = 3;
     int minimumNumberOfHits = 3;
-    int minNeighbors = 2;
     String outputHitsCollectionName = "EcalCosmicReadoutHits";
     String inputHitsCollectionName = "EcalReadoutHits";
-    HPSEcal3 ecal = null;
-    static String ecalName = "Ecal";   
-
+           
     /**
      * Set the sigma threshold for an ADC value.
      * @param sigmaThreshold The sigma threshold.

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeSignalFitDriver.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeSignalFitDriver.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/cosmic/RawModeSignalFitDriver.java	Fri Dec 12 16:13:23 2014
@@ -8,6 +8,7 @@
 import hep.aida.IFunction;
 import hep.aida.IFunctionFactory;
 import hep.aida.IHistogram1D;
+import hep.aida.ref.fitter.FitResult;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -146,13 +147,13 @@
     public void startOfData() {
         adcDataPointSet = aida.analysisFactory().createDataPointSetFactory(null).create("ADC DataPointSet", 2);
         
-        fitFunction = new RawModeSignalFitFunction();
-        fitFunction.setParameter("mean", signalMean);
-        fitFunction.setParameter("sigma", signalSigma);
-        fitFunction.setParameter("norm", norm);
+        fitFunction = new MoyalFitFunction();        
+        fitFunction.setParameter("mpv", signalMean);
+        fitFunction.setParameter("width", signalSigma);
+        fitFunction.setParameter("norm", norm);                
         
-        fitter.fitParameterSettings("mean").setFixed(true);
-        fitter.fitParameterSettings("sigma").setFixed(true);
+        fitter.fitParameterSettings("mpv").setFixed(true);
+        fitter.fitParameterSettings("width").setFixed(true);
         if (fixPedestal) {
             fitter.fitParameterSettings("pedestal").setFixed(true);
         }
@@ -195,6 +196,8 @@
                     
                     // Fit the ADC signal.
                     IFitResult fitResult = fitAdcSamples(channel, adcDataPointSet);
+                                        
+                    ((FitResult)fitResult).printResult();
                      
                     // Calculate the signal significance which is norm over error.
                     double signalSignificance = fitResult.fittedParameter("norm") / fitResult.errors()[2];
@@ -238,4 +241,6 @@
         this.pedestalNormHistograms.get(channel).fill(fitResult.fittedParameter("pedestal"));
         return fitResult;
     }
+    
+    
 }