Print

Print


Author: [log in to unmask]
Date: Fri Feb  6 10:06:18 2015
New Revision: 2063

Log:
LedAnalysis driver, work in progress

Added:
    java/trunk/users/src/main/java/org/hps/users/celentan/LedAnalysis.java

Added: java/trunk/users/src/main/java/org/hps/users/celentan/LedAnalysis.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/celentan/LedAnalysis.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/celentan/LedAnalysis.java	Fri Feb  6 10:06:18 2015
@@ -0,0 +1,188 @@
+package org.hps.users.celentan;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+import org.lcsim.geometry.Detector;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.base.BaseRawCalorimeterHit;
+
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterStyle;
+import hep.aida.IPlotterFactory;
+import hep.aida.IHistogramFactory;
+import hep.aida.ICloud1D;
+import hep.aida.ICloud2D;
+
+
+import org.hps.recon.ecal.ECalUtils;
+import org.hps.monitoring.ecal.plots.EcalMonitoringUtilities;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.database.TableConstants;
+import org.hps.conditions.ecal.EcalChannel;
+import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
+import org.hps.conditions.ecal.EcalConditions;
+import org.hps.conditions.ecal.EcalLed;
+import org.hps.conditions.ecal.EcalLed.EcalLedCollection;
+import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
+
+public class LedAnalysis extends Driver{
+	
+	private static final int NUM_CHANNELS = 11 * 47;
+	
+	String inputCollectionRaw = "EcalReadoutHits";
+	String inputCollection = "EcalCalHits";	
+	AIDA aida;
+		
+	DatabaseConditionsManager conditionsManager;
+	
+	EcalChannelCollection ChannelCollection;	
+    EcalLedCollection LedCollection;
+    Map < Integer,Integer > LedTopMap;
+    Map < Integer,Integer > LedBotMap;
+    
+    private int id,row,column,chid,ledid,driverid;
+    private int eventN = 0;
+	private int nDrivers = 8;
+	private int nSteps = 56;
+	private  int[][] LEDStep = new int[][]{
+			//first 4 are the flasher1 sequence, TOP controller 
+			{2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,434,44,45,46,47,48,49,50,51,52,53,54,55,56,-1},
+			{57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1},
+			{112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,130,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168}, //missing 135 is ok
+			{169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,-1},
+			//second 4 are the flasher2 sequence, BOTTOM controller 
+			{2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,434,44,45,46,47,48,49,50,51,52,53,54,55,56,-1},	
+			{57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113}, //missing 69 is OK
+			{114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,130,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,-1},	
+			{169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,-1},
+			};
+			
+	private int[] iStep = new int[nDrivers];
+	private int[] nEvents = new int[NUM_CHANNELS];
+	//Histograms
+	private ArrayList<IHistogram1D> hRaw;
+	private ArrayList<ICloud1D> hStrip;
+	
+	@Override
+	protected void detectorChanged(Detector detector) {
+		System.out.println("LedAnalysis::Detector changed was called");
+
+		// Setup conditions
+		
+		conditionsManager = DatabaseConditionsManager.getInstance();
+
+	    LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value: 
+	    LedBotMap = new HashMap< Integer , Integer >();	
+		
+        ChannelCollection = conditionsManager.getCachedConditions(EcalChannel.EcalChannelCollection.class, "ecal_channels").getCachedData();	
+		LedCollection = conditionsManager.getConditionsData(EcalLedCollection.class, TableConstants.ECAL_LEDS);
+		
+		for (EcalChannel channel : ChannelCollection){
+			chid = channel.getChannelId();
+			for (EcalLed Led : LedCollection) {    	
+				if (Led.getEcalChannelId()==chid){
+					if (channel.getY()>0){
+						LedTopMap.put( chid , Led.getLedNumber() );
+					}
+					else if (channel.getY()<0){
+						LedBotMap.put( chid , Led.getLedNumber() );
+					}
+				}
+			}
+		}
+		
+		
+		// Setup plots
+		aida = AIDA.defaultInstance();
+		aida.tree().cd("/");
+		
+	  //  IPlotterFactory factory= aida.analysisFactory().createPlotterFactory("ECAL DAQ Plots");
+		
+		hRaw = new ArrayList<IHistogram1D>(NUM_CHANNELS);
+		hStrip = new ArrayList<ICloud1D>(NUM_CHANNELS);
+		
+		
+		
+		for (int ii=0;ii<NUM_CHANNELS;ii++){
+			int row = EcalMonitoringUtilities.getRowFromHistoID(ii);
+			int column = EcalMonitoringUtilities.getColumnFromHistoID(ii);
+			
+			// Initialize the histograms for the current crystal channel.
+			hRaw.add(aida.histogram1D("h1_"+ii, 1000, -1,30));
+			hStrip.add(aida.cloud1D("strip_"+ii,100000));
+		}
+		
+	}		
+	     
+	@Override
+	public void process(EventHeader event) {
+		eventN++;
+		if (event.hasCollection(CalorimeterHit.class, inputCollection)) {
+			//List<BassRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw);
+			List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection);
+			for (CalorimeterHit hit : hits) {
+			
+				column = hit.getIdentifierFieldValue("ix");
+				row = hit.getIdentifierFieldValue("iy");
+				id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column);
+							
+				//find the LED
+				chid = ChannelCollection.findGeometric(hit.getCellID()).getChannelId();
+				if (row>0){
+					ledid=LedTopMap.get(chid);
+				}
+				else if (row<0){
+					ledid=LedBotMap.get(chid);
+				}
+				driverid=getDriver(ledid);
+				if (row<0) driverid+=4;
+				
+				/*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/
+				if (iStep[driverid]<(nSteps-1)){
+					if (ledid==LEDStep[driverid][iStep[driverid]+1]){
+						iStep[driverid]++;
+						System.out.println("LedAnalysis:: increment step "+driverid+" "+ledid+" "+column+" "+row+" "+id);
+					}	
+				}
+				/*Case 1: this led is the one in the corresponding step*/;
+				if (ledid==LEDStep[driverid][iStep[driverid]]){
+					hRaw.get(id).fill(hit.getCorrectedEnergy());
+					hStrip.get(id).fill(nEvents[id],hit.getCorrectedEnergy());
+					nEvents[id]++;
+				}
+				else{	/*Case 2: this led is not one in the corresponding step (but maybe is the neighborhood??Ctalk??)*/;
+					
+				}
+				
+		   }		
+	   }		
+	}
+	@Override
+	public void endOfData() {
+		System.out.println("LedAnalysis::end of data");
+	}	
+	
+	/**
+	 * This function returns the driver number (from 0 to 3) given the LED id.
+	 * @param led
+	 * @return
+	 */
+	public int getDriver(int led){
+		int ret=-1;	
+		if ((led>=2)&&(led<56)) ret=0;
+		else if ((led>=56)&&(led<112)) ret=1;
+		else if ((led>=112)&&(led<168)) ret=2;
+		else if ((led>=168)&&(led<224)) ret=3;
+		return ret;
+	}
+}