Print

Print


Author: [log in to unmask]
Date: Mon Nov 16 16:51:15 2015
New Revision: 3964

Log:
prepping for adding extracted RF time

Added:
    java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitFunction.java
    java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java
    java/trunk/users/src/main/java/org/hps/users/baltzell/RfHit.java
Modified:
    java/trunk/recon/src/main/java/org/hps/recon/filtering/PulserTriggerFilterDriver.java

Modified: java/trunk/recon/src/main/java/org/hps/recon/filtering/PulserTriggerFilterDriver.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/filtering/PulserTriggerFilterDriver.java	(original)
+++ java/trunk/recon/src/main/java/org/hps/recon/filtering/PulserTriggerFilterDriver.java	Mon Nov 16 16:51:15 2015
@@ -7,7 +7,14 @@
 import org.hps.record.scalers.ScalerData;
 import org.hps.record.triggerbank.AbstractIntData;
 import org.hps.record.triggerbank.TIData;
-
+/**
+ * Keep pulser triggered events.
+ * Also keep EPICS events, and Scaler events.
+ * Drop all other events.
+ * 
+ * @author baltzell
+ *
+ */
 public class PulserTriggerFilterDriver extends Driver
 {
   public void process(EventHeader event) {

Added: java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitFunction.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitFunction.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitFunction.java	Mon Nov 16 16:51:15 2015
@@ -0,0 +1,36 @@
+package org.hps.users.baltzell;
+
+import hep.aida.ref.function.AbstractIFunction;
+
+/*
+ * Function for fitting the leading edge of the RF waveform.
+ */
+public class RfFitFunction extends AbstractIFunction {
+	protected double pedestal=0;
+	protected double time=0;
+	protected double slope=0;
+	public RfFitFunction() {
+		this("");
+	}
+	public RfFitFunction(String title) {
+		super();
+		this.variableNames=new String[]{"time"};
+		this.parameterNames=new String[]{"pedestal","time","slope"};
+		init(title);
+	}
+	public double value(double [] v) {
+		return  pedestal + (v[0]-time)*slope;
+	}
+	public void setParameters(double[] pars) throws IllegalArgumentException {
+		super.setParameters(pars);
+		pedestal=pars[0];
+		time=pars[1];
+		slope=pars[2];
+	}
+	public void setParameter(String key,double value) throws IllegalArgumentException{
+		super.setParameter(key,value);
+		if      (key.equals("pedestal")) pedestal=value;
+		else if (key.equals("time"))     time=value;
+		else if (key.equals("slope"))    slope=value;
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java	Mon Nov 16 16:51:15 2015
@@ -0,0 +1,108 @@
+package org.hps.users.baltzell;
+
+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;
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFitter;
+import hep.aida.IFunction;
+import hep.aida.IFunctionFactory;
+
+import org.hps.recon.ecal.FADCGenericHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
+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;
+
+	// 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);
+    
+    // the function used to fit the RF pulse:
+    IFunction fitFunction=new RfFitFunction();
+
+    /*
+     * Check the event for an RF pulse, and, if found, fit it to get
+     * RF time and then dump it in the lcsim event.
+     */
+	public void process(EventHeader event) {
+		if (!event.hasCollection(GenericObject.class,"FADCGenericHits")) return;
+		
+		boolean foundRf=false;
+    	double times[]={-9999,-9999};
+    	
+    	for (GenericObject gob : event.get(GenericObject.class,"FADCGenericHits")) {
+			FADCGenericHit hit=(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;
+					IFitResult fit=fitPulse(hit);
+  				    times[ii]=NSPERSAMPLE*fit.fittedParameter("time");
+					break;
+				}
+			}
+		}
+		
+    	// if we found an RF readout, dump the fit result in the event:  
+    	if (foundRf) {
+    		List <RfHit> rfHits=new ArrayList<RfHit>();
+    		rfHits.add(new RfHit(times));
+	    	event.put("RFHits", rfHits, RfHit.class, 1);
+		}
+	}
+
+	/*
+	 * Perform the fit to the RF pulse:
+	 */
+	public IFitResult 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);
+		}
+		
+		// TODO: properly initialize fit parameters:
+		fitFunction.setParameter("time",0.0);
+		fitFunction.setParameter("pedestal",0.0);
+		fitFunction.setParameter("slope",100.0);
+	
+		// 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);
+	}
+	
+}

Added: java/trunk/users/src/main/java/org/hps/users/baltzell/RfHit.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/baltzell/RfHit.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/baltzell/RfHit.java	Mon Nov 16 16:51:15 2015
@@ -0,0 +1,18 @@
+package org.hps.users.baltzell;
+
+import org.lcsim.event.GenericObject;
+
+/*
+ * class to store RF times after extracting from waveform.
+ */
+public class RfHit implements GenericObject {
+	private double[] times;
+	public RfHit(double[] times) { this.times=times; }
+	public int getNInt()    { return 0; }
+	public int getNFloat()  { return 0; }
+	public int getNDouble() { return times.length; }
+	public double getDoubleVal(int ii) { return times[ii]; }
+	public float  getFloatVal (int ii) { return 0; }
+	public int    getIntVal   (int ii) { return 0; }
+	public boolean isFixedSize() { return false; }
+}