def test3(self): '''create pure python representation of a homogeneous scatterer with composite kernel. render the c++ computation engine of that kernel. ''' #shape from mccomposite.geometry import primitives shape = primitives.block((1, 1, 1)) #kernel nprinter = NeutronPrinter() #composite kernel composite_kernel = hs.compositeKernel() composite_kernel.addElement(nprinter) #scatterer scatterer = hs.homogeneousScatterer(shape, composite_kernel) #render the c++ representation cscatterer = hs.scattererEngine(scatterer) for i in range(10): ev = mcni.neutron(r=(0, 0, -5), v=(0, 0, 1)) cscatterer.scatter(ev) continue return
def detectorcomponent(name, instrumentxml, coordinate_system, tofparams, outfilename): import mccomposite.extensions.Copy import mccomposite.extensions.HollowCylinder import mccomponents.detector.optional_extensions.Detector from instrument.nixml import parse_file instrument = parse_file(instrumentxml) import instrument.geometers as ig instrument.geometer.changeRequestCoordinateSystem( ig.coordinateSystem(coordinate_system)) from mccomponents.detector.utils import \ getDetectorHierarchyDimensions, assignLocalGeometers assignLocalGeometers(instrument, coordinate_system=coordinate_system) detectorSystem = instrument.getDetectorSystem() detectorSystem.tofparams = tofparams dims = getDetectorHierarchyDimensions(instrument) dims = [dim for name, dim in dims] mca = eventModeMCA(outfilename, dims) detectorSystem.mca = mca import mccomponents.homogeneous_scatterer as mh cds = mh.scattererEngine(detectorSystem, coordinate_system=coordinate_system) instrument.geometer = instrument.global_geometer cds.name = name return cds
def test1(self): 'detector hierarchy from xml' from instrument.nixml import parse_file instrument = parse_file('ARCS.xml') import instrument.geometers as ig instrument.geometer.changeRequestCoordinateSystem( ig.coordinateSystem(coordinate_system)) assignLocalGeometers(instrument, coordinate_system=coordinate_system) detectorSystem = instrument.getDetectorSystem() tofparams = 0, 10e-3, 1e-4 detectorSystem.tofparams = tofparams dims = getDetectorHierarchyDimensions(instrument) dims = [dim for name, dim in dims] mca = md.eventModeMCA(outfilename, dims) detectorSystem.mca = mca cds = mh.scattererEngine(detectorSystem, coordinate_system=coordinate_system) for i in range(nevents): if i % 1000 == 0: print i ev = mcni.neutron(r=(0, 0, 0), v=(2000, 1500, 0)) cds.scatter(ev) continue instrument.geometer = instrument.global_geometer return
def test1(self): 'detector hierarchy from xml' from instrument.nixml import parse_file instrument = parse_file( 'ARCS.xml' ) import instrument.geometers as ig instrument.geometer.changeRequestCoordinateSystem( ig.coordinateSystem( coordinate_system ) ) assignLocalGeometers( instrument, coordinate_system = coordinate_system ) detectorSystem = instrument.getDetectorSystem() tofparams = 0, 10e-3, 1e-4 detectorSystem.tofparams = tofparams dims = getDetectorHierarchyDimensions( instrument ) dims = [ dim for name, dim in dims ] mca = md.eventModeMCA( outfilename, dims ) detectorSystem.mca = mca cds = mh.scattererEngine( detectorSystem, coordinate_system = coordinate_system ) for i in range(nevents): if i%1000 == 0: print i ev = mcni.neutron( r = (0,0,0), v = (1500,0,2000) ) cds.scatter(ev) continue instrument.geometer = instrument.global_geometer return
def samplecomponent(name, sampleassembly_xml): '''samplecomponent( name, xml ) --> sample simulation component name: name of the sample xml: xml file describing the sample assembly ''' import mccomposite.extensions.HollowCylinder import os filename = os.path.realpath(sampleassembly_xml) dir, filename = os.path.split(os.path.abspath(filename)) save = os.path.abspath(os.curdir) os.chdir(dir) from sampleassembly.saxml import parse_file sa = parse_file(filename) from sampleassembly_support import sampleassembly2compositescatterer, \ findkernelsfromxmls scatterercomposite = findkernelsfromxmls( sampleassembly2compositescatterer(sa)) os.chdir(save) import mccomponents.homogeneous_scatterer as hs engine = hs.scattererEngine(scatterercomposite) engine.name = name return engine
def test1(self): 'complex. pack, detector, pixel hierarchy' mca = md.eventModeMCA( outfilename, (npacks, ndetsperpack, npixelsperdet,) ) cylinder = operations.subtract( primitives.cylinder( sample2det * 1.1, detlength ), primitives.cylinder( sample2det * 0.9, detlength ) ) ds = md.detectorSystem( cylinder, tofparams, mca ) pack0 = makepack() packs = [pack0] for i in range(1, npacks): packs.append( mccomposite.scatterercopy( pack0, id = i ) ) continue for i in range( npacks ): z = 0 * meter angle = (i-packindexat0)* 5./180 * N.pi x = sample2det * math.cos(angle) y = sample2det * math.sin(angle) ds.addElement( packs[i], (x,y,z) ) continue cds = mh.scattererEngine( ds, coordinate_system = "InstrumentScientist" ) for i in range(nevents): if i%1000 == 0: print i ev = mcni.neutron( r = (-L1,0,0), v = (vi,0,0) ) cds.scatter(ev) continue return
def samplecomponent( name, sampleassembly_xml ): '''samplecomponent( name, xml ) --> sample simulation component name: name of the sample xml: xml file describing the sample assembly ''' import mccomposite.extensions.HollowCylinder import os filename = os.path.realpath( sampleassembly_xml ) dir, filename = os.path.split( os.path.abspath( filename ) ) save = os.path.abspath( os.curdir ) os.chdir( dir ) from sampleassembly.saxml import parse_file sa = parse_file( filename ) from sampleassembly_support import sampleassembly2compositescatterer, \ findkernelsfromxmls scatterercomposite = findkernelsfromxmls( sampleassembly2compositescatterer( sa ) ) os.chdir(save) import mccomponents.homogeneous_scatterer as hs engine = hs.scattererEngine( scatterercomposite ) engine.name = name return engine
def test1a(self): from sampleassembly.saxml import parse_file import os dir, filename = os.path.split(sampleassembly_xml) save = os.path.abspath(os.curdir) os.chdir(dir) sa = parse_file( filename ) from mccomponents.sample.sampleassembly_support \ import sampleassembly2compositescatterer, \ findkernelsfromxmls scatterercomposite = findkernelsfromxmls( sampleassembly2compositescatterer( sa ) ) import mccomponents.homogeneous_scatterer as hs engine = hs.scattererEngine( scatterercomposite ) os.chdir(save) for i in range(1000): ev = mcni.neutron( r = (0,0,-5), v = (0,0,3000) ) engine.scatter( ev ) # print ev continue return
def test1a(self): from sampleassembly.saxml import parse_file import os dir, filename = os.path.split(sampleassembly_xml) save = os.path.abspath(os.curdir) os.chdir(dir) sa = parse_file(filename) from mccomponents.sample.sampleassembly_support \ import sampleassembly2compositescatterer, \ findkernelsfromxmls scatterercomposite = findkernelsfromxmls( sampleassembly2compositescatterer(sa)) import mccomponents.homogeneous_scatterer as hs engine = hs.scattererEngine(scatterercomposite) os.chdir(save) for i in range(10): ev = mcni.neutron(r=(0, 0, -5), v=(0, 0, 3000)) engine.scatter(ev) print ev continue return
def test3(self): '''create pure python representation of a homogeneous scatterer with composite kernel. render the c++ computation engine of that kernel. ''' #shape from mccomposite.geometry import primitives shape = primitives.block( (1,1,1) ) #kernel nprinter = NeutronPrinter( ) #composite kernel composite_kernel = hs.compositeKernel() composite_kernel.addElement( nprinter ) #scatterer scatterer = hs.homogeneousScatterer( shape, composite_kernel) #render the c++ representation cscatterer = hs.scattererEngine( scatterer ) for i in range(10): ev = mcni.neutron( r = (0,0,-5), v = (0,0,1) ) cscatterer.scatter(ev) continue return
def makeDispersion(): from mccomponents.sample.phonon import periodicdispersion_fromidf disp = periodicdispersion_fromidf("phonon-dispersion-fccNi-primitive-reciprocal-unitcell") from mccomponents.homogeneous_scatterer import kernelEngine, scattererEngine disp = scattererEngine(disp) return disp
def test1(self): 'GridSQE' sqe = createSqe() gridsqe = ms.gridsqe( sqe ) cgridsqe = mh.scattererEngine( gridsqe ) Q, E = 5.05, 10.5 self.assertAlmostEqual( sqe[ Q,E ][0], sqe_f(Q,E) ) self.assertAlmostEqual( cgridsqe( Q,E ), sqe_f(Q,E) ) return
def test1(self): 'IsotropicKernel' kernel = ms.isotropickernel( 1., 1. ) ckernel = mh.scattererEngine( kernel ) ev = mcni.neutron( r = (-5,0,0), v = (3000,0,0) ) ckernel.scatter(ev) print ev return
def test1(self): 'IsotropicKernel' kernel = ms.isotropickernel(1., 1.) ckernel = mh.scattererEngine(kernel) ev = mcni.neutron(r=(-5, 0, 0), v=(3000, 0, 0)) ckernel.scatter(ev) print ev return
def test1(self): 'GridSQE' sqe = createSqe() gridsqe = ms.gridsqe(sqe) cgridsqe = mh.scattererEngine(gridsqe) Q, E = 5.05, 10.5 self.assertAlmostEqual(sqe[Q, E][0], sqe_f(Q, E)) self.assertAlmostEqual(cgridsqe(Q, E), sqe_f(Q, E)) return
def band(phonon, start, end, npts, cartesian, output, branch, output_npy): "Given phonon data in IDF format, plot band structure along one direction" # phonon is the path to a directory with IDF phonon data # read phonon data from mccomponents.sample.phonon import periodicdispersion_fromidf as pd import mcni, numpy as np disp = pd(phonon) # and construct the proxy to the c++ data object import mccomponents.homogeneous_scatterer as mh cdisp = mh.scattererEngine(disp) # create Q array Qs = np.array(start) + (np.array(end) - np.array(start)) * np.arange( 0, 1, 1. / npts)[:, np.newaxis] # Q will be cartesian if not cartesian: # read reciprocal basis vectors from Qgridinfo import os reci_basis = recibasis_fromQgridinfo(os.path.join(phonon, 'Qgridinfo')) Qs = np.dot(Qs, reci_basis) # compute energies nbr = disp.dispersion.nBranches Es = [cdisp.energy(br, mcni.vector3(*Q)) for Q in Qs for br in range(nbr)] Es = np.array(Es) Es.shape = -1, nbr # output if not output_npy: output_npy = 'bands-start%s-end%s.npy' % (start, end) np.save(output_npy, Es) try: import matplotlib as mpl except ImportError: import warnings warnings.warn( "Plotting needs matplotlib. Please install python matplotlib") return mpl.use("Agg") import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) if branch == -1: for i in range(nbr): ax.plot(Es[:, i]) else: ax.plot(Es[:, branch]) if output: fig.savefig(output) else: plt.show() return
def test1(self): 'SQEkernel' sqe = createSqe() gridsqe = ms.gridsqe( sqe ) sqekernel = ms.sqekernel( 1., 1., 1., SQE=gridsqe, Qrange=(0, 12.), Erange=(-50, 50) ) csqekernel = mh.scattererEngine( sqekernel ) ev = mcni.neutron( r = (-5,0,0), v = (3000,0,0) ) self.assertAlmostEqual( csqekernel.scattering_coefficient(ev), 1 ) self.assertAlmostEqual( csqekernel.absorption_coefficient(ev), 2200./3000. ) return
def band(phonon, start, end, npts, cartesian, output, branch): "Given phonon data in IDF format, plot band structure along one direction" # phonon is the path to a directory with IDF phonon data # read phonon data from mccomponents.sample.phonon import periodicdispersion_fromidf as pd import mcni, numpy as np disp = pd(phonon) # and construct the proxy to the c++ data object import mccomponents.homogeneous_scatterer as mh cdisp = mh.scattererEngine(disp) # create Q array Qs = np.array(start) + (np.array(end)-np.array(start)) * np.arange(0, 1, 1./npts)[:, np.newaxis] # Q will be cartesian if not cartesian: # read reciprocal basis vectors from Qgridinfo import os reci_basis = recibasis_fromQgridinfo(os.path.join(phonon, 'Qgridinfo')) Qs = np.dot(Qs, reci_basis) # compute energies nbr = disp.dispersion.nBranches Es = [cdisp.energy(br, mcni.vector3(*Q)) for Q in Qs for br in range(nbr)] Es = np.array(Es) Es.shape = -1, nbr # output try: import matplotlib as mpl except ImportError: import warnings warnings.warn("Plotting needs matplotlib. Please install python matplotlib") return mpl.use("Agg") import matplotlib.pyplot as plt fig = plt.figure(); ax = fig.add_subplot(111) if branch == -1: for i in range(nbr): ax.plot(Es[:, i]) else: ax.plot(Es[:, branch]) if output: fig.savefig(output) else: plt.show() return
def test2(self): '''create pure python representation of a homogeneous scatterer, and render the c++ computation engine of that kernel ''' from mccomposite.geometry import primitives shape = primitives.block((1, 1, 1)) nprinter = NeutronPrinter() scatterer = hs.homogeneousScatterer(shape, nprinter) #render the c++ representation cscatterer = hs.scattererEngine(scatterer) for i in range(10): ev = mcni.neutron(r=(0, 0, -5), v=(0, 0, 1)) cscatterer.scatter(ev) print ev continue return
def test2(self): '''create pure python representation of a homogeneous scatterer, and render the c++ computation engine of that kernel ''' from mccomposite.geometry import primitives shape = primitives.block( (1,1,1) ) nprinter = NeutronPrinter( ) scatterer = hs.homogeneousScatterer(shape, nprinter) #render the c++ representation cscatterer = hs.scattererEngine( scatterer ) for i in range(10): ev = mcni.neutron( r = (0,0,-5), v = (0,0,1) ) cscatterer.scatter(ev) print ev continue return
def test0(self): from sampleassembly.saxml import parse_file sa = parse_file( sampleassembly_xml ) from mccomponents.sample.sampleassembly_support \ import sampleassembly2compositescatterer, \ findkernelsfromxmls scatterercomposite = findkernelsfromxmls( sampleassembly2compositescatterer( sa ) ) import mccomponents.homogeneous_scatterer as hs engine = hs.scattererEngine( scatterercomposite ) for i in range(10): ev = mcni.neutron( r = (0,0,-5), v = (0,0,3000) ) engine.scatter( ev ) print ev continue return
def makeScatterer(): import mccomponents.sample.phonon.xml from mccomponents.sample.kernelxml import parse_file scatterer = parse_file('fccNi-plate-scatterer-primitive-reciprocal-unitcell.xml') kernel = scatterer.kernel() from sampleassembly.predefined import shapes plate = shapes.plate(width=0.04, height=0.10, thickness=0.003) scatterer._shape = plate from sampleassembly import elements sample = elements.powdersample('fccNi', shape=plate) crystal = elements.crystal(unitcell=makeUnitcell()) sample.phase = crystal kernel.scatterer_origin = sample from mccomponents.homogeneous_scatterer import scattererEngine return scattererEngine(scatterer)
def test1a(self): from sampleassembly.saxml import parse_file sa = parse_file( sampleassembly_xml ) from mccomponents.sample.sampleassembly_support \ import sampleassembly2compositescatterer, \ findkernelsfromxmls scatterercomposite = findkernelsfromxmls( sampleassembly2compositescatterer( sa ) ) import mccomponents.homogeneous_scatterer as hs engine = hs.scattererEngine( scatterercomposite ) for i in range(10): ev = mcni.neutron( r = (0,0,-5), v = (0,0,3000) ) engine.scatter( ev ) print ev continue return
def makeScatterer(): import mccomponents.sample.phonon.xml from mccomponents.sample.kernelxml import parse_file scatterer = parse_file( 'fccNi-plate-scatterer-primitive-reciprocal-unitcell.xml') kernel = scatterer.kernel() from sampleassembly.predefined import shapes plate = shapes.plate(width=0.04, height=0.10, thickness=0.003) scatterer._shape = plate from sampleassembly import elements sample = elements.powdersample('fccNi', shape=plate) crystal = elements.crystal(unitcell=makeUnitcell()) sample.phase = crystal kernel.scatterer_origin = sample from mccomponents.homogeneous_scatterer import scattererEngine return scattererEngine(scatterer)
def test1(self): 'simple. one detector' ndets = 1 cylinder = primitives.cylinder( detradius, detlength ) he3tube = md.he3tube( cylinder, id = 0, pressure = units.pressure.atm * pressure, mcweights = ( absorption_weight, scattering_weight, transmission_weight) ) mca = md.eventModeMCA( 'events.dat', (ndets,npixels,) ) ds = md.detectorSystem( cylinder, tofparams, mca ) m = units.length.meter for i in range(npixels): pixel = md.pixel( id = i ) he3tube.addElement( pixel, N.array( [0,0,(-0.495+i*0.01)] ) * m, (0,0,0) ) continue ds.addElement( he3tube ) cds = mh.scattererEngine( ds, coordinate_system = "InstrumentScientist" ) for i in range(nevents): if i%1000 == 0 and interactive: # print i print '.', sys.stdout.flush() ev = mcni.neutron( r = (-L,0,0), v = (vi,0,0) ) cds.scatter(ev) continue return
def test1(self): 'complex. pack, detector, pixel hierarchy' mca = md.eventModeMCA(outfilename, ( npacks, ndetsperpack, npixelsperdet, )) cylinder = operations.subtract( primitives.cylinder(sample2det * 1.1, detlength), primitives.cylinder(sample2det * 0.9, detlength)) ds = md.detectorSystem(cylinder, tofparams, mca) pack0 = makepack() packs = [pack0] for i in range(1, npacks): packs.append(mccomposite.scatterercopy(pack0, id=i)) continue for i in range(npacks): z = 0 * meter angle = (i - packindexat0) * 5. / 180 * N.pi x = sample2det * math.cos(angle) y = sample2det * math.sin(angle) ds.addElement(packs[i], (x, y, z)) continue cds = mh.scattererEngine(ds, coordinate_system="InstrumentScientist") for i in range(nevents): if i % 1000 == 0: print i ev = mcni.neutron(r=(-L1, 0, 0), v=(vi, 0, 0)) cds.scatter(ev) continue return
def slice(crystal, phonon, start, end, npts, cartesian, outhist, eaxis): "Given phonon data in IDF format, compute slice of SQE data along a specific reciprocal space direction" # phonon is the path to a directory with IDF phonon data # read phonon data from mccomponents.sample.phonon import periodicdispersion_fromidf as pd import mcni, numpy as np disp = pd(phonon) # and construct a proxy to the c++ data object import mccomponents.homogeneous_scatterer as mh cdisp = mh.scattererEngine(disp) # create Q array start = np.array(start) end = np.array(end) step = (end - start) / npts Qs = start + step * np.arange(0, npts, 1.)[:, np.newaxis] # Qs: cartesian, hkls: miller indexes import os reci_basis = recibasis_fromQgridinfo(os.path.join(phonon, 'Qgridinfo')) inv_reci_basis = np.linalg.inv(reci_basis) if cartesian: hkls = np.dot(Qs, inv_reci_basis) # these vectors will be used later in method Qtox start = np.dot(start, inv_reci_basis) step = np.dot(step, inv_reci_basis) end = np.dot(end, inv_reci_basis) else: hkls = Qs Qs = np.dot(hkls, reci_basis) # gather energies and polarizations nQ = len(Qs) nbr = disp.dispersion.nBranches natoms = disp.dispersion.nAtoms # energies Es = [cdisp.energy(br, mcni.vector3(*Q)) for Q in Qs for br in range(nbr)] Es = np.array(Es) Es.shape = nQ, nbr # polarizations pols = [ np.array(cdisp.polarization(br, atom, mcni.vector3(*Q))) for Q in Qs for br in range(nbr) for atom in range(natoms) ] pols = np.array(pols) pols.shape = nQ, nbr, natoms, 3 # get atom positions from crystal structure file from diffpy.Structure.Parsers import getParser parser = getParser(os.path.splitext(crystal)[-1][1:]) structure = parser.parseFile(crystal) atom_positions = [atom.xyz for atom in structure] # create "events" for later histogramming process to construct slice events = computeEvents(hkls, Es, pols, atom_positions, reci_basis) # for x axis of the histogram (along Q) maxx = np.linalg.norm(end - start) xaxis = 0, maxx, maxx / npts # Eaxis = 0, np.max(Es) * 1.1, 1. Eaxis = eaxis # functor to convert hkl to "x" value from distutils.version import LooseVersion def Qtox(hkl): if LooseVersion(np.__version__) >= LooseVersion("1.8"): x = np.linalg.norm(hkl - start, axis=-1) else: x = np.array(map(np.linalg.norm, hkl - start)) mask = x == x return x, mask # histogramming h = makeSlice(events, xaxis, Eaxis, Qtox) # output import histogram.hdf as hh hh.dump(h, outhist) return
def makeDispersion(): from mccomponents.sample.phonon import periodicdispersion_fromidf disp = periodicdispersion_fromidf('phonon-dispersion-fccNi-primitive-reciprocal-unitcell') from mccomponents.homogeneous_scatterer import kernelEngine, scattererEngine disp = scattererEngine(disp) return disp
def makeDispersion(): from mccomponents.sample.phonon import periodicdispersion_fromidf disp = periodicdispersion_fromidf(dispersion_dir) from mccomponents.homogeneous_scatterer import kernelEngine, scattererEngine disp = scattererEngine(disp) return disp
def slice(crystal, phonon, start, end, npts, cartesian, outhist, eaxis): "Given phonon data in IDF format, compute slice of SQE data along a specific reciprocal space direction" # phonon is the path to a directory with IDF phonon data # read phonon data from mccomponents.sample.phonon import periodicdispersion_fromidf as pd import mcni, numpy as np disp = pd(phonon) # and construct a proxy to the c++ data object import mccomponents.homogeneous_scatterer as mh cdisp = mh.scattererEngine(disp) # create Q array start = np.array(start) end = np.array(end) step = (end-start)/npts Qs = start + step * np.arange(0, npts, 1.)[:, np.newaxis] # Qs: cartesian, hkls: miller indexes import os reci_basis = recibasis_fromQgridinfo(os.path.join(phonon, 'Qgridinfo')) inv_reci_basis = np.linalg.inv(reci_basis) if cartesian: hkls = np.dot(Qs, inv_reci_basis) # these vectors will be used later in method Qtox start = np.dot(start, inv_reci_basis) step = np.dot(step, inv_reci_basis) end = np.dot(end, inv_reci_basis) else: hkls = Qs Qs = np.dot(hkls, reci_basis) # gather energies and polarizations nQ = len(Qs) nbr = disp.dispersion.nBranches natoms = disp.dispersion.nAtoms # energies Es = [cdisp.energy(br, mcni.vector3(*Q)) for Q in Qs for br in range(nbr) ] Es = np.array(Es) Es.shape = nQ, nbr # polarizations pols = [ np.array(cdisp.polarization(br, atom, mcni.vector3(*Q))) for Q in Qs for br in range(nbr) for atom in range(natoms) ] pols = np.array(pols) pols.shape = nQ, nbr, natoms, 3 # get atom positions from crystal structure file from danse.ins.matter.Parsers import getParser parser = getParser(os.path.splitext(crystal)[-1][1:]) structure = parser.parseFile(crystal) atom_positions = [atom.xyz for atom in structure] # create "events" for later histogramming process to construct slice events = computeEvents(hkls, Es, pols, atom_positions, reci_basis) # for x axis of the histogram (along Q) maxx = np.linalg.norm(end-start) xaxis = 0, maxx, maxx/npts # Eaxis = 0, np.max(Es) * 1.1, 1. Eaxis = eaxis # functor to convert hkl to "x" value from distutils.version import LooseVersion def Qtox(hkl): if LooseVersion(np.__version__) >= LooseVersion("1.8"): x = np.linalg.norm(hkl-start, axis=-1) else: x = np.array(map(np.linalg.norm, hkl-start)) mask = x==x return x, mask # histogramming h = makeSlice(events, xaxis, Eaxis, Qtox) # output import histogram.hdf as hh hh.dump(h, outhist) return