File indexing completed on 2026-04-09 07:48:47
0001
0002
0003 import os, sys, argparse, logging
0004 import numpy as np, math
0005 from collections import OrderedDict as odict
0006
0007 log = logging.getLogger(__name__)
0008 sys.path.insert(0, os.path.expanduser("~"))
0009
0010 slist_ = lambda s:list(map(str.strip,filter(None,s.split("\n"))))
0011
0012 class GArgs(argparse.Namespace):
0013 @classmethod
0014 def Make(cls, args):
0015 """
0016 Didnt manage to inherit from Namespace in a way that could copy
0017 so workaround with this
0018 """
0019 gargs = cls()
0020 for k,v in vars(args).items():
0021 setattr(gargs, k, v)
0022 pass
0023 return gargs
0024
0025 def figpath(self, name):
0026 path = os.path.join(self.figdir, "%s%s.png" % (self.figpfx,name) )
0027 fdir = os.path.dirname(path)
0028 if not os.path.isdir(fdir):
0029 os.makedirs(fdir)
0030 pass
0031 return path
0032
0033 @classmethod
0034 def volname(cls, idx=0, pfx0="NNVTMCPPMT", pfx1="_PMT_20inch"):
0035 """
0036 """
0037 dlv = odict()
0038
0039 dlv[0] = "lMaskVirtual"
0040 dlv[1] = "lMask"
0041 dlv[2] = "_log"
0042 dlv[3] = "_body_log"
0043 dlv[4] = "_inner1_log"
0044 dlv[5] = "_inner2_log"
0045 dlv[6] = "lInnerWater"
0046
0047 return "%s%s%s" % (pfx0, pfx1, dlv[idx])
0048
0049 @classmethod
0050 def lvname(cls, idx):
0051 """
0052 When names change yet again, use to update these::
0053
0054 print("\n".join(g.volumes.keys()))
0055
0056 """
0057 lvxs = slist_(r"""
0058 PMT_3inch_log
0059 NNVTMCPPMT_log
0060 HamamatsuR12860_log
0061 """)
0062
0063 old_lvxs = slist_(r"""
0064 PMT_3inch_log
0065 NNVTMCPPMTlMaskVirtual
0066 HamamatsuR12860lMaskVirtual
0067 mask_PMT_20inch_vetolMaskVirtual
0068 NNVTMCPPMT_PMT_20inch_log
0069 HamamatsuR12860_PMT_20inch_body_log
0070 """)
0071 return lvxs[idx]
0072
0073 @classmethod
0074 def label(cls, idx):
0075 labels = slist_(r"""
0076 tds_ngt
0077 tds_ngt_pcnk
0078 tds_ngt_pcnk_sycg
0079 origin_CGDMLKludge_jun15
0080 origin_CGDMLKludge_jun28
0081 """)
0082 return labels[idx]
0083
0084 @classmethod
0085 def gdmlpath(cls, idx):
0086 label = cls.label(idx) if type(idx) is int else idx
0087 return "$OPTICKS_PREFIX/%s.gdml" % label
0088
0089 @classmethod
0090 def parse(cls, doc):
0091 parser = argparse.ArgumentParser(doc)
0092 parser.add_argument( "--path", default="$OPTICKS_PREFIX/tds.gdml")
0093
0094 defaults = {}
0095 defaults["lvx"] = cls.volname(2)
0096 defaults["maxdepth"] = -1
0097 defaults["xlim"] = "-330,330"
0098 defaults["ylim"] = "-460,200"
0099 defaults["size"] = "10,8"
0100 defaults["color"] = "r,g,b,c,y,m,k"
0101 defaults["figdir"] = "/tmp/fig"
0102 defaults["figpfx"] = "PolyconeNeck"
0103
0104 parser.add_argument( "--lvx", default=defaults["lvx"], help="LV name prefix" )
0105 parser.add_argument( "--maxdepth", type=int, default=defaults["maxdepth"], help="Maximum local depth of volumes to plot, 0 for just root, -1 for no limit" )
0106 parser.add_argument( "--xlim", default=defaults["xlim"], help="x limits : comma delimited string of two values" )
0107 parser.add_argument( "--ylim", default=defaults["ylim"], help="y limits : comma delimited string of two values" )
0108 parser.add_argument( "--size", default=defaults["size"], help="figure size in inches : comma delimited string of two values" )
0109 parser.add_argument( "--color", default=defaults["color"], help="comma delimited string of color strings" )
0110 parser.add_argument( "--figdir", default=defaults["figdir"], help="directory path in which to save PNG figures" )
0111 parser.add_argument( "--figpfx", default=defaults["figpfx"], help="prefix for PNG filename" )
0112
0113 args = parser.parse_args()
0114 fmt = '[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s'
0115 logging.basicConfig(level=logging.INFO, format=fmt)
0116
0117 fsplit_ = lambda s:map(float,s.split(","))
0118
0119
0120
0121 args.color = args.color.split(",")
0122
0123 pix = np.array([1280.,720.])
0124 dpi = 100.
0125 args.size = pix/dpi
0126
0127 ylim = np.array([-470,210])
0128 hy = (ylim[1]-ylim[0])/2
0129 xlim = np.array([-hy,hy])
0130
0131 args.xlim = xlim
0132 args.ylim = ylim
0133
0134 args.suptitle_fontsize = 25
0135
0136 return cls.Make(args)
0137
0138
0139 if __name__ == '__main__':
0140 args = GArgs.parse(__doc__)
0141 print(args)
0142
0143
0144
0145
0146