Author: celentan Date: Tue Dec 9 05:31:07 2014 New Revision: 1661 Log: Update the Evio Reader to handle FADC mode 7 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 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 Tue Dec 9 05:31:07 2014 @@ -3,6 +3,7 @@ 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.lcsim.conditions.ConditionsManager; import org.lcsim.event.CalorimeterHit; import org.lcsim.event.RawCalorimeterHit; @@ -17,6 +18,7 @@ * * @author Sho Uemura <[log in to unmask]> * @author Jeremy McCormick <[log in to unmask]> + * @author Andrea Celentano <[log in to unmask]> */ public class EcalRawConverter { @@ -69,6 +71,55 @@ double rawEnergy = adcToEnergy(adcSum, id); 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 RawCalorimeterHit HitAtoD(CalorimeterHit hit, int window) { 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 Tue Dec 9 05:31:07 2014 @@ -6,6 +6,7 @@ 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.lcsim.conditions.ConditionsManager; import org.lcsim.event.CalorimeterHit; import org.lcsim.event.EventHeader; @@ -189,15 +190,20 @@ } event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName); } - if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) { + 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 = converter.HitDtoA(hit, integralWindow, timeOffset); - + 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; 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 Tue Dec 9 05:31:07 2014 @@ -15,15 +15,33 @@ 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; + CalorimeterHit analogHit = null; - public HPSRawCalorimeterHit(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; @@ -42,7 +60,19 @@ public int getWindowSize() { return windowSize; } + + public int getMode(){ + return mode; + } + public short getAmplLow(){ + return amplLow; + } + + public short getAmplHigh(){ + return amplHigh; + } + public CalorimeterHit getAnalogHit() { return analogHit; }