/* main.h 
 *
 * header file to the main program
 * -------------------------------
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define SLOUPCE 83 /* number of symbols which are considered to be on 1 line of PDB file */
#define VAZBA 1.6 /* (in angstroms) */
                  /* this value was chosen by Bash at all in their work  */
#define PROBE 1.4 /* radius of solvent sphere; default value can be easily changed */

/* structure defining one element */
typedef struct prvek {
  int cislo;
  char ch_znacka[3];
  char amk[3];
  float x;
  float y;
  float z;
  struct prvek *dalsi;
} PRVEK;

/* main (spine) structure,
 * all neighbours are connected with it
 */
typedef struct seznam {
  int cislo;  /* serial number from PDB file */
  char ch_znacka[3]; /* chemical symbol */
  char resName[4]; /* name of residuum which this atom includes */
  int resSeq; /* number of residuum whose part this atom is */
  float x; /* x-coordinate of atom*/
  float y; /* y-coordinate of atom */
  float z; /* z-coordinate of atom */

  /* auxiliary information */
  int nin; /* number of intersecting neighbours */
  int ucsf; /* 0 = Internal, 1 = surface */
  float u_x; /* x-coordinate of central point in UCSF's matrix */
  float u_y;
  float u_z;
  int sur_atom; /* indicator whether the atom is on the surface or not */
  struct seznam *dalsi_seznam;
  struct prvek *dalsi_prvek;
} SEZNAM; 

/* structure for the van der Waals radii storage */
typedef struct radius {
  char znacka_prvku[3];
  float r;
} RADIUS;

/* structure for amino acids abbreviations */
typedef struct amino_abrev {
  char znacka_residua[4];
  char uniliteral;
} AMINO_ABREV;


/* functions from a_nin.c */
void identify_surf_at_nina(SEZNAM *p_sf,char soub[]);
void vypis_nin_atomu(SEZNAM *p_sf);
void vypis_povrchove_atomy_nina_soubor(SEZNAM *p_sf, char in[], char out[], int level,int q);
void vypis_povrchove_atomy_nina_struktura(SEZNAM *p_sf, int level);

/* functions from a_sas.c */
void vypis_povrchove_atomy_sasa_soubor(char vmd_file[], char in[], char out[], double level, int q);
void vypis_povrchove_atomy_sasa_struktura(SEZNAM *p_sf, char vmd_file[], char in[], double level);

/* functions from a_ucsf.c */
void identify_surf_at_ucsfa(SEZNAM *p_sf, char soub[]);
void vypis_povrchove_atomy_ucsfa_soubor(SEZNAM *p_sf, char in[], char out[],int q);
void vypis_povrchove_atomy_ucsfa_struktura(SEZNAM *p_sf);
void vypis_ucsf_atomu(SEZNAM *p_sf);

/* functions from lzs.c */
PRVEK *vytvor_souseda (SEZNAM *p_sf, PRVEK *p_pa, int c_seznam, int c_soused);
PRVEK *najdi_konec_sousedu_prvku_seznamu(SEZNAM *p_sf, int c_seznam);
SEZNAM *vytvor_prvek_seznamu (SEZNAM *p_sa, int c, char z[3], char a[3], int rS, float s1, float s2, float s3);
SEZNAM *najdi_konec_seznamu(SEZNAM *p_sf);
SEZNAM *najdi_prvek_seznamu_podle_cisla (SEZNAM *p_sf, int c);
void vypis_info_o_sousedech_prvku (SEZNAM *p_sa);
void vypis_info_o_prvku_seznamu (SEZNAM *p_sa);
void zrus_seznam(SEZNAM *p_sf);

/* functions from radii.c */
float vratPolomerPrvku (char nazev[3]);

/* functions from readPDB.c */
SEZNAM *nacti_PDB_do_LZS(char soubor[]);

/* functions from amino.c */
char vratJednopismenouZkratku (char nazev[4]);
