Print

Print


Author: [log in to unmask]
Date: Wed Jan 27 04:50:01 2016
New Revision: 4147

Log:
adding cosmic filter

Added:
    java/trunk/recon/src/main/java/org/hps/recon/filtering/CosmicPMTFilter.java

Added: java/trunk/recon/src/main/java/org/hps/recon/filtering/CosmicPMTFilter.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/filtering/CosmicPMTFilter.java	(added)
+++ java/trunk/recon/src/main/java/org/hps/recon/filtering/CosmicPMTFilter.java	Wed Jan 27 04:50:01 2016
@@ -0,0 +1,58 @@
+package org.hps.recon.filtering;
+
+import org.hps.recon.ecal.FADCGenericHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
+import org.lcsim.util.Driver;
+
+public class CosmicPMTFilter extends Driver {
+	
+	// class storing raw PMT readout:
+	static final String CLASSNAME="FADCGenericHits";
+
+	// hardware location of PMTs:
+	static final int CRATE=39;
+	static final int SLOT=20;
+	static final int CHANNELS[]={13,14};
+	
+	// cuts on pulse integrals for cosmic signals (units ADC):
+	static final float CUTS[]={1534,3242};
+
+	// number of samples to use at beginning of window for pedestal:
+	static final int NPEDSAMP=20;
+	
+	public void process(EventHeader event) {
+		
+		// find PMT data:
+		FADCGenericHit pmt1=null,pmt2=null;
+		if (!event.hasCollection(GenericObject.class,CLASSNAME))
+		      throw new Driver.NextEventException();
+		for (GenericObject gob : event.get(GenericObject.class,CLASSNAME)) {
+			FADCGenericHit hit=(FADCGenericHit)gob;
+			if (hit.getCrate()==CRATE && hit.getSlot()==SLOT) {
+				if      (hit.getChannel()==CHANNELS[0]) pmt1=hit;
+				else if (hit.getChannel()==CHANNELS[1]) pmt2=hit;
+			}
+		}
+		if (pmt1==null || pmt2==null) throw new Driver.NextEventException();
+		
+		// put cuts on pulse integrals:
+		float pulse1=getPulseIntegral(pmt1);
+		float pulse2=getPulseIntegral(pmt2);
+		if (pulse1<CUTS[0] || pulse2<CUTS[1]) throw new Driver.NextEventException();
+	}
+	
+	public float getPulseIntegral(FADCGenericHit hh) {
+		float sum=0;
+		for (int samp : hh.getData()) sum+=samp;
+		return sum-getPedestal(hh)*hh.getData().length;
+	}
+	
+	public float getPedestal(FADCGenericHit hh) {
+		if (hh.getData().length<NPEDSAMP)
+			throw new java.lang.RuntimeException("Not enough samples for pedestal.");
+		float sum=0;
+		for (int isamp=0; isamp<NPEDSAMP; isamp++) sum+=hh.getData()[isamp];
+		return sum/NPEDSAMP;
+	}
+}