1 package org.lcsim.geometry.compact.converter.lcdd;
2
3 import java.util.Iterator;
4 import org.jdom.Attribute;
5 import org.jdom.Element;
6 import org.jdom.JDOMException;
7 import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
8 import org.lcsim.geometry.compact.converter.lcdd.util.Material;
9 import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol;
10 import org.lcsim.geometry.compact.converter.lcdd.util.Rotation;
11 import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
12 import org.lcsim.geometry.compact.converter.lcdd.util.Solids;
13 import org.lcsim.geometry.compact.converter.lcdd.util.Structure;
14 import org.lcsim.geometry.compact.converter.lcdd.util.Tube;
15 import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
16
17
18
19
20
21 class DiskTracker extends LCDDSubdetector
22 {
23 DiskTracker(Element node) throws JDOMException
24 {
25 super(node);
26 }
27
28 public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException
29 {
30 int id = -1;
31 if (node.getAttribute("id") != null)
32 id = node.getAttribute("id").getIntValue();
33 String detectorName = node.getAttributeValue("name");
34 boolean reflect = node.getAttribute("reflect").getBooleanValue();
35
36 Material air = lcdd.getMaterial("Air");
37 Rotation reflection = lcdd.getDefine().getRotation("reflect_rot");
38 Solids solids = lcdd.getSolids();
39 Structure structure = lcdd.getStructure();
40
41 Volume trackingVolume = lcdd.pickMotherVolume(this);
42
43 int n = 0;
44 for (Iterator i = node.getChildren("layer").iterator(); i.hasNext(); n++)
45 {
46 Element layer = (Element) i.next();
47 String layerName = detectorName+"_layer"+n;
48 Tube tube1 = new Tube(layerName);
49 Volume layerVolume = new Volume(layerName+"_volume");
50 layerVolume.setMaterial(air);
51 layerVolume.setSolid(tube1);
52
53 int m = 0;
54 double zmin = layer.getAttribute("inner_z").getDoubleValue();
55 double rmin = layer.getAttribute("inner_r").getDoubleValue();
56 double rmax = layer.getAttribute("outer_r").getDoubleValue();
57 double z = zmin;
58
59 double layerWidth = 0;
60 for (Iterator j = layer.getChildren("slice").iterator(); j.hasNext();)
61 {
62 Element slice = (Element) j.next();
63 double w;
64 if ( slice.getAttribute("thickness") != null )
65 {
66 w = slice.getAttribute("thickness").getDoubleValue();
67 }
68 else
69 {
70 throw new JDOMException("Disk Tracker " + detectorName +
71 " is missing required thickness attribute in layer #" + n + " .");
72 }
73 layerWidth += w;
74 }
75
76 for (Iterator j = layer.getChildren("slice").iterator(); j.hasNext(); m++)
77 {
78 Element slice = (Element) j.next();
79 double w = slice.getAttribute("thickness").getDoubleValue();
80 Attribute s = slice.getAttribute("sensitive");
81 boolean sensitive = s != null && s.getBooleanValue();
82
83 String sliceName = detectorName+"_layer"+n+"_slice"+m;
84 Tube tube = new Tube(sliceName);
85 tube.setZ(w);
86 tube.setRMin(rmin);
87 tube.setRMax(rmax);
88 tube.setDeltaPhi(Math.PI*2);
89 solids.addSolid(tube);
90
91 Volume sliceVolume = new Volume(sliceName+"_volume");
92 sliceVolume.setMaterial(lcdd.getMaterial(slice.getAttributeValue("material")));
93 sliceVolume.setSolid(tube);
94 if (sensitive) sliceVolume.setSensitiveDetector(sens);
95
96
97 setRegion(lcdd, slice, sliceVolume);
98
99
100 setLimitSet(lcdd, slice, sliceVolume);
101
102
103 setVisAttributes(lcdd, slice, sliceVolume);
104
105 PhysVol physvol = new PhysVol(sliceVolume);
106 physvol.setZ(z-zmin -layerWidth/2 + w/2);
107 physvol.addPhysVolID("layer",n);
108 layerVolume.addPhysVol(physvol);
109 structure.addVolume(sliceVolume);
110
111 z += w;
112 }
113
114
115 setRegion(lcdd, layer, layerVolume);
116
117
118 setLimitSet(lcdd, layer, layerVolume);
119
120
121 setVisAttributes(lcdd, layer, layerVolume);
122
123 tube1.setZ(layerWidth);
124 tube1.setRMin(rmin);
125 tube1.setRMax(rmax);
126 tube1.setDeltaPhi(Math.PI*2);
127
128 PhysVol physvol = new PhysVol(layerVolume);
129 physvol.setZ(zmin+layerWidth/2);
130 physvol.addPhysVolID("system",id);
131 physvol.addPhysVolID("barrel",1);
132 trackingVolume.addPhysVol(physvol);
133
134 if (reflect)
135 {
136 PhysVol physvol2 = new PhysVol(layerVolume);
137 physvol2.setZ(-zmin-layerWidth/2);
138 physvol2.setRotation(reflection);
139 physvol2.addPhysVolID("system",id);
140 physvol2.addPhysVolID("barrel",2);
141 trackingVolume.addPhysVol(physvol2);
142 }
143 solids.addContent(tube1);
144 structure.addContent(layerVolume);
145 }
146
147 setCombineHits(node, sens);
148 }
149
150 public boolean isTracker()
151 {
152 return true;
153 }
154 }