View Javadoc

1   package org.lcsim.util.heprep;
2   
3   import hep.graphics.heprep.HepRepFactory;
4   import hep.graphics.heprep.HepRepInstance;
5   import hep.graphics.heprep.HepRepInstanceTree;
6   import hep.graphics.heprep.HepRepPoint;
7   import hep.graphics.heprep.HepRepType;
8   import hep.graphics.heprep.HepRepTypeTree;
9   import hep.physics.vec.Hep3Vector;
10  
11  import java.awt.Color;
12  import java.util.ArrayList;
13  import java.util.List;
14  
15  import org.lcsim.event.CalorimeterHit;
16  import org.lcsim.event.Cluster;
17  import org.lcsim.event.EventHeader;
18  import org.lcsim.event.ReconstructedParticle;
19  import org.lcsim.event.Track;
20  import org.lcsim.geometry.Detector;
21  import org.lcsim.util.swim.HelixSwimmer;
22  
23  /**
24   * This class converts an LCIO ReconstructedParticle to the HepRep format for
25   * display by Wired4.  Clusters and tracks from a RP are given the same randomly
26   * generated color.  Charged Tracks, Neutral Tracks, and Calorimeter Clusters are
27   * given their own sub-types, so that they can be easily switched on and off.
28   * 
29   * @author jeremym
30   */
31  class ReconstructedParticleConverterNew implements HepRepCollectionConverter
32  {
33      RandomColorMap rcolorMap;
34  
35      private static final double[] zero = { 0, 0, 0 };
36      
37      public ReconstructedParticleConverterNew()
38      {
39          rcolorMap = new RandomColorMap(50);
40      }
41  
42      public boolean canHandle(Class k)
43      {
44          return ReconstructedParticle.class.isAssignableFrom(k);
45      }
46      
47      public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree)
48      {               
49          rcolorMap.reset(collection.size());
50          
51          String pfoName = event.getMetaData(collection).getName();        
52          
53          // RP top-level type.
54          HepRepType rpType = factory.createHepRepType(typeTree, pfoName);
55          rpType.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER);
56          
57          // Neutral Tracks type.
58          HepRepType neutralTracksType = factory.createHepRepType(rpType, "NeutralTracks");
59          neutralTracksType.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER);
60          neutralTracksType.addAttValue("drawAs","Line");
61          /*neutralTracksType.addAttValue("LineStyle", "Dashed"); // Doesn't work.
62          neutralTracksType.addAttValue("color",Color.GREEN);*/
63          
64          // Charged Tracks type.
65          HepRepType chargedTracksType = factory.createHepRepType(rpType, "ChargedTracks");
66          chargedTracksType.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER);
67          chargedTracksType.addAttValue("drawAs","Line");
68          
69          // Clusters type.
70          HepRepType clustersType = factory.createHepRepType(rpType, "CalClusters");
71          clustersType.addAttValue("color",Color.RED);
72          clustersType.addAttValue("fill",true);
73          clustersType.addAttValue("fillColor",Color.RED);
74          clustersType.addAttValue("layer", LCSimHepRepConverter.HITS_LAYER);
75          
76          /*
77          clustersType.addAttValue("layer", LCSimHepRepConverter.HITS_LAYER);
78          clustersType.addAttValue("drawAs", "Point");
79          clustersType.addAttValue("MarkName", "Box");
80          clustersType.addAttDef("energy", "Hit Energy", "physics", "");
81          clustersType.addAttDef("cluster", "Cluster Energy", "physics", "");
82          */
83          
84          int rpCnt = 0;
85          for (ReconstructedParticle rp : (List<ReconstructedParticle>) collection)
86          {                      
87              // Get the color for this RP.
88              Color rpColor = rcolorMap.getColor(rpCnt % rcolorMap.size());
89              
90              List<Cluster> clusters = rp.getClusters();
91              List<Track> tracks = rp.getTracks();
92              
93              convertClusters(event, clusters, factory, typeTree, instanceTree, rpColor, clustersType);                                                                    
94              convertTracks(event, tracks, factory, typeTree, instanceTree, rpColor, chargedTracksType);
95              
96              if (rp.getCharge() == 0)
97              {
98                  convertNeutralParticle(event.getDetector(), rp, instanceTree, factory, neutralTracksType, rpColor);
99              }                      
100             
101             ++rpCnt;
102         }
103     }
104     
105     private void convertClusters(EventHeader event, List<Cluster> collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree, Color clusterColor, HepRepType type)
106     {       
107         List<CalorimeterHit> hits = new ArrayList<CalorimeterHit>();
108         
109         HepRepInstance instanceC = factory.createHepRepInstance(instanceTree, type);
110         
111         for (Cluster cluster : collection)
112         {
113             if (cluster.getCalorimeterHits().size() != 0) {
114                 hits.addAll(cluster.getCalorimeterHits());
115             }
116         }
117            
118         if (hits != null)
119         {
120             for (CalorimeterHit hit : hits)
121             {
122                 if (hit != null) {
123                     double[] pos = hit.getPosition();
124                     HepRepInstance instanceX = factory.createHepRepInstance(instanceC, type);
125                     instanceX.addAttValue("MarkSize", 5);
126                     instanceX.addAttValue("color", clusterColor);
127                     instanceX.addAttValue("showparentattributes", true);
128                     instanceX.addAttValue("pickparent", true);
129                     //HepRepPoint pp = 
130                     factory.createHepRepPoint(instanceX, pos[0], pos[1], pos[2]);
131                 }
132             }
133         }
134     }   
135 
136     private void convertTracks(EventHeader event, List<Track> collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree, Color trackColor, HepRepType type)
137     {   
138         if (collection.size() == 0)
139             return;
140         
141         Detector detector = event.getDetector();
142 
143         double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue();
144         double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
145 
146         double[] origin = TrackUtil.getOrigin(collection.get(0));
147         double[] field = detector.getFieldMap().getField(origin);
148         HelixSwimmer helix = TrackUtil.getHelixSwimmer(collection, field);
149      
150         for (Track t : (List<Track>) collection)
151         {                        
152             helix.setTrack(t);
153             double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax, trackingZMax);
154 
155             HepRepInstance instanceX = factory.createHepRepInstance(instanceTree, type);
156             instanceX.addAttValue("color", trackColor);
157 
158             double dAlpha = 10; // 1cm
159             for (int k = 0; k < 200; k++)
160             {
161                 double d = k * dAlpha;
162                 if (d > distanceToCylinder)
163                     break;
164                 Hep3Vector point = helix.getPointAtDistance(d);
165                 factory.createHepRepPoint(instanceX, point.x(), point.y(), point.z());
166             }
167         }
168     }
169     
170     // TODO: Connect to cluster center instead of swimming.
171     public void convertNeutralParticle(Detector detector, ReconstructedParticle p, HepRepInstanceTree tree, HepRepFactory factory, HepRepType type, Color rpColor)
172     {  
173         HepRepInstance instanceX = factory.createHepRepInstance(tree, type);
174         
175         double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue();
176         double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
177 
178         double[] field = detector.getFieldMap().getField(zero);
179         HelixSwimmer helix = new HelixSwimmer(field[2]);
180         
181         double charge = p.getCharge();
182         Hep3Vector start =  p.getReferencePoint();
183         Hep3Vector momentum = p.getMomentum();
184         helix.setTrack(momentum, start, (int) charge);
185         double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax,trackingZMax);
186         
187         Hep3Vector stop = helix.getPointAtDistance(distanceToCylinder);
188            
189         factory.createHepRepPoint(instanceX,start.x(),start.y(),start.z());
190         factory.createHepRepPoint(instanceX,stop.x(),stop.y(),stop.z());
191         instanceX.addAttValue("color", rpColor);
192         instanceX.addAttValue("momentum",p.getEnergy());
193         instanceX.addAttValue("type",p.getType());                   
194     }
195 }