Skip to content

Commit

Permalink
updates to pyprismatic to allow for building with HDF5 libraries; cor…
Browse files Browse the repository at this point in the history
…rected input mappings; fixed unit errors in inputs and added input parser to prevent invalid input combinations
  • Loading branch information
lerandc committed Jul 5, 2019
1 parent 2564b66 commit ca0b56a
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 36 deletions.
28 changes: 21 additions & 7 deletions pyprismatic/__init__.py
Expand Up @@ -15,6 +15,19 @@
from . import fileio # noqa
from pyprismatic.params import Metadata

def keySearch(dictionary,layer):
layer+=1
try:
keys = dictionary.keys()
for key in keys:
printStr = ""
for i in range(0,layer):
printStr += "--"
printStr += key
print(printStr)
keySearch(dictionary[key],layer)
except:
a = 1

def demo():
import os
Expand All @@ -33,15 +46,16 @@ def demo():
14 4.0725 4.0725 4.0725 1.0 0.076\n\
-1"
)
meta = Metadata(filenameAtoms="temp.XYZ", filenameOutput="output.mrc")
meta = Metadata(filenameAtoms="temp.XYZ", filenameOutput="demo.h5")
meta.algorithm = "multislice"
meta.go()
import numpy as np
from pyprismatic.fileio import readMRC
import matplotlib.pyplot as plt
#from pyprismatic.fileio import readMRC
import h5py
#result = readMRC("output.mrc")

demoFile = h5py.File('demo.h5','r')
print('demo.h5 filestructure:')
keySearch(demoFile,0)

result = readMRC("output.mrc")
plt.figure()
plt.imshow(np.squeeze(np.sum(result, axis=2)))
plt.show()
os.remove("temp.XYZ")
Binary file removed pyprismatic/__pycache__/__init__.cpython-35.pyc
Binary file not shown.
Binary file removed pyprismatic/__pycache__/__init__.cpython-36.pyc
Binary file not shown.
Binary file removed pyprismatic/__pycache__/fileio.cpython-35.pyc
Binary file not shown.
Binary file removed pyprismatic/__pycache__/params.cpython-35.pyc
Binary file not shown.
34 changes: 22 additions & 12 deletions pyprismatic/core.cpp
Expand Up @@ -16,6 +16,8 @@
#include "configure.h"
#include "parseInput.h"
#include "go.h"
#include <iostream>
#include <stdio.h>
#ifdef PRISMATIC_ENABLE_GPU
#include "cuprismatic.h"
#endif //PRISMATIC_ENABLE_GPU
Expand Down Expand Up @@ -45,7 +47,7 @@ static PyObject *pyprismatic_core_go(PyObject *self, PyObject *args)
#endif //PRISMATIC_ENABLE_GPU

if (!PyArg_ParseTuple(
args, "iissdddiddddiiiddiiiiiddddddddddddddispppppddsiiiddddd",
args, "iissdddiddddiiiddiiiiiddddddddddddddispppppddsiiiiddddd",
&interpolationFactorX,
&interpolationFactorY,
&filenameAtoms,
Expand Down Expand Up @@ -94,6 +96,7 @@ static PyObject *pyprismatic_core_go(PyObject *self, PyObject *args)
&transferMode,
&saveDPC_CoM,
&savePotentialSlices,
&nyquistSampling,
&numSlices,
&zStart,
&scanWindowXMin_r,
Expand All @@ -120,8 +123,8 @@ static PyObject *pyprismatic_core_go(PyObject *self, PyObject *args)
meta.tileX = tileX;
meta.tileY = tileY;
meta.tileZ = tileZ;
meta.E0 = E0;
meta.alphaBeamMax = alphaBeamMax;
meta.E0 = E0 * 1000;
meta.alphaBeamMax = alphaBeamMax / 1000;
meta.numGPUs = numGPUs;
meta.numStreamsPerGPU = numStreamsPerGPU;
meta.numThreads = numThreads;
Expand All @@ -133,10 +136,10 @@ static PyObject *pyprismatic_core_go(PyObject *self, PyObject *args)
meta.probeDefocus = probeDefocus;
meta.C3 = C3;
meta.C5 = C5;
meta.probeSemiangle = probeSemiangle;
meta.detectorAngleStep = detectorAngleStep;
meta.probeXtilt = probeXtilt;
meta.probeYtilt = probeYtilt;
meta.probeSemiangle = probeSemiangle /1000;
meta.detectorAngleStep = detectorAngleStep /1000;
meta.probeXtilt = probeXtilt /1000;
meta.probeYtilt = probeYtilt /1000;
meta.scanWindowXMin = scanWindowXMin;
meta.scanWindowXMax = scanWindowXMax;
meta.scanWindowYMin = scanWindowYMin;
Expand All @@ -161,8 +164,8 @@ static PyObject *pyprismatic_core_go(PyObject *self, PyObject *args)
meta.save4DOutput = save4DOutput;
meta.savePotentialSlices = savePotentialSlices;
meta.saveDPC_CoM = saveDPC_CoM;
meta.integrationAngleMin = integrationAngleMin;
meta.integrationAngleMax = integrationAngleMax;
meta.integrationAngleMin = integrationAngleMin / 1000;
meta.integrationAngleMax = integrationAngleMax / 1000;
meta.nyquistSampling = nyquistSampling;

if (std::string(transferMode) == "singlexfer")
Expand All @@ -179,12 +182,19 @@ static PyObject *pyprismatic_core_go(PyObject *self, PyObject *args)
}

// print metadata
meta.toString();
//meta.toString();
int scratch = Prismatic::writeParamFile(meta,"scratch_param.txt");

Prismatic::go(meta);
Prismatic::Metadata<PRISMATIC_FLOAT_PRECISION> tmp_meta;
if(Prismatic::parseParamFile(tmp_meta,"scratch_param.txt"))
{
Prismatic::go(meta);
}else{
std::cout << "Invalid parameters detected. Cancelling calculation, please check inputs." << std::endl;
}
// configure simulation behavior
// Prismatic::configure(meta);

//std::remove("scratch_param.txt");
// execute simulation
// Prismatic::execute_plan(meta);

Expand Down
23 changes: 12 additions & 11 deletions pyprismatic/params.py
Expand Up @@ -84,8 +84,6 @@ class Metadata:
"potBound",
"numFP",
"sliceThickness",
"numSlices",
"zStart",
"cellDimX",
"cellDimY",
"cellDimZ",
Expand Down Expand Up @@ -113,23 +111,25 @@ class Metadata:
"scanWindowXMax",
"scanWindowYMin",
"scanWindowYMax",
"scanWindowXMin_r",
"scanWindowXMax_r",
"scanWindowYMin_r",
"scanWindowYMax_r",
"randomSeed",
"algorithm",
"includeThermalEffects",
"alsoDoCPUWork",
"save2DOutput",
"save3DOutput",
"save4DOutput",
"saveDPC_CoM",
"savePotentialSlices",
"nyquistSampling",
"integrationAngleMin",
"integrationAngleMax",
"transferMode",
"saveDPC_CoM",
"savePotentialSlices",
"nyquistSampling",
"numSlices",
"zStart",
"scanWindowXMin_r",
"scanWindowXMax_r",
"scanWindowYMin_r",
"scanWindowYMax_r",
]

str_fields: List[str] = ["algorithm", "transferMode"]
Expand All @@ -140,7 +140,8 @@ class Metadata:
"tileX",
"tileY",
"tileZ",
"numFP" "numGPUs",
"numFP",
"numGPUs",
"numStreamsPerGPU",
"numThreads",
"batchSizeTargetCPU",
Expand Down Expand Up @@ -241,7 +242,7 @@ def __init__(self, *args, **kwargs):
self.save2DOutput = False
self.save3DOutput = True
self.save4DOutput = False
self.saveDPC_COM = False
self.saveDPC_CoM = False
self.savePotentialSlices = False
self.nyquistSampling = False
self.integrationAngleMin = 0
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
@@ -1,2 +1,3 @@
numpy>=1.13.0
matplotlib>=2.0.2
h5py>=2.9.0
42 changes: 36 additions & 6 deletions setup.py
Expand Up @@ -13,9 +13,13 @@

from setuptools import setup, Extension
from setuptools.command.install import install
from setuptools.command.develop import develop
import sys
import os

#os.environ['CC'] = 'gcc-7'
#os.environ['CXX'] = 'g++-7'

prismatic_extra_definitions = []
prismatic_libs = []

Expand All @@ -24,7 +28,16 @@
# the shared library (along with CUDA files) are the "extra" sources and in CPU-mode they are added to the Python package sources.
# The reason for doing it this way is for user convenience so that compiling/linking to an extra Prismatic library is not required until
# enabling for GPU, at which point it is already necessary for the other CUDA libraries.

prismatic_sources_base = ["pyprismatic/core.cpp"]
obj_prefix = "build/CMakeFiles/prismatic.dir/src/"
prismatic_gpu_objects = ["prismatic_generated_Multislice_calcOutput.cu.o",
"prismatic_generated_PRISM02_calcSMatrix.cu.o",
"prismatic_generated_PRISM03_calcOutput.cu.o",
"prismatic_generated_utility.cu.o",
]

prismatic_gpu_objects = [obj_prefix + obj for obj in prismatic_gpu_objects]
prismatic_sources_extra = [
"src/go.cpp",
"src/atom.cpp",
Expand All @@ -40,17 +53,18 @@
"src/utility.cpp", #
"src/WorkDispatcher.cpp",
]

prismatic_sources = prismatic_sources_base
prismatic_include_dirs = ["./include"]
prismatic_library_dirs = []
prismatic_extra_objects = [] #"/usr/local/hdf/lib/libhdf5_hl.so","/usr/local/hdf/lib/libhdf5.so","/usr/local/hdf/lib/libhdf5_hl_cpp.so","/usr/local/hdf/lib/libhdf5_cpp.so"]

if os.name == "nt": # check for Windows OS
prismatic_libs = ["libfftw3f-3"]
else:
prismatic_libs = ["fftw3f", "fftw3f_threads"]
prismatic_libs = ["fftw3f", "fftw3f_threads","hdf5_hl","hdf5","hdf5_hl_cpp","hdf5_cpp","pthread","dl","m"]
prismatic_extra_compile_defs = ["-std=c++11"]


class InstallCommand(install):
user_options = install.user_options + [("enable-gpu", None, None)]

Expand All @@ -64,14 +78,28 @@ def finalize_options(self):
def run(self):
install.run(self)

class DevelopCommand(develop):
user_options = develop.user_options + [("enable-gpu", None, None)]

def initialize_options(self):
develop.initialize_options(self)
self.enable_gpu = False

def finalize_options(self):
develop.finalize_options(self)

def run(self):
develop.run(self)

if (
"--enable-gpu" in sys.argv
): # GPU-mode, add some macro definitions and link with the CUDA libraries
prismatic_extra_definitions.extend(
[("PRISMATIC_ENABLE_GPU", 1), ("BUILDING_CUPRISMATIC", 1)]
)
prismatic_libs.extend(["cuprismatic", "cufft", "cudart"])
prismatic_libs.extend(["cufft", "cudart"])
prismatic_sources.extend(prismatic_sources_extra)
prismatic_extra_objects.extend(prismatic_gpu_objects)
else: # CPU-only mode, add the extra C++ sources to the python package
prismatic_sources.extend(prismatic_sources_extra)

Expand All @@ -83,16 +111,18 @@ def run(self):
define_macros=prismatic_extra_definitions,
library_dirs=prismatic_library_dirs,
libraries=prismatic_libs,
extra_objects=prismatic_extra_objects,
)

setup(
name="PyPrismatic",
author="Alan (AJ) Pryor, Jr.",
author_email="apryor6@gmail.com",
version="1.1.16",
version="1.2.0",
description="Python wrapper for Prismatic package for fast image simulation using the PRISM and multislice algorithms in Scanning Transmission Electron Microscopy (STEM)",
ext_modules=[pyprimsatic_core],
packages=["pyprismatic"],
install_requires=["numpy>=1.13.0", "matplotlib>=2.0.2"],
cmdclass={"install": InstallCommand},
install_requires=["numpy>=1.13.0", "matplotlib>=2.0.2","h5py>=2.9.0"],
cmdclass={"install": InstallCommand,
"develop":DevelopCommand},
)

0 comments on commit ca0b56a

Please sign in to comment.