View Javadoc

1   package org.lcsim.material;
2   
3   import org.jdom.DataConversionException;
4   import org.jdom.JDOMException;
5   import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
6   import org.lcsim.geometry.compact.converter.lcdd.util.Constant;
7   
8   /**
9    *
10   * Convert a GDML material to org.lcsim.Material implementation class.
11   * @author jeremym
12   */
13  public class MaterialFromGDMLCnv
14  {
15      LCDD _lcdd;
16  
17      /** Creates a new instance of MaterialCnv */
18      public MaterialFromGDMLCnv(LCDD lcdd)
19      {
20          _lcdd = lcdd;
21          MaterialManager.instance();
22      }
23  
24      public MaterialFromGDMLCnv()
25      {
26          _lcdd = null;
27          MaterialManager.instance();
28      }
29  
30      public void setLCDD(LCDD lcdd)
31      {
32          _lcdd = lcdd;
33      }
34  
35      /**
36       * Make an org.lcsim.material.Material object from a GDML material tag.
37       * 
38       * Resolve references outside materials tag (e.g. within define tag) using the lcdd parameter (which is allowed to
39       * be null).
40       * 
41       */
42      public Material makeMaterial(org.jdom.Element materialNode, LCDD lcdd) throws JDOMException
43      {
44          //System.out.println("makeMaterial - " + materialNode.getName() + " : " + materialNode.getAttributeValue("name"));
45          MaterialManager mgr = MaterialManager.instance();
46  
47          _lcdd = lcdd;
48  
49          Material material = null;
50          String name = materialNode.getAttributeValue("name");
51          //String formula = materialNode.getAttributeValue("formula");
52          MaterialState state = MaterialState.fromString(materialNode.getAttributeValue("state"));
53  
54          double density;
55  
56          /// Allow the exception to propagate if D or Dref is not found.
57          density = getDensity(materialNode);
58  
59          MaterialDefinitionType mdt = MaterialDefinitionType.getMaterialDefinitionType(materialNode);
60  
61          if (mdt == MaterialDefinitionType.INVALID)
62          {
63              throw new RuntimeException("Material definition type was not valid.");
64          }
65  
66          String tagname = mdt.getTagName();
67          
68          // FIXME Is this needed?
69          /*
70           * if (mdt == MaterialDefinitionType.ATOM) { // System.out.println("atom def");
71           * 
72           * double A = materialNode.getChild(tagname).getAttribute("value").getDoubleValue(); double Z = 0; if
73           * (materialNode.getAttribute("Z") != null) { Z = materialNode.getAttribute("Z").getDoubleValue(); } else {
74           * throw new JDOMException("Required Z value missing for atom definition of material."); }
75           * 
76           * material = new Material(name, Z, A, density, state); } else {
77           */
78          // System.out.println("fraction or composite def");
79  
80          int nComponents = 0;
81  
82          // System.out.println("tagname: " + tagname);
83  
84          nComponents = materialNode.getChildren(tagname).size();
85  
86          // System.out.println("ncomp: " + nComponents);
87  
88          material = new Material(name, nComponents, density, state);
89  
90          /* Fill in composite. */
91          if (mdt == MaterialDefinitionType.COMPOSITE)
92          {
93              // System.out.println("composite def");
94  
95              for (Object o : materialNode.getChildren(tagname))
96              {
97                  org.jdom.Element compositeElement = (org.jdom.Element)o;
98                  int n = compositeElement.getAttribute("n").getIntValue();
99                  String elementName = compositeElement.getAttributeValue("ref");
100 
101                 MaterialElement me = mgr.getElement(elementName);
102 
103                 if (me != null)
104                 {
105                     material.addElement(me, n);
106                 }
107                 else
108                 {
109                     throw new RuntimeException("MaterialElement was not defined in MaterialManager: " + elementName);
110                 }
111             }
112         }
113         /* Fill in mass fraction. */
114         else
115         {
116             // System.out.println("fraction def");
117             for (Object o : materialNode.getChildren(tagname))
118             {
119                 org.jdom.Element fractionElement = (org.jdom.Element)o;
120 
121                 // System.out.println(tagname + " " + fractionElement.getAttributeValue("ref"));
122 
123                 String refName = fractionElement.getAttributeValue("ref");
124                 double f = fractionElement.getAttribute("n").getDoubleValue();
125 
126                 MaterialElement me = mgr.getElement(refName);
127 
128                 if (me != null)
129                 {
130                     // System.out.println("adding element: " + refName);
131                     material.addElement(me, f);
132                 }
133                 else
134                 {
135                     Material m = MaterialManager.instance().getMaterial(refName);
136 
137                     if (m != null)
138                     {
139                         material.addMaterial(m, f);
140                     }
141                     else
142                     {
143                         throw new JDOMException("fraction ref is undefined: " + refName);
144                     }
145                 }
146             }
147         }
148         // }
149 
150         // material.setFormula(formula);
151 
152         return material;
153     }
154 
155     /** Get density from D or Dref tag. */
156     public double getDensity(org.jdom.Element materialElement) throws JDOMException
157     {
158         return getValueFromAttributeOrRef(materialElement, "D", _lcdd);
159     }
160 
161     /** Get pressure from P of Pref tag. */
162     public double getPressure(org.jdom.Element materialElement) throws JDOMException
163     {
164         return getValueFromAttributeOrRef(materialElement, "P", _lcdd);
165     }
166 
167     /** Get temperature from T or Tref tag. */
168     public double getTemperature(org.jdom.Element materialElement) throws JDOMException
169     {
170         return getValueFromAttributeOrRef(materialElement, "T", _lcdd);
171     }
172 
173     public double getValueFromAttributeOrRef(org.jdom.Element materialElement, String tagname, LCDD lcdd) throws DataConversionException, JDOMException
174     {
175         boolean haveLCDD = (lcdd == null);
176 
177         org.jdom.Element tag = materialElement.getChild(tagname);
178 
179         double value = 0;
180 
181         /* FIXME: Use the unit attribute. */
182         if (tag != null)
183         {
184             if (tag.getAttribute("value") != null)
185             {
186                 value = tag.getAttribute("value").getDoubleValue();
187             }
188             else
189             {
190                 throw new JDOMException("Missing value attribute for " + tagname + " in material " + materialElement.getAttributeValue("name"));
191             }
192         }
193         else if (haveLCDD)
194         {
195             org.jdom.Element tagref = materialElement.getChild(tagname);
196 
197             if (tagref != null)
198             {
199                 String ref = tagref.getAttributeValue("ref");
200 
201                 Constant constant = lcdd.getDefine().getConstant(ref);
202 
203                 if (constant != null)
204                 {
205                     value = constant.getConstantValue();
206                 }
207                 else
208                 {
209                     throw new JDOMException(tagname + "ref's ref attribute does not refer to a defined constant: " + ref);
210                 }
211             }
212             else
213             {
214                 throw new JDOMException(tagname + " or " + tagname + "ref was not provided by the material: " + materialElement.getAttributeValue("name"));
215             }
216         }
217         else
218         {
219             throw new JDOMException("No LCDD object to resolve the " + tagname + "ref.");
220         }
221 
222         return value;
223     }
224 }