View Javadoc

1   package org.lcsim.recon.tracking.vsegment.hit.base;
2   
3   import java.util.List;
4   import java.util.ArrayList;
5   
6   import org.lcsim.event.MCParticle;
7   
8   import org.lcsim.recon.tracking.vsegment.geom.Sensor;
9   import org.lcsim.recon.tracking.vsegment.hit.DigiTrackerHit;
10  
11  /**
12   * Composite DigiTrackerHit.
13   * Represents a sum of several digitized hits in a single channel. Typically used
14   * for combining simulated events, or overlaying events and electronic noise.
15   *
16   * @author D.Onoprienko
17   * @version $Id: DigiTrackerHitComposite.java,v 1.1 2008/12/06 21:53:44 onoprien Exp $
18   */
19  public class DigiTrackerHitComposite extends DigiTrackerHitAdapter {
20  
21  // -- Constructors :  ----------------------------------------------------------
22    
23    /** 
24     * Default constructor. 
25     * Signal, time, and cell ID will be set to zero.
26     */
27    public DigiTrackerHitComposite() {
28      _signal = 0.;
29      _time = 0.;
30    }
31    
32    /** 
33     * Fast constructor from data. 
34     * No check is performed to see if all hits in the list have the same cell ID.
35     * The list supplied as an argument will be owned by this composite hit.
36     */
37    public DigiTrackerHitComposite(double signal, double time, Sensor sensor, int channel, ArrayList<DigiTrackerHit> hitList) {
38      _signal = signal;
39      _time = time;
40      _sensor = sensor;
41      _channel = channel;
42      _hitList = hitList;
43    }
44  
45    /** 
46     * Creates a composite hit from a list of hits. 
47     * Signal is the sum of signals of constituent hits, time is signal-weighted average.
48     * Throws <tt>IllegalArgumentException</tt> if not all of the hits in the list 
49     * have the same channel ID. The list supplied as an argument will be copied.
50     */
51    public DigiTrackerHitComposite(List<DigiTrackerHit> hitList) {
52      if (hitList.isEmpty()) throw new IllegalArgumentException("Empty list");
53      _signal = 0.;
54      _time = 0.;
55      _channel = 0;
56      _hitList = new ArrayList<DigiTrackerHit>(hitList.size());
57      _hitList.addAll(hitList);
58      for (DigiTrackerHit hit : hitList) {
59        if (_sensor == null) {
60          _sensor = hit.getSensor();
61          _channel = hit.getChannel();
62        } else {
63          if ( ! ( _sensor == hit.getSensor() && _channel == hit.getChannel() ) ) {
64            throw new IllegalArgumentException("Mismatched sensor or channel ID");
65          }
66        }
67        _time += hit.getTime() * hit.getSignal();
68        _signal += hit.getSignal();
69      }
70      _time /= _signal;
71    }
72  
73    /** Copy constructor. */
74    public DigiTrackerHitComposite(DigiTrackerHitComposite digiHit) {
75      _signal = digiHit._signal;
76      _time = digiHit._time;
77      _sensor = digiHit._sensor;
78      _channel = digiHit._channel;
79      _hitList = new ArrayList<DigiTrackerHit>(digiHit._hitList);
80      _hitList.trimToSize();
81    }
82    
83  // -- Getters :  ---------------------------------------------------------------
84  
85    /**  
86     * Returns <tt>true</tt> if the hit is a superposition of more than one elemental hit. 
87     * Objects of this class always return <tt>true</tt>.
88     */
89    public boolean isComposite() {return true;}
90  
91    /** Returns <tt>null</tt> since the hit is composite. */
92    public MCParticle getMCParticle() {return null;}
93  
94    /** Returns a list of underlying elemental hits. */
95    public List<DigiTrackerHit> getElementalHits() {
96      ArrayList<DigiTrackerHit> hList = new ArrayList<DigiTrackerHit>(_hitList.size());
97      for (DigiTrackerHit hit : _hitList) {
98        if (hit.isComposite()) {
99          hList.addAll(hit.getElementalHits());
100       } else {
101         hList.add(hit);
102       }
103     }
104     return hList;
105   }
106   
107 // -- Modifiers :  -------------------------------------------------------------
108   
109   /** Add a hit to this composite hit. */
110   public void addHit(DigiTrackerHit hit) {
111     if (_hitList == null) {
112       _signal = hit.getSignal();
113       _time = hit.getTime();
114       _sensor = hit.getSensor();
115       _channel = hit.getChannel();
116       _hitList = new ArrayList<DigiTrackerHit>(2);
117     } else {
118       if ( ! ( _sensor == hit.getSensor() && _channel == hit.getChannel() ) ) {
119         System.out.println("throwing");
120         throw new IllegalArgumentException("Mismatched cell ID");
121       }
122       double signal = hit.getSignal();
123       _time = (_time * _signal + hit.getTime() * signal) / (_signal + signal);
124       _signal += signal;
125     }
126     _hitList.add(hit);
127   }
128   
129   /** Compact storage. */
130   public void trimToSize() {
131     _hitList.trimToSize();
132   }
133   
134 // -- Private parts :  ---------------------------------------------------------
135   
136   protected ArrayList<DigiTrackerHit> _hitList;
137 
138 }