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.HepRepType;
6   import hep.graphics.heprep.HepRepTypeTree;
7   import hep.graphics.heprep.HepRepInstanceTree;
8   import hep.physics.vec.Hep3Vector;
9   import java.awt.Color;
10  import java.util.List;
11  import org.lcsim.event.EventHeader;
12  import org.lcsim.event.EventHeader.LCMetaData;
13  import org.lcsim.event.ReconstructedParticle;
14  import org.lcsim.geometry.Detector;
15  import org.lcsim.util.swim.HelixSwimmer;
16  
17  
18  /**
19   * @author tonyj
20   * @version $Id: ReconstructedParticleConverter.java,v 1.5 2007/08/24 20:09:46 jeremy Exp $
21   */
22  class ReconstructedParticleConverter implements HepRepCollectionConverter
23  {
24     private static final double[] IP = { 0,0,0 };
25     private Color[] colors;
26     private double zField;
27     private HelixSwimmer helix;
28     private double trackingRMax;
29     private double trackingZMax;
30     
31     ReconstructedParticleConverter()
32     {
33        ColorMap cm = new RainbowColorMap();
34        colors = new Color[10];
35        for (int i=0; i<colors.length; i++) colors[i] = cm.getColor(((double) i)/colors.length,1);
36     }
37     public boolean canHandle(Class k)
38     {
39        return ReconstructedParticle.class.isAssignableFrom(k);
40     }
41     public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree)
42     {
43        LCMetaData meta = event.getMetaData(collection);
44        String name = meta.getName();
45        int flags = meta.getFlags();
46        
47        try {
48      	  event.getDetector();
49        }
50        catch (Exception x)
51        {
52      	  return;
53        }
54        
55        Detector detector = event.getDetector();
56        
57        trackingRMax = detector.getConstants().get("tracking_region_radius").getValue();
58        trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
59        
60        zField = detector.getFieldMap().getField(IP)[2];
61        helix = new HelixSwimmer(zField);
62        
63        HepRepType typeX = factory.createHepRepType(typeTree, name);
64        typeX.addAttValue("layer",LCSimHepRepConverter.PARTICLES_LAYER);
65        typeX.addAttValue("drawAs","Line");
66        typeX.addAttValue("width",2);
67        typeX.addAttDef("momentum","Particle Momentum", "physics", "");
68        typeX.addAttDef("type","Particle Type", "physics", "");
69        
70        boolean jets = name.toLowerCase().contains("jets");
71        if (jets)
72        {
73           HepRepType jetTypeX = factory.createHepRepType(typeX, name+"Particles");
74           jetTypeX.addAttValue("layer",LCSimHepRepConverter.PARTICLES_LAYER);
75           jetTypeX.addAttValue("drawAs","Line");
76           jetTypeX.addAttDef("momentum","Particle Momentum", "physics", "");
77           jetTypeX.addAttDef("type","Particle Type", "physics", "");
78           
79           int i = 0;
80           for (ReconstructedParticle jet : (List<ReconstructedParticle>) collection)
81           {
82              Color jetColor = colors[i%colors.length];
83              i += 3;
84              
85              HepRepInstance instanceX = factory.createHepRepInstance(instanceTree, typeX);
86              instanceX.addAttValue("color",jetColor);
87              drawParticle(factory, jet,instanceX, 0);
88              
89              for (ReconstructedParticle p : jet.getParticles())
90              {
91                 HepRepInstance jetParticleX = factory.createHepRepInstance(instanceX, jetTypeX);
92                 jetParticleX.addAttValue("color",jetColor);
93                 drawParticle(factory, p, jetParticleX, p.getCharge());
94              }
95           }
96        }
97        else
98        {
99           HepRepType neutralType = factory.createHepRepType(typeX, "Neutral");
100          neutralType.addAttValue("color",Color.GREEN);
101          
102          HepRepType chargedType = factory.createHepRepType(typeX, "Charged");
103          chargedType.addAttValue("color",Color.ORANGE);
104          
105          HepRepInstance charged = factory.createHepRepInstance(instanceTree, typeX);
106          HepRepInstance neutral = factory.createHepRepInstance(instanceTree, typeX);
107          
108          for (ReconstructedParticle p : (List<ReconstructedParticle>) collection)
109          {
110             double charge = p.getCharge();
111             HepRepInstance instanceX = factory.createHepRepInstance(charge == 0 ? neutral : charged, charge == 0 ? neutralType : chargedType);
112             drawParticle(factory, p, instanceX, charge);
113          }
114       }
115       
116       
117    }
118    private void drawParticle(HepRepFactory factory, ReconstructedParticle p, HepRepInstance instanceX, double charge)
119    {
120       Hep3Vector start =  p.getReferencePoint();
121       Hep3Vector momentum = p.getMomentum();
122       helix.setTrack(momentum, start, (int) charge);
123       double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax,trackingZMax);
124       
125       if (charge == 0 || zField == 0)
126       {
127          Hep3Vector stop = helix.getPointAtDistance(distanceToCylinder);
128          
129          factory.createHepRepPoint(instanceX,start.x(),start.y(),start.z());
130          factory.createHepRepPoint(instanceX,stop.x(),stop.y(),stop.z());
131          instanceX.addAttValue("momentum",p.getEnergy());
132          instanceX.addAttValue("type",p.getType());
133       }
134       else
135       {
136          double dAlpha = 10; // 1cm
137          
138          instanceX.addAttValue("momentum",p.getEnergy());
139          instanceX.addAttValue("type",p.getType());
140          factory.createHepRepPoint(instanceX,start.x(),start.y(),start.z());
141          
142          for (int k = 1;k<200;k++)
143          {
144             double d = k*dAlpha;
145             if (d>distanceToCylinder) break;
146             Hep3Vector point = helix.getPointAtDistance(d);
147             factory.createHepRepPoint(instanceX,point.x(),point.y(),point.z());
148          }
149       }
150    }
151 }