#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "structure.h"
#include "util.h"
#include "harv.h"

#define IN -99998

extern REFLNS_SF reflns_sf;
extern PDBX_CRYSTAL_ALIGNMENT pdbx_crystal_alignment;
extern EXPTL_CRYSTAL exptl_crystal;
extern REFINE refine;
extern PDBX_REFINE pdbx_refine;
extern REFINE_LS_SHELL refine_ls_shell;
extern REFLNS_SHELL  reflns_shell ;
extern REFLNS  reflns ;
extern CELL cell ;
extern SYMMETRY symmetry;
extern COMPUTING computing;
extern PDBX_PHASING_DM  pdbx_phasing_dm;
extern PDBX_PHASING_DM_SHELL  pdbx_phasing_dm_shell;
extern PDBX_PHASING_MR  pdbx_phasing_MR;

extern PHASING_MAD phasing_mad;

extern PHASING_MIR_SHELL phasing_mir_shell;



void write_cell_symmetry(FILE *fout);
void write_reflns_shell(FILE *fout);
void write_reflns(FILE *fout);
void write_exptl_crystal(FILE *fout);
void write_index(FILE *fout);
void write_refine(FILE *fout);
void write_refine_ls_shell(FILE *fout);
void write_computing(FILE *fout);
void write_dm(FILE *fout);
void write_mr(FILE *fout);

void write_mad(FILE *fout);

void write_mmCIF(FILE *fout, int argc, char **argv)
{
    int i, index=0, scl=0,   dm=0, mr=0;
    for(i=1; i<argc; i++){
        if(!strcmp_case(argv[i], "-i")) index=1;
        else if (!strcmp_case(argv[i], "-s")) scl=1;
        else if (!strcmp_case(argv[i], "-d")) dm=1;
        else if (!strcmp_case(argv[i], "-m")) mr=1;
    }
    
    
    write_cell_symmetry(fout);
    if(scl<=0){
        write_reflns_shell(fout);
        write_reflns(fout);
    }
    
    if(index>0) write_index(fout);
    
    write_exptl_crystal(fout);
    write_refine(fout);
    write_refine_ls_shell(fout);
    write_computing(fout);
    if(dm>0)write_dm(fout);
    write_mad(fout);
    
    if(mr>0) write_mr(fout);
    
}

void write_mr(FILE *fout)
{
    
    fprintf(fout,"\n## Category = pdbx_phasing_MR\n");
    fprintf(fout,"\nloop_\n");
    fprintf(fout, "_pdbx_phasing_MR.entry_id\n");
    fprintf(fout, "_pdbx_phasing_MR.method_rotation\n");
    fprintf(fout, "_pdbx_phasing_MR.method_translation\n");
    fprintf(fout, "_pdbx_phasing_MR.model_details\n");
    fprintf(fout, "_pdbx_phasing_MR.R_factor\n");
    fprintf(fout, "_pdbx_phasing_MR.R_rigid_body\n");
    fprintf(fout, "_pdbx_phasing_MR.correlation_coeff_Fo_to_Fc\n");
    fprintf(fout, "_pdbx_phasing_MR.correlation_coeff_Io_to_Ic\n");
    fprintf(fout, "_pdbx_phasing_MR.d_res_high_rotation\n");
    fprintf(fout, "_pdbx_phasing_MR.d_res_low_rotation\n");
    fprintf(fout, "_pdbx_phasing_MR.d_res_high_translation\n");
    fprintf(fout, "_pdbx_phasing_MR.d_res_low_translation\n");
    fprintf(fout, "_pdbx_phasing_MR.d_res_high_fit\n");
    fprintf(fout, "_pdbx_phasing_MR.d_res_low_fit\n");
    fprintf(fout, "_pdbx_phasing_MR.packing\n");
    fprintf(fout, "_pdbx_phasing_MR.reflns_percent_rotation\n");
    fprintf(fout, "_pdbx_phasing_MR.reflns_percent_translation\n");
    fprintf(fout, "_pdbx_phasing_MR.sigma_F_rotation\n");
    fprintf(fout, "_pdbx_phasing_MR.sigma_F_translation\n");
    fprintf(fout, "_pdbx_phasing_MR.sigma_I_rotation\n");
    fprintf(fout, "_pdbx_phasing_MR.sigma_I_translation\n");
    
    fprintf(fout, "_pdbx_phasing_MR.angle_alpha\n");
    fprintf(fout, "_pdbx_phasing_MR.angle_beta\n");
    fprintf(fout, "_pdbx_phasing_MR.angle_gamma\n");
    fprintf(fout, "_pdbx_phasing_MR.Cartn_x\n");
    fprintf(fout, "_pdbx_phasing_MR.Cartn_y\n");
    fprintf(fout, "_pdbx_phasing_MR.Cartn_z\n");
    fprintf(fout, "_pdbx_phasing_MR.fract_x\n");
    fprintf(fout, "_pdbx_phasing_MR.fract_y\n");
    fprintf(fout, "_pdbx_phasing_MR.fract_z\n");

    fprintf(fout," \"%s\" ",DATA_BLOCK);
    (pdbx_phasing_MR.method_rotation[0]!='?') ? fprintf(fout," \"%s\" ",pdbx_phasing_MR.method_rotation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.method_translation[0]!='?') ? fprintf(fout," \"%s\" ",pdbx_phasing_MR.method_translation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.model_details[0]!='?') ? fprintf(fout," \"%s\" ",pdbx_phasing_MR.model_details) : fprintf(fout," ? ");
    (pdbx_phasing_MR.R_factor >INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.R_factor) : fprintf(fout," ? ");
    (pdbx_phasing_MR.R_rigid_body>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.R_rigid_body) : fprintf(fout," ? ");
    (pdbx_phasing_MR.correlation_coeff_Fo_to_Fc>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.correlation_coeff_Fo_to_Fc) : fprintf(fout," ? ");
    (pdbx_phasing_MR.correlation_coeff_Io_to_Ic>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.correlation_coeff_Io_to_Ic) : fprintf(fout," ? ");
    (pdbx_phasing_MR.d_res_high_rotation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.d_res_high_rotation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.d_res_low_rotation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.d_res_low_rotation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.d_res_high_translation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.d_res_high_translation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.d_res_low_translation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.d_res_low_translation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.d_res_high_fit>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.d_res_high_fit) : fprintf(fout," ? ");
    (pdbx_phasing_MR.d_res_low_fit>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.d_res_low_fit) : fprintf(fout," ? ");
    (pdbx_phasing_MR.packing>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.packing) : fprintf(fout," ? ");
    (pdbx_phasing_MR.reflns_percent_rotation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.reflns_percent_rotation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.reflns_percent_translation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.reflns_percent_translation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.sigma_F_rotation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.sigma_F_rotation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.sigma_F_translation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.sigma_F_translation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.sigma_I_rotation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.sigma_I_rotation) : fprintf(fout," ? ");
    (pdbx_phasing_MR.sigma_I_translation>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.sigma_I_translation) : fprintf(fout," ? ");
    
    (pdbx_phasing_MR.angle_alpha>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.angle_alpha) : fprintf(fout," ? ");
    (pdbx_phasing_MR.angle_beta>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.angle_beta) : fprintf(fout," ? ");
    (pdbx_phasing_MR.angle_gamma>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.angle_gamma) : fprintf(fout," ? ");
    (pdbx_phasing_MR.Cartn_x>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.Cartn_x) : fprintf(fout," ? ");
    (pdbx_phasing_MR.Cartn_y>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.Cartn_y) : fprintf(fout," ? ");
    (pdbx_phasing_MR.Cartn_z>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.Cartn_z) : fprintf(fout," ? ");
    (pdbx_phasing_MR.fract_x>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.fract_x) : fprintf(fout," ? ");
    (pdbx_phasing_MR.fract_y>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.fract_y) : fprintf(fout," ? ");
    (pdbx_phasing_MR.fract_z>INI) ? fprintf(fout," %.3f ",pdbx_phasing_MR.fract_z) : fprintf(fout," ? ");
    
    fprintf(fout, "\n");
}

void write_dm(FILE *fout)
{
    int i;

    
    fprintf(fout,"_pdbx_phasing_dm.entry_id \"%s\"\n", DATA_BLOCK);
    
    if(pdbx_phasing_dm.mask_type[0] != '?')
        fprintf(fout,"_pdbx_phasing_dm.mask_type \"%s\"\n", pdbx_phasing_dm.mask_type);
    
    if(pdbx_phasing_dm.method[0] != '?')
        fprintf(fout,"_pdbx_phasing_dm.method \"%s\"\n", pdbx_phasing_dm.method);

    
    if(pdbx_phasing_dm.delta_phi_final>INI)
        fprintf(fout,"_pdbx_phasing_dm.delta_phi_final %.3f\n", pdbx_phasing_dm.delta_phi_final);
    
    if(pdbx_phasing_dm.delta_phi_initial>INI)
        fprintf(fout,"_pdbx_phasing_dm.delta_phi_initial %.3f\n", pdbx_phasing_dm.delta_phi_initial);
    
    if(pdbx_phasing_dm.fom_acentric>INI)
        fprintf(fout,"_pdbx_phasing_dm.fom_acentric %.3f\n", pdbx_phasing_dm.fom_acentric);
    
    if(pdbx_phasing_dm.fom_centric>INI)
        fprintf(fout,"_pdbx_phasing_dm.fom_centric %.3f\n", pdbx_phasing_dm.fom_centric);
    
    if(pdbx_phasing_dm.fom>INI)
        fprintf(fout,"_pdbx_phasing_dm.fom %.3f\n", pdbx_phasing_dm.fom);
    
    if(pdbx_phasing_dm.reflns_acentric>INI)
        fprintf(fout,"_pdbx_phasing_dm.reflns_acentric %d\n", pdbx_phasing_dm.reflns_acentric);
    
    if(pdbx_phasing_dm.reflns_centric>INI)
        fprintf(fout,"_pdbx_phasing_dm.reflns_centric %d\n", pdbx_phasing_dm.reflns_centric);
    
    if(pdbx_phasing_dm.reflns>INI)
        fprintf(fout,"_pdbx_phasing_dm.reflns %d\n", pdbx_phasing_dm.reflns);
    
    if(pdbx_phasing_dm.mask_radius>INI)
        fprintf(fout,"_pdbx_phasing_dm.mask_radius %.3f\n", pdbx_phasing_dm.mask_radius);
    if(pdbx_phasing_dm.d_res_high>INI)
        fprintf(fout,"_pdbx_phasing_dm.d_res_high %.3f\n", pdbx_phasing_dm.d_res_high);
    
    if(pdbx_phasing_dm.d_res_low>INI)
        fprintf(fout,"_pdbx_phasing_dm.d_res_low %.3f\n", pdbx_phasing_dm.d_res_low);
    if(pdbx_phasing_dm.protein_percent_sol>INI)
        fprintf(fout,"_pdbx_phasing_dm.protein_percent_sol %.3f\n", pdbx_phasing_dm.protein_percent_sol);
    
    if(pdbx_phasing_dm.protein_min_density>INI)
        fprintf(fout,"_pdbx_phasing_dm.protein_min_density %.3f\n", pdbx_phasing_dm.protein_min_density);
    if(pdbx_phasing_dm.protein_max_density>INI)
        fprintf(fout,"_pdbx_phasing_dm.protein_max_density %.3f\n", pdbx_phasing_dm.protein_max_density);
    
    if(pdbx_phasing_dm.protein_mean_density>INI)
        fprintf(fout,"_pdbx_phasing_dm.protein_mean_density %.3f\n", pdbx_phasing_dm.protein_mean_density);
    if(pdbx_phasing_dm.protein_mean_density_esd>INI)
        fprintf(fout,"_pdbx_phasing_dm.protein_mean_density_esd %.3f\n", pdbx_phasing_dm.protein_mean_density_esd);
    
    if(pdbx_phasing_dm.solvent_percent_sol>INI)
        fprintf(fout,"_pdbx_phasing_dm.solvent_percent_sol %.3f\n", pdbx_phasing_dm.solvent_percent_sol);
    if(pdbx_phasing_dm.solvent_min_density>INI)
        fprintf(fout,"_pdbx_phasing_dm.solvent_min_density %.3f\n", pdbx_phasing_dm.solvent_min_density);
    
    if(pdbx_phasing_dm.solvent_max_density>INI)
        fprintf(fout,"_pdbx_phasing_dm.solvent_max_density %.3f\n", pdbx_phasing_dm.solvent_max_density);
    if(pdbx_phasing_dm.solvent_mean_density>INI)
        fprintf(fout,"_pdbx_phasing_dm.solvent_mean_density %.3f\n", pdbx_phasing_dm.solvent_mean_density);
    
    if(pdbx_phasing_dm.solvent_mean_density_esd>INI)
        fprintf(fout,"_pdbx_phasing_dm.solvent_mean_density_esd %.3f\n", pdbx_phasing_dm.solvent_mean_density_esd);

    if(pdbx_phasing_dm.prior_map_CC_acentric>INI)
        fprintf(fout,"_pdbx_phasing_dm.prior_map_CC_acentric %.3f\n", pdbx_phasing_dm.prior_map_CC_acentric);

    if(pdbx_phasing_dm.prior_map_CC_centric>INI)
        fprintf(fout,"_pdbx_phasing_dm.prior_map_CC_centric %.3f\n", pdbx_phasing_dm.prior_map_CC_centric);

    if(pdbx_phasing_dm.prior_map_CC>INI)
        fprintf(fout,"_pdbx_phasing_dm.prior_map_CC %.3f\n", pdbx_phasing_dm.prior_map_CC);

    if(pdbx_phasing_dm_shell.number_bin>=1){
        fprintf(fout,"\n\n##### Density modification #####\n");
        fprintf(fout,"loop_\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.d_res_high\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.d_res_low\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.delta_phi_final\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.delta_phi_initial\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.fom_acentric\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.fom_centric\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.fom\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.reflns_acentric\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.reflns_centric\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.reflns\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.prior_map_CC_acentric\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.prior_map_CC_centric\n");
        fprintf(fout,"_pdbx_phasing_dm_shell.prior_map_CC\n");
        for(i=0; i<pdbx_phasing_dm_shell.number_bin; i++){
            (pdbx_phasing_dm_shell.d_res_high[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.d_res_high[i]) : fprintf(fout," ?\n");
         
            (pdbx_phasing_dm_shell.d_res_low[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.d_res_low[i]) : fprintf(fout," ? ");
         
            (pdbx_phasing_dm_shell.delta_phi_final[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.delta_phi_final[i]) : fprintf(fout," ? ");
         
            (pdbx_phasing_dm_shell.delta_phi_initial[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.delta_phi_initial[i]) : fprintf(fout," ? ");
         
            (pdbx_phasing_dm_shell.fom_acentric[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.fom_acentric[i]) : fprintf(fout," ? ");
         
            (pdbx_phasing_dm_shell.fom_centric[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.fom_centric[i]) : fprintf(fout," ? ");
         
            (pdbx_phasing_dm_shell.fom[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.fom[i]) : fprintf(fout," ? ");
         
            (pdbx_phasing_dm_shell.reflns_acentric[i]>0)?
                fprintf(fout," %d ", pdbx_phasing_dm_shell.reflns_acentric[i]) : fprintf(fout," ? ");

            (pdbx_phasing_dm_shell.reflns_centric[i]>0)?
                fprintf(fout," %d ", pdbx_phasing_dm_shell.reflns_centric[i]) : fprintf(fout," ? ");
         
            (pdbx_phasing_dm_shell.reflns[i]>0)?
                fprintf(fout," %d ", pdbx_phasing_dm_shell.reflns[i]) : fprintf(fout," ? ");
            
            (pdbx_phasing_dm_shell.prior_map_CC_acentric[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.prior_map_CC_acentric[i]) : fprintf(fout," ? ");
            
            (pdbx_phasing_dm_shell.prior_map_CC_centric[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.prior_map_CC_centric[i]) : fprintf(fout," ? ");
            
            (pdbx_phasing_dm_shell.prior_map_CC[i]>0)?
                fprintf(fout," %.3f ", pdbx_phasing_dm_shell.prior_map_CC[i]) : fprintf(fout," ? ");
            
            fprintf(fout,"\n");
            
        }
    }
    

}
void write_mad(FILE *fout)
{
 //_phasing_mad
    if(phasing_mad.pdbx_d_res_high)
        fprintf(fout, "_phasing_mad.pdbx_d_res_high  '%.2f'\n", phasing_mad.pdbx_d_res_high);
    
    if(phasing_mad.pdbx_d_res_low)
        fprintf(fout, "_phasing_mad.pdbx_d_res_low  '%.2f'\n", phasing_mad.pdbx_d_res_low);


}


void write_cell_symmetry(FILE *fout)
{
 //cell
    if(cell.length_a>0) {
        fprintf(fout,"#\n");
    
        fprintf(fout,"_cell.length_a ");
        (cell.length_a>0) ? fprintf(fout," %8.3f\n", cell.length_a) : fprintf(fout,"?\n");
    
        fprintf(fout,"_cell.length_b ");
        (cell.length_b>0) ? fprintf(fout," %8.3f\n", cell.length_b) : fprintf(fout,"?\n");

        fprintf(fout,"_cell.length_c ");
        (cell.length_c>0) ? fprintf(fout," %8.3f\n", cell.length_c) : fprintf(fout,"?\n");

        fprintf(fout,"_cell.angle_alpha  ");
        (cell.angle_alpha>0) ? fprintf(fout," %8.3f\n", cell.angle_alpha ) : fprintf(fout,"?\n");

        fprintf(fout,"_cell.angle_beta  ");
        (cell.angle_beta>0) ? fprintf(fout," %8.3f\n", cell.angle_beta ) : fprintf(fout,"?\n");

        fprintf(fout,"_cell.angle_gamma   ");
        (cell.angle_gamma >0) ? fprintf(fout," %8.3f\n", cell.angle_gamma  ) : fprintf(fout,"?\n");
    }

    
// symmetry    
    if(symmetry.Int_Tables_number>0 || strlen(symmetry.space_group_name_H_M)>1){
        
        fprintf(fout,"#\n");
        fprintf(fout,"_symmetry.Int_Tables_number  ");
        (symmetry.Int_Tables_number>0) ?
            fprintf(fout," %d\n", symmetry.Int_Tables_number) : fprintf(fout,"?\n");
    
        fprintf(fout,"_symmetry.space_group_name_H-M  ");
        fprintf(fout," '%s' \n", symmetry.space_group_name_H_M);
    }
}


void write_computing(FILE *fout)
{
    
    fprintf(fout,"_computing.entry_id  \"%s\" \n", DATA_BLOCK);
    fprintf(fout,"_computing.structure_refinement  \"%s\" \n", computing.structure_refinement);
    fprintf(fout,"_computing.structure_solution  \"%s\" \n", computing.structure_solution);
    fprintf(fout,"_computing.pdbx_density_modification  \"%s\" \n", computing.pdbx_density_modification);
    fprintf(fout,"_computing.data_reduction  \"%s\" \n", computing.data_reduction);
    fprintf(fout,"_computing.data_collection  \"%s\" \n", computing.data_collection);
    fprintf(fout,"_computing.cell_refinement  \"%s\" \n", computing.cell_refinement);
}

    


void write_index(FILE *fout)
{
    const char *items[19] =
        {
            "crystal_id",
            "xbeam",
            "xbeam_esd",
            "ybeam",
            "ybeam_esd",
            "crysx_spindle",
            "crysx_spindle_esd",
            "crysy_vertical",
            "crysy_vertical_esd",
            "crysz_beam",
            "crysz_beam_esd",
            "crystal_to_detector_distance",
            "crystal_to_detector_distance_esd",
            "crossfire_y",
            "crossfire_y_esd",
            "crossfire_x",
            "crossfire_x_esd",
            "crossfire_xy",
            "crossfire_xy_esd"
        };
    print_mmcif_head(fout,"_pdbx_crystal_alignment", items, 19);
    (pdbx_crystal_alignment.crystal_id>IN) ?fprintf(fout," %d ",pdbx_crystal_alignment.crystal_id): fprintf(fout," 1 ");
    (pdbx_crystal_alignment.xbeam>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.xbeam): fprintf(fout," ? ");
    (pdbx_crystal_alignment.xbeam_esd>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.xbeam_esd): fprintf(fout," ? ");
    (pdbx_crystal_alignment.ybeam>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.ybeam): fprintf(fout," ? ");
    (pdbx_crystal_alignment.ybeam_esd>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.ybeam_esd): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crysx_spindle>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crysx_spindle): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crysx_spindle_esd>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crysx_spindle_esd): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crysy_vertical>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crysy_vertical): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crysy_vertical_esd>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crysy_vertical_esd): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crysz_beam>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crysz_beam): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crysz_beam_esd>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crysz_beam_esd): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crystal_to_detector_distance>IN) ?
        fprintf(fout," %.3f ",pdbx_crystal_alignment.crystal_to_detector_distance): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crystal_to_detector_distance_esd>IN) ?
        fprintf(fout," %.3f ",pdbx_crystal_alignment.crystal_to_detector_distance_esd): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crossfire_y>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crossfire_y): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crossfire_y_esd>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crossfire_y_esd): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crossfire_x>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crossfire_x): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crossfire_x_esd>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crossfire_x_esd): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crossfire_xy>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crossfire_xy): fprintf(fout," ? ");
    (pdbx_crystal_alignment.crossfire_xy_esd>IN) ?fprintf(fout," %.3f ",pdbx_crystal_alignment.crossfire_xy_esd): fprintf(fout," ? ");

    fprintf(fout,"\n");
    
};


            
    
void write_exptl_crystal(FILE *fout)
{
    const char *items[12] =
        {
            "id",
            "pdbx_mosaicity",
            "pdbx_mosaicity_esd",
            "density_Matthews",
            "density_diffrn",
            "density_meas",
            "density_meas_temp",
            "density_percent_sol",
            "size_max",
            "size_mid",
            "size_min",
            "size_rad"
        };
    
    print_mmcif_head(fout,"_exptl_crystal", items, 12);
    
    (exptl_crystal.id>INI)? fprintf(fout," %d ",exptl_crystal.id):fprintf(fout," 1 ");
    (exptl_crystal.pdbx_mosaicity>INI)? fprintf(fout," %.3f  ",exptl_crystal.pdbx_mosaicity):fprintf(fout," ? ");
    (exptl_crystal.pdbx_mosaicity_esd>INI)? fprintf(fout," %.3f ",exptl_crystal.pdbx_mosaicity_esd):fprintf(fout," ? ");
    (exptl_crystal.density_Matthews>INI)? fprintf(fout," %.3f ",exptl_crystal.density_Matthews):fprintf(fout," ? ");
    (exptl_crystal.density_diffrn>INI)? fprintf(fout," %.3f ",exptl_crystal.density_diffrn):fprintf(fout," ? ");
    (exptl_crystal.density_meas>INI)? fprintf(fout," %.3f ",exptl_crystal.density_meas):fprintf(fout," ? ");
    (exptl_crystal.density_meas_temp>INI)? fprintf(fout," %.3f ",exptl_crystal.density_meas_temp):fprintf(fout," ? ");
    (exptl_crystal.density_percent_sol>INI)? fprintf(fout," %.3f ",exptl_crystal.density_percent_sol):fprintf(fout," ? ");
    (exptl_crystal.size_max)>INI? fprintf(fout," %.3f ",exptl_crystal.size_max):fprintf(fout," ? ");
    (exptl_crystal.size_mid>INI)? fprintf(fout," %.3f ",exptl_crystal.size_mid):fprintf(fout," ? ");
    (exptl_crystal.size_min>INI)? fprintf(fout," %.3f ",exptl_crystal.size_min):fprintf(fout," ? ");
    (exptl_crystal.size_rad>INI)? fprintf(fout," %.3f ",exptl_crystal.size_rad):fprintf(fout," ? ");
    
    fprintf(fout,"\n");
    
};
    
void write_refine(FILE *fout)
{
   fprintf(fout,"#\n");
   
   if(refine.ls_d_res_high >-9998)
       fprintf(fout,"_refine.ls_d_res_high  %.3f\n", refine.ls_d_res_high);

   if(refine.ls_d_res_low >-9998)
       fprintf(fout,"_refine.ls_d_res_low  %.3f\n", refine.ls_d_res_low);
   
   if(refine.pdbx_ls_sigma_F  >-9998)
       fprintf(fout,"_refine.pdbx_ls_sigma_F  '%.2f'\n", refine.pdbx_ls_sigma_F);
   
   if(refine.pdbx_data_cutoff_high_absF >-9998)
       fprintf(fout,"_refine.pdbx_data_cutoff_high_absF  %.3f\n", refine.pdbx_data_cutoff_high_absF);
   
   if(refine.pdbx_data_cutoff_low_absF >-9998)
       fprintf(fout,"_refine.pdbx_data_cutoff_low_absF  %.3f\n", refine.pdbx_data_cutoff_low_absF);
   
   if(refine.ls_percent_reflns_obs >-9998)
       fprintf(fout,"_refine.ls_percent_reflns_obs  %.3f\n", refine.ls_percent_reflns_obs);
   
   if(refine.ls_number_reflns_obs >-9998)
       fprintf(fout,"_refine.ls_number_reflns_obs  %d\n", refine.ls_number_reflns_obs);

   if(refine.ls_number_reflns_all >-9998)
       fprintf(fout,"_refine.ls_number_reflns_all  %d\n", refine.ls_number_reflns_all);
   
   if(refine.pdbx_ls_cross_valid_method[0] != '?')
       fprintf(fout,"_refine.pdbx_ls_cross_valid_method  \n;%s\n; \n", refine.pdbx_ls_cross_valid_method);
   
   if(refine.pdbx_R_Free_selection_details[0] !='?')
       fprintf(fout,"_refine.pdbx_R_Free_selection_details  \n;%s\n; \n", refine.pdbx_R_Free_selection_details);
   if(refine.details[0] !='?')
       fprintf(fout,"_refine.details \n;%s\n;\n", refine.details);
   
   if(refine.ls_R_factor_all >-9998)
       fprintf(fout,"_refine.ls_R_factor_all  %.3f\n", refine.ls_R_factor_all);
   
   if(refine.ls_R_factor_R_work >-9998)
       fprintf(fout,"_refine.ls_R_factor_R_work  %.3f\n", refine.ls_R_factor_R_work);
   
   if(refine.ls_R_factor_R_free >-9998)
       fprintf(fout,"_refine.ls_R_factor_R_free  %.3f\n", refine.ls_R_factor_R_free);
   
   if(refine.ls_percent_reflns_R_free >-9998)
       fprintf(fout,"_refine.ls_percent_reflns_R_free  %.3f\n", refine.ls_percent_reflns_R_free);
   
   if(refine.ls_number_reflns_R_free >-9998)
       fprintf(fout,"_refine.ls_number_reflns_R_free  %d\n", refine.ls_number_reflns_R_free);

   if(refine.ls_number_reflns_R_work >0)
       fprintf(fout,"_refine.ls_number_reflns_R_work  %d\n", refine.ls_number_reflns_R_work);
   
   if(refine.ls_R_factor_R_free_error >-9998)
       fprintf(fout,"_refine.ls_R_factor_R_free_error  %.3f\n", refine.ls_R_factor_R_free_error);

   if(refine.B_iso_mean >-9998)
       fprintf(fout,"_refine.B_iso_mean  %.3f\n", refine.B_iso_mean);

   if(refine.solvent_model_param_bsol >-9998)
       fprintf(fout,"_refine.solvent_model_param_bsol  %.3f\n", refine.solvent_model_param_bsol);

   if(refine.solvent_model_param_ksol >-9998)
       fprintf(fout,"_refine.solvent_model_param_ksol  %.3f\n", refine.solvent_model_param_ksol);

   if(refine.pdbx_isotropic_thermal_model[0] != '?' )
       fprintf(fout,"_refine.pdbx_isotropic_thermal_model  \n;%s\n;\n", refine.pdbx_isotropic_thermal_model);

   if(refine.aniso_B11 >-9998)
       fprintf(fout,"_refine.aniso_B[1][1]  %.3f\n", refine.aniso_B11);

   if(refine.aniso_B22 >-9998)
       fprintf(fout,"_refine.aniso_B[2][2]  %.3f\n", refine.aniso_B22);

   if(refine.aniso_B33 >-9998)
       fprintf(fout,"_refine.aniso_B[3][3]  %.3f\n", refine.aniso_B33);

   if(refine.aniso_B12 >-9998)
       fprintf(fout,"_refine.aniso_B[1][2]  %.3f\n", refine.aniso_B12);

   if(refine.aniso_B13 >-9998)
       fprintf(fout,"_refine.aniso_B[1][3]  %.3f\n", refine.aniso_B13);

   if(refine.aniso_B23 >-9998)
       fprintf(fout,"_refine.aniso_B[2][3]  %.3f\n", refine.aniso_B23);

   if(refine.correlation_coeff_Fo_to_Fc >-9998)
       fprintf(fout,"_refine.correlation_coeff_Fo_to_Fc  %.3f\n", refine.correlation_coeff_Fo_to_Fc);

   if(refine.correlation_coeff_Fo_to_Fc_free >-9998)
       fprintf(fout,"_refine.correlation_coeff_Fo_to_Fc_free  %.3f\n", refine.correlation_coeff_Fo_to_Fc_free);

   if(refine.overall_SU_R_Cruickshank_DPI >-9998)
       fprintf(fout,"_refine.overall_SU_R_Cruickshank_DPI  %.3f\n", refine.overall_SU_R_Cruickshank_DPI);

   if(refine.pdbx_overall_ESU_R >-9998)
       fprintf(fout,"_refine.pdbx_overall_ESU_R  %.3f\n", refine.pdbx_overall_ESU_R);

   if(refine.pdbx_overall_ESU_R_Free>-9998)
       fprintf(fout,"_refine.pdbx_overall_ESU_R_Free  %.3f\n", refine.pdbx_overall_ESU_R_Free);

   if(refine.overall_SU_ML >-9998)
       fprintf(fout,"_refine.overall_SU_ML  %.3f\n", refine.overall_SU_ML);

   if(refine.overall_SU_B >-9998)
       fprintf(fout,"_refine.overall_SU_B  %.3f\n", refine.overall_SU_B);

   if(refine.solvent_model_details[0] !='?')
       fprintf(fout,"_refine.solvent_model_details  \n;%s\n;\n", refine.solvent_model_details);

   if(refine.pdbx_solvent_vdw_probe_radii >-9998)
       fprintf(fout,"_refine.pdbx_solvent_vdw_probe_radii  %.3f\n", refine.pdbx_solvent_vdw_probe_radii);

   if(refine.pdbx_solvent_ion_probe_radii >-9998)
       fprintf(fout,"_refine.pdbx_solvent_ion_probe_radii  %.3f\n", refine.pdbx_solvent_ion_probe_radii);

   if(refine.pdbx_solvent_shrinkage_radii >-9998)
       fprintf(fout,"_refine.pdbx_solvent_shrinkage_radii  %.3f\n", refine.pdbx_solvent_shrinkage_radii);

   if(refine.ls_number_parameters >-9998)
       fprintf(fout,"_refine.ls_number_parameters  %d\n", refine.ls_number_parameters);
   
   if(refine.ls_number_restraints >-9998)
       fprintf(fout,"_refine.ls_number_restraints  %d\n", refine.ls_number_restraints);
   
   if(refine.pdbx_starting_model[0] !='?')
       fprintf(fout,"_refine.pdbx_starting_mode  \n;%s\n;\n", refine.pdbx_starting_model);
   
   if(refine.pdbx_method_to_determine_struct[0] !='?')
       fprintf(fout,"_refine.pdbx_method_to_determine_struct  \n;%s\n;\n",
               refine.pdbx_method_to_determine_struct );

   if(refine.pdbx_stereochemistry_target_values [0] !='?')
       fprintf(fout,"_refine.pdbx_stereochemistry_target_values   \n;%s\n;\n",
               refine.pdbx_stereochemistry_target_values );

   if(refine.pdbx_stereochem_target_val_spec_case[0] !='?')
       fprintf(fout,"_refine.pdbx_stereochem_target_val_spec_case  \n;%s\n;\n",
               refine.pdbx_stereochem_target_val_spec_case);

   fprintf(fout,"#\n");  //for pdbx_refine
   if(pdbx_refine.R_factor_all_4sig_cutoff >INI)
       fprintf(fout,"_pdbx_refine.R_factor_all_4sig_cutoff %.3f\n", pdbx_refine.R_factor_all_4sig_cutoff); 
   if(pdbx_refine.R_factor_all_no_cutoff >INI)
       fprintf(fout,"_pdbx_refine.R_factor_all_no_cutoff %.3f\n", pdbx_refine.R_factor_all_no_cutoff); 
   if(pdbx_refine.R_factor_obs_4sig_cutoff >INI)
       fprintf(fout,"_pdbx_refine.R_factor_obs_4sig_cutoff %.3f\n", pdbx_refine.R_factor_obs_4sig_cutoff); 
   if(pdbx_refine.R_factor_obs_no_cutoff >INI)
       fprintf(fout,"_pdbx_refine.R_factor_obs_no_cutoff %.3f\n", pdbx_refine.R_factor_obs_no_cutoff); 
   if(pdbx_refine.free_R_factor_4sig_cutoff >INI)
       fprintf(fout,"_pdbx_refine.free_R_factor_4sig_cutoff %.3f\n", pdbx_refine.free_R_factor_4sig_cutoff); 
   if(pdbx_refine.free_R_factor_no_cutoff >INI)
       fprintf(fout,"_pdbx_refine.free_R_factor_no_cutoff %.3f\n", pdbx_refine.free_R_factor_no_cutoff); 
   if(pdbx_refine.free_R_val_4sig_cutoff >INI)
       fprintf(fout,"_pdbx_refine.free_R_val_4sig_cutoff %.3f\n", pdbx_refine.free_R_val_4sig_cutoff); 
   if(pdbx_refine.free_R_val_test_set_ct_4sig_cutoff >INI)
       fprintf(fout,"_pdbx_refine.free_R_val_test_set_ct_4sig_cutoff %d\n", pdbx_refine.free_R_val_test_set_ct_4sig_cutoff); 
   if(pdbx_refine.free_R_val_test_set_ct_no_cutoff >INI)
       fprintf(fout,"_pdbx_refine.free_R_val_test_set_ct_no_cutoff %d\n", pdbx_refine.free_R_val_test_set_ct_no_cutoff); 
   if(pdbx_refine.free_R_val_test_set_size_perc_4sig_cutoff >INI)
       fprintf(fout,"_pdbx_refine.free_R_val_test_set_size_perc_4sig_cutoff %.3f\n", pdbx_refine.free_R_val_test_set_size_perc_4sig_cutoff); 
   if(pdbx_refine.free_R_val_test_set_size_perc_no_cutoff >INI)
       fprintf(fout,"_pdbx_refine.free_R_val_test_set_size_perc_no_cutoff %.3f\n", pdbx_refine.free_R_val_test_set_size_perc_no_cutoff); 
   if(pdbx_refine.number_reflns_obs_4sig_cutoff >INI)
       fprintf(fout,"_pdbx_refine.number_reflns_obs_4sig_cutoff %d\n", pdbx_refine.number_reflns_obs_4sig_cutoff); 
   if(pdbx_refine.number_reflns_obs_no_cutoff >INI)
       fprintf(fout,"_pdbx_refine.number_reflns_obs_no_cutoff %d\n", pdbx_refine.number_reflns_obs_no_cutoff); 

}

void write_refine_ls_shell(FILE *fout)
{
    int m;

    if(refine_ls_shell.nbin<=0) return;
       
    fprintf(fout,"#\n");
    fprintf(fout,"loop_\n");
    fprintf(fout,"_refine_ls_shell.d_res_high\n");
    fprintf(fout,"_refine_ls_shell.d_res_low\n");
    fprintf(fout,"_refine_ls_shell.pdbx_total_number_of_bins_used\n");
    fprintf(fout,"_refine_ls_shell.percent_reflns_obs\n");
    fprintf(fout,"_refine_ls_shell.number_reflns_R_work\n");
    fprintf(fout,"_refine_ls_shell.R_factor_R_work\n");
    fprintf(fout,"_refine_ls_shell.R_factor_R_free\n");
    fprintf(fout,"_refine_ls_shell.percent_reflns_R_free\n");
    fprintf(fout,"_refine_ls_shell.number_reflns_R_free\n");
    fprintf(fout,"_refine_ls_shell.R_factor_R_free_error\n");
    
    for(m=0; m<refine_ls_shell.nbin; m++){
    
        (refine_ls_shell.d_res_high[m] >-9998) ?
            fprintf(fout,"%.3f  ", refine_ls_shell.d_res_high[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.d_res_low[m] > 0) ?
            fprintf(fout,"%.3f  ", refine_ls_shell.d_res_low[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.pdbx_total_number_of_bins_used[m] > 0) ?
            fprintf(fout,"%d  ", refine_ls_shell.pdbx_total_number_of_bins_used[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.percent_reflns_obs[m] > 0) ?
            fprintf(fout,"%.3f  ", refine_ls_shell.percent_reflns_obs[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.number_reflns_R_work[m] > 0) ?
            fprintf(fout,"%d  ", refine_ls_shell.number_reflns_R_work[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.R_factor_R_work[m] > 0) ?
            fprintf(fout,"%.3f  ", refine_ls_shell.R_factor_R_work[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.R_factor_R_free[m] > 0) ?
            fprintf(fout,"%.3f  ", refine_ls_shell.R_factor_R_free[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.percent_reflns_R_free[m] > 0) ?
            fprintf(fout,"%.3f  ", refine_ls_shell.percent_reflns_R_free[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.number_reflns_R_free[m] > 0) ?
            fprintf(fout,"%d  ", refine_ls_shell.number_reflns_R_free[m]) : fprintf(fout,"?  ");
    
        (refine_ls_shell.R_factor_R_free_error[m] > 0  ) ?
            fprintf(fout,"%.3f  ", refine_ls_shell.R_factor_R_free_error[m]) : fprintf(fout,"?  ");
        fprintf(fout,"\n"); 
    }
    
}
        
void write_reflns_shell(FILE *fout)
{
    int m;

    if(reflns_shell.nbin<=0) return;
        
    fprintf(fout, "\n# statistics from LOG files (_reflns.shells)\n");
    fprintf(fout, "\nloop_\n");
    
    fprintf(fout, "_reflns_shell.d_res_high\n");
    fprintf(fout, "_reflns_shell.d_res_low\n");

    fprintf(fout, "_reflns_shell.number_measured_all\n");
    fprintf(fout, "_reflns_shell.number_measured_obs\n");
    fprintf(fout, "_reflns_shell.number_possible\n");
    fprintf(fout, "_reflns_shell.number_unique_all\n");
    fprintf(fout, "_reflns_shell.number_unique_obs \n");
    fprintf(fout, "_reflns_shell.pdbx_rejects\n");

    fprintf(fout, "_reflns_shell.Rmerge_F_all\n");
    fprintf(fout, "_reflns_shell.Rmerge_F_obs\n");
    fprintf(fout, "_reflns_shell.Rmerge_I_all\n");
    fprintf(fout, "_reflns_shell.Rmerge_I_obs\n");

    fprintf(fout, "_reflns_shell.meanI_over_sigI_all\n");
    fprintf(fout, "_reflns_shell.meanI_over_sigI_obs \n");
    
    fprintf(fout, "_reflns_shell.pdbx_Rsym_value \n");
    fprintf(fout, "_reflns_shell.pdbx_chi_squared\n");
    fprintf(fout, "_reflns_shell.pdbx_redundancy\n");
    fprintf(fout, "_reflns_shell.percent_possible_all\n");
    fprintf(fout, "_reflns_shell.percent_possible_obs\n");
        
        
   
    
    for(m=0; m<reflns_shell.nbin; m++){

        (reflns_shell.d_res_high[m]>0) ?
            fprintf(fout," %.2f ", reflns_shell.d_res_high[m]) : fprintf(fout," ? ");
                
        (reflns_shell.d_res_low[m]>0) ?
            fprintf(fout," %.2f ", reflns_shell.d_res_low[m]) : fprintf(fout," ? ");
        

        (reflns_shell.number_measured_all[m]>0) ?
            fprintf(fout," %d ", reflns_shell.number_measured_all[m]): fprintf(fout," ? ");

        (reflns_shell.number_measured_obs[m]>0) ?
            fprintf(fout," %d ", reflns_shell.number_measured_obs[m]): fprintf(fout," ? ");

        (reflns_shell.number_possible[m]>0) ?
            fprintf(fout," %d ",reflns_shell.number_possible[m]): fprintf(fout," ? ");
        
        (reflns_shell.number_unique_all[m]>0) ?
            fprintf(fout," %d ", reflns_shell.number_unique_all[m]): fprintf(fout," ? ");

        (reflns_shell.number_unique_obs[m]>0) ?
            fprintf(fout," %d ",reflns_shell.number_unique_obs[m]): fprintf(fout," ? ");

        (reflns_shell.pdbx_rejects[m]>0) ?
            fprintf(fout," %d ", reflns_shell.pdbx_rejects[m]): fprintf(fout," ? ");



        (reflns_shell.Rmerge_F_all[m]>0) ?
            fprintf(fout," %.3f ",reflns_shell.Rmerge_F_all[m]): fprintf(fout," ? ");

        (reflns_shell.Rmerge_F_obs[m]>0) ?
            fprintf(fout," %.3f ",reflns_shell.Rmerge_F_obs[m]): fprintf(fout," ? ");

        (reflns_shell.Rmerge_I_all[m]>0) ?
            fprintf(fout," %.3f ",reflns_shell.Rmerge_I_all[m]): fprintf(fout," ? ");

        (reflns_shell.Rmerge_I_obs[m]>0) ?
            fprintf(fout," %.3f ",reflns_shell.Rmerge_I_obs[m]): fprintf(fout," ? ");


        (reflns_shell.meanI_over_sigI_all[m]>0) ?
            fprintf(fout," %.2f ", reflns_shell.meanI_over_sigI_all[m]): fprintf(fout," ? ");

        (reflns_shell.meanI_over_sigI_obs[m]>0) ?
            fprintf(fout," %.2f ", reflns_shell.meanI_over_sigI_obs[m]): fprintf(fout," ? ");

        
        (reflns_shell.pdbx_Rsym_value[m]>0) ?
            fprintf(fout," %.3f \n",reflns_shell.pdbx_Rsym_value[m]):fprintf(fout," ? \n");
        (reflns_shell.pdbx_chi_squared[m]>0) ?
            fprintf(fout," %.3f ", reflns_shell.pdbx_chi_squared[m]): fprintf(fout," ? ");
        (reflns_shell.pdbx_redundancy[m]>0) ?
            fprintf(fout," %.2f ", reflns_shell.pdbx_redundancy[m]): fprintf(fout," ? ");
        (reflns_shell.percent_possible_all[m]>0) ?
            fprintf(fout," %.2f ", reflns_shell.percent_possible_all[m]): fprintf(fout," ? ");
        (reflns_shell.percent_possible_obs[m]>0) ?
            fprintf(fout," %.2f ", reflns_shell.percent_possible_obs[m]): fprintf(fout," ? ");
    }
    
}

void write_reflns(FILE *fout)
{
    fprintf(fout, "\n# statistics from LOG files (_reflns)\n");

    

    if(reflns.R_free_details[0]!='?') fprintf(fout, "_reflns.R_free_details  '%s' \n", reflns.R_free_details);
    if(reflns.details[0]!='?') fprintf(fout, "_reflns.details  '%s' \n", reflns.details);
    if(reflns.entry_id[0]!='?') fprintf(fout, "_reflns.entry_id  '%s' \n", reflns.entry_id);
    if(reflns.observed_criterion[0]!='?') fprintf(fout, "_reflns.observed_criterion  '%s' \n", reflns.observed_criterion);
    if(reflns.B_iso_Wilson_estimate>0) fprintf(fout, "_reflns.B_iso_Wilson_estimate  %.2f\n", reflns.B_iso_Wilson_estimate);
    if(reflns.Rmerge_F_all>0) fprintf(fout, "_reflns.Rmerge_F_all  %.2f\n", reflns.Rmerge_F_all);
    if(reflns.Rmerge_F_obs>0) fprintf(fout, "_reflns.Rmerge_F_obs  %.2f\n", reflns.Rmerge_F_obs);
    if(reflns.d_resolution_high>0) fprintf(fout, "_reflns.d_resolution_high  %.2f\n", reflns.d_resolution_high);
    if(reflns.d_resolution_low>0) fprintf(fout, "_reflns.d_resolution_low  %.2f\n", reflns.d_resolution_low);
    if(reflns.number_all>0) fprintf(fout, "_reflns.number_all  %d \n", reflns.number_all);
    if(reflns.number_obs>0) fprintf(fout, "_reflns.number_obs  %d\n", reflns.number_obs);
    if(reflns.pdbx_Rmerge_I_obs>0) fprintf(fout, "_reflns.pdbx_Rmerge_I_obs  %.2f\n", reflns.pdbx_Rmerge_I_obs);
    if(reflns.pdbx_Rsym_value>0) fprintf(fout, "_reflns.pdbx_Rsym_value  %.2f\n", reflns.pdbx_Rsym_value);
    if(reflns.pdbx_chi_squared>0) fprintf(fout, "_reflns.pdbx_chi_squared  %.2f\n", reflns.pdbx_chi_squared);
    if(reflns.pdbx_d_res_high_opt>0) fprintf(fout, "_reflns.pdbx_d_res_high_opt  %.2f\n", reflns.pdbx_d_res_high_opt);
    if(reflns.pdbx_d_res_low_opt>0) fprintf(fout, "_reflns.pdbx_d_res_low_opt %.2f\n", reflns.pdbx_d_res_low_opt);
    if(reflns.pdbx_netI_over_av_sigmaI>0) fprintf(fout, "_reflns.pdbx_netI_over_av_sigmaI  %.2f\n", reflns.pdbx_netI_over_av_sigmaI);
    if(reflns.pdbx_redundancy>0) fprintf(fout, "_reflns.pdbx_redundancy  %.2f\n", reflns.pdbx_redundancy);
    if(reflns.pdbx_scaling_rejects>0) fprintf(fout, "_reflns.pdbx_scaling_rejects  %d\n", reflns.pdbx_scaling_rejects);
    if(reflns.percent_possible_obs>0) fprintf(fout, "_reflns.percent_possible_obs %.2f\n", reflns.percent_possible_obs);
}

void write_reflns_sf(FILE *fout)
{
    fprintf(fout, "\n# statistics from LOG files (_reflns)\n");

    if (reflns_sf.resol_L>0) fprintf(fout, "_reflns.d_resolution_low  %.2f\n", reflns_sf.resol_L);
    if (reflns_sf.resol_H>0) fprintf(fout,"_reflns.d_resolution_high  %.2f\n", reflns_sf.resol_H);
    if (reflns_sf.nrefl>0) fprintf(fout,"_reflns.number_obs %d\n", reflns_sf.nrefl);
    if (reflns_sf.comp>0) fprintf(fout,"_reflns.percent_possible_obs  %.1f\n", reflns_sf.comp);
    if (reflns_sf.Rmerge>0) fprintf(fout,"_reflns.pdbx_Rmerge_I_obs  %.3f\n", reflns_sf.Rmerge);
    if (reflns_sf.redundancy>0) fprintf(fout,"_reflns.pdbx_redundancy %.2f\n", reflns_sf.redundancy);
    if (reflns_sf.chi2>0) fprintf(fout,"_reflns.pdbx_chi_squared %.3f\n", reflns_sf.chi2);
    if (reflns_sf.reject>0) fprintf(fout,"_reflns.pdbx_scaling_rejects %d \n", reflns_sf.reject);
    if (reflns_sf.unique_nrefl>0) fprintf(fout,"_reflns.number_unique_obs %d\n", reflns_sf.unique_nrefl);
    if (reflns_sf.I_over_sI>0) fprintf(fout,"_reflns.pdbx_netI_over_av_sigmaI %.2f\n", reflns_sf.I_over_sI);
    if (reflns_sf.mosaicity>0) fprintf(fout,"_reflns.pdbx_mosaicity %.2f\n", reflns_sf.mosaicity);
    if (reflns_sf.Rsym>0) fprintf(fout,"_reflns.pdbx_Rsym_value %.3f\n", reflns_sf.Rsym);
}

