Author: [log in to unmask]
Date: Tue Apr 21 14:08:49 2015
New Revision: 3590
Log:
Change number of shape fit parameters expected.
Modified:
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/tracker/silicon/HpsSiSensor.java
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/tracker/silicon/HpsSiSensor.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/tracker/silicon/HpsSiSensor.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/tracker/silicon/HpsSiSensor.java Tue Apr 21 14:08:49 2015
@@ -22,522 +22,515 @@
import org.lcsim.detector.solids.Polygon3D;
/**
- * This class extends {@link SiSensor} with conditions specific to HPS SVT half-modules
- * (sensors) used during the engineering run and beyond. Each half-module is uniquely
- * identified by a FEB ID/Hybrid ID pair which is then related to calibration conditions
- * such as baseline, noise, gain etc.
- *
+ * This class extends {@link SiSensor} with conditions specific to HPS SVT half-modules (sensors) used during the
+ * engineering run and beyond. Each half-module is uniquely identified by a FEB ID/Hybrid ID pair which is then related
+ * to calibration conditions such as baseline, noise, gain etc.
+ *
* @author Jeremy McCormick <[log in to unmask]>
* @author Omar Moreno <[log in to unmask]>
*/
public class HpsSiSensor extends SiSensor {
- //-----------------//
- //--- Constants ---//
- //-----------------//
-
- public final static int STRIPS_PER_SENSOR = 639;
- public final static int NUMBER_OF_SAMPLES = 6;
- public final static int NUMBER_OF_SHAPE_FIT_PARAMETERS = 3;
-
- public final static int AMPLITUDE_INDEX = 0;
- public final static int T0_INDEX = 1;
- public final static int TP_INDEX = 2;
-
- public final static String ELECTRON_SIDE = "ELECTRON";
- public final static String POSITRON_SIDE = "POSITRON";
-
- public final static double READOUT_STRIP_PITCH = 0.060; // mm
- public final static double SENSE_STRIP_PITCH = 0.030; // mm
- public final static double READOUT_TRANSFER_EFFICIENCY = .986; // %
- public final static double SENSE_TRANSFER_EFFICIENCY = 0.419; // %
-
- //-----------------//
- //-----------------//
-
- protected int febID;
- protected int febHybridID;
- protected double t0Shift = 0;
- protected boolean isAxial = false;
- protected boolean isStereo = false;
-
- private double readoutStripCapacitanceIntercept = 0;
- private double readoutStripCapacitanceSlope = 0.16; // pf/mm
- private double senseStripCapacitanceIntercept = 0;
- private double senseStripCapacitanceSlope = 0.16; // pf/mm
+ // -----------------//
+ // --- Constants ---//
+ // -----------------//
+
+ public final static int STRIPS_PER_SENSOR = 639;
+ public final static int NUMBER_OF_SAMPLES = 6;
+ public final static int NUMBER_OF_SHAPE_FIT_PARAMETERS = 4;
+
+ public final static int AMPLITUDE_INDEX = 0;
+ public final static int T0_INDEX = 1;
+ public final static int TP_INDEX = 2;
+
+ public final static String ELECTRON_SIDE = "ELECTRON";
+ public final static String POSITRON_SIDE = "POSITRON";
+
+ public final static double READOUT_STRIP_PITCH = 0.060; // mm
+ public final static double SENSE_STRIP_PITCH = 0.030; // mm
+ public final static double READOUT_TRANSFER_EFFICIENCY = .986; // %
+ public final static double SENSE_TRANSFER_EFFICIENCY = 0.419; // %
+
+ // -----------------//
+ // -----------------//
+
+ protected int febID;
+ protected int febHybridID;
+ protected double t0Shift = 0;
+ protected boolean isAxial = false;
+ protected boolean isStereo = false;
+
+ private final double readoutStripCapacitanceIntercept = 0;
+ private final double readoutStripCapacitanceSlope = 0.16; // pf/mm
+ private final double senseStripCapacitanceIntercept = 0;
+ private final double senseStripCapacitanceSlope = 0.16; // pf/mm
/*
- * Adding separate strip capacitance for long detectors following
- * S/N = mip_charge/(270e- + 36*C[pf/cm]*L[cm]
- * e.g. for expected S/N=16 and L=20cm -> C=0.1708pf/mm
- * e.g. for expected S/N=8 and L=20cm -> C=0.39pf/mm
- * FIXME: This should be taken into account by the noise model.
- */
- protected double longSensorLengthThreshold = 190.0; //mm
- protected double readoutLongStripCapacitanceSlope = 0.39; // pf/mm
- protected double senseLongStripCapacitanceSlope = 0.39; // pf/mm
-
-
- //-----------------------//
- //--- Conditions Maps ---//
- //-----------------------//
- protected Map<Integer, double[]> pedestalMap = new HashMap<Integer, double[]>();
- protected Map<Integer, double[]> noiseMap = new HashMap<Integer, double[]>();
- protected Map<Integer, Double> gainMap = new HashMap<Integer, Double>();
- protected Map<Integer, Double> offsetMap = new HashMap<Integer, Double>();
- protected Map<Integer, double[]> shapeFitParametersMap = new HashMap<Integer, double[]>();
- protected Set<Integer> badChannels = new HashSet<Integer>();
+ * Adding separate strip capacitance for long detectors following S/N = mip_charge/(270e- + 36*C[pf/cm]*L[cm] e.g.
+ * for expected S/N=16 and L=20cm -> C=0.1708pf/mm e.g. for expected S/N=8 and L=20cm -> C=0.39pf/mm FIXME: This
+ * should be taken into account by the noise model.
+ */
+ protected double longSensorLengthThreshold = 190.0; // mm
+ protected double readoutLongStripCapacitanceSlope = 0.39; // pf/mm
+ protected double senseLongStripCapacitanceSlope = 0.39; // pf/mm
+
+ // -----------------------//
+ // --- Conditions Maps ---//
+ // -----------------------//
+ protected Map<Integer, double[]> pedestalMap = new HashMap<Integer, double[]>();
+ protected Map<Integer, double[]> noiseMap = new HashMap<Integer, double[]>();
+ protected Map<Integer, Double> gainMap = new HashMap<Integer, Double>();
+ protected Map<Integer, Double> offsetMap = new HashMap<Integer, Double>();
+ protected Map<Integer, double[]> shapeFitParametersMap = new HashMap<Integer, double[]>();
+ protected Set<Integer> badChannels = new HashSet<Integer>();
protected int millepedeId = -1;
-
- /**
- * This class constructor matches the signature of <code>SiSensor</code>.
- *
- * @param sensorid The sensor ID.
- * @param name The name of the sensor.
- * @param parent The parent DetectorElement.
- * @param support The physical support path.
- * @param id The identifier of the sensor.
- */
- public HpsSiSensor(
- int sensorid,
- String name,
- IDetectorElement parent,
- String support,
- IIdentifier id)
- {
- super(sensorid, name, parent, support, id);
-
- // Set the default sensor orientation using the layer number. For sensors
- // belonging to the top volume, odd (even) layers are axial (stereo).
- // For sensors belonging to the bottom, even (odd) layers are axial (stereo).
- if(this.isTopLayer() && this.getLayerNumber()%2 == 1){
- this.setAxial(true);
- } else if(this.isBottomLayer() && this.getLayerNumber()%2 == 0){
- this.setAxial(true);
- } else {
- this.setStereo(true);
- }
-
- this.initialize();
- }
-
- /**
- * Get whether this sensor is in the top half of the detector.
- * Modules in the top half have module numbers of 0 or 2.
- *
- * @return True if sensor is in top layer; false if not.
- */
- public boolean isTopLayer() {
- return getModuleNumber() % 2 == 0;
- }
-
- /**
- * Get whether this sensor is in the bottom half of the detector.
- * Modules in the bottom half have module numbers of 1 or 3.
- *
- * @return True if sensor is in bottom layer; false if not.
- */
- public boolean isBottomLayer() {
- return getModuleNumber() % 2 != 0;
- }
-
- /**
- * Get the module number of the sensor.
- *
- * @return The module number of the sensor.
- */
- public int getModuleNumber() {
- return getTrackerIdHelper().getModuleValue(getIdentifier());
- }
-
- /**
- * Get the specific type of identifier helper for this component.
- *
- * @return The identifier helper.
- */
- public SiTrackerIdentifierHelper getTrackerIdHelper() {
- return (SiTrackerIdentifierHelper)getIdentifierHelper();
- }
-
- /**
- * Get whether this sensor is axial.
- *
- * @return True if sensor is axial; false if not.
- */
- public boolean isAxial() {
- return isAxial;
- }
-
- /**
- * Get whether this sensor is stereo.
- *
- * @return True is sensor is stereo; false if not.
- */
- public boolean isStereo() {
- return isStereo;
- }
-
- /**
- * Get the pedestal for the given channel and sample number.
- *
- * @param channel The channel number.
- * @param sample The sample number.
- * @return The pedestal value for the given channel and sample or null if not set.
- */
- public Double getPedestal(int channel, int sample) {
- if(sample >= NUMBER_OF_SAMPLES)
- throw new RuntimeException("The sample number must be less than " + NUMBER_OF_SAMPLES);
- return pedestalMap.get(channel)[sample];
- }
-
- /**
- * Get the noise for the given channel and sample number.
- *
- * @param channel The channel number.
- * @param sample The sample number.
- * @return The noise value for the given channel and sample or null if not set.
- */
- public Double getNoise(int channel, int sample) {
- if(sample >= NUMBER_OF_SAMPLES)
- throw new RuntimeException("The sample number must be less than " + NUMBER_OF_SAMPLES);
- return noiseMap.get(channel)[sample];
- }
-
- /**
- * Get the gain for the given channel.
- *
- * @param channel The channel number.
- * @return The gain value for the channel or null if not set.
- */
- public Double getGain(int channel) {
- return gainMap.get(channel);
- }
-
- /**
- * Get the offset for the given channel.
- *
- * @param channel The channel number.
- * @return The offset for the channel or null if not set.
- */
- public Double getOffset(int channel) {
- return offsetMap.get(channel);
- }
-
- /**
- * Get the shape fit parameters (amplitude, t0, tp) associated with a given
- * channel.
- *
- * @param channel The channel number.
- * @return The shape fit results for the channel.
- */
- public double[] getShapeFitParameters(int channel) {
- return shapeFitParametersMap.get(channel);
- }
-
- /**
- * Get whether the given channel is bad or not.
- *
- * @param channel The channel number.
- * @return True if channel is bad; false if not.
- */
- public boolean isBadChannel(int channel) {
- return badChannels.contains(channel);
- }
-
- /**
- * Get the total number of channels in the sensor.
- *
- * @return The total number of channels in the sensor.
- */
- public int getNumberOfChannels() {
- return STRIPS_PER_SENSOR;
- }
-
- /**
- * Get whether the given channel number if valid.
- *
- * @param channel The channel number.
- * @return True if channel number is valid; false if not.
- */
- public boolean isValidChannel(int channel) {
- return STRIPS_PER_SENSOR >= 0 && channel < STRIPS_PER_SENSOR;
- }
-
- /**
- * Get the front end board (FEB) ID associated with this sensor.
- *
- * @return The FEB ID
- */
- public int getFebID() {
- return febID;
- }
-
- /**
- * Get the FEB hybrid ID of the sensor.
- *
- * @return The FEB hybrid number of the sensor.
- */
- public int getFebHybridID() {
- return febHybridID;
- }
-
- /**
- * Get the layer number of the sensor.
- *
- * @return The layer number of the sensor.
- */
- public int getLayerNumber() {
- return getIdentifierHelper().getValue(getIdentifier(), "layer");
- }
-
- /**
- * Get the t0 shift for this sensor.
- *
- * @return The t0 shift for this sensor.
- */
- public double getT0Shift() {
- return t0Shift;
- }
-
- /**
- * Get the sensor side (ELECTRON or POSITRON). For single sensor
- * half-modules, the side will always be ELECTRON.
- *
- * @return The side the sensor is on (ELECTRON or POSITRON)
- */
- public String getSide() {
- return this.getModuleNumber() < 2 ? ELECTRON_SIDE : POSITRON_SIDE;
- }
-
-
- /**
+
+ /**
+ * This class constructor matches the signature of <code>SiSensor</code>.
+ *
+ * @param sensorid The sensor ID.
+ * @param name The name of the sensor.
+ * @param parent The parent DetectorElement.
+ * @param support The physical support path.
+ * @param id The identifier of the sensor.
+ */
+ public HpsSiSensor(final int sensorid, final String name, final IDetectorElement parent, final String support,
+ final IIdentifier id) {
+ super(sensorid, name, parent, support, id);
+
+ // Set the default sensor orientation using the layer number. For sensors
+ // belonging to the top volume, odd (even) layers are axial (stereo).
+ // For sensors belonging to the bottom, even (odd) layers are axial (stereo).
+ if (this.isTopLayer() && this.getLayerNumber() % 2 == 1) {
+ this.setAxial(true);
+ } else if (this.isBottomLayer() && this.getLayerNumber() % 2 == 0) {
+ this.setAxial(true);
+ } else {
+ this.setStereo(true);
+ }
+
+ this.initialize();
+ }
+
+ /**
+ * Get whether this sensor is in the top half of the detector. Modules in the top half have module numbers of 0 or
+ * 2.
+ *
+ * @return True if sensor is in top layer; false if not.
+ */
+ public boolean isTopLayer() {
+ return getModuleNumber() % 2 == 0;
+ }
+
+ /**
+ * Get whether this sensor is in the bottom half of the detector. Modules in the bottom half have module numbers of
+ * 1 or 3.
+ *
+ * @return True if sensor is in bottom layer; false if not.
+ */
+ public boolean isBottomLayer() {
+ return getModuleNumber() % 2 != 0;
+ }
+
+ /**
+ * Get the module number of the sensor.
+ *
+ * @return The module number of the sensor.
+ */
+ public int getModuleNumber() {
+ return getTrackerIdHelper().getModuleValue(getIdentifier());
+ }
+
+ /**
+ * Get the specific type of identifier helper for this component.
+ *
+ * @return The identifier helper.
+ */
+ public SiTrackerIdentifierHelper getTrackerIdHelper() {
+ return (SiTrackerIdentifierHelper) getIdentifierHelper();
+ }
+
+ /**
+ * Get whether this sensor is axial.
+ *
+ * @return True if sensor is axial; false if not.
+ */
+ public boolean isAxial() {
+ return this.isAxial;
+ }
+
+ /**
+ * Get whether this sensor is stereo.
+ *
+ * @return True is sensor is stereo; false if not.
+ */
+ public boolean isStereo() {
+ return this.isStereo;
+ }
+
+ /**
+ * Get the pedestal for the given channel and sample number.
+ *
+ * @param channel The channel number.
+ * @param sample The sample number.
+ * @return The pedestal value for the given channel and sample or null if not set.
+ */
+ public Double getPedestal(final int channel, final int sample) {
+ if (sample >= NUMBER_OF_SAMPLES) {
+ throw new RuntimeException("The sample number must be less than " + NUMBER_OF_SAMPLES);
+ }
+ return this.pedestalMap.get(channel)[sample];
+ }
+
+ /**
+ * Get the noise for the given channel and sample number.
+ *
+ * @param channel The channel number.
+ * @param sample The sample number.
+ * @return The noise value for the given channel and sample or null if not set.
+ */
+ public Double getNoise(final int channel, final int sample) {
+ if (sample >= NUMBER_OF_SAMPLES) {
+ throw new RuntimeException("The sample number must be less than " + NUMBER_OF_SAMPLES);
+ }
+ return this.noiseMap.get(channel)[sample];
+ }
+
+ /**
+ * Get the gain for the given channel.
+ *
+ * @param channel The channel number.
+ * @return The gain value for the channel or null if not set.
+ */
+ public Double getGain(final int channel) {
+ return this.gainMap.get(channel);
+ }
+
+ /**
+ * Get the offset for the given channel.
+ *
+ * @param channel The channel number.
+ * @return The offset for the channel or null if not set.
+ */
+ public Double getOffset(final int channel) {
+ return this.offsetMap.get(channel);
+ }
+
+ /**
+ * Get the shape fit parameters (amplitude, t0, tp) associated with a given channel.
+ *
+ * @param channel The channel number.
+ * @return The shape fit results for the channel.
+ */
+ public double[] getShapeFitParameters(final int channel) {
+ return this.shapeFitParametersMap.get(channel);
+ }
+
+ /**
+ * Get whether the given channel is bad or not.
+ *
+ * @param channel The channel number.
+ * @return True if channel is bad; false if not.
+ */
+ public boolean isBadChannel(final int channel) {
+ return this.badChannels.contains(channel);
+ }
+
+ /**
+ * Get the total number of channels in the sensor.
+ *
+ * @return The total number of channels in the sensor.
+ */
+ public int getNumberOfChannels() {
+ return STRIPS_PER_SENSOR;
+ }
+
+ /**
+ * Get whether the given channel number if valid.
+ *
+ * @param channel The channel number.
+ * @return True if channel number is valid; false if not.
+ */
+ public boolean isValidChannel(final int channel) {
+ return STRIPS_PER_SENSOR >= 0 && channel < STRIPS_PER_SENSOR;
+ }
+
+ /**
+ * Get the front end board (FEB) ID associated with this sensor.
+ *
+ * @return The FEB ID
+ */
+ public int getFebID() {
+ return this.febID;
+ }
+
+ /**
+ * Get the FEB hybrid ID of the sensor.
+ *
+ * @return The FEB hybrid number of the sensor.
+ */
+ public int getFebHybridID() {
+ return this.febHybridID;
+ }
+
+ /**
+ * Get the layer number of the sensor.
+ *
+ * @return The layer number of the sensor.
+ */
+ public int getLayerNumber() {
+ return getIdentifierHelper().getValue(getIdentifier(), "layer");
+ }
+
+ /**
+ * Get the t0 shift for this sensor.
+ *
+ * @return The t0 shift for this sensor.
+ */
+ public double getT0Shift() {
+ return this.t0Shift;
+ }
+
+ /**
+ * Get the sensor side (ELECTRON or POSITRON). For single sensor half-modules, the side will always be ELECTRON.
+ *
+ * @return The side the sensor is on (ELECTRON or POSITRON)
+ */
+ public String getSide() {
+ return this.getModuleNumber() < 2 ? ELECTRON_SIDE : POSITRON_SIDE;
+ }
+
+ /**
* Generate an ID for a channel (strip) on a sensor.
- *
+ *
* @param sensor
* @param channel : Physical channel number
- * @return ID
- */
- public long makeChannelID(int channel) {
- int sideNumber = this.hasElectrodesOnSide(ChargeCarrier.HOLE)
- ? ChargeCarrier.HOLE.charge() : ChargeCarrier.ELECTRON.charge();
- return this.makeStripId(channel, sideNumber).getValue();
- }
-
- /**
- * Set the pedestal value for all samples for a given channel.
- *
- * @param channel The channel number.
- * @param pedestal The pedestal values for all samples.
- */
- public void setPedestal(int channel, double[] pedestal) {
- if(pedestal.length > NUMBER_OF_SAMPLES)
- throw new RuntimeException("The number of pedestal samples must be equal to" + NUMBER_OF_SAMPLES);
- pedestalMap.put(channel, pedestal);
- }
-
- /**
- * Set the noise value for the given channel.
- *
- * @param channel The channel number.
- * @param noise The noise values for all samples.
- */
- public void setNoise(int channel, double[] noise) {
- if(noise.length > NUMBER_OF_SAMPLES)
- throw new RuntimeException("The number of pedestal samples must be equal to" + NUMBER_OF_SAMPLES);
- noiseMap.put(channel, noise);
- }
-
- /**
- * Set the gain value for the given channel.
- *
- * @param channel The channel number.
- * @param gain The gain value.
- */
- public void setGain(int channel, double gain) {
- gainMap.put(channel, gain);
- }
-
- /**
- * Set the offset for the given channel.
- *
- * @param channel The channel number.
- * @param offset The offset value.
- */
- public void setOffset(int channel, double offset) {
- offsetMap.put(channel, offset);
- }
-
- /**
- * Set the shape fit results for the given channel.
- *
- * @param channel The channel number.
- * @param shapeFitParameters The shape fit results array (should be length 4).
- */
- public void setShapeFitParameters(int channel, double[] shapeFitParameters) {
- if (shapeFitParameters.length != NUMBER_OF_SHAPE_FIT_PARAMETERS)
- throw new IllegalArgumentException("Number of shape fit parameters is incorrect: " + shapeFitParameters.length);
- shapeFitParametersMap.put(channel, shapeFitParameters);
- }
-
- /**
- * Flag the given channel as bad.
- *
- * @param channel The channel number.
- */
- public void setBadChannel(int channel) {
- badChannels.add(channel);
- }
-
- /**
- * Set the front end board (FEB) ID of the sensor.
- *
- * @param FEB ID The FEB ID of the sensor.
- */
- public void setFebID(int febID) {
- this.febID = febID;
- }
-
- /**
- * Set the FEB hybrid ID of the sensor.
- *
- * @param FEB hybrid ID The FEB hybrid ID.
- */
- public void setFebHybridID(int febHybridID) {
- this.febHybridID = febHybridID;
- }
-
-
- /**
- * Set the t0 shift for this sensor.
- *
- * @param t0Shift The t0 shift for this sensor.
- */
- public void setT0Shift(double t0Shift) {
- this.t0Shift = t0Shift;
- }
-
- /**
- * Flag the sensor as being axial.
- *
- * @param true if the sensor is Axial, false otherwise
- */
- public void setAxial(boolean isAxial) {
- this.isAxial = isAxial;
- }
-
- /**
- * Flag the sensor as being stereo
- *
- * @param true is the sensor is stereo, false otherwise
- */
- public void setStereo(boolean isStereo) {
- this.isStereo = isStereo;
- }
-
- /**
- * Reset the time dependent conditions data of this sensor.
- * This does NOT reset the sensor setup information, which is
- * assumed to be fixed once it is setup for a given session.
- */
- public void reset() {
- pedestalMap.clear();
- noiseMap.clear();
- offsetMap.clear();
- shapeFitParametersMap.clear();
- badChannels.clear();
- gainMap.clear();
- t0Shift = 0;
- }
-
- @Override
- public String toString() {
-
- StringBuffer buffer = new StringBuffer();
- buffer.append("HpsSiSensor: " + this.getName());
- buffer.append("\n");
- buffer.append("----------------------------------");
- buffer.append("\n");
- buffer.append("Layer: " + this.getLayerNumber() + "\n");
- buffer.append("Module: " + this.getModuleNumber() + "\n");
- buffer.append("Number of readout strips: " + this.getReadoutElectrodes(ChargeCarrier.HOLE).getNCells() + "\n");
- buffer.append("Number of sense strips: " + this.getSenseElectrodes(ChargeCarrier.HOLE).getNCells() + "\n");
- buffer.append("Strip length: " + this.getStripLength() + "\n");
- buffer.append("----------------------------------");
-
- return buffer.toString();
- }
-
- /**
- * Setup the geometry and electrical characteristics of an
- * {@link HpsSiSensor}
- *
- */
- @Override
- public void initialize() {
-
- // Get the solid corresponding to the sensor volume
- Box sensorSolid = (Box) this.getGeometry().getLogicalVolume().getSolid();
-
- // Get the faces of the solid corresponding to the n and p sides of the sensor
- Polygon3D pSide = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
- Polygon3D nSide = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, -1)).get(0);
-
- // p side collects holes.
- this.setBiasSurface(ChargeCarrier.HOLE, pSide);
-
- // n side collects electrons.
- this.setBiasSurface(ChargeCarrier.ELECTRON, nSide);
-
- // Translate to the outside of the sensor solid in order to setup the electrodes
- ITranslation3D electrodesPosition = new Translation3D(VecOp.mult(-pSide.getDistance(), pSide.getNormal()));
-
- // Align the strips with the edge of the sensor.
- IRotation3D electrodesRotation = new RotationPassiveXYZ(0, 0, 0);
- Transform3D electrodesTransform = new Transform3D(electrodesPosition, electrodesRotation);
-
- // Set the number of readout and sense electrodes.
- SiStrips readoutElectrodes = new SiStrips(ChargeCarrier.HOLE, READOUT_STRIP_PITCH, this, electrodesTransform);
- SiStrips senseElectrodes = new SiStrips(ChargeCarrier.HOLE, SENSE_STRIP_PITCH, (readoutElectrodes.getNCells() * 2 - 1), this, electrodesTransform);
-
- double readoutCapacitance = this.getStripLength() > longSensorLengthThreshold ? readoutLongStripCapacitanceSlope : readoutStripCapacitanceSlope;
- double senseCapacitance = this.getStripLength() > longSensorLengthThreshold ? senseLongStripCapacitanceSlope : senseStripCapacitanceSlope;
-
- // Set the strip capacitance.
- readoutElectrodes.setCapacitanceIntercept(readoutStripCapacitanceIntercept);
- readoutElectrodes.setCapacitanceSlope(readoutCapacitance);
- senseElectrodes.setCapacitanceIntercept(senseStripCapacitanceIntercept);
- senseElectrodes.setCapacitanceSlope(senseCapacitance);
-
- // Set sense and readout electrodes.
- this.setSenseElectrodes(senseElectrodes);
- this.setReadoutElectrodes(readoutElectrodes);
-
-
- // Set the charge transfer efficiency.
- double[][] transferEfficiencies = {{READOUT_TRANSFER_EFFICIENCY, SENSE_TRANSFER_EFFICIENCY}};
- this.setTransferEfficiencies(ChargeCarrier.HOLE, new BasicMatrix(transferEfficiencies));
-
- }
-
- /**
- * Return the length of an {@link HpsSiSensor} strip. This is done by
- * getting the face of the {@link HpsSiSensor} and returning the length of
- * the longest edge.
- *
- * @return The length of the longest {@link HpsSiSensor} edge
- */
- protected double getStripLength() {
-
- double length = 0;
-
- // Get the faces normal to the sensor
- List<Polygon3D> faces = ((Box) this.getGeometry().getLogicalVolume().getSolid()).getFacesNormalTo(new BasicHep3Vector(0,0,1));
- for (Polygon3D face : faces) {
-
- // Loop through the edges of the sensor face and find the longest
+ * @return ID
+ */
+ public long makeChannelID(final int channel) {
+ final int sideNumber = this.hasElectrodesOnSide(ChargeCarrier.HOLE) ? ChargeCarrier.HOLE.charge()
+ : ChargeCarrier.ELECTRON.charge();
+ return this.makeStripId(channel, sideNumber).getValue();
+ }
+
+ /**
+ * Set the pedestal value for all samples for a given channel.
+ *
+ * @param channel The channel number.
+ * @param pedestal The pedestal values for all samples.
+ */
+ public void setPedestal(final int channel, final double[] pedestal) {
+ if (pedestal.length > NUMBER_OF_SAMPLES) {
+ throw new RuntimeException("The number of pedestal samples must be equal to" + NUMBER_OF_SAMPLES);
+ }
+ this.pedestalMap.put(channel, pedestal);
+ }
+
+ /**
+ * Set the noise value for the given channel.
+ *
+ * @param channel The channel number.
+ * @param noise The noise values for all samples.
+ */
+ public void setNoise(final int channel, final double[] noise) {
+ if (noise.length > NUMBER_OF_SAMPLES) {
+ throw new RuntimeException("The number of pedestal samples must be equal to" + NUMBER_OF_SAMPLES);
+ }
+ this.noiseMap.put(channel, noise);
+ }
+
+ /**
+ * Set the gain value for the given channel.
+ *
+ * @param channel The channel number.
+ * @param gain The gain value.
+ */
+ public void setGain(final int channel, final double gain) {
+ this.gainMap.put(channel, gain);
+ }
+
+ /**
+ * Set the offset for the given channel.
+ *
+ * @param channel The channel number.
+ * @param offset The offset value.
+ */
+ public void setOffset(final int channel, final double offset) {
+ this.offsetMap.put(channel, offset);
+ }
+
+ /**
+ * Set the shape fit results for the given channel.
+ *
+ * @param channel The channel number.
+ * @param shapeFitParameters The shape fit results array (should be length 4).
+ */
+ public void setShapeFitParameters(final int channel, final double[] shapeFitParameters) {
+ if (shapeFitParameters.length != NUMBER_OF_SHAPE_FIT_PARAMETERS) {
+ throw new IllegalArgumentException("Number of shape fit parameters is incorrect: "
+ + shapeFitParameters.length);
+ }
+ this.shapeFitParametersMap.put(channel, shapeFitParameters);
+ }
+
+ /**
+ * Flag the given channel as bad.
+ *
+ * @param channel The channel number.
+ */
+ public void setBadChannel(final int channel) {
+ this.badChannels.add(channel);
+ }
+
+ /**
+ * Set the front end board (FEB) ID of the sensor.
+ *
+ * @param FEB ID The FEB ID of the sensor.
+ */
+ public void setFebID(final int febID) {
+ this.febID = febID;
+ }
+
+ /**
+ * Set the FEB hybrid ID of the sensor.
+ *
+ * @param FEB hybrid ID The FEB hybrid ID.
+ */
+ public void setFebHybridID(final int febHybridID) {
+ this.febHybridID = febHybridID;
+ }
+
+ /**
+ * Set the t0 shift for this sensor.
+ *
+ * @param t0Shift The t0 shift for this sensor.
+ */
+ public void setT0Shift(final double t0Shift) {
+ this.t0Shift = t0Shift;
+ }
+
+ /**
+ * Flag the sensor as being axial.
+ *
+ * @param true if the sensor is Axial, false otherwise
+ */
+ public void setAxial(final boolean isAxial) {
+ this.isAxial = isAxial;
+ }
+
+ /**
+ * Flag the sensor as being stereo
+ *
+ * @param true is the sensor is stereo, false otherwise
+ */
+ public void setStereo(final boolean isStereo) {
+ this.isStereo = isStereo;
+ }
+
+ /**
+ * Reset the time dependent conditions data of this sensor. This does NOT reset the sensor setup information, which
+ * is assumed to be fixed once it is setup for a given session.
+ */
+ public void reset() {
+ this.pedestalMap.clear();
+ this.noiseMap.clear();
+ this.offsetMap.clear();
+ this.shapeFitParametersMap.clear();
+ this.badChannels.clear();
+ this.gainMap.clear();
+ this.t0Shift = 0;
+ }
+
+ @Override
+ public String toString() {
+
+ final StringBuffer buffer = new StringBuffer();
+ buffer.append("HpsSiSensor: " + this.getName());
+ buffer.append("\n");
+ buffer.append("----------------------------------");
+ buffer.append("\n");
+ buffer.append("Layer: " + this.getLayerNumber() + "\n");
+ buffer.append("Module: " + this.getModuleNumber() + "\n");
+ buffer.append("Number of readout strips: " + this.getReadoutElectrodes(ChargeCarrier.HOLE).getNCells() + "\n");
+ buffer.append("Number of sense strips: " + this.getSenseElectrodes(ChargeCarrier.HOLE).getNCells() + "\n");
+ buffer.append("Strip length: " + this.getStripLength() + "\n");
+ buffer.append("----------------------------------");
+
+ return buffer.toString();
+ }
+
+ /**
+ * Setup the geometry and electrical characteristics of an {@link HpsSiSensor}
+ */
+ @Override
+ public void initialize() {
+
+ // Get the solid corresponding to the sensor volume
+ final Box sensorSolid = (Box) this.getGeometry().getLogicalVolume().getSolid();
+
+ // Get the faces of the solid corresponding to the n and p sides of the sensor
+ final Polygon3D pSide = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
+ final Polygon3D nSide = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, -1)).get(0);
+
+ // p side collects holes.
+ this.setBiasSurface(ChargeCarrier.HOLE, pSide);
+
+ // n side collects electrons.
+ this.setBiasSurface(ChargeCarrier.ELECTRON, nSide);
+
+ // Translate to the outside of the sensor solid in order to setup the electrodes
+ final ITranslation3D electrodesPosition = new Translation3D(VecOp.mult(-pSide.getDistance(), pSide.getNormal()));
+
+ // Align the strips with the edge of the sensor.
+ final IRotation3D electrodesRotation = new RotationPassiveXYZ(0, 0, 0);
+ final Transform3D electrodesTransform = new Transform3D(electrodesPosition, electrodesRotation);
+
+ // Set the number of readout and sense electrodes.
+ final SiStrips readoutElectrodes = new SiStrips(ChargeCarrier.HOLE, READOUT_STRIP_PITCH, this,
+ electrodesTransform);
+ final SiStrips senseElectrodes = new SiStrips(ChargeCarrier.HOLE, SENSE_STRIP_PITCH,
+ readoutElectrodes.getNCells() * 2 - 1, this, electrodesTransform);
+
+ final double readoutCapacitance = this.getStripLength() > this.longSensorLengthThreshold ? this.readoutLongStripCapacitanceSlope
+ : this.readoutStripCapacitanceSlope;
+ final double senseCapacitance = this.getStripLength() > this.longSensorLengthThreshold ? this.senseLongStripCapacitanceSlope
+ : this.senseStripCapacitanceSlope;
+
+ // Set the strip capacitance.
+ readoutElectrodes.setCapacitanceIntercept(this.readoutStripCapacitanceIntercept);
+ readoutElectrodes.setCapacitanceSlope(readoutCapacitance);
+ senseElectrodes.setCapacitanceIntercept(this.senseStripCapacitanceIntercept);
+ senseElectrodes.setCapacitanceSlope(senseCapacitance);
+
+ // Set sense and readout electrodes.
+ this.setSenseElectrodes(senseElectrodes);
+ this.setReadoutElectrodes(readoutElectrodes);
+
+ // Set the charge transfer efficiency.
+ final double[][] transferEfficiencies = {{READOUT_TRANSFER_EFFICIENCY, SENSE_TRANSFER_EFFICIENCY}};
+ this.setTransferEfficiencies(ChargeCarrier.HOLE, new BasicMatrix(transferEfficiencies));
+
+ }
+
+ /**
+ * Return the length of an {@link HpsSiSensor} strip. This is done by getting the face of the {@link HpsSiSensor}
+ * and returning the length of the longest edge.
+ *
+ * @return The length of the longest {@link HpsSiSensor} edge
+ */
+ protected double getStripLength() {
+
+ double length = 0;
+
+ // Get the faces normal to the sensor
+ final List<Polygon3D> faces = ((Box) this.getGeometry().getLogicalVolume().getSolid())
+ .getFacesNormalTo(new BasicHep3Vector(0, 0, 1));
+ for (final Polygon3D face : faces) {
+
+ // Loop through the edges of the sensor face and find the longest
// one
- List<LineSegment3D> edges = face.getEdges();
- for (LineSegment3D edge : edges) {
+ final List<LineSegment3D> edges = face.getEdges();
+ for (final LineSegment3D edge : edges) {
if (edge.getLength() > length) {
length = edge.getLength();
}
@@ -548,19 +541,20 @@
/**
* Set the sensor id used by millepede.
+ *
* @param id - millepede sensor id
*/
- public void setMillepedeId(int id) {
- millepedeId = id;
- }
-
+ public void setMillepedeId(final int id) {
+ this.millepedeId = id;
+ }
/**
* Get the sensor id used by millepede.
+ *
* @return the millepede sensor id.
*/
public int getMillepedeId() {
- return millepedeId;
- }
-
+ return this.millepedeId;
+ }
+
}
########################################################################
Use REPLY-ALL to reply to list
To unsubscribe from the LCDET-SVN list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1
|