Ejemplo n.º 1
0
 def __init__(self, scene=None, source=None, throws=1, steps=50, seed=None, use_visualiser=True, show_log=True, background=(0.957, 0.957, 1), ambient=0.5):
     super(Tracer, self).__init__()
     self.scene = scene
     from LightSources import SimpleSource, PlanarSource, CylindricalSource, PointSource, RadialSource
     self.source = source
     self.throws = throws
     self.steps = steps
     self.totalsteps = 0
     self.seed = seed
     self.killed = 0
     self.database = PhotonDatabase.PhotonDatabase()
     self.stats = dict()
     self.show_log = show_log
     np.random.seed(self.seed)
     if not use_visualiser:
         Visualiser.VISUALISER_ON = False
     else:
         Visualiser.VISUALISER_ON = True
     self.visualiser = Visualiser(background=background, ambient=ambient)
     
     for obj in scene.objects:
         if obj != scene.bounds:
             if not isinstance(obj.shape, CSGadd) and not isinstance(obj.shape, CSGint) and not isinstance(obj.shape, CSGsub):
             
                 if isinstance(obj.material, SimpleMaterial):
                     wavelength = obj.material.bandgap
                 else:
                     
                     if not hasattr(obj.material, 'all_absorption_coefficients'):
                         maxindex = obj.material.emission_data.y.argmax()
                         wavelength = obj.material.emission_data.x[maxindex]
                         colour = wav2RGB(wavelength)
                     else:
                         # It is possible to processes the most likley colour of a spectrum in a better way than this!
                         colour = [0.1,0.1,0.1]
                     
                     if colour[0] == np.nan or colour[1] == np.nan or colour[2] == np.nan:
                         colour = [0.1,0.1,0.1]
                     
                     self.visualiser.addObject(obj.shape, colour=colour)
                     
     self.show_lines = True#False
     self.show_exit = True
     self.show_path = True#False
     self.show_start = True
Ejemplo n.º 2
0
    def __init__(self,
                 scene=None,
                 source=None,
                 throws=1,
                 steps=50,
                 seed=None,
                 use_visualiser=True,
                 show_log=False,
                 background=(0.957, 0.957, 1),
                 ambient=0.5,
                 database_file="pvtracedb.sql"):
        super(Tracer, self).__init__()
        self.scene = scene
        from LightSources import SimpleSource, PlanarSource, CylindricalSource, PointSource, RadialSource
        self.source = source
        self.throws = throws
        self.steps = steps
        self.totalsteps = 0
        self.seed = seed
        self.killed = 0
        self.database = PhotonDatabase.PhotonDatabase(database_file)
        self.stats = dict()
        self.show_log = show_log
        np.random.seed(self.seed)
        if not use_visualiser:
            Visualiser.VISUALISER_ON = False
        else:
            Visualiser.VISUALISER_ON = True

        self.visualiser = Visualiser(background=background, ambient=ambient)

        # This should not happen here in the tracer... refactor this non-sense
        if VISUAL_INSTALLED:
            for obj in scene.objects:
                if obj != scene.bounds:
                    if not isinstance(obj.shape, CSGadd) and not isinstance(
                            obj.shape, CSGint) and not isinstance(
                                obj.shape, CSGsub):

                        #import pdb; pdb.set_trace()
                        if isinstance(obj, RayBin):
                            #checkerboard = ( (0,0.01,0,0.01), (0.01,0,0.01,0), (0,0.01,0,1), (0.01,0,0.01,0) )
                            #checkerboard = ( (0,1,0,1), (1,0,1,0), (0,1,0,1), (1,0,1,0) )
                            #material = visual.materials.texture(data=checkerboard, mapping="rectangular", interpolate=False)
                            material = visual.materials.wood
                            colour = visual.color.blue
                            opacity = 1.

                        elif isinstance(obj, Coating):

                            colour = visual.color.white
                            opacity = 0.5
                            material = visual.materials.plastic

                            if hasattr(obj.reflectivity, 'lambertian'):
                                if obj.reflectivity.lambertian is True:
                                    # The material is a diffuse reflector
                                    colour = visual.color.white
                                    opacity = 1.
                                    material = visual.materials.plastic

                        elif isinstance(obj.material, SimpleMaterial):
                            #import pdb; pdb.set_trace()
                            wavelength = obj.material.bandgap
                            colour = norm(wav2RGB(wavelength))
                            opacity = 0.5
                            material = visual.materials.plastic
                        else:

                            if not hasattr(obj.material,
                                           'all_absorption_coefficients'):
                                try:
                                    maxindex = obj.material.emission_data.y.argmax(
                                    )
                                    wavelength = obj.material.emission_data.x[
                                        maxindex]
                                    colour = norm(wav2RGB(wavelength))
                                except:
                                    colour = (0.2, 0.2, 0.2)

                                opacity = 0.5
                                material = visual.materials.plastic
                            else:
                                # It is possible to processes the most likley colour of a spectrum in a better way than this!
                                colour = (0.2, 0.2, 0.2)
                                opacity = 0.5
                                material = visual.materials.plastic

                            if colour[0] == np.nan or colour[
                                    1] == np.nan or colour[2] == np.nan:
                                colour = (0.2, 0.2, 0.2)

                        self.visualiser.addObject(obj.shape,
                                                  colour=colour,
                                                  opacity=opacity,
                                                  material=material)

        self.show_lines = True  #False
        self.show_exit = True
        self.show_path = True  #False
        self.show_start = True
        self.show_normals = False
Ejemplo n.º 3
0
class Tracer(object):
    """An object that will fire multiple photons through the scene."""
    def __init__(self, scene=None, source=None, throws=1, steps=50, seed=None, use_visualiser=True, show_log=True, background=(0.957, 0.957, 1), ambient=0.5):
        super(Tracer, self).__init__()
        self.scene = scene
        from LightSources import SimpleSource, PlanarSource, CylindricalSource, PointSource, RadialSource
        self.source = source
        self.throws = throws
        self.steps = steps
        self.totalsteps = 0
        self.seed = seed
        self.killed = 0
        self.database = PhotonDatabase.PhotonDatabase()
        self.stats = dict()
        self.show_log = show_log
        np.random.seed(self.seed)
        if not use_visualiser:
            Visualiser.VISUALISER_ON = False
        else:
            Visualiser.VISUALISER_ON = True
        self.visualiser = Visualiser(background=background, ambient=ambient)
        
        for obj in scene.objects:
            if obj != scene.bounds:
                if not isinstance(obj.shape, CSGadd) and not isinstance(obj.shape, CSGint) and not isinstance(obj.shape, CSGsub):
                
                    if isinstance(obj.material, SimpleMaterial):
                        wavelength = obj.material.bandgap
                    else:
                        
                        if not hasattr(obj.material, 'all_absorption_coefficients'):
                            maxindex = obj.material.emission_data.y.argmax()
                            wavelength = obj.material.emission_data.x[maxindex]
                            colour = wav2RGB(wavelength)
                        else:
                            # It is possible to processes the most likley colour of a spectrum in a better way than this!
                            colour = [0.1,0.1,0.1]
                        
                        if colour[0] == np.nan or colour[1] == np.nan or colour[2] == np.nan:
                            colour = [0.1,0.1,0.1]
                        
                        self.visualiser.addObject(obj.shape, colour=colour)
                        
        self.show_lines = True#False
        self.show_exit = True
        self.show_path = True#False
        self.show_start = True
        
        
    def start(self):
        
        logged = 0
        
        for throw in range(0, self.throws):
            
            # Delete last ray from visualiser
            if Visualiser.VISUALISER_ON:
                for obj in self.visualiser.display.objects:
                    if obj.__class__ is visual.cylinder: # can say either box or 'box'
                        if obj.radius < 0.001:
                            obj.visible = False
                
            if self.show_log:
                print "Photon number:", throw
            else:
                print "Photon number:", throw, "\r",
                sys.stdout.flush()
            
            photon = self.source.photon()
            photon.visualiser = self.visualiser
            photon.scene = self.scene
            photon.material = self.source
            photon.show_log = self.show_log
            
            a = list(photon.position)
            if self.show_start:
                self.visualiser.addSmallSphere(a)
            
            step = 0
            while photon.active and step < self.steps:
                
                if photon.exit_device is not None:
                    
                    # The exit
                    if photon.exit_device.shape.on_surface(photon.position):
                        
                        # Is the ray heading towards or out of a surface?
                        normal = photon.exit_device.shape.surface_normal(photon.ray, acute=False)
                        rads = angle(normal, photon.ray.direction)
                        #print photon.exit_device.shape.surface_identifier(photon.position), 'normal', normal, 'ray dir', photon.direction, 'angle' , np.degrees(rads)
                        if rads < np.pi/2:
                            bound = "Out"
                            #print "OUT"
                        else:
                            bound = "In"
                            #print "IN"
                        
                        self.database.log(photon, surface_normal=photon.exit_device.shape.surface_normal(photon), surface_id=photon.exit_device.shape.surface_identifier(photon.position), ray_direction_bound=bound)
                        
                else:
                    self.database.log(photon)
                
                #import pdb; pdb.set_trace()
                wavelength = photon.wavelength
                #photon.visualiser.addPhoton(photon)
                photon = photon.trace()
                
                if step == 0:
                    # The ray has hit the first object. 
                    # Cache this for later use. If the ray is not 
                    # killed then log data.
                    #import pdb; pdb.set_trace()
                    entering_photon = copy(photon)
                
                #print "Step number:", step
                b = list(photon.position)                
                
                if self.show_lines and photon.active == True:
                    self.visualiser.addLine(a,b, colour=wav2RGB(photon.wavelength))
                
                if self.show_path and photon.active == True:
                    self.visualiser.addSmallSphere(b)
                
                #import pdb; pdb.set_trace()
                
                if photon.active == False and photon.container == self.scene.bounds:
                    
                    if self.show_exit:
                        self.visualiser.addSmallSphere(a, colour=[.33,.33,.33])
                        self.visualiser.addLine(a, a + 0.01*photon.direction, colour=wav2RGB(wavelength))
                    
                    # Record photon that has made it to the bounds
                    if step == 0:
                        if self.show_log: print "   * Photon hit scene bounds without previous intersections *"
                    else:
                        if self.show_log: print "   * Reached Bounds *"
                        photon.exit_device.log(photon)
                        #self.database.log(photon)
                        
                    #entering_photon.exit_device.log(entering_photon)
                    #assert logged == throw, "Logged (%s) and thorw (%s) not equal" % (str(logged), str(throw))
                    logged = logged + 1
                    
                elif photon.active == False:                    
                    #print photon.exit_device.name
                    photon.exit_device = photon.container
                    photon.container.log(photon)
                    self.database.log(photon)
                    if entering_photon.container == photon.scene.bounds:
                        if self.show_log: print "   * Photon hit scene bounds without previous intersections *"
                    else:
                        #try:
                        entering_photon.container.log(entering_photon)
                        #self.database.log(photon)
                        #except:
                        #    entering_photon.container.log_in_volume(entering_photon)
                    #assert logged == throw, "Logged (%s) and thorw (%s) not equal" % (str(logged), str(throw))
                    logged = logged + 1
                
                
                a = b
                step = step + 1
                self.totalsteps = self.totalsteps + 1
                if step >= self.steps:
                    # We need to kill the photon because it is bouncing around in a locked path
                    self.killed = self.killed + 1
                    photon.killed = True
                    self.database.log(photon)
                    if self.show_log: 
                        print "   * Reached Max Steps *"
Ejemplo n.º 4
0
 def __init__(self, scene=None, source=None, throws=1, steps=50, seed=None, use_visualiser=True, show_log=False, background=(0.957, 0.957, 1), ambient=0.5, database_file="pvtracedb.sql"):
     super(Tracer, self).__init__()
     self.scene = scene
     from LightSources import SimpleSource, PlanarSource, CylindricalSource, PointSource, RadialSource
     self.source = source
     self.throws = throws
     self.steps = steps
     self.totalsteps = 0
     self.seed = seed
     self.killed = 0
     self.database = PhotonDatabase.PhotonDatabase(database_file)
     self.stats = dict()
     self.show_log = show_log
     np.random.seed(self.seed)
     if not use_visualiser:
         Visualiser.VISUALISER_ON = False
     else:
         Visualiser.VISUALISER_ON = True
     self.visualiser = Visualiser(background=background, ambient=ambient)
     
     for obj in scene.objects:
         if obj != scene.bounds:
             if not isinstance(obj.shape, CSGadd) and not isinstance(obj.shape, CSGint) and not isinstance(obj.shape, CSGsub):
             
                 #import pdb; pdb.set_trace()
                 if isinstance(obj, RayBin):
                     #checkerboard = ( (0,0.01,0,0.01), (0.01,0,0.01,0), (0,0.01,0,1), (0.01,0,0.01,0) )
                     #checkerboard = ( (0,1,0,1), (1,0,1,0), (0,1,0,1), (1,0,1,0) )
                     #material = visual.materials.texture(data=checkerboard, mapping="rectangular", interpolate=False)
                     material = visual.materials.wood
                     colour = visual.color.blue
                     opacity=1.
                 
                 elif isinstance(obj, Coating):
                     
                     colour = visual.color.white
                     opacity = 0.5
                     material = visual.materials.plastic
                     
                     if hasattr(obj.reflectivity, 'lambertian'):
                         if obj.reflectivity.lambertian is True:
                             # The material is a diffuse reflector
                             colour = visual.color.white
                             opacity = 1.
                             material = visual.materials.plastic
                             
                 elif isinstance(obj.material, SimpleMaterial):
                     #import pdb; pdb.set_trace()
                     wavelength = obj.material.bandgap
                     colour = norm(wav2RGB(wavelength))
                     opacity = 0.5
                     material = visual.materials.plastic
                 else:
                     
                     if not hasattr(obj.material, 'all_absorption_coefficients'):
                         try:
                             maxindex = obj.material.emission_data.y.argmax()
                             wavelength = obj.material.emission_data.x[maxindex]
                             colour = norm(wav2RGB(wavelength))
                         except:
                             colour = (0.2,0.2,0.2)
                         
                         opacity = 0.5
                         material = visual.materials.plastic
                     else:
                         # It is possible to processes the most likley colour of a spectrum in a better way than this!
                         colour = (0.2,0.2,0.2)
                         opacity = 0.5
                         material = visual.materials.plastic
                     
                     if colour[0] == np.nan or colour[1] == np.nan or colour[2] == np.nan:
                         colour = (0.2,0.2,0.2)
                     
                 self.visualiser.addObject(obj.shape, colour=colour, opacity=opacity, material=material)
                     
     self.show_lines = True#False
     self.show_exit = True
     self.show_path = True#False
     self.show_start = True
     self.show_normals = False