#ifndef _SF_
#define _SF_
#define NBIN 100
#define MAXL 512

typedef struct 
{
    float resol_H, resol_H_shell[NBIN], resol_L, resol_L_shell[NBIN];
    float comp, comp_shell[NBIN], Rmerge, Rmerge_shell[NBIN];
    float Rsym, Rsym_shell[NBIN];
    float chi2, chi2_shell[NBIN], I_over_sI, I_over_sI_shell[NBIN];
    float redundancy, redundancy_shell[NBIN], mosaicity;
    float a, b, c,  alpha, beta, gamma;
    int  nrefl, nrefl_shell[NBIN], unique_nrefl, unique_nrefl_shell[NBIN];   
    int  nbin, nset, space_gp_num, reject, reject_shell[NBIN];   
    char id[80], space_gp[80];   
}log_data;

typedef struct 
{
    char entry_id[80];
    float length_a, length_b, length_c;
    float angle_alpha, angle_beta, angle_gamma;
    float length_a_esd, length_b_esd, length_c_esd;
    float angle_alpha_esd, angle_beta_esd, angle_gamma_esd;
}cell;

typedef struct 
{
    char entry_id[80], cell_setting[80], space_group_name_Hall[40];
    char space_group_name_H_M[40], pdbx_full_space_group_name_H_M[40];
    int Int_Tables_number;
    
}symmetry;



log_data log_data_initial(void);

void usage();
void check_input_error(int argc,char **argv,char *out,
                       char *init_ID,char *ref_ID);

void write_data_type_head(FILE *fout, char *I_F_type);
void write_refl_initial(FILE *fout, int argc, char **argv);
//void write_data(FILE *fout, const char *ncryst, const char *nwave, 
//                const char *filename, const char *prog, const char *I_F_type);
void write_data(FILE *fout, char *ncryst, char *nwave, 
                char *filename, char *prog, char *I_F_type);


int data_format(char *filename, char *prog);
void write_hkl(FILE *fout,char *file,char *cryst, char *n_wave);
void write_dtrek(FILE *fout, char *filename, char *ncryst, char *nwave);
void write_saint(FILE *fout, char *filename, char *ncryst, char *nwave);

void extract_log(FILE *fout,int argc,char **argv, char *intial_format);
void write_log(FILE *fout, log_data *log, int m,int j);
log_data extract_log_HKL(char *inpfile);
log_data extract_log_DTREK(char *inpfile);
log_data extract_log_SAINT(char *inpfile);
log_data extract_log_SCALA(char *inpfile);
void extract_log_CIF(FILE *fout, char *infile);

void write_refl_refine(FILE *fout,int argc,char **argv);

void print_cns(FILE *fout, char *line, char *fr_test, char *id,
               char *ncryst, char *nwave, char *I_F_type);

void cns_reflection(FILE *fout,  char *file_name, char *id,
                    char *ncryst, char *nwave, char *I_F_type);

void write_merge_data(FILE *fout, int argc,char **argv,char *method,
                      char *format);
void seperate_merged_cns(FILE *fout,char *filename); /* not used */

void read_imgCIF_header(FILE *fout, char *infile);
void cifparse(char *iFile);
void shelx_tnt_refl(FILE *fout, char *ref_data_type, char *ref_format,
                     char *ref_data_file);
void write_refl_imgcif(FILE *fout, int argc, char **argv);



void extract_ref_head(char *infile, char *prog);
void ref_head( FILE *fout );
void write_cif_data(FILE *fout, char *ncryst, char *nwave, char *iFile);
long write_other(FILE *fout, char *filename, char *ncryst, char *nwave);
void sf_log_for_pdb_extract_sf(FILE *fout,int argc,char **argv);

void  shelx_cif2mmcif(FILE *fout, char *infile);
int  write_mmcif_sf(FILE *fout, char *iFile, int id);
void cryst_infor(FILE *fout, float *a, char *sym,int num);
void write_cryst_infor(FILE *fout,char *ref_prog, int argc,char **argv);

#endif

