Author: [log in to unmask]
Date: Fri Nov 20 21:12:03 2015
New Revision: 3970
Log:
code give an rf time but does not fit-only using initial values
Modified:
java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java
Modified: java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java (original)
+++ java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java Fri Nov 20 21:12:03 2015
@@ -29,6 +29,7 @@
static final int SLOT=13;
static final int CHANNELS[]={0,1};
static final double NSPERSAMPLE=4;
+
// boilerplate:
AIDA aida = AIDA.defaultInstance();
@@ -61,8 +62,9 @@
// we found a RF readout, fit it:
foundRf=true;
- IFitResult fit=fitPulse(hit);
- times[ii]=NSPERSAMPLE*fit.fittedParameter("time");
+ times[ii] = fitPulse(hit);
+ //System.out.println("rf times:\t"+times[ii]);
+
break;
}
}
@@ -79,30 +81,93 @@
/*
* Perform the fit to the RF pulse:
*/
- public IFitResult fitPulse(FADCGenericHit hit) {
-
+ public double fitPulse(FADCGenericHit hit) {
fitData.clear();
final int adcSamples[]=hit.getData();
-
- // TODO: only add those ADC values which are to be fitted:
- for (int ii=0; ii<adcSamples.length; ii++) {
- final int jj=fitData.size();
- fitData.addPoint();
- fitData.point(jj).coordinate(0).setValue(ii);
- fitData.point(jj).coordinate(1).setValue(adcSamples[ii]);
- fitData.point(jj).coordinate(1).setErrorMinus(NOISE);
- fitData.point(jj).coordinate(1).setErrorPlus(NOISE);
+ //stores the location of the peak bins
+ int iz=0;
+ int peakBin[]={-999,-999,-999};
+ final int threshold = 300;
+ double fitThresh[]={-999,-999,-999};
+ double pedVal[]={-999,-999,-999};
+ for (int ii=4; ii<(adcSamples.length-1); ii++) {
+ //looks for peak bins in time spectra (not more than 3)
+ //System.out.println("Samp:\t"+ii+"\t"+adcSamples[ii]);
+ if (iz==3){break;}
+ if (adcSamples[ii+1]>0 && adcSamples[ii-1]>0 && adcSamples[ii]>threshold && ii>12){
+ if ((adcSamples[ii]>adcSamples[ii+1] && adcSamples[ii]>adcSamples[ii-1])
+ ||((adcSamples[ii]>adcSamples[ii+1] && adcSamples[ii]==adcSamples[ii-1])
+ ||(adcSamples[ii]==adcSamples[ii+1] && adcSamples[ii]>adcSamples[ii-1]))){
+ //System.out.println("peak:\t"+iz);
+ peakBin[iz]=ii;
+ iz++;
+ }
+ }
}
- // TODO: properly initialize fit parameters:
- fitFunction.setParameter("time",0.0);
- fitFunction.setParameter("pedestal",0.0);
- fitFunction.setParameter("slope",100.0);
+ int jj=0;
+ //each signal will always have 2-3 pulses in the window. ik=1 selects the second pulse (closest to middle of window)
+ int ik=1;
+ pedVal[ik] = (adcSamples[peakBin[ik]-6]+adcSamples[peakBin[ik]-7]+adcSamples[peakBin[ik]-8]+adcSamples[peakBin[ik]-9])/4.0;
+ fitThresh[ik]= (adcSamples[peakBin[ik]]-pedVal[ik])/3.0;
+
+ //calc initial values along the way:
+ double itime = -999;
+ double islope = -999;
+
+ //find the points of the peak bin to peak bin-5
+ for (int ll=0; ll<5; ll++){
+ if ((adcSamples[peakBin[ik]-5+ll]) > fitThresh[ik]){
+ //get one below fit threshold and two points above
+ if(jj==0 && (adcSamples[peakBin[ik]-6+ll] > pedVal[ik])){
+ final int zz=fitData.size();
+ fitData.addPoint();
+ //System.out.println("fit points:\t"+zz+"\t"+(peakBin[ik]-6+ll));
+ fitData.point(zz).coordinate(0).setValue(peakBin[ik]-6+ll);
+ fitData.point(zz).coordinate(1).setValue(adcSamples[peakBin[ik]-6+ll]);
+ fitData.point(zz).coordinate(1).setErrorMinus(0.0);
+ fitData.point(zz).coordinate(1).setErrorPlus(0.0);
+ jj++;
+ }
+ final int zz=fitData.size();
+ fitData.addPoint();
+ //System.out.println("fit points:\t"+zz+"\t"+(peakBin[ik]-5+ll));
+ if (zz==1){
+ itime = peakBin[ik]-5+ll;
+ islope =((double) (adcSamples[peakBin[ik]-5+ll]-adcSamples[peakBin[ik]-6+ll]))/(peakBin[ik]-5+ll-(peakBin[ik]-6+ll));
+ }
+ fitData.point(zz).coordinate(0).setValue(peakBin[ik]-5+ll);
+ fitData.point(zz).coordinate(1).setValue(adcSamples[peakBin[ik]-5+ll]);
+ fitData.point(zz).coordinate(1).setErrorMinus(0.0);
+ fitData.point(zz).coordinate(1).setErrorPlus(0.0);
+
+ jj++;
+ if (jj==3) {break;}
+ }
+ }
+
+ double icept = itime*(1-islope);
+ //System.out.println("initial parameters, icept:\t"+icept+"\t islope:\t"+islope+"\t itime:\t"+itime);
+ // properly initialize fit parameters:
+ fitFunction.setParameter("time",itime);
+ fitFunction.setParameter("intercept",icept);
+ fitFunction.setParameter("slope",islope);
// this used to be turned on somewhere else on every event, dunno if it still is:
//Logger.getLogger("org.freehep.math.minuit").setLevel(Level.OFF);
- return fitter.fit(fitData,fitFunction);
+ IFitResult fitResults = fitter.fit(fitData,fitFunction);
+
+ //choose to get the time value at this location on the fit:
+ double halfVal = (adcSamples[peakBin[1]]+pedVal[1])/2.0;
+ System.out.println("Fit results:\t"+fitResults.fittedParameter("intercept")+"\t"+fitResults.fittedParameter("slope"));
+ System.out.println("Half height:\t"+halfVal);
+ return NSPERSAMPLE*(halfVal-fitResults.fittedParameter("intercept"))/fitResults.fittedParameter("slope");
+
+
}
+
+
+
}
|