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; } + + }