/*
FILE:     pdb2cif.C
*/
/*
VERSION:  1.600
*/
/*
DATE:     2/3/2005
*/
/*
  Comments and Questions to: sw-help@rcsb.rutgers.edu
*/
/*
COPYRIGHT 1999-2005 Rutgers - The State University of New Jersey

This software is provided WITHOUT WARRANTY OF MERCHANTABILITY OR
FITNESS FOR A PARTICULAR PURPOSE OR ANY OTHER WARRANTY, EXPRESS OR
IMPLIED.  RUTGERS MAKE NO REPRESENTATION OR WARRANTY THAT THE
SOFTWARE WILL NOT INFRINGE ANY PATENT, COPYRIGHT OR OTHER
PROPRIETARY RIGHT.

The user of this software shall indemnify, hold harmless and defend
Rutgers, its governors, trustees, officers, employees, students,
agents and the authors against any and all claims, suits,
losses, liabilities, damages, costs, fees, and expenses including
reasonable attorneys' fees resulting from or arising out of the
use of this software.  This indemnification shall include, but is
not limited to, any and all claims alleging products liability.
*/
/*
               PDB SOFTWARE LICENSE AGREEMENT

BY CLICKING THE ACCEPTANCE BUTTON OR INSTALLING OR USING 
THIS "SOFTWARE, THE INDIVIDUAL OR ENTITY LICENSING THE  
SOFTWARE ("LICENSEE") IS CONSENTING TO BE BOUND BY AND IS 
BECOMING A PARTY TO THIS AGREEMENT.  IF LICENSEE DOES NOT 
AGREE TO ALL OF THE TERMS OF THIS AGREEMENT
THE LICENSEE MUST NOT INSTALL OR USE THE SOFTWARE.

1. LICENSE AGREEMENT

This is a license between you ("Licensee") and the Protein Data Bank (PDB) 
at Rutgers, The State University of New Jersey (hereafter referred to 
as "RUTGERS").   The software is owned by RUTGERS and protected by 
copyright laws, and some elements are protected by laws governing 
trademarks, trade dress and trade secrets, and may be protected by 
patent laws. 

2. LICENSE GRANT

RUTGERS grants you, and you hereby accept, non-exclusive, royalty-free 
perpetual license to install, use, modify, prepare derivative works, 
incorporate into other computer software, and distribute in binary 
and source code format, or any derivative work thereof, together with 
any associated media, printed materials, and on-line or electronic 
documentation (if any) provided by RUTGERS (collectively, the "SOFTWARE"), 
subject to the following terms and conditions: (i) any distribution 
of the SOFTWARE shall bind the receiver to the terms and conditions 
of this Agreement; (ii) any distribution of the SOFTWARE in modified 
form shall clearly state that the SOFTWARE has been modified from 
the version originally obtained from RUTGERS.  

2. COPYRIGHT; RETENTION OF RIGHTS.  

The above license grant is conditioned on the following: (i) you must 
reproduce all copyright notices and other proprietary notices on any 
copies of the SOFTWARE and you must not remove such notices; (ii) in 
the event you compile the SOFTWARE, you will include the copyright 
notice with the binary in such a manner as to allow it to be easily 
viewable; (iii) if you incorporate the SOFTWARE into other code, you 
must provide notice that the code contains the SOFTWARE and include 
a copy of the copyright notices and other proprietary notices.  All 
copies of the SOFTWARE shall be subject to the terms of this Agreement.  

3. NO MAINTENANCE OR SUPPORT; TREATMENT OF ENHANCEMENTS 

RUTGERS is under no obligation whatsoever to: (i) provide maintenance 
or support for the SOFTWARE; or (ii) to notify you of bug fixes, patches, 
or upgrades to the features, functionality or performance of the 
SOFTWARE ("Enhancements") (if any), whether developed by RUTGERS 
or third parties.  If, in its sole discretion, RUTGERS makes an 
Enhancement available to you and RUTGERS does not separately enter 
into a written license agreement with you relating to such bug fix, 
patch or upgrade, then it shall be deemed incorporated into the SOFTWARE 
and subject to this Agreement. You are under no obligation whatsoever 
to provide any Enhancements to RUTGERS or the public that you may 
develop over time; however, if you choose to provide your Enhancements 
to RUTGERS, or if you choose to otherwise publish or distribute your 
Enhancements, in source code form without contemporaneously requiring 
end users or RUTGERS to enter into a separate written license agreement 
for such Enhancements, then you hereby grant RUTGERS a non-exclusive,
royalty-free perpetual license to install, use, modify, prepare
derivative works, incorporate into the SOFTWARE or other computer
software, distribute, and sublicense your Enhancements or derivative
works thereof, in binary and source code form.

4. FEES.  There is no license fee for the SOFTWARE.  If Licensee
wishes to receive the SOFTWARE on media, there may be a small charge
for the media and for shipping and handling.  Licensee is
responsible for any and all taxes.

5. TERMINATION.  Without prejudice to any other rights, Licensor
may terminate this Agreement if Licensee breaches any of its terms
and conditions.  Upon termination, Licensee shall destroy all
copies of the SOFTWARE.

6. PROPRIETARY RIGHTS.  Title, ownership rights, and intellectual
property rights in the Product shall remain with RUTGERS.  Licensee 
acknowledges such ownership and intellectual property rights and will 
not take any action to jeopardize, limit or interfere in any manner 
with RUTGERS' ownership of or rights with respect to the SOFTWARE.  
The SOFTWARE is protected by copyright and other intellectual 
property laws and by international treaties.  Title and related 
rights in the content accessed through the SOFTWARE is the property 
of the applicable content owner and is protected by applicable law.  
The license granted under this Agreement gives Licensee no rights to such
content.

7. DISCLAIMER OF WARRANTY.  THE SOFTWARE IS PROVIDED FREE OF 
CHARGE, AND, THEREFORE, ON AN "AS IS" BASIS, WITHOUT WARRANTY OF 
ANY KIND, INCLUDING WITHOUT LIMITATION THE WARRANTIES THAT IT 
IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE 
OR NON-INFRINGING.  THE ENTIRE RISK AS TO THE QUALITY AND 
PERFORMANCE OF THE SOFTWARE IS BORNE BY LICENSEE.  SHOULD THE 
SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, THE LICENSEE AND NOT 
LICENSOR ASSUMES THE ENTIRE COST OF ANY SERVICE AND REPAIR.  
THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF 
THIS AGREEMENT.  NO USE OF THE PRODUCT IS AUTHORIZED HEREUNDER 
EXCEPT UNDER THIS DISCLAIMER.

8. LIMITATION OF LIABILITY.  TO THE MAXIMUM EXTENT PERMITTED BY
APPLICABLE LAW,  IN NO EVENT WILL LICENSOR BE LIABLE FOR ANY 
INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 
OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, INCLUDING, 
WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK 
STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL 
OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF ADVISED OF THE
POSSIBILITY THEREOF. 
*/
/* program to extract informat from crystallographic softwares */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#include "structure.h"  
#include "harv.h"
#include "util.h"


extern CELL cell;
extern REFINE refine;
extern PDBX_REFINE pdbx_refine;
extern SYMMETRY symmetry ;
extern REFINE_HIST refine_hist;
extern REFINE_ANALYZE refine_analyze;
extern STRUCT_CONN struct_conn;
extern DATABASE_PDB_MATRIX database_PDB_matrix;
extern ATOM_SITES atom_sites;
extern PDBX_REFINE_TLS pdbx_refine_tls_single;
 PDBX_REFINE_TLS pdbx_refine_tls_single;
extern PDBX_REFINE_TLS_GROUP pdbx_refine_tls_group_single;
 PDBX_REFINE_TLS_GROUP pdbx_refine_tls_group_single;
extern REFLNS reflns;
extern DIFFRN_DETECTOR diffrn_detector;
extern DIFFRN_SOURCE diffrn_source;
extern COMPUTING computing;

REFINE_LS_SHELL refine_ls_shell;
REFLNS_SHELL reflns_shell;


PDBX_REFINE_TLS_GROUP pdbx_refine_tls_group[50];

PDBX_REFINE_TLS pdbx_refine_tls[50];

STRUCT_NCS_DOM struct_ncs_dom[20];
STRUCT_NCS_DOM_LIM struct_ncs_dom_lim[20];

REFINE_LS_RESTR refine_ls_restr[100];
REFINE_LS_RESTR_NCS refine_ls_restr_ncs[20];
PDBX_XPLOR_FILE pdbx_xplor_file[80];


void write_remark_text(FILE *fout, char **line, int nline);
void write_non_standard_remark(FILE *fout, char **line, int nline);
void write_remark_200(FILE *fout, char **line, int n);
void write_ls_restr_type(FILE *fout, char * , int i);
void convert_restr_2_standard(FILE *fout, char *type, int i, const char **pair,
                              int npair);
void pdb2cif_coord(FILE *fout, char *inpfile);
void write_PDB_item(FILE *fout, char *str, long len, int format, int digit);
void write_PDB_resid(FILE *fout, char *str, long len);
void write_PDB_30_70(FILE *fout, char *str, int n) ; //column 30_70
void write_PDB_6_27(FILE *fout, char *str);
void extract_PDB_tls_weird(char *infile);
void extract_PDB_tls_weird_refmac(char *infile);

void extract_PDB_head(char *infile);
void extract_PDB_tls(char *infile);
void extract_PDB_ncs(char *infile);
void extract_PDB_refine_ls_restr(char *infile, char *prog);

void extract_PDB_conn(FILE *fout,char *infile);
void write_refine_hist(FILE *fout);
void write_refine_analyze(FILE *fout);
void write_refine_ls_restr(FILE *fout);
void write_tls(FILE *fout);
void write_ncs(FILE *fout);
void write_conn(FILE *fout, char *line, int atom1, int atom2,
                int alt1, int comp1, int comp2, int asym1,
                int seq1, int seq2, int ins1, int sym1, int sym2);
void write_database_PDB_matrix(FILE *fout);
void write_atom_sites(FILE *fout);
void write_pdbx_xplor_file(FILE *fout);



int NR=0, NTLS=0, NCS=0, NLIM=0, NNCS=0;
char PROG[40];



void pdb_2_cif(FILE *fout, char *infile)
    
{

    
    refine_ls_restr[0].number = INI;
    refine_ls_restr[0].dev_ideal =INI ;
    refine_ls_restr[0].dev_ideal_target  = INI;
    refine_ls_restr[0].weight  = INI;
    
    extract_PDB_head(infile);
    extract_PDB_refine_ls_restr(infile, PROG);
    
  
    write_pdbx_xplor_file(fout);
    write_refine_hist(fout);
    write_refine_analyze(fout);
    write_refine_ls_restr(fout);
    extract_PDB_tls(infile);
//    extract_PDB_tls_weird(infile);
//    extract_PDB_tls_weird_refmac(infile);
    if(NTLS>0) write_tls(fout);
    extract_PDB_ncs(infile);
    write_ncs(fout);
   
    write_database_PDB_matrix(fout);
    write_atom_sites(fout);
    extract_PDB_conn (fout, infile);
    pdb2cif_coord(fout,  infile);
    
    strcpy(computing.structure_refinement , PROG);
    
    
}

void write_pdbx_xplor_file(FILE *fout)
{
    int i;

    for(i=0;i<80;i++){
        if(pdbx_xplor_file[i].param_file  || pdbx_xplor_file[i].topol_file){
            if(i==0){   
                fprintf(fout,"%s %s %s %s" ,"\nloop_\n",
                        "_ndb_xplor_file.serial_no\n",
                        "_ndb_xplor_file.param_file\n",
                        "_ndb_xplor_file.topol_file\n"
                        );
                
            }
            fprintf(fout,"%d\n", i+1);
            (pdbx_xplor_file[i].param_file)?fprintf(fout,"'%s'\n", pdbx_xplor_file[i].param_file):fprintf(fout," ? \n");
            (pdbx_xplor_file[i].topol_file)?fprintf(fout,"'%s'\n", pdbx_xplor_file[i].topol_file):fprintf(fout," ? \n");
            
        }
    }
    
};
            
        
    
void write_database_PDB_matrix(FILE *fout)
{
    
    if(database_PDB_matrix.origx11>-9998 && database_PDB_matrix.origx22>-9998 &&
       database_PDB_matrix.origx33>-9998){ 
        fprintf(fout,"#\n");
        fprintf(fout,"_database_PDB_matrix.origx[1][1] %.5f\n", database_PDB_matrix.origx11);
        fprintf(fout,"_database_PDB_matrix.origx[1][2] %.5f\n", database_PDB_matrix.origx12);
        fprintf(fout,"_database_PDB_matrix.origx[1][3] %.5f\n", database_PDB_matrix.origx13);
        fprintf(fout,"_database_PDB_matrix.origx[2][1] %.5f\n", database_PDB_matrix.origx21);
        fprintf(fout,"_database_PDB_matrix.origx[2][2] %.5f\n", database_PDB_matrix.origx22);
        fprintf(fout,"_database_PDB_matrix.origx[2][3] %.5f\n", database_PDB_matrix.origx23);
        fprintf(fout,"_database_PDB_matrix.origx[3][1] %.5f\n", database_PDB_matrix.origx31);
        fprintf(fout,"_database_PDB_matrix.origx[3][2] %.5f\n", database_PDB_matrix.origx32);
        fprintf(fout,"_database_PDB_matrix.origx[3][3] %.5f\n", database_PDB_matrix.origx33);
    }
    if(database_PDB_matrix.origx_vector1>-9998 && database_PDB_matrix.origx_vector2>-9998){
        fprintf(fout,"_database_PDB_matrix.origx_vector[1] %.5f\n", database_PDB_matrix.origx_vector1);
        fprintf(fout,"_database_PDB_matrix.origx_vector[2] %.5f\n", database_PDB_matrix.origx_vector2);
        fprintf(fout,"_database_PDB_matrix.origx_vector[3] %.5f\n", database_PDB_matrix.origx_vector3); 
    }
    
}

    
void write_atom_sites(FILE *fout)
{
    if(atom_sites.fract_transf_matrix11>-9998 && atom_sites.fract_transf_matrix22>-9998
       && atom_sites.fract_transf_matrix33>-9998){ 
        fprintf(fout,"#\n");
        fprintf(fout,"_atom_sites.fract_transf_matrix[1][1] %.5f\n", atom_sites.fract_transf_matrix11);
        fprintf(fout,"_atom_sites.fract_transf_matrix[1][2] %.5f\n", atom_sites.fract_transf_matrix12);
        fprintf(fout,"_atom_sites.fract_transf_matrix[1][3] %.5f\n", atom_sites.fract_transf_matrix13);
        fprintf(fout,"_atom_sites.fract_transf_matrix[2][1] %.5f\n", atom_sites.fract_transf_matrix21);
        fprintf(fout,"_atom_sites.fract_transf_matrix[2][2] %.5f\n", atom_sites.fract_transf_matrix22);
        fprintf(fout,"_atom_sites.fract_transf_matrix[2][3] %.5f\n", atom_sites.fract_transf_matrix23);
        fprintf(fout,"_atom_sites.fract_transf_matrix[3][1] %.5f\n", atom_sites.fract_transf_matrix31);
        fprintf(fout,"_atom_sites.fract_transf_matrix[3][2] %.5f\n", atom_sites.fract_transf_matrix32);
        fprintf(fout,"_atom_sites.fract_transf_matrix[3][3] %.5f\n", atom_sites.fract_transf_matrix33);
    }
    if(atom_sites.fract_transf_vector1>-9998 && atom_sites.fract_transf_vector2>-9998){
        fprintf(fout,"_atom_sites.fract_transf_vector[1] %.5f\n", atom_sites.fract_transf_vector1);
        fprintf(fout,"_atom_sites.fract_transf_vector[2] %.5f\n", atom_sites.fract_transf_vector2);
        fprintf(fout,"_atom_sites.fract_transf_vector[3] %.5f\n", atom_sites.fract_transf_vector3); 
    }
}


void write_refine_hist(FILE *fout)
{
    fprintf(fout,"#\n");
    if(refine_hist.pdbx_number_atoms_protein >-9998)
        fprintf(fout,"_refine_hist.pdbx_number_atoms_protein  %d\n",
                refine_hist.pdbx_number_atoms_protein);

    if(refine_hist.pdbx_number_atoms_nucleic_acid >-9998)
        fprintf(fout,"_refine_hist.pdbx_number_atoms_nucleic_acid  %d\n",
                refine_hist.pdbx_number_atoms_nucleic_acid);

    if(refine_hist.pdbx_number_atoms_ligand >-9998)
        fprintf(fout,"_refine_hist.pdbx_number_atoms_ligand  %d\n",
                refine_hist.pdbx_number_atoms_ligand);

    if(refine_hist.number_atoms_solvent >-9998)
        fprintf(fout,"_refine_hist.number_atoms_solvent  %d\n",
                refine_hist.number_atoms_solvent);

    if(refine_hist.number_atoms_total >-9998)
        fprintf(fout,"_refine_hist.number_atoms_total  %d\n",
                refine_hist.number_atoms_total);

    if(refine_hist.d_res_high >-9998)
        fprintf(fout,"_refine_hist.d_res_high  %.3f\n", refine_hist.d_res_high);

    if(refine_hist.d_res_low >-9998)
        fprintf(fout,"_refine_hist.d_res_low  %.3f\n", refine_hist.d_res_low);

    
    fprintf(fout,"_refine_hist.cycle_id  LAST\n");


    
}

    

void write_tls(FILE *fout)
{
    int i;
    if(NTLS>0 && pdbx_refine_tls_group[0].beg_label_asym_id[0] != '?' &&
       pdbx_refine_tls_group[0].end_label_asym_id[0] != '?'){
       
        fprintf(fout,"#\n");
        fprintf(fout,"loop_\n");
        fprintf(fout,"_pdbx_refine_tls_group.id\n");
        fprintf(fout,"_pdbx_refine_tls_group.refine_tls_id\n");
        fprintf(fout,"_pdbx_refine_tls_group.beg_label_asym_id\n");
        fprintf(fout,"_pdbx_refine_tls_group.beg_label_seq_id\n");
        fprintf(fout,"_pdbx_refine_tls_group.end_label_asym_id\n");
        fprintf(fout,"_pdbx_refine_tls_group.end_label_seq_id\n");
        fprintf(fout,"_pdbx_refine_tls_group.selection\n");
        for(i=0; i<NTLS; i++){
            fprintf(fout,"'%s' '%s'  '%s' '%s' '%s'  '%s' ALL\n",
                    pdbx_refine_tls_group[i].id, pdbx_refine_tls_group[i].id,
                    pdbx_refine_tls_group[i].beg_label_asym_id, pdbx_refine_tls_group[i].beg_label_seq_id,
                    pdbx_refine_tls_group[i].end_label_asym_id, pdbx_refine_tls_group[i].end_label_seq_id);
        }
    }

    if(pdbx_refine_tls[0].T11<-9998 && pdbx_refine_tls[0].L11<-9998 && pdbx_refine_tls[0].S11<-9998) return;
    
    fprintf(fout,"#\n");
    fprintf(fout,"loop_\n");
    fprintf(fout,"_pdbx_refine_tls.id\n");
    fprintf(fout,"_pdbx_refine_tls.details\n");
    fprintf(fout,"_pdbx_refine_tls.method\n");
    fprintf(fout,"_pdbx_refine_tls.origin_x\n");
    fprintf(fout,"_pdbx_refine_tls.origin_y\n");
    fprintf(fout,"_pdbx_refine_tls.origin_z\n");
    fprintf(fout,"_pdbx_refine_tls.T[1][1]\n");
    fprintf(fout,"_pdbx_refine_tls.T[2][2]\n");
    fprintf(fout,"_pdbx_refine_tls.T[3][3]\n");
    fprintf(fout,"_pdbx_refine_tls.T[1][2]\n");
    fprintf(fout,"_pdbx_refine_tls.T[1][3]\n");
    fprintf(fout,"_pdbx_refine_tls.T[2][3]\n");
    fprintf(fout,"_pdbx_refine_tls.L[1][1]\n");
    fprintf(fout,"_pdbx_refine_tls.L[2][2]\n");
    fprintf(fout,"_pdbx_refine_tls.L[3][3]\n");
    fprintf(fout,"_pdbx_refine_tls.L[1][2]\n");
    fprintf(fout,"_pdbx_refine_tls.L[1][3]\n");
    fprintf(fout,"_pdbx_refine_tls.L[2][3]\n");
    fprintf(fout,"_pdbx_refine_tls.S[1][1]\n");
    fprintf(fout,"_pdbx_refine_tls.S[2][2]\n");
    fprintf(fout,"_pdbx_refine_tls.S[3][3]\n");
    fprintf(fout,"_pdbx_refine_tls.S[1][2]\n");
    fprintf(fout,"_pdbx_refine_tls.S[1][3]\n");
    fprintf(fout,"_pdbx_refine_tls.S[2][3]\n");
    fprintf(fout,"_pdbx_refine_tls.S[2][1]\n");
    fprintf(fout,"_pdbx_refine_tls.S[3][1]\n");
    fprintf(fout,"_pdbx_refine_tls.S[3][2]\n");
    fprintf(fout,"_pdbx_refine_tls.S22-S11\n");
    fprintf(fout,"_pdbx_refine_tls.S11-S33\n");    
    
    for(i=0; i<NTLS; i++){
        fprintf(fout,"'%s' '%s'  '%s' ", pdbx_refine_tls[i].id, pdbx_refine_tls[i].details, pdbx_refine_tls[i].method);
        
        (pdbx_refine_tls[i].origin_x >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].origin_x ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].origin_y >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].origin_y ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].origin_z >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].origin_z ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].T11 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].T11 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].T22 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].T22 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].T33 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].T33 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].T12 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].T12 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].T13 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].T13 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].T23 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].T23 ) : fprintf(fout,"? ");

        (pdbx_refine_tls[i].L11 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].L11 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].L22 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].L22 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].L33 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].L33 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].L12 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].L12 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].L13 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].L13 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].L23 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].L23 ) : fprintf(fout,"? ");

        (pdbx_refine_tls[i].S11 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S11 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S22 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S22 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S33 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S33 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S12 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S12 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S13 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S13 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S23 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S23 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S21 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S21 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S31 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S31 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S32 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S32 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S22_S11 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S22_S11 ) : fprintf(fout,"? ");
        (pdbx_refine_tls[i].S11_S33 >-9998)? fprintf(fout, " %.4f ", pdbx_refine_tls[i].S11_S33 ) : fprintf(fout,"? ");
                
        fprintf(fout,"\n");

    }
    
}

void write_ncs(FILE *fout)
{
    int i;
    
    if(NCS>0 && (struct_ncs_dom[0].details[0] != '?' || struct_ncs_dom[0].id[0] != '?')){       
        fprintf(fout,"#\n");
        fprintf(fout,"loop_\n");
        fprintf(fout,"_struct_ncs_dom.id\n");
        fprintf(fout,"_struct_ncs_dom.details\n");
//             printf("%d  '%s' '%s'\n", NCS, struct_ncs_dom[0].id, struct_ncs_dom[0].details);
        
        for(i=0; i<NCS; i++){
            fprintf(fout,"'%s' '%s'\n", struct_ncs_dom[i].id, struct_ncs_dom[i].details);
        }
    }


//    printf("ncs %d %d %d %s\n",NCS, NLIM, NNCS, struct_ncs_dom_lim[0].beg_label_asym_id);
    
    if(NLIM > 0 && struct_ncs_dom_lim[0].dom_id[0] != '?' && struct_ncs_dom_lim[0].beg_label_asym_id[0] != '?' &&
       struct_ncs_dom_lim[0].end_label_asym_id[0] != '?'){       
        fprintf(fout,"#\n");
        fprintf(fout,"loop_\n");
        fprintf(fout,"_struct_ncs_dom_lim.dom_id\n");
        fprintf(fout,"_struct_ncs_dom_lim.pdbx_component\n");
        fprintf(fout,"_struct_ncs_dom_lim.beg_label_asym_id\n");
        fprintf(fout,"_struct_ncs_dom_lim.beg_label_seq_id\n");
        fprintf(fout,"_struct_ncs_dom_lim.end_label_asym_id\n");
        fprintf(fout,"_struct_ncs_dom_lim.end_label_seq_id\n");
        for(i=0; i<NLIM; i++){
            fprintf(fout,"'%s'  %d  '%s' %d '%s' %d\n",struct_ncs_dom_lim[i].dom_id,struct_ncs_dom_lim[i].pdbx_component,
                    struct_ncs_dom_lim[i].beg_label_asym_id, struct_ncs_dom_lim[i].beg_label_seq_id,
                    struct_ncs_dom_lim[i].end_label_asym_id, struct_ncs_dom_lim[i].end_label_seq_id);
        }
    }
    
    if(NNCS > 0 && refine_ls_restr_ncs[0].rms_dev_position>-9998 && refine_ls_restr_ncs[0].pdbx_type[0] !='?'){
        fprintf(fout,"#\n");
        fprintf(fout,"loop_\n");
        fprintf(fout,"_refine_ls_restr_ncs.dom_id\n");
        fprintf(fout,"_refine_ls_restr_ncs.pdbx_type\n");
        fprintf(fout,"_refine_ls_restr_ncs.pdbx_asym_id\n");
        fprintf(fout,"_refine_ls_restr_ncs.pdbx_number\n");
        fprintf(fout,"_refine_ls_restr_ncs.rms_dev_position\n");
        fprintf(fout,"_refine_ls_restr_ncs.weight_position\n");
        
        for(i=0; i<NNCS; i++){
            rid_of_front_end_space(refine_ls_restr_ncs[i].dom_id);
            rid_of_front_end_space(refine_ls_restr_ncs[i].pdbx_type);
            rid_of_front_end_space(refine_ls_restr_ncs[i].pdbx_asym_id);
            
                
            fprintf(fout,"'%s' \"%s\"  '%s' ",
                    refine_ls_restr_ncs[i].dom_id, refine_ls_restr_ncs[i].pdbx_type, refine_ls_restr_ncs[i].pdbx_asym_id);
            (refine_ls_restr_ncs[i].pdbx_number >-9998)?
                fprintf(fout, " %d ", refine_ls_restr_ncs[i].pdbx_number ) : fprintf(fout,"? ");
            (refine_ls_restr_ncs[i].rms_dev_position)? fprintf(fout," %.3f ",refine_ls_restr_ncs[i].rms_dev_position) :  fprintf(fout,"? ");
            
            (refine_ls_restr_ncs[i].weight_position >-9998)?
                fprintf(fout, " %.3f ", refine_ls_restr_ncs[i].weight_position) : fprintf(fout,"? ");
            fprintf(fout,"\n");
            
        }
    }
    
}

void extract_PDB_tls(char *infile)
{
    char str[100],  tls_detail[80];
    int  ntls=0, ng=0;
    FILE *finp;

    if((finp=fopen(infile, "r"))==NULL)
        open_file_error (infile, "extract_PDB_tls");
     
    strcpy(tls_detail, "?");
    
    pdbx_refine_tls_group[0] = pdbx_refine_tls_group_single;
    
    pdbx_refine_tls[0] = pdbx_refine_tls_single;
    
    while (fgets(str, sizeof str, finp) != NULL) {
        if(!strncmp_case(str, "ATOM  ", 6) || !strncmp_case(str, "HETATM", 6))break;
        if(!strncmp_case(str, "REMARK", 6) && strstr_space(str, "REMARK 3")){
            
            if(strstr_space(str,"REMARK   3  TLS DETAILS")){
                strcpy(tls_detail, get_substr(str,"DETAILS", "\n"));
                if (is_space_line(tls_detail)<=1) strcpy( tls_detail,"?");
            }else if(strstr_space(str," NUMBER OF TLS GROUPS  :")){
  //              tls=get_int(str," :", "\n");
            }else if(strstr_space(str,"REMARK   3   TLS GROUP :")){
                ng = get_int(str," :", "\n");
                if(ng>0){
                    sprintf(pdbx_refine_tls_group_single.id, "%d", ng);
                    sprintf(pdbx_refine_tls_single.id, "%d", ng);
                    while (fgets(str, sizeof str, finp) != NULL) {
                        
                        if(strstr_space(str, "RESIDUE RANGE :")){
                            
                            if(sscanf(get_substr(str," :", "\n"), "%s%s%s%s",
                                   pdbx_refine_tls_group_single.beg_label_asym_id,
                                   pdbx_refine_tls_group_single.beg_label_seq_id,
                                   pdbx_refine_tls_group_single.end_label_asym_id,
                                   pdbx_refine_tls_group_single.end_label_seq_id) != 4)
                                continue;
                        }else if(strstr_space(str, " ORIGIN FOR THE GROUP (A):")){
                            if(sscanf(get_substr(str,":", "\n"), "%f%f%f",
                                   &pdbx_refine_tls_single.origin_x, 
                                   &pdbx_refine_tls_single.origin_y, 
                                   &pdbx_refine_tls_single.origin_z) !=3 )
                                continue;
                        }else if(pattern5(str, " T11:", "T22", "", "","")){
                            pdbx_refine_tls_single.T11=get_float(str, " T11:", "T22");
                            pdbx_refine_tls_single.T22=get_float(str, " T22:", "\n");
                        }else if(pattern5(str, " T33:", "T12", "", "","")){
                            pdbx_refine_tls_single.T33=get_float(str, " T33:", "T12");
                            pdbx_refine_tls_single.T12=get_float(str, " T12:", "\n");
                        }else if(pattern5(str, " T13:", "T23", "", "","")){
                            pdbx_refine_tls_single.T13=get_float(str, " T13:", "T23");
                            pdbx_refine_tls_single.T23=get_float(str, " T23:", "\n");
                            
                        }else if(pattern5(str, " L11:", "L22", "", "","")){
                            pdbx_refine_tls_single.L11=get_float(str, " L11:", "L22");
                            pdbx_refine_tls_single.L22=get_float(str, " L22:", "\n");
                        }else if(pattern5(str, " L33:", "L12", "", "","")){
                            pdbx_refine_tls_single.L33=get_float(str, " L33:", "L12");
                            pdbx_refine_tls_single.L12=get_float(str, " L12:", "\n");
                        }else if(pattern5(str, " L13:", "L23", "", "","")){
                            pdbx_refine_tls_single.L13=get_float(str, " L13:", "L23");
                            pdbx_refine_tls_single.L23=get_float(str, " L23:", "\n");
                            
                        }else if(pattern5(str, " S11:", "S12:", "S13:", "","")){
                            pdbx_refine_tls_single.S11=get_float(str, " S11:", "S12");
                            pdbx_refine_tls_single.S12=get_float(str, " S12:", "S13");
                            pdbx_refine_tls_single.S13=get_float(str, " S13:", "\n");
                        }else if(pattern5(str, " S21:", "S22:", "S23:", "","")){
                            pdbx_refine_tls_single.S21=get_float(str, " S21:", "S22");
                            pdbx_refine_tls_single.S22=get_float(str, " S22:", "S23");
                            pdbx_refine_tls_single.S23=get_float(str, " S23:", "\n");
                        }else if(pattern5(str, " S31:", "S32:", "S33:", "","")){
                            pdbx_refine_tls_single.S31=get_float(str, " S31:", "S32");
                            pdbx_refine_tls_single.S32=get_float(str, " S32:", "S33");
                            pdbx_refine_tls_single.S33=get_float(str, " S33:", "\n");
                            break;
                        }
                    }
                    strcpy(pdbx_refine_tls_single.details, tls_detail);
                    strcpy(pdbx_refine_tls_single.method, "refined");
                    pdbx_refine_tls_single.S22_S11 = pdbx_refine_tls_single.S22 - pdbx_refine_tls_single.S11;
                    pdbx_refine_tls_single.S11_S33 = pdbx_refine_tls_single.S11 - pdbx_refine_tls_single.S33;

                    pdbx_refine_tls_group[ntls] = pdbx_refine_tls_group_single;
                    pdbx_refine_tls[ntls] = pdbx_refine_tls_single;
                    
                    ntls++;
                    NTLS=ntls;
                    
                }
            }
        }
    }
    
    fclose(finp);
}

void extract_PDB_tls_weird(char *infile)
{
    char str[100],  tls_detail[80], tmp[20];
    int  ntls=0;
    FILE *finp;

    if((finp=fopen(infile, "r"))==NULL)
        open_file_error (infile, "extract_PDB_tls_weird");
     
    strcpy(tls_detail, "?");
    
    while (fgets(str, sizeof str, finp) != NULL) {
        if(!strncmp_case(str, "ATOM  ", 6) || !strncmp_case(str, "HETATM", 6))break;
            
        if(strstr_space(str,"REMARK   3  TLS DETAILS")){
            strcpy(tls_detail, get_substr(str,"DETAILS", "\n"));
            if (is_space_line(tls_detail)<=1) strcpy( tls_detail,"?");
        }else if(strstr_space(str,"REMARK   3 NUMBER OF TLS GROUPS  :")){
      //      ng=get_int(str," :", "\n");
        }else if(strstr_space(str,"REMARK   3  Number of pieces in the TLS group")){
            sprintf(pdbx_refine_tls_group_single.id, "%d", ntls+1);
            sprintf(pdbx_refine_tls_single.id, "%d", ntls+1);
            
            while (fgets(str, sizeof str, finp) != NULL) {
                if(pattern5(str, "REMARK   3  From", " to ", "", "", "")){
                    get_string(str, 16,17, tmp);
                    strcpy(pdbx_refine_tls_group_single.beg_label_asym_id,tmp);
                    
                    get_string(str, 18,21,pdbx_refine_tls_group_single.beg_label_seq_id);
                    get_string(str, 25,26,pdbx_refine_tls_group_single.end_label_asym_id );
                    get_string(str, 27,30,pdbx_refine_tls_group_single.end_label_seq_id);
                   
                }else if(strstr_space(str, "REMARK   3  Origin for the group    :")){
                    fgets(str, sizeof str, finp);
                    pdbx_refine_tls_single.origin_x = get_float_by_length(str, 12,19);
                    pdbx_refine_tls_single.origin_y = get_float_by_length(str, 20,28);
                    pdbx_refine_tls_single.origin_z = get_float_by_length(str, 29,38);
                    
                }else if(strstr_space(str,"REMARK   3  T tensor (T11, T22, T33, T12, T13, T23)")){
                    fgets(str, sizeof str, finp);
                    pdbx_refine_tls_single.T11=get_float_by_length(str, 11,18);
                    pdbx_refine_tls_single.T22=get_float_by_length(str, 19,26);
                    pdbx_refine_tls_single.T33=get_float_by_length(str, 27,34);
                    pdbx_refine_tls_single.T12=get_float_by_length(str, 35,42);
                    pdbx_refine_tls_single.T13=get_float_by_length(str, 43,50);
                    pdbx_refine_tls_single.T23=get_float_by_length(str, 51,58);
                    
                }else if(strstr_space(str,"REMARK   3  L tensor (L11, L22, L33, L12, L13, L23)")){
                    fgets(str, sizeof str, finp);
                    pdbx_refine_tls_single.L11=get_float_by_length(str, 11,18);
                    pdbx_refine_tls_single.L22=get_float_by_length(str, 19,26);
                    pdbx_refine_tls_single.L33=get_float_by_length(str, 27,34);
                    pdbx_refine_tls_single.L12=get_float_by_length(str, 35,42);
                    pdbx_refine_tls_single.L13=get_float_by_length(str, 43,50);
                    pdbx_refine_tls_single.L23=get_float_by_length(str, 51,58);
                    
                }else if(strstr_space(str,"REMARK   3  S tensor (S22-S11, S11-S33, S12, S13, S23, S21, S31)")){
                    fgets(str, sizeof str, finp);
                    pdbx_refine_tls_single.S22_S11=get_float_by_length(str, 11,18);
                    pdbx_refine_tls_single.S11_S33=get_float_by_length(str, 19,26);
                    pdbx_refine_tls_single.S12=get_float_by_length(str, 27,34);
                    pdbx_refine_tls_single.S13=get_float_by_length(str, 35,42);
                    pdbx_refine_tls_single.S23=get_float_by_length(str, 43,50);
                    pdbx_refine_tls_single.S21=get_float_by_length(str, 51,58);
                    pdbx_refine_tls_single.S31=get_float_by_length(str, 59,66);
                    pdbx_refine_tls_single.S32=get_float_by_length(str, 67,74);

                    pdbx_refine_tls_single.S11=INI;
                    pdbx_refine_tls_single.S22=INI;
                    pdbx_refine_tls_single.S33=INI;
               
                    strcpy(pdbx_refine_tls_single.details, tls_detail);
                    strcpy(pdbx_refine_tls_single.method, "refine");

                    pdbx_refine_tls_group[ntls] = pdbx_refine_tls_group_single;
                    pdbx_refine_tls[ntls] = pdbx_refine_tls_single;
                    
                    ntls++;
                    NTLS=ntls;
                    
                    break;
                }
            }
        }
    }
    fclose(finp);
}

void extract_PDB_tls_weird_refmac(char *infile)
{
    char str[256],  tls_detail[80], tmp1[20], tmp2[20] ;
    int  ntls=0;
    FILE *finp;

    if((finp=fopen(infile, "r"))==NULL)
        open_file_error (infile, "extract_PDB_head");
     
    strcpy(tls_detail, "?");

    
    while (fgets(str, sizeof str, finp) != NULL) {
        sscanf(str, "%s %*s %s ", tmp1, tmp2);
        if(!strcmp_case(tmp1, "TLS") && !strcmp_case(tmp2, "domain")){
            strcpy(tls_detail, str+3);
            rid_of_end_space(tls_detail);
            
            if (is_space_line(tls_detail)<=1) strcpy( tls_detail,"?");
        }else if(!strcmp_case(tmp1, "RANGE")){
            

            get_string(str, 8,9, pdbx_refine_tls_group_single.beg_label_asym_id);
            get_string(str, 9,12,pdbx_refine_tls_group_single.beg_label_seq_id);
            get_string(str, 17,18,pdbx_refine_tls_group_single.end_label_asym_id);
            get_string(str, 18,21,pdbx_refine_tls_group_single.end_label_seq_id);

        }else if(!strcmp_case(tmp1, "ORIGIN")){
            
            pdbx_refine_tls_single.origin_x = get_float_by_length(str, 8,14);
            pdbx_refine_tls_single.origin_y = get_float_by_length(str, 15,22);
            pdbx_refine_tls_single.origin_z = get_float_by_length(str, 23,26);
            
        }else if(!strcmp_case(tmp1, "T")&& !strncmp_case(str, "T   ", 4) ){

            pdbx_refine_tls_single.T11=get_float_by_length(str, 5,11);
            pdbx_refine_tls_single.T22=get_float_by_length(str, 12,19);
            pdbx_refine_tls_single.T33=get_float_by_length(str, 20,27);
            pdbx_refine_tls_single.T12=get_float_by_length(str, 28,35);
            pdbx_refine_tls_single.T13=get_float_by_length(str, 36,43);
            pdbx_refine_tls_single.T23=get_float_by_length(str, 44,51);

        }else if(!strcmp_case(tmp1, "L")&& !strncmp_case(str, "L   ", 4) ){

            pdbx_refine_tls_single.L11=get_float_by_length(str, 5,11);
            pdbx_refine_tls_single.L22=get_float_by_length(str, 12,19);
            pdbx_refine_tls_single.L33=get_float_by_length(str, 20,27);
            pdbx_refine_tls_single.L12=get_float_by_length(str, 28,35);
            pdbx_refine_tls_single.L13=get_float_by_length(str, 36,43);
            pdbx_refine_tls_single.L23=get_float_by_length(str, 44,51);
           
       }else if(!strcmp_case(tmp1, "S") && !strncmp_case(str, "S   ", 4) ){
           
           pdbx_refine_tls_single.S22_S11=get_float_by_length(str,  5,11);
           pdbx_refine_tls_single.S11_S33=get_float_by_length(str, 12,19);
           pdbx_refine_tls_single.S12=get_float_by_length(str, 20,27);
           pdbx_refine_tls_single.S13=get_float_by_length(str, 28,35);
           pdbx_refine_tls_single.S23=get_float_by_length(str, 36,43);
           pdbx_refine_tls_single.S21=get_float_by_length(str, 44,51);
           pdbx_refine_tls_single.S31=get_float_by_length(str, 52,59);
           pdbx_refine_tls_single.S32=get_float_by_length(str, 60,67);

           pdbx_refine_tls_single.S11=INI;
           pdbx_refine_tls_single.S22=INI;
           pdbx_refine_tls_single.S33=INI;
               
           strcpy(pdbx_refine_tls_single.details, tls_detail);
           strcpy(pdbx_refine_tls_single.method, "refine");
           
           sprintf(pdbx_refine_tls_group_single.id, "%d", ntls+1);
           sprintf(pdbx_refine_tls_single.id, "%d", ntls+1);

           pdbx_refine_tls_group[ntls] = pdbx_refine_tls_group_single;
           pdbx_refine_tls[ntls] = pdbx_refine_tls_single;
           
           ntls++;
       }
    }
    NTLS=ntls;
    fclose(finp);
}



void write_non_standard_remark(FILE *fout, char **line, int nline)
{
    
    int i;

    fprintf(fout,"# \n");
    fprintf(fout,"_database_PDB_remark.id   ?\n");
    fprintf(fout,"_database_PDB_remark.text \n;\n");
   
    for(i=0; i<nline; i++){
        if(!strncmp_case(line[i], "REMARK", 6)) {
            fprintf(fout,"%s", line[i]);
        }
    }
    fprintf(fout,";\n");
}

void write_remark_text(FILE *fout, char **line, int nline)
{
    char rnum_old[10], rnum[10];
    
    int i,  n=0;

    fprintf(fout,"# \n");
    fprintf(fout,"loop_\n");
    fprintf(fout,"_database_PDB_remark.id   \n");
    fprintf(fout,"_database_PDB_remark.text \n");
   
    strcpy(rnum_old, "-1");
    for(i=0; i<nline; i++){
        if(!strncmp_case(line[i], "REMARK", 6)) {
            get_string(line[i], 6,9,rnum);
            if(strcmp_case(rnum_old, rnum)) {
                if(n>0)fprintf(fout,";\n");
                fprintf(fout,"\n%s\n;\n", rnum);
            }
            n++;
            fprintf(fout,"%s", line[i]);
            strcpy(rnum_old, rnum);
        }
    }
    fprintf(fout,";\n");
    
}

void write_remark_200(FILE *fout, char **line, int nline)
{

    char  *exptl_method=(char *) "?";
    int  i,  exptl_crystals_number=INI;
    float a1;
    
  
    for(i=0;i<nline;i++){
        if(strstr_space(line[i], "REMARK 200  EXPERIMENT TYPE :")){ //exptl.
            exptl_method= get_substr(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200 NUMBER OF CRYSTALS USED :")){
            exptl_crystals_number= get_int(line[i],":", "\n");

            
        }else if(strstr_space(line[i], "REMARK 200  DATE OF DATA COLLECTION :")){//diffrn_detector.
            diffrn_detector.pdbx_collection_date = get_substr(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200  OPTICS :")){
            diffrn_detector.details = get_substr(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200  DETECTOR TYPE :")){
            diffrn_detector.detector = get_substr(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200  DETECTOR MANUFACTURER :")){
            diffrn_detector.type = get_substr(line[i],":", "\n");


            
        }else if(strstr_space(line[i], "REMARK 200   TEMPERATURE (KELVIN) :")){ //diffrn.ambient_temp
            if((a1 = get_float(line[i],":", "\n"))>-998){
                fprintf(fout, "#\n _diffrn.ambient_temp %f\n", a1);
            }
           
        }else if(strstr_space(line[i], "REMARK 200   PH :")){  //exptl_crystal_grow.ph
            if((a1 = get_float(line[i],":", "\n"))>-998){
                fprintf(fout, "#\n _exptl_crystal_grow.ph %f\n", a1);
            }
            
        }else if(strstr_space(line[i], "REMARK 200   RADIATION SOURCE :")){ //diffrn_source.
            diffrn_source.source = get_substr(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200  BEAMLINE :")){
             diffrn_source.pdbx_synchrotron_beamline= get_substr(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200   X-RAY GENERATOR MODEL :")){
             diffrn_source.type=get_substr(line[i],":", "\n");
/*
             
        }else if(strstr_space(line[i], "REMARK 200   WAVELENGTH OR RANGE (A) :")){ //diffrn_radiation.
            diffrn_radiation.pdbx_wavelength_list = get_substr(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200   MONOCHROMATOR :")){
            diffrn_radiation.monochromator = get_substr(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200 DIFFRACTION PROTOCOL:")){
            diffrn_radiation.pdbx_diffrn_protocol = get_substr(line[i],":", "\n");
           
       
        }else if(strstr_space(line[i], " INTENSITY-INTEGRATION SOFTWARE :  ")){
            strcpy(computing.data_collection, get_substr(line[i],":", "\n"));
        }else if(strstr_space(line[i], "  DATA SCALING SOFTWARE :  ")){
            strcpy(computing.data_reduction, get_substr(line[i],":", "\n"));
*/
            
        }else if(strstr_space(line[i], "REMARK 200 NUMBER OF UNIQUE REFLECTIONS :")){ //reflns. 
            reflns.number_obs= get_int(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200  RESOLUTION RANGE HIGH (A) :")){
            reflns.d_resolution_high= get_float(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200 RESOLUTION RANGE LOW (A) :")){
            reflns.d_resolution_low= get_float(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200  REJECTION CRITERIA (SIGMA(I)) :")){
            reflns.percent_possible_obs = get_float(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200  COMPLETENESS FOR RANGE (%) :  ")){
            reflns.percent_possible_obs = get_float(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200 DATA REDUNDANCY :  ")){
            reflns.pdbx_redundancy = get_float(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200 R MERGE (I) :")){
            reflns.pdbx_Rmerge_I_obs = get_float(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200 R SYM (I) :")){
            reflns.pdbx_Rsym_value= get_float(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200 FOR THE DATA SET :")){
            reflns.pdbx_netI_over_av_sigmaI = get_float(line[i],":", "\n");
        }else if(strstr_space(line[i], "REMARK 200 <I/SIGMA(I)>  FOR THE DATA SET :")){
            reflns.pdbx_netI_over_av_sigmaI = get_float(line[i],":", "\n");
 
//reflns_shell.           
        }else if(strstr_space(line[i], "REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) :")){ 
            reflns_shell.nbin = 1;
            reflns_shell.d_res_high[0]= get_float(line[i],":", "\n");
            
        }else if(strstr_space(line[i], "REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) :")){
            reflns_shell.d_res_low[0]= get_float(line[i],":", "\n");
            
        }else if(strstr_space(line[i], "REMARK 200 COMPLETENESS FOR SHELL (%) :")){
            reflns_shell.percent_possible_all[0]= get_float(line[i],":", "\n");
            
        }else if(strstr_space(line[i], "REMARK 200 DATA REDUNDANCY IN SHELL :")){
            reflns_shell.pdbx_redundancy[0]= get_float(line[i],":", "\n");
            
        }else if(strstr_space(line[i], "REMARK 200 R MERGE FOR SHELL (I) :")){
            reflns_shell.Rmerge_I_obs[0]= get_float(line[i],":", "\n");
           
        }else if(strstr_space(line[i], "REMARK 200 R SYM FOR SHELL (I) :")){
            reflns_shell.pdbx_Rsym_value[0] = get_float(line[i],":", "\n");
            
        }else if(strstr_space(line[i], "REMARK 200 <I/SIGMA(I)>  FOR SHELL :   ")){
            reflns_shell.meanI_over_sigI_obs[0] = get_float(line[i],":", "\n");
            
        }
        
    }

        
 //exptl.
    if(exptl_method[0]!='?')fprintf(fout, "#\n_exptl.method '%s'\n", exptl_method);
    if(exptl_crystals_number >-9998)
        fprintf(fout, "_exptl.crystals_number %d\n", exptl_crystals_number);
   

//_diffrn_detector.

    if(diffrn_detector.detector[0] !='?')
        fprintf(fout, "_diffrn_detector.detector  '%s'\n", diffrn_detector.detector);

    if(diffrn_detector.type[0] !='?')
        fprintf(fout, "_diffrn_detector.type  '%s'\n", diffrn_detector.type);
    
    if(diffrn_detector.details[0] !='?')
        fprintf(fout, "_diffrn_detector.details  '%s'\n", diffrn_detector.details);
    
    if(diffrn_detector.pdbx_collection_date[0] !='?' )
        fprintf(fout, "_diffrn_detector.pdbx_collection_date  '%s'\n",
                diffrn_detector.pdbx_collection_date);   
   

//diffrn_source.
    if(diffrn_source.source[0] !='?')
        fprintf(fout, "_diffrn_source.source '%s'\n",diffrn_source.source);
        
    if(diffrn_source.pdbx_synchrotron_beamline[0] !='?')
        fprintf(fout, "_diffrn_source.pdbx_synchrotron_beamline '%s'\n",
                diffrn_source.pdbx_synchrotron_beamline);
        
    if(diffrn_source.type[0] !='?')
        fprintf(fout, "_diffrn_source.type '%s'\n",diffrn_source.type);
        
//_reflns
    
        
    if (reflns.d_resolution_low>-9998) 
        fprintf(fout,"_reflns.d_resolution_low %.2f\n",reflns.d_resolution_low);
                
    if (reflns.d_resolution_high>-9998) 
        fprintf(fout,"_reflns.d_resolution_high  %.2f\n", reflns.d_resolution_high);
                
    if (reflns.number_obs>-9998) 
        fprintf(fout,"_reflns.number_obs  %d\n", reflns.number_obs);

    if (reflns.percent_possible_obs>-9998) 
        fprintf(fout,"_reflns.percent_possible_obs  %.3f\n", reflns.percent_possible_obs);
    
    if (reflns.pdbx_Rmerge_I_obs>-9998) 
        fprintf(fout,"_reflns.pdbx_Rmerge_I_obs %.3f\n",reflns.pdbx_Rmerge_I_obs);

    if (reflns.B_iso_Wilson_estimate>-9998) 
        fprintf(fout,"_reflns.B_iso_Wilson_estimate %.3f\n",reflns.B_iso_Wilson_estimate);

    if (reflns.pdbx_chi_squared>-9998) 
        fprintf(fout,"_reflns.pdbx_chi_squared  %.3f\n", reflns.pdbx_chi_squared);
            
    if (reflns.pdbx_redundancy>-9998)
        fprintf(fout,"_reflns.pdbx_redundancy %.3f\n",reflns.pdbx_redundancy );
            
    if (reflns.pdbx_scaling_rejects>-9998) 
        fprintf(fout,"_reflns.pdbx_scaling_rejects  %d\n", reflns.pdbx_scaling_rejects);
        
        
    if (reflns.pdbx_netI_over_av_sigmaI>-9998) 
        fprintf(fout,"_reflns.pdbx_netI_over_av_sigmaI %.3f\n", reflns.pdbx_netI_over_av_sigmaI);
            
    if (reflns.pdbx_Rsym_value>-9998) 
        fprintf(fout,"_reflns.pdbx_Rsym_value %.3f\n",reflns.pdbx_Rsym_value);
   

                
}

 

void extract_PDB_conn(FILE *fout, char *infile)
 // for the connectivity
{
    char str[100], **line=NULL, id[50], item[20];
    char atom[6], comp[6], sn[6], asym, seq[6], ins, alt;
    int   n0=0,n1=0,n2=0, n=0, i, nremark=0, nline=0;
    FILE *finp;

    if((finp=fopen(infile, "r"))==NULL)
        open_file_error (infile, "extract_PDB_ncs");
    strcpy(id, "SSBOND SLTBRG HYDBND LINK   ");

    n=0;
    while (fgets(str, sizeof str, finp) != NULL) {
        if(!strncmp_case(str, "ATOM  ", 6) || !strncmp_case(str, "HETATM", 6) )
            break;
        n++;
    }
    rewind(finp);
    line = new char *[n+1];

    n=0;
    while (fgets(str, sizeof str, finp) != NULL) {
        if(!strncmp_case(str, "ATOM  ", 6) || !strncmp_case(str, "HETATM", 6) )
            break;
        
        if(!strncmp_case(str, "REMARK ", 7)) {
            n1=get_int_by_length(str, 6, 9);
            nremark++;
            if(n1>0 && n1<999)
                n0++;
            else
                n2++;
        }
        line[n]=new char[90];
        strcpy(line[n],str);
        n++;
    }
    nline=n;
    
    write_remark_200(fout, line, n);
    
    if(nremark>0){
        if(n2>5)// standard remarks
            write_non_standard_remark(fout, line, n);
        else 
            write_remark_text(fout, line, n);
    }
    
    for(i=0;i<n;i++){
        strncpy(item,line[i], 6);
        item[6] = '\0';
        if(strstr_case(id, item)){
            fprintf(fout,"#\n");
            fprintf(fout,"loop_\n");
            fprintf(fout,"_struct_conn.conn_type_id\n");
            fprintf(fout,"_struct_conn.id\n");
            
            fprintf(fout,"_struct_conn.ptnr1_auth_atom_id \n");
            fprintf(fout,"_struct_conn.ptnr1_auth_comp_id \n");
            fprintf(fout,"_struct_conn.ptnr1_auth_asym_id \n");
            fprintf(fout,"_struct_conn.ptnr1_auth_seq_id\n");
            fprintf(fout,"_struct_conn.pdbx_ptnr1_auth_alt_id \n");
            fprintf(fout,"_struct_conn.pdbx_ptnr1_PDB_ins_code\n");
            fprintf(fout,"_struct_conn.ptnr1_symmetry \n");
            
            fprintf(fout,"_struct_conn.ptnr2_auth_atom_id \n");
            fprintf(fout,"_struct_conn.ptnr2_auth_comp_id \n");
            fprintf(fout,"_struct_conn.ptnr2_auth_asym_id \n");
            fprintf(fout,"_struct_conn.ptnr2_auth_seq_id \n");
            fprintf(fout,"_struct_conn.pdbx_ptnr2_auth_alt_id \n");
            fprintf(fout,"_struct_conn.pdbx_ptnr2_PDB_ins_code \n");
            fprintf(fout,"_struct_conn.ptnr2_symmetry \n");
            
            fprintf(fout,"_struct_conn.pdbx_ptnr3_auth_atom_id \n");
            fprintf(fout,"_struct_conn.pdbx_ptnr3_auth_alt_id \n");
            fprintf(fout,"_struct_conn.pdbx_ptnr3_auth_asym_id \n");
            fprintf(fout,"_struct_conn.pdbx_ptnr3_auth_seq_id \n");
            fprintf(fout,"_struct_conn.pdbx_ptnr3_PDB_ins_code\n");
            fprintf(fout,"_struct_conn.details \n");
            break;
            
        }
    }
   
   
    for(i=0;i<n;i++){
        strncpy(item,line[i], 6);
        item[6] = '\0';
        
        if(!strcmp_case(item, "SSBOND")){
           get_string(line[i], 7,9, sn);
           rid_of_front_end_space(sn) ;       
           fprintf(fout,"SSBOND  '%s'  ", sn);

            write_conn(fout, line[i],  6,7,  6,  11,13,  15,  17,20,  21,  59,64);


            write_conn(fout, line[i],  6,7,  6,  25,27,  29,  31,34,  35,  66,71);
            fprintf(fout," ?  ?  ?  ?  ?  ? \n");
        }
        
    }

    for(i=0;i<n;i++){
        strncpy(item,line[i], 6);
        item[6] = '\0';
        if(!strcmp_case(item, "LINK  ")){
            fprintf(fout,"LINK   ?  ");
            
            write_conn(fout, line[i],  12,15,  16,  17,19,  21,  22,25,  26,  59,64);
            write_conn(fout, line[i],  42,45,  46,  47,49,  51,  52,55,  56,  66,71);

            fprintf(fout," ?  ?  ?  ?  ?  ? \n");
        }
    }
    
    
    for(i=0;i<n;i++){
        strncpy(item,line[i], 6);
        item[6] = '\0';
        if(!strcmp_case(item, "HYDBND")){
            fprintf(fout,"HYDBND   ?  ");
            
            write_conn(fout, line[i],  12,15,  16,  17,19,  21,  22,26,  27,  59,64);
            write_conn(fout, line[i],  43,46,  47,  48,50,  52,  53,57,  58,  66,71);
            
            get_string(line[i], 29,32, atom);
            alt = line[i][33];
            asym = line[i][35];
            get_string(line[i], 36,40, seq);
            
            ins = line[i][41];
            
            rid_of_front_end_space(atom);
            rid_of_front_end_space(seq);
            
            fprintf(fout," '%s' %c %c  '%s' %c ", atom, alt, asym, seq, ins);
            fprintf(fout," ?\n ");
        }
    }
   
    for(i=0;i<n;i++){
        strncpy(item,line[i], 6);
        item[6] = '\0';
        if(!strcmp_case(item, "SLTBRG")){
            fprintf(fout,"SLTBRG  ?  ");
            
            write_conn(fout, line[i],  12,15,  16,  17,19,  21,  22,25,  26,  59,64);
            write_conn(fout, line[i],  42,45,  46,  47,49,  51,  52,55,  56,  66,71);

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


//for _struct_mon_prot_cis.
    for(i=0;i<n;i++){
        strncpy(item,line[i], 6);
        item[6] = '\0';
        if(strstr_case(item, "CISPEP")){
            fprintf(fout,"#\n");
            fprintf(fout,"loop_\n");
            fprintf(fout,"_struct_mon_prot_cis.pdbx_id  \n");
            fprintf(fout,"_struct_mon_prot_cis.auth_comp_id  \n");
            fprintf(fout,"_struct_mon_prot_cis.auth_asym_id  \n");
            fprintf(fout,"_struct_mon_prot_cis.auth_seq_id  \n");
            fprintf(fout,"_struct_mon_prot_cis.pdbx_PDB_ins_code  \n");
            fprintf(fout,"_struct_mon_prot_cis.pdbx_auth_comp_id_2  \n");
            fprintf(fout,"_struct_mon_prot_cis.pdbx_auth_asym_id_2  \n");
            fprintf(fout,"_struct_mon_prot_cis.pdbx_auth_seq_id_2  \n");
            fprintf(fout,"_struct_mon_prot_cis.pdbx_PDB_ins_code_2  \n");
            fprintf(fout,"_struct_mon_prot_cis.pdbx_PDB_model_num  \n");
            fprintf(fout,"_struct_mon_prot_cis.pdbx_omega_angle  \n");
            break;
        }
    }
    for(i=0;i<n;i++){
        strncpy(item,line[i], 6);
        item[6] = '\0';
        if(!strcmp_case(item, "CISPEP")){
           
            get_string(line[i],7,9, sn);
            rid_of_front_end_space(sn);
            
            fprintf(fout," '%s' ", sn);
            
            get_string(line[i],11,13, comp);
            rid_of_front_end_space(comp);
            asym=line[i][15];
            if(asym == ' ') asym='?';
            
            get_string(line[i],17,20, seq);
            rid_of_front_end_space(seq);
            ins=line[i][21];
            if(ins==' ') ins='?';
            
            fprintf(fout," '%s' %c '%s' %c  ",comp, asym,seq,ins);
            
            get_string(line[i],25,27,comp);
            rid_of_front_end_space(comp);
            
            asym=line[i][29];
            if(asym == ' ') asym='?';
            
            get_string(line[i],31,34,seq);
            rid_of_front_end_space(seq);

            ins=line[i][35];
            if(ins==' ') ins='?';
            fprintf(fout," '%s' %c '%s' %c  ",comp, asym,seq,ins);
            
            get_string(line[i],43,45,seq);
            get_string(line[i],53,58,str);
            rid_of_front_end_space(seq);
            rid_of_front_end_space(str);
            
            fprintf(fout," '%s' '%s' \n", seq, str);
        }
    }
    
    if(line) free_memory_2d(line, nline);
    
}

void write_conn(FILE *fout, char *line, int atom1, int atom2, int alt1, int comp1, 
                int comp2,int asym1, int seq1, int seq2, int ins1, int sym1, int sym2)
{
    char atom[20], seq[20], comp[20], alt[20], asym[20], ins[20], sym[20];
    
    get_string(line, atom1,atom2, atom);
    get_string(line,alt1,alt1,alt);
    get_string(line, comp1,comp2,comp);
    get_string(line,asym1,asym1,asym);
    get_string(line, seq1,seq2,seq);
    get_string(line,ins1,ins1,ins);
    get_string(line, sym1,sym2,sym);
    
    rid_of_front_end_space(sym);
    rid_of_front_end_space(atom);
    rid_of_front_end_space(seq);
    rid_of_front_end_space(comp);
    rid_of_front_end_space(asym);
    rid_of_front_end_space(alt);
    rid_of_front_end_space(ins);
    
    fprintf(fout, " '%s'  '%s'  '%s'  '%s'  '%s'  '%s' '%s' ",
            atom, comp, asym, seq, alt, ins, sym);
   
}

void extract_PDB_ncs(char *infile)
{
    char str[100], c1[2],c2[2];
    int  ncs=0, nlim=0, nncs=0,  ng=0, n0,n1, n2, n3,n;
    FILE *finp;

    if((finp=fopen(infile, "r"))==NULL)
        open_file_error (infile, "extract_PDB_ncs");
    
    strcpy(struct_ncs_dom[ncs].details, "?");
    struct_ncs_dom_lim[nlim].pdbx_component=INI;
    strcpy(struct_ncs_dom_lim[nlim].dom_id, "?" );
    strcpy(struct_ncs_dom_lim[nlim].beg_label_asym_id, "?");
    struct_ncs_dom_lim[nlim].beg_label_seq_id = INI;
    strcpy(struct_ncs_dom_lim[nlim].end_label_asym_id, "?");
    struct_ncs_dom_lim[nlim].end_label_seq_id = INI;
    strcpy(refine_ls_restr_ncs[nncs].dom_id, "?" );
    strcpy(refine_ls_restr_ncs[nncs].pdbx_type, "?");
    strcpy(refine_ls_restr_ncs[nncs].pdbx_asym_id, "?" ); 
    refine_ls_restr_ncs[nncs].pdbx_number = INI; 
    refine_ls_restr_ncs[nncs].rms_dev_position = INI; 
    refine_ls_restr_ncs[nncs].weight_position = INI; 
 
    while (fgets(str, sizeof str, finp) != NULL) {
        if(!strncmp_case(str, "REMARK", 6) && strstr_space(str, "REMARK 3")){
            if(strstr_space(str,"REMARK   3  NCS GROUP NUMBER               :")){ //REFMAC
                ng = get_int(str," :", "\n");
                if(ng>0){
                    sprintf(struct_ncs_dom[ncs].id, "%d", ng);
                    
                    while (fgets(str, sizeof str, finp) != NULL) {
                        if(strstr_space(str,"REMARK   3 CHAIN NAMES :"))
                            strcpy(struct_ncs_dom[ncs].details, get_substr(str," :", "\n"));
                        else if(strstr_space(str," COMPONENT C  SSSEQI  TO  C   SSSEQI   CODE")){
                            while (fgets(str, sizeof str, finp) != NULL) {
                                
                                n=sscanf(str+11, "%d %s %d %s %d %d", &n0, c1, &n1, c2, &n2, &n3);
                                
                                if(n==6){
                                    struct_ncs_dom_lim[nlim].pdbx_component=n0;
                                    strcpy(struct_ncs_dom_lim[nlim].dom_id, struct_ncs_dom[ncs].id);
                                    strcpy(struct_ncs_dom_lim[nlim].beg_label_asym_id, c1);
                                    struct_ncs_dom_lim[nlim].beg_label_seq_id = n1;
                                    strcpy(struct_ncs_dom_lim[nlim].end_label_asym_id, c2);
                                    struct_ncs_dom_lim[nlim].end_label_seq_id = n2;
                                    nlim++;
                                }else if(strstr_space(str,"GROUP CHAIN   COUNT   RMS     WEIGHT")){
                                    while (fgets(str, sizeof str, finp) != NULL) {
                                        if(pattern5(str,":", " ; ", " ; ", "", "")){
                                            strcpy(refine_ls_restr_ncs[nncs].dom_id,struct_ncs_dom[ncs].id);
                                            
                                            get_string(str, 10, 31,refine_ls_restr_ncs[nncs].pdbx_type);
                                            get_string(str, 35, 38,refine_ls_restr_ncs[nncs].pdbx_asym_id);
                                            
                                            refine_ls_restr_ncs[nncs].pdbx_number =  get_int(str,":"," ;");
                                            refine_ls_restr_ncs[nncs].rms_dev_position =  get_float(str,"; "," ;");
                                            refine_ls_restr_ncs[nncs].weight_position =  get_float(strstr(str, ";")+1 ,"; ","\n");
                                            nncs++;
                                        }else
                                            break;
                                    }
                                    
                                }else break;
                                
                                
                            }
                            
                        }
                    }

                    ncs++;
                }
            }else if(strstr_space(str,"REMARK   3  NCS RESTRAINTS.   RMS   SIGMA/WEIGHT")){ //CNS
                
                while (fgets(str, sizeof str, finp) != NULL) {
                    if(pattern5(str,"REMARK   3", " :", ";", "", "")){
                        

                        strcpy(refine_ls_restr_ncs[nncs].dom_id, "?");
                        strcpy(refine_ls_restr_ncs[nncs].pdbx_type, get_substr(str, "REMARK   3 ", ":"));
                        strcpy(refine_ls_restr_ncs[nncs].pdbx_asym_id, "?"); 
                        refine_ls_restr_ncs[nncs].pdbx_number =  INI;
                        refine_ls_restr_ncs[nncs].rms_dev_position =  get_float(str,":"," ;");
                        refine_ls_restr_ncs[nncs].weight_position =  get_float(str,";","\n");
                        nncs++;
                    }else
                        break;
                }
                
            }
            
        }
    }
    NNCS=nncs;
    NLIM=nlim;
    NCS=ncs;
}

void extract_PDB_refine_ls_restr(char *infile, char *prog)
//RMS DEVIATIONS FROM IDEAL VALUES  (refine_ls_restr)    
{
    char str[100], tmp[100];
    int  nr=0;
    FILE *finp;

    if((finp=fopen(infile, "r"))==NULL)
        open_file_error (infile, "extract_PDB_refine_ls_restr");
        
    while (fgets(str, sizeof str, finp) != NULL) {
        if(strstr_space(str, "REMARK   3")<=0)continue;
        if(!strncmp_case(str, "ATOM  ", 6) || !strncmp_case(str, "HETATM", 6) ) break;

        if(strstr_case(prog, "refmac") || strstr_case(prog, "restrain")){ //refmac5            
            if(strstr_space(str, "RMS DEVIATIONS FROM IDEAL VALUES   COUNT    RMS    WEIGHT")|| 
               strstr_space(str, "ISOTROPIC THERMAL FACTOR RESTRAINTS.  COUNT  RMS   WEIGHT")||
               strstr_space(str, "ANISOTROPIC THERMAL FACTOR RESTRAINTS.    COUNT   RMS   WEIGHT")){
            
                while (fgets(str, sizeof str, finp) != NULL) {
                    if(pattern5(str,"REMARK   3",  "):", ";", ";","")){
                        strcpy(refine_ls_restr[nr].type, get_substr(str,"REMARK   3", ":"));
                    
                        strcpy(tmp, strstr(str,"):"));                    
                        refine_ls_restr[nr].number = get_int(tmp, "):", ";");
                        refine_ls_restr[nr].dev_ideal = get_float(tmp, ";", ";");
                        refine_ls_restr[nr].dev_ideal_target  = get_float(strstr(tmp,";")+1, ";", "\n");
                        refine_ls_restr[nr].weight  =  -9998;
                        nr++;
                        NR=nr;
//                        printf("hello %d %s", NR, str);
                        
                    }else{
                        break;
                    }
                }
            }else if(strstr_space(str, "DISTANCE RESTRAINTS.   RMS    SIGMA")|| //rare case
                     strstr_space(str, "ISOTROPIC THERMAL FACTOR RESTRAINTS.    RMS    SIGMA" )){ 
                while (fgets(str, sizeof str, finp) != NULL) {
                    if(pattern5(str, "REMARK   3","(", ")", ":", ";")){
                        strcpy(refine_ls_restr[nr].type, get_substr(str,"REMARK   3", " :"));
                        refine_ls_restr[nr].number = INI;
                        refine_ls_restr[nr].dev_ideal = get_float(str, ":", ";");
                        refine_ls_restr[nr].dev_ideal_target  = -9998;
                        refine_ls_restr[nr].weight  = get_float(str, ";", "\n");
                        nr++;
                        NR=nr;
                    }else{
                        break;
                    }
                }
            }
            
        }else if(strstr_case(prog, "shelx")){ //shelx
            if(strstr_space(str, " RMS DEVIATIONS FROM RESTRAINT TARGET VALUES.")){ 
                
                while (fgets(str, sizeof str, finp) != NULL) {//shelx
                    if(pattern5(str, "REMARK ",  " 3 ", " (", ") ",":")){

                        strcpy(refine_ls_restr[nr].type, get_substr(str,"REMARK   3", ":"));
                        refine_ls_restr[nr].number = INI;
                        refine_ls_restr[nr].dev_ideal = get_float(str, ":", "\n");
                        refine_ls_restr[nr].weight  = INI;
                        nr++;
                        NR=nr;
                    }else{
                        break;
                    }  
                }
            }
        }else if(strstr_case(prog, "cns") || strstr_case(prog, "xplor")||
                 strstr_case(prog, "cnx")){ //CNS/XPLOR/CNX
            if(strstr_space(str, "ISOTROPIC THERMAL FACTOR RESTRAINTS.  RMS  SIGMA")){ 
                
                while (fgets(str, sizeof str, finp) != NULL) {
                    if(pattern5(str, "(", ") ", ":", ";", "\n")){

                        strcpy(refine_ls_restr[nr].type, "?");
                        strcpy(refine_ls_restr[nr].type, get_substr(str,"REMARK   3", ":"));
                        refine_ls_restr[nr].number = INI;
                        refine_ls_restr[nr].dev_ideal = get_float(str, ":", ";");
                        refine_ls_restr[nr].weight  =get_float(str, ";", "\n") ;
                        nr++;
                        NR=nr;
                    }else{
                        break;
                    }
                }
            
            }else if(strstr_space(str, "REMARK   3  RMS DEVIATIONS FROM IDEAL VALUES.")){ 
                
                while (fgets(str, sizeof str, finp) != NULL) {
                    if(pattern5(str, "(", ") ", ":", "", "")){

                        strcpy(refine_ls_restr[nr].type, "?");
                        strcpy(refine_ls_restr[nr].type, get_substr(str,"REMARK   3", ":"));
                        refine_ls_restr[nr].number = INI;
                        refine_ls_restr[nr].dev_ideal = get_float(str, ":", "\n");
                        refine_ls_restr[nr].weight  =INI ;
                        nr++;
                        NR=nr;
                    }else{
                        break;
                    }
                }
            }
        }else if(strstr_case(prog, "tnt")){ //TNT
            if(strstr_space(str, "REMARK   3  RMS DEVIATIONS FROM IDEAL VALUES.    RMS    WEIGHT  COUNT")){ 
                
                while (fgets(str, sizeof str, finp) != NULL) { 
                    if(pattern5(str, "REMARK", ":", ";", ";", "\n")){

                        strcpy(refine_ls_restr[nr].type, "?");
                        strcpy(refine_ls_restr[nr].type, get_substr(str," 3 ", ":"));
                        refine_ls_restr[nr].dev_ideal = get_float(str, ":", ";");
                        refine_ls_restr[nr].weight  = get_float(str, ";", ";") ;
                        refine_ls_restr[nr].number = get_int(strstr_case(str,";")+1, ";", "\n");
                        nr++;
                        NR=nr;
                    }else{
                        break;
                    }  
                }
            }
            
        } else if(strstr_case(prog, "NUCLSQ")|| strstr_case(prog, "PROLSQ")){ //NUCLSQ
            if(strstr_space(str, " DISTANCE RESTRAINTS.      RMS     SIGMA")||
               strstr_space(str, " NON-BONDED CONTACT RESTRAINTS.") ||
               strstr_space(str, "ISOTROPIC THERMAL FACTOR RESTRAINTS.  RMS  SIGMA")){

                while (fgets(str, sizeof str, finp) != NULL) { 
                    if(pattern5(str, "REMARK", ") ", ":", ";",  "\n")){

                        strcpy(refine_ls_restr[nr].type, "?");
                        strcpy(refine_ls_restr[nr].type, get_substr(str," 3 ", ":"));
                        refine_ls_restr[nr].dev_ideal = get_float(str, ":", ";");
                        refine_ls_restr[nr].weight  = get_float(str, ";", "\n") ;
                        refine_ls_restr[nr].number = INI;
                        nr++;
                        NR=nr;
                    }else{
                        break;
                    }
                }
                
            } else if(strstr_space(str, "REMARK   3   PLANE RESTRAINT  (A) :")||  
                      strstr_space(str, "REMARK   3   CHIRAL-CENTER RESTRAINT   (A**3) :")){
            
                strcpy(refine_ls_restr[nr].type, "?"); 
                strcpy(refine_ls_restr[nr].type, get_substr(str," 3 ", ":"));
                refine_ls_restr[nr].dev_ideal = get_float(str, ":", ";");
                refine_ls_restr[nr].weight  = get_float(str, ";", "\n") ;
                refine_ls_restr[nr].number = INI;
                nr++;
                NR=nr;
            } 
        }
        
    }
    
    fclose(finp);
}

 

void extract_PDB_head(char *infile)
{
    char str[100], *details=NULL, tmp[80];
    int nr=0, ntop=0, nparam=0;
    
    
    FILE *finp;

    if((finp=fopen(infile, "r"))==NULL)
        open_file_error (infile, "extract_PDB_head");
    
     
    strcpy(PROG, "?");
    while (fgets(str, sizeof str, finp) != NULL) {
        
        if( !strncmp_case(str, "ATOM", 4) || !strncmp_case(str, "HETATM", 6)) break;
        
            //DATA USED IN REFINEMENT.  (refine.)
        if(strstr_space(str, "REMARK 3  RESOLUTION RANGE HIGH (ANGSTROMS) :")){
            refine.ls_d_res_high = get_float(str, ":", "\n");
            refine_hist.d_res_high = refine.ls_d_res_high;
                
        }else if (strstr_space(str, "REMARK 3  RESOLUTION RANGE LOW  (ANGSTROMS) :")){
            refine.ls_d_res_low = get_float(str, ":", "\n");
            refine_hist.d_res_low = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  DATA CUTOFF            (SIGMA(F)) :")){
            refine.pdbx_ls_sigma_F = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   DATA CUTOFF HIGH (ABS(F)) :")){
            refine.pdbx_data_cutoff_high_absF = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  DATA CUTOFF LOW (ABS(F)) :")){
            refine.pdbx_data_cutoff_low_absF = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3 COMPLETENESS FOR RANGE    (%) :") ||
                  strstr_space(str, "REMARK 3 COMPLETENESS (WORKING+TEST) (%) :")){
            refine.ls_percent_reflns_obs = get_float(str, ":", "\n");
                     
        }else if (strstr_space(str, "REMARK 3 NUMBER OF REFLECTIONS             :")){
            refine.ls_number_reflns_obs= get_int(str, ":", "\n");

        }else if (strstr_space(str, "REMARK 3 TOTAL NUMBER OF REFLECTIONS   (NO CUTOFF) :")){
            refine.ls_number_reflns_all = get_int(str, ":", "\n");
                
                
 //FIT TO DATA USED IN REFINEMENT. (refine.)
        }else if (strstr_space(str, "REMARK 3 CROSS-VALIDATION METHOD       :") ){
            refine.pdbx_ls_cross_valid_method = get_substr(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  FREE R VALUE TEST SET SELECTION  :")){
            refine.pdbx_R_Free_selection_details =get_substr(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  R VALUE     (WORKING + TEST SET) :")){
            refine.ls_R_factor_all = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3 R VALUE      (WORKING SET) :") ){
            refine.ls_R_factor_R_work = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  FREE R VALUE         :")){
            refine.ls_R_factor_R_free = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  FREE R VALUE TEST SET SIZE   (%) :")){
            refine.ls_percent_reflns_R_free = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  FREE R VALUE TEST SET COUNT      :")){
            refine.ls_number_reflns_R_free = get_int(str, ":", "\n");
            
        }else if (strstr_space(str, "REMARK 3   ESTIMATED ERROR OF FREE R VALUE :")){
            refine.ls_R_factor_R_free_error = get_float(str, ":", "\n");

            
// FIT TO DATA USED IN REFINEMENT (NO CUTOFF)._pdbx_refine.          
        }else if (strstr_space(str, "REMARK 3  R VALUE (WORKING + TEST SET, NO CUTOFF) :")){
            pdbx_refine.R_factor_all_no_cutoff = get_float(str, ":", "\n");
            if(strstr_case(PROG, "SHELX"))
                refine.ls_R_factor_all = pdbx_refine.R_factor_all_no_cutoff;
            
        }else if (strstr_space(str, "REMARK 3 R VALUE          (WORKING SET, NO CUTOFF) :")){
            pdbx_refine.R_factor_obs_no_cutoff = get_float(str, ":", "\n");
            if(strstr_case(PROG, "SHELX"))
                refine.ls_R_factor_obs = pdbx_refine.R_factor_obs_no_cutoff;
            
        }else if (strstr_space(str, "REMARK 3  FREE R VALUE           (NO CUTOFF) :")){
            pdbx_refine.free_R_factor_no_cutoff = get_float(str, ":", "\n");
            if(strstr_case(PROG, "SHELX"))
                refine.ls_R_factor_R_free = pdbx_refine.free_R_factor_no_cutoff;
            
        }else if ( strstr_space(str, "REMARK 3  FREE R VALUE TEST SET SIZE (%, NO CUTOFF) :")){
            pdbx_refine.free_R_val_test_set_size_perc_no_cutoff = get_float(str, ":", "\n");
            if(strstr_case(PROG, "SHELX"))
                refine.ls_percent_reflns_R_free =pdbx_refine.free_R_val_test_set_size_perc_no_cutoff;
            
        }else if (strstr_space(str, "REMARK 3  FREE R VALUE TEST SET COUNT   (NO CUTOFF) :")){
            pdbx_refine.free_R_val_test_set_ct_no_cutoff = get_int(str, ":", "\n");
            if(strstr_case(PROG, "SHELX"))
                refine.ls_number_reflns_R_free=pdbx_refine.free_R_val_test_set_ct_no_cutoff;

        }else if (strstr_space(str, "REMARK   3   TOTAL NUMBER OF REFLECTIONS   (NO CUTOFF) :")){
            pdbx_refine.number_reflns_obs_no_cutoff = get_int(str, ":", "\n");
            if(strstr_case(PROG, "SHELX"))
                refine.ls_number_reflns_all = pdbx_refine.number_reflns_obs_no_cutoff;
            
// FIT/AGREEMENT OF MODEL FOR DATA WITH F>4SIG(F).

        }else if (strstr_space(str, "REMARK   3   R VALUE   (WORKING + TEST SET, F>4SIG(F)) :")){
            pdbx_refine.R_factor_all_4sig_cutoff = get_float(str, ":", "\n");
            
        }else if (strstr_space(str, "REMARK   3   R VALUE          (WORKING SET, F>4SIG(F)) :")){
            pdbx_refine.R_factor_obs_4sig_cutoff = get_float(str, ":", "\n");
            
        }else if (strstr_space(str, "REMARK   3   FREE R VALUE                  (F>4SIG(F)) :")){
            pdbx_refine.free_R_factor_4sig_cutoff = get_float(str, ":", "\n");
            
        }else if (strstr_space(str, "REMARK   3   FREE R VALUE TEST SET SIZE (%, F>4SIG(F)) :")){
            pdbx_refine.free_R_val_test_set_size_perc_4sig_cutoff = get_float(str, ":", "\n");
            
        }else if (strstr_space(str, "REMARK   3   FREE R VALUE TEST SET COUNT   (F>4SIG(F)) :")){
            pdbx_refine.free_R_val_test_set_ct_4sig_cutoff = get_int(str, ":", "\n");
            
        }else if (strstr_space(str, "REMARK   3   TOTAL NUMBER OF REFLECTIONS   (F>4SIG(F)) :")){
            pdbx_refine.number_reflns_obs_4sig_cutoff = get_int(str, ":", "\n");

// B VALUES.(refine.)
        }else if (strstr_space(str, "REMARK 3  FROM WILSON PLOT    (A**2) :") ||
                  strstr_space(str, "REMARK 3  WILSON B VALUE (FROM FCALC, A**2) :" )){
            reflns.B_iso_Wilson_estimate = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  MEAN B VALUE      (OVERALL, A**2) :")){
            refine.B_iso_mean = get_float(str, ":", "\n");
            
        }else if (strstr_space(str, "REMARK 3  B11 (A**2) :")){
            refine.aniso_B11 = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  B22 (A**2) :")){
            refine.aniso_B22 = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  B33 (A**2) :")){
            refine.aniso_B33 = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  B12 (A**2) :")){
            refine.aniso_B12 = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  B13 (A**2) :")){
            refine.aniso_B13 = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   B23 (A**2) :")){
            refine.aniso_B23 = get_float(str, ":", "\n");

 //CORRELATION COEFFICIENTS.(refine.)

        }else if (strstr_space(str, "REMARK 3  CORRELATION COEFFICIENT FO-FC      :")){
            refine.correlation_coeff_Fo_to_Fc = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  CORRELATION COEFFICIENT FO-FC FREE      :")){
            refine.correlation_coeff_Fo_to_Fc_free = get_float(str, ":", "\n");
                

 // ESTIMATED OVERALL COORDINATE ERROR. (refine.)
        }else if (strstr_space(str, "REMARK 3  ESU BASED ON R VALUE       (A):")){
            refine.pdbx_overall_ESU_R  = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  ESU BASED ON FREE R VALUE   (A):")){
            refine.pdbx_overall_ESU_R_Free  = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  ESU BASED ON MAXIMUM LIKELIHOOD    (A):  ")){
            refine.overall_SU_ML  = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  ESU FOR B VALUES BASED ON MAXIMUM LIKELIHOOD (A**2):")){
            refine.overall_SU_B = get_float(str, ":", "\n");

 // BULK SOLVENT MODELLING.(refine.)
        }else if (strstr_space(str, "REMARK   3   METHOD USED :")){
            refine.solvent_model_details=get_substr(str, ":", "\n");

        }else if (strstr_space(str, "REMARK   3   KSOL     :")){
            refine.solvent_model_param_ksol  = get_float(str, ":", "\n");

        }else if (strstr_space(str, "REMARK   3    BSOL    :")){
            refine.solvent_model_param_bsol  = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  VDW PROBE RADIUS   :")){
            refine.pdbx_solvent_vdw_probe_radii  = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  ION PROBE RADIUS   :")){
            refine.pdbx_solvent_ion_probe_radii  = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   SHRINKAGE RADIUS   :")){
            refine.pdbx_solvent_shrinkage_radii  = get_float(str, ":", "\n");

        }else if (strstr_space(str, "REMARK   3  ISOTROPIC THERMAL MODEL  :")){
            refine.pdbx_isotropic_thermal_model= get_substr(str, ":", "\n");

                
        }else if (strstr_space(str, "REMARK   3 STEREOCHEMISTRY TARGET VALUES : ")){ //SHELX
            refine.pdbx_stereochemistry_target_values= get_substr(str, ":", "\n");
        }else if (strstr_space(str, "REMARK   3  REFINEMENT TARGET :")){ //CNS/REFMAC5
            refine.pdbx_stereochemistry_target_values= get_substr(str, ":", "\n");
        }else if (strstr_space(str, "REMARK   3  STEREOCHEMISTRY :")){ //TNT
            refine.pdbx_stereochemistry_target_values= get_substr(str, ":", "\n");
            
                
        }else if (strstr_space(str, "REMARK   3  SPECIAL CASE:")){
            refine.pdbx_stereochem_target_val_spec_case = get_substr(str, ":", "\n"); 
        }else if (strstr_space(str, "REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: ")){
            refine.pdbx_method_to_determine_struct = get_substr(str, ":", "\n");
        }else if (strstr_space(str, "REMARK   3  NUMBER OF LEAST-SQUARES PARAMETERS :")){
            refine.ls_number_parameters= get_int(str, ":", "\n");
        }else if (strstr_space(str, "REMARK   3  NUMBER OF RESTRAINTS    :")){
            refine.ls_number_restraints= get_int(str, ":", "\n");
        }else if (strstr_space(str, "REMARK   3  OTHER REFINEMENT REMARKS: ")){
            
            
            sscanf(strstr(str, ":")+1, "%s", tmp);
            if(strlen(tmp)>6 &&  strcmp(tmp, "NULL") &&  strcmp(tmp, "NONE")) {
                
                details = get_substr(str, ":", "\n");
        
                while(fgets(str, sizeof str, finp)!=NULL){
                    if(strncmp(str, "REMARK   3", 10)) {
                        refine.details = details;
                        break;
                    }
                    strcat(details,  "\n ");
                    strcat(details, get_substr(str, "REMARK   3 ", "\n"));
                }
            }
            

        }else if (!strncmp_case(str, "REMARK", 6) && strstr_space(str, "REMARK refinement resolution:")){ //cns_non-standard
            refine.ls_d_res_low = get_float(str, ":", "-");
            refine.ls_d_res_high = get_float(str, "-", "\n");
            
        }else if (!strncmp_case(str, "REMARK", 6) && strstr_space(str, "REMARK number of reflections rejected:")){//cns_non-standard
            refine.pdbx_ls_sigma_F = get_float(str, ":", "( ");   

        }else if (!strncmp_case(str, "REMARK", 6) && strstr_space(str, "REMARK total number of reflections used:") ){//cns_non-standard
            refine.ls_percent_reflns_obs = get_float(str, " ( ", " % ");
            refine.ls_number_reflns_obs = get_int(str, ":", "(");

        }else if (!strncmp_case(str, "REMARK", 6) && strstr_space(str, "REMARK number of reflections in working set:") ){//cns_non-standard
            refine.ls_number_reflns_R_work = get_int(str, ":", "(");
            
        }else if (!strncmp_case(str, "REMARK", 6) && strstr_space(str, "REMARK final    r= ") &&
                  pattern5(str,"r=", "free_r=", "", "", "")){//cns_non-standard
            refine.ls_R_factor_R_work = get_float(str, "r=", "free_r=");
            refine.ls_R_factor_R_free = get_float(str, "free_r=", "\n");
            
        }else if (!strncmp_case(str, "REMARK", 6) &&
                  pattern5(str, "REMARK rmsd bonds=", "rmsd angles=", "","","") ){
            
            
            
            strcpy(refine_ls_restr[nr].type, "?");
            strcpy(refine_ls_restr[nr].type, "c_bond_d");
            refine_ls_restr[nr].number = INI;
            refine_ls_restr[nr].dev_ideal = get_float(str, "bonds=", "rmsd angles=");
            refine_ls_restr[nr].weight  =INI;
            nr++;
            NR=nr;
            
            strcpy(refine_ls_restr[nr].type, "?");
            strcpy(refine_ls_restr[nr].type, "c_angle_d");
            refine_ls_restr[nr].number = INI;
            refine_ls_restr[nr].dev_ideal = get_float(str,  "rmsd angles=", "\n");
            refine_ls_restr[nr].weight  =INI;
            nr++;
            NR=nr;
            
        }else if (!strncmp_case(str, "REMARK", 6) &&
                  pattern5(str, "B rmsd for bonded mainchain", "atoms=", "target=","","")){
            strcpy(refine_ls_restr[nr].type, "?");
            strcpy(refine_ls_restr[nr].type, "c_mcbond_it");
            refine_ls_restr[nr].number = INI;
            refine_ls_restr[nr].dev_ideal = get_float(str, "atoms=", "target");
            refine_ls_restr[nr].weight  = get_float(str,  "target=", "\n");
            nr++;
            NR=nr;
            
        }else if (!strncmp_case(str, "REMARK", 6) &&
                  pattern5(str, "B rmsd for bonded sidechain", "atoms=", "target=","","")){
            strcpy(refine_ls_restr[nr].type, "?");
            strcpy(refine_ls_restr[nr].type, "c_scbond_it");
            refine_ls_restr[nr].number = INI;
            refine_ls_restr[nr].dev_ideal = get_float(str, "atoms=", "target");
            refine_ls_restr[nr].weight  = get_float(str,  "target=", "\n");
            nr++;
            NR=nr;
            
        }else if (!strncmp_case(str, "REMARK", 6) &&
                  pattern5(str, "B rmsd for angle mainchain", "atoms=", "target=","","")){
            strcpy(refine_ls_restr[nr].type, "?");
            strcpy(refine_ls_restr[nr].type, "c_mcangle_it");
            refine_ls_restr[nr].number = INI;
            refine_ls_restr[nr].dev_ideal = get_float(str, "atoms=", "target");
            refine_ls_restr[nr].weight  = get_float(str,  "target=", "\n");
            nr++;
            NR=nr;
        }else if (!strncmp_case(str, "REMARK", 6) &&
                  pattern5(str, "B rmsd for angle sidechain", "atoms=", "target=","","")){
            strcpy(refine_ls_restr[nr].type, "?");
            strcpy(refine_ls_restr[nr].type, "c_scangle_it");
            refine_ls_restr[nr].number = INI;
            refine_ls_restr[nr].dev_ideal = get_float(str, "atoms=", "target");
            refine_ls_restr[nr].weight  = get_float(str,  "target=", "\n");
            nr++;
            NR=nr;
            
//            printf("hello= %d, %.2f\n", NR, refine_ls_restr[NR-1].weight);
            
            
        }else if (!strncmp_case(str, "REMARK", 6) &&
                  (pattern5(str, "REMARK topology file", " : ", "","","") ||
                  pattern5(str,"REMARK   3  PARAMETER FILE",  " : ", "","","") )){
            pdbx_xplor_file[ntop].topol_file = get_substr(str," : ", "\n");
            
            pdbx_xplor_file[ntop].ntop = ntop;
            ntop++;
            
        }else if (!strncmp_case(str, "REMARK", 6) && 
                  (pattern5(str, "REMARK parameter file", " : ", "","","") ||
                   pattern5(str, "REMARK   3  TOPOLOGY FILE", " : ", "","","") )){
            pdbx_xplor_file[nparam].param_file = get_substr(str," : ", "\n");
            
            pdbx_xplor_file[nparam].nparam = nparam;
            nparam++;
            
            
        }else if (strstr_space(str, "REMARK number of reflections in test set:")){//cns_non-standard
            refine.ls_number_reflns_R_free = get_int(str, ":", "(");
            refine.ls_percent_reflns_R_free = get_float(str, "( ", "%");
        }else if (pattern5(str,"REMARK ", "B11=", "B22=", "B33=", "")){//cns_non-standard
            refine.aniso_B11 = get_float(str, "B11=", "B22=");
            refine.aniso_B22 = get_float(str, "B22=", "B33=");
            refine.aniso_B33 = get_float(str, "B33=", "\n");
        }else if (pattern5(str,"REMARK ", "B12=", "B13=", "B23=", "")){//cns_non-standard
            refine.aniso_B12 = get_float(str, "B12=", "B13=");
            refine.aniso_B13 = get_float(str, "B13=", "B23=");
            refine.aniso_B23 = get_float(str, "B23=", "\n");
        }else if (strstr_space(str,"REMARK bulk solvent: density level= ")){//cns_non-standard
            refine.solvent_model_param_bsol = get_float(str, "B-factor=", "A");
               
                
  // FIT IN THE HIGHEST RESOLUTION BIN. (refine_ls_shell (highest)
        }else if (strstr_space(str, "REMARK 3   TOTAL NUMBER OF BINS USED           :")){
            refine_ls_shell.pdbx_total_number_of_bins_used[0] = get_int(str, ":", "\n");
            refine_ls_shell.nbin = 1;
                
        }else if (strstr_space(str, "REMARK 3 BIN RESOLUTION RANGE HIGH  (A) :") ||
                  strstr_space(str, "REMARK 3 BIN RESOLUTION RANGE HIGH   :")){  //refmac
            refine_ls_shell.d_res_high[0] = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3 BIN RESOLUTION RANGE LOW    (A) :") ||
                  strstr_space(str, "REMARK 3 BIN RESOLUTION RANGE LOW     :") ){
            refine_ls_shell.d_res_low[0] = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  BIN COMPLETENESS (WORKING+TEST) (%) :")){
            refine_ls_shell.percent_reflns_obs[0] = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3 REFLECTIONS IN BIN  (WORKING SET) :")||
                  strstr_space(str, "REMARK 3 REFLECTION IN BIN  (WORKING SET) :")){  //refmac
            refine_ls_shell.number_reflns_R_work[0] = get_int(str, ":", "\n");
               
        }else if (strstr_space(str, "REMARK 3  BIN R VALUE           (WORKING SET) :")){
            refine_ls_shell.R_factor_R_work[0] = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   BIN FREE R VALUE :")){
            refine_ls_shell.R_factor_R_free[0] = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   BIN FREE R VALUE TEST SET SIZE (%) :")){ 
            refine_ls_shell.percent_reflns_R_free[0] = get_float(str, ":", "\n");

        }else if (strstr_space(str, "REMARK 3  BIN FREE R VALUE SET COUNT       :")||   //refmac
                  strstr_space(str, "REMARK 3  BIN FREE R VALUE TEST SET COUNT      :")){
            refine_ls_shell.number_reflns_R_free[0] = get_int(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   ESTIMATED ERROR OF BIN FREE R VALUE :")){
            refine_ls_shell.R_factor_R_free_error[0] = get_float(str, ":", "\n");
                

                    // NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT.(refine_hist)
        }else if (strstr_space(str, "REMARK 3   PROTEIN ATOMS :")){
            refine_hist.pdbx_number_atoms_protein = get_int(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  NUCLEIC ACID ATOMS :")){
            refine_hist.pdbx_number_atoms_nucleic_acid = get_int(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   HETEROGEN ATOMS :")){
            refine_hist.pdbx_number_atoms_ligand = get_int(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   SOLVENT ATOMS :")){
                refine_hist.number_atoms_solvent = get_int(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   ALL ATOMS                :")){
            refine_hist.number_atoms_total = get_int(str, ":", "\n");

                    // ESTIMATED COORDINATE ERROR. (refine_analyze)
        }else if (strstr_space(str, "REMARK 3  ESD FROM LUZZATI PLOT (A) :")){
            refine_analyze.Luzzati_coordinate_error_obs = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  ESD FROM SIGMAA (A) :")){
            refine_analyze.Luzzati_sigma_a_obs = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3   LOW RESOLUTION CUTOFF (A) :")){
            refine_analyze.Luzzati_d_res_low_obs = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  ESD FROM C-V LUZZATI PLOT (A) :")){
            refine_analyze.Luzzati_coordinate_error_free = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK 3  ESD FROM C-V SIGMAA (A) :")){
            refine_analyze.Luzzati_sigma_a_free = get_float(str, ":", "\n");
                
        }else if (strstr_space(str, "REMARK   3   PROGRAM     :")){
            strcpy(PROG, get_substr(str," :", "\n"));
                
// not remarks:

        } else if(!strncmp_case(str, "CRYST1 ", 7)){
            cell.length_a = get_float_by_length(str,6, 14);
            cell.length_b = get_float_by_length(str,15, 23);
            cell.length_c = get_float_by_length(str,24,32) ;
            cell.angle_alpha = get_float_by_length(str,33,39);
            cell.angle_beta = get_float_by_length(str,40,46);
            cell.angle_gamma = get_float_by_length(str,47,53);
            get_string(str,55, 65, symmetry.space_group_name_H_M);
            rid_of_front_end_space(symmetry.space_group_name_H_M);
            
            cell.Z_PDB = get_int_by_length(str,66,69);
            

        }else if(!strncmp_case(str, "ORIGX1 ", 7)){
            database_PDB_matrix.origx11 = get_float_by_length(str, 10, 19);
            database_PDB_matrix.origx12 = get_float_by_length(str, 20, 29);
            database_PDB_matrix.origx13 = get_float_by_length(str, 30, 39);
            database_PDB_matrix.origx_vector1 = get_float_by_length(str, 45, 54);
        }else if(!strncmp_case(str, "ORIGX2 ", 7)){
            database_PDB_matrix.origx21 = get_float_by_length(str, 10, 19);
            database_PDB_matrix.origx22 = get_float_by_length(str, 20, 29);
            database_PDB_matrix.origx23 = get_float_by_length(str, 30, 39);
            database_PDB_matrix.origx_vector2 = get_float_by_length(str, 45, 54);
        }else if(!strncmp_case(str, "ORIGX3 ", 7)){
            database_PDB_matrix.origx31 = get_float_by_length(str, 10, 19);
            database_PDB_matrix.origx32 = get_float_by_length(str, 20, 29);
            database_PDB_matrix.origx33 = get_float_by_length(str, 30, 39);
            database_PDB_matrix.origx_vector3 = get_float_by_length(str, 45, 54);
            
        }else if(!strncmp_case(str, "SCALE1 ", 7)){
            atom_sites.fract_transf_matrix11 = get_float_by_length(str, 10, 19);
            atom_sites.fract_transf_matrix12 = get_float_by_length(str, 20, 29);
            atom_sites.fract_transf_matrix13 = get_float_by_length(str, 30, 39);
            atom_sites.fract_transf_vector1  = get_float_by_length(str, 45, 54);
        }else if(!strncmp_case(str, "SCALE2 ", 7)){
            atom_sites.fract_transf_matrix21 = get_float_by_length(str, 10, 19);
            atom_sites.fract_transf_matrix22 = get_float_by_length(str, 20, 29);
            atom_sites.fract_transf_matrix23 = get_float_by_length(str, 30, 39);
            atom_sites.fract_transf_vector2  = get_float_by_length(str, 45, 54);
        }else if(!strncmp_case(str, "SCALE3 ", 7)){
            atom_sites.fract_transf_matrix31 = get_float_by_length(str, 10, 19);
            atom_sites.fract_transf_matrix32 = get_float_by_length(str, 20, 29);
            atom_sites.fract_transf_matrix33 = get_float_by_length(str, 30, 39);
            atom_sites.fract_transf_vector3  = get_float_by_length(str, 45, 54);
            
        }        

    }
    fclose(finp);
}
    

void write_PDB_resid(FILE *fout, char *str, long len)
{
    
    char resname[20], resid[10];
    
    if(len>=20){
        fprintf(fout,"Please adjust the length of string!\n");
        return;
    }
    
    strncpy(resname, str, len);
    resname[len] = '\0';
    
    rid_of_front_space(resname);
    rid_of_end_space(resname);
    
    if(strlen(resname)<=0) {
        fprintf(fout,". ");
        return;
    }

    if(!strcmp_case(resname, "ADE")){
        strcpy(resid, "  A");
        
    }else if(!strcmp_case(resname, "GUA")){ 
        strcpy(resid, "  G");
        
    }else if(!strcmp_case(resname, "URA")){
        strcpy(resid, "  U");
        
    }else if(!strcmp_case(resname, "CYT")){
        strcpy(resid, "  C");
        
    }else if(!strcmp_case(resname, "THY")){ 
        strcpy(resid, "  T");
        
    }else{
        strcpy(resid, resname);
    }
    
    rid_of_front_end_space(resid);
    fprintf(fout," '%s' ", resid);
    
}


void write_PDB_item(FILE *fout, char *str, long len, int format, int digit)
/*write each items for the pdb record. */
{
    char tmp[20];
    int n;
    float a;
    
    if(len>=20){
        fprintf(fout,"Please adjust the length of string!\n");
        return;
    }
    
    strncpy(tmp, str, len);
    tmp[len] = '\0';
    
    rid_of_front_end_space(tmp);
    if(strlen(tmp)<=0) {
        fprintf(fout,". ");
        return;
    }
    
    if(format==1){ //char
        fprintf(fout,"\"%s\" ", tmp);   
    }else if(format==2){  //int
        if(sscanf(tmp, "%d", &n) ==1) 
            fprintf(fout, "%d ", n);
        else
            fprintf(fout, "? ");
        
    }else if(format==3){ //float
        sscanf(tmp, "%f", &a);
        if(digit==3){
            fprintf(fout,"%.3f ", a);
        }else if(digit==2){
            fprintf(fout,"%.2f ", a);
        }else if(digit==1){
            fprintf(fout,"%.1f ", a);
        }else if(digit==4){
            fprintf(fout,"%.4f ", a);
        }else {
            fprintf(fout,"Please adjust the digital number (%d)\n", digit);
            return;
        }
    }else{
        fprintf(fout,"The given format is not (int, char, float)\n");
        return;
    }
}


void pdb2cif_coord(FILE *fout, char *inpfile)
/* convert the  coordinates and aniso. temp of a PDB file to mmcif*/
{
    char str[100], **atoms=NULL, **anis=NULL;
    int i=0, n = 0, m = 0, k=0, len;
    float bfactor=0;
    
    long nline=0;
    FILE *fp;
    
    
    if((fp = fopen(inpfile, "r"))==NULL) {
        open_file_error(inpfile, "pdb2cif_coord");
    }
    
    nline=num_of_line(inpfile);    
    atoms = new char *[nline];
    anis = new char *[nline];

    while (fgets(str, sizeof str, fp) != NULL) {
        len=strlen(str);
        if ((!strncmp_case(str, "ATOM  ", 6) ||
             !strncmp_case(str, "HETATM", 6) ||
             !strncmp_case(str, "SIGATM", 6)) && len>54){
            atoms[n]=new char[81];
            strcpy(atoms[n], str);
            n++;
        }else if ((!strncmp_case(str, "ANISOU", 6) ||
                   !strncmp_case(str, "SIGUIJ", 6)) && len>69) {
            anis[m]=new char[81];
            strcpy(anis[m], str);
            m++;
        }
    }
    nline = m;
    
    if(n>0){
        fprintf(fout,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
                "loop_", 
                "_atom_site.group_PDB",
                "_atom_site.id",
                
                "_atom_site.auth_atom_id",
                "_atom_site.label_atom_id",
                
                "_atom_site.label_alt_id",
                
                "_atom_site.auth_comp_id",
                "_atom_site.label_comp_id",
                
                "_atom_site.auth_asym_id",
                "_atom_site.label_asym_id",
                
                "_atom_site.auth_seq_id" ,
                "_atom_site.label_seq_id" ,
                
                "_atom_site.pdbx_PDB_ins_code",
                
                "_atom_site.Cartn_x", 
                "_atom_site.Cartn_y", 
                "_atom_site.Cartn_z", 
                "_atom_site.occupancy", 
                "_atom_site.B_iso_or_equiv",
                
                "_atom_site.Cartn_x_esd", 
                "_atom_site.Cartn_y_esd", 
                "_atom_site.Cartn_z_esd", 
                "_atom_site.occupancy_esd", 
                "_atom_site.B_iso_or_equiv_esd");
        
        for(i=0; i<n; i++){
            len=strlen(atoms[i]);
            
            if ((!strncmp_case(atoms[i], "ATOM  ", 6)||
                 !strncmp_case(atoms[i], "HETATM", 6)) && len>54 ) {
                
                strcpy(str, atoms[i]);
                write_PDB_item(fout, str+0, 6, 1, 0);   // _atom_site.group_PDB
                write_PDB_6_27(fout, str);  //column 6_27
                write_PDB_30_70(fout, str, 1);//column 30_70
                bfactor =  bfactor+ get_float_by_length(str, 60, 65);
            }
            
        
            if(i<n-1 && !strncmp_case(atoms[i+1], "SIGATM", 6)){
                k=i+1;
                strcpy(str, atoms[k]);
                write_PDB_30_70(fout, str, 1);
                fprintf(fout,"\n");
                i=k;
            
            }else{
                fprintf(fout,"? ? ? ? ?\n");
            }
        }
        
    }
    
    if(n>0 && refine.B_iso_mean <0 && bfactor>0){
        refine.B_iso_mean = bfactor/float(n);        
    }
    
    
    if(m>0){  
        fprintf(fout,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", 
                "loop_", 
                "_atom_site_anisotrop.id",
                "_atom_site_anisotrop.pdbx_auth_atom_id",
                "_atom_site_anisotrop.pdbx_label_atom_id",
                "_atom_site_anisotrop.pdbx_label_alt_id",
                "_atom_site_anisotrop.pdbx_auth_comp_id",
                "_atom_site_anisotrop.pdbx_label_comp_id",
                "_atom_site_anisotrop.pdbx_auth_asym_id",
                "_atom_site_anisotrop.pdbx_label_asym_id",
                "_atom_site_anisotrop.pdbx_auth_seq_id" ,
                "_atom_site_anisotrop.pdbx_label_seq_id" ,
                "_atom_site_anisotrop.pdbx_PDB_ins_code",            
                "_atom_site_anisotrop.U[1][1]", 
                "_atom_site_anisotrop.U[1][2]", 
                "_atom_site_anisotrop.U[1][3]", 
                "_atom_site_anisotrop.U[2][2]", 
                "_atom_site_anisotrop.U[2][3]", 
                "_atom_site_anisotrop.U[3][3]", 
                
                "_atom_site_anisotrop.U[1][1]_esd", 
                "_atom_site_anisotrop.U[1][2]_esd", 
                "_atom_site_anisotrop.U[1][3]_esd", 
                "_atom_site_anisotrop.U[2][2]_esd", 
                "_atom_site_anisotrop.U[2][3]_esd", 
                "_atom_site_anisotrop.U[3][3]_esd");
        
        for(i=0; i<m; i++){
            if (!strncmp_case(anis[i], "ANISOU", 6) ){
                strcpy(str, anis[i]);
                write_PDB_6_27(fout, str);
                write_PDB_30_70(fout, str, 2);
            }
            if(i<m-1 && !strncmp_case(anis[i+1], "SIGUIJ", 6)){
                k=i+1;
                strcpy(str, anis[k]);
                write_PDB_30_70(fout, str, 2);
                fprintf(fout,"\n");
                i=k;
            
            }else{
                fprintf(fout,"? ? ? ? ? ?\n");
            }   
        }
        
    }
    free_memory_2d(atoms, nline);
    free_memory_2d(anis, nline);
}
    
void write_PDB_6_27(FILE *fout, char *str)
{
    char alt, chainID, icode, tmp[10], atom[10];
    int n;
    
    
//    write_PDB_item(fout, str+6, 6, 2, 0);   // _atom_site.id
    strncpy(tmp, str+6, 6); // _atom_site.id
    tmp[6] = '\0';
    (sscanf(tmp, "%d", &n)==1) ? fprintf(fout,"%d ",n):fprintf(fout," . ");

    strncpy(tmp, str+12, 4); 
    tmp[4] = '\0';
    strcpy(atom, tmp);
    rid_of_front_end_space(tmp);
    fprintf(fout,"'%s' ",tmp); /* _atom_site.auth_atom_id */
    
    if(atom[3]=='*') atom[3]='\'';
    if(strstr_case(atom, "C5A")) strcpy(atom,"C5M");
    rid_of_front_end_space(atom);
    fprintf(fout,"'%s' ",atom); /* _atom_site.label_atom_id */
    
    alt = str[16];
    if(alt == ' ') alt = '.'; 
    fprintf(fout,"%c ",alt);           /* _atom_site.label_alt_id */
    
    strncpy(tmp, str+17, 3);
    tmp[3]='\0';
    rid_of_front_end_space(tmp);
    fprintf(fout,"%s ",tmp);          /* _atom_site.auth_comp_id */
    
    write_PDB_resid(fout, str+17, 3);  /* _atom_site.label_comp_id */
    
    chainID=str[21];
    if(chainID==' ') chainID = '.';
    fprintf(fout,"%c ", chainID);          /* _atom_site.auth_asym_id */
    fprintf(fout,"%c ", chainID);          /* _atom_site.label_asym_id */
    
    write_PDB_item(fout, str+22, 4, 1, 0);  /* _atom_site.auth_seq_id */
    write_PDB_item(fout, str+22, 4, 1, 0);  /* _atom_site.label_seq_id */
    
    icode=str[26];
    if(icode==' ') icode = '.';
    fprintf(fout,"%c ", icode);          /* _atom_site.pdbx_PDB_ins_code*/

//    write_PDB_item(fout, str+76,2, 1, 0);  /* _atom_site.type_symbol*/          

}


void write_PDB_30_70(FILE *fout, char *str, int n)  
{
    char tmp[20];
    int m;
    float a;
    
    if(n==1){ // x,y,z,occu,Biso
        strncpy(tmp, str+30, 8);
        tmp[8] = '\0';
        (sscanf(tmp, "%f", &a)==1) ? fprintf(fout,"%.3f ", a):fprintf(fout, " ? ");

        strncpy(tmp, str+38, 8);
        tmp[8] = '\0';
        (sscanf(tmp, "%f", &a)==1) ? fprintf(fout,"%.3f ", a):fprintf(fout, " ? ");
        
        strncpy(tmp, str+46, 8);
        tmp[8] = '\0';
        (sscanf(tmp, "%f", &a)==1) ? fprintf(fout,"%.3f ", a):fprintf(fout, " ? ");
        
        strncpy(tmp, str+54, 6);
        tmp[6] = '\0';
        (sscanf(tmp, "%f", &a)==1) ? fprintf(fout,"%.2f ", a):fprintf(fout, " ? ");
        
        strncpy(tmp, str+60, 6);
        tmp[6] = '\0';
        (sscanf(tmp, "%f", &a)==1) ? fprintf(fout,"%.2f ", a):fprintf(fout, " ? ");


    }else if(n==2){ //uij

        strncpy(tmp, str+28, 7);
        tmp[7] = '\0';
        (sscanf(tmp, "%d", &m)==1) ? fprintf(fout,"%d ", m):fprintf(fout, " ? ");

        strncpy(tmp, str+35, 7);
        tmp[7] = '\0';
        (sscanf(tmp, "%d", &m)==1) ? fprintf(fout,"%d ", m):fprintf(fout, " ? ");

        strncpy(tmp, str+42, 7);
        tmp[7] = '\0';
        (sscanf(tmp, "%d", &m)==1) ? fprintf(fout,"%d ", m):fprintf(fout, " ? ");

        strncpy(tmp, str+49, 7);
        tmp[7] = '\0';
        (sscanf(tmp, "%d", &m)==1) ? fprintf(fout,"%d ", m):fprintf(fout, " ? ");

        strncpy(tmp, str+56, 7);
        tmp[7] = '\0';
        (sscanf(tmp, "%d", &m)==1) ? fprintf(fout,"%d ", m):fprintf(fout, " ? ");

        strncpy(tmp, str+63, 7);
        tmp[7] = '\0';
        (sscanf(tmp, "%d", &m)==1) ? fprintf(fout,"%d ", m):fprintf(fout, " ? ");
        
    }
}


void write_refine_analyze(FILE *fout)
{
    fprintf(fout,"#\n");
    if(refine_analyze.Luzzati_coordinate_error_obs >-9998)
        fprintf(fout,"_refine_analize.Luzzati_coordinate_error_obs  %.3f\n",
                refine_analyze.Luzzati_coordinate_error_obs);

    if(refine_analyze.Luzzati_sigma_a_obs >-9998)
        fprintf(fout,"_refine_analize.Luzzati_sigma_a_obs  %.3f\n",
                refine_analyze.Luzzati_sigma_a_obs);

    if(refine_analyze.Luzzati_d_res_low_obs >-9998)
        fprintf(fout,"_refine_analize.Luzzati_d_res_low_obs  %.3f\n",
                refine_analyze.Luzzati_d_res_low_obs);

    if(refine_analyze.Luzzati_coordinate_error_free >-9998)
        fprintf(fout,"_refine_analize.Luzzati_coordinate_error_free  %.3f\n",
                refine_analyze.Luzzati_coordinate_error_free);

    if(refine_analyze.Luzzati_sigma_a_free >-9998)
        fprintf(fout,"_refine_analize.Luzzati_sigma_a_free  %.3f\n",
                refine_analyze.Luzzati_sigma_a_free);
}



void write_refine_ls_restr(FILE *fout)
{
    int i;
    char type[80];
        
    static const char *refmac_29[] = 
        {
            "r_bond_refined_d           BOND LENGTHS REFINED ATOMS        (A) ",
            "r_bond_other_d             BOND LENGTHS OTHERS               (A) ",
            "r_angle_refined_deg        BOND ANGLES REFINED ATOMS   (DEGREES) ",
            "r_angle_other_deg          BOND ANGLES OTHERS          (DEGREES) ",
            "r_dihedral_angle_1_deg     TORSION ANGLES, PERIOD 1    (DEGREES) ",
            "r_dihedral_angle_2_deg     TORSION ANGLES, PERIOD 2    (DEGREES) ",
            "r_dihedral_angle_3_deg     TORSION ANGLES, PERIOD 3    (DEGREES) ",
            "r_dihedral_angle_4_deg     TORSION ANGLES, PERIOD 4    (DEGREES) ",
            "r_chiral_restr             CHIRAL-CENTER RESTRAINTS       (A**3) ",
            "r_gen_planes_refined       GENERAL PLANES REFINED ATOMS      (A) ",
            "r_gen_planes_other         GENERAL PLANES OTHERS             (A) ",
            "r_nbd_refined              NON-BONDED CONTACTS REFINED ATOMS (A) ",
            "r_nbd_other                NON-BONDED CONTACTS OTHERS        (A) ",
            "r_nbtor_refined            NON-BONDED TORSION REFINED ATOMS  (A) ",
            "r_nbtor_other              NON-BONDED TORSION OTHERS         (A) ",
            "r_xyhbond_nbd_refined      H-BOND (X...Y) REFINED ATOMS      (A) ",
            "r_xyhbond_nbd_other        H-BOND (X...Y) OTHERS             (A) ",
            "r_symmetry_vdw_refined     SYMMETRY VDW REFINED ATOMS        (A) ",
            "r_symmetry_vdw_other       SYMMETRY VDW OTHERS               (A) ",
            "r_symmetry_hbond_refined   SYMMETRY H-BOND REFINED ATOMS     (A) ",
            "r_symmetry_hbond_other     SYMMETRY H-BOND OTHERS            (A) ",
            "r_mcbond_it                MAIN-CHAIN BOND REFINED ATOMS  (A**2) ",
            "r_mcangle_it               MAIN-CHAIN ANGLE REFINED ATOMS (A**2) ",
            "r_mcbond_other             MAIN-CHAIN BOND OTHER ATOMS    (A**2) ",
            "r_scbond_it                SIDE-CHAIN BOND REFINED ATOMS  (A**2) ",
            "r_scangle_it               SIDE-CHAIN ANGLE REFINED ATOMS (A**2) ",
            "r_rigid_bond_restr         RIGID-BOND RESTRAINTS          (A**2) ",
            "r_sphericity_free          SPHERICITY; FREE ATOMS         (A**2) ",  
            "r_sphericity_bonded        SPHERICITY; BONDED ATOMS       (A**2) "
        };
    
    static const char *cns_9[] = 
        {
            "c_bond_d   BOND LENGTHS                 (A)    ",
            " c_angle_d  ANGLE DISTANCES                      (A)  ",
            " c_angle_deg  BOND ANGLES            (DEGREES)   ",
            " c_dihedral_angle_d   DIHEDRAL ANGLES        (DEGREES) ",
            " c_improper_angle_d   IMPROPER ANGLES        (DEGREES) ",
            " c_mcbond_it  MAIN-CHAIN BOND              (A**2) ",
            " c_mcangle_it  MAIN-CHAIN ANGLE             (A**2) ",
            " c_scbond_it  SIDE-CHAIN BOND              (A**2) ",
            " c_scangle_it  SIDE-CHAIN ANGLE             (A**2) "
        };

    static const char *xplor_9[] = 
        {
            " x_bond_d   BOND LENGTHS                 (A)    ",
            " x_angle_d  ANGLE DISTANCES                      (A)  ",
            " x_angle_deg  BOND ANGLES            (DEGREES)   ",
            " x_dihedral_angle_d   DIHEDRAL ANGLES        (DEGREES) ",
            " x_improper_angle_d   IMPROPER ANGLES        (DEGREES) ",
            " x_mcbond_it  MAIN-CHAIN BOND              (A**2) ",
            " x_mcangle_it  MAIN-CHAIN ANGLE             (A**2) ",
            " x_scbond_it  SIDE-CHAIN BOND              (A**2) ",
            " x_scangle_it  SIDE-CHAIN ANGLE             (A**2) "
        };

    
    static const char *shelx_10[] = 
        {
            "s_bond_d           BOND LENGTHS                         (A) ",
            "s_angle_d          ANGLE DISTANCES                      (A) ",
            "s_similar_dist     SIMILAR DISTANCES (NO TARGET VALUES) (A) ",
            "s_from_restr_planes  DISTANCES FROM RESTRAINT PLANES      (A) ",
            "s_zero_chiral_vol    ZERO CHIRAL VOLUMES               (A**3) ",
            "s_non_zero_chiral_vol   NON-ZERO CHIRAL VOLUMES           (A**3)", 
            "s_anti_bump_dis_restr  ANTI-BUMPING DISTANCE RESTRAINTS     (A) ",
            "s_rigid_bond_adp_cmpnt  RIGID-BOND ADP COMPONENTS         (A**2) ",
            "s_similar_adp_cmpnt   SIMILAR ADP COMPONENTS            (A**2) ",
            "s_approx_iso_adps     APPROXIMATELY ISOTROPIC ADPS      (A**2) "
        };
    
            
    static const char *tnt_9[] = 
        {
            "t_bond_d   BOND LENGTHS                 (A) ",
            "t_angle_deg  BOND ANGLES            (DEGREES) ",
            "t_dihedral_angle_d   TORSION ANGLES         (DEGREES) ",
            "t_incorr_chiral_ct CHIRAL-CENTER RESTRAINT       (A**3)  ",
            "t_pseud_angle   PSEUDOROTATION ANGLES  (DEGREES) ",
            "t_trig_c_planes  TRIGONAL CARBON PLANES       (A) ",
            "t_gen_planes  GENERAL PLANES               (A) ",
            "t_it   ISOTROPIC THERMAL FACTORS (A**2) ",
            "t_nbd   NON-BONDED CONTACTS          (A) "
        };
  
             
    static const char *nuclsq_17[] = 
        {
           
            " n_bond_d             BOND LENGTH                     (A) ",
            " n_angle_d            ANGLE DISTANCE                  (A)",
            " n_planar_d           INTRAPLANAR 1-4 DISTANCE        (A) ",
            " n_hb_or_metal_coord  H-BOND OR METAL COORDINATION    (A) ",
            " n_sugar_bond_it      SUGAR-BASE BONDS             (A**2)",
            " n_sugar_angle_it     SUGAR-BASE ANGLES            (A**2)",
            " n_phos_bond_it       PHOSPHATE BONDS              (A**2)",
            " n_phos_angle_it      PHOSPHATE BOND ANGLE, H-BOND (A**2)",
            " n_plane_restr        PLANE RESTRAINT                  (A)",
            " n_chiral_restr       SINGLE TORSION CONTACT          (A)",
            " n_sugar_bond_d       SUGAR-BASE BOND DISTANCE        (A)",
            " n_sugar_bond_angle_d SUGAR-BASE BOND ANGLE DISTANCE  (A)",
            " n_phos_bond_d        PHOSPHATE BONDS DISTANCE        (A)",
            " n_phos_bond_angle_d  PHOSPHATE BOND ANGLE, H-BOND    (A)",
            " n_chiral_restr       CHIRAL-CENTER RESTRAINT       (A**3)",
            " n_singtor_nbd        SINGLE TORSION         (A)",
            " n_multtor_nbd        MULTIPLE TORSION CONTACT        (A)"
        };
    
    static const char *prolsq_17[] = 
        {
           
            " p_bond_d             BOND LENGTH                     (A) ",
            " p_angle_d            ANGLE DISTANCE                  (A)",
            " p_planar_d           INTRAPLANAR 1-4 DISTANCE        (A) ",
            " p_hb_or_metal_coord  H-BOND OR METAL COORDINATION    (A) ",
            " p_sugar_bond_it      SUGAR-BASE BONDS             (A**2)",
            " p_sugar_angle_it     SUGAR-BASE ANGLES            (A**2)",
            " p_phos_bond_it       PHOSPHATE BONDS              (A**2)",
            " p_phos_angle_it      PHOSPHATE BOND ANGLE, H-BOND (A**2)",
            " p_plane_restr        PLANE RESTRAINT                  (A)",
            " p_chiral_restr       SINGLE TORSION CONTACT          (A)",
            " p_sugar_bond_d       SUGAR-BASE BOND DISTANCE        (A)",
            " p_sugar_bond_angle_d SUGAR-BASE BOND ANGLE DISTANCE  (A)",
            " p_phos_bond_d        PHOSPHATE BONDS DISTANCE        (A)",
            " p_phos_bond_angle_d  PHOSPHATE BOND ANGLE, H-BOND    (A)",
            " p_chiral_restr       CHIRAL-CENTER RESTRAINT       (A**3)",
            " p_singtor_nbd        SINGLE TORSION         (A)",
            " p_multtor_nbd        MULTIPLE TORSION CONTACT        (A)"
        };
    
    static const char *other_17[] = 
        {
           
            " o_bond_d             BOND LENGTH                     (A) ",
            " o_angle_d            ANGLE DISTANCE                  (A)",
            " o_planar_d           INTRAPLANAR 1-4 DISTANCE        (A) ",
            " o_hb_or_metal_coord  H-BOND OR METAL COORDINATION    (A) ",
            " o_sugar_bond_it      SUGAR-BASE BONDS             (A**2)",
            " o_sugar_angle_it     SUGAR-BASE ANGLES            (A**2)",
            " o_phos_bond_it       PHOSPHATE BONDS              (A**2)",
            " o_phos_angle_it      PHOSPHATE BOND ANGLE, H-BOND (A**2)",
            " o_plane_restr        PLANE RESTRAINT                  (A)",
            " o_chiral_restr       SINGLE TORSION CONTACT          (A)",
            " o_sugar_bond_d       SUGAR-BASE BOND DISTANCE        (A)",
            " o_sugar_bond_angle_d SUGAR-BASE BOND ANGLE DISTANCE  (A)",
            " o_phos_bond_d        PHOSPHATE BONDS DISTANCE        (A)",
            " o_phos_bond_angle_d  PHOSPHATE BOND ANGLE, H-BOND    (A)",
            " o_chiral_restr       CHIRAL-CENTER RESTRAINT       (A**3)",
            " o_singtor_nbd        SINGLE TORSION         (A)",
            " o_multtor_nbd        MULTIPLE TORSION CONTACT        (A)"
        };
    
 
    if(refine_ls_restr[0].dev_ideal <-9998 || NR<=0  )return;
    if(NR>0){
        
        fprintf(fout,"#\n");
        fprintf(fout,"loop_\n");
        fprintf(fout,"_refine_ls_restr.type\n");
        fprintf(fout,"_refine_ls_restr.number\n");
        fprintf(fout,"_refine_ls_restr.dev_ideal\n");
        fprintf(fout,"_refine_ls_restr.dev_ideal_target \n");
        fprintf(fout,"_refine_ls_restr.weight \n");
    }
    
    for(i=0; i<NR; i++){
        strcpy(type, refine_ls_restr[i].type);
        if(strstr_case(PROG, "REFMAC") || strstr_case(PROG, "RESTRAIN")){
           convert_restr_2_standard(fout,type , i, refmac_29, 29 );
        } else if(strstr_case(PROG, "CNS") || strstr_case(PROG, "CNX")){
            convert_restr_2_standard(fout,type , i, cns_9, 9); 
        } else if(strstr_case(PROG, "XPLOR")){
            convert_restr_2_standard(fout,type , i, xplor_9, 9); 
        } else if(strstr_case(PROG, "SHELX")){
            convert_restr_2_standard(fout,type , i, shelx_10, 10); 
        } else if(strstr_case(PROG, "TNT")){
            convert_restr_2_standard(fout,type , i, tnt_9, 9); 
        } else if(strstr_case(PROG, "NUCLSQ")){
            convert_restr_2_standard(fout,type , i, nuclsq_17, 17); 
        } else if(strstr_case(PROG, "PROLSQ")){
            convert_restr_2_standard(fout,type , i, prolsq_17, 17); 
        }else
            convert_restr_2_standard(fout,type , i, other_17, 17); 
            
        (refine_ls_restr[i].number>-9998)
            ? fprintf(fout, "%d ", refine_ls_restr[i].number) : fprintf(fout,"?  ");
        
        (refine_ls_restr[i].dev_ideal>-9998)
            ? fprintf(fout,"%.3f ", refine_ls_restr[i].dev_ideal): fprintf(fout,"?  ") ;
        
        (refine_ls_restr[i].dev_ideal_target >-9998)
            ? fprintf(fout, "%.3f ", refine_ls_restr[i].dev_ideal_target ) : fprintf(fout,"? ");
        
        (refine_ls_restr[i].weight >-9998)
            ? fprintf(fout, "%.3f ", refine_ls_restr[i].weight ) : fprintf(fout,"? ");
        
        fprintf(fout,"\n");
    }
    
}

void convert_restr_2_standard(FILE *fout, char *type, int k,  const char **pair, int npair)
{    
    char param[80], str[80];
    int id=0, i;
 
    for(i=0;i<npair;i++){
        if(sscanf(pair[i], "%s", param) !=1 ) continue;
        strcpy(str,pair[i] + strlen(param)+1);
        rid_of_front_space(str);
        rid_of_end_space(str);
        
        if(!strcmp_case(str,type)){
            fprintf(fout,"\"%s\" ",param );
            id=1;
            break;
        }
    }
    
    if(id==0) fprintf(fout,"\"%s\" ", type);    
 
 }
