View Javadoc

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   * @author tonyj
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                  // Set slice region.
97                  setRegion(lcdd, slice, sliceVolume);
98                  
99                  // Set slice limits.
100                 setLimitSet(lcdd, slice, sliceVolume);
101                 
102                 // Set slice display.
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             // Set layer region.
115             setRegion(lcdd, layer, layerVolume);
116             
117             // Set layer limits.
118             setLimitSet(lcdd, layer, layerVolume);
119             
120             // Set layer display.
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 }