Exemple #1
0
    def render_mc_info(self,max_photons=1000,cher_only=True):
        #need to render photon tracking info if available
        
        self.gpu_geometries = [self.gpu_geometry]
        if self.sum_mode or self.ev is None:
            return
 
        if self.photon_display_mode == 'beg':
            photons = self.ev.photons_beg
        elif self.photon_display_mode == 'end':
            photons = self.ev.photons_end
        else:
            photons = None
        
        if photons is not None:
            geometry = Geometry()
            self.render_photons(geometry,photons)
            geometry = create_geometry_from_obj(geometry)
            gpu_geometry = gpu.GPUGeometry(geometry)
            self.gpu_geometries.append(gpu_geometry)
            
        if self.track_display_mode in ['geant4', 'both'] and self.ev.vertices is not None:
            geometry = Geometry()
            any = False
            for vertex in self.ev.vertices:
                if vertex.steps:
                    any = True
                    self.render_vertex(geometry,vertex,children=True)
            if any:
                geometry = create_geometry_from_obj(geometry)
                gpu_geometry = gpu.GPUGeometry(geometry)
                self.gpu_geometries.append(gpu_geometry)
                
        
        if self.track_display_mode in ['chroma', 'both'] and self.ev.photon_tracks is not None:
            geometry = Geometry()
            print('Total Photons',len(self.ev.photon_tracks))
            cherenkov = np.asarray([track.flags[0] & event.CHERENKOV == event.CHERENKOV for track in self.ev.photon_tracks])
            ncherenkov = np.count_nonzero(cherenkov)
            nphotons = ncherenkov if cher_only else len(self.ev.photon_tracks)
            prob = max_photons/nphotons
            selector = np.random.random(len(self.ev.photon_tracks)) < prob
            nphotons = 0
            for track in (t for s,t in zip(selector,self.ev.photon_tracks) if s):
                if cher_only and track.flags[0] & event.CHERENKOV == event.CHERENKOV:
                    self.render_photon_track(geometry,track[:min(len(track),5)],sz=0.05)
                    nphotons = nphotons + 1
                elif not cher_only:
                    self.render_photon_track(geometry,track[:min(len(track),5)])
                    nphotons = nphotons + 1
            if nphotons > 0:
                print('Rendered Photons',nphotons)
                geometry = create_geometry_from_obj(geometry)
                gpu_geometry = gpu.GPUGeometry(geometry)
                self.gpu_geometries.append(gpu_geometry)
Exemple #2
0
    def init_gpu(self):
        self.context = gpu.create_cuda_context(self.device_id)

        self.gpu_geometry = gpu.GPUGeometry(self.geometry)
        self.gpu_funcs = gpu.GPUFuncs(gpu.get_cu_module('mesh.h'))
        self.hybrid_funcs = gpu.GPUFuncs(gpu.get_cu_module('hybrid_render.cu'))

        self.gpu_geometries = [self.gpu_geometry]

        self.width, self.height = self.size

        self.npixels = self.width * self.height

        self.clock = pygame.time.Clock()

        self.doom_mode = False
        try:
            if self.width == 640:  # SECRET DOOM MODE!
                print 'shotgun activated!'
                self.doom_hud = pygame.image.load(
                    'images/doomhud.png').convert_alpha()
                rect = self.doom_hud.get_rect()
                self.doom_rect = rect.move(0, self.height - rect.height)
                self.doom_mode = True
        except:
            pass

        lower_bound, upper_bound = self.geometry.mesh.get_bounds()

        self.mesh_diagonal_norm = np.linalg.norm(upper_bound - lower_bound)

        self.scale = self.mesh_diagonal_norm

        self.motion = 'coarse'

        self.nblocks = 64

        self.point = np.array([
            0, -self.mesh_diagonal_norm, (lower_bound[2] + upper_bound[2]) / 2
        ])

        self.axis1 = np.array([0, 0, 1], float)
        self.axis2 = np.array([1, 0, 0], float)

        self.film_width = 35.0  # mm

        pos, dir = from_film(self.point,
                             axis1=self.axis1,
                             axis2=self.axis2,
                             size=self.size,
                             width=self.film_width)

        self.rays = gpu.GPURays(pos, dir, max_alpha_depth=self.max_alpha_depth)

        self.pixels_gpu = ga.empty(self.npixels, dtype=np.uint32)

        self.movie = False
        self.movie_index = 0
        self.movie_dir = None
        self.hybrid_render = False
Exemple #3
0
    def render_particle_track(self):
        x = 10.0
        h = x * np.sqrt(3) / 2
        pyramid = make.linear_extrude([-x / 2, 0, x / 2],
                                      [-h / 2, h / 2, -h / 2], h, [0] * 3,
                                      [0] * 3)
        marker = Solid(pyramid, vacuum, vacuum)

        if self.photon_display_mode == 'beg':
            photons = self.ev.photons_beg
        else:
            photons = self.ev.photons_end

        geometry = Geometry()
        sample_factor = max(1, len(photons.pos) / 10000)
        for pos in photons.pos[::sample_factor]:
            geometry.add_solid(marker,
                               displacement=pos,
                               rotation=make_rotation_matrix(
                                   np.random.uniform(0, 2 * np.pi),
                                   uniform_sphere()))

        geometry = create_geometry_from_obj(geometry)
        gpu_geometry = gpu.GPUGeometry(geometry)

        self.gpu_geometries = [self.gpu_geometry, gpu_geometry]
Exemple #4
0
    def loadlayer(self, layer):
        if layer is None:
            self.gpu_geometries = [self.gpu_geometry]
        else:
            try:
                gpu_geometry = self.bvh_layers[layer]
            except KeyError:
                geometry = bvh_mesh(self.geometry, layer)
                gpu_geometry = gpu.GPUGeometry(geometry, print_usage=False)
                self.bvh_layers[layer] = gpu_geometry

            self.gpu_geometries = [self.gpu_geometry, gpu_geometry]

        self.update()
Exemple #5
0
    def __init__(self,
                 detector,
                 seed=None,
                 cuda_device=None,
                 particle_tracking=False,
                 photon_tracking=False,
                 geant4_processes=4,
                 nthreads_per_block=64,
                 max_blocks=1024):
        self.detector = detector

        self.nthreads_per_block = nthreads_per_block
        self.max_blocks = max_blocks
        self.photon_tracking = photon_tracking

        if seed is None:
            self.seed = pick_seed()
        else:
            self.seed = seed

        # We have three generators to seed: numpy.random, GEANT4, and CURAND.
        # The latter two are done below.
        np.random.seed(self.seed)

        if geant4_processes > 0:
            self.photon_generator = generator.photon.G4ParallelGenerator(
                geant4_processes,
                detector.detector_material,
                base_seed=self.seed,
                tracking=particle_tracking)
        else:
            self.photon_generator = None

        self.context = gpu.create_cuda_context(cuda_device)

        if hasattr(detector, 'num_channels'):
            self.gpu_geometry = gpu.GPUDetector(detector)
            self.gpu_daq = gpu.GPUDaq(self.gpu_geometry)
            self.gpu_pdf = gpu.GPUPDF()
            self.gpu_pdf_kernel = gpu.GPUKernelPDF()
        else:
            self.gpu_geometry = gpu.GPUGeometry(detector)

        self.rng_states = gpu.get_rng_states(self.nthreads_per_block *
                                             self.max_blocks,
                                             seed=self.seed)

        self.pdf_config = None
Exemple #6
0
def propagate_photon(photon_type, numPhotons, nr_steps, geometry,
                     nthreads_per_block, max_blocks, rng_states):
    gpu_photons = gpu.GPUPhotons(photon_type)
    gpu_geometry = gpu.GPUGeometry(geometry)
    photon_track = np.zeros((nr_steps, numPhotons, 3))
    for i in range(nr_steps):
        gpu_photons.propagate(gpu_geometry,
                              rng_states,
                              nthreads_per_block=nthreads_per_block,
                              max_blocks=max_blocks,
                              max_steps=1)
        photons = gpu_photons.get()

        photon_track[i, :, 0] = photons.pos[:, 0]
        photon_track[i, :, 1] = photons.pos[:, 1]
        photon_track[i, :, 2] = photons.pos[:, 2]
    return photons, photon_track
Exemple #7
0
    def render_mc_info(self):
        #need to render photon tracking info if available

        self.gpu_geometries = [self.gpu_geometry]
        if self.sum_mode or self.ev is None:
            return

        if self.photon_display_mode == 'beg':
            photons = self.ev.photons_beg
        elif self.photon_display_mode == 'end':
            photons = self.ev.photons_end
        else:
            photons = None

        if photons is not None:
            geometry = Geometry()
            self.render_photons(geometry, photons)
            geometry = create_geometry_from_obj(geometry)
            gpu_geometry = gpu.GPUGeometry(geometry)
            self.gpu_geometries.append(gpu_geometry)

        if self.track_display_mode in ['geant4', 'both'
                                       ] and self.ev.vertices is not None:
            geometry = Geometry()
            any = False
            for vertex in self.ev.vertices:
                if vertex.steps:
                    any = True
                    self.render_vertex(geometry, vertex, children=True)
            if any:
                geometry = create_geometry_from_obj(geometry)
                gpu_geometry = gpu.GPUGeometry(geometry)
                self.gpu_geometries.append(gpu_geometry)

        if self.track_display_mode in ['chroma', 'both'
                                       ] and self.ev.photon_tracks is not None:
            geometry = Geometry()
            print('Total Photons', len(self.ev.photon_tracks))

            def has(flags, test):
                return flags & test == test

            tracks = self.ev.photon_tracks
            if self.photons_detected_only:
                detected = np.asarray([
                    has(track.flags[-1], event.SURFACE_DETECT)
                    for track in tracks
                ])
                tracks = [t for t, m in zip(tracks, detected) if m]
            cherenkov = np.asarray([
                has(track.flags[0], event.CHERENKOV)
                and not has(track.flags[-1], event.BULK_REEMIT)
                for track in tracks
            ])
            scintillation = np.asarray([
                has(track.flags[0], event.SCINTILLATION)
                and not has(track.flags[-1], event.BULK_REEMIT)
                for track in tracks
            ])
            reemission = np.asarray(
                [has(track.flags[-1], event.BULK_REEMIT) for track in tracks])
            if self.photons_only_type is not None:
                if self.photons_only_type == 'cher':
                    selector = cherenkov
                elif self.photons_only_type == 'scint':
                    selector = scintillation
                elif self.photons_only_type == 'reemit':
                    selector = reemission
                else:
                    raise Exception('Unknown only type: %s' % only)
                tracks = [t for t, m in zip(tracks, selector) if m]
                cherenkov = cherenkov[selector]
                scintillation = scintillation[selector]
                reemission = reemission[selector]
            nphotons = len(tracks)
            prob = self.photons_max / nphotons if self.photons_max is not None else 1.0
            selector = np.random.random(len(tracks)) < prob
            nphotons = np.count_nonzero(selector)
            for i, track in ((i, t)
                             for i, (s, t) in enumerate(zip(selector, tracks))
                             if s):
                if cherenkov[i]:
                    color = [255, 0, 0]
                elif scintillation[i]:
                    color = [0, 0, 255]
                elif reemission[i]:
                    color = [0, 255, 0]
                else:
                    color = [255, 255, 255]
                steps = min(
                    len(track), self.photons_max_steps
                ) if self.photons_max_steps is not None else len(track)
                self.render_photon_track(geometry,
                                         track[:steps],
                                         sz=self.photons_track_size,
                                         color=color)
            if nphotons > 0:
                print('Rendered Photons', nphotons)
                geometry = create_geometry_from_obj(geometry)
                gpu_geometry = gpu.GPUGeometry(geometry)
                self.gpu_geometries.append(gpu_geometry)
Exemple #8
0
    def render_mc_info_all_events(self):
        #function added to visualize all events in a root file at the same time
        self.gpu_geometries = [self.gpu_geometry]
        for i, ev in enumerate(self.rr):
            print('Evaluating event %i' % i)
            if self.sum_mode or ev is None:
                return

            if self.track_display_mode in ['chroma', 'both'
                                           ] and ev.photon_tracks is not None:
                geometry = Geometry()
                print('Total Photons', len(ev.photon_tracks))

                def has(flags, test):
                    return flags & test == test

                tracks = ev.photon_tracks
                if self.photons_detected_only:
                    detected = np.asarray([
                        has(track.flags[-1], event.SURFACE_DETECT)
                        for track in tracks
                    ])
                    tracks = [t for t, m in zip(tracks, detected) if m]
                cherenkov = np.asarray([
                    has(track.flags[0], event.CHERENKOV)
                    and not has(track.flags[-1], event.BULK_REEMIT)
                    for track in tracks
                ])
                scintillation = np.asarray([
                    has(track.flags[0], event.SCINTILLATION)
                    and not has(track.flags[-1], event.BULK_REEMIT)
                    for track in tracks
                ])
                reemission = np.asarray([
                    has(track.flags[-1], event.BULK_REEMIT) for track in tracks
                ])
                if self.photons_only_type is not None:
                    if self.photons_only_type == 'cher':
                        selector = cherenkov
                    elif self.photons_only_type == 'scint':
                        selector = scintillation
                    elif self.photons_only_type == 'reemit':
                        selector = reemission
                    else:
                        raise Exception('Unknown only type: %s' % only)
                    tracks = [t for t, m in zip(tracks, selector) if m]
                    cherenkov = cherenkov[selector]
                    scintillation = scintillation[selector]
                    reemission = reemission[selector]
                nphotons = len(tracks)
                prob = self.photons_max / nphotons if self.photons_max is not None and nphotons is not 0 else 1.0
                selector = np.random.random(len(tracks)) < prob
                nphotons = np.count_nonzero(selector)
                for i, track in ((i, t)
                                 for i, (s,
                                         t) in enumerate(zip(selector, tracks))
                                 if s):
                    if cherenkov[i]:
                        color = [255, 0, 0]
                    elif scintillation[i]:
                        color = [0, 0, 255]
                    elif reemission[i]:
                        color = [0, 255, 0]
                    else:
                        color = [255, 255, 255]
                    steps = min(
                        len(track), self.photons_max_steps
                    ) if self.photons_max_steps is not None else len(track)
                    self.render_photon_track(geometry,
                                             track[:steps],
                                             sz=self.photons_track_size,
                                             color=color)
                if nphotons > 0:
                    print('Rendered Photons', nphotons)
                    geometry = create_geometry_from_obj(geometry)
                    gpu_geometry = gpu.GPUGeometry(geometry)
                    self.gpu_geometries.append(gpu_geometry)