View Javadoc

1   /*
2    * TrackerHitDriver.java
3    *
4    * Created on February 15, 2008, 7:09 PM
5    *
6    * To change this template, choose Tools | Template Manager
7    * and open the template in the editor.
8    */
9   
10  package org.lcsim.recon.tracking.digitization.sisim;
11  
12  import java.util.ArrayList;
13  import java.util.Arrays;
14  import java.util.HashSet;
15  import java.util.List;
16  import java.util.Set;
17  
18  import org.lcsim.detector.IDetectorElement;
19  import org.lcsim.detector.tracker.silicon.SiSensor;
20  import org.lcsim.detector.tracker.silicon.SiTrackerModule;
21  import org.lcsim.event.EventHeader;
22  import org.lcsim.event.RawTrackerHit;
23  import org.lcsim.geometry.Detector;
24  import org.lcsim.recon.tracking.digitization.sisim.config.SimTrackerHitReadoutDriver;
25  import org.lcsim.util.Driver;
26  import org.lcsim.lcio.LCIOConstants;
27  
28  /**
29   *
30   * @author tknelson
31   */
32  public class TrackerHitDriver extends Driver
33  {
34      
35      List<String> _readouts = new ArrayList<String>();
36      
37      List<String> _process_paths = new ArrayList<String>();
38      List<IDetectorElement> _process_de = new ArrayList<IDetectorElement>();
39      Set<SiSensor> _process_sensors = new HashSet<SiSensor>();
40      Set<SiTrackerModule> _process_modules = new HashSet<SiTrackerModule>();
41      
42      //  Algorithm classes responsible for making hits
43      SiSensorSim _strip_simulation = new CDFSiSensorSim();
44      ReadoutChip _strip_readout = new Kpix();
45  
46      SiSensorSim _pixel_simulation = new CDFSiSensorSim();
47      ReadoutChip _pixel_readout = new Kpix();
48      
49      SiDigitizer _digitizer = new RawTrackerHitMaker(_strip_simulation,_strip_readout);
50      Clusterer _strip_clusterer = new StripHitMaker(_strip_simulation,_strip_readout);
51      Clusterer _pixel_clusterer = new PixelHitMaker(_pixel_simulation,_pixel_readout);
52      StripHitCombiner _striphit_combiner = new StripHit2DMaker();
53      
54      /**
55       * Creates a new instance of TrackerHitDriver
56       */
57      
58      // Default constructor
59      public TrackerHitDriver()
60      {
61          
62      }
63      
64      // Construct your own
65      public TrackerHitDriver(SiDigitizer digitizer, Clusterer strip_clusterer,
66              Clusterer pixel_clusterer, StripHitCombiner striphit_combiner)
67      {
68          _digitizer = digitizer;
69          _strip_clusterer = strip_clusterer;
70          _pixel_clusterer = pixel_clusterer;
71          _striphit_combiner = striphit_combiner;
72      }
73      
74      // Change out a single component
75      //------------------------------
76      public void setDigitizer(SiDigitizer digitizer)
77      {
78          _digitizer = digitizer;
79      }
80      
81      public void setStripClusterer(Clusterer strip_clusterer)
82      {
83          _strip_clusterer = strip_clusterer;
84      }
85  
86      public void setPixelClusterer(Clusterer pixel_clusterer)
87      {
88          _pixel_clusterer = pixel_clusterer;
89      }
90      
91      public void setStripHitCombiner(StripHitCombiner striphit_combiner)
92      {
93          _striphit_combiner = striphit_combiner;
94      }
95      
96      // Access components
97      //------------------
98      public SiDigitizer getDigitizer()
99      {
100         return _digitizer;
101     }
102     
103     public Clusterer getStripClusterer()
104     {
105         return _strip_clusterer;
106     }
107     
108     public Clusterer getPixelClusterer()
109     {
110         return _pixel_clusterer;
111     }
112     
113     public StripHitCombiner getStripHitCombiner()
114     {
115         return _striphit_combiner;
116     }
117     
118     // Collection names
119     //-----------------
120     public String getRawHitsName()
121     {
122         return _digitizer.getName()+"_RawTrackerHits";
123     }
124     
125     public String getStripHits1DName()
126     {
127         return _strip_clusterer.getName()+"_SiTrackerHitStrip1D";
128     }
129     
130     String getPixelHitsName()
131     {
132         return _pixel_clusterer.getName()+"_SiTrackerHitPixel";
133     }
134     
135     public String getStripHits2DName()
136     {
137         return _striphit_combiner.getName()+"_SiTrackerHitStrip2D";
138     }
139     
140     
141     // Define which hits to use and which detector elements to process
142     //================================================================
143     
144     // Add a readout name for SimTrackerHits to use
145     public void setReadout(String readout)
146     {
147         _readouts.add(readout);
148     }
149     
150     public void setReadouts(String readout[])
151     {
152     	_readouts.addAll(Arrays.asList(readout));
153     }
154     
155     public void setElementsToProcess(String de_paths[])
156     {
157     	_process_paths.addAll(Arrays.asList(de_paths));
158     }
159     
160     // Add a detector to process
161     public void addElementToProcess(String de_path)
162     {
163         _process_paths.add(de_path);
164     }
165     
166     // Actions begins here
167     //====================
168     public void detectorChanged(Detector detector)
169     {
170          System.out.println(detector.getName());
171         super.detectorChanged(detector);
172         
173         // Process detectors specified by path, otherwise process entire detector
174         IDetectorElement detector_de = detector.getDetectorElement();
175         System.out.println(detector_de.getName());
176         for (String de_path : _process_paths)
177         {
178             _process_de.add(detector_de.findDetectorElement(de_path));
179         }
180         
181         if (_process_de.size() == 0)
182         {
183             _process_de.add(detector_de);
184         }
185         
186         for (IDetectorElement detector_element : _process_de)
187         {
188             _process_sensors.addAll(detector_element.findDescendants(SiSensor.class));
189             _process_modules.addAll(detector_element.findDescendants(SiTrackerModule.class));
190         }
191         
192     }
193     
194     public void startOfData()
195     {        
196         // If readouts not already set, set them up
197         if (_readouts.size() != 0)
198         {
199             System.out.println("Adding SimTrackerHitIdentifierReadoutDriver with readouts: "+_readouts);
200             super.add( new SimTrackerHitReadoutDriver( _readouts ) );        
201         }
202         
203         // Call this after added above driver, so that subdriver's startOfData() method is called. --JM
204         super.startOfData();
205 
206         // Only allow this once per job since readouts cannot be deleted for SimTrackerIdentifierReadoutDriver
207         // FIXME: should be a robust system for changing readouts and eliminating duplicates in the readout driver
208         _readouts.clear();
209 
210     }
211     
212     public void process(EventHeader event)
213     {
214         super.process(event);
215         System.out.println("TrackerHitDriver processing event...");
216         
217         // Lists of hits
218         List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
219 
220         List<SiTrackerHit> hits_strip1D = new ArrayList<SiTrackerHit>();
221         List<SiTrackerHit> hits_pixel = new ArrayList<SiTrackerHit>();
222         List<SiTrackerHit> hits_strip2D = new ArrayList<SiTrackerHit>();
223         
224 //       for (IDetectorElement detector_element : _process_de)        {
225 //
226         //System.out.println("Processing detector: "+detector_element.getName());
227         
228         for (SiSensor sensor : _process_sensors)
229         {
230  //            System.out.println("Processing "+sensor.getName());
231 //            if (sensor.getName().contains("Endcap"))
232 //            {
233 //                System.out.println("Processing sensor: "+sensor.getName());
234 //            }
235             
236             raw_hits.addAll(_digitizer.makeHits(sensor));
237             
238             if (sensor.hasStrips())
239             {
240                 hits_strip1D.addAll(_strip_clusterer.makeHits(sensor));
241             }
242 
243          
244             //            if (sensor.hasPixels())
245 //            {
246 //                hits_pixel.addAll(_pixel_clusterer.makeHits(sensor));
247 //            }
248             // When pixels are working, this should become an else if to pixel hitmaking
249             if (sensor.isDoubleSided())
250             {
251               
252 //               hits_strip2D.addAll(_striphit_combiner.makeHits(sensor));
253             }
254         }
255         
256  
257         
258         for (SiTrackerModule module : _process_modules)
259         {
260   //          System.out.println("Combining double sided modules "+module.getName());
261             if (module.isDoubleSided())
262             {   
263   //              System.out.println(" # Raw Hits:"+raw_hits.size());
264   //              System.out.println("# Strip1D Hits:"+hits_strip1D.size());
265 //                hits_strip2D.addAll(_striphit_combiner.makeHits(module));
266             }
267         }
268  //           System.out.println(" # Raw Hits:"+raw_hits.size());
269   //          System.out.println("# Strip1D Hits:"+hits_strip1D.size());
270 //        }
271 
272         // FIXME
273         // Take list of 2D hits
274         // Loop through and make LCRelationalTable
275         // Add table to event
276         // Is that all there is?
277         
278 //        System.out.println("# Strip2D Hits:"+hits_strip2D.size());
279         //int flag = (1 << LCIOConstants.RTHBIT_HITS | 1 << LCIOConstants.TRAWBIT_ID1); //correct flag for persistence 
280         int flag = (1 << LCIOConstants.TRAWBIT_ID1); //correct flag for persistence 
281         event.put(getRawHitsName(),raw_hits,RawTrackerHit.class,flag,toString());
282         event.put(getStripHits1DName(),hits_strip1D,SiTrackerHitStrip1D.class,0,toString());
283         event.put(getPixelHitsName(),hits_pixel,SiTrackerHitPixel.class,0,toString());
284         event.put(getStripHits2DName(),hits_strip2D,SiTrackerHitStrip2D.class,0,toString());
285 
286         
287     }
288     
289 }
290 
291 
292 
293 
294 
295 
296 
297 
298 
299 
300 
301 
302 
303 //    public void makeHits(IDetectorElement detector)
304 //    {
305 //
306 //        List<SiSensor> sensors = detector.findDescendants(SiSensor.class);
307 //        List<SiTrackerModule> modules = detector.findDescendants(SiTrackerModule.class);
308 //
309 //        // clear hit lists
310 //        _hits_raw.clear();
311 //        _hits.clear();
312 //
313 //        // Loop over all sensors
314 //        for (SiSensor sensor : sensors)
315 //        {
316 //            // Make raw hits
317 //            _hits_raw.addAll(_raw_hitmaker.makeHits(sensor));
318 //
319 //            // Make Pixel or 1D hits - FIXME need appropriate switch and protection here
320 //            _hits.addAll(_strip_clusterer.makeHits(sensor));
321 //
322 //            // If double-sided strip sensors, make 2-d hits
323 //            if (sensor.isDoubleSided())
324 //            {
325 //                _hits.addAll(_2D_hitmaker.makeHits2D(sensor));
326 //            }
327 //        }
328 //
329 //        // Loop over all modules
330 //        for (SiTrackerModule module : modules)
331 //        {
332 //            if (module.isDoubleSided())
333 //            {
334 //                _hits.addAll(_2D_hitmaker.makeHits2D(module));
335 //            }
336 //        }
337 //
338 //    }
339 
340 
341 //    public List<RawTrackerHit> getRawHits()
342 //    {
343 //        return _hits_raw;
344 //    }
345 
346 
347 //    public List<TrackerHit> getHits()
348 //    {
349 //        return _hits;
350 //    }
351 
352 
353 
354 
355 
356 //                for (SiSensorElectrodes electrodes : sensor.getReadoutElectrodes())
357 //                {
358 //                    if (electrodes instanceof SiStrips)
359 //                    {
360 //                        hits_strip1D.addAll(makeHits((SiStr);
361 //                    }
362 ////                    else if (electrodes instanceof SiPixels)
363 ////                    {
364 ////                        hits.addAll(_pixel_clusterer.makeHits(electrodes));
365 ////                    }
366 //                }