Author: [log in to unmask] Date: Tue Apr 14 19:05:37 2015 New Revision: 2702 Log: Add check for subdetector in case it is not present in the detector model. Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java ============================================================================= --- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java (original) +++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java Tue Apr 14 19:05:37 2015 @@ -25,159 +25,9 @@ * * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a> */ -@Table(names = { "ecal_channels", "test_run_ecal_channels" }) +@Table(names = {"ecal_channels", "test_run_ecal_channels"}) @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED, converter = EcalChannel.EcalChannelConverter.class) public final class EcalChannel extends BaseConditionsObject { - - /** - * Customized converter for this object. - */ - public static final class EcalChannelConverter extends AbstractConditionsObjectConverter<EcalChannelCollection> { - - /** - * Create an {@link EcalChannel} collection. - * - * @param conditionsManager the conditions manager - * @param name the name of the conditions data table - * @return the collection of ECAL channel objects - */ - @Override - public EcalChannelCollection getData(final ConditionsManager conditionsManager, final String name) { - final EcalChannelCollection collection = super.getData(conditionsManager, name); - final Subdetector ecal = DatabaseConditionsManager.getInstance().getEcalSubdetector(); - collection.buildGeometryMap(ecal.getDetectorElement().getIdentifierHelper(), ecal.getSystemID()); - return collection; - } - - /** - * Get the type this converter handles. - * - * @return the type this converter handles - */ - @Override - public Class<EcalChannelCollection> getType() { - return EcalChannelCollection.class; - } - } - - /** - * The <code>DaqId</code> is the combination of crate, slot and channel that specify the channel's DAQ - * configuration. - */ - public static final class DaqId extends AbstractIdentifier { - - /** - * The DAQ crate number. - */ - private int crate = -1; - - /** - * The DAQ slot number. - */ - private int slot = -1; - - /** - * The DAQ channel number. - */ - private int channel = -1; - - /** - * Create a DAQ ID from an array of values. - * - * @param values The list of values (crate, slot, channel). - */ - public DaqId(final int values[]) { - crate = values[0]; - slot = values[1]; - channel = values[2]; - } - - /** - * Encode this ID into a long value. - * - * @return The encoded long value. - */ - @Override - public long encode() { - // from ECAL readout sim code - return (((long) crate) << 32) | ((long) slot << 16) | (long) channel; - } - - /** - * Check if the values look valid. - * - * @return True if ID's values are valid. - */ - @Override - public boolean isValid() { - return crate != -1 && slot != -1 && channel != -1; - } - } - - /** - * The <code>GeometryId</code> contains the x and y indices of the crystal in the LCSIM-based geometry - * representation. - */ - public static final class GeometryId extends AbstractIdentifier { - - /** - * The subdetector system ID. - */ - private int system = -1; - - /** - * The crystal's X index. - */ - private int x = Integer.MAX_VALUE; - - /** - * The crystal's Y index. - */ - private int y = Integer.MAX_VALUE; - - /** - * The helper for using identifiers. - */ - private IIdentifierHelper helper; - - /** - * Create a geometry ID. - * - * @param helper the ID helper - * @param values the list of values (order is system, x, y) - */ - public GeometryId(final IIdentifierHelper helper, final int[] values) { - this.helper = helper; - system = values[0]; - x = values[1]; - y = values[2]; - } - - /** - * Encode this ID as a long using the ID helper. - * - * @return The encoded long value. - */ - @Override - public long encode() { - final IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary() - .getNumberOfFields()); - expId.setValue(helper.getFieldIndex("system"), system); - expId.setValue(helper.getFieldIndex("ix"), x); - expId.setValue(helper.getFieldIndex("iy"), y); - return helper.pack(expId).getValue(); - } - - /** - * Return <code>true</code> if ID is valid - * - * @return <code>true</code> if ID is valid - */ - @Override - public boolean isValid() { - return system != -1 && x != Integer.MAX_VALUE && y != Integer.MAX_VALUE; - } - } /** * The <code>ChannelId</code> is a unique number identifying the channel within its conditions collection. The @@ -194,185 +44,92 @@ /** * Create a channel ID. - * + * * @param values the values (size 0 with single int value) */ - public ChannelId(int[] values) { - id = values[0]; + public ChannelId(final int[] values) { + this.id = values[0]; } /** * Encode as long value (just returns the int value). - * + * * @return the ID's value encoded as a <code>long</code> */ @Override public long encode() { - return id; + return this.id; } /** * Return <code>true</code> if ID is valid - * + * * @return <code>true</code> if ID is valid */ @Override public boolean isValid() { - return id != -1; - } - } - - /** - * Create a {@link #DaqId} for this ECAL channel. - * - * @return the {@link #DaqId} for this ECAL channel - */ - DaqId createDaqId() { - return new DaqId(new int[] { getCrate(), getSlot(), getChannel() }); - } - - /** - * Create a {@link #GeometryId} for this ECAL channel. - * - * @param helper the ID helper - * @param system the subdetector system ID - * @return the geometry ID - */ - GeometryId createGeometryId(final IIdentifierHelper helper, final int system) { - return new GeometryId(helper, new int[] { system, getX(), getY() }); - } - - /** - * Create a channel ID for this ECAL channel. - * - * @return The channel ID. - */ - ChannelId createChannelId() { - return new ChannelId(new int[] { this.getChannelId() }); + return this.id != -1; + } + } + + /** + * The <code>DaqId</code> is the combination of crate, slot and channel that specify the channel's DAQ + * configuration. + */ + public static final class DaqId extends AbstractIdentifier { + + /** + * The DAQ channel number. + */ + private int channel = -1; + + /** + * The DAQ crate number. + */ + private int crate = -1; + + /** + * The DAQ slot number. + */ + private int slot = -1; + + /** + * Create a DAQ ID from an array of values. + * + * @param values The list of values (crate, slot, channel). + */ + public DaqId(final int values[]) { + this.crate = values[0]; + this.slot = values[1]; + this.channel = values[2]; + } + + /** + * Encode this ID into a long value. + * + * @return The encoded long value. + */ + @Override + public long encode() { + // from ECAL readout sim code + return (long) this.crate << 32 | (long) this.slot << 16 | this.channel; + } + + /** + * Check if the values look valid. + * + * @return True if ID's values are valid. + */ + @Override + public boolean isValid() { + return this.crate != -1 && this.slot != -1 && this.channel != -1; + } } /** * A collection of {@link EcalChannel} objects. */ public static class EcalChannelCollection extends BaseConditionsObjectCollection<EcalChannel> { - - /** - * Map of {@link #DaqId} to channel object. - */ - private Map<Long, EcalChannel> daqMap = new HashMap<Long, EcalChannel>(); - - /** - * Map of {@link #GeometryId} to channel object. - */ - private Map<Long, EcalChannel> geometryMap = new HashMap<Long, EcalChannel>(); - - /** - * Map of {@link #ChannelId} to channel object. - */ - private Map<Long, EcalChannel> channelMap = new HashMap<Long, EcalChannel>(); - - /** - * Add an <code>EcalChannel</code> to the collection and cache its ID information. The GeometryId must be - * created later as it requires access to the Detector API. - * - * @param channel the ECAL channel object - * @return <code>true</code> if object was added successfully - */ - @Override - public boolean add(final EcalChannel channel) { - super.add(channel); - final DaqId daqId = channel.createDaqId(); - if (daqId.isValid()) { - daqMap.put(daqId.encode(), channel); - } - final ChannelId channelId = channel.createChannelId(); - if (channelId.isValid()) { - channelMap.put(channelId.encode(), channel); - } - return true; - } - - /** - * Build the map of {@link #GeometryId} objects. - * - * @param helper the ID helper of the subdetector - * @param system the system ID of the subdetector - */ - void buildGeometryMap(final IIdentifierHelper helper, final int system) { - for (EcalChannel channel : this) { - GeometryId geometryId = channel.createGeometryId(helper, system); - geometryMap.put(geometryId.encode(), channel); - } - } - - /** - * Find a channel by using DAQ information. - * - * @param daqId the DAQ ID object - * @return the matching channel or <code>null</code> if does not exist. - */ - public EcalChannel findChannel(final DaqId daqId) { - return daqMap.get(daqId.encode()); - } - - /** - * Find a channel by using its physical ID information. - * - * @param geometryId the geometric ID object - * @return the matching channel or <code>null</code> if does not exist - */ - public EcalChannel findChannel(final GeometryId geometryId) { - return geometryMap.get(geometryId.encode()); - } - - /** - * Find a channel by its channel ID. - * - * @param channelId the channel ID object - * @return the matching channel or <code>null</code> if does not exist - */ - public EcalChannel findChannel(final ChannelId channelId) { - return channelMap.get(channelId.encode()); - } - - /** - * Find a channel by its encoded geometric ID. - * - * @param id the encoded geometric ID - * @return the matching channel or <code>null</code> if does not exist - */ - public EcalChannel findGeometric(final long id) { - return geometryMap.get(id); - } - - /** - * Find a channel by its encoded channel ID. - * - * @param id the encoded channel ID - * @return the matching channel or <code>null</code> if does not exist - */ - public EcalChannel findChannel(final long id) { - return channelMap.get(id); - } - - /** - * Find a channel by its encoded DAQ ID. - * - * @param id the encoded DAQ ID - * @return the matching channel or <code>null</code> if does not exist - */ - public EcalChannel findDaq(final long id) { - return daqMap.get(id); - } - - /** - * Sort collection and return but do not sort in place. - * - * @return the sorted copy of the collection - */ - public BaseConditionsObjectCollection<EcalChannel> sorted() { - return sorted(new ChannelIdComparator()); - } /** * Comparison of ECAL channel objects. @@ -380,12 +137,13 @@ class ChannelIdComparator implements Comparator<EcalChannel> { /** * Compare two ECAL channel objects using their channel ID. - * + * * @param c1 the first object * @param c2 the second object * @return -1, 0, or 1 if first channel is less than, equal to or greater than second */ - public int compare(EcalChannel c1, EcalChannel c2) { + @Override + public int compare(final EcalChannel c1, final EcalChannel c2) { if (c1.getChannelId() < c2.getChannelId()) { return -1; } else if (c1.getChannelId() > c2.getChannelId()) { @@ -395,74 +153,261 @@ } } } - } - - /** - * Get the crate number of the channel. - * - * @return the crate number - */ - @Field(names = { "crate" }) - public int getCrate() { - return getFieldValue("crate"); - } - - /** - * Get the slot number of the channel. - * - * @return the slot number - */ - @Field(names = { "slot" }) - public int getSlot() { - return getFieldValue("slot"); - } - - /** - * Get the channel number of the channel. - * - * @return the channel number - */ - @Field(names = { "channel" }) - public int getChannel() { - return getFieldValue("channel"); - } - - /** - * Get the x value of the channel. - * - * @return the x value - */ - @Field(names = { "x" }) - public int getX() { - return getFieldValue("x"); - } - - /** - * Get the y value of the channel. - * - * @return the y value - */ - @Field(names = { "y" }) - public int getY() { - return getFieldValue("y"); - } - - /** - * Get the ID of the channel. - * - * @return the ID of the channel - */ - @Field(names = { "channel_id" }) - public int getChannelId() { - return getFieldValue("channel_id"); + + /** + * Map of {@link #ChannelId} to channel object. + */ + private final Map<Long, EcalChannel> channelMap = new HashMap<Long, EcalChannel>(); + + /** + * Map of {@link #DaqId} to channel object. + */ + private final Map<Long, EcalChannel> daqMap = new HashMap<Long, EcalChannel>(); + + /** + * Map of {@link #GeometryId} to channel object. + */ + private final Map<Long, EcalChannel> geometryMap = new HashMap<Long, EcalChannel>(); + + /** + * Add an <code>EcalChannel</code> to the collection and cache its ID information. The GeometryId must be + * created later as it requires access to the Detector API. + * + * @param channel the ECAL channel object + * @return <code>true</code> if object was added successfully + */ + @Override + public boolean add(final EcalChannel channel) { + super.add(channel); + final DaqId daqId = channel.createDaqId(); + if (daqId.isValid()) { + this.daqMap.put(daqId.encode(), channel); + } + final ChannelId channelId = channel.createChannelId(); + if (channelId.isValid()) { + this.channelMap.put(channelId.encode(), channel); + } + return true; + } + + /** + * Build the map of {@link #GeometryId} objects. + * + * @param helper the ID helper of the subdetector + * @param system the system ID of the subdetector + */ + void buildGeometryMap(final IIdentifierHelper helper, final int system) { + for (final EcalChannel channel : this) { + final GeometryId geometryId = channel.createGeometryId(helper, system); + this.geometryMap.put(geometryId.encode(), channel); + } + } + + /** + * Find a channel by its channel ID. + * + * @param channelId the channel ID object + * @return the matching channel or <code>null</code> if does not exist + */ + public EcalChannel findChannel(final ChannelId channelId) { + return this.channelMap.get(channelId.encode()); + } + + /** + * Find a channel by using DAQ information. + * + * @param daqId the DAQ ID object + * @return the matching channel or <code>null</code> if does not exist. + */ + public EcalChannel findChannel(final DaqId daqId) { + return this.daqMap.get(daqId.encode()); + } + + /** + * Find a channel by using its physical ID information. + * + * @param geometryId the geometric ID object + * @return the matching channel or <code>null</code> if does not exist + */ + public EcalChannel findChannel(final GeometryId geometryId) { + return this.geometryMap.get(geometryId.encode()); + } + + /** + * Find a channel by its encoded channel ID. + * + * @param id the encoded channel ID + * @return the matching channel or <code>null</code> if does not exist + */ + public EcalChannel findChannel(final long id) { + return this.channelMap.get(id); + } + + /** + * Find a channel by its encoded DAQ ID. + * + * @param id the encoded DAQ ID + * @return the matching channel or <code>null</code> if does not exist + */ + public EcalChannel findDaq(final long id) { + return this.daqMap.get(id); + } + + /** + * Find a channel by its encoded geometric ID. + * + * @param id the encoded geometric ID + * @return the matching channel or <code>null</code> if does not exist + */ + public EcalChannel findGeometric(final long id) { + return this.geometryMap.get(id); + } + + /** + * Sort collection and return but do not sort in place. + * + * @return the sorted copy of the collection + */ + @Override + public BaseConditionsObjectCollection<EcalChannel> sorted() { + return sorted(new ChannelIdComparator()); + } + } + + /** + * Customized converter for this object. + */ + public static final class EcalChannelConverter extends AbstractConditionsObjectConverter<EcalChannelCollection> { + + /** + * Create an {@link EcalChannel} collection. + * + * @param conditionsManager the conditions manager + * @param name the name of the conditions data table + * @return the collection of ECAL channel objects + */ + @Override + public EcalChannelCollection getData(final ConditionsManager conditionsManager, final String name) { + final EcalChannelCollection collection = super.getData(conditionsManager, name); + final Subdetector ecal = DatabaseConditionsManager.getInstance().getEcalSubdetector(); + if (ecal != null) { + collection.buildGeometryMap(ecal.getDetectorElement().getIdentifierHelper(), ecal.getSystemID()); + } + return collection; + } + + /** + * Get the type this converter handles. + * + * @return the type this converter handles + */ + @Override + public Class<EcalChannelCollection> getType() { + return EcalChannelCollection.class; + } + } + + /** + * The <code>GeometryId</code> contains the x and y indices of the crystal in the LCSIM-based geometry + * representation. + */ + public static final class GeometryId extends AbstractIdentifier { + + /** + * The helper for using identifiers. + */ + private final IIdentifierHelper helper; + + /** + * The subdetector system ID. + */ + private int system = -1; + + /** + * The crystal's X index. + */ + private int x = Integer.MAX_VALUE; + + /** + * The crystal's Y index. + */ + private int y = Integer.MAX_VALUE; + + /** + * Create a geometry ID. + * + * @param helper the ID helper + * @param values the list of values (order is system, x, y) + */ + public GeometryId(final IIdentifierHelper helper, final int[] values) { + this.helper = helper; + this.system = values[0]; + this.x = values[1]; + this.y = values[2]; + } + + /** + * Encode this ID as a long using the ID helper. + * + * @return The encoded long value. + */ + @Override + public long encode() { + final IExpandedIdentifier expId = new ExpandedIdentifier(this.helper.getIdentifierDictionary() + .getNumberOfFields()); + expId.setValue(this.helper.getFieldIndex("system"), this.system); + expId.setValue(this.helper.getFieldIndex("ix"), this.x); + expId.setValue(this.helper.getFieldIndex("iy"), this.y); + return this.helper.pack(expId).getValue(); + } + + /** + * Return <code>true</code> if ID is valid + * + * @return <code>true</code> if ID is valid + */ + @Override + public boolean isValid() { + return this.system != -1 && this.x != Integer.MAX_VALUE && this.y != Integer.MAX_VALUE; + } + } + + /** + * Create a channel ID for this ECAL channel. + * + * @return The channel ID. + */ + ChannelId createChannelId() { + return new ChannelId(new int[] {this.getChannelId()}); + } + + /** + * Create a {@link #DaqId} for this ECAL channel. + * + * @return the {@link #DaqId} for this ECAL channel + */ + DaqId createDaqId() { + return new DaqId(new int[] {getCrate(), getSlot(), getChannel()}); + } + + /** + * Create a {@link #GeometryId} for this ECAL channel. + * + * @param helper the ID helper + * @param system the subdetector system ID + * @return the geometry ID + */ + GeometryId createGeometryId(final IIdentifierHelper helper, final int system) { + return new GeometryId(helper, new int[] {system, getX(), getY()}); } /** * Implementation of equals. - * + * * @param o the object to compare equality to * @return <code>true</code> if objects are equal */ + @Override public boolean equals(final Object o) { if (o == null) { return false; @@ -477,4 +422,64 @@ return c.getChannelId() == getChannelId() && c.getCrate() == getCrate() && c.getSlot() == getSlot() && c.getChannel() == getChannel() && c.getX() == getX() && c.getY() == getY(); } + + /** + * Get the channel number of the channel. + * + * @return the channel number + */ + @Field(names = {"channel"}) + public int getChannel() { + return getFieldValue("channel"); + } + + /** + * Get the ID of the channel. + * + * @return the ID of the channel + */ + @Field(names = {"channel_id"}) + public int getChannelId() { + return getFieldValue("channel_id"); + } + + /** + * Get the crate number of the channel. + * + * @return the crate number + */ + @Field(names = {"crate"}) + public int getCrate() { + return getFieldValue("crate"); + } + + /** + * Get the slot number of the channel. + * + * @return the slot number + */ + @Field(names = {"slot"}) + public int getSlot() { + return getFieldValue("slot"); + } + + /** + * Get the x value of the channel. + * + * @return the x value + */ + @Field(names = {"x"}) + public int getX() { + return getFieldValue("x"); + } + + /** + * Get the y value of the channel. + * + * @return the y value + */ + @Field(names = {"y"}) + public int getY() { + return getFieldValue("y"); + } }