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
11
12
13 public class MaterialFromGDMLCnv
14 {
15 LCDD _lcdd;
16
17
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
37
38
39
40
41
42 public Material makeMaterial(org.jdom.Element materialNode, LCDD lcdd) throws JDOMException
43 {
44
45 MaterialManager mgr = MaterialManager.instance();
46
47 _lcdd = lcdd;
48
49 Material material = null;
50 String name = materialNode.getAttributeValue("name");
51
52 MaterialState state = MaterialState.fromString(materialNode.getAttributeValue("state"));
53
54 double density;
55
56
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
69
70
71
72
73
74
75
76
77
78
79
80 int nComponents = 0;
81
82
83
84 nComponents = materialNode.getChildren(tagname).size();
85
86
87
88 material = new Material(name, nComponents, density, state);
89
90
91 if (mdt == MaterialDefinitionType.COMPOSITE)
92 {
93
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
114 else
115 {
116
117 for (Object o : materialNode.getChildren(tagname))
118 {
119 org.jdom.Element fractionElement = (org.jdom.Element)o;
120
121
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
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
151
152 return material;
153 }
154
155
156 public double getDensity(org.jdom.Element materialElement) throws JDOMException
157 {
158 return getValueFromAttributeOrRef(materialElement, "D", _lcdd);
159 }
160
161
162 public double getPressure(org.jdom.Element materialElement) throws JDOMException
163 {
164 return getValueFromAttributeOrRef(materialElement, "P", _lcdd);
165 }
166
167
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
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 }