Example #1
0
def initialize_experiment(cfg):
    """takes a yml configuration file as input"""
    # make experiment
    ws = expt.Experiment()

    cwd = cfg.working_dir

    materials_fname = cfg.material.definitions
    material_name = cfg.material.active
    detector_fname = cfg.instrument.detector.parameters_old

    # load materials
    ws.loadMaterialList(os.path.join(cwd, materials_fname))
    ws.activeMaterial = material_name
    logger.info("setting active material to '%s'", material_name)

    pd = ws.activeMaterial.planeData

    # detector data
    try:
        reader = ReadGE(cfg.image_series.omegaseries)
    except IOError:
        logger.info("raw data not found, skipping reader init")
        reader = None

    try:
        ws.loadDetector(os.path.join(cwd, detector_fname))
        detector = ws.detector
    except IOError:
        logger.info(
            "old detector par file not found, skipping; \nalthough you may need this for find-orientations"
        )
        detector = None

    return pd, reader, detector
Example #2
0
def initialize_experiment(cfg):
    """takes a yml configuration file as input"""
    # make experiment
    ws = expt.Experiment()

    cwd = cfg.working_dir

    materials_fname = cfg.material.definitions
    material_name = cfg.material.active
    detector_fname = cfg.instrument.detector.parameters_old

    # load materials
    ws.loadMaterialList(os.path.join(cwd, materials_fname))
    ws.activeMaterial = material_name
    logger.info("setting active material to '%s'", material_name)

    pd = ws.activeMaterial.planeData

    image_start = cfg.image_series.images.start
    dark = cfg.image_series.dark
    flip = cfg.image_series.flip

    # detector data
    try:
        reader = ReadGE(
            [(f, image_start) for f in cfg.image_series.files],
            np.radians(cfg.image_series.omega.start),
            np.radians(cfg.image_series.omega.step),
            subtractDark=dark is not None,  # TODO: get rid of this
            dark=dark,
            doFlip=flip is not None,
            flipArg=flip,  # TODO: flip=flip
        )
    except IOError:
        logger.info("raw data not found, skipping reader init")
        reader = None

    try:
        ws.loadDetector(os.path.join(cwd, detector_fname))
        detector = ws.detector
    except IOError:
        logger.info(
            "old detector par file not found, skipping; \nalthough you may need this for find-orientations"
        )
        detector = None

    return pd, reader, detector
Example #3
0
def initialize_experiment(cfg_file):
    """
    """
    parser = SafeConfigParser()
    parser.read(cfg_file)

    hexrd_root = parser.get('base', 'hexrd_root')

    # make experiment
    ws = expt.Experiment(cfgFile=os.path.join(hexrd_root,
                                              "hexrd/data/materials.cfg"),
                         matFile=os.path.join(hexrd_root,
                                              "hexrd/data/all_materials.cfg"))

    working_dir = parser.get('base', 'working_dir')

    materials_fname = parser.get('material', 'materials_fname')
    material_name = parser.get('material', 'material_name')
    detector_fname = parser.get('detector', 'parfile_name')

    # MATERIALS
    ws.loadMaterialList(os.path.join(working_dir, materials_fname))
    ws.activeMaterial = material_name
    print "setting active material to '%s'" % (material_name)

    pd = ws.activeMaterial.planeData

    image_dir = parser.get('reader', 'image_dir')

    # number of files ASSUMING SEQUENTIAL SCAN NUMBERS
    file_start = parser.getint('reader', 'file_start')
    file_stop = parser.getint('reader', 'file_stop')
    file_suffix = parser.get('reader', 'file_suffix')
    nfiles = file_stop - file_start + 1
    zpad_str = '%0' + parser.get('reader', 'file_zpad') + 'd'  # int
    fileInfo = []
    for i in [file_start + i for i in range(nfiles)]:
        if file_suffix == '':
            image_filename = parser.get('reader',
                                        'file_root') + '_' + zpad_str % (i)
        else:
            image_filename = parser.get(
                'reader',
                'file_root') + '_' + zpad_str % (i) + '.' + file_suffix
        fileInfo.append(
            (os.path.join(image_dir,
                          image_filename), parser.getint('reader', 'nempty')))
    ome_start = parser.getfloat('reader', 'ome_start') * d2r
    ome_delta = parser.getfloat('reader', 'ome_delta') * d2r
    darkName = parser.get('reader', 'dark')
    if darkName.strip() == '':
        dark = None
        subtractDark = False
    else:
        # dark = os.path.join(image_dir, darkName)
        dark = darkName
        subtractDark = True
    doFlip = parser.getboolean('reader', 'doFlip')
    flipArg = parser.get('reader', 'flipArg')

    # make frame reader
    reader = ReadGE(fileInfo,
                    ome_start,
                    ome_delta,
                    subtractDark=subtractDark,
                    dark=dark,
                    doFlip=doFlip,
                    flipArg=flipArg)

    # DETECTOR
    ws.loadDetector(os.path.join(working_dir, detector_fname))

    return pd, reader, ws.detector
    def get_diffraction_angles(self):
        cfg = self.cfg
        logger = self.logger
        detector = self.detector

        # Number of cores for multiprocessing
        num_cores = cfg.multiprocessing

        # Initialize a new heXRD experiment
        ws = expt.Experiment()

        cwd = cfg.working_dir

        materials_fname = cfg.material.definitions
        material_name = cfg.material.active
        detector_fname = cfg.instrument.detector.parameters_old

        # load materials
        ws.loadMaterialList(os.path.join(cwd, materials_fname))
        mat_name_list = ws.matNames

        # Create an array of all the essential parameters to be
        # sent to parallel diffraction angle calculation routine
        fwd_model_input = []

        for xyz_i, mat_name_i, quat_i, defgrad_i in zip(
                self.ms_grid, self.ms_material_ids, self.ms_quaternions,
                self.ms_lat_defgrads):

            # Set chi tilt
            if detector.chiTilt is not None:
                chi = detector.chiTilt
            else:
                chi = 0.0

# Obtain all symmetric hkls for the material
            ws.activeMaterial = mat_name_i.strip()  #material_name

            hkls = ws.activeMaterial.planeData.getSymHKLs()
            hkls = np.transpose(np.hstack(hkls))
            # Rotational matrix from the orientation/quaternion
            rmat_c = rot.rotMatOfQuat(quat_i)
            # bmat
            bmat = ws.activeMaterial.planeData.latVecOps['B']
            wavelength = ws.activeMaterial.planeData.wavelength
            # Create a dictionary of inputs to be sent to the MP worker
            fwd_model_input.append({
                'chi': chi,
                'hkls': hkls,
                'rmat_c': rmat_c,
                'bmat': bmat,
                'wavelength': wavelength,
                'defgrad_i': defgrad_i
            })

        # Now we have the data, run eta, twoth, omega calculations in parallel
        logger.info(
            "Starting virtual diffraction calculations using %i processors",
            num_cores)
        synth_angles_MP_output = Parallel(n_jobs=num_cores, verbose=5)(
            delayed(get_diffraction_angles_MP)(fwd_model_input_i)
            for fwd_model_input_i in fwd_model_input)

        synth_angles = np.vstack(synth_angles_MP_output)

        self.synth_angles = synth_angles
        return synth_angles