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
22
23
24
25
26
27
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
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
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
73
74
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
132 if (((org.lcsim.geometry.compact.Subdetector)sub).getVisAttributes().isVisible())
133 {
134 ( ( HepRepProvider ) sub ).appendHepRep( factory, heprep );
135 }
136
137
138
139
140
141 }
142 }
143 }
144
145 }