00001 from xml.dom.minidom import *
00002 import os
00003 import string
00004 import sys
00005 import glob
00006 import math
00007
00008
00009 CONFIGFILE = "configuration.xml"
00010
00011 outdir = "./data/"
00012
00013 soldir = ""
00014
00015 GENSOLID_ONCE = {}
00016 LOGFILE = open("log.txt",'w')
00017 LOGFILE.write("Logfile\n")
00018
00019 cmd = "rm -rf " + outdir
00020 os.system(cmd)
00021 os.mkdir(outdir)
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 def generic_solid(table,element,ns,postfix="",prefix="",docpost="[postfix]",docpre="[prefix],"):
00040 if GENSOLID_ONCE.has_key(table) == 0:
00041 GENSOLID_ONCE[table]=1
00042 f = open(outdir+soldir+table+".cdl",'w')
00043 s = "-- "
00044 if len(prefix):
00045 s = s + docpre
00046 for att in element.attributes.values():
00047 s = s + att.name + ','
00048 if len(postfix):
00049 s = s + docpost
00050 f.write(s[:-1]+"\n")
00051 f.close()
00052 file = open(outdir+soldir+table,'a')
00053 s=prefix
00054 for att in element.attributes.values():
00055 if att.name == "name":
00056 s = s + qname(att.value,ns) + ','
00057 else:
00058 s = s + unitc(att.value).__str__() + ','
00059 s = s + postfix
00060 file.write(s[:-1]+"\n")
00061
00062
00063 def examine_section(r,ns,kind):
00064
00065 if kind != "ZS,":
00066 return
00067 sections = r.getElementsByTagName("ZSection")
00068 z = []
00069 rmin = []
00070 rmax = []
00071 for s in sections:
00072 z.append(unitc(s.getAttribute("z")))
00073 rmin.append(unitc(s.getAttribute("rMin")))
00074 rmax.append(unitc(s.getAttribute("rMax")))
00075
00076
00077 xmin = z[0]
00078 for x in z:
00079 if x < xmin:
00080 LOGFILE.write(r.tagName + " " + qname(r.getAttribute("name"),ns) + " z values not z1 <= z2\n")
00081 xmin = x
00082 for i in range(0,len(rmin)):
00083 if rmin[i] == rmax[i]:
00084 LOGFILE.write(r.tagName + " " + qname(r.getAttribute("name"),ns) + " rmin = rmax\n")
00085 if (i != 0) and (i != (len(rmin)-1)):
00086 LOGFILE.write(" the one above might be a problem!\n")
00087 print r.tagName + " " + qname(r.getAttribute("name"),ns) + " rmin = rmax\n", i, range(0,len(rmin))
00088
00089 for i in range(0,len(rmin)):
00090 if rmin[i] > rmax[i]:
00091 LOGFILE.write(r.tagName + " " + qname(r.getAttribute("name"),ns) + " rmin > rmax\n")
00092
00093 zz = {}
00094 for i in range(0,len(rmin)):
00095 zz[z[i]] = 1
00096
00097 if i < len(rmin)-1:
00098 err = 0
00099 if z[i] == z[i+1]:
00100 if rmax[i+1] < rmin[i]:
00101 err = 1
00102 if rmin[i+1] > rmax[i]:
00103 err = 2
00104 if err>0:
00105 LOGFILE.write(r.tagName + " " + qname(r.getAttribute("name"),ns) + " discontinuity at " + i.__str__() + "\n")
00106 if len(zz) == 2:
00107
00108
00109 LOGFILE.write(r.tagName + " " + qname(r.getAttribute("name"),ns) + " simpler solid possible\n")
00110
00111 def poly_section_action(r,ns,kind):
00112 count = 0
00113 name = qname(r.getAttribute("name"),ns) + ","
00114 if r.tagName == "Polycone":
00115 name = name + ","
00116 else:
00117 name = "," + name
00118
00119 if kind=="ZS,":
00120 for i in r.getElementsByTagName("ZSection"):
00121 prefix = count.__str__() + ","
00122 generic_solid("ZSECTIONS.dat",i,ns,name,prefix,"polycone_solid_name,polyhedra_solid_name,","sequence_no,")
00123 count = count + 1
00124 else:
00125 for i in r.getElementsByTagName("RZPoint"):
00126 prefix = count.__str__() + ","
00127 generic_solid("RZPOINTS.dat",i,ns,name,prefix,"polycone_solid_name,polyhedra_solid_name,","sequence_no,")
00128 count = count + 1
00129
00130
00131 examine_section(r,ns,kind)
00132
00133 def boolean_components(r,ns):
00134 s = ""
00135 for c in r.getElementsByTagName("rSolid"):
00136 s = s + qname(c.getAttribute("name"),ns) + ","
00137 t = r.getElementsByTagName("Translation")
00138 if len(t) != 0:
00139 s = s + unitc(t[0].getAttribute("x")).__str__() + ","
00140 s = s + unitc(t[0].getAttribute("y")).__str__() + ","
00141 s = s + unitc(t[0].getAttribute("z")).__str__() + ","
00142 else:
00143 s = s + "0,0,0,"
00144 r = r.getElementsByTagName("rRotation")
00145 if len(r) != 0:
00146 s = s + qname(r[0].getAttribute("name"),ns) + ","
00147 else:
00148 s = s + "rotations:UNIT,"
00149 return s
00150
00151
00152
00153
00154
00155
00156 def box_action(r,s,ns):
00157 s = s + r.tagName +','
00158 generic_solid("BOXES.dat",r,ns)
00159 return s
00160
00161 def reflectionsolid_action(r,s,ns):
00162 s = s + r.tagName +','
00163 generic_solid("REFLECTIONSOLIDS.dat",r,ns)
00164 return s
00165
00166 def shapelesssolid_action(r,s,ns):
00167 s = s + r.tagName +','
00168 generic_solid("SHAPELESSSOLIDS.dat",r,ns)
00169 return s
00170
00171 def tubs_action(r,s,ns):
00172 s = s + r.tagName +','
00173 generic_solid("TUBESECTIONS.dat",r,ns)
00174 return s
00175
00176 def tube_action(r,s,ns):
00177 s = s + r.tagName +','
00178 generic_solid("TUBES.dat",r,ns)
00179 return s
00180
00181 def trd1_action(r,s,ns):
00182 s = s + r.tagName +','
00183 generic_solid("TRD1S.dat",r,ns)
00184 return s
00185
00186 def polyhedra_action(r,s,ns):
00187 kind = "RZ"
00188 if len(r.getElementsByTagName("ZSection"))>0:
00189 kind = "ZS,"
00190 poly_section_action(r,ns,kind)
00191 s = s + r.tagName +','
00192 generic_solid("POLYHEDRAS.dat",r,ns,kind,"","RZ_or_ZS,")
00193 return s
00194
00195 def polycone_action(r,s,ns):
00196 kind = "RZ"
00197 if len(r.getElementsByTagName("ZSection"))>0:
00198 kind = "ZS,"
00199 poly_section_action(r,ns,kind)
00200 generic_solid("POLYCONES.dat",r,ns,kind,"","RZ_or_ZS,")
00201 s = s + r.tagName +','
00202 return s
00203
00204 def cone_action(r,s,ns):
00205 s = s + r.tagName +','
00206 generic_solid("CONES.dat",r,ns)
00207 return s
00208
00209 def pseudotrap_action(r,s,ns):
00210 s = s + r.tagName +','
00211 generic_solid("PSEUDOTRAPEZOIDS.dat",r,ns)
00212 return s
00213
00214 def trapezoid_action(r,s,ns):
00215 s = s + r.tagName +','
00216 generic_solid("TRAPEZOIDS.dat",r,ns)
00217 return s
00218
00219 def intersectionsolid_action(r,s,ns):
00220 s = s + r.tagName +','
00221 comp = boolean_components(r,ns)
00222 generic_solid("BOOLEANSOLIDS.dat",r,ns,"I,"+comp,"","operation,solidA,solidB,x,y,z,rot")
00223 return s
00224
00225 def unionsolid_action(r,s,ns):
00226 s = s + r.tagName +','
00227 comp = boolean_components(r,ns)
00228 generic_solid("BOOLDEANSOLIDS.dat",r,ns,"U,"+comp,"","operation,solidA,solidB,x,y,z,rot")
00229 return s
00230
00231 def subtractionsolid_action(r,s,ns):
00232 s = s + r.tagName +','
00233 comp = boolean_components(r,ns)
00234 generic_solid("BOOLEANSOLIDS.dat",r,ns,"S,"+comp,"","operation,solidA,solidB,x,y,z,rot")
00235 return s
00236
00237
00238 CATEGORIES = {}
00239 SOLIDTYPES = {
00240 'SubtractionSolid':subtractionsolid_action,
00241 'UnionSolid':unionsolid_action,
00242 'IntersectionSolid':intersectionsolid_action,
00243 'Trapezoid':trapezoid_action,
00244 'PseudoTrap':pseudotrap_action,
00245 'Cone':cone_action,
00246 'Polycone':polycone_action,
00247 'Polyhedra':polyhedra_action,
00248 'Trd1':trd1_action,
00249 'Tube':tube_action,
00250 'Tubs':tubs_action,
00251 'ShapelessSolid':shapelesssolid_action,
00252 'ReflectionSolid':reflectionsolid_action,
00253 'Box':box_action,
00254 }
00255
00256 rad_to_deg = math.pi/180.
00257 UNITS = { u'deg':rad_to_deg,
00258 u'fm':1e-12,
00259 u'nm':1e-9,
00260 u'mum':1e-3,
00261 u'mm':1.,
00262 u'cm':10.,
00263 u'm':1000.,
00264 u'rad':1,
00265 u'g/cm3':1,
00266 u'mg/cm3':0.001,
00267 u'g/mole':1.,
00268 u'mg/mole':0.001
00269 }
00270
00271 PPCOUNT = [ 0 ]
00272
00273
00274 def unitc(s):
00275 try:
00276 s = string.strip(s)
00277 x = string.split(s,'*')
00278 if len(x) == 1:
00279 return s
00280 if len(x) == 2:
00281 return string.atof(x[0])*UNITS[x[1]]
00282 except:
00283 print "ERROR IN unitc: >" + s + "<"
00284 print x
00285 print UNITS[x[1]]
00286
00287 def get_docs(config):
00288 result = []
00289 print CONFIGFILE
00290 doc = xml.dom.minidom.parse(open(CONFIGFILE,'r'))
00291 file_elements = doc.getElementsByTagName("File")
00292 print `file_elements`
00293 for file_element in file_elements:
00294 file_name = file_element.getAttribute("name")
00295 url_name = file_element.getAttribute("url")
00296 print url_name + file_name
00297 path = url_name+file_name
00298 ns = string.split(path,'/')[-1][:-4]
00299 result.append([url_name+file_name,ns])
00300 return result
00301
00302
00303
00304
00305
00306 def rot_action(r,s,ns):
00307
00308 if r.tagName=="ReflectionRotation":
00309 s = s + "1,"
00310 else:
00311 s = s + "0,"
00312 return s
00313
00314
00315 def qname(s,ns):
00316 if string.find(s,':') == -1:
00317 s = ns +':' + s
00318 return s
00319
00320 def comp_action(e,s,ns):
00321 file = open(outdir+"MATERIALFRACTIONS.dat",'a')
00322 fracs = e.getElementsByTagName("MaterialFraction")
00323 for frac in fracs:
00324 fm = frac.getAttribute("fraction")
00325 mat = qname(frac.getElementsByTagName("rMaterial")[0].getAttribute("name"),ns)
00326 result = "" + qname(e.getAttribute("name"),ns) + ',' + mat + ',' + fm + "\n"
00327 file.write(result)
00328 return s
00329
00330 def log_action(logp,s,ns):
00331
00332 name_cat = string.split(s,',')
00333 CATEGORIES[name_cat[1]] =''
00334
00335 nodelist = logp.childNodes
00336 l = nodelist.length
00337 mat =""
00338 sol =""
00339 for i in range(0,l-1):
00340 if string.find(nodelist[i].nodeName,"Ma") != -1:
00341 mat = qname(nodelist[i].getAttribute("name"),ns)
00342 if string.find(nodelist[i].nodeName,"So") != -1:
00343 sol = qname(nodelist[i].getAttribute("name"),ns)
00344 result = name_cat[0] + ',' + sol + ',' + mat + ',' + name_cat[1] + ','
00345 return result
00346
00347 def pos_action(posp,s,ns):
00348 PPCOUNT[0] = PPCOUNT[0] + 1
00349 nodelist = posp.childNodes
00350 l = nodelist.length
00351 parent = ""
00352 child = ""
00353 tra = []
00354 rot = ""
00355 for i in range(0,l-1):
00356 nn = nodelist[i].nodeName
00357 if string.find(nn,'Pa') != -1:
00358 parent = qname(nodelist[i].getAttribute("name"),ns)
00359 if string.find(nn,'Child') != -1:
00360 child = qname(nodelist[i].getAttribute("name"),ns)
00361 if string.find(nn,'Tra') != -1:
00362 tra.append(unitc(nodelist[i].getAttribute("x")))
00363 tra.append(unitc(nodelist[i].getAttribute("y")))
00364 tra.append(unitc(nodelist[i].getAttribute("z")))
00365 if string.find(nn,'Rot') != -1:
00366 rot = qname(nodelist[i].getAttribute("name"),ns)
00367 result = PPCOUNT[0].__str__() + ',' + s
00368 if len(tra) != 0:
00369 result = result + tra[0].__str__() + ',' + tra[1].__str__() + ',' + tra[2].__str__() + ','
00370 else:
00371 result = result + ",,,"
00372 result = result + rot + ',' + parent + ',' + child + ','
00373 return result
00374
00375 docs_ns = get_docs("configuration.xml")
00376 print `docs_ns`
00377 for doc in docs_ns:
00378 document_path = doc[0]
00379 namespace = doc[1]
00380 print "Processing document: " + doc[0] + " ns=" + doc[1]
00381 doc = xml.dom.minidom.parse(open(doc[0],'r'));
00382
00383
00384
00385
00386 table = [
00387 [ 'MATERIALS.dat', ['ElementaryMaterial', 'CompositeMaterial'] ,
00388 [':name','density'] ,0 ],
00389
00390 [ 'ELEMENTARYMATERIALS.dat', ['ElementaryMaterial'],
00391 [':name', ';atomicNumber', 'atomicWeight', ';symbol' ], 0 ],
00392
00393 [ 'COMPOSITEMATERIALS.dat', ['CompositeMaterial'],
00394 [':name',';method' ], comp_action ],
00395
00396 [ 'ROTATIONS.dat', ['Rotation', 'ReflectionRotation'],
00397 [':name', 'thetaX', 'phiX', 'thetaY', 'phiY', 'thetaZ', 'phiZ'], rot_action ],
00398
00399 [ 'LOGICALPARTS.dat', ['LogicalPart'],
00400 [':name', ';category', 'itemid' ], log_action ],
00401
00402 [ 'POSPARTS.dat', ['PosPart'],
00403 ['copyNumber'], pos_action ],
00404
00405 [ 'SOLIDS.dat', SOLIDTYPES.keys(),
00406 [':name'], SOLIDTYPES.values() ]
00407
00408 ]
00409
00410 for i in table:
00411 tablename = i[0]
00412 filename=outdir+tablename
00413 file = open(outdir+tablename,'a')
00414 elements = i[1]
00415 attributes = i[2]
00416 action = i[3]
00417 elCount = -1
00418 for el in elements:
00419 elCount = elCount + 1
00420 els = doc.getElementsByTagName(el)
00421 for e in els:
00422 s = ""
00423 for at in attributes:
00424 flagQ = 0
00425 flagU = 0
00426 if at[0]==':':
00427 flagQ = 1
00428 at = at[1:]
00429 if at[0]==';':
00430 flagU = 1
00431 at = at[1:]
00432 attr = e.getAttribute(at)
00433 if flagQ == 1:
00434 attr = qname(attr,namespace)
00435 else:
00436 if flagU == 0:
00437 attr = unitc(attr)
00438 else:
00439 if attr == " ":
00440 attr = "0"
00441 s = s + attr.__str__() + ","
00442 if action != 0:
00443 le=0
00444 try:
00445 le=len(action)
00446 except TypeError:
00447 s = action(e,s,namespace)
00448 else:
00449 s = action[elCount](e,s,namespace)
00450
00451 file.write(s[:len(s)-1]+"\n")
00452 file.close()
00453
00454 file = open(outdir+"CATEGORIES.dat",'w')
00455 for i in CATEGORIES.keys():
00456 file.write(i+"\n")
00457 file.close()
00458
00459 LOGFILE.close()