Print

Print


Commit in hps-java/src/main/java/org/lcsim/hps/recon/tracking on MAIN
HPSDataProcessingModule.java+177added 1.1
HPSRTM.java+171added 1.1
HPSSVTHitDriver.java+193added 1.1
apv25/HPSSiSensorReadout.java+3-21.1 -> 1.2
+544-2
3 added + 1 modified, total 4 files
Added files required for SVT Signal Time Evo Simulation

hps-java/src/main/java/org/lcsim/hps/recon/tracking
HPSDataProcessingModule.java added at 1.1
diff -N HPSDataProcessingModule.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSDataProcessingModule.java	12 Jan 2012 22:41:29 -0000	1.1
@@ -0,0 +1,177 @@
+package org.lcsim.hps.recon.tracking;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @version $Id: HPSDataProcessingModule.java,v 1.1 2012/01/12 22:41:29 omoreno Exp $
+ */
+public class HPSDataProcessingModule extends Driver {
+    
+    
+    SortedMap<Integer, Map<Integer, double[]>> samples;
+    Map<Integer, List<Double>> blocks;
+    
+    Integer sampleNumber = 1;
+    int numberOfSamples = 6;
+    
+    /**
+     * Constructor
+     */
+    public HPSDataProcessingModule()
+    {
+        // ... //
+        blocks = new HashMap<Integer, List<Double>>();
+        samples = new TreeMap<Integer, Map<Integer, double[]>>();
+    }
+    
+    /**
+     * 
+     */
+    public void addSample( Map<Integer, double[]> sample )
+    {
+        samples.put(sampleNumber, sample);
+       
+        //--->
+        System.out.println(this.getClass().getName() + ": Sample # " + sampleNumber + " added!");
+        //--->
+        
+        sampleNumber++;
+       
+    }
+    
+    /**
+     * 
+     */
+    
+    
+    /**
+     * 
+     */
+    public void createBlocks()
+    {
+        
+        // First iterate through all samples
+        Iterator sampleIterator = samples.keySet().iterator();
+        while(sampleIterator.hasNext()){
+
+            // Get a single sample of the APV25 output
+            Map<Integer, double[]> sample 
+               = samples.get((Integer) sampleIterator.next());
+            
+            //--->
+            System.out.println(this.getClass().getName() + ": Sample size:" + sample.size());
+            //--->
+            
+            // Loop through the avp25 digital sample
+            for(Map.Entry<Integer, double[]> entries : sample.entrySet()){
+
+                // Get the chip number minus 1
+                Integer chipN = entries.getKey();
+                
+                //--->
+//                System.out.println(this.getClass().getName() + ": Chip Number: " + chipN);
+                //--->
+                
+                double[] digitalData = entries.getValue();
+                
+                // Strip the digital sample of all header information
+                digitalData = Arrays.copyOfRange(digitalData, 12, digitalData.length-1);
+                
+                //--->
+//                System.out.println(this.getClass().getName() + ": Data Size: " + digitalData.length);
+                //--->
+                
+                // Loop through all channels and add to blocks
+                for(int index = 1; index <= digitalData.length; index++){
+
+                    int channelN = index+(chipN-1)*128;
+                    
+                    //--->
+//                    System.out.println(this.getClass().getName() + ": Channel Number: " + channelN );
+                    //--->
+                    
+                    // Check if map blocks has the channel
+                    if(!blocks.containsKey(channelN))
+                        blocks.put(channelN, new ArrayList<Double>(6));
+             
+                    List<Double> signal = blocks.get(channelN);
+                 
+                    signal.add(digitalData[index-1]);
+                                     
+                    blocks.put(channelN, signal);
+                }
+            }
+        }
+
+        //--->
+//        System.out.println(this.getClass().getName() + ": Number of blocks: " + blocks.size());
+        //--->
+        
+        //--->
+//        for(Map.Entry<Integer, List<Double>> entries : blocks.entrySet()){
+//            System.out.println(this.getClass().getName() + entries.getValue().toString());
+//        }
+        //--->
+        
+        // CLear all samples
+        samples.clear();
+        
+        // Reset the sample number
+        sampleNumber = 1;
+        
+    }
+    
+    /**
+     * 
+     */
+    public void findHits()
+    {
+        int nHits = 0;
+        
+        // Loop through all blocks
+        for(Map.Entry<Integer, List<Double>> entries : blocks.entrySet()){
+            
+            if(entries.getValue().get(3) >= 1640 ){
+                ++nHits;
+                System.out.println("Found a hit! There are now a total of " + nHits);
+            }
+            
+        }
+    }
+    
+    /**
+     * 
+     */
+    @Override
+    public void process(EventHeader event)
+    {
+        super.process(event);
+
+        // If 6 samples have been collected, block the samples together
+        // by channel
+        if(samples.size() == 6 ){
+            
+            //
+            createBlocks();
+
+            // Once blocks are created, find which blocks have a hit above
+            // threshold
+            findHits();
+            
+            // Once cuts have been applied, clear the blocks
+            blocks.clear();
+            
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/tracking
HPSRTM.java added at 1.1
diff -N HPSRTM.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSRTM.java	12 Jan 2012 22:41:29 -0000	1.1
@@ -0,0 +1,171 @@
+
+package org.lcsim.hps.recon.tracking;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @version  $Id: HPSRTM.java,v 1.1 2012/01/12 22:41:29 omoreno Exp $
+ */
+public class HPSRTM {
+    
+    private Map<Integer, double[]> analogData;
+    private Map<Integer, double[]> digitalData;
+
+    private static double INPUT_STAGE_GAIN = 2;
+    private static double RESISTOR_VALUE = 100; // Ohms
+    
+    double adcHighRef = 1000;   // mVolts
+    double adcLowRef = -1000;   // mVolts
+    double adcResolution = 0;  //bits
+    double adcVoltageResolution = 0; // Volts
+    int voltageIntervals;
+    
+    
+    /**
+     * Constructor
+     */
+    public HPSRTM(int bits)
+    {
+        // To do: In order to increase speed, HashMap should be initialized
+        // to a specified capacity
+        digitalData = new HashMap<Integer, double[]>();
+        
+        adcResolution = bits;
+        voltageIntervals = (int) Math.pow(2, bits);
+                System.out.println(voltageIntervals);
+
+        adcVoltageResolution 
+           =  (adcHighRef - adcLowRef)/voltageIntervals; // mV
+        
+        System.out.println(adcVoltageResolution);
+        
+    }
+    
+    //--- Methods ---//
+    //---------------//
+    
+    
+    /**
+     * 
+     * @param data 
+     */
+    public Map<Integer, double[]> digitize( Map<Integer, double[]> data )
+    {
+        analogData = data;
+
+        // Amplify the incoming analog signal
+        amplifySignal();
+        
+        // Loop over all apv25 analog signals and digitize them
+        for(Map.Entry<Integer, double[]> entry : analogData.entrySet()){
+            
+            // Aquire the amplified signal
+            double[] digitalSignal = entry.getValue();
+
+            // Digitize the apv25 output
+            for(int index = 0; index < digitalSignal.length; index++){
+                
+                digitalSignal[index]
+                   = Math.floor((digitalSignal[index] 
+                                    - adcLowRef)/adcVoltageResolution);
+            }
+
+            digitalData.put(entry.getKey(), digitalSignal);
+            
+//            System.out.println( "chip #: " + entry.getKey());
+//            System.out.print("[ ");
+//            for(double element : digitalSignal ){
+//                
+//                System.out.print(element + ",");
+//            }
+//            System.out.print(" ]");
+//            System.out.println("");
+        }
+
+        //--->
+        System.out.println(this.getClass().getName() + ": APV25 output has been digitized");
+        //--->
+        
+        return digitalData;
+    }
+    
+    /**
+     * 
+     */
+    public void amplifySignal()
+    {
+        
+        //--->
+        System.out.println(this.getClass().getName() + ": AmplyingSignal");
+        //--->
+        
+        // Loop over all apv25 analog data
+        for(Map.Entry<Integer, double[]> entry : analogData.entrySet() )
+        {
+            // Obtain the apv25 output
+            double[] apv25Output = entry.getValue();
+            
+            for(int index = 0; index < apv25Output.length; index++ ){
+                
+                // Convert input current to voltage
+                apv25Output[index] *= RESISTOR_VALUE;
+                
+                // Amplify the input signal
+                apv25Output[index] *= INPUT_STAGE_GAIN;
+            }
+
+            // Store the amplified APV25 output
+            analogData.put(entry.getKey(), apv25Output);
+            
+            // Loop over the array
+//            System.out.println( "chip #: " + entry.getKey());
+//            System.out.print("[ ");
+//            for(double element : signal ){
+//                
+//                System.out.print(element + ",");
+//            }
+//            System.out.print(" ]");
+//            System.out.println("");
+            
+        }
+    }
+    
+    /**
+     * 
+     */
+    public void setResolution( int bits )
+    {
+        adcResolution = bits;
+        
+ //       adcVoltageResolution 
+//           = Math.floor((adcHighRef - adcLowRef)/adcResolution)*1000;
+        
+    }
+    
+    /**
+     * 
+     */
+   public void printData()
+   {
+       
+       double[] data = digitalData.get("1");
+       System.out.println(data.length);
+       //double[] data = digitalData.get("1");
+       
+      // System.out.println("[ " + digitalData.size());
+       
+       
+//       for(double element : data )
+//       {
+//           System.out.println(element + ",");
+//       }
+       
+       System.out.println(" ]");
+   }
+    
+    
+    
+}

hps-java/src/main/java/org/lcsim/hps/recon/tracking
HPSSVTHitDriver.java added at 1.1
diff -N HPSSVTHitDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSSVTHitDriver.java	12 Jan 2012 22:41:29 -0000	1.1
@@ -0,0 +1,193 @@
+
+package org.lcsim.hps.recon.tracking;
+
+
+//--- Java ---//
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+//--- org.lcsim ---//
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiTrackerModule;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.recon.tracking.digitization.sisim.CDFSiSensorSim;
+import org.lcsim.util.Driver;
+
+
+//--- hps-java ---//
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.recon.tracking.digitization.sisim.config.SimTrackerHitReadoutDriver;
+import org.lcsim.hps.recon.tracking.apv25.HPSSiSensorReadout;
+import org.lcsim.hps.recon.tracking.apv25.HPSAPV25;
+
+/**
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @version $Id: HPSSVTHitDriver.java,v 1.1 2012/01/12 22:41:29 omoreno Exp $
+ */
+public class HPSSVTHitDriver extends Driver {
+  
+    
+    //
+    CDFSiSensorSim siSimulation;
+    HPSAPV25 apv25;
+    HPSSiSensorReadout siReadout;
+    HPSDataProcessingModule dpm;
+    
+    //
+    List<String> processPaths = new ArrayList<String>();
+    List<IDetectorElement> processDetectorElements 
+       = new ArrayList<IDetectorElement>();
+    List<String> readouts = new ArrayList<String>();
+    List<Integer> triggerTimeStamp = new ArrayList<Integer>();
+    
+    //
+    Set<SiSensor> processSensors = new HashSet<SiSensor>();
+    Set<SiTrackerModule> processModules = new HashSet<SiTrackerModule>();
+    
+    // Event number
+    int eventNumber;
+
+    /**
+     * Constructor
+     */
+    public HPSSVTHitDriver()
+    {
+        //--- Sensor Simulation ---//
+        //-------------------------//
+        siSimulation = new CDFSiSensorSim();
+    
+        //--- APV25 Simulation ---//
+        //------------------------//
+        apv25 = new HPSAPV25( );
+        // Set the APV25 Shaping time [ns]
+        apv25.setShapingTime(35);
+        // Set the APV25 operating mode
+        apv25.setAPV25Mode("multi-peak");
+        // Set the APV25 analog pipeline sampling time
+        apv25.setSamplingTime(24);
+        
+        //--- HPS Data Processing Module ---//
+        //----------------------------------//
+        dpm = new HPSDataProcessingModule();
+        add(dpm);
+        
+        //--- HPS Silicon Sensor Readout ---//
+        //-------------------//
+        siReadout = new HPSSiSensorReadout(siSimulation, apv25, dpm);
+        
+        //Specify the readouts to process
+        readouts.add("TrackerHits");
+        // Specify the detectors to process
+        processPaths.add("Tracker");
+    }
+    
+    /**
+     * Initialize whenever we have a new detector
+     * 
+     * @param detector : 
+     */
+    @Override
+    public void detectorChanged(Detector detector)
+    {
+        super.detectorChanged(detector);
+        
+        // Proces detectors specified by path, otherwise process the entire
+        // detector
+        IDetectorElement detectorElement = detector.getDetectorElement();
+        for(String detectorElementPath : processPaths ){
+            processDetectorElements.add(
+               detectorElement.findDetectorElement(detectorElementPath));
+        }
+        
+        if(processDetectorElements.isEmpty()) 
+            processDetectorElements.add(detectorElement);
+        
+        for(IDetectorElement dElement : processDetectorElements ){
+            processSensors.addAll(dElement.findDescendants(SiSensor.class));
+            processModules.addAll(
+               dElement.findDescendants(SiTrackerModule.class));
+        }
+    }
+    
+    /**
+     * 
+     */
+    @Override
+    public void startOfData()
+    {
+        // Set up readouts if they haven't been set
+        if(!readouts.isEmpty()){
+            super.add(new SimTrackerHitReadoutDriver(readouts));
+        }
+        
+        super.startOfData();
+        readouts.clear();
+        
+        eventNumber = 1;
+    }
+    
+    
+    /**
+     * 
+     */
+    @Override
+    public void process(EventHeader event)
+    {
+        super.process(event);
+     
+        // Output event number
+//        if( eventNumber%100 == 0){
+//            System.out.println("Now processing event " + eventNumber);
+//        }
+        
+        // This should be moved to clock singleton ... 
+        // If a sampling cycle has passed, increment the pointer positions of 
+        // all existing analog pipelines
+        if(ClockSingleton.getTime()%24 == 0 && eventNumber != 1){
+            apv25.incrementAllPointerPositions( 
+               HPSSiSensorReadout.analogPipelineMap );
+            apv25.stepAPV25Clock();
+        }
+        
+        // Increment the event number
+        ++eventNumber;
+        
+        // Loop over all sensors
+        for( SiSensor sensor : processSensors ){
+
+            // Readout the sensor
+            siReadout.readoutSensor(sensor);
+        }
+        
+        // If a trigger is recieved readout the APV25 and digitize all hits
+        if(HPSAPV25.triggerBit){
+            for(int sample = 0; sample < 6; sample++){
+                if(!triggerTimeStamp.contains(apv25.apv25ClockCycle + sample)){
+                    triggerTimeStamp.add(apv25.apv25ClockCycle + sample);
+                    //--->
+                    System.out.println(triggerTimeStamp.toString());
+                    //--->
+                }
+            }
+            HPSAPV25.triggerBit = false;
+        }
+        
+
+        
+        if(!triggerTimeStamp.isEmpty()){
+            if(triggerTimeStamp.contains(apv25.apv25ClockCycle)){
+                siReadout.readoutAPV25();
+                triggerTimeStamp.remove((Integer) apv25.apv25ClockCycle);
+                //--->
+                System.out.println(triggerTimeStamp.toString());
+                //--->
+            }
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/recon/tracking/apv25
HPSSiSensorReadout.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- HPSSiSensorReadout.java	5 Jan 2012 17:47:00 -0000	1.1
+++ HPSSiSensorReadout.java	12 Jan 2012 22:41:29 -0000	1.2
@@ -32,13 +32,14 @@
 
 //--- hps-java ---//
 import org.lcsim.hps.recon.tracking.apv25.HPSAPV25.APV25Channel.APV25AnalogPipeline;
-
+import org.lcsim.hps.recon.tracking.HPSDataProcessingModule;
+import org.lcsim.hps.recon.tracking.HPSRTM;
 
 
 /**
  *
  * @author Omar Moreno <[log in to unmask]>
- * @version $Id: HPSSiSensorReadout.java,v 1.1 2012/01/05 17:47:00 omoreno Exp $
+ * @version $Id: HPSSiSensorReadout.java,v 1.2 2012/01/12 22:41:29 omoreno Exp $
  */
 public class HPSSiSensorReadout {
     
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1