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