Print

Print


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