Print

Print


Hello Jeremy,

I was attempting to implement your first example with the following code:

    @Override
>     public void detectorChanged(Detector detector) {
>         for(EcalCrystal crystal :
> detector.getSubdetector("Ecal").getDetectorElement().findDescendants(EcalCrystal.class))
> {
>             System.out.println(crystal.getIdentifier().getValue());
>             CalorimeterHit tempHit = CalorimeterHitUtilities.create(0, 0,
> crystal.getIdentifier().getValue());
>
>             int ix = tempHit.getIdentifierFieldValue("ix");
>             int iy = tempHit.getIdentifierFieldValue("iy");
>             double[] xyz = tempHit.getPosition();
>
>             System.out.printf("(%3d, %3d) --> (%.2f, %.2f)%n", ix, iy,
> xyz[0], xyz[1]);
>         }
>     }
>

When running this, I obtain the error:

java.lang.NullPointerException
>         at org.lcsim.event.base.BaseHit.getIDDecoder(BaseHit.java:127)
>         at org.lcsim.event.base.BaseHit.getSubdetector(BaseHit.java:67)
>         at
> org.lcsim.event.base.BaseHit.getIdentifierHelper(BaseHit.java:111)
>         at
> org.lcsim.event.base.BaseHit.getIdentifierFieldValue(BaseHit.java:159)
>         at
> org.hps.users.kmccarty.TriggerDiagnosticDriver.detectorChanged(TriggerDiagnosticDriver.java:53)
>         at org.lcsim.util.Driver.detectorChanged(Driver.java:171)
>         at
> org.lcsim.util.DriverAdapter.detectorChanged(DriverAdapter.java:86)
>         at
> org.lcsim.util.DriverAdapter.recordSupplied(DriverAdapter.java:72)
>         at
> org.freehep.record.loop.DefaultRecordLoop.consumeRecord(DefaultRecordLoop.java:832)
>         at
> org.freehep.record.loop.DefaultRecordLoop.loop(DefaultRecordLoop.java:668)
>         at
> org.freehep.record.loop.DefaultRecordLoop.execute(DefaultRecordLoop.java:566)
>         at org.lcsim.util.loop.LCSimLoop.loop(LCSimLoop.java:153)
>         at org.lcsim.job.JobControlManager.run(JobControlManager.java:429)
>         at org.hps.job.JobManager.run(JobManager.java:36)
>         at org.lcsim.job.JobControlManager.run(JobControlManager.java:187)
>         at org.hps.job.JobManager.main(JobManager.java:18)
>

This occurs at the line "int ix = tempHit.getIdentifierFieldValue("ix");".
Note that it does print the ID value (specifically 4129037, if it is
useful). Do you know what is causing this issue?

Thanks,

Kyle

On Fri, Feb 6, 2015 at 3:58 PM, McCormick, Jeremy I. <
[log in to unmask]> wrote:

>  Apologies, my last reply might have been an incomplete draft.
>
>  Here’s an example of creating hits directly from the crystal objects in
> the geometry...
>
>  public class IdExample extends Driver {
>
>      IIdentifierHelper helper;
>     Subdetector subdet;
>     public void detectorChanged(Detector detector) {
>         subdet = detector.getSubdetector("Ecal");
>         helper = subdet.getDetectorElement().getIdentifierHelper();
>     }
>
>
>      public void process(EventHeader event) {
>         for (EcalCrystal crystal : subdet
> .getDetectorElement().findDescendants(EcalCrystal.class)) {
>             IIdentifier id = crystal.getIdentifier();
>             CalorimeterHitUtilities.create(0, 0, id.getValue());
>         }
>     }
>
>
>  }
>
>  You can also do something similar based on the EcalChannel conditions….
>
>  public class EcalChannelIdExample extends Driver {
>
>      EcalChannelCollection channels;
>     int sys;
>     IIdentifierHelper helper;
>     public void detectorChanged(Detector detector) {
>         channels =
> DatabaseConditionsManager.getInstance().getCollection(EcalChannelCollection.
> class);
>         helper = detector.getSubdetector("Ecal"
> ).getDetectorElement().getIdentifierHelper();
>         sys = detector.getSubdetector("Ecal").getSystemID();
>     }
>
>
>      public void process(EventHeader event) {
>         for (EcalChannel channel : channels) {
>             IExpandedIdentifier id = new ExpandedIdentifier();
>             int xIndex = helper.getFieldIndex("ix");
>             int yIndex = helper.getFieldIndex("iy");
>             int sysIndex = helper.getFieldIndex("system");
>             id.setValue(xIndex, channel.getX());
>             id.setValue(yIndex, channel.getY());
>             id.setValue(sysIndex, sys);
>             CalorimeterHitUtilities.create(0, 0, helper.pack(id
> ).getValue());
>         }
>     }
> }
>
>  I think probably the second way is better because you can easily lookup
> whatever EcalChannel you want in the collection.
>
>  For instance, you can easily add some if statement to look at the X and
> Y of the channel as you are looping over them to determine if you want to
> use it or not for creating a hit.
>
>  If you have any questions about these examples let me know.  Should be
> enough to point you in the right direction...
>
>  On Feb 6, 2015, at 9:53 AM, Kyle McCarty <[log in to unmask]> wrote:
>
>  Hello Jeremy,
>
> I'm not sure if this email got lost. I am trying to create a class for the
> SSP clusters that extends BaseCluster. I need to do this because I will
> need to run them through the trigger logic, and it uses BaseCluster objects
> as arguments. My plan was to create a fake cluster that contains a seed hit
> with all of the reported energy at the correct cluster location and then
> populate the rest of the cluster with fake zero energy hits so that
> cluster.getCalorimeterHits().size() returns the correct cluster size. To do
> this, I am trying to create the hits with
> CalorimeterHitUtilities.create(double, double, long), but I am unsure how
> to get the long cell ID from the ix/iy crystal indices. The conditions
> database gives ints for both channel and channel ID. Can you explain how to
> obtain this value or suggest a better way to accomplish what I am trying to
> do?
>
> Thanks,
>
> Kyle
>
> On Thu, Feb 5, 2015 at 8:53 AM, Kyle McCarty <[log in to unmask]> wrote:
>
>>  Hello Jeremy,
>>
>>  Is there a quick way to get the "ID" field that is needed when creating
>> a CalorimeterHit object from the x- and y- indices?
>>
>>  I am trying to create an extension of BaseCluster to represent the
>> clusters reported by the SSP. These will never be persisted since they are
>> generated automatically from the SSP bank data during a run, so there is no
>> concern over whether they are LCIO-compatible.
>>
>> Thanks,
>>
>> Kyle
>>
>
>
>

########################################################################
Use REPLY-ALL to reply to list

To unsubscribe from the HPS-SOFTWARE list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=HPS-SOFTWARE&A=1