Author: [log in to unmask]
Date: Sat Nov 21 15:16:29 2015
New Revision: 3973
Log:
still fixing adc samples array, resolution worse than in c code
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 Sat Nov 21 15:16:29 2015
@@ -63,7 +63,9 @@
// we found a RF readout, fit it:
foundRf=true;
times[ii] = fitPulse(hit);
- //System.out.println("rf times:\t"+times[ii]);
+ if (ii==1){
+ System.out.println(times[1]-times[0]);
+ }
break;
}
@@ -84,21 +86,23 @@
public double fitPulse(FADCGenericHit hit) {
fitData.clear();
final int adcSamples[]=hit.getData();
- //stores the location of the peak bins
+ //stores the number of peaks
int iz=0;
- int peakBin[]={-999,-999,-999};
+ int peakBin[]={-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);
+ double fitThresh[]={-999,-999};
+ double pedVal[]={-999,-999};
+
+ //use this loop to look for bins containing the peaks (2-3 peaks)
+ for (int ii=4; ii<adcSamples.length-4; ii++) {
+ //after 2 peaks, stop looking for more
+ if (iz==2){break;}
+ //System.out.println("nsamp:\t"+ii+"\t"+adcSamples[ii]+"\tplus 1:\t"+adcSamples[ii+1]+"\tminus 1:\t"+adcSamples[ii-1]);
+ if ((adcSamples[ii+1]>0) && (adcSamples[ii-1]>0) && (adcSamples[ii]>threshold) && ii>12){
+ //System.out.println("Passed 1st condition!\t"+iz);
+ if ((adcSamples[ii]>adcSamples[ii+1]) && (adcSamples[ii]>adcSamples[ii-1]) ){
+ //System.out.println("iz:\t"+iz);
+// ||((adcSamples[ii]==adcSamples[ii+1] && adcSamples[ii]>adcSamples[ii-1]))){//not in c code
peakBin[iz]=ii;
iz++;
}
@@ -106,50 +110,51 @@
}
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;
+ //choose peak closest to center of window (second peak, ik=1)
+ final 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;
+ fitThresh[ik]= (adcSamples[peakBin[ik]]+pedVal[ik])/3.0;
- //calc initial values along the way:
- double itime = -999;
- double islope = -999;
+ //calc initial values along the way, we find/fit 3 points:
+ double itime[] = {-999,-999,-999};
+ double ifadc[] = {-999,-999,-999};
- //find the points of the peak bin to peak bin-5
+ //find the points of the peak bin to peak bin-5 (look backwards to forwards)
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));
+ //System.out.println("fit points:\t"+zz+"\t"+(peakBin[ik]-6+ll)+"\t"+adcSamples[peakBin[ik]-6+ll]);
+ itime[zz] = peakBin[ik]-6+ll;
+ ifadc[zz] = adcSamples[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);
+ fitData.point(zz).coordinate(1).setErrorMinus(NOISE);
+ fitData.point(zz).coordinate(1).setErrorPlus(NOISE);
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));
- }
+ //System.out.println("fit points:\t"+zz+"\t"+(peakBin[ik]-5+ll)+"\t"+adcSamples[peakBin[ik]-5+ll]);
+ itime[zz] = peakBin[ik]-5+ll;
+ ifadc[zz] = adcSamples[peakBin[ik]-5+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);
+ fitData.point(zz).coordinate(1).setErrorMinus(NOISE);
+ fitData.point(zz).coordinate(1).setErrorPlus(NOISE);
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);
+ double islope = ((double)(ifadc[2]-ifadc[0]))/(itime[2]-itime[0]);
+ double icept = ifadc[1] - islope*itime[1];
+ //System.out.println("initial parameters, icept:\t"+icept+"\t islope:\t"+islope+"\t itime:\t"+itime[1]);
// properly initialize fit parameters:
- fitFunction.setParameter("time",itime);
+ //fitFunction.setParameter("time",0.0);//itime[1]);
fitFunction.setParameter("intercept",icept);
fitFunction.setParameter("slope",islope);
@@ -160,8 +165,8 @@
//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);
+ //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");
|