Print

Print


Author: [log in to unmask]
Date: Thu Nov  6 01:19:32 2014
New Revision: 1446

Log:
Commit some files that were on the ecal-commissioning branch. Also, fixed a typo in the ecal event display PassiveViewer.java class

Added:
    java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/DummyRecon.lcsim
    java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/PedestalComputationRaw.lcsim
    java/trunk/users/src/main/java/org/hps/users/celentan/EcalChannelsAmplitude.java
    java/trunk/users/src/main/java/org/hps/users/celentan/RawPedestalComputator.java
Removed:
    java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/EcalMonitoringTestCelentan.lcsim
Modified:
    java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/ECalUtils.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplay.java
    java/trunk/users/src/main/java/org/hps/users/celentan/StripChartTest.java

Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java
 =============================================================================
--- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java	(original)
+++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java	Thu Nov  6 01:19:32 2014
@@ -38,7 +38,7 @@
      * @param min - The lower bound.
      * @param max - The upper bound.
      */
-    public void setScale(int min, int max) {
+    public void setScale(double min, double max) { //A.C. I modified these to double since ecalPanel methods use double
         ecalPanel.setScaleMinimum(min);
         ecalPanel.setScaleMaximum(max);
     }
@@ -48,14 +48,14 @@
      * scale.
      * @param max - The upper bound.
      */
-    public void setScaleMaximum(int max) { ecalPanel.setScaleMaximum(max); }
+    public void setScaleMaximum(double max) { ecalPanel.setScaleMaximum(max); } //A.C. I modified these to double since ecalPanel methods use double
     
     /**
      * Sets the lower bound for the calorimeter display's color mapping
      * scale.
      * @param min - The lower bound.
      */
-    public void setScaleMinimum(int min) { ecalPanel.setScaleMinimum(min); }
+    public void setScaleMinimum(double min) { ecalPanel.setScaleMinimum(min); } //A.C. I modified these to double since ecalPanel methods use double
     
     /**
      * Displays the hits and clusters added by the <code>addHit</code>

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/ECalUtils.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/ECalUtils.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/ECalUtils.java	Thu Nov  6 01:19:32 2014
@@ -98,4 +98,42 @@
         }
         return ret;
     }
+    
+
+    /**
+    * This is a very basic method that, given an array with the raw-waveform (in FADC units), returns the amplitude (in mV)
+    * @param data Array with data from FADC, in fadc units
+    * @param lenght The array lenght
+    * @param pedestalSamples How many samples at the beginning of the array to use for the pedestal. Must be < lenght
+    * @return double[], 0 is the amplitude in mV, 1 is the offest in ADC counts, 2 is the RMS in adc counts
+    */
+   public static double[] computeAmplitude(short [] data, int lenght, int pedestalSamples){
+   	double amplitude,pedestal,noise;
+   	pedestal=0;
+   	noise=0;
+   	amplitude=data[0];
+   	double[] ret={0.,0.,0.};
+   	if (pedestalSamples>lenght){
+   		return ret;
+   	}
+   	for (int jj = 0; jj < lenght; jj++){
+   		if (jj<pedestalSamples){
+   			pedestal+=data[jj];
+   			noise+=data[jj]*data[jj];
+   		}
+   		if (data[jj]>amplitude) amplitude=data[jj];
+   	}
+   	pedestal/=pedestalSamples;
+   	noise/=pedestalSamples;
+   	noise=Math.sqrt(noise-pedestal*pedestal);
+   	amplitude-=pedestal;
+   
+   	amplitude*=adcResolution*1000;
+   	ret[0]=amplitude;
+   	ret[1]=pedestal;
+   	ret[2]=noise;
+   	return ret;
+   	
+   }
+    
 }

Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplay.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplay.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplay.java	Thu Nov  6 01:19:32 2014
@@ -6,12 +6,20 @@
 import hep.aida.ICloud2D;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterFactory;
+import hep.aida.IPlotterStyle;
 
 import java.awt.Point;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.ArrayList;
 import java.util.List;
+import java.lang.System;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.IOException;
+
 
 import org.hps.monitoring.ecal.eventdisplay.event.Cluster;
 import org.hps.monitoring.ecal.eventdisplay.event.EcalHit;
@@ -28,7 +36,7 @@
 import org.lcsim.util.aida.AIDA;
 
 /**
- *  The driver <code>EcalEvendDisplay</code> implements the histogram shown to the user 
+ *  The driver <code>EcalEventDisplay</code> implements the histogram shown to the user 
  * in the fifth tab of the Monitoring Application, when using the Ecal monitoring lcsim file.
  * IT ALSO OPENS KYLE's EVENT DISPLAY <code>PEventViewer</code>.
  * The implementation is as follows:
@@ -54,11 +62,17 @@
     int eventRefreshRate = 1;
     int eventn = 0;
 	int ix,iy,id;
-	
+	int pedSamples=10;
+	
+	double amp,ped,sigma;
+	double hitE;
     int[] windowRaw=new int[47*11];//in case we have the raw waveform, this is the window lenght (in samples)
 	boolean[] isFirstRaw=new boolean[47*11];
 	
-    private PEventViewer viewer; //this is the Kyle event viewer.    
+	
+	boolean enableAllFadc=false; 
+    
+	private PEventViewer viewer; //this is the Kyle event viewer.    
 
     
     ArrayList<IHistogram1D> channelEnergyPlot;
@@ -67,16 +81,32 @@
    // ArrayList<ICloud1D> channelRawWaveform;
     ArrayList<IHistogram2D> channelTimeVsEnergyPlot;
    
+    IPlotterStyle pstyle;
     
     
     double maxEch = 2500 * ECalUtils.MeV;
+    double minEch = -0.1;
+    
+    int itmpx,itmpy;
     
     public EcalEventDisplay() {
     	
     }
 
+    public void setEnableAllFadc(boolean enableAllFadc){
+        this.enableAllFadc = enableAllFadc;
+    }
+    
     public void setMaxEch(double maxEch) {
         this.maxEch = maxEch;
+    }
+    
+    public void setMinEch(double minEch) {
+        this.minEch = minEch;
+    }
+    
+    public void setPedSamples(int pedSamples) {
+        this.pedSamples = pedSamples;
     }
     
     public void setInputCollection(String inputCollection) {
@@ -110,13 +140,12 @@
        //channelRawWaveform=new ArrayList<ICloud1D>();
        channelTimeVsEnergyPlot=new ArrayList<IHistogram2D>();
        //create the histograms for single channel energy and time distribution.
-       //these are NOT shown in this plotter, but are used in the event display.
        for(int ii = 0; ii < (47*11); ii = ii +1){
              int row=ECalUtils.getRowFromHistoID(ii);
              int column=ECalUtils.getColumnFromHistoID(ii);      
-             channelEnergyPlot.add(aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : Hit Energy : " + (column) + " "+ (row)+ ": "+ii, 100, 0, maxEch));  
+             channelEnergyPlot.add(aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : Hit Energy : " + (column) + " "+ (row)+ ": "+ii, 100, -.2, maxEch));  
              channelTimePlot.add(aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : Hit Time : " + (column) + " "+ (row)+ ": "+ii, 100, 0, 400));     
-             channelTimeVsEnergyPlot.add(aida.histogram2D(detector.getDetectorName() + " : " + inputCollection + " : Hit Time Vs Energy : " + (column) + " "+ (row)+ ": "+ii, 100, 0, 400,100, 0, maxEch));              
+             channelTimeVsEnergyPlot.add(aida.histogram2D(detector.getDetectorName() + " : " + inputCollection + " : Hit Time Vs Energy : " + (column) + " "+ (row)+ ": "+ii, 100, 0, 400,100, -.2, maxEch));              
              channelRawWaveform.add(aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : Hit Energy : " + (column) + " "+ (row)+ ": "+ii));
              //the above instruction is a terrible hack, just to fill the arrayList with all the elements. They'll be initialized properly during the event readout,
              //since we want to account for possibly different raw waveform dimensions!
@@ -130,49 +159,41 @@
    	   ix=ECalUtils.getColumnFromHistoID(id);  
    	   
    	   
-    	
-    			
-    			
-    			
-    	plotterFactory = aida.analysisFactory().createPlotterFactory("Ecal single channel plots");
+    	plotterFactory = aida.analysisFactory().createPlotterFactory("Single channel");       
+        plotter = plotterFactory.create("Single channel");
+   	    pstyle = this.createDefaultStyle(); 		
+        plotter.setTitle("");
    
-       
-        plotter = plotterFactory.create("Single channel");
-        plotter.setTitle("");
-        plotter.style().setParameter("hist2DStyle", "colorMap");
-        plotter.style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
-        plotter.style().dataStyle().fillStyle().setParameter("showZeroHeightBins",Boolean.FALSE.toString());
-        plotter.style().dataStyle().errorBarStyle().setVisible(false);
+     
         plotter.createRegions(2,2);
 
 
-        
-        plotter.region(0).plot(channelEnergyPlot.get(id));
-        plotter.region(0).style().xAxisStyle().setLabel("Hit energy (GeV)");
-        plotter.region(0).style().yAxisStyle().setLabel("");
-        
-        plotter.region(1).plot(channelTimePlot.get(id));           	    
-        plotter.region(1).style().xAxisStyle().setLabel("Hit Time (ns)");
-        plotter.region(1).style().yAxisStyle().setLabel("");
-
-    	plotter.region(2).plot(channelTimeVsEnergyPlot.get(id));
-        plotter.region(2).style().xAxisStyle().setLabel("Hit Time (ns)");
-        plotter.region(2).style().yAxisStyle().setLabel("Hit Energy (GeV)");
-    
-    	
-	    plotter.region(3).plot(channelRawWaveform.get(id));
-	    plotter.region(3).style().xAxisStyle().setLabel("Hit energy (GeV)");
-        plotter.region(3).style().yAxisStyle().setLabel("");
-        plotter.region(3).style().dataStyle().fillStyle().setColor("orange");
-        plotter.region(3).style().dataStyle().markerStyle().setColor("orange");
-        plotter.region(3).style().dataStyle().errorBarStyle().setVisible(false);
-        
-        
+        pstyle.xAxisStyle().setLabel("Hit energy (GeV)");
+        pstyle.yAxisStyle().setLabel("");
+        plotter.region(0).plot(channelEnergyPlot.get(id),pstyle);
+   
+        pstyle.xAxisStyle().setLabel("Hit Time (ns)");
+        pstyle.yAxisStyle().setLabel("");    
+        plotter.region(1).plot(channelTimePlot.get(id),pstyle);           	    
+        
+        pstyle.xAxisStyle().setLabel("Hit Time (ns)");
+        pstyle.yAxisStyle().setLabel("Hit Energy (GeV)");    
+    	plotter.region(2).plot(channelTimeVsEnergyPlot.get(id),pstyle);
+
+    	pstyle.xAxisStyle().setLabel("Hit Energy (GeV)");    
+        pstyle.yAxisStyle().setLabel("");
+        pstyle.dataStyle().fillStyle().setColor("orange");
+        pstyle.dataStyle().markerStyle().setColor("orange");
+        pstyle.dataStyle().errorBarStyle().setVisible(false);
+	    plotter.region(3).plot(channelRawWaveform.get(id),pstyle);
+	
         
         
         System.out.println("Create the event viewer");
         viewer=new PEventViewer();
         viewer.addCrystalListener(this);
+        viewer.setScaleMinimum(minEch);
+        viewer.setScaleMaximum(maxEch);
         System.out.println("Done");
         
       
@@ -189,11 +210,12 @@
     }
 
     @Override
-    public void process(EventHeader event) {
+    public void process(EventHeader event){
     	
     	  int ii;
           int row = 0;
           int column = 0;
+          double[] result;
           
           boolean do_update=false;
     	  if (++eventn % eventRefreshRate == 0) {
@@ -214,12 +236,25 @@
                 column=hit.getIdentifierFieldValue("ix");           	
                 if ((row!=0)&&(column!=0)){
                     ii = ECalUtils.getHistoIDFromRowColumn(row,column);
-                    if (hit.getCorrectedEnergy() > 0) { //A.C. > 0 for the 2D plot drawing                 	
+                    hitE=hit.getCorrectedEnergy();
+                    if (hitE > 0) { //A.C. > 0 for the 2D plot drawing                 	
                     	channelEnergyPlot.get(ii).fill(hit.getCorrectedEnergy());
                         channelTimePlot.get(ii).fill(hit.getTime());
-                        channelTimeVsEnergyPlot.get(ii).fill(hit.getTime(),hit.getCorrectedEnergy());        
-                        if (do_update) viewer.addHit(new EcalHit(column,row, hit.getCorrectedEnergy()));         
+                        channelTimeVsEnergyPlot.get(ii).fill(hit.getTime(),hit.getCorrectedEnergy());                                    
                         }
+                    if ((do_update)){
+                    	if ((hitE>minEch)&&(hitE<maxEch)){
+                    		viewer.addHit(new EcalHit(column,row, hitE));  //before was in >0 check
+                    	}
+                    	else if (hitE>maxEch){
+                    		viewer.addHit(new EcalHit(column,row, maxEch));  
+                    	}
+                    	
+                   
+                    
+                    	
+                    	
+                    	}
                  } 
             }
         }
@@ -230,10 +265,12 @@
                 if (do_update){
                 the_cluster=new Cluster(seedHit.getIdentifierFieldValue("ix"), seedHit.getIdentifierFieldValue("iy"), cluster.getEnergy());
                 for (CalorimeterHit hit : cluster.getCalorimeterHits()) {
-                    if (hit.getRawEnergy() > 0) 
-                        column=hit.getIdentifierFieldValue("ix");
+                	hitE=hit.getCorrectedEnergy();
+                	if ((hitE>minEch)&&(hitE<maxEch)){               
+                		column=hit.getIdentifierFieldValue("ix");
                         row=hit.getIdentifierFieldValue("iy");                	
                         the_cluster.addComponentHit(hit.getIdentifierFieldValue("ix"),hit.getIdentifierFieldValue("iy"));
+                    }
                 }         
                 viewer.addCluster(the_cluster);
                }
@@ -246,19 +283,25 @@
         	for (RawTrackerHit hit : hits) {
         		 row=hit.getIdentifierFieldValue("iy");
                  column=hit.getIdentifierFieldValue("ix");
-                 if ((row!=0)&&(column!=0)&&(!ECalUtils.isInHole(row,column))){
-                     ii = ECalUtils.getHistoIDFromRowColumn(row,column);
-                     if (isFirstRaw[ii]){ //at the very first hit we read for this channel, we need to read the window length and save it
-                    	 isFirstRaw[ii]=false;
-                    	 windowRaw[ii]=hit.getADCValues().length;                   	 
-                    	 channelRawWaveform.set(ii,aida.histogram1D(detector.getDetectorName() + " : " + inputCollectionRaw + " : Raw Waveform : " + (column) + " "+ (row)+ ": "+ii,windowRaw[ii],-0.5*ECalUtils.ecalReadoutPeriod,(-0.5+windowRaw[ii])*ECalUtils.ecalReadoutPeriod));
-                     }
-                     if (do_update){
-                         channelRawWaveform.get(ii).reset();                     
-                         for (int jj = 0; jj < windowRaw[ii]; jj++) {
-                             channelRawWaveform.get(ii).fill(jj*ECalUtils.ecalReadoutPeriod, hit.getADCValues()[jj]*ECalUtils.adcResolution*1000);
-                         }                
-                     } 
+                 if ((row!=0)&&(column!=0)){
+                	 if (!ECalUtils.isInHole(row,column)||(enableAllFadc)){
+                	 
+                		 ii = ECalUtils.getHistoIDFromRowColumn(row,column);
+                		 if (isFirstRaw[ii]){ //at the very first hit we read for this channel, we need to read the window length and save it
+                			 isFirstRaw[ii]=false;
+                			 windowRaw[ii]=hit.getADCValues().length;                   	 
+                			 channelRawWaveform.set(ii,aida.histogram1D(detector.getDetectorName() + " : " + inputCollectionRaw + " : Raw Waveform : " + (column) + " "+ (row)+ ": "+ii,windowRaw[ii],-0.5*ECalUtils.ecalReadoutPeriod,(-0.5+windowRaw[ii])*ECalUtils.ecalReadoutPeriod));
+                		 }
+                		 if (do_update){
+                			 channelRawWaveform.get(ii).reset();                     
+                			 for (int jj = 0; jj < windowRaw[ii]; jj++) {
+                				 channelRawWaveform.get(ii).fill(jj*ECalUtils.ecalReadoutPeriod, hit.getADCValues()[jj]*ECalUtils.adcResolution*1000);
+                			 }                  
+                			 result=ECalUtils.computeAmplitude(hit.getADCValues(),windowRaw[ii],pedSamples);
+                			 channelRawWaveform.get(ii).setTitle("Ampl: "+String.format("%.2f",result[0])+" mV , ped : "+String.format("%.2f",result[1])+" "+String.format("%.2f",result[2])+" ADC counts");
+                			 plotter.region(3).refresh();
+                		 } 	
+                	 }
                  }
             }
         }
@@ -310,50 +353,86 @@
     @Override
 	public void crystalClicked(CrystalEvent e){
     
-    	int itmpx,itmpy;
+    	
     	Point displayPoint,ecalPoint;
     	displayPoint=e.getCrystalID();
     	ecalPoint=viewer.toEcalPoint(displayPoint);
     	itmpx=(int) ecalPoint.getX(); //column
     	itmpy=(int) ecalPoint.getY(); //row
     	
-    	if ((itmpx!=0)&&(itmpy!=0)&&(!ECalUtils.isInHole(itmpy,itmpx))){
-    		ix=itmpx;
-    		iy=itmpy;
-    	    id=ECalUtils.getHistoIDFromRowColumn(iy,ix);
-    	    System.out.println("Crystal event: "+ix+" "+iy+" "+id);
-        
-    	
-       	
-           	plotter.region(0).clear();
-            plotter.region(0).plot(channelEnergyPlot.get(id));
-            plotter.region(0).style().xAxisStyle().setLabel("Hit energy (GeV)");
-            plotter.region(0).style().yAxisStyle().setLabel("");
-            
-            plotter.region(1).clear();
-            plotter.region(1).plot(channelTimePlot.get(id));           	    
-            plotter.region(1).style().xAxisStyle().setLabel("Hit Time (ns)");
-            plotter.region(1).style().yAxisStyle().setLabel("");
-
-    	    plotter.region(2).clear();
-        	plotter.region(2).plot(channelTimeVsEnergyPlot.get(id));
-            plotter.region(2).style().yAxisStyle().setLabel("Hit Energy (GeV)");
-            plotter.region(2).style().xAxisStyle().setLabel("Hit Time (ns)");
+    	if ((itmpx!=0)&&(itmpy!=0))
+    		if (!ECalUtils.isInHole(itmpy,itmpx)||(enableAllFadc)){
+    			ix=itmpx;
+    			iy=itmpy;
+    			id=ECalUtils.getHistoIDFromRowColumn(iy,ix);
+    			System.out.println("Crystal event: "+ix+" "+iy+" "+id);
+        
+    	    
+    	    
+    	    
+    	    
+    			plotter.region(0).clear();
+    			pstyle.xAxisStyle().setLabel("Hit energy (GeV)");
+    			pstyle.yAxisStyle().setLabel("");
+    			plotter.region(0).plot(channelEnergyPlot.get(id),pstyle);
+       
+    			plotter.region(1).clear();
+    			pstyle.xAxisStyle().setLabel("Hit Time (ns)");
+    			pstyle.yAxisStyle().setLabel("");    
+    			plotter.region(1).plot(channelTimePlot.get(id),pstyle);           	    
+     
+    			plotter.region(2).clear();
+    			pstyle.xAxisStyle().setLabel("Hit Time (ns)");
+    			pstyle.yAxisStyle().setLabel("Hit Energy (GeV)");    
+    			plotter.region(2).plot(channelTimeVsEnergyPlot.get(id),pstyle);
+
+    			plotter.region(3).clear();
         	
-    	    plotter.region(3).clear();
-    	    plotter.region(3).plot(channelRawWaveform.get(id));
-    	    if (!isFirstRaw[id]){
-    	        plotter.region(3).style().yAxisStyle().setLabel("Signal amplitude (mV)");
-                plotter.region(3).style().xAxisStyle().setLabel("Time (ns)");
-                plotter.region(3).style().dataStyle().fillStyle().setColor("orange");
-                plotter.region(3).style().dataStyle().markerStyle().setColor("orange");
-                plotter.region(3).style().dataStyle().errorBarStyle().setVisible(false);
-    	    }
-    	    else{
-    	    	 plotter.region(3).style().xAxisStyle().setLabel("Hit energy (GeV)");
-    	         plotter.region(3).style().yAxisStyle().setLabel("");
-    	    }
+        	 
+    			if (!isFirstRaw[id]){
+    				pstyle.yAxisStyle().setLabel("Signal amplitude (mV)");
+    				pstyle.xAxisStyle().setLabel("Time (ns)");
+    				pstyle.dataStyle().fillStyle().setColor("orange");
+    				pstyle.dataStyle().markerStyle().setColor("orange");
+    				pstyle.dataStyle().errorBarStyle().setVisible(false);
+    			}
+    			else{
+    				pstyle.xAxisStyle().setLabel("Hit Energy (GeV)");    
+    				pstyle.yAxisStyle().setLabel("");  	    
+    			}
+    			plotter.region(3).plot(channelRawWaveform.get(id),pstyle);       
     	}
     }    
+    
+    
+    /*
+     * This method set the default style.
+     */
+    public IPlotterStyle createDefaultStyle() {
+    	IPlotterStyle pstyle = plotterFactory.createPlotterStyle();
+    	// Axis appearence.
+    	pstyle.xAxisStyle().labelStyle().setBold(true);
+    	pstyle.yAxisStyle().labelStyle().setBold(true);
+    	pstyle.xAxisStyle().tickLabelStyle().setBold(true);
+    	pstyle.yAxisStyle().tickLabelStyle().setBold(true);
+    	pstyle.xAxisStyle().lineStyle().setColor("black");
+    	pstyle.yAxisStyle().lineStyle().setColor("black");
+    	pstyle.xAxisStyle().lineStyle().setThickness(2);
+    	pstyle.yAxisStyle().lineStyle().setThickness(2);
+    	
+    	pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+    	pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins",Boolean.FALSE.toString());
+    	pstyle.dataStyle().errorBarStyle().setVisible(false);
+        pstyle.setParameter("hist2DStyle", "colorMap");
+    	// Force auto range to zero.
+    	pstyle.yAxisStyle().setParameter("allowZeroSuppression", "false");
+    	pstyle.xAxisStyle().setParameter("allowZeroSuppression", "false");
+    	// Title style.
+    	pstyle.titleStyle().textStyle().setFontSize(20);
+    	// Draw caps on error bars.
+    	pstyle.dataStyle().errorBarStyle().setParameter("errorBarDecoration", (new Float(1.0f)).toString());
+    	// Turn off grid lines until explicitly enabled.
+    	pstyle.gridStyle().setVisible(false);
+    	return pstyle;
+    	}   
 }
-

Added: java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/DummyRecon.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/DummyRecon.lcsim	(added)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/DummyRecon.lcsim	Thu Nov  6 01:19:32 2014
@@ -0,0 +1,55 @@
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
+    <control>
+        <numberOfEvents>-1</numberOfEvents> 
+        <printInputFiles>true</printInputFiles>
+        <printDriversDetailed>true</printDriversDetailed>
+    </control>    
+    <execute>
+        <driver name="EventMarkerDriver"/>
+  <!--      <driver name="ConditionsDriver"/> -->
+        <driver name="CalibrationDriver"/>
+        <driver name="EcalRawConverter"/>     
+        <driver name="EcalChannelsAmplitude"/>     
+ 		
+
+
+<!--        <driver name="RunControlDriver" />-->
+      <driver name="AidaSaveDriver"/>
+      <driver name="CleanupDriver"/>
+    </execute>   
+    
+<!--  Here starts the drivers description -->
+    <drivers>
+       <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1</eventInterval>
+        </driver>
+
+        <driver name="CalibrationDriver" type="org.hps.conditions.deprecated.CalibrationDriver"/>   
+        
+        <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
+<!--            <threshold>150</threshold>-->
+            <applyBadCrystalMap>false</applyBadCrystalMap>
+<!--            <dropBadFADC>true</dropBadFADC>-->
+        </driver> 
+        
+            
+        <driver name="EcalChannelsAmplitude" type="org.hps.users.celentan.EcalChannelsAmplitude">
+            <inputCollection>EcalCalHits</inputCollection>
+            <inputCollectionRaw>EcalReadoutHits</inputCollectionRaw>
+            <inputClusterCollection>EcalClusters</inputClusterCollection>
+            <enableAllFadc>true</enableAllFadc>
+            <pedSamples>20</pedSamples>
+            <maxEch>10.0</maxEch>
+            <minEch>-0.01</minEch>
+            <eventRefreshRate>100</eventRefreshRate>
+        </driver>
+      
+         <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
+            <outputFileName>${outputFile}</outputFileName>
+        </driver>
+            
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/>
+    </drivers>
+</lcsim>
+    

Added: java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/PedestalComputationRaw.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/PedestalComputationRaw.lcsim	(added)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/PedestalComputationRaw.lcsim	Thu Nov  6 01:19:32 2014
@@ -0,0 +1,36 @@
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">       
+    <control>
+        <numberOfEvents>-1</numberOfEvents> 
+        <printInputFiles>true</printInputFiles>
+        <printDriversDetailed>true</printDriversDetailed>
+    </control>    
+    <execute>
+        <driver name="EventMarkerDriver"/>
+  <!--      <driver name="ConditionsDriver"/> -->
+        <driver name="CalibrationDriver"/>
+        <driver name="EcalRawConverter"/>     
+        <driver name="Pedestal"/>        
+
+
+<!--        <driver name="RunControlDriver" />-->
+        <!--<driver name="AidaSaveDriver"/>-->
+    </execute>   
+    
+<!--  Here starts the drivers description -->
+    <drivers>
+       <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>1</eventInterval>
+        </driver>
+
+        <driver name="CalibrationDriver" type="org.hps.conditions.deprecated.CalibrationDriver"/>   
+        
+        <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">
+<!--            <threshold>150</threshold>-->
+            <applyBadCrystalMap>false</applyBadCrystalMap>
+<!--            <dropBadFADC>true</dropBadFADC>-->
+        </driver> 
+        <driver name="Pedestal" type="org.hps.users.celentan.RawPedestalComputator"/>               
+    </drivers>
+</lcsim>
+    

Added: java/trunk/users/src/main/java/org/hps/users/celentan/EcalChannelsAmplitude.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/celentan/EcalChannelsAmplitude.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/celentan/EcalChannelsAmplitude.java	Thu Nov  6 01:19:32 2014
@@ -0,0 +1,201 @@
+package org.hps.users.celentan;
+
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.ICloud1D;
+import hep.aida.ICloud2D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotterStyle;
+
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+import java.lang.System;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.IOException;
+
+import org.hps.recon.ecal.ECalUtils;
+import org.hps.recon.ecal.HPSEcalCluster;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *  The driver <code>EcalChannelAmplitude</code> implements the histogram shown to the user 
+ * in the fifth tab of the Monitoring Application, when using the Ecal monitoring lcsim file.
+ * The implementation is as follows:
+ * - The event display is opened in a separate window
+ * - It is updated regularly, according to the event refresh rate
+ * - If the user clicks on a crystal, the corresponding energy and time distributions (both Histogram1D) are shown in the last panel of the MonitoringApplication,
+ * as well as a 2D histogram (hit time vs hit energy). Finally, if available, the raw waveshape (in mV) is displayed.
+ * 
+ * @author Andrea Celentano
+ *  *
+ */
+
+public class EcalChannelsAmplitude extends Driver{
+
+  
+    String inputCollection = "EcalCalHits";
+    String inputCollectionRaw = "EcalReadoutHits";
+    String clusterCollection = "EcalClusters";
+
+    private AIDA aida=AIDA.defaultInstance();
+    private Detector detector;
+  
+    int eventRefreshRate = 1;
+    int eventn = 0;
+	int ix,iy,id;
+	int pedSamples=10;
+	
+	double amp,ped,sigma;
+	double hitE;
+    int[] windowRaw=new int[47*11];//in case we have the raw waveform, this is the window lenght (in samples)
+	boolean[] isFirstRaw=new boolean[47*11];
+	
+	
+	boolean enableAllFadc=false; 
+   
+
+    
+    ArrayList<IHistogram1D> channelAmplitudePlot;
+    ArrayList<IHistogram1D> channelRawWaveform;
+   
+   
+    
+    double maxEch = 2500 * ECalUtils.MeV;
+    double minEch = -0.1;
+    
+    int itmpx,itmpy;
+    
+    public  EcalChannelsAmplitude() {
+    	
+    }
+
+    public void setEnableAllFadc(boolean enableAllFadc){
+        this.enableAllFadc = enableAllFadc;
+    }
+    
+    public void setMaxEch(double maxEch) {
+        this.maxEch = maxEch;
+    }
+    
+    public void setMinEch(double minEch) {
+        this.minEch = minEch;
+    }
+    
+    public void setPedSamples(int pedSamples) {
+        this.pedSamples = pedSamples;
+    }
+    
+    public void setInputCollection(String inputCollection) {
+        this.inputCollection = inputCollection;
+    }
+    
+    public void setInputCollectionRaw(String inputCollectionRaw) {
+        this.inputCollectionRaw = inputCollectionRaw;
+    }
+    
+    public void setInputClusterCollection(String inputClusterCollection) {
+        this.clusterCollection = inputClusterCollection;
+    }
+    
+    public void setEventRefreshRate(int eventRefreshRate) {
+        this.eventRefreshRate = eventRefreshRate;
+    }
+    
+    @Override
+    public void detectorChanged(Detector detector) {
+    	System.out.println("Ecal event display detector changed");
+        this.detector = detector;
+    	
+    	aida.tree().cd("/");
+    	
+      
+    	
+       channelAmplitudePlot=new ArrayList<IHistogram1D>();
+       channelRawWaveform=new ArrayList<IHistogram1D>();
+       //create the histograms for single channel energy and time distribution.
+       for(int ii = 0; ii < (47*11); ii = ii +1){
+             int row=ECalUtils.getRowFromHistoID(ii);
+             int column=ECalUtils.getColumnFromHistoID(ii);      
+             channelAmplitudePlot.add(aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : Hit Amplitude : " + (column) + " "+ (row)+ ": "+ii, 100, -.2, 2100.));           
+             channelRawWaveform.add(aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : Hit Amplitude : " + (column) + " "+ (row)+ ": "+ii));
+             //the above instruction is a terrible hack, just to fill the arrayList with all the elements. They'll be initialized properly during the event readout,
+             //since we want to account for possibly different raw waveform dimensions!
+         
+             
+             isFirstRaw[ii]=true;
+             windowRaw[ii]=1;
+       }
+       id=0;
+       iy=ECalUtils.getRowFromHistoID(id);
+   	   ix=ECalUtils.getColumnFromHistoID(id);        
+    }
+
+    @Override
+    public void endOfData() {
+     System.out.println("END OF DATA");
+    }
+
+    @Override
+    public void process(EventHeader event){
+    	
+    	  int ii;
+          int row = 0;
+          int column = 0;
+          double[] result;
+          
+           	
+     if (event.hasCollection(RawTrackerHit.class, inputCollectionRaw)){       	
+        	List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollectionRaw);
+        	for (RawTrackerHit hit : hits) {
+                row=hit.getIdentifierFieldValue("iy");
+                column=hit.getIdentifierFieldValue("ix");        
+                ii = ECalUtils.getHistoIDFromRowColumn(row,column);             
+                if ((row!=0)&&(column!=0)&&(!(ECalUtils.isInHole(row,column)))){
+                	if (isFirstRaw[ii]){ //at the very first hit we read for this channel, we need to read the window length and save it
+           			 isFirstRaw[ii]=false;
+           			 windowRaw[ii]=hit.getADCValues().length;                   	 
+           			 channelRawWaveform.set(ii,aida.histogram1D(detector.getDetectorName() + " : " + inputCollectionRaw + " : Raw Waveform : " + (column) + " "+ (row)+ ": "+ii,windowRaw[ii],-0.5*ECalUtils.ecalReadoutPeriod,(-0.5+windowRaw[ii])*ECalUtils.ecalReadoutPeriod));
+           		 }                       
+                 result=ECalUtils.computeAmplitude(hit.getADCValues(),windowRaw[ii],pedSamples);
+                 channelAmplitudePlot.get(ii).fill(result[0]);                                    
+                 } 
+            }
+        }        
+     
+    }
+    
+    /*
+    @Override
+    public void reset(){
+        for(int ii = 0; ii < (47*11); ii = ii +1){         
+            channelEnergyPlot.get(ii).reset();
+            channelTimePlot.get(ii).reset();
+            channelTimeVsEnergyPlot.get(ii).reset();
+        }
+    }
+    */
+    
+    
+	
+	
+    
+    
+}
+
+
+
+
+
+

Added: java/trunk/users/src/main/java/org/hps/users/celentan/RawPedestalComputator.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/celentan/RawPedestalComputator.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/celentan/RawPedestalComputator.java	Thu Nov  6 01:19:32 2014
@@ -0,0 +1,131 @@
+package org.hps.users.celentan;
+
+import java.util.List;
+
+import org.hps.conditions.deprecated.EcalConditions;
+import org.hps.recon.ecal.ECalUtils;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.lcio.LCIOConstants;
+import org.lcsim.util.Driver;
+import java.io.PrintWriter;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+
+public class RawPedestalComputator extends Driver{
+	
+	   String inputCollectionRaw = "EcalReadoutHits";
+	   int row,column;
+	   
+	   int[] windowRaw=new int[47*11];//in case we have the raw waveform, this is the window lenght (in samples)
+	   boolean[] isFirstRaw=new boolean[47*11];  
+	   
+	   double[] pedestal=new double[47*11];
+	   double[] noise=new double[47*11];
+	   double[] result;
+	   
+	   int pedSamples=50;
+	   int nEvents=0;
+	   @Override
+	    public void detectorChanged(Detector detector) {
+	    	System.out.println("Pedestal computator: detector changed");
+	    	for (int ii=0;ii<11*47;ii++){
+	    		isFirstRaw[ii]=true;
+	    		pedestal[ii]=0;
+	    		noise[ii]=0;
+	    	}
+	   }
+	   
+
+	    @Override
+	    public void process(EventHeader event) {
+	    	int ii=0;
+	    	if (event.hasCollection(RawTrackerHit.class, inputCollectionRaw)){       	
+	    		List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollectionRaw);
+	          	for (RawTrackerHit hit : hits) {
+	          		row=hit.getIdentifierFieldValue("iy");
+	                column=hit.getIdentifierFieldValue("ix");	
+	                ii = ECalUtils.getHistoIDFromRowColumn(row,column);
+	                if ((row!=0)&&(column!=0)){
+	                	if (!ECalUtils.isInHole(row,column)){
+	                		if (isFirstRaw[ii]){ //at the very first hit we read for this channel, we need to read the window length and save it
+	                			isFirstRaw[ii]=false;
+	                			windowRaw[ii]=hit.getADCValues().length;  
+	                		 }
+	                  		result=ECalUtils.computeAmplitude(hit.getADCValues(),windowRaw[ii],pedSamples);
+	                  		pedestal[ii]+=result[1];
+	                  		noise[ii]+=result[2];	                  		
+	                	}
+	                }	
+	          	}		
+	    	  }	
+	    	nEvents++;
+	    }
+	    
+	    @Override
+	    public void endOfData() {
+	    	try{
+	    	PrintWriter writerTop = new PrintWriter("default01.ped","UTF-8");
+    		PrintWriter writerBottom = new PrintWriter("default02.ped","UTF-8");	
+	    	
+	    	for (int ii=0;ii<11*47;ii++){	    	
+	    		int row,column;	
+	    		row=ECalUtils.getRowFromHistoID(ii);
+	    		column=ECalUtils.getColumnFromHistoID(ii);
+	    		if (ECalUtils.isInHole(row,column)) continue;
+   				if ((row==0)||(column==0)) continue;
+	    		pedestal[ii]/=nEvents;
+	    		noise[ii]/=nEvents;
+
+	    		long daqID=EcalConditions.physicalToDaqID(EcalConditions.makePhysicalID(column,row));
+	    		
+	    		int crate=EcalConditions.getCrate(daqID);
+	    		int slot=EcalConditions.getSlot(daqID);
+	    		int channel=EcalConditions.getChannel(daqID);
+
+	    		System.out.println(column+" "+row+" "+crate+" "+slot+" "+channel+" "+pedestal[ii]+" "+noise[ii]);
+	    		
+	    		
+	    		
+	    		if (crate==37){
+	    			writerTop.print(slot+" "+channel+" "+(int)(Math.round(pedestal[ii]))+" "+(int)(Math.round(noise[ii]))+"\r\n");
+	    		}
+	    		else if (crate==39){
+	    			writerBottom.print(slot+" "+channel+" "+(int)(Math.round(pedestal[ii]))+" "+(int)(Math.round(noise[ii]))+"\r\n");
+	    		}
+	    		
+	    	}
+
+    		writerTop.close();
+    		writerBottom.close();
+	    	}
+	    	 catch(FileNotFoundException fnfe)
+	        {
+
+	            System.out.println(fnfe.getMessage());
+
+	        }
+
+	        catch(IOException ioe)
+	        {
+
+	            System.out.println(ioe.getMessage());
+
+	        }
+	    }
+}
+
+
+
+
+
+
+
+
+
+

Modified: java/trunk/users/src/main/java/org/hps/users/celentan/StripChartTest.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/celentan/StripChartTest.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/celentan/StripChartTest.java	Thu Nov  6 01:19:32 2014
@@ -6,5 +6,5 @@
  */
 public class StripChartTest  {
            
-    
+	int dummy;    
 }