Print

Print


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");