Back to home page

EIC code displayed by LXR

 
 

    


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

0001 #!/usr/bin/env python
0002 """
0003 CSGScanTest.py
0004 ==============
0005 
0006 ::
0007 
0008     ~/o/CSG/tests/CSGScanTest.sh grab
0009     ~/o/CSG/tests/CSGScanTest.sh ana
0010 
0011 
0012 """
0013 import os
0014 import numpy as np
0015 from glob import glob
0016 from opticks.ana.fold import Fold
0017 
0018 
0019 try:
0020     import matplotlib.pyplot as plt 
0021 except ImportError:
0022     plt = None
0023 pass
0024 
0025 try:
0026     import pyvista as pv
0027 except ImportError:
0028     pv = None
0029 pass
0030 
0031 def plot3d(pos, grid=False):
0032     """
0033     https://docs.pyvista.org/plotting/plotting.html
0034 
0035     q:close
0036     v:isometric camera
0037     +/-: increase/decrease point size
0038     """
0039     pl = pv.Plotter()
0040     pl.add_points(pos, color='#FFFFFF', point_size=2.0 )  
0041     if grid:
0042         pl.show_grid()
0043     pass
0044     cp = pl.show()
0045     return cp
0046 
0047 
0048 def plot3d_arrows(pos, nrm, mag=1, grid=False):
0049     """
0050     """
0051     pl = pv.Plotter()
0052     pl.add_arrows(pos, nrm, mag=mag, color='#FFFFFF', point_size=2.0 )  
0053     if grid:
0054         pl.show_grid()
0055     pass
0056     cp = pl.show()
0057     return cp
0058 
0059 
0060 class CSGScanTest(object):
0061     def __init__(self, a, symbol="a" ):
0062 
0063         ori = a[:,0] ; valid_isect = a[:,0,3].view(np.int32)  
0064         dir = a[:,1]
0065         post = a[:,2]
0066         isect = a[:,3]
0067 
0068         tot = len(a)
0069         hit = np.count_nonzero( valid_isect == 1 )  
0070         miss = np.count_nonzero( valid_isect == 0 )  
0071 
0072         self.symbol = symbol  
0073         self.a = a
0074 
0075         self.ori = ori    ; self.valid_isect = valid_isect
0076         self.dir = dir
0077         self.post = post
0078         self.isect = isect
0079 
0080         self.tot = tot 
0081         self.hit = hit 
0082         self.miss = miss
0083 
0084     def __repr__(self):
0085         return "%s : tot %d hit %d miss %d " % (self.symbol, self.tot, self.hit, self.miss)
0086  
0087 
0088 def plot2d(st):
0089     plt.ion()
0090     fig, axs = plt.subplots(1)
0091     if not type(axs) is np.ndarray: axs = [axs] 
0092 
0093     ax = axs[0]
0094     ax.set_aspect('equal')
0095     ax.scatter( st.post[:,0], st.post[:,2], s=0.1 )
0096     ax.scatter( st.ori[:,0],  st.ori[:,2] )
0097     scale = 10.
0098     ax.scatter( st.ori[:,0] + st.dir[:,0]*scale, st.ori[:,2]+st.dir[:,2]*scale )
0099     fig.show()
0100 
0101 if __name__ == '__main__':
0102     f = Fold.Load("$FOLD", symbol="f")
0103     print(repr(f))
0104 
0105     a = f.h.tt
0106     b = f.d.tt
0107 
0108     a_ = CSGScanTest(a, symbol="f.h.tt")
0109     print(a_)
0110 
0111     b_ = CSGScanTest(b, symbol="f.d.tt")
0112     print(b_)
0113 
0114     plot3d( a_.post[:,:3] )   # intersect position 
0115     plot3d( b_.post[:,:3] )   # intersect position 
0116 
0117     ##plot2d( st );
0118     ##plot3d_arrows( st.post[:,:3], st.isect[:,:3], mag=10 )  # intersect position and normal direction arrows
0119 
0120