Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:48:47

0001 #!/usr/bin/env python
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("~"))  # assumes $HOME/opticks 
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"  # 660
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         #args.xlim = fsplit_(args.xlim)
0119         #args.ylim = fsplit_(args.ylim)
0120         #args.size = fsplit_(args.size)
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