Source code for mcramp.scat.counter
from .sprim import SPrim
import numpy as np
import pyopencl as cl
import pyopencl.array as clarr
import matplotlib.pyplot as plt
import os
import datetime
[docs]class SCounter(SPrim):
"""
Scattering kernel for Counter detector. Marks a neutron as detected for usage
alongside the 'SRescal' component, and outputs a floating point number equal
to the sum of the weights of detected neutrons.
Parameters
----------
filename : str or None
Name of the file to which neutron counts will be saved. No file saved if
filename is None
Methods
-------
Data
Returns the sum of detected neutron weights as a floating point number.
Plot
None
Save
Saves the sum of detected neutron weights as a npy file if the parameter\
filename is not None.
"""
def __init__(self, idx=0, ctx=None,
filename=None, **kwargs):
self.last_ran_datetime = datetime.datetime.now()
self.last_copy_datetime = datetime.datetime.now()
self.idx = idx
self.counts = np.zeros((2,), dtype=np.float32)
self.filename = filename
mf = cl.mem_flags
self.counts_cl = cl.Buffer(ctx,
mf.READ_WRITE | mf.COPY_HOST_PTR,
hostbuf=self.counts)
with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'counter.cl'), mode='r') as f:
self.prg = cl.Program(ctx, f.read()).build(options=r'-I "{}/include"'.format(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
def scatter_prg(self, queue, N, neutron_buf, intersection_buf, iidx_buf):
self.prg.counter(queue, (N, ),
None,
neutron_buf,
intersection_buf,
iidx_buf,
np.uint32(self.idx),
self.counts_cl)
self.last_ran_datetime = datetime.datetime.now()
def data(self, queue):
self._cached_copy(queue)
return self.counts[0]
def save(self, queue):
if self.filename:
self._cached_copy(queue)
np.save(self.filename, self.counts[0])
def _cached_copy(self, queue):
if self.last_ran_datetime > self.last_copy_datetime:
cl.enqueue_copy(queue, self.counts, self.counts_cl).wait()
self.last_copy_datetime = datetime.datetime.now()