コード例 #1
0
    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
コード例 #2
0
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
コード例 #3
0
    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
コード例 #4
0
    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
コード例 #5
0
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
コード例 #6
0
    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
コード例 #7
0
ファイル: __init__.py プロジェクト: McStasMcXtrace/MCViNE
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
コード例 #8
0
    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
コード例 #9
0
    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
コード例 #10
0
    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
コード例 #12
0
 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
コード例 #13
0
 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
コード例 #14
0
    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
コード例 #15
0
    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
コード例 #16
0
ファイル: phonon.py プロジェクト: mcvine/phonon
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
コード例 #17
0
 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
コード例 #18
0
ファイル: phonon.py プロジェクト: mcvine/mcvine
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
コード例 #19
0
    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
コード例 #20
0
    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
コード例 #21
0
    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)
コード例 #23
0
ファイル: TestCase.py プロジェクト: McStasMcXtrace/MCViNE
    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
コード例 #24
0
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)
コード例 #25
0
    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
コード例 #26
0
    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
コード例 #27
0
ファイル: phonon.py プロジェクト: mcvine/phonon
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
コード例 #28
0
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
コード例 #29
0
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
コード例 #30
0
ファイル: phonon.py プロジェクト: mcvine/mcvine
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