Print

Print


Author: [log in to unmask]
Date: Fri Feb  5 16:28:56 2016
New Revision: 4173

Log:
Fix driver so it can also load plain GenericObject collection; code reformatting.

Modified:
    java/trunk/evio/src/main/java/org/hps/evio/RfFitterDriver.java

Modified: java/trunk/evio/src/main/java/org/hps/evio/RfFitterDriver.java
 =============================================================================
--- java/trunk/evio/src/main/java/org/hps/evio/RfFitterDriver.java	(original)
+++ java/trunk/evio/src/main/java/org/hps/evio/RfFitterDriver.java	Fri Feb  5 16:28:56 2016
@@ -1,9 +1,4 @@
 package org.hps.evio;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import hep.aida.IAnalysisFactory;
 import hep.aida.IDataPointSet;
@@ -11,7 +6,9 @@
 import hep.aida.IFitResult;
 import hep.aida.IFitter;
 import hep.aida.IFunction;
-import hep.aida.IFunctionFactory;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import org.hps.recon.ecal.FADCGenericHit;
 import org.lcsim.event.EventHeader;
@@ -19,145 +16,156 @@
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
-/*
+/**
  * Extract RF time from waveform and put into lcsim event.
  */
 public class RfFitterDriver extends Driver {
 
-	static final double NOISE=2.0; // units = FADC
-	static final int CRATE=46;
-	static final int SLOT=13;
-	static final int CHANNELS[]={0,1};
-	static final double NSPERSAMPLE=4;
-		
+    private static final double NOISE = 2.0; // units = FADC
+    private static final int CRATE = 46;
+    private static final int SLOT = 13;
+    private static final int CHANNELS[] = {0, 1};
+    private static final double NSPERSAMPLE = 4;
 
-	// boilerplate:
-    AIDA aida = AIDA.defaultInstance();
-    IAnalysisFactory analysisFactory = aida.analysisFactory();
-    IFunctionFactory functionFactory = analysisFactory.createFunctionFactory(null);
-    IFitFactory fitFactory = analysisFactory.createFitFactory();
-    IFitter fitter=fitFactory.createFitter();
-    IDataPointSet fitData=aida.analysisFactory().createDataPointSetFactory(null).create("RF ADC DataPointSet", 2);
-    
+    // boilerplate:
+    private AIDA aida = AIDA.defaultInstance();
+    private IAnalysisFactory analysisFactory = aida.analysisFactory();
+    //private IFunctionFactory functionFactory = analysisFactory.createFunctionFactory(null);
+    private IFitFactory fitFactory = analysisFactory.createFitFactory();
+    private IFitter fitter = fitFactory.createFitter();
+    private IDataPointSet fitData = aida.analysisFactory().createDataPointSetFactory(null).create("RF ADC DataPointSet", 2);
+
     // the function used to fit the RF pulse:
-    IFunction fitFunction=new RfFitFunction();
+    private IFunction fitFunction = new RfFitFunction();
 
-    /*
+    /**
      * Check the event for an RF pulse, and, if found, fit it to get RF time.
      */
-	public void process(EventHeader event) {
-		
-		List <RfHit> rfHits=new ArrayList<RfHit>();
-		
-		boolean foundRf=false;
-		double times[]={-9999,-9999};
-		
-		if (event.hasCollection(GenericObject.class,"FADCGenericHits")) {
+    public void process(EventHeader event) {
 
-			for (GenericObject gob : event.get(GenericObject.class,"FADCGenericHits")) {
-				FADCGenericHit hit=(FADCGenericHit)gob;
+        List<RfHit> rfHits = new ArrayList<RfHit>();
 
-				// ignore hits not from proper RF signals based on crate/slot/channel:
-				if (hit.getCrate()!=CRATE || hit.getSlot()!=SLOT) continue;
-				
-				for (int ii=0; ii<CHANNELS.length; ii++) {
-					if (hit.getChannel()==CHANNELS[ii]) {
+        boolean foundRf = false;
+        double times[] = {-9999, -9999};
 
-						// we found a RF readout, fit it:
-						foundRf=true;
-						times[ii] = fitPulse(hit);
+        if (event.hasCollection(GenericObject.class, "FADCGenericHits")) {
 
-						break;
-					}
-				}
-			}
-		}
-    	if (foundRf) rfHits.add(new RfHit(times));
-    	event.put("RFHits", rfHits, RfHit.class, 1);
-	}
+            for (GenericObject gob : event.get(GenericObject.class, "FADCGenericHits")) {
 
-	/*
-	 * Perform the fit to the RF pulse:
-	 */
-	public double fitPulse(FADCGenericHit hit) {
-		fitData.clear();
-		final int adcSamples[]=hit.getData();
-		//stores the number of peaks
-		int iz=0;
-		int peakBin[]={-999,-999};
-		final int threshold = 300;	
-		double fitThresh[]={-999,-999};
-		double pedVal[]={-999,-999};
-		
-		// Look for bins containing the peaks (2-3 peaks)
-		for (int ii=4; ii<adcSamples.length; ii++) {
-			// After 2 peaks, stop looking for more
-			if (iz==2){break;}
-			if ((adcSamples[ii+1]>0) && (adcSamples[ii-1]>0) && (adcSamples[ii]>threshold) && ii>8){
-				if ((adcSamples[ii]>adcSamples[ii+1]) && (adcSamples[ii]>=adcSamples[ii-1]) ){
-					
-					peakBin[iz]=ii;
-					iz++;
-				}
-			}
-		}
-		
-		
-		int jj=0;
-		// 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;
-	
-		// Initial values: 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 
-		for (int ll=0; ll<5; ll++){	
-			if ((adcSamples[peakBin[ik]-5+ll]) > fitThresh[ik]){
-				// One point is below fit threshold and two points are above	
-				if(jj==0 && (adcSamples[peakBin[ik]-6+ll] > pedVal[ik])){
-					final int zz=fitData.size();	
-					fitData.addPoint();
-					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(NOISE);
-					fitData.point(zz).coordinate(1).setErrorPlus(NOISE);		
-					jj++;	
-				}
-				final int zz=fitData.size();	
-				fitData.addPoint();
-				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(NOISE);
-				fitData.point(zz).coordinate(1).setErrorPlus(NOISE);
-					
-				jj++;
-				if (jj==3) {break;}					
-			}
-		}
-		
-		double islope = ((double)(ifadc[2]-ifadc[0]))/(itime[2]-itime[0]);
-		double icept = ifadc[1] - islope*itime[1];
-		// Initialize fit parameters:
-		fitFunction.setParameter("intercept",icept);
-		fitFunction.setParameter("slope",islope);
+                FADCGenericHit hit = null;
 
-		// 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);
-	
-		IFitResult fitResults = fitter.fit(fitData,fitFunction);
-		
-		// Read the time value at this location on the fit:
-		double halfVal = (adcSamples[peakBin[1]]+pedVal[1])/2.0;	
-	
-		return NSPERSAMPLE*(halfVal-fitResults.fittedParameter("intercept"))/fitResults.fittedParameter("slope");
-			
-	}
-		
+                /* Added conversion from GenericObject in case loading back from an LCIO file. --JM */
+                if (gob instanceof FADCGenericHit) {
+                    hit = (FADCGenericHit) gob;
+                } else {
+                    hit = new FADCGenericHit(gob);
+                }
+
+                // ignore hits not from proper RF signals based on crate/slot/channel:
+                if (hit.getCrate() != CRATE || hit.getSlot() != SLOT)
+                    continue;
+
+                for (int ii = 0; ii < CHANNELS.length; ii++) {
+                    if (hit.getChannel() == CHANNELS[ii]) {
+
+                        // we found a RF readout, fit it:
+                        foundRf = true;
+                        times[ii] = fitPulse(hit);
+
+                        break;
+                    }
+                }
+            }
+        }
+        if (foundRf) {
+            rfHits.add(new RfHit(times));
+        }
+        event.put("RFHits", rfHits, RfHit.class, 1);
+    }
+
+    /**
+     * Perform the fit to the RF pulse:
+     */
+    private double fitPulse(FADCGenericHit hit) {
+        fitData.clear();
+        final int adcSamples[] = hit.getData();
+        // stores the number of peaks
+        int iz = 0;
+        int peakBin[] = {-999, -999};
+        final int threshold = 300;
+        double fitThresh[] = {-999, -999};
+        double pedVal[] = {-999, -999};
+
+        // Look for bins containing the peaks (2-3 peaks)
+        for (int ii = 4; ii < adcSamples.length; ii++) {
+            // After 2 peaks, stop looking for more
+            if (iz == 2) {
+                break;
+            }
+            if ((adcSamples[ii + 1] > 0) && (adcSamples[ii - 1] > 0) && (adcSamples[ii] > threshold) && ii > 8) {
+                if ((adcSamples[ii] > adcSamples[ii + 1]) && (adcSamples[ii] >= adcSamples[ii - 1])) {
+
+                    peakBin[iz] = ii;
+                    iz++;
+                }
+            }
+        }
+
+        int jj = 0;
+        // 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;
+
+        // Initial values: 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
+        for (int ll = 0; ll < 5; ll++) {
+            if ((adcSamples[peakBin[ik] - 5 + ll]) > fitThresh[ik]) {
+                // One point is below fit threshold and two points are above
+                if (jj == 0 && (adcSamples[peakBin[ik] - 6 + ll] > pedVal[ik])) {
+                    final int zz = fitData.size();
+                    fitData.addPoint();
+                    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(NOISE);
+                    fitData.point(zz).coordinate(1).setErrorPlus(NOISE);
+                    jj++;
+                }
+                final int zz = fitData.size();
+                fitData.addPoint();
+                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(NOISE);
+                fitData.point(zz).coordinate(1).setErrorPlus(NOISE);
+
+                jj++;
+                if (jj == 3) {
+                    break;
+                }
+            }
+        }
+
+        double islope = ((double) (ifadc[2] - ifadc[0])) / (itime[2] - itime[0]);
+        double icept = ifadc[1] - islope * itime[1];
+        // Initialize fit parameters:
+        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);
+
+        IFitResult fitResults = fitter.fit(fitData, fitFunction);
+
+        // Read the time value at this location on the fit:
+        double halfVal = (adcSamples[peakBin[1]] + pedVal[1]) / 2.0;
+
+        return NSPERSAMPLE * (halfVal - fitResults.fittedParameter("intercept")) / fitResults.fittedParameter("slope");
+    }
 }