Author: [log in to unmask] Date: Thu Jan 1 23:27:47 2015 New Revision: 1832 Log: Implement ConditionsListener. Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java ============================================================================= --- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java (original) +++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java Thu Jan 1 23:27:47 2015 @@ -5,13 +5,21 @@ import java.util.logging.Level; import java.util.logging.Logger; +import org.hps.conditions.database.DatabaseConditionsManager; import org.hps.conditions.svt.SvtChannel.SvtChannelCollection; import org.hps.conditions.svt.SvtDaqMapping.SvtDaqMappingCollection; import org.hps.conditions.svt.SvtT0Shift.SvtT0ShiftCollection; +import org.hps.conditions.svt.TestRunSvtChannel.TestRunSvtChannelCollection; +import org.hps.conditions.svt.TestRunSvtDaqMapping.TestRunSvtDaqMappingCollection; +import org.hps.conditions.svt.TestRunSvtT0Shift.TestRunSvtT0ShiftCollection; import org.hps.util.Pair; +import org.lcsim.conditions.ConditionsEvent; +import org.lcsim.conditions.ConditionsListener; import org.lcsim.detector.tracker.silicon.HpsSiSensor; +import org.lcsim.detector.tracker.silicon.HpsTestRunSiSensor; import org.lcsim.geometry.compact.Subdetector; import org.lcsim.util.log.LogUtil; + /** * This class puts {@link SvtConditions} data onto <code>HpsSiSensor</code> @@ -20,13 +28,45 @@ * @author Jeremy McCormick <[log in to unmask]> * @author Omar Moreno <[log in to unmask]> */ -public final class SvtDetectorSetup { +public final class SvtDetectorSetup implements ConditionsListener { private static Logger logger = LogUtil.create(SvtDetectorSetup.class); + + private String svtName = "Tracker"; + private boolean enabled = true; + + public SvtDetectorSetup(String svtName) { + this.svtName = svtName; + } + + public void setSvtName(String svtName) { + this.svtName = svtName; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } public void setLogLevel(Level level) { logger.setLevel(level); logger.getHandlers()[0].setLevel(level); + } + + @Override + public void conditionsChanged(ConditionsEvent event) { + if (enabled) { + DatabaseConditionsManager manager = (DatabaseConditionsManager) event.getConditionsManager(); + Subdetector subdetector = manager.getDetectorObject().getSubdetector(svtName); + if (manager.isTestRun()) { + TestRunSvtConditions svtConditions = manager.getCachedConditions(TestRunSvtConditions.class, "test_run_svt_conditions").getCachedData(); + loadTestRun(subdetector, svtConditions); + } else { + SvtConditions svtConditions = manager.getCachedConditions(SvtConditions.class, "svt_conditions").getCachedData(); + loadDefault(subdetector, svtConditions); + } + } else { + logger.config("disabled"); + } } /** @@ -35,7 +75,7 @@ * @param The detector object. * @param conditions The conditions object. */ - public void load(Subdetector subdetector, SvtConditions conditions) { + void loadDefault(Subdetector subdetector, SvtConditions conditions) { logger.info("loading SVT conditions onto subdetector " + subdetector.getName()); @@ -115,7 +155,87 @@ SvtT0Shift sensorT0Shift = t0Shifts.getT0Shift(daqPair); sensor.setT0Shift(sensorT0Shift.getT0Shift()); } + } + + void loadTestRun(Subdetector subdetector, TestRunSvtConditions conditions) { + + logger.info("loading Test Run SVT conditions onto subdetector " + subdetector.getName()); - logger.info("loaded default SVT conditions onto subdetector"); + // Find sensor objects. + List<HpsSiSensor> sensors = subdetector.getDetectorElement().findDescendants(HpsSiSensor.class); + logger.info("setting up " + sensors.size() + " SVT sensors"); + TestRunSvtChannelCollection channelMap = conditions.getChannelMap(); + logger.info("channel map has " + channelMap.size() + " entries"); + TestRunSvtDaqMappingCollection daqMap = conditions.getDaqMap(); + TestRunSvtT0ShiftCollection t0Shifts = conditions.getT0Shifts(); + + // Loop over sensors. + for (HpsSiSensor sensor : sensors) { + + // Reset possible existing conditions data on sensor. + sensor.reset(); + + // Get DAQ pair (FPGA ID, Hybrid ID) corresponding to this sensor + Pair<Integer, Integer> daqPair = daqMap.getDaqPair(sensor); + if (daqPair == null) { + throw new RuntimeException("Failed to find DAQ pair for sensor: " + sensor.getName()); + } + + // Set the FPGA ID of the sensor + ((HpsTestRunSiSensor) sensor).setFpgaID(daqPair.getFirstElement()); + + // Set the hybrid ID of the sensor + ((HpsTestRunSiSensor) sensor).setHybridID(daqPair.getSecondElement()); + + // Set the orientation of the sensor + String orientation = daqMap.getOrientation(daqPair); + if (orientation != null && orientation.contentEquals(TestRunSvtDaqMappingCollection.AXIAL)) { + sensor.setAxial(true); + } else if (orientation != null && orientation.contains(TestRunSvtDaqMappingCollection.STEREO)) { + sensor.setStereo(true); + } + + // Find all the channels for this sensor. + Collection<TestRunSvtChannel> channels = channelMap.find(daqPair); + + // Loop over the channels of the sensor. + for (TestRunSvtChannel channel : channels) { + + // Get conditions data for this channel. + ChannelConstants constants = conditions.getChannelConstants(channel); + int channelNumber = channel.getChannel(); + + // + // Set conditions data for this channel on the sensor object: + // + + // Check if the channel was flagged as bad + if (constants.isBadChannel()) { + sensor.setBadChannel(channelNumber); + } + + // Set the pedestal and noise of each of the samples for the + // channel + double[] pedestal = new double[6]; + double[] noise = new double[6]; + for (int sampleN = 0; sampleN < HpsTestRunSiSensor.NUMBER_OF_SAMPLES; sampleN++) { + pedestal[sampleN] = constants.getCalibration().getPedestal(sampleN); + noise[sampleN] = constants.getCalibration().getNoise(sampleN); + } + sensor.setPedestal(channelNumber, pedestal); + sensor.setNoise(channelNumber, noise); + + // Set the gain and offset for the channel + sensor.setGain(channelNumber, constants.getGain().getGain()); + sensor.setOffset(channelNumber, constants.getGain().getOffset()); + + // Set the shape fit parameters + sensor.setShapeFitParameters(channelNumber, constants.getShapeFitParameters().toArray()); + } + + // Set the t0 shift for the sensor. + TestRunSvtT0Shift sensorT0Shift = t0Shifts.getT0Shift(daqPair); + sensor.setT0Shift(sensorT0Shift.getT0Shift()); + } } }