hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -N FpgaData.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ FpgaData.java 28 Apr 2012 23:26:27 -0000 1.1
@@ -0,0 +1,142 @@
+package org.lcsim.hps.recon.tracking;
+
+//--- java ---//
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TEMP_MASK;
+
+import java.util.ArrayList;
+import java.util.List;
+
+//--- org.lcsim ---//
+import org.lcsim.event.GenericObject;
+
+//-- Constants ---//
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.ADC_TEMP_COUNT;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.MAX_TEMP;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.MIN_TEMP;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TEMP_K0;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.CONST_A;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.BETA;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.V_MAX;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.V_REF;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.R_DIV;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TEMP_INC;
+
+/**
+ * Generic object to contain hybrid temperatures and data tail value.
+ * Converts and ADC value to a temperature in celsius
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @version $Id: FpgaData.java,v 1.1 2012/04/28 23:26:27 omoreno Exp $
+ */
+public class FpgaData implements GenericObject {
+
+ List<Double> temperatures = new ArrayList<Double>();
+ int tail;
+
+ public static double[] temperatureTable = null;
+
+ /**
+ *
+ * @param temperature : array containing hybrid temperatures
+ * @param tail : word present at the end of a FPGA data set
+ */
+ public FpgaData(int[] data, int tail){
+
+ int[] temperature = this.extractTemperature(data);
+
+ // Fill the temperature lookup table
+ this.fillTemperatureTable();
+
+ this.tail = tail;
+
+ // Fill the temperature list
+ for(int index = 0; index < temperature.length; index++){
+ temperatures.add(temperatureTable[temperature[index]]);
+ }
+ }
+
+ /**
+ * Extract temperatures from the SVT data stream
+ *
+ * @param data : array containing temperature data
+ * @return temperatures
+ *
+ */
+ public int[] extractTemperature(int[] data) {
+ int[] temperatures = new int[(data.length) * 2];
+
+ int tempIndex = 0;
+ for (int index = 0; index < data.length; index++) {
+ temperatures[tempIndex] = data[index] & TEMP_MASK;
+ temperatures[tempIndex + 1] = (data[index] >>> 16) & TEMP_MASK;
+ tempIndex += 2;
+ }
+ return temperatures;
+ }
+
+ /**
+ * Temperature lookup table. Takes an ADC value and returns a temperature in Celsius
+ */
+ private void fillTemperatureTable() {
+
+ if(temperatureTable == null){
+ temperatureTable = new double[ADC_TEMP_COUNT];
+
+ double tempK, res, volt;
+ int idx;
+ double temp = MIN_TEMP;
+
+ while(temp < MAX_TEMP){
+
+ tempK = TEMP_K0 + temp;
+ res = CONST_A*Math.exp(BETA/tempK);
+ volt = (res*V_MAX)/(R_DIV + res);
+ idx = (int) ((volt/V_REF)*(double)(ADC_TEMP_COUNT - 1));
+ if(idx < ADC_TEMP_COUNT) temperatureTable[idx] = temp;
+ temp += TEMP_INC;
+ }
+ }
+ }
+
+
+ /**
+ * Get the temperature at a given index
+ */
+ @Override
+ public double getDoubleVal(int index) {
+ return temperatures.get(index);
+ }
+
+ @Override
+ public float getFloatVal(int index) {
+ return 0;
+ }
+
+ /**
+ * Get the tail value
+ */
+ @Override
+ public int getIntVal(int index) {
+ return tail;
+ }
+
+ @Override
+ public int getNDouble() {
+ return temperatures.size();
+ }
+
+ @Override
+ public int getNFloat() {
+ return 0;
+ }
+
+ @Override
+ public int getNInt() {
+ return 1;
+ }
+
+ @Override
+ public boolean isFixedSize() {
+ return true;
+ };
+}