Author: [log in to unmask]
Date: Sun May 24 14:17:59 2015
New Revision: 3017
Log:
separate class for pulse fitting
Added:
java/trunk/users/src/main/java/org/hps/users/baltzell/EcalPulseFitter.java
Added: java/trunk/users/src/main/java/org/hps/users/baltzell/EcalPulseFitter.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/baltzell/EcalPulseFitter.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/baltzell/EcalPulseFitter.java Sun May 24 14:17:59 2015
@@ -0,0 +1,156 @@
+package org.hps.users.baltzell;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IDataPointSet;
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFitter;
+import hep.aida.IFunction;
+import hep.aida.IFunctionFactory;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.lcsim.util.aida.AIDA;
+
+public class EcalPulseFitter {
+
+ AIDA aida = AIDA.defaultInstance();
+ IAnalysisFactory analysisFactory = aida.analysisFactory();
+ IFunctionFactory functionFactory = analysisFactory.createFunctionFactory(null);
+ IFitFactory fitFactory = analysisFactory.createFitFactory();
+ IFitter fitter=fitFactory.createFitter();
+ IFunction fitFunction=new Ecal3PoleFunction();
+ IDataPointSet fitData=aida.analysisFactory().createDataPointSetFactory(null).create("ADC DataPointSet", 2);
+
+ private final int nsPerSample=4;
+ public int debug = 0;
+ public String fitFileName = null;
+ public FileWriter fitFileWriter = null;
+ public boolean fixShapeParameter = false;
+ final private double threePoleWidth=2.478;
+
+
+ public IFitResult fitPulse(short samples[],int threshCross,double maxADC,double noise) {
+
+ if (debug>0) System.err.println("FITTING.....................................................");
+
+ final int threshRange[]={6,25};
+ final int fitRange[]={-10,15};
+ final int pedRange[]={-10,-5};
+
+ // don't bother with pulses far from trigger:
+ if (threshCross < threshRange[0] || threshCross > threshRange[1]) return null;
+
+ // calculate pedestal for initializing fit parameters:
+ int nped=0;
+ double ped=0;
+ for (int ii=threshCross+pedRange[0]; ii<threshCross+pedRange[1]; ii++)
+ {
+ if (ii<0) continue;
+ if (ii>=samples.length) break;
+ ped += samples[ii];
+ nped++;
+ }
+
+ // don't bother trying to fit:
+ if (nped==0) return null;
+ ped /= nped;
+
+ // choose points to fit and get starting value for pulse integral:
+ fitData.clear();
+ int nFitPoints=0;
+ int sumADC=0;
+// int maxADC=0;
+ for (int ii=threshCross+fitRange[0]; ii<threshCross+fitRange[1]; ii++)
+ {
+ if (ii<0) continue;
+ if (ii>=samples.length) break;
+ if (debug>0) System.err.print(ii+":"+samples[ii]+" ");
+// if (samples[ii] > maxADC) maxADC=samples[ii];
+ sumADC += samples[ii];
+ fitData.addPoint();
+ fitData.point(nFitPoints).coordinate(0).setValue(ii);
+ fitData.point(nFitPoints).coordinate(1).setValue(samples[ii]);
+ fitData.point(nFitPoints).coordinate(1).setErrorMinus(noise);
+ fitData.point(nFitPoints).coordinate(1).setErrorPlus(noise);
+ nFitPoints++;
+ }
+ if (debug>0) System.err.print("\n");
+
+ // don't bother trying to fit:
+ if (nFitPoints < 10) return null;
+ if (maxADC < ped) return null;
+
+ if (debug>0) System.err.println("------- "+ped+" "+threshCross+" "+maxADC);
+
+ final double pulseIntegral = sumADC-ped*nFitPoints;
+
+ // initialize parameters:
+ fitFunction.setParameter("pedestal",ped);
+ fitFunction.setParameter("time0",(double)threshCross-2);
+ fitFunction.setParameter("integral",pulseIntegral>0 ? pulseIntegral : 2);
+ fitFunction.setParameter("width",threePoleWidth);
+
+ // constrain parameters:
+ fitter.fitParameterSettings("integral").setBounds(0,999999);
+ fitter.fitParameterSettings("time0").setBounds(1,30);
+ fitter.fitParameterSettings("width").setBounds(0.1,5);
+ if (fixShapeParameter) fitter.fitParameterSettings("width").setFixed(true);
+
+ ((Ecal3PoleFunction)fitFunction).setDebug(debug>1);
+
+ if (debug>0) {
+ System.err.println(String.format("A= %8.2f",fitFunction.parameter("integral")));
+ System.err.println(String.format("T= %8.2f",fitFunction.parameter("time0")*4));
+ System.err.println(String.format("P= %8.2f",fitFunction.parameter("pedestal")));
+ System.err.println(String.format("S= %8.2f",fitFunction.parameter("width")));
+ } else Logger.getLogger("org.freehep.math.minuit").setLevel(Level.OFF);
+
+ IFitResult fitResult = fitter.fit(fitData,fitFunction);
+ writeFit(samples,fitResult);
+
+ if (debug>0) {
+ final double P = fitResult.fittedParameter("pedestal");
+ final double I = fitResult.fittedParameter("integral");
+ final double T = fitResult.fittedParameter("time0")*nsPerSample;
+ final double S = fitResult.fittedParameter("width");
+ final double Q = fitResult.quality();
+ final double E[] = fitResult.errors();
+
+ if (debug>0) {
+ System.err.println(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;");
+ System.err.println(String.format("I = %8.2f %8.2f",I,sumADC-P*30));
+ System.err.println(String.format("T = %8.2f %8.2f",T,threshCross));
+ System.err.println(String.format("P = %8.2f %8.2f",P,ped));
+ System.err.println(String.format("S = %8.2f %8.2f",S,threePoleWidth));
+ System.err.println(String.format("M = %8.2f",maxADC-P));
+ }
+ }
+
+ return fitResult;
+ }
+
+
+ public void writeFit(short samples[],IFitResult fit) {
+ if (fitFileName == null) return;
+ if (fitFileWriter == null) {
+ try { fitFileWriter=new FileWriter(fitFileName); }
+ catch (IOException ee) { throw new RuntimeException("Error opening file "+fitFileName,ee); }
+ }
+ try {
+ for (final short ss : samples) fitFileWriter.write(String.format("%6d ",ss));
+ fitFileWriter.write(String.format("%8.3f",fit.fittedParameter("integral")));
+ fitFileWriter.write(String.format("%8.3f",fit.fittedParameter("time0")));
+ fitFileWriter.write(String.format("%8.3f",fit.fittedParameter("pedestal")));
+ fitFileWriter.write(String.format("%8.3f",fit.fittedParameter("width")));
+ fitFileWriter.write(String.format("%8.3f",fit.quality()));
+ fitFileWriter.write("\n");
+ } catch (IOException ee) {
+ throw new RuntimeException("Error writing file "+fitFileName,ee);
+ }
+ }
+
+}
|