Print

Print


Author: [log in to unmask]
Date: Fri Dec 12 19:40:53 2014
New Revision: 1710

Log:
move the added mode 7 data to GenericObject+LCRelation

Modified:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/HPSRawCalorimeterHit.java
    java/trunk/evio/src/main/java/org/hps/evio/ECalEvioReader.java

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java	Fri Dec 12 19:40:53 2014
@@ -3,19 +3,21 @@
 import org.hps.conditions.database.TableConstants;
 import org.hps.conditions.ecal.EcalChannelConstants;
 import org.hps.conditions.ecal.EcalConditions;
-//import org.hps.evio.EventConstants;
+import org.hps.recon.ecal.HitExtraData.Mode7Data;
 import org.lcsim.conditions.ConditionsManager;
 import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.GenericObject;
 import org.lcsim.event.RawCalorimeterHit;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.base.BaseRawCalorimeterHit;
 import org.lcsim.geometry.Detector;
 
 /**
- * This class is used to convert {@link org.lcsim.event.RawCalorimeterHit} objects
- * to {@link org.lcsim.event.CalorimeterHit} objects with energy information.
- * It has methods to convert pedestal subtracted ADC counts to energy.  
- * 
+ * This class is used to convert {@link org.lcsim.event.RawCalorimeterHit}
+ * objects to {@link org.lcsim.event.CalorimeterHit} objects with energy
+ * information. It has methods to convert pedestal subtracted ADC counts to
+ * energy.
+ *
  * @author Sho Uemura <[log in to unmask]>
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Andrea Celentano <[log in to unmask]>
@@ -25,10 +27,10 @@
     private boolean constantGain = false;
     private double gain;
     private boolean use2014Gain = true;
-    
+
     private EcalConditions ecalConditions = null;
 
-    public EcalRawConverter() {	
+    public EcalRawConverter() {
     }
 
     public void setGain(double gain) {
@@ -41,7 +43,7 @@
     }
 
     public short sumADC(RawTrackerHit hit) {
-        EcalChannelConstants channelData = findChannel(hit.getCellID());        
+        EcalChannelConstants channelData = findChannel(hit.getCellID());
         double pedestal = channelData.getCalibration().getPedestal();
         short sum = 0;
         short samples[] = hit.getADCValues();
@@ -72,54 +74,18 @@
         HPSCalorimeterHit h2 = new HPSCalorimeterHit(rawEnergy, time + timeOffset, id, 0);
         return h2;
     }
-    
 
-    /**
-     * A.C. This is the method used to handle both the mode3 and mode7 pulse integrals.
-     * 
-     * @param hit The raw calorimeter hit
-     * @param timeOffset The time offset
-     * @return The calibrated calorimeter hit
-     * 
-     * @TODO Check the pedestal subtraction
-     * @TODO A.C. I am not a maven expert, and I can' import org.hps.evio.EventConstants and use the 2 constants  ECAL_PULSE_INTEGRAL_MODE and  ECAL_PULSE_INTEGRAL_HIGHRESTDC_MODE.
-     * It seems to me there's a "circular" dependency problem (evio depends on hps-tracking, that depends on ecal-readout-sim, that depends on ecal-recon.
-     * Therefore, ecal-recon can't depend on hps-evio, and I can't import org.hps.evio.EventConstants....
-     */
-    public CalorimeterHit HitDtoA(HPSRawCalorimeterHit hit,double timeOffset) {
-        if (hit.mode==3){ // mode 3
-        	if (hit.getTimeStamp() % 64 != 0) {
-                System.out.println("unexpected timestamp " + hit.getTimeStamp());
-            }
-            double time = hit.getTimeStamp() / 16.0;
-            long id = hit.getCellID();
-            // Get the channel data.
-            EcalChannelConstants channelData = findChannel(id);
-            double adcSum = hit.getAmplitude() - hit.windowSize * channelData.getCalibration().getPedestal();
-            double rawEnergy = adcToEnergy(adcSum, id);
-            HPSCalorimeterHit h2 = new HPSCalorimeterHit(rawEnergy, time + timeOffset, id, 0);
-            return h2;
-        }
-        else if (hit.mode==4){ // mode 7
-        	double time = hit.getTimeStamp() * 62.5 / 1000; //in mode 7 time is in 62.5 ps units!
-            long id = hit.getCellID();
-            // Get the channel data.
-            EcalChannelConstants channelData = findChannel(id);
-            double adcSum = hit.getAmplitude() - hit.windowSize * channelData.getCalibration().getPedestal(); //A.C. is this the proper way to pedestal subtract in mode 7?
-            //double adcSum = hit.getAmplitude() - hit.windowSize * hit.amplLow;                              //A.C. is this the proper way to pedestal subtract in mode 7?
-            double rawEnergy = adcToEnergy(adcSum, id);
-            HPSCalorimeterHit h2 = new HPSCalorimeterHit(rawEnergy, time + timeOffset, id, 0);
-            return h2;
-        }
-        else{
-        	System.out.println("Unexpected hit type (FADC acq. mode)");
-        	long id = hit.getCellID();
-        	EcalChannelConstants channelData = findChannel(id);
-            double adcSum = hit.getAmplitude() - hit.windowSize * channelData.getCalibration().getPedestal();
-        	double rawEnergy = adcToEnergy(adcSum, id);
-        	HPSCalorimeterHit h2 = new HPSCalorimeterHit(rawEnergy, 0, id, 0); //Time=0 since I do not know which time to use (mode3 or mode7?)
-            return h2;
-        }  
+    public CalorimeterHit HitDtoA(RawCalorimeterHit hit, GenericObject mode7Data, int window, double timeOffset) {
+        double time = hit.getTimeStamp() / 16.0; //timestamps use the full 62.5 ps resolution
+        long id = hit.getCellID();
+        // Get the channel data.
+        EcalChannelConstants channelData = findChannel(id);
+        double adcSum = hit.getAmplitude() - window * channelData.getCalibration().getPedestal();
+//        double adcSum = hit.getAmplitude() - window * Mode7Data.getAmplLow(mode7Data);                              //A.C. is this the proper way to pedestal subtract in mode 7?
+
+        double rawEnergy = adcToEnergy(adcSum, id);
+        HPSCalorimeterHit h2 = new HPSCalorimeterHit(rawEnergy, time + timeOffset, id, 0);
+        return h2;
     }
 
     public RawCalorimeterHit HitAtoD(CalorimeterHit hit, int window) {
@@ -141,10 +107,10 @@
      * return energy (units of GeV) corresponding to the ADC sum and crystal ID
      */
     private double adcToEnergy(double adcSum, long cellID) {
-    	
+
         // Get the channel data.
         EcalChannelConstants channelData = findChannel(cellID);
-    	
+
         if (use2014Gain) {
             if (constantGain) {
                 return adcSum * ECalUtils.gainFactor * ECalUtils.ecalReadoutPeriod;
@@ -160,22 +126,24 @@
         }
     }
 
-    /** 
+    /**
      * Must be set when an object EcalRawConverter is created.
+     *
      * @param detector (long)
-     */   
+     */
     public void setDetector(Detector detector) {
         // ECAL combined conditions object.
         ecalConditions = ConditionsManager.defaultInstance()
                 .getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
     }
-    
-    /** 
+
+    /**
      * Convert physical ID to gain value.
+     *
      * @param cellID (long)
      * @return channel constants (EcalChannelConstants)
      */
     public EcalChannelConstants findChannel(long cellID) {
         return ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID));
-    }   
+    }
 }

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java	Fri Dec 12 19:40:53 2014
@@ -2,17 +2,20 @@
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.hps.conditions.database.TableConstants;
 import org.hps.conditions.ecal.EcalChannelConstants;
 import org.hps.conditions.ecal.EcalConditions;
 import org.hps.recon.ecal.HPSRawCalorimeterHit;
+import org.hps.recon.ecal.HPSRawCalorimeterHit.Mode7Data;
 import org.lcsim.conditions.ConditionsManager;
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
+import org.lcsim.event.LCRelation;
 import org.lcsim.event.RawCalorimeterHit;
 import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.base.BaseRelationalTable;
 import org.lcsim.geometry.Detector;
 import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.util.Driver;
@@ -31,6 +34,10 @@
     private String rawCollectionName = "EcalReadoutHits";
     private final String ecalReadoutName = "EcalHits";
     private String ecalCollectionName = "EcalCalHits";
+
+    private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations";
+//    private static final String extraDataCollectionName = "EcalReadoutExtraData";
+
     private int integralWindow = 35;
     private boolean debug = false;
     private double threshold = Double.NEGATIVE_INFINITY;
@@ -101,14 +108,14 @@
 
     @Override
     public void detectorChanged(Detector detector) {
-               
+
         // set the detector for the converter
         // FIXME: This method doesn't even need the detector object and does not use it.
         converter.setDetector(detector);
 
         // ECAL combined conditions object.
         ecalConditions = ConditionsManager.defaultInstance()
-                .getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();        
+                .getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
     }
 
     /**
@@ -191,30 +198,50 @@
                 event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);
             }
             if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) { //A.C. this is the case of the RAW pulse hits
-                List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName);
-
-                for (RawCalorimeterHit hit : hits) {
-                    if (debug) {
-                        System.out.format("old hit energy %d\n", hit.getAmplitude());
-                    }
-                    CalorimeterHit newHit;
-                    if (hit instanceof HPSRawCalorimeterHit){ //A.C. since (maybe) old reconstructed LCIO data have hits with BaseRawCalorimeterHit
-                    	newHit = converter.HitDtoA((HPSRawCalorimeterHit)hit,timeOffset);	
-                    }
-                    else{
-                    	newHit = converter.HitDtoA(hit, integralWindow, timeOffset);
-                    }
-                    if (newHit.getRawEnergy() > threshold) {
-                        if (applyBadCrystalMap && isBadCrystal(newHit)) {
-                            continue;
-                        }
-                        if (dropBadFADC && isBadFADC(newHit)) {
-                            continue;
-                        }
+                if (event.hasCollection(LCRelation.class, extraDataRelationsName)) { // extra information available from mode 7 readout
+                    List<LCRelation> extraDataRelations = event.get(LCRelation.class, extraDataRelationsName);
+                    for (LCRelation rel : extraDataRelations) {
+                        RawCalorimeterHit hit = (RawCalorimeterHit) rel.getFrom();
                         if (debug) {
-                            System.out.format("new hit energy %f\n", newHit.getRawEnergy());
-                        }
-                        newHits.add(newHit);
+                            System.out.format("old hit energy %d\n", hit.getAmplitude());
+                        }
+                        GenericObject extraData = (GenericObject) rel.getTo();
+                        CalorimeterHit newHit;
+                        newHit = converter.HitDtoA(hit, extraData, integralWindow, timeOffset);
+                        if (newHit.getRawEnergy() > threshold) {
+                            if (applyBadCrystalMap && isBadCrystal(newHit)) {
+                                continue;
+                            }
+                            if (dropBadFADC && isBadFADC(newHit)) {
+                                continue;
+                            }
+                            if (debug) {
+                                System.out.format("new hit energy %f\n", newHit.getRawEnergy());
+                            }
+                            newHits.add(newHit);
+                        }
+
+                    }
+                } else {
+                    List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName);
+                    for (RawCalorimeterHit hit : hits) {
+                        if (debug) {
+                            System.out.format("old hit energy %d\n", hit.getAmplitude());
+                        }
+                        CalorimeterHit newHit;
+                        newHit = converter.HitDtoA(hit, integralWindow, timeOffset);
+                        if (newHit.getRawEnergy() > threshold) {
+                            if (applyBadCrystalMap && isBadCrystal(newHit)) {
+                                continue;
+                            }
+                            if (dropBadFADC && isBadFADC(newHit)) {
+                                continue;
+                            }
+                            if (debug) {
+                                System.out.format("new hit energy %f\n", newHit.getRawEnergy());
+                            }
+                            newHits.add(newHit);
+                        }
                     }
                 }
                 event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName);

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/HPSRawCalorimeterHit.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/HPSRawCalorimeterHit.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/HPSRawCalorimeterHit.java	Fri Dec 12 19:40:53 2014
@@ -9,63 +9,35 @@
  */
 public class HPSRawCalorimeterHit implements RawCalorimeterHit {
 
-	long cellID;
-	int amplitude;
-	int timeStamp;
-	int windowSize;
-	int mode; //A.C. this is the field I use, in case of REAL data, to record which FADC mode was used (ECAL_PULSE_INTEGRAL3_MODE or ECAL_PULSE_INTEGRAL7_MODE)
-	short amplLow,amplHigh;
+    long cellID;
+    int amplitude;
+    int timeStamp;
+    int windowSize;
 
-	public HPSRawCalorimeterHit(long cellID, int amplitude, int timeStamp, int windowSize) { //A.C. I do not change this, since I did not write it!
-		this.cellID = cellID;
-		this.amplitude = amplitude;
-		this.timeStamp = timeStamp;
-		this.windowSize = windowSize;
-		
-		//A part from init the fields..
-		this.mode = -1;
-		this.amplLow=0;
-		this.amplHigh=0;
-	}
-	
-	public HPSRawCalorimeterHit(long cellID, int amplitude, int timeStamp,int windowSize,short amplLow,short amplHigh,int mode) {
-		this.cellID = cellID;
-		this.amplitude = amplitude;
-		this.timeStamp = timeStamp;
-		this.windowSize = 0;
-		this.amplLow = amplLow;
-		this.amplHigh = amplHigh;
-		this.mode = mode;
-	}
-	
-    @Override
-	public long getCellID() {
-		return cellID;
-	}
+    public HPSRawCalorimeterHit(long cellID, int amplitude, int timeStamp, int windowSize) {
+        this.cellID = cellID;
+        this.amplitude = amplitude;
+        this.timeStamp = timeStamp;
+        this.windowSize = windowSize;
+    }
+
 
     @Override
-	public int getAmplitude() {
-		return amplitude;
-	}
+    public long getCellID() {
+        return cellID;
+    }
 
     @Override
-	public int getTimeStamp() {
-		return timeStamp;
-	}
+    public int getAmplitude() {
+        return amplitude;
+    }
 
-	public int getWindowSize() {
-		return windowSize;
-	}
-	
-	public int getMode(){
-		return mode;
-	}
+    @Override
+    public int getTimeStamp() {
+        return timeStamp;
+    }
 
-	public short getAmplLow(){
-		return amplLow;
-	}
-	
-	public short getAmplHigh(){
-		return amplHigh;
-	}
-}
+    public int getWindowSize() {
+        return windowSize;
+    }
+}

Modified: java/trunk/evio/src/main/java/org/hps/evio/ECalEvioReader.java
 =============================================================================
--- java/trunk/evio/src/main/java/org/hps/evio/ECalEvioReader.java	(original)
+++ java/trunk/evio/src/main/java/org/hps/evio/ECalEvioReader.java	Fri Dec 12 19:40:53 2014
@@ -14,7 +14,8 @@
 import org.hps.conditions.ecal.EcalChannel.GeometryId;
 import org.hps.conditions.ecal.EcalConditions;
 import org.hps.recon.ecal.FADCGenericHit;
-import org.hps.recon.ecal.HPSRawCalorimeterHit;
+import org.hps.recon.ecal.HitExtraData.Mode7Data;
+import org.hps.recon.ecal.HitExtraData;
 import org.jlab.coda.jevio.BaseStructure;
 import org.jlab.coda.jevio.BaseStructureHeader;
 import org.jlab.coda.jevio.CompositeData;
@@ -24,9 +25,11 @@
 import org.lcsim.detector.identifier.IIdentifierHelper;
 import org.lcsim.detector.identifier.Identifier;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
 import org.lcsim.event.RawCalorimeterHit;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.base.BaseLCRelation;
 import org.lcsim.event.base.BaseRawCalorimeterHit;
 import org.lcsim.event.base.BaseRawTrackerHit;
 import org.lcsim.geometry.Subdetector;
@@ -53,6 +56,12 @@
     private static final String genericHitCollectionName = "FADCGenericHits";
     private List<FADCGenericHit> genericHits;
 
+    private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations";
+    private List<LCRelation> extraDataRelations;
+
+    private static final String extraDataCollectionName = "EcalReadoutExtraData";
+    private List<HitExtraData> extraDataList;
+
     private static EcalConditions ecalConditions = null;
     private static IIdentifierHelper helper = null;
 
@@ -60,7 +69,7 @@
 
     private final Map<List<Integer>, Integer> genericHitCount = new HashMap<List<Integer>, Integer>();
 
-    private static Logger logger = LogUtil.create(ECalEvioReader.class);
+    private static final Logger logger = LogUtil.create(ECalEvioReader.class);
 
     public ECalEvioReader(int topBankTag, int botBankTag) {
         this.topBankTag = topBankTag;
@@ -86,6 +95,8 @@
         boolean foundHits = false;
         List<Object> hits = new ArrayList<Object>();
         genericHits = new ArrayList<FADCGenericHit>();
+        extraDataList = new ArrayList<HitExtraData>();
+        extraDataRelations = new ArrayList<LCRelation>();
         hitClass = Object.class;
         int flags = 0;
         for (BaseStructure bank : event.getChildren()) {
@@ -139,7 +150,7 @@
                                             break;
                                         case EventConstants.ECAL_PULSE_INTEGRAL_HIGHRESTDC_BANK_TAG:
                                             hits.addAll(makeIntegralHitsMode7(cdata, crate));
-                                            hitClass = HPSRawCalorimeterHit.class;
+                                            hitClass = RawCalorimeterHit.class;
                                             flags = (1 << LCIOConstants.RCHBIT_TIME); //store timestamp
                                             break;
                                         default:
@@ -157,6 +168,10 @@
 //        String readoutName = ;
         lcsimEvent.put(hitCollectionName, hits, hitClass, flags, readoutName);
         lcsimEvent.put(genericHitCollectionName, genericHits, FADCGenericHit.class, 0);
+        if (!extraDataList.isEmpty()) {
+            lcsimEvent.put(extraDataCollectionName, extraDataList, Mode7Data.class, 0);
+            lcsimEvent.put(extraDataRelationsName, extraDataRelations, LCRelation.class, 0);
+        }
 //        for (Object hit : hits) {
 //            System.out.println(((RawTrackerHit) hit).getIDDecoder().getIDDescription().toString());
 //        }
@@ -322,7 +337,7 @@
                         int[] data = {pulseIntegral, pulseTime};
                         processUnrecognizedChannel(new FADCGenericHit(EventConstants.ECAL_PULSE_INTEGRAL_MODE, crate, slot, channel, data));
                     } else {
-                        hits.add(new BaseRawCalorimeterHit(id, pulseIntegral,pulseTime));
+                        hits.add(new BaseRawCalorimeterHit(id, pulseIntegral, pulseTime));
                     }
                 }
             }
@@ -330,10 +345,8 @@
         return hits;
     }
 
-    
-    
-    private List<HPSRawCalorimeterHit> makeIntegralHitsMode7(CompositeData cdata, int crate) {
-        List<HPSRawCalorimeterHit> hits = new ArrayList<HPSRawCalorimeterHit>();
+    private List<RawCalorimeterHit> makeIntegralHitsMode7(CompositeData cdata, int crate) {
+        List<RawCalorimeterHit> hits = new ArrayList<RawCalorimeterHit>();
         if (debug) {
             int n = cdata.getNValues().size();
             for (int i = 0; i < n; i++) {
@@ -372,18 +385,18 @@
                         int[] data = {pulseIntegral, pulseTime, amplLow, amplHigh};
                         processUnrecognizedChannel(new FADCGenericHit(EventConstants.ECAL_PULSE_INTEGRAL_HIGHRESTDC_MODE, crate, slot, channel, data));
                     } else {
-                        hits.add(new HPSRawCalorimeterHit(id, pulseIntegral,pulseTime,0,amplLow,amplHigh,EventConstants.ECAL_PULSE_INTEGRAL_HIGHRESTDC_MODE));
+                        RawCalorimeterHit hit = new BaseRawCalorimeterHit(id, pulseIntegral, pulseTime);
+                        hits.add(hit);
+                        Mode7Data extraData = new Mode7Data(amplLow, amplHigh);
+                        extraDataList.add(extraData);
+                        extraDataRelations.add(new BaseLCRelation(hit, extraData));
                     }
                 }
             }
         }
         return hits;
     }
-    
-    
-    
-    
-    
+
     private void processUnrecognizedChannel(FADCGenericHit hit) {
         genericHits.add(hit);