View Javadoc

1   package org.lcsim.geometry;
2   
3   import hep.graphics.heprep.HepRep;
4   import hep.graphics.heprep.HepRepFactory;
5   import hep.graphics.heprep.HepRepInstanceTree;
6   import hep.graphics.heprep.HepRepTreeID;
7   import hep.graphics.heprep.HepRepType;
8   import hep.graphics.heprep.HepRepTypeTree;
9   
10  import java.util.HashMap;
11  import java.util.Map;
12  
13  import org.jdom.Element;
14  import org.lcsim.geometry.Calorimeter.CalorimeterType;
15  import org.lcsim.geometry.compact.Field;
16  import org.lcsim.geometry.compact.Readout;
17  import org.lcsim.geometry.field.FieldOverlay;
18  import org.lcsim.geometry.util.BaseIDDecoder;
19  
20  /**
21   * @author tonyj
22   * @author jeremym
23   * 
24   * @version $Id: Detector.java,v 1.38 2011/03/11 19:22:20 jeremy Exp $
25   */
26  // FIXME Determine which methods should go here or on in compact Detector.
27  // FIXME Following convention in this package, shouldn't this just be an interface?
28  public class Detector extends org.lcsim.geometry.compact.Detector implements HepRepProvider
29  {
30      private FieldOverlay fieldOverlay = new FieldOverlay();
31      private Map< CalorimeterType, Calorimeter > calTypeMap = new HashMap< CalorimeterType, Calorimeter >();
32  
33      protected Detector( Element node )
34      {
35          super( node );
36      }
37  
38      public String getName()
39      {
40          // The name from the compact header.
41          return getDetectorName();
42      }
43  
44      public IDDecoder getDecoder( String readout )
45      {
46          Readout r = getReadouts().get( readout );
47          return ( r == null ) ? null : r.getIDDecoder();
48      }
49  
50      protected void addSubdetector( org.lcsim.geometry.compact.Subdetector sub )
51      {
52          super.addSubdetector( sub );
53          setupIDDecoder( sub );
54  
55          // Add Calorimeter to CalorimeterType map.
56          if ( sub.isCalorimeter() )
57          {
58              Calorimeter cal = ( Calorimeter ) sub;
59              if ( !cal.getCalorimeterType().equals( CalorimeterType.UNKNOWN ) )
60              {
61                  if ( calTypeMap.get( cal.getCalorimeterType() ) != null )
62                  {
63                      throw new RuntimeException( "Cannot add duplicate CalorimeterType <" + CalorimeterType
64                              .toString( cal.getCalorimeterType() ) + "> from subdetector <" + cal.getName() + ">." );
65                  }
66                  calTypeMap.put( cal.getCalorimeterType(), cal );
67              }
68          }
69      }
70  
71      /*
72       * FIXME There is not necessary a 1-to-1 between subdetectors and readouts as implied here. 
73       * FIXME This function is just a hack to setup the IDDecoder. There is probably
74       *       a better way to do it.
75       */
76      private void setupIDDecoder( org.lcsim.geometry.compact.Subdetector subdet )
77      {
78          if ( subdet.getReadout() != null )
79          {
80              BaseIDDecoder decoder = ( BaseIDDecoder ) subdet.getIDDecoder();
81  
82              if ( decoder != null )
83              {
84                  decoder.setSubdetector( subdet );
85              }
86          }
87      }
88  
89      protected void addReadout( Readout r )
90      {
91          super.addReadout( r );
92      }
93  
94      public FieldMap getFieldMap()
95      {
96          return fieldOverlay;
97      }
98  
99      protected void addField( Field field )
100     {
101         super.addField( ( Field ) field );
102         fieldOverlay.addField( ( FieldMap ) field );
103     }
104 
105     public Calorimeter getCalorimeterByType( CalorimeterType calType )
106     {
107         return calTypeMap.get( calType );
108     }
109 
110     public void appendHepRep( HepRepFactory factory, HepRep heprep )
111     {
112         HepRepTreeID treeID = factory.createHepRepTreeID( "DetectorType", "1.0" );
113         HepRepTypeTree typeTree = factory.createHepRepTypeTree( treeID );
114         heprep.addTypeTree( typeTree );
115 
116         HepRepInstanceTree instanceTree = factory.createHepRepInstanceTree( "Detector", "1.0", typeTree );
117         heprep.addInstanceTree( instanceTree );
118 
119         String detectorLayer = "Detector";
120         heprep.addLayer( detectorLayer );
121 
122         HepRepType barrel = factory.createHepRepType( typeTree, "Barrel" );
123         barrel.addAttValue( "layer", detectorLayer );
124         HepRepType endcap = factory.createHepRepType( typeTree, "Endcap" );
125         endcap.addAttValue( "layer", detectorLayer );
126 
127         for ( Object sub : getSubdetectors().values() )
128         {
129             if ( sub instanceof HepRepProvider )
130             {
131                 // Add Subdetector to HepRep scene but only if visible.
132                 if (((org.lcsim.geometry.compact.Subdetector)sub).getVisAttributes().isVisible())
133                 {
134                     ( ( HepRepProvider ) sub ).appendHepRep( factory, heprep );
135                 }
136                 // DEBUG
137                 //else
138                 //{
139                 //    System.out.println("skipped " + ((Subdetector)sub).getName());
140                 //}
141             }
142         }
143     }
144 
145 }