mmdb2-2.0.20/0000755000175000017500000000000013714662650012446 5ustar maartenmaartenmmdb2-2.0.20/configure0000744000175000017500000207764313524560424014371 0ustar maartenmaarten#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for mmdb2 2.0.20. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='mmdb2' PACKAGE_TARNAME='mmdb2' PACKAGE_VERSION='2.0.20' PACKAGE_STRING='mmdb2 2.0.20' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="mmdb2/mmdb_math_align.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL OBJDUMP DLLTOOL AS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ac_ct_AR AR AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_maintainer_mode ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures mmdb2 2.0.20 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/mmdb2] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of mmdb2 2.0.20:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF mmdb2 configure 2.0.20 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by mmdb2 $as_me 2.0.20, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # keep in sync with mmdb2/mmdb_defs.h ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers config.h" am__api_version='1.13' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='mmdb2' VERSION='2.0.20' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 $as_echo_n "checking the archiver ($AR) interface... " >&6; } if ${am_cv_ar_interface+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 $as_echo "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=no fi enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' lt_prog_compiler_pic='-Xcompiler -fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # AC_PROG_CXX doesn't fail if compiler is not found, test it explicitely ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : else as_fn_error $? "C++ compiler not found." "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cos" >&5 $as_echo_n "checking for library containing cos... " >&6; } if ${ac_cv_search_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_cos=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_cos+:} false; then : break fi done if ${ac_cv_search_cos+:} false; then : else ac_cv_search_cos=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cos" >&5 $as_echo "$ac_cv_search_cos" >&6; } ac_res=$ac_cv_search_cos if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "need math library" "$LINENO" 5 fi ac_config_files="$ac_config_files Makefile mmdb2.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by mmdb2 $as_me 2.0.20, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ mmdb2 config.status 2.0.20 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "mmdb2.pc") CONFIG_FILES="$CONFIG_FILES mmdb2.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi mmdb2-2.0.20/README0000744000175000017500000000644113271367640013333 0ustar maartenmaarten CCP4 Coordinate Library: support of coordinate-related functionality in protein crystallography applications. Version 1.05 from 26.03.2004 Copyright (C) Eugene Krissinel 2004. ============================================================================ This file contains: 1. License agreement 2. List of incompatibilities with earlier versions. Please read this carefully if you update your version of the Library. ======================= 1. LICENSE AGREEMENT. ======================= This library is free software and is distributed under the terms and conditions of the CCP4 licence agreement as `Part 0' (Annex 2) software, which is version 2.1 of the GNU Lesser General Public Licence (LGPL) with the following additional clause: `You may also combine or link a "work that uses the Library" to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that you give prominent notice with each copy of the work that the specified version of the Library is used in it, and that you include or provide public access to the complete corresponding machine-readable source code for the Library including whatever changes were used in the work. (i.e. If you make changes to the Library you must distribute those, but you do not need to distribute source or object code to those portions of the work not covered by this licence.)' Note that this clause grants an additional right and does not impose any additional restriction, and so does not affect compatibility with the GNU General Public Licence (GPL). If you wish to negotiate other terms, please contact the maintainer. You can redistribute it and/or modify the library under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the CCP4 licence and/or GNU Lesser General Public License along with this library; if not, write to the CCP4 Secretary, Daresbury Laboratory, Warrington WA4 4AD, UK. The GNU Lesser General Public can also be obtained by writing to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ==================================================== 2. KNOWN INCOMPATIBILITIES WITH PREVIOUS VERSIONS ==================================================== -------------------------- Version 2.0.1 (03.02.2014) -------------------------- 1. Namespacing Versions 2.x is namespaced throughout. The following namespaces are introduced: mmdb mmdb::io mmdb::math mmdb::mmcif mmdb::xml mmdb::machine 2. Object renaming As a general rule, prefixes 'CMMDB' and 'C' from object names in MMDB versions 1.x have been removed, so that, e.g., CMMDBManager is now mmdb::Manager CAtom is now mmdb::Atom CFile is now mmdb::io::File and so forth. mmdb2-2.0.20/COPYING0000744000175000017500000010531213271367640013503 0ustar maartenmaarten GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. Section 15 has been amended in accordance with Section 7a) above to address the requirements of UK law. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. Section 16 has been replaced in accordance with Section 7a) above to address the requirements of UK law. THE LICENSOR OR ANY THIRD PARTIES FROM WHOM IT HAS LICENSED ANY CODE WILL NOT BE LIABLE FOR: ANY LOSS OF PROFITS, LOSS OF REVENUE, LOSS OR CORRUPTION OF DATA, LOSS OF CONTRACTS OR OPPORTUNITY, LOSS OF SAVINGS OR THIRD PARTY CLAIMS (IN EACH CASE WHETHER DIRECT OR INDIRECT), ANY DIRECT OR INDIRECT LOSS OR DAMAGE ARISING OUT OF OR IN CONNECTION WITH THE PROGRAM, IN EACH CASE, WHETHER THAT LOSS ARISES AS A RESULT OF LICENSOR"S NEGLIGENCE, OR IN ANY OTHER WAY, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF THAT LOSS ARISING, OR IF IT WAS WITHIN LICENSOR'S CONTEMPLATION. NONE OF THESE PROVISION LIMITS OR EXCLUDES THE LICENSOR"S LIABILITY FOR DEATH OR PERSONAL INJURY CAUSED BY ITS NEGLIGENCE OR FOR ANY FRAUD, OR FOR ANY SORT OF LIABILITY THAT, BY LAW, CANNOT BE LIMITED OR EXCLUDED 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . mmdb2-2.0.20/Makefile.in0000644000175000017500000011137613524560424014517 0ustar maartenmaarten# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/mmdb2.pc.in \ $(top_srcdir)/build-aux/depcomp $(pkginclude_HEADERS) AUTHORS \ COPYING COPYING.LESSER INSTALL README build-aux/ar-lib \ build-aux/config.guess build-aux/config.sub build-aux/depcomp \ build-aux/install-sh build-aux/missing build-aux/ltmain.sh \ $(top_srcdir)/build-aux/ar-lib \ $(top_srcdir)/build-aux/config.guess \ $(top_srcdir)/build-aux/config.sub \ $(top_srcdir)/build-aux/install-sh \ $(top_srcdir)/build-aux/ltmain.sh \ $(top_srcdir)/build-aux/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = mmdb2.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(pkgincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) mmdb2_libmmdb2_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_mmdb2_libmmdb2_la_OBJECTS = mmdb2/hybrid_36.lo \ mmdb2/mmdb_io_stream.lo mmdb2/mmdb_math_linalg.lo \ mmdb2/mmdb_symop.lo mmdb2/mmdb_atom.lo mmdb2/mmdb_machine_.lo \ mmdb2/mmdb_math_rand.lo mmdb2/mmdb_tables.lo \ mmdb2/mmdb_bondmngr.lo mmdb2/mmdb_manager.lo \ mmdb2/mmdb_mattype.lo mmdb2/mmdb_title.lo mmdb2/mmdb_chain.lo \ mmdb2/mmdb_mask.lo mmdb2/mmdb_mmcif_.lo mmdb2/mmdb_uddata.lo \ mmdb2/mmdb_cifdefs.lo mmdb2/mmdb_math_.lo mmdb2/mmdb_model.lo \ mmdb2/mmdb_utils.lo mmdb2/mmdb_coormngr.lo \ mmdb2/mmdb_math_align.lo mmdb2/mmdb_root.lo mmdb2/mmdb_xml_.lo \ mmdb2/mmdb_cryst.lo mmdb2/mmdb_math_bfgsmin.lo \ mmdb2/mmdb_rwbrook.lo mmdb2/mmdb_ficif.lo \ mmdb2/mmdb_math_fft.lo mmdb2/mmdb_selmngr.lo \ mmdb2/mmdb_io_file.lo mmdb2/mmdb_math_graph.lo \ mmdb2/mmdb_seqsuperpose.lo mmdb2_libmmdb2_la_OBJECTS = $(am_mmdb2_libmmdb2_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = mmdb2_libmmdb2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(mmdb2_libmmdb2_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(mmdb2_libmmdb2_la_SOURCES) DIST_SOURCES = $(mmdb2_libmmdb2_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = mmdb2/libmmdb2.la pkginclude_HEADERS = \ mmdb2/hybrid_36.h mmdb2/mmdb_io_file.h mmdb2/mmdb_math_graph.h mmdb2/mmdb_seqsuperpose.h \ mmdb2/mmdb_atom.h mmdb2/mmdb_io_stream.h mmdb2/mmdb_math_linalg.h mmdb2/mmdb_symop.h \ mmdb2/mmdb_bondmngr.h mmdb2/mmdb_machine_.h mmdb2/mmdb_math_rand.h mmdb2/mmdb_tables.h \ mmdb2/mmdb_chain.h mmdb2/mmdb_manager.h mmdb2/mmdb_mattype.h mmdb2/mmdb_title.h \ mmdb2/mmdb_cifdefs.h mmdb2/mmdb_mask.h mmdb2/mmdb_mmcif_.h mmdb2/mmdb_uddata.h \ mmdb2/mmdb_coormngr.h mmdb2/mmdb_math_.h mmdb2/mmdb_model.h mmdb2/mmdb_utils.h \ mmdb2/mmdb_cryst.h mmdb2/mmdb_math_align.h mmdb2/mmdb_root.h mmdb2/mmdb_xml_.h \ mmdb2/mmdb_defs.h mmdb2/mmdb_math_bfgsmin.h mmdb2/mmdb_rwbrook.h mmdb2/mmdb_ficif.h \ mmdb2/mmdb_math_fft.h mmdb2/mmdb_selmngr.h mmdb2_libmmdb2_la_SOURCES = \ mmdb2/hybrid_36.cpp mmdb2/mmdb_io_stream.cpp mmdb2/mmdb_math_linalg.cpp mmdb2/mmdb_symop.cpp \ mmdb2/mmdb_atom.cpp mmdb2/mmdb_machine_.cpp mmdb2/mmdb_math_rand.cpp mmdb2/mmdb_tables.cpp \ mmdb2/mmdb_bondmngr.cpp mmdb2/mmdb_manager.cpp mmdb2/mmdb_mattype.cpp mmdb2/mmdb_title.cpp \ mmdb2/mmdb_chain.cpp mmdb2/mmdb_mask.cpp mmdb2/mmdb_mmcif_.cpp mmdb2/mmdb_uddata.cpp \ mmdb2/mmdb_cifdefs.cpp mmdb2/mmdb_math_.cpp mmdb2/mmdb_model.cpp mmdb2/mmdb_utils.cpp \ mmdb2/mmdb_coormngr.cpp mmdb2/mmdb_math_align.cpp mmdb2/mmdb_root.cpp mmdb2/mmdb_xml_.cpp \ mmdb2/mmdb_cryst.cpp mmdb2/mmdb_math_bfgsmin.cpp mmdb2/mmdb_rwbrook.cpp mmdb2/mmdb_ficif.cpp \ mmdb2/mmdb_math_fft.cpp mmdb2/mmdb_selmngr.cpp mmdb2/mmdb_io_file.cpp mmdb2/mmdb_math_graph.cpp \ mmdb2/mmdb_seqsuperpose.cpp mmdb2_libmmdb2_la_LDFLAGS = -no-undefined pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = mmdb2.pc all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mmdb2.pc: $(top_builddir)/config.status $(srcdir)/mmdb2.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } mmdb2/$(am__dirstamp): @$(MKDIR_P) mmdb2 @: > mmdb2/$(am__dirstamp) mmdb2/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) mmdb2/$(DEPDIR) @: > mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/hybrid_36.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_io_stream.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_math_linalg.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_symop.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_atom.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_machine_.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_math_rand.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_tables.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_bondmngr.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_manager.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_mattype.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_title.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_chain.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_mask.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_mmcif_.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_uddata.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_cifdefs.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_math_.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_model.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_utils.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_coormngr.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_math_align.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_root.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_xml_.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_cryst.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_math_bfgsmin.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_rwbrook.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_ficif.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_math_fft.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_selmngr.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_io_file.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_math_graph.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/mmdb_seqsuperpose.lo: mmdb2/$(am__dirstamp) \ mmdb2/$(DEPDIR)/$(am__dirstamp) mmdb2/libmmdb2.la: $(mmdb2_libmmdb2_la_OBJECTS) $(mmdb2_libmmdb2_la_DEPENDENCIES) $(EXTRA_mmdb2_libmmdb2_la_DEPENDENCIES) mmdb2/$(am__dirstamp) $(AM_V_CXXLD)$(mmdb2_libmmdb2_la_LINK) -rpath $(libdir) $(mmdb2_libmmdb2_la_OBJECTS) $(mmdb2_libmmdb2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f mmdb2/*.$(OBJEXT) -rm -f mmdb2/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/hybrid_36.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_atom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_bondmngr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_chain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_cifdefs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_coormngr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_cryst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_ficif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_io_file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_io_stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_machine_.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_manager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_mask.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_math_.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_math_align.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_math_bfgsmin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_math_fft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_math_graph.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_math_linalg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_math_rand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_mattype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_mmcif_.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_model.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_root.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_rwbrook.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_selmngr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_seqsuperpose.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_symop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_tables.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_title.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_uddata.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@mmdb2/$(DEPDIR)/mmdb_xml_.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf mmdb2/.libs mmdb2/_libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) config.h installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f mmdb2/$(DEPDIR)/$(am__dirstamp) -rm -f mmdb2/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf mmdb2/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgconfigDATA install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf mmdb2/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgconfigDATA \ uninstall-pkgincludeHEADERS .MAKE: all install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-pkgconfigDATA install-pkgincludeHEADERS install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-libLTLIBRARIES uninstall-pkgconfigDATA \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mmdb2-2.0.20/Makefile.am0000644000175000017500000000344713271367640014511 0ustar maartenmaarten ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = mmdb2/libmmdb2.la pkginclude_HEADERS = \ mmdb2/hybrid_36.h mmdb2/mmdb_io_file.h mmdb2/mmdb_math_graph.h mmdb2/mmdb_seqsuperpose.h \ mmdb2/mmdb_atom.h mmdb2/mmdb_io_stream.h mmdb2/mmdb_math_linalg.h mmdb2/mmdb_symop.h \ mmdb2/mmdb_bondmngr.h mmdb2/mmdb_machine_.h mmdb2/mmdb_math_rand.h mmdb2/mmdb_tables.h \ mmdb2/mmdb_chain.h mmdb2/mmdb_manager.h mmdb2/mmdb_mattype.h mmdb2/mmdb_title.h \ mmdb2/mmdb_cifdefs.h mmdb2/mmdb_mask.h mmdb2/mmdb_mmcif_.h mmdb2/mmdb_uddata.h \ mmdb2/mmdb_coormngr.h mmdb2/mmdb_math_.h mmdb2/mmdb_model.h mmdb2/mmdb_utils.h \ mmdb2/mmdb_cryst.h mmdb2/mmdb_math_align.h mmdb2/mmdb_root.h mmdb2/mmdb_xml_.h \ mmdb2/mmdb_defs.h mmdb2/mmdb_math_bfgsmin.h mmdb2/mmdb_rwbrook.h mmdb2/mmdb_ficif.h \ mmdb2/mmdb_math_fft.h mmdb2/mmdb_selmngr.h mmdb2_libmmdb2_la_SOURCES = \ mmdb2/hybrid_36.cpp mmdb2/mmdb_io_stream.cpp mmdb2/mmdb_math_linalg.cpp mmdb2/mmdb_symop.cpp \ mmdb2/mmdb_atom.cpp mmdb2/mmdb_machine_.cpp mmdb2/mmdb_math_rand.cpp mmdb2/mmdb_tables.cpp \ mmdb2/mmdb_bondmngr.cpp mmdb2/mmdb_manager.cpp mmdb2/mmdb_mattype.cpp mmdb2/mmdb_title.cpp \ mmdb2/mmdb_chain.cpp mmdb2/mmdb_mask.cpp mmdb2/mmdb_mmcif_.cpp mmdb2/mmdb_uddata.cpp \ mmdb2/mmdb_cifdefs.cpp mmdb2/mmdb_math_.cpp mmdb2/mmdb_model.cpp mmdb2/mmdb_utils.cpp \ mmdb2/mmdb_coormngr.cpp mmdb2/mmdb_math_align.cpp mmdb2/mmdb_root.cpp mmdb2/mmdb_xml_.cpp \ mmdb2/mmdb_cryst.cpp mmdb2/mmdb_math_bfgsmin.cpp mmdb2/mmdb_rwbrook.cpp mmdb2/mmdb_ficif.cpp \ mmdb2/mmdb_math_fft.cpp mmdb2/mmdb_selmngr.cpp mmdb2/mmdb_io_file.cpp mmdb2/mmdb_math_graph.cpp \ mmdb2/mmdb_seqsuperpose.cpp mmdb2_libmmdb2_la_LDFLAGS = -no-undefined pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = mmdb2.pc mmdb2-2.0.20/configure.ac0000644000175000017500000000125513524560410014725 0ustar maartenmaarten AC_INIT(mmdb2, 2.0.20) # keep in sync with mmdb2/mmdb_defs.h AC_CONFIG_AUX_DIR(build-aux) AC_CONFIG_MACRO_DIR(m4) AC_CONFIG_SRCDIR(mmdb2/mmdb_math_align.cpp) AC_CONFIG_HEADERS(config.h) AM_INIT_AUTOMAKE([1.11 foreign subdir-objects silent-rules -Wall]) AM_PROG_AR LT_INIT([disable-shared win32-dll]) AC_PROG_CXX # AC_PROG_CXX doesn't fail if compiler is not found, test it explicitely AC_LANG_PUSH(C++) AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [], [AC_MSG_ERROR([C++ compiler not found.])]) AC_LANG_POP(C++) AM_MAINTAINER_MODE dnl disable (by default) maintainer mode AC_SEARCH_LIBS([cos], [m], [], [AC_MSG_ERROR([need math library])]) AC_OUTPUT(Makefile mmdb2.pc) mmdb2-2.0.20/COPYING.LESSER0000744000175000017500000001672713271367640014512 0ustar maartenmaarten GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. mmdb2-2.0.20/config.h.in0000744000175000017500000000312113271367640014466 0ustar maartenmaarten/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION mmdb2-2.0.20/AUTHORS0000744000175000017500000000006113271367640013513 0ustar maartenmaarten Eugene Krissinel (eugene.krissinel@stfc.ac.uk) mmdb2-2.0.20/aclocal.m40000644000175000017500000012112013524560423014275 0ustar maartenmaarten# generated automatically by aclocal 1.13.4 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) ]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) mmdb2-2.0.20/INSTALL0000744000175000017500000003633213271367640013506 0ustar maartenmaartenInstallation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. mmdb2-2.0.20/mmdb2/0000755000175000017500000000000013714662650013447 5ustar maartenmaartenmmdb2-2.0.20/mmdb2/mmdb_math_fft.h0000744000175000017500000000625013271367640016412 0ustar maartenmaarten// $Id: mmdb_math_fft.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2005-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : FFT // ~~~~~~~~~ // **** Functions: mmdb::math::FFT // ~~~~~~~~~ mmdb::math::RealFFT // mmdb::math::TwoFFT // mmdb::math::Convolve // mmdb::math::mConvolve // // (C) E.Krissinel 2005-2013 // // ================================================================= // #ifndef __FFT__ #define __FFT__ #include "mmdb_mattype.h" namespace mmdb { namespace math { extern void FFT ( rvector data, int nn, bool Forward=true ); extern void RealFFT ( rvector data, int n, bool Forward=true ); extern void TwoFFT ( rvector data1, rvector data2, rvector fft1, rvector fft2, int n ); extern void Convolve ( rvector data, int n, rvector respns, int m, rvector ans, bool Conv=true ); // mConvolve ( data,n,m ) replaces array data[0..n-1] with the result // of m recursive convolutions (m>1) defined as // // data_m = data (*) data_{m-1} // // where data_m is the result of mth convolution, data_0=data. // The definition of the convolution is // // [a (*) b]_i = Sum_j { a_j * b_{i-j} } // // On input, data[] is considered as containing the signal // sampled at both positive and negative times in the wrap-around // order, that is // // data[i], 0<=i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::mmcif::Category ( mmCIF category ) // ~~~~~~~~~ mmdb::mmcif::Struct ( mmCIF structure ) // mmdb::mmcif::Loop ( mmCIF loop ) // mmdb::mmcif::Data ( mmCIF data block ) // mmdb::mmcif::File ( mmCIF file ) // // (C) E. Krissinel 2000-2015 // // ================================================================= // #include #include #include #include "mmdb_mmcif_.h" namespace mmdb { namespace mmcif { // ====================== SortTags =============================== void SortTags ( psvector tag, int len, ivector index ) { int i,k,l,l1,l2; if (len==1) { index[0] = 0; return; } if (strcasecmp(tag[0],tag[1])<0) { index[0] = 0; index[1] = 1; } else { index[0] = 1; index[1] = 0; } for (k=2;k0) l2 = k; else { l1 = 0; while (l1l2;i--) index[i] = index[i-1]; index[l2] = k; } } // ====================== Category ========================== const int CIF_NODATA_DOT = 0; const int CIF_NODATA_QUESTION = 1; cpstr CIF_NODATA_DOT_FIELD = pstr("\x02" "."); cpstr CIF_NODATA_QUESTION_FIELD = pstr("\x02" "?"); Category::Category() : io::Stream() { InitCategory(); } Category::Category ( cpstr N ) : io::Stream() { InitCategory(); SetCategoryName ( N ); } Category::Category ( io::RPStream Object ) : io::Stream(Object) { InitCategory(); } Category::~Category() { FreeMemory(); } void Category::InitCategory() { name = NULL; nTags = 0; tag = NULL; index = NULL; nAllocTags = 0; } void Category::FreeMemory() { int i; if (name) delete[] name; name = NULL; for (i=0;inAllocTags) { nAT = nTagsNew + IMin(nAllocTags/2+1,20); GetVectorMemory ( tag1 ,nAT,0 ); GetVectorMemory ( index1,nAT,0 ); for (i=0;i=0) && (tagNo0) { k = 0; if (!index) GetVectorMemory ( index,nAllocTags,0 ); for (i=0;i=0 : position of the tag found // <0 : the tag was not found, it could be inserted before // (-RC-1)th element, where RC is the return value int l1,l2,l,k; if (!tag) return -1; if (!index) Sort(); l = 0; l1 = 0; l2 = nTags-1; k = 1; while (l10) l1 = l; else { l1 = l; break; } } if (k==0) return index[l]; // is at RCth position k = strcasecmp ( ttag,tag[index[l1]] ); if (k==0) return index[l1]; // is at RCth position if (k<0) return -1; // would be at (-RC-1)th position if (l2!=l1) { k = strcasecmp ( ttag,tag[index[l2]] ); if (k==0) return index[l2]; // is at RCth position if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position } return -2-l1; // would be at l1+1=(-RC-1)th position } int Category::AddTag ( cpstr ttag ) { // return -1: the tag has been added on the top of array; // index is added and sorted automatically // >=0: the tag is already in the array -- its position // is returned int i1,i; if (!tag) { ExpandTags ( 3 ); // get space for first 3 tags CreateCopy ( tag[0],ttag ); nTags = 1; return -nTags; // the tag has been added on the top of array } i1 = GetTagNo ( ttag ); if (i1>=0) return i1; // non-negative returns mean that // the tag is already in the array i1 = -i1-1; // otherwise the tag has to be added and indexed at here // put new tag on the top of array and update index ExpandTags ( nTags+1 ); CreateCopy ( tag[nTags],ttag ); for (i=nTags;i>i1;i--) index[i] = index[i-1]; index[i1] = nTags; nTags++; return -nTags; // the tag has been added on the top of array } void Category::PrintTags() { int i; Sort(); printf ( " Unsorted tags:\n" ); for (i=0;iname ); nTags = Category->nTags; nAllocTags = nTags; if (nTags>0) { GetVectorMemory ( tag ,nAllocTags,0 ); GetVectorMemory ( index,nAllocTags,0 ); for (i=0;itag[i] ); index[i] = Category->index[i]; } } } } void Category::write ( io::RFile f ) { int i; if (!index) Sort(); f.CreateWrite ( name ); f.WriteInt ( &nTags ); for (i=0;i0) { GetVectorMemory ( tag,nTags,0 ); for (i=0;inAT) { GetVectorMemory ( field1,nAllocTags,0 ); for (i=0;i=0) && (tagNo=0) && (field)) { if (field[k]) delete[] field[k]; field[k] = NULL; } return k; } int Struct::GetReal ( realtype & R, cpstr TName, bool Remove ) { pstr endptr; int RC; int k = GetTagNo ( TName ); R = 0.0; if (!field) return CIFRC_NoField; if (k<0) return CIFRC_NoTag; if (!field[k]) return CIFRC_NoField; if (field[k][0]==char(2)) return CIFRC_NoData; R = strtod ( field[k],&endptr ); if (endptr==field[k]) RC = CIFRC_WrongFormat; else { RC = 0; if (Remove) { delete[] field[k]; field[k] = NULL; } } return RC; } int Struct::GetInteger ( int & I, cpstr TName, bool Remove ) { pstr endptr; int RC; int k = GetTagNo ( TName ); I = 0; if (!field) return CIFRC_NoField; if (k<0) return CIFRC_NoTag; if (!field[k]) return CIFRC_NoField; if (field[k][0]==char(2)) { if (field[k][1]=='.') I = MinInt4; return CIFRC_NoData; } I = mround ( strtod(field[k],&endptr) ); if (endptr==field[k]) RC = CIFRC_WrongFormat; else { RC = 0; if (Remove) { delete[] field[k]; field[k] = NULL; } } return RC; } void Struct::PutString ( cpstr S, cpstr T, bool NonBlankOnly ) { pstr p; if (!S) PutNoData ( CIF_NODATA_QUESTION,T ); else { p = pstr(S); if (NonBlankOnly) while (*p==' ') p++; if (!(*p)) PutNoData ( CIF_NODATA_DOT,T ); else AddField ( S,T,false ); } } void Struct::PutDate ( cpstr T ) { time_t t; tm * tstruct; char S[100]; t = time ( NULL ); tstruct = localtime(&t); if (tstruct) sprintf ( S,"%4i-%02i-%02i", tstruct->tm_year+1900,tstruct->tm_mon+1,tstruct->tm_mday ); else strcpy ( S,"YYYY-MM-DD" ); AddField ( S,T,false ); } void Struct::PutNoData ( int NoDataType, cpstr T ) { char S[10]; S[0] = char(2); if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; else S[1] = '?'; S[2] = char(0); AddField ( S,T,false ); } void Struct::PutReal ( realtype R, cpstr T, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); AddField ( rS,T,false ); } void Struct::PutReal ( realtype R, cpstr T, cpstr format ) { char rS[100]; sprintf ( rS,format,R ); AddField ( DelSpaces(rS,' '),T,false ); } void Struct::PutInteger ( int I, cpstr T ) { char iS[100]; if (I>MinInt4) { sprintf ( iS,"%i",I ); AddField ( iS,T,false ); } else PutNoData ( CIF_NODATA_DOT,T ); } #define NODATA_Q pstr("?") #define NODATA_P pstr(".") bool Struct::WriteMMCIFStruct ( cpstr FName, io::GZ_MODE gzipMode ) { io::File f; f.assign ( FName,true,false,gzipMode ); if (f.rewrite()) { WriteMMCIF ( f ); f.shut(); return true; } else return false; } #define _max_output_line_width 256 void Struct::WriteMMCIF ( io::RFile f ) { int i,j,k,l,m,n; pstr F; // calculate maximal length of tags l = 0; for (i=0;im) // wrap around if field is too long f.Write ( pstr("\n ") ); else { k = l-strlen(tag[i]); for (j=0;j0) { GetVectorMemory ( field,nTags,0 ); for (i=0;ifield[i] ); } } } void Struct::write ( io::RFile f ) { int i; Category::write ( f ); for (i=0;i0) { GetVectorMemory ( field,nTags,0 ); for (i=0;i=nTags) { delete[] field[j]; // delete empty row field[j] = NULL; } else nR++; // count non-empty row } if ((nT<=0) || (nR<=0)) FreeMemory(); // the loop is completely empty else if ((nT!=nTags) || (nR!=nAllocRows)) { f1 = new psvector[nR]; m = 0; for (j=0;jnAllocRows) { nAR = nRowsNew + IMin(nAllocRows/2+10,2000); field1 = new psvector[nAR]; for (i=0;i=nTags) iColumn = 0; } } } void Loop::AddNoData ( int NoDataType ) { char S[10]; S[0] = char(2); if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; else S[1] = '?'; S[2] = char(0); AddString ( S ); } void Loop::AddReal ( realtype R, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); AddString ( rS ); } void Loop::AddReal ( realtype R, cpstr format ) { char rS[100]; sprintf ( rS,format,R ); AddString ( DelSpaces(rS,' ') ); } void Loop::AddInteger ( int I ) { char iS[100]; if (I>MinInt4) { sprintf ( iS,"%i",I ); AddString ( iS ); } else AddNoData ( CIF_NODATA_DOT ); } pstr Loop::GetField ( int rowNo, int tagNo ) { if ((tagNo>=0) && (tagNo=0) && (rowNo=nRows)) return CIFRC_WrongIndex; if (!field[nrow]) return CIFRC_NoField; if (!field[nrow][k]) return CIFRC_NoField; if (field[nrow][k][0]==char(2)) { if (Remove) { delete[] field[nrow][k]; field[nrow][k] = NULL; } } else if (Remove) { S = field[nrow][k]; field[nrow][k] = NULL; } else CreateCopy ( S,field[nrow][k] ); return 0; } pstr Loop::GetString ( cpstr TName, int nrow, int & RC ) { int k = GetTagNo ( TName ); if (k<0) { RC = CIFRC_NoTag; return NULL; } if ((nrow<0) || (nrow>=nRows)) { RC = CIFRC_WrongIndex; return NULL; } if (!field[nrow]) { RC = CIFRC_NoField; return NULL; } if (!field[nrow][k]) { RC = CIFRC_NoField; return NULL; } RC = 0; // char(2) means the field was either '.' or '?' if (field[nrow][k][0]==char(2)) return NULL; return field[nrow][k]; } // CopyString() does nothing if RC is not 0 void Loop::CopyString ( pstr buf, int maxlength, cpstr TName, int nrow, int & RC ) { pstr p; int k; if (RC) return; k = GetTagNo ( TName ); if (k<0) { RC = CIFRC_NoTag; buf[0] = char(0); return; } if ((nrow<0) || (nrow>=nRows)) { RC = CIFRC_WrongIndex; buf[0] = char(0); return; } if (!field[nrow]) { RC = CIFRC_NoField; buf[0] = char(0); return; } p = field[nrow][k]; if (!p) { RC = CIFRC_NoField; buf[0] = char(0); return; } // char(2) means the field was either '.' or '?' if (p[0]==char(2)) { buf[0] = p[0]; buf[1] = char(0); } else strncpy ( buf,p,IMin(maxlength,strlen(p)+1) ); } int Loop::DeleteField ( cpstr TName, int nrow ) { int k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if ((nrow<0) || (nrow>=nRows)) return CIFRC_WrongIndex; if (field[nrow]) { if (field[nrow][k]) delete[] field[nrow][k]; field[nrow][k] = NULL; } return k; } int Loop::DeleteRow ( int nrow ) { int i; if ((nrow<0) || (nrow>=nRows)) return CIFRC_WrongIndex; if (field[nrow]) { for (i=0;i=nRows)) return CIFRC_WrongIndex; R = 0.0; if (!field[nrow]) return CIFRC_NoField; if (!field[nrow][k]) return CIFRC_NoField; if (field[nrow][k][0]==char(2)) return CIFRC_NoField; R = strtod ( field[nrow][k],&endptr ); if (endptr==field[nrow][k]) return CIFRC_WrongFormat; if (Remove) { delete[] field[nrow][k]; field[nrow][k] = NULL; } return 0; } void Loop::CopyReal ( realtype & R, cpstr TName, int nrow, int & RC ) { pstr endptr; int k; if (RC) return; // R = 0.0; k = GetTagNo ( TName ); if (k<0) RC = CIFRC_NoTag; else if ((nrow<0) || (nrow>=nRows)) RC = CIFRC_WrongIndex; else if (!field[nrow]) RC = CIFRC_NoField; else if (!field[nrow][k]) RC = CIFRC_NoField; else if (field[nrow][k][0]==char(2)) RC = CIFRC_NoField; else { R = strtod ( field[nrow][k],&endptr ); if (endptr==field[nrow][k]) RC = CIFRC_WrongFormat; } } void Loop::CopyInteger ( int & I, cpstr TName, int nrow, int & RC ) { pstr endptr; int k; if (RC) return; I = 0; k = GetTagNo ( TName ); if (k<0) RC = CIFRC_NoTag; else if ((nrow<0) || (nrow>=nRows)) RC = CIFRC_WrongIndex; else if (!field[nrow]) RC = CIFRC_NoField; else if (!field[nrow][k]) RC = CIFRC_NoField; else if (field[nrow][k][0]==char(2)) RC = CIFRC_NoField; else { I = mround ( strtod ( field[nrow][k],&endptr ) ); if (endptr==field[nrow][k]) RC = CIFRC_WrongFormat; } } int Loop::GetInteger ( int & I, cpstr TName, int nrow, bool Remove ) { pstr endptr; int k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if ((nrow<0) || (nrow>=nRows)) return CIFRC_WrongIndex; I = 0; if (!field[nrow]) return CIFRC_NoField; if (!field[nrow][k]) return CIFRC_NoField; if (field[nrow][k][0]==char(2)) { if (field[nrow][k][1]=='.') I = MinInt4; return CIFRC_NoField; } I = mround ( strtod(field[nrow][k],&endptr) ); if (endptr==field[nrow][k]) return CIFRC_WrongFormat; if (Remove) { delete[] field[nrow][k]; field[nrow][k] = NULL; } return 0; } int Loop::GetSVector ( psvector & S, cpstr TName, int i1, int i2, bool Remove ) { int j,k,r1,r2; r1 = IMin(i1,i2); r2 = IMin(IMax(i1,i2),nRows-1); if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if (!S) GetVectorMemory ( S,r2-r1+1,r1 ); if (Remove) { for (j=r1;j<=r2;j++) if (field[j]) { S[j] = field[j][k]; field[j][k] = NULL; if (S[j]) { if (S[j][0]==char(2)) { delete[] S[j]; S[j] = NULL; } } } else S[j] = NULL; } else { for (j=r1;j<=r2;j++) { S[j] = NULL; if (field[j]) { if (field[j][k]) { if (field[j][k][0]!=char(2)) CreateCopy ( S[j],field[j][k] ); } } } } return 0; } int Loop::GetRVector ( rvector & R, cpstr TName, int i1, int i2, bool Remove ) { int j,k,r1,r2,RC; pstr endptr; r1 = IMin(i1,i2); r2 = IMin(IMax(i1,i2),nRows-1); if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if (!R) GetVectorMemory ( R,r2-r1+1,r1 ); RC = 0; for (j=r1;j<=r2;j++) { R[j] = 0.0; if (field[j]) { if (field[j][k]) { R[j] = strtod ( field[j][k],&endptr ); if (endptr==field[j][k]) RC = CIFRC_WrongFormat; if (Remove) { delete[] field[j][k]; field[j][k] = NULL; } } } } return RC; } int Loop::GetIVector ( ivector & I, cpstr TName, int i1, int i2, bool Remove ) { int j,k,r1,r2,RC; pstr endptr; r1 = IMin(i1,i2); r2 = IMin(IMax(i1,i2),nRows-1); if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if (!I) GetVectorMemory ( I,r2-r1+1,r1 ); RC = 0; for (j=r1;j<=r2;j++) { I[j] = 0; if (field[j]) { if (field[j][k]) { I[j] = mround ( strtod(field[j][k],&endptr) ); if (endptr==field[j][k]) RC = CIFRC_WrongFormat; if (Remove) { delete[] field[j][k]; field[j][k] = NULL; } } } } return RC; } void Loop::PutString ( cpstr S, cpstr T, int nrow ) { psmatrix field1; int nT,nR,iT,i,j; nT = nTags; nR = nRows; iT = AddTag ( T ); if (iT<0) iT = nTags-1; if (nTags>nT) { // a new tag has been added; all field must be reallocated. nRows = IMax(nR,nrow+1); // nrow is indexed like 0,1,... nAllocRows = IMax(nR,nrow+IMin(nR/2+1,2000)); field1 = new psvector[nAllocRows]; for (i=0;i=nR) { // only new rows are to be added ExpandRows ( nrow+1 ); nRows++; } if (!field[nrow]) { field[nrow] = new pstr[nTags]; for (j=0;j=nTags) iColumn = 0; } void Loop::PutNoData ( int NoDataType, cpstr T, int nrow ) { char S[10]; S[0] = char(2); if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; else S[1] = '?'; S[2] = char(0); PutString ( S,T,nrow ); } void Loop::PutReal ( realtype R, cpstr T, int nrow, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); PutString ( rS,T,nrow ); } void Loop::PutReal ( realtype R, cpstr T, int nrow, cpstr format ) { char rS[100]; sprintf ( rS,format,R ); PutString ( DelSpaces(rS,' '),T,nrow ); } void Loop::PutInteger ( int I, cpstr T, int nrow ) { char iS[100]; if (I>MinInt4) { sprintf ( iS,"%i",I ); PutString ( iS,T,nrow ); } else PutNoData ( CIF_NODATA_DOT,T,nrow ); } void Loop::PutSVector ( psvector S, cpstr T, int i1, int i2 ) { int i,j,k; PutString ( S[i2],T,i2 ); if (iColumn==0) k = nTags-1; else k = iColumn-1; for (i=i2-1;i>=i1;i--) { if (!field[i]) { field[i] = new pstr[nTags]; for (j=0;j=i1;i--) { if (!field[i]) { field[i] = new pstr[nTags]; for (j=0;j=i1;l--) { if (!field[l]) { field[l] = new pstr[nTags]; for (j=0;j_max_output_line_width) { l[i] = -l[i]; k = 0; } } for (i=0;i_max_output_line_width) { f.LF(); m = k+1; } else while (n>0) { f.Write ( pstr(" ") ); n--; } if (field[i]) { if (field[i][j]) { F = field[i][j]; if (k>10000) { if (F[0]==char(2)) { f.Write ( pstr(" ") ); f.WriteLine ( &(F[1]) ); } else if (!F[0]) { f.Write ( pstr(" ") ); f.WriteLine ( NODATA_P ); } else { f.Write ( pstr(";") ); f.WriteLine ( F ); f.WriteLine ( pstr(";") ); } m = 0; k = 0; } else if ((((F[0]=='.') || (F[0]=='?')) && (!F[1])) || FirstOccurence(F,' ') || FirstOccurence(F,'"') || FirstOccurence(F,'\'')) { f.Write ( pstr(" \"") ); f.Write ( F ); f.Write ( pstr("\"") ); k -= strlen(F)+2; } else if (F[0]==char(2)) { f.Write ( pstr(" ") ); f.Write ( &(F[1]) ); k--; } else if (!F[0]) { f.Write ( pstr(" ") ); f.Write ( NODATA_P ); k--; } else { f.Write ( pstr(" ") ); f.Write ( F ); k -= strlen(F); } } else { f.Write ( pstr(" ") ); f.Write ( NODATA_Q ); k--; } } else { f.Write ( pstr(" ") ); f.Write ( NODATA_Q ); k--; } } if (m) f.LF(); } f.WriteLine ( pstr("#") ); } void Loop::Copy ( PCategory Loop ) { int i,j; Category::Copy ( Loop ); nRows = PLoop(Loop)->nRows; nAllocRows = nRows; if ((nTags>0) && (nRows>0)) { field = new psvector[nRows]; for (i=0;ifield[i]) { field[i] = new pstr[nTags]; for (j=0;jfield[i][j] ); } } else field[i] = NULL; } } iColumn = PLoop(Loop)->iColumn; } void Loop::write ( io::RFile f ) { int i,j; Category::write ( f ); f.WriteInt ( &nRows ); if ((nTags>0) && (nRows>0)) { for (i=0;i0) && (nRows>0)) { field = new psvector[nRows]; for (i=0;i0) { WrongCat = new pstr[nWrongFields]; WrongTag = new pstr[nWrongFields]; for (i=0;i>\n",lcount ); return CIFRC_NoDataLine; } llen = _max_buf_len; L = new char[llen]; i = 0; p += 5; while ((*p) && (*p!=' ') && (*p!=char(9))) { L[i++] = *p; p++; } L[i] = char(0); CreateCopy ( name,L ); // 2. Loop over tags until next 'data_' or end of file while (p) { // skip spaces while ((*p==' ') || (*p==char(9))) p++; if ((*p) && (*p!='#')) { // this is not a comment, continue if (*p=='_') GetDataItem ( f,S,L,p,lcount,llen ); else if (!strncmp(p,"loop_",5)) GetLoop ( f,S,L,p,lcount,llen ); else if (!strncmp(p,"data_",5)) { p = NULL; break; } else { // if got to here, the file is corrupted strcpy ( _err_string,S ); _err_line = lcount; Warning |= CIFW_UnrecognizedItems; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,S ); while ((*p) && (*p!=' ') && (*p!=char(9))) if (*p=='#') *p = char(0); else p++; } } else *p = char(0); if (Warning && (flags & CIFFL_StopOnWarnings)) { if (L) delete[] L; return Warning; } if (!(*p)) { if (!f.FileEnd()) { f.ReadLine ( S,_max_buf_len ); lcount++; p = &(S[0]); } else p = NULL; } } if (L) delete[] L; Optimize(); // get rid of over-allocated fields. return Warning; } void Data::GetDataItem ( io::RFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ) { PStruct cifStruct; char T[100]; int RC,i; i = 0; while ((*p) && (*p!=' ') && (*p!=char(9)) && (*p!='.')) { if (i<(int)sizeof(T)-1) T[i++] = *p; p++; } T[i] = char(0); if (*p!='.') { // category name missing strcpy ( L,T ); // item name T[0] = char(1); // special T[1] = char(0); // category name } // look for category i = AddCategory ( T ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifStruct = new Struct ( T ); Category[nCategories-1] = cifStruct; } else { cifStruct = PStruct(Category[i]); if (cifStruct->GetCategoryID()!=MMCIF_Struct) { strcpy ( _err_string,S ); _err_line = lcount; Warning |= CIFW_NotAStructure; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,T,S ); delete Category[i]; cifStruct = new Struct ( T ); Category[i] = cifStruct; } } if (*p=='.') { // get item name i = 0; p++; // skip period while ((*p) && (*p!=' ') && (*p!=char(9))) { T[i++] = *p; p++; } T[i] = char(0); } else strcpy ( T,L ); if (nWrongFields>0) { if (CheckWrongField(cifStruct->name,T)) { GetField ( f,S,L,p,lcount,llen ); cifStruct->DeleteField ( T ); return; } } RC = GetField ( f,S,L,p,lcount,llen ); if (RC) { strcpy ( _err_string,S ); _err_line = lcount; Warning |= CIFW_MissingField; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,S ); } while ((*p==' ') || (*p==char(9))) p++; if (*p=='#') *p = char(0); i = cifStruct->GetTagNo ( T ); if (i>=0) { if (flags & CIFFL_SuggestTags) { tagNo++; ParamStr ( T,pstr("\1"),tagNo ); } else { strcpy ( _err_string,S ); _err_line = lcount; Warning |= CIFW_DuplicateTag; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,S ); } } cifStruct->AddField ( L,T ); } void Data::GetLoop ( io::RFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ) { PLoop cifLoop; pstr p1; char T[100]; bool Repeat,WrongField; int RC,i,nC; RC = 0; p += 5; // skip 'loop_' tag loopNo++; cifLoop = NULL; nC = -1; // undefined category number do { while ((*p==' ') || (*p==char(9))) p++; p1 = p; if (*p=='_') { // get category name i = 0; while ((*p) && (*p!=' ') && (*p!=char(9)) && (*p!='.')) { if (i<(int)sizeof(T)-1) T[i++] = *p; p++; } T[i] = char(0); if (*p!='.') { // category name missing strcpy ( L,T ); // item name if (flags & CIFFL_SuggestCategories) sprintf ( T,"X%i",loopNo ); else strcpy ( T,"X" ); T[0] = char(1); // special category name } if (cifLoop) { if (strcmp(cifLoop->GetCategoryName(),T)) { // loop ended, empty p = p1; // play back to last category cifLoop = NULL; } } else { // look for category i = AddCategory ( T ); if ((i!=nC) && (nC>=0)) { // empty loop; most probably // a corrupted file p = p1; // play back to last category strcpy ( _err_string,S ); _err_line = lcount; Warning |= CIFW_EmptyLoop; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,S ); // AddCategory(..) has added a NULL-Category on the top of // category list; remove it now DeleteCategory ( nCategories-1 ); cifLoop = NULL; // return; } if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifLoop = new Loop ( T ); Category[nCategories-1] = cifLoop; nC = nCategories-1; } } /* else if (Loop) { if (!strcmp(Loop->GetCategoryName(), Category[i]->GetCategoryName())) { if (Loop->GetCategoryID()!=MMCIF_Loop) { Warning |= CIFW_NotALoop; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,T,S ); delete Category[i]; Loop = new Loop ( T ); Category[i] = Loop; } } else Loop = NULL; } */ if (cifLoop) { if (*p=='.') { // get item name i = 0; p++; // skip period while ((*p) && (*p!=' ') && (*p!=char(9))) { T[i++] = *p; p++; } T[i] = char(0); } else strcpy ( T,L ); if (nWrongFields>0) WrongField = CheckWrongField ( cifLoop->name,T ); else WrongField = false; if (!WrongField) { if (cifLoop->AddTag(T)>=0) { if (flags & CIFFL_SuggestTags) { tagNo++; ParamStr ( T,pstr("\1"),tagNo ); cifLoop->AddTag(T); } else { strcpy ( _err_string,S ); _err_line = lcount; Warning |= CIFW_DuplicateTag; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,S ); } } } Repeat = true; } else { p = p1; Repeat = false; } } else if (!(*p) || (*p=='#')) { Repeat = !f.FileEnd(); if (Repeat) { f.ReadLine ( S,_max_buf_len ); lcount++; p = &(S[0]); } else { strcpy ( _err_string,S ); _err_line = lcount; Warning |= CIFW_UnexpectedEOF; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,S ); } } else Repeat = false; } while (Repeat); if (cifLoop) { do { while ((*p==' ') || (*p==char(9))) p++; if (!(*p) || (*p=='#')) { Repeat = !f.FileEnd(); if (Repeat) { f.ReadLine ( S,_max_buf_len ); lcount++; p = &(S[0]); } } else if (*p=='_') Repeat = false; else if (!strncmp(p,"loop_",5)) Repeat = false; else if (!strncmp(p,"data_",5)) Repeat = false; else if (!strncmp(p,"stop_",5)) { p += 5; Repeat = false; } else { RC = GetField ( f,S,L,p,lcount,llen ); if (!RC) { cifLoop->AddString ( L ); Repeat = true; } else Repeat = false; } } while (Repeat); if ((cifLoop->iColumn!=0) || (RC)) { strcpy ( _err_string,S ); _err_line = lcount; Warning |= CIFW_LoopFieldMissing; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,S ); } } } int Data::GetField ( io::RFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ) { bool Repeat; pstr L1; int i,flen; char c; flen = 0; L[flen] = char(0); do { // skip all spaces before the field while ((*p==' ') || (*p==char(9))) p++; if ((*p=='#') || (!(*p))) { // comment or end of line met; the field should be // found on the next line Repeat = !f.FileEnd(); if (Repeat) { // take the next line f.ReadLine ( S,_max_buf_len ); lcount++; p = &(S[0]); Repeat = (*p!=';'); } else { // end of file and the field is not taken L[0] = char(0); return 1; } } else // first symbol of a field is found Repeat = false; } while (Repeat); if (*p==';') { // this is a multiline field p++; strcpy ( L,p ); // take first line of the field flen = strlen(L); while (!f.FileEnd()) { f.ReadLine ( S,_max_buf_len ); lcount++; p = &(S[0]); if (*p==';') { // multiline field terminated p++; while ((*p==' ') || (*p==char(9))) p++; return 0; } else { // multiline field continues -- take next line flen += strlen(S)+2; if (flen>=llen) { llen = flen + IMin(2000,llen); L1 = new char[llen]; strcpy ( L1,L ); delete[] L; L = L1; } strcat ( L,"\n" ); strcat ( L,S ); } } // end of file -- take the last line of the multiline field p = &(S[strlen(S)]); } else { i = 0; if (*p!='_') { if ((*p=='\'') || (*p=='"')) { c = *p; // field in quotation marks do { p++; // stop taking characters either on end of line // or the quotation mark while ((*p) && (*p!=c)) { L[i++] = *p; p++; } while (*p==c) { // it was a quotation mark -- check that it is followed // by end of line or space p++; if ((*p) && (*p!=' ') && (*p!=char(9))) { // the quotation mark is not a field terminator and // belongs to the field. L[i++] = c; // take the quotation mark if (*p!=c) // take the non-space character L[i++] = *p; // but check for field terminator } } // terminate the loop only on space or end of line } while ((*p) && (*p!=' ') && (*p!=char(9))); if (*p) p++; L[i] = char(0); } else { // a simplest field without spaces while ((*p) && (*p!=' ') && (*p!=char(9))) { L[i++] = *p; p++; } L[i] = char(0); if (((L[0]=='.') || (L[0]=='?')) && (!L[1])) { // "no data" tokens L[1] = L[0]; L[0] = char(2); L[2] = char(0); } } } } return 0; } void Data::Sort() { int i,k; psvector cnames; k = 0; for (i=0;iSort(); cnames[i] = NULL; CreateCopy ( cnames[i],Category[i]->name ); } SortTags ( cnames,nCategories,index ); for (i=0;i=0 : position of the category found // <0 : the category was not found, it could be inserted before // (-RC-1)th element, where RC is the return value int l1,l2,l,k; if ((!Category) || (nCategories<1)) return -1; if (!index) Sort(); if (cname[0]) { l = 0; l1 = 0; l2 = nCategories-1; k = 1; while (l1name ); if (k<0) l2 = l; else if (k>0) l1 = l; else { l1 = l; break; } } if (k==0) return index[l]; // is at RCth position k = strcasecmp(cname,Category[index[l1]]->name); if (k==0) return index[l1]; // is at RCth position if (k<0) return -1; // would be at (-RC-1)th position if (l2!=l1) { k = strcasecmp(cname,Category[index[l2]]->name); if (k==0) return index[l2]; // is at RCth position if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position } return -2-l1; // would be at l1+1=(-RC-1)th position } else // 'root' category should be always on top if (Category[index[0]]->name[0]==char(1)) return index[0]; return -1; } int Data::AddCategory ( cpstr cname ) { // return -1: a place for category has been added on the top of array; // index is added and sorted automatically // >=0: the category is already in the array -- its position // is returned int l1,l; PPCategory Category1; ivector index1; if (!Category) { Category = new PCategory[1]; Category[0] = NULL; GetVectorMemory ( index,1,0 ); index[0] = 0; nCategories = 1; return -nCategories; // the category has been added on the top of array } l1 = GetCategoryNo ( cname ); if (l1>=0) return l1; // non-negative returns mean that // the category is already in the array l1 = -l1-1; // otherwise the category has to be added and indexed at here // put new NULL-category on the top of array and update the index Category1 = new PCategory[nCategories+1]; GetVectorMemory ( index1,nCategories+1,0 ); for (l=0;lWriteMMCIF ( f ); } // --------------- Retrieving data int Data::DeleteCategory ( cpstr CName ) { int k; k = GetCategoryNo ( CName ); if (k<0) return CIFRC_NoCategory; return DeleteCategory ( k ); } int Data::DeleteCategory ( int CatNo ) { int i; if (Category[CatNo]) delete Category[CatNo]; for (i=CatNo+1;iCatNo) index[i]--; i++; } i++; while (iCatNo) index[i]--; index[i-1] = index[i]; i++; } nCategories--; index [nCategories] = 0; Category[nCategories] = NULL; return 0; } int Data::DeleteStructure ( cpstr CName ) { int k; k = GetCategoryNo ( CName ); if (k<0) return CIFRC_NoCategory; if (Category[k]->GetCategoryID()==MMCIF_Struct) return DeleteCategory ( k ); else return CIFRC_NotAStructure; } int Data::DeleteLoop ( cpstr CName ) { int k; k = GetCategoryNo ( CName ); if (k<0) return CIFRC_NoCategory; if (Category[k]->GetCategoryID()==MMCIF_Loop) return DeleteCategory ( k ); else return CIFRC_NotALoop; } PCategory Data::GetCategory ( int categoryNo ) { if ((categoryNo>=0) && (categoryNoGetCategoryID()==MMCIF_Struct) return PStruct(Category[i]); else return NULL; } PLoop Data::GetLoop ( cpstr CName ) { int i; i = GetCategoryNo ( CName ); if (i<0) return NULL; if (Category[i]->GetCategoryID()==MMCIF_Loop) return PLoop(Category[i]); else return NULL; } PLoop Data::FindLoop ( cpstr * tagList ) { int i; for (i=0;iGetCategoryID()==MMCIF_Loop) { if (Category[i]->CheckTags(tagList)) return PLoop(Category[i]); } } return NULL; } void Data::GetDataName ( pstr & dname, bool Remove ) { if (Remove) { if (dname) delete[] dname; dname = name; name = NULL; } else CreateCopy ( dname,name ); } int Data::CheckData ( cpstr CName, cpstr TName ) { // CheckData(..) returns positive value if the field is in the // file: // CIFRC_Structure category CName is a structure // CIFRC_Loop category CName is a loop // Negative returns mean: // CIFRC_StructureNoTag category CName is present, // it is a structure, but it does not // have tag TName // CIFRC_LoopNoTag category CName is present, // it is a loop, but it does not have // tag TName // CIFRC_NoCategory category CName is not present. // If TName is set to NULL then only the CName is checked and // possible returns are CIFRC_Structure, CIFRC_Loop and // CIFRC_NoCategory. int i,k; i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()==MMCIF_Struct) k = CIFRC_Structure; else k = CIFRC_Loop; if (TName) { if (Category[i]->GetTagNo(TName)<0) { if (k==CIFRC_Structure) k = CIFRC_StructureNoTag; else k = CIFRC_LoopNoTag; } } return k; } void Data::Optimize() { int i,k; PPCategory C1; k = 0; for (i=0;iOptimize(); if (Category[i]->nTags<=0) { delete Category[i]; Category[i] = NULL; } else k++; } if (k>0) { if (k!=nCategories) { C1 = new PCategory[k]; k = 0; for (i=0;iGetCategoryID()!=MMCIF_Struct) return CIFRC_NotAStructure; return PStruct(Category[i])->GetString ( Dest,TName,Remove ); } pstr Data::GetString ( cpstr CName, cpstr TName, int & RC ) { int i = GetCategoryNo ( CName ); if (i<0) { RC = CIFRC_NoCategory; return NULL; } if (Category[i]->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; return NULL; } return PStruct(Category[i])->GetString ( TName,RC ); } int Data::DeleteField ( cpstr CName, cpstr TName ) { int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Struct) return CIFRC_NotAStructure; return PStruct(Category[i])->DeleteField ( TName ); } int Data::GetReal ( realtype & R, cpstr CName, cpstr TName, bool Remove ) { int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Struct) return CIFRC_NotAStructure; return PStruct(Category[i])->GetReal ( R,TName,Remove ); } int Data::GetInteger ( int & I, cpstr CName, cpstr TName, bool Remove ) { int j = GetCategoryNo ( CName ); if (j<0) return CIFRC_NoCategory; if (Category[j]->GetCategoryID()!=MMCIF_Struct) return CIFRC_NotAStructure; return PStruct(Category[j])->GetInteger ( I,TName,Remove ); } int Data::GetLoopLength ( cpstr CName ) { // GetLoopLength(..) returns CIFRC_NotALoop if the category CName // is not a loop, CIFRC_NoCategory if the category CName is not // found. Non-negative returns give the length of the loop (may be // 0 if the loop is empty). int i; i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PLoop(Category[i])->nRows; } int Data::GetLoopString ( pstr & Dest, cpstr CName, cpstr TName, int nrow, bool Remove ) { // GetLoopString(..), GetLoopReal(..) and GetLoopInteger(..) act // like GetString(..), GetReal(..) and GetInteger(..) above for // nrow-th element of the 'loop_' (indexed like 0..N-1 where N // is obtained through GetLoopLength(..)). They will return // CIFRC_WrongIndex if nrow is out of range. int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PLoop(Category[i])->GetString ( Dest,TName,nrow,Remove ); } pstr Data::GetLoopString ( cpstr CName, cpstr TName, int nrow, int & RC ) { int i = GetCategoryNo ( CName ); if (i<0) { RC = CIFRC_NoCategory; return NULL; } if (Category[i]->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; return NULL; } return PLoop(Category[i])->GetString ( TName,nrow,RC ); } int Data::DeleteLoopField ( cpstr CName, cpstr TName, int nrow ) { int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PLoop(Category[i])->DeleteField ( TName,nrow ); } int Data::GetLoopReal ( realtype & R, cpstr CName, cpstr TName, int nrow, bool Remove ) { int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PLoop(Category[i])->GetReal ( R,TName,nrow,Remove ); } int Data::GetLoopInteger ( int & I, cpstr CName, cpstr TName, int nrow, bool Remove ) { int j = GetCategoryNo ( CName ); if (j<0) return CIFRC_NoCategory; if (Category[j]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PLoop(Category[j])->GetInteger ( I,TName,nrow,Remove ); } int Data::GetLoopSVector ( psvector & S, cpstr CName, cpstr TName, int i1, int i2, bool Remove ) { // GetLoopSVector(..), GetLoopRVector(..) and GetLoopIVector(..) // read CIF 'loop_' data into allocated vectors of strings, reals and // integers, correspondingly. The vectors may be deallocated prior // to call and assigned NULL, in which case they will be allocated // with offsets of i1, which is also the lower index of the 'loop_' // data transferred into it. The upper vector index is given by i2 or // by the loop's length whichever is less. If vectors are not assigned // NULL prior the call, it is assumed that they are properly (i1-offset, // i2-i1+1 length) allocated. // The return codes are same as those of GetLoopString(..), // GetLoopReal(..) and GetLoopInteger(..). int i; i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PLoop(Category[i])->GetSVector ( S,TName,i1,i2,Remove ); } int Data::GetLoopRVector ( rvector & R, cpstr CName, cpstr TName, int i1, int i2, bool Remove ) { int i; i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PLoop(Category[i])->GetRVector ( R,TName,i1,i2,Remove ); } int Data::GetLoopIVector ( ivector & I, cpstr CName, cpstr TName, int i1, int i2, bool Remove ) { int j; j = GetCategoryNo ( CName ); if (j<0) return CIFRC_NoCategory; if (Category[j]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PLoop(Category[j])->GetIVector ( I,TName,i1,i2,Remove ); } // --------------- Storing data void Data::PutDataName ( cpstr dname ) { // stores name for 'data_' record CreateCopy ( name,dname ); } int Data::PutNoData ( int NoDataType, cpstr CName, cpstr TName ) { PStruct cifStruct; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifStruct = new Struct ( CName ); Category[nCategories-1] = cifStruct; } else { cifStruct = PStruct(Category[i]); if (cifStruct->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; delete Category[i]; cifStruct = new Struct ( CName ); Category[i] = cifStruct; } } cifStruct->PutNoData ( NoDataType,TName ); return RC; } int Data::PutString ( cpstr S, cpstr CName, cpstr TName, bool Concatenate ) { // PutString(..), PutReal(..) and PutInteger(..) will put the // values given into the specified category (CName) under the // specified tag (TName). The category, tag and field are created // automatically; the field will be replaced silently if identical // CName.TName is specified in two calls. Calls of these functions // may follow in random order; however CIF file will have all tags // grouped by categories and catgories will follow in the order // of first appearance in PutString(..), PutReal(..) or // PutInteger(..). // Return code - one of CIFRC_Ok or CIFRC_NotAStruct PStruct cifStruct; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifStruct = new Struct ( CName ); Category[nCategories-1] = cifStruct; } else { cifStruct = PStruct(Category[i]); if (cifStruct->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; delete Category[i]; cifStruct = new Struct ( CName ); Category[i] = cifStruct; } } cifStruct->AddField ( S,TName,Concatenate ); return RC; } int Data::PutDate ( cpstr CName, cpstr TName ) { PStruct cifStruct; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifStruct = new Struct ( CName ); Category[nCategories-1] = cifStruct; } else { cifStruct = PStruct(Category[i]); if (cifStruct->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; delete Category[i]; cifStruct = new Struct ( CName ); Category[i] = cifStruct; } } cifStruct->PutDate ( TName ); return RC; } int Data::PutReal ( realtype R, cpstr CName, cpstr TName, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); return PutString ( rS,CName,TName,false ); } int Data::PutInteger ( int I, cpstr CName, cpstr TName ) { char iS[100]; if (I>MinInt4) sprintf ( iS,"%i",I ); else { iS[0] = char(2); iS[1] = '.'; iS[2] = char(0); } return PutString ( iS,CName,TName,false ); } int Data::AddLoop ( cpstr CName, PLoop & cifLoop ) { int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifLoop = new Loop ( CName ); Category[nCategories-1] = cifLoop; RC = CIFRC_Created; } else { cifLoop = PLoop(Category[i]); if (cifLoop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; cifLoop = new Loop ( CName ); Category[i] = cifLoop; } } return RC; } int Data::AddStructure ( cpstr CName, PStruct & cifStruct ) { int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifStruct = new Struct ( CName ); Category[nCategories-1] = cifStruct; RC = CIFRC_Created; } else { cifStruct = PStruct(Category[i]); if (cifStruct->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; delete Category[i]; cifStruct = new Struct ( CName ); Category[i] = cifStruct; } } return RC; } int Data::PutLoopNoData ( int NoDataType, cpstr CName, cpstr TName, int nrow ) { PLoop cifLoop; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifLoop = new Loop ( CName ); Category[nCategories-1] = cifLoop; } else { cifLoop = PLoop(Category[i]); if (cifLoop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; cifLoop = new Loop ( CName ); Category[i] = cifLoop; } } cifLoop->PutNoData ( NoDataType,TName,nrow ); return RC; } int Data::PutLoopString ( cpstr S, cpstr CName, cpstr TName, int nrow ) { // PutLoopString(..), PutLoopReal(..) and PutLoopInteger(..) act // like PutString(..), PutReal(..) and PutInteger(..) above for // nrow-th element of the 'loop_' CName (indexed begining from 0). // In consequitive calls, given values of nrow does not have to be // ordered; the most efficient way is to start with HIGHEST value // for nrow in the loop and move down to 0. The least efficient way // is to start with nrow=0 and move up. PLoop cifLoop; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifLoop = new Loop ( CName ); Category[nCategories-1] = cifLoop; } else { cifLoop = PLoop(Category[i]); if (cifLoop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; cifLoop = new Loop ( CName ); Category[i] = cifLoop; } } cifLoop->PutString ( S,TName,nrow ); return RC; } int Data::PutLoopReal ( realtype R, cpstr CName, cpstr TName, int nrow, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); return PutLoopString ( rS,CName,TName,nrow ); } int Data::PutLoopInteger ( int I, cpstr CName, cpstr TName, int nrow ) { char iS[100]; sprintf ( iS,"%i",I ); return PutLoopString ( iS,CName,TName,nrow ); } int Data::PutLoopSVector ( psvector S, cpstr CName, cpstr TName, int i1, int i2 ) { // PutLoopSVector(..), PutLoopRVector(..) and PutLoopIVector(..) // put vectors of values into specified loop fields. Parameters i1 // and i2 give the range of indices of values which are to be // transfered. To transfer an entire vector allocated as [0..N-1] // i1 shoudl be set to 0 and i2 - to N-1. Note that the loop is // always indexed as starting form 0 on, therefore negative i1 and // i2 are not allowed, and specifying i1>0 will leave first i1 // elements of the CIF loop for the corresponding tag undefined // (will be output like '?'). PLoop cifLoop; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifLoop = new Loop ( CName ); Category[nCategories-1] = cifLoop; } else { cifLoop = PLoop(Category[i]); if (cifLoop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; cifLoop = new Loop ( CName ); Category[i] = cifLoop; } } cifLoop->PutSVector ( S,TName,i1,i2 ); return RC; } int Data::PutLoopRVector ( rvector R, cpstr CName, cpstr TName, int i1, int i2, int prec ) { PLoop cifLoop; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifLoop = new Loop ( CName ); Category[nCategories-1] = cifLoop; } else { cifLoop = PLoop(Category[i]); if (cifLoop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; cifLoop = new Loop ( CName ); Category[i] = cifLoop; } } cifLoop->PutRVector ( R,TName,i1,i2,prec ); return RC; } int Data::PutLoopIVector ( ivector I, cpstr CName, cpstr TName, int i1, int i2 ) { PLoop cifLoop; int j,RC; RC = CIFRC_Ok; // look for category j = AddCategory ( CName ); if (j<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated cifLoop = new Loop ( CName ); Category[nCategories-1] = cifLoop; } else { cifLoop = PLoop(Category[j]); if (cifLoop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[j]; cifLoop = new Loop ( CName ); Category[j] = cifLoop; } } cifLoop->PutIVector ( I,TName,i1,i2 ); return RC; } int Data::RenameCategory ( cpstr CName, cpstr newCName ) { int i,RC; i = GetCategoryNo ( CName ); if (i>=0) { Category[i]->PutCategoryName ( newCName ); Sort(); RC = CIFRC_Ok; } else RC = CIFRC_NoCategory; return RC; } void Data::Copy ( PData Data ) { int i; FreeMemory(0); CreateCopy ( name,Data->name ); nCategories = Data->nCategories; if (nCategories>0) { Category = new PCategory[nCategories]; GetVectorMemory ( index,nCategories,0 ); for (i=0;iCategory[i]) { if (Data->Category[i]->GetCategoryID()==MMCIF_Struct) Category[i] = new Struct(); else Category[i] = new Loop(); Category[i]->Copy ( Data->Category[i] ); } else Category[i] = NULL; index[i] = Data->index[i]; } } flags = Data->flags; Warning = Data->Warning; } int Data::CopyCategory ( PData Data, cpstr CName, cpstr newCName ) { PCategory Cat; int i,di,dc,RC; di = Data->GetCategoryNo ( CName ); if (di>=0) { RC = CIFRC_Ok; dc = Data->Category[di]->GetCategoryID(); // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated if (dc==MMCIF_Loop) Cat = new Loop ( CName ); else Cat = new Struct ( CName ); Category[nCategories-1] = Cat; } else { Cat = Category[i]; if (Cat->GetCategoryID()!=dc) { RC = CIFRC_NotAStructure; delete Category[i]; if (dc==MMCIF_Loop) Cat = new Loop ( CName ); else Cat = new Struct ( CName ); Category[i] = Cat; } } Cat->Copy ( Data->Category[di] ); if (newCName) { Cat->PutCategoryName ( newCName ); Sort(); } } else RC = CIFRC_NoCategory; return RC; } void Data::PrintCategories() { // for debuging only int i; printf ( " Total %i categories:\n",nCategories ); for (i=0;iGetCategoryID()==MMCIF_Loop) printf ( "Loop %s\n",Category[i]->name ); else printf ( "Structure %s\n",Category[i]->name ); } } void Data::write ( io::RFile f ) { int i,k; if (!index) Sort(); f.CreateWrite ( name ); f.WriteInt ( &nCategories ); for (i=0;iGetCategoryID(); f.WriteInt ( &k ); Category[i]->write ( f ); } else { k = -1; f.WriteInt ( &k ); } f.WriteInt ( &(index[i]) ); } f.WriteInt ( &flags ); f.WriteInt ( &Warning ); } void Data::read ( io::RFile f ) { int i,k; FreeMemory(0); f.CreateRead ( name ); f.ReadInt ( &nCategories ); if (nCategories>0) { Category = new PCategory[nCategories]; GetVectorMemory ( index,nCategories,0 ); for (i=0;i=0) { if (k==MMCIF_Struct) Category[i] = new Struct(); else Category[i] = new Loop(); Category[i]->read ( f ); } else Category[i] = NULL; f.ReadInt ( &(index[i]) ); } } f.ReadInt ( &flags ); f.ReadInt ( &Warning ); } MakeStreamFunctions(Data) // ====================== File ============================= File::File() : io::Stream() { InitFile(); } File::File ( cpstr FName, io::GZ_MODE gzipMode ) : io::Stream() { InitFile (); ReadMMCIFFile ( FName,gzipMode ); } File::File ( io::RPStream Object ) : io::Stream(Object) { InitFile(); } File::~File() { FreeMemory(); } void File::InitFile() { nData = 0; nAllocData = 0; data = NULL; index = NULL; PrintWarnings = false; StopOnWarning = false; } void File::FreeMemory() { int i; for (i=0;iSetPrintWarnings ( PrintWarnings ); CIF->SetStopOnWarning ( StopOnWarning ); RC = CIF->ReadMMCIFData ( f,S,lcount ); if (!RC) { ExpandData ( nData+1 ); data[nData] = CIF; nData++; CIF = NULL; } } if (CIF) delete CIF; f.shut(); if (RC==CIFRC_NoDataLine) { if (nData>0) RC = 0; } Sort(); return RC; } else return CIFRC_CantOpenFile; } int File::WriteMMCIFFile ( cpstr FName, io::GZ_MODE gzipMode ) { io::File f; f.assign ( FName,true,false,gzipMode ); if (f.rewrite()) { WriteMMCIF ( f ); f.shut(); return 0; } else return CIFRC_CantOpenFile; } void File::WriteMMCIF ( io::RFile f ) { int i; for (i=0;iWriteMMCIF ( f ); } void File::Sort() { psvector tag; int i; if (nData>0) { FreeVectorMemory ( index,0 ); GetVectorMemory ( index,nData,0 ); GetVectorMemory ( tag ,nData,0 ); for (i=0;iname ); } SortTags ( tag,nData,index ); for (i=0;i=0 : position of the DName found // <0 : the DName was not found, it could be inserted before // (-RC-1)th element, where RC is the return value int l1,l2,l,k; if (!data) return -1; if (!index) Sort(); l = 0; l1 = 0; l2 = nData-1; k = 1; while (l1name ); if (k<0) l2 = l; else if (k>0) l1 = l; else { l1 = l; break; } } if (k==0) return index[l]; // is at RCth position k = strcasecmp ( DName,data[index[l1]]->name ); if (k==0) return index[l1]; // is at RCth position if (k<0) return -1; // would be at (-RC-1)th position if (l2!=l1) { k = strcasecmp ( DName,data[index[l2]]->name ); if (k==0) return index[l2]; // is at RCth position if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position } return -2-l1; // would be at l1+1=(-RC-1)th position } PData File::GetCIFData ( int dataNo ) { if ((dataNo>=0) && (dataNo=0) return data[l]; else return NULL; } void File::ExpandData ( int nDataNew ) { int i,nAD; PPData data1; ivector index1; if (nDataNew>nAllocData) { nAD = nDataNew + IMin(nAllocData/2+1,100); data1 = new PData[nAD]; GetVectorMemory ( index1,nAD,0 ); for (i=0;i=0: the CIF data structure is already in the array // -- its position is returned int i1,i; if (!data) { ExpandData ( 3 ); // get space for first 3 CIF data structures data[0] = new Data ( DName ); nData = 1; return -nData; // the CIF data structure has been added // "on the top" of array } i1 = GetCIFDataNo ( DName ); if (i1>=0) return i1; // non-negative returns mean that the CIF // data structure is already in the array i1 = -i1-1; // otherwise the data has to be added and indexed at here // put new CIF data structure on the top of array and update index ExpandData ( nData+1 ); data[nData] = new Data ( DName ); for (i=nData;i>i1;i--) index[i] = index[i-1]; index[i1] = nData; nData++; return -nData; // the tag has been added on the top of array } int File::DeleteCIFData ( cpstr DName ) { int dataNo = GetCIFDataNo ( DName ); if (dataNo>=0) return DeleteCIFData ( dataNo ); return dataNo; } int File::DeleteCIFData ( int dataNo ) { int i; if ((0<=dataNo) && (dataNonData; nAllocData = nData; if (nData>0) { data = new PData[nData]; for (i=0;idata[i]) { data[i] = new Data(); data[i]->Copy ( File->data[i] ); } else data[i] = NULL; } } } void File::write ( io::RFile f ) { int i,k; f.WriteInt ( &nData ); for (i=0;iwrite ( f ); } else { k = 0; f.WriteInt ( &k ); } } void File::read ( io::RFile f ) { int i,k; FreeMemory(); f.ReadInt ( &nData ); nAllocData = nData; if (nData>0) { data = new PData[nData]; for (i=0;iread ( f ); } else data[i] = NULL; } } } MakeStreamFunctions(File) int isCIF ( cpstr FName, io::GZ_MODE gzipMode ) { io::File f; int rc; f.assign ( FName,true,false,gzipMode ); if (f.reset(true)) { rc = isCIF ( f ); f.shut(); } else rc = -1; return rc; } int isCIF ( io::RFile f ) { char S[_max_buf_len+1]; bool Done; pstr p; f.ReadLine ( S,_max_buf_len ); S[_max_buf_len] = char(0); Done = false; while (!Done) { p = &(S[0]); while ((*p==' ') || (*p==char(9))) p++; Done = !strncmp(p,"data_",5); if (!Done) { if (f.FileEnd()) { Done = true; p = NULL; } else { f.ReadLine ( S,_max_buf_len ); S[_max_buf_len] = char(0); } } } if (!p) return 1; if (!strncmp(p,"data_",5)) return 0; else return 1; } pstr GetCIFMessage ( pstr M, int RC ) { int LineNo; pstr InputLine; InputLine = GetMMCIFInputBuffer ( LineNo ); if (RC>10) { if (RC & CIFW_UnrecognizedItems) sprintf ( M,"unrecognized items found on %ith line\n%s", LineNo,InputLine ); else if (RC & CIFW_MissingField) sprintf ( M,"expected data field not found; line %i reads\n%s", LineNo,InputLine ); else if (RC & CIFW_EmptyLoop) sprintf ( M,"empty loop ('loop_') on %ith line\n%s", LineNo,InputLine ); else if (RC & CIFW_UnexpectedEOF) sprintf ( M,"unexpected end of file; line %i reads\n%s", LineNo,InputLine ); else if (RC & CIFW_LoopFieldMissing) sprintf ( M,"expected data field in a loop not found; " "line %i reads\n%s", LineNo,InputLine ); else if (RC & CIFW_LoopFieldMissing) sprintf ( M,"expected data field in a loop not found; " "line %i reads\n%s", LineNo,InputLine ); else if (RC & CIFW_NotAStructure) sprintf ( M,"a loop is used as a structure on line %i\n%s", LineNo,InputLine ); else if (RC & CIFW_NotALoop) sprintf ( M,"a structure is used as a loop on line %i\n%s", LineNo,InputLine ); else if (RC & CIFW_DuplicateTag) sprintf ( M,"duplicate tag was found on line %i\n%s", LineNo,InputLine ); else sprintf ( M,"undocumented warning issued for line %i\n%s", LineNo,InputLine ); } else if (RC<0) switch (RC) { case CIFRC_StructureNoTag : strcpy(M,"tag of a structure not " "found"); break; case CIFRC_LoopNoTag : strcpy(M,"tag of a loop not found"); break; case CIFRC_NoCategory : strcpy(M,"category not found"); break; case CIFRC_WrongFormat : strcpy(M,"wrong format of a number"); break; case CIFRC_NoTag : strcpy(M,"tag not found"); break; case CIFRC_NotAStructure : strcpy(M,"category is not a " "structure"); break; case CIFRC_NotALoop : strcpy(M,"category is not a loop"); break; case CIFRC_WrongIndex : strcpy(M,"index outside the loop's " "limits"); break; case CIFRC_NoField : strcpy(M,"data is absent"); break; case CIFRC_Created : strcpy(M,"category created"); break; case CIFRC_CantOpenFile : strcpy(M,"can't open CIF file"); break; case CIFRC_NoDataLine : strcpy(M,"'data_' tag not found." ); break; default : strcpy(M,"undocumented return code"); } return M; } } // namespace mmcif } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_chain.h0000644000175000017500000005505713271367640015714 0ustar maartenmaarten// $Id: mmdb_chain.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 23.12.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Chain // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::ProModel ( abstract Model class ) // ~~~~~~~~~ mmdb::DBReference ( DBREF records ) // mmdb::ChainContainer ( container of in-chain classes ) // mmdb::ContainerChain ( chain containered class template) // mmdb::SeqAdv ( SEQADV records ) // mmdb::SeqRes ( SEQRES records ) // mmdb::ModRes ( MODRES records ) // mmdb::HetRec ( HET records ) // mmdb::Chain ( chain class ) // // Copyright (C) E. Krissinel 2000-2015 // // ================================================================= // #ifndef __MMDB_Chain__ #define __MMDB_Chain__ #include "mmdb_io_stream.h" #include "mmdb_utils.h" #include "mmdb_atom.h" #include "mmdb_defs.h" namespace mmdb { // ==================== ProModel ====================== // This class is a virtue needed only for defining certain // functions of Model, which are used by Chain and // Residue DefineClass(ProModel); DefineStreamFunctions(ProModel); DefineClass(Manager); class ProModel : public UDData { friend class Chain; public : ProModel () : UDData () {} ProModel ( io::RPStream Object ) : UDData ( Object ) {} ~ProModel () {} virtual cpstr GetEntryID () { return ""; } virtual void SetEntryID ( const IDCode ) {} virtual int AddChain ( PChain ) { return 0; } // returns pointer to Root virtual PManager GetCoordHierarchy() { return NULL; } // GetNumberOfModels() returns TOTAL number of models virtual int GetNumberOfModels() { return 0; } // GetNumberOfAllAtoms() returns TOTAL number of atoms in // all models virtual int GetNumberOfAllAtoms() { return 0; } // returns pointer to the general Atom array virtual PPAtom GetAllAtoms() { return NULL; } virtual int GetSerNum () { return 0; } virtual void ExpandAtomArray ( int ) {} virtual void AddAtomArray ( int ) {} protected : virtual int _ExcludeChain ( const ChainID ) { return 0; } }; // ==================== ChainContainer ====================== DefineClass(ChainContainer); DefineStreamFunctions(ChainContainer); class ChainContainer : public ClassContainer { public : ChainContainer () : ClassContainer () {} ChainContainer ( io::RPStream Object ) : ClassContainer ( Object ) {} ~ChainContainer () {} PContainerClass MakeContainerClass ( int ClassID ); void SetChain ( PChain Chain_Owner ); // must be set before using // the Container // special functions used in Model::GetCIF(..) cpstr Get1stChainID (); void MoveByChainID ( const ChainID chainID, PChainContainer chainContainer ); protected : PChain chain; }; // ================== ContainerChain ===================== DefineClass(ContainerChain); DefineStreamFunctions(ContainerChain); class ContainerChain : public ContainerClass { friend class ChainContainer; public : ContainerChain (); ContainerChain ( PChain Chain_Owner ); ContainerChain ( io::RPStream Object ) : ContainerClass(Object) {} void SetChain ( PChain Chain_Owner ); protected : PChain chain; ChainID chainID; // just a copy of Chain->chainID }; // ================== DBReference ======================== DefineClass(DBReference); DefineStreamFunctions(DBReference); class DBReference : public ContainerChain { public : int seqBeg; // initial seq num of the PDB seq-ce segment InsCode insBeg; // initial ins code of the PDB seq-ce segm-t int seqEnd; // ending seq number of the PDB seq-ce segm-t InsCode insEnd; // ending ins code of the PDB seq-ce segment DBName database; // sequence database name DBAcCode dbAccession; // sequence database accession code DBIdCode dbIdCode; // sequence database identification code int dbseqBeg; // initial seq number of the database segment InsCode dbinsBeg; // ins code of initial residue of the segment int dbseqEnd; // ending seq number of the database segment InsCode dbinsEnd; // ins code of the ending residue of the seg-t DBReference (); DBReference ( PChain Chain_Owner ); DBReference ( PChain Chain_Owner, cpstr S ); DBReference ( io::RPStream Object ); ~DBReference(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_DBReference; } void Copy ( PContainerClass DBRef ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitDBReference(); }; // ==================== SeqAdv =========================== DefineClass(SeqAdv); DefineStreamFunctions(SeqAdv); class SeqAdv : public ContainerChain { public : ResName resName; // residue name in conflict int seqNum; // residue sequence number InsCode insCode; // residue insertion code DBName database; // sequence database name DBAcCode dbAccession; // sequence database accession code ResName dbRes; // sequence database residue name int dbSeq; // sequence database sequence number pstr conflict; // conflict comment SeqAdv (); SeqAdv ( PChain Chain_Owner ); SeqAdv ( PChain Chain_Owner, cpstr S ); SeqAdv ( io::RPStream Object ); ~SeqAdv(); void PDBASCIIDump ( pstr S, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_SeqAdv; } void Copy ( PContainerClass seqAdv ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitSeqAdv(); }; // ================== SeqRes ======================== DefineClass(SeqRes); DefineStreamFunctions(SeqRes); class SeqRes : public io::Stream { friend class Model; friend class Chain; public : int numRes; // number of residues in the chain PResName resName; // residue names SeqRes (); SeqRes ( io::RPStream Object ); ~SeqRes(); void SetChain ( PChain Chain_Owner ); void PDBASCIIDump ( io::RFile f ); ERROR_CODE ConvertPDBASCII ( cpstr S ); void MakeCIF ( mmcif::PData CIF ); ERROR_CODE GetCIF ( mmcif::PData CIF ); void Copy ( PSeqRes seqRes ); void write ( io::RFile f ); void read ( io::RFile f ); protected : PChain chain; ChainID chainID; int serNum; void InitSeqRes(); void FreeMemory(); }; // ================== ModRes ======================== DefineClass(ModRes); DefineStreamFunctions(ModRes); class ModRes : public ContainerChain { public : ResName resName; // residue name used int seqNum; // residue sequence number InsCode insCode; // residue insertion code ResName stdRes; // standard residue name pstr comment; // description of the residue modification ModRes (); ModRes ( PChain Chain_Owner ); ModRes ( PChain Chain_Owner, cpstr S ); ModRes ( io::RPStream Object ); ~ModRes(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_ModRes; } void Copy ( PContainerClass modRes ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitModRes(); }; // ================== HetRec =========================== DefineClass(HetRec); DefineStreamFunctions(HetRec); class HetRec : public ContainerChain { public : ResName hetID; // Het identifier (right-justified) int seqNum; // sequence number InsCode insCode; // insertion code int numHetAtoms; // number of HETATM records for the // group present in the entry pstr comment; // text describing Het group HetRec (); HetRec ( PChain Chain_Owner ); HetRec ( PChain Chain_Owner, cpstr S ); HetRec ( io::RPStream Object ); ~HetRec(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_Het; } void Copy ( PContainerClass Het ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitHetRec(); }; // ================= Chain ======================= DefineFactoryFunctions(Chain); class Chain : public UDData { friend class DBReference; friend class SeqAdv; friend class SeqRes; friend class ModRes; friend class HetRec; friend class Residue; friend class Atom; friend class Model; friend class Root; friend class SelManager; friend class BondManager; friend class CoorManager; friend class Manager; public : ChainContainer DBRef; // database reference ChainContainer seqAdv; // SEQADV records SeqRes seqRes; // Sequence residues, SEQRES records ChainContainer modRes; // modification descriptions ChainContainer Het; // non-standard residues descriptions Chain (); // SetModel() MUST be used after this constructor! Chain ( PProModel model, const ChainID chID ); Chain ( io::RPStream Object ); ~Chain(); void FreeAnnotations(); void SetModel ( PProModel model ); void SetChain ( const ChainID chID ); PManager GetCoordHierarchy(); // PRoot // ConvertXXXXX(..) functions do not check for record name // and assume that PDBString is at least 81 symbols long // (including the terminating null). ERROR_CODE ConvertDBREF ( cpstr PDBString ); ERROR_CODE ConvertSEQADV ( cpstr PDBString ); ERROR_CODE ConvertSEQRES ( cpstr PDBString ); ERROR_CODE ConvertMODRES ( cpstr PDBString ); ERROR_CODE ConvertHET ( cpstr PDBString ); // This function should be used for testing purposes only. // A full PDB ASCII dump for all models and chains involved // is done by Root class. void PDBASCIIDump ( io::RFile f ); void PDBASCIIAtomDump ( io::RFile f ); void MakeAtomCIF ( mmcif::PData CIF ); // ----------------- Extracting residues ------------------------- int GetNumberOfResidues(); // returns number of res-s in the chain PResidue GetResidue ( int resNo ); // returns resNo-th residue // in the chain; // 0<=resNo // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::xml::XMLObject // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include #include "mmdb_xml_.h" namespace mmdb { namespace xml { // ====================== XMLObject ========================== XMLObject::XMLObject() : io::Stream() { InitXMLObject(); } XMLObject::XMLObject ( cpstr Tag ) : io::Stream() { InitXMLObject(); SetTag ( Tag ); } XMLObject::XMLObject ( cpstr Tag, cpstr Data ) : io::Stream() { InitXMLObject(); SetTag ( Tag ); SetData ( Data ); } XMLObject::XMLObject ( cpstr Tag, realtype V, int length ) : io::Stream() { InitXMLObject(); SetTag ( Tag ); SetData ( V,length ); } XMLObject::XMLObject ( cpstr Tag, int iV, int length ) : io::Stream() { InitXMLObject(); SetTag ( Tag ); SetData ( iV,length ); } XMLObject::XMLObject ( cpstr Tag, bool bV ) : io::Stream() { InitXMLObject(); SetTag ( Tag ); SetData ( bV ); } XMLObject::XMLObject ( cpstr Tag, PXMLObject XMLObject ) : io::Stream() { InitXMLObject(); SetTag ( Tag ); AddObject ( XMLObject ); } XMLObject::XMLObject ( io::RPStream Object ) : io::Stream(Object) { InitXMLObject(); } XMLObject::~XMLObject() { FreeMemory(); } void XMLObject::InitXMLObject() { parent = NULL; objTag = NULL; objData = NULL; nObjects = 0; nAlloc = 0; object = NULL; nAttributes = 0; nAttrAlloc = 0; attr_name = NULL; attr_value = NULL; } void XMLObject::FreeMemory() { int i; if (objTag) delete[] objTag; if (objData) delete[] objData; objTag = NULL; objData = NULL; if (object) { for (i=0;i=nAttrAlloc) { nAttrAlloc = nAttributes + 10; GetVectorMemory ( an,nAttrAlloc,0 ); GetVectorMemory ( av,nAttrAlloc,0 ); for (i=0;iGetCategoryID()==mmcif::MMCIF_Loop) return AddMMCIFLoop ( mmcif::PLoop(mmCIFCat) ); if (mmCIFCat->GetCategoryID()==mmcif::MMCIF_Struct) return AddMMCIFStruct ( mmcif::PStruct(mmCIFCat) ); return -1; } pstr getCCIFTag ( pstr & ccifTag, cpstr Tag ) { if (Tag[0]=='_') return CreateCopCat ( ccifTag,pstr("ccif") ,Tag ); else return CreateCopCat ( ccifTag,pstr("ccif_"),Tag ); } int XMLObject::AddMMCIFStruct ( mmcif::PStruct mmCIFStruct ) { PXMLObject XMLObject1,XMLObject2; pstr SName,Tag,Field, ccifTag; int nTags,i,k; XMLObject1 = this; ccifTag = NULL; SName = mmCIFStruct->GetCategoryName(); if (SName) { if (SName[0]!=char(1)) XMLObject1 = new XMLObject ( getCCIFTag(ccifTag,SName) ); } k = 0; nTags = mmCIFStruct->GetNofTags(); for (i=0;iGetTag ( i ); if (Tag) { XMLObject2 = new XMLObject ( getCCIFTag(ccifTag,Tag) ); Field = mmCIFStruct->GetField ( i ); if (Field) { if (Field[0]!=char(2)) XMLObject2->SetData ( Field ); else XMLObject2->SetData ( &(Field[1]) ); } XMLObject1->AddObject ( XMLObject2 ); k++; } } if (SName) { if (SName[0]!=char(1)) AddObject ( XMLObject1 ); } if (ccifTag) delete[] ccifTag; return k; } int XMLObject::AddMMCIFLoop ( mmcif::PLoop mmCIFLoop ) { PXMLObject XMLObject1,XMLObject2,XMLObject3; pstr SName,Tag,Field,ccifTag; int nTags,nRows,i,j,k; XMLObject1 = this; ccifTag = NULL; SName = mmCIFLoop->GetCategoryName(); if (SName) { if (SName[0]!=char(1)) XMLObject1 = new XMLObject ( getCCIFTag(ccifTag,SName) ); } k = 0; nTags = mmCIFLoop->GetNofTags (); nRows = mmCIFLoop->GetLoopLength(); for (i=0;iGetTag ( j ); if (Tag) { XMLObject3 = new XMLObject ( getCCIFTag(ccifTag,Tag) ); Field = mmCIFLoop->GetField ( i,j ); if (Field) { if (Field[0]!=char(2)) XMLObject3->SetData ( Field ); else XMLObject3->SetData ( &(Field[1]) ); } XMLObject2->AddObject ( XMLObject3 ); k++; } } XMLObject1->AddObject ( XMLObject2 ); } if (SName) { if (SName[0]!=char(1)) AddObject ( XMLObject1 ); } if (ccifTag) delete[] ccifTag; return k; } int XMLObject::AddMMCIFData ( mmcif::PData mmCIFData ) { mmcif::PCategory mmCIFCat; int nCats,i,k,n; nCats = mmCIFData->GetNumberOfCategories(); k = 0; n = 0; for (i=0;(i=0);i++) { mmCIFCat = mmCIFData->GetCategory ( i ); if (mmCIFCat) { if (mmCIFCat->GetCategoryID()==mmcif::MMCIF_Loop) n = AddMMCIFLoop ( mmcif::PLoop(mmCIFCat) ); else if (mmCIFCat->GetCategoryID()==mmcif::MMCIF_Struct) n = AddMMCIFStruct ( mmcif::PStruct(mmCIFCat) ); else n = -1; if (n>=0) k += n; } } if (n<0) return -(k+1); return k; } pstr XMLObject::GetData ( cpstr Tag, int objNo ) { PXMLObject XMLObject; XMLObject = GetObject ( Tag,objNo ); if (XMLObject) return XMLObject->objData; return NULL; } XML_RC XMLObject::GetData ( pstr & Data, cpstr Tag, int objNo ) { PXMLObject XMLObject; XMLObject = GetObject ( Tag,objNo ); if (XMLObject) { Data = XMLObject->objData; return XMLRC_Ok; } else { Data = NULL; return XMLRC_NoTag; } } XML_RC XMLObject::GetData ( realtype & V, cpstr Tag, int objNo ) { pstr d,p; XML_RC rc; rc = GetData ( d,Tag,objNo ); if (d) { V = strtod(d,&p); if ((V==0.0) && (p==d)) rc = XMLRC_RFormatError; else rc = XMLRC_Ok; } else if (!rc) rc = XMLRC_NoTag; return rc; } XML_RC XMLObject::GetData ( int & iV, cpstr Tag, int objNo ) { pstr d,p; XML_RC rc; rc = GetData ( d,Tag,objNo ); if (d) { iV = mround(strtod(d,&p)); if ((iV==0) && (p==d)) rc = XMLRC_IFormatError; else rc = XMLRC_Ok; } else if (!rc) rc = XMLRC_NoTag; return rc; } XML_RC XMLObject::GetData ( bool & bV, cpstr Tag, int objNo ) { pstr d; XML_RC rc; rc = GetData ( d,Tag,objNo ); if (d) { if (!strcasecmp(d,"Yes")) bV = true; else { bV = false; if (strcasecmp(d,"No")) rc = XMLRC_OFormatError; } } else if (rc==XMLRC_Ok) rc = XMLRC_NoTag; return rc; } PXMLObject XMLObject::GetObject ( cpstr Tag, int objNo ) { // allow for "tag1>tag2>tag3>..." PXMLObject XMLObject; pstr p,p1; int i,j,k,l; XMLObject = this; if (Tag) { p = pstr(Tag); do { p1 = p; l = 0; while (*p1 && (*p1!='>')) { p1++; l++; } if (l>0) { k = -1; j = 0; for (i=0;(inObjects) && (k<0);i++) if (XMLObject->object[i]) { if (!strncmp(XMLObject->object[i]->objTag,p,l)) { j++; if (j==objNo) k = i; } } if (k<0) { XMLObject = NULL; l = 0; } else { XMLObject = XMLObject->object[k]; if (*p1) p = p1 + 1; else l = 0; } } } while (l>0); } return XMLObject; } PXMLObject XMLObject::GetFirstObject() { if (nObjects>0) return object[0]; return NULL; } PXMLObject XMLObject::GetLastObject() { if (nObjects>0) return object[nObjects-1]; return NULL; } PXMLObject XMLObject::GetObject ( int objectNo ) { if ((0<=objectNo) && (objectNo=nAlloc) { nAlloc += lenInc; obj1 = new PXMLObject[nAlloc]; for (i=0;iSetParent ( this ); nObjects++; } void XMLObject::InsertObject ( PXMLObject XMLObject, int pos, int lenInc ) { PPXMLObject obj1; int i; if (!XMLObject) return; if (pos>=nObjects) { AddObject ( XMLObject,lenInc ); return; } if (nObjects>=nAlloc) { nAlloc += lenInc; obj1 = new PXMLObject[nAlloc]; for (i=0;ipos;i--) object[i] = object[i-1]; object[pos] = XMLObject; XMLObject->SetParent ( this ); nObjects++; } XML_RC XMLObject::WriteObject ( cpstr FName, int pos, int indent ) { io::File f; f.assign ( FName,true ); if (f.rewrite()) { WriteObject ( f,pos,indent ); f.shut(); return XMLRC_Ok; } return XMLRC_CantOpenFile; } void XMLObject::WriteObject ( io::RFile f, int pos, int indent ) { int i,pos1,lm,rm,tl; pstr indstr,p,p1,q; bool sngline; if (objTag) { pos1 = pos + indent; indstr = new char[pos1+1]; for (i=0;i") ); delete[] indstr; return; } f.Write ( pstr(">") ); sngline = false; if (objData) { rm = 72; // right margin lm = IMin ( pos1,36 ); // left margin tl = strlen(objTag); if ((pos+tl+2+(int)strlen(objData)WriteObject ( f,pos+indent,indent ); if (!sngline) f.Write ( indstr ); f.Write ( pstr("") ); delete[] indstr; } } XML_RC XMLObject::ReadObject ( cpstr FName ) { io::File f; char S[500]; int i; XML_RC rc; f.assign ( FName,true ); if (f.reset(true)) { S[0] = char(0); i = 0; rc = ReadObject ( f,S,i,sizeof(S) ); f.shut(); } else rc = XMLRC_NoFile; if (rc!=XMLRC_Ok) FreeMemory(); return rc; } XML_RC XMLObject::ReadObject ( io::RFile f, pstr S, int & pos, int slen ) { PXMLObject xmlObject; pstr S1; int k,k1,k2; XML_RC rc; bool Done; FreeMemory(); rc = XMLRC_Ok; k1 = -1; k2 = -1; while ((!f.FileEnd()) && (k1<0)) { k = strlen(S); while ((pos // constructions pos++; else if (S[pos+1]!='<') k1 = pos; else pos += 2; } else pos++; if (k1>=0) { k2 = -1; while ((pos') { if (S[pos+1]!='>') k2 = pos; else pos += 2; } else pos++; if (k2<0) rc = XMLRC_BrokenTag; } if (k1<0) { f.ReadLine ( S,slen ); pos = 0; } } if (k1<0) return XMLRC_NoTag; if (rc!=XMLRC_Ok) return rc; pos++; if (S[k2-1]=='/') { // S[k2-1] = char(0); CreateCopy ( objTag,&(S[k1+1]) ); return XMLRC_Ok; } S[k2] = char(0); CreateCopy ( objTag,&(S[k1+1]) ); S[k2] = '>'; S1 = new char[slen+1]; Done = false; while ((!f.FileEnd()) && (!Done)) { k = strlen(S); while ((pos=0) S[k2] = char(0); strcpy_des ( S1,&(S[k1]) ); if (S1[0]) { if (objData) CreateConcat ( objData,pstr(" "),S1 ); else CreateConcat ( objData,S1 ); } if (k2>=0) { S[k2] = '<'; if (S[k2+1]!='/') { xmlObject = new XMLObject(); AddObject ( xmlObject ); rc = xmlObject->ReadObject ( f,S,pos,slen ); Done = (rc!=XMLRC_Ok); } else { Done = true; k1 = k2+2; k2 = -1; while ((pos') { if (S[pos+1]!='>') k2 = pos; else pos += 2; } else pos++; if (k2<0) rc = XMLRC_BrokenTag; else { S[k2] = char(0); if (strcmp(objTag,&(S[k1]))) rc = XMLRC_UnclosedTag; else pos++; } } } } if (!Done) { f.ReadLine ( S,slen ); pos = 0; } } delete[] S1; // this keeps pairs instead of replacing them for // on output if ((!objData) && (nObjects<=0)) CreateCopy ( objData,pstr("") ); if (rc!=XMLRC_Ok) FreeMemory(); return rc; } void XMLObject::Copy ( PXMLObject xmlObject ) { int i; FreeMemory(); CreateCopy ( objTag ,xmlObject->objTag ); CreateCopy ( objData,xmlObject->objData ); nObjects = xmlObject->nObjects; nAlloc = nObjects; if (nObjects>0) { object = new PXMLObject[nObjects]; for (i=0;iobject[i]) { object[i] = new XMLObject(); object[i]->Copy ( xmlObject->object[i] ); } else object[i] = NULL; } nAttributes = xmlObject->nAttributes; nAttrAlloc = nAttributes; if (nAttributes>0) { GetVectorMemory ( attr_name ,nAttrAlloc,0 ); GetVectorMemory ( attr_value,nAttrAlloc,0 ); for (i=0;iattr_name [i] ); CreateCopy ( attr_value[i],xmlObject->attr_value[i] ); } } } void XMLObject::write ( io::RFile f ) { int i; f.CreateWrite ( objTag ); f.CreateWrite ( objData ); f.WriteInt ( &nObjects ); for (i=0;i0) { object = new PXMLObject[nObjects]; for (i=0;i0) { GetVectorMemory ( attr_name ,nAttrAlloc,0 ); GetVectorMemory ( attr_value,nAttrAlloc,0 ); for (i=0;iGetDataName(); if (dataName) { if (dataName[0]) xmlObject = new XMLObject ( dataName ); } if (!xmlObject) xmlObject = new XMLObject ( pstr("no_data_name") ); k = xmlObject->AddMMCIFData ( mmCIFData ); if (rc) *rc = k; } return xmlObject; } PXMLObject mmCIF2XML ( cpstr XMLName, mmcif::PFile mmCIFFile, int * rc ) { PXMLObject xmlObject1,xmlObject2; mmcif::PData mmCIFData; int nData,i,k,rc1; xmlObject1 = new XMLObject ( XMLName ); if (rc) *rc = -1; if (mmCIFFile) { nData = mmCIFFile->GetNofData(); k = 0; rc1 = 0; for (i=0;(i=0);i++) { mmCIFData = mmCIFFile->GetCIFData ( i ); if (mmCIFData) { xmlObject2 = mmCIF2XML ( mmCIFData,&rc1 ); if (xmlObject2) { if (rc1>=0) { xmlObject1->AddObject ( xmlObject2 ); k += rc1; } else delete xmlObject2; } } } if (rc1<0) { delete xmlObject1; if (rc) *rc = -2; } else if (rc) *rc = k; } return xmlObject1; } } // namespace xml } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_machine_.h0000644000175000017500000003232613271367640016367 0ustar maartenmaarten// $Id: mmdb_machine.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Machine // ~~~~~~~~~ // **** Functions : mmdb::machine::GetMachineID - returns ID code // ~~~~~~~~~~~ for the machine // mmdb::machine::GetMachineName - returns name of // the machine // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_Machine__ #define __MMDB_Machine__ #include "mmdb_mattype.h" /* // Programs written in plain C, should define __PlainC each time // this header is invoked. #ifdef __PlainC # undef __CPlusPlus #else # define __CPlusPlus #endif */ namespace mmdb { namespace machine { // ================== List of known machines ================= enum MACHINE { MACHINE_SGI = 1, MACHINE_RS6000 = 2, MACHINE_ALLIANT = 3, MACHINE_ARDENT = 4, MACHINE_TITAN = 5, MACHINE_STARDENT = 6, MACHINE_CONVEX = 7, MACHINE_ESV = 8, MACHINE_HP9000 = 9, MACHINE_SOLBOURNE = 10, MACHINE_SOLARIS = 11, MACHINE_ALPHA = 12, MACHINE_VMS = 13, MACHINE_MVS = 14, MACHINE_F2C_G77 = 15, MACHINE_LINUX = 16, MACHINE_UNKNOWN = 100 }; // ============= Identification of the machine =============== // IBM Unix RS/6000 #if defined(_AIX) || defined(___AIX) # define CALL_LIKE_HPUX 1 // Alliant #elif defined(alliant) # define CALL_LIKE_SUN 1 // Ardent, Stardent/Titan #elif defined(ardent) # define CALL_LIKE_STARDENT 1 #elif defined(titan) # define CALL_LIKE_STARDENT 2 #elif defined(stardent) # define CALL_LIKE_STARDENT 3 // Convex #elif defined(__convex__) || defined(__convexc__) # define CALL_LIKE_SUN 2 // Evans and Sutherland #elif defined(ESV) # define CALL_LIKE_SUN 3 // Hewlett Packard 9000/750 (RISC) models #elif defined(__hpux) # define CALL_LIKE_HPUX 2 // Silicon Graphics IRIX systems, Iris'es, Indigo's, Crimson's etc. #elif defined(__sgi) || defined(sgi) # define CALL_LIKE_SUN 4 // Solbourne's are Sun clones. #elif defined(solbourne) # define CALL_LIKE_SUN 5 // Solaris 1 and 2 #elif defined(sun) || defined(__sun) # define CALL_LIKE_SUN 6 // DEC, OSF/1, Alpha and Ultrix #elif defined(ultrix) || defined(__OSF1__) || defined(__osf__) # define CALL_LIKE_SUN 7 // VMS #elif defined(vms) || defined(__vms) || defined(__VMS) # define CALL_LIKE_VMS 1 // MVS stands for Microsoft Visual Studio #elif defined(_MVS) # define CALL_LIKE_MVS 1 #elif defined(F2C) || defined(G77) # define CALL_LIKE_SUN 8 #elif defined(linux) # define CALL_LIKE_SUN 9 #else //# error System type is not known -- see the Installation Guide # define CALL_LIKE_SUN 100 #endif // ================= Machine-dependent definitions ================== #ifdef CALL_LIKE_STARDENT // StrPar is used in Ardent-like machines' fortran calls // for passing a string parameter DefineStructure(StrPar) struct StrPar { pstr S; int len; int id; }; #endif // // Macro FORTRAN_SUBR(NAME,name,p_send,p_struct,p_sflw) // makes function header statements that allow for linking with // programs written in FORTRAN. // // Parameters: // // NAME name of the FORTRAN subroutine in capital letters // name name of the FORTRAN subroutine in small letters // p_send parameter list (in brackets) with string lengths // attached to the end of it (see below) // p_struct parameter list (in brackets) with strings passed // as complex parameters, or structures // p_sflw parameter list (in brackets) with string lengths // following immediately the string parameters // (see below) // // All non-string parameters must be passed as pointers, in // the same order as they enter the FORTRAN call. Rules for // the string parameters are as follows. // // 1. All strings should be specified as of 'fpstr' type. // The 'fpstr' type is defined below and depends on the // platform: // // a) whenever length of string is passed as a separate // parameter ( CALL_LIKE_SUN, CALL_LIKE_HPUX, // CALL_LIKE_MVS ) 'fpstr' is identical to 'pstr'. // You may choose arbitrary name for the string, // but you MUST use the same name, appended with // suffix '_len', for its length (see example below). // // b) whenever string and its length are passed as // complex parameter, 'fpstr' is identical to the // pointer on the corresponding structure: // CALL_LIKE_STARDENT : // 'fpstr' is identical to 'PStrPar' // CALL_LIKE_VMS : // 'fpstr' is identical to 'dsc$descriptor_s *' // // With 'fpstr' type, two important macro definition come: // // i) FTN_STR(s) - returns pointer to fortran-passed // string s. This pointer is always // of 'pstr' type // ii) FTN_LEN(s) - returns integer length of fortran- // passed string s. For this macro to // work properly with SUN- and MVS-like // machines, always use suffix '_len' // for the string length parameters as // described in a) above. // // 2. Three parameter lists, each enclosed in brackets, should // be given. These lists retain the general order of // parameters in the corresponding fortran call. Non-string // parameters are passed as pointers. String parameters // and their lengths are passed differently in different // lists: // // p_send strings enter their place in the list as in // the corresponding FORTRAN call, having 'fpstr' // parameter type. Their lengths are appended as // 'int' to the end of the list. They should // retain the order in which the strings appear // in the list. // // p_struct strings enter their place in the list as in // the corresponding FORTRAN call, having 'fpstr' // parameter type. // // p_sflw strings enter their place in the list as in // the corresponding FORTRAN call, having 'fpstr' // type and being immediately followed by their // lengths as 'int' parameters. // // // // Example: // // FORTRAN statement // // subroutine SomeSub ( k,s1,a,s2,m ) // integer k,m // real a // character*(*) s1,s2 // // is translated to // // FORTRAN_SUBR ( SOMESUB, somesub, // ( int * k, fpstr s1, float * a, fpstr s2, int * m, // int s1_len, int s2_len ), // ( int * k, fpstr s1, float * a, fpstr s2, int * m ), // ( int * k, fpstr s1, int s1_len, float * a, // fpstr s2, int s2_len, int * m ) ) // // // The macro should replace ordinary function header // statements to assure compatibility with FORTRAN links. // In header files, do not forget to add semicolumn: // // FORTRAN_SUBR ( .... ); // // while in source files use simply // // FORTRAN_SUBR ( .... ) { // // } // // // // Macro FORTRAN_CALL(NAME,name,p_send,p_struct,p_sflw) // calls function defined with macro FORTRAN_SUBR(...), from // a C/C++ application. Its parameters and their meaning are // exactly identical to those of FORTRAN_SUBR(...). // FORTRAN_CALL(...) should be followed by semicolon. // // **** type of real numbers in the API functions // comment or uncomment the proper string typedef float apireal; // FORTRAN real*4 /* typedef double apireal; // FORTRAN real*8 */ #if defined(CALL_LIKE_SUN) typedef pstr fpstr; # define FTN_STR(s) s # define FTN_LEN(s) s##_len # define char_struct(s) \ mmdb::pstr s; \ int s##_len; # define fill_char_struct(s,str) \ s = str; \ s##_len = strlen(str); # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name##_ p_sun # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void name##_ p_sun # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name##_ p_sun # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ name##_ p_sun # elif defined(CALL_LIKE_HPUX) typedef pstr fpstr; # define FTN_STR(s) s # define FTN_LEN(s) s##_len # define char_struct(s) \ pstr s; \ int s##_len; # define fill_char_struct(s,str) \ s = str; \ s##_len = strlen(str); # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name p_sun # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void name p_sun # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name p_sun # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ name p_sun #elif defined(CALL_LIKE_STARDENT) typedef PStrPar fpstr; # define FTN_STR(s) s->S # define FTN_LEN(s) s->len # define char_struct(s) \ StrPar s; # define fill_char_struct(s,str) \ s.S = str; \ s.len = strlen(FName); \ s.id = 0; # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_send,p_struct,p_sflw) \ extern "C" void NAME p_stardent # else # define FORTRAN_SUBR(NAME,name,p_send,p_struct,p_sflw) \ void NAME p_stardent # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void NAME p_stardent # define FORTRAN_CALL(NAME,name,p_send,p_struct,p_sflw) \ NAME p_stardent #elif defined(CALL_LIKE_VMS) typedef dsc$descriptor_s * fpstr; # define FTN_STR(s) s->dsc$a_pointer; # define FTN_LEN(s) s->dsc$w_length; # define character(s) \ dsc$descriptor_s s; # define fill_char_struct(s,str) \ s.dsc$a_pointer = str; \ s.dsc$w_length = strlen(str); \ s.dsc$b_dtype = DSC$K_DTYPE_T; \ s.dsc$b_class = DSC$K_CLASS_S; # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void NAME p_stardent # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void NAME p_stardent # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void NAME p_stardent # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ NAME p_stardent #elif defined(CALL_LIKE_MVS) typedef pstr fpstr; # define FTN_STR(s) s # define FTN_LEN(s) s##_len # define char_struct(s) \ pstr s; \ int s##_len; # define fill_char_struct(s,str) \ s = str; \ s##_len = strlen(str); # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void __stdcall NAME p_mvs # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void __stdcall NAME p_mvs # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void NAME p_mvs # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ NAME p_mvs #else # error Unknown machine!!! typedef pstr fpstr; # define FTN_STR(s) s # define FTN_LEN(s) s##_len # define char_struct(s) \ pstr s; \ int s##_len; # define fill_char_struct(s,str) \ s = str; \ s##_len = strlen(str); # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name##_ p_sun # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void name##_ p_sun # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name##_ p_sun # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ name##_ p_sun #endif // ============== Machine-dependent functions =============== extern int GetMachineID (); extern mmdb::cpstr GetMachineName (); extern mmdb::cpstr GetMachineName ( int MachineID ); } } #endif mmdb2-2.0.20/mmdb2/mmdb_atom.cpp0000644000175000017500000030750113271367640016117 0ustar maartenmaarten// $Id: mmdb_atom.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2015. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 09.03.16 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Atom // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Atom ( atom class ) // ~~~~~~~~~ mmdb::Residue ( residue class ) // **** Functions: mmdb::BondAngle // ~~~~~~~~~~ // // Copyright (C) E. Krissinel 2000-2016 // // ================================================================= // #include #include #include #include "mmdb_chain.h" #include "mmdb_model.h" #include "mmdb_root.h" #include "mmdb_tables.h" #include "mmdb_cifdefs.h" #include "hybrid_36.h" namespace mmdb { // ================================================================ #define ASET_CompactBinary 0x10000000 #define ASET_ShortTer 0x20000000 #define ASET_ShortHet 0x40000000 bool ignoreSegID = false; bool ignoreElement = false; bool ignoreCharge = false; bool ignoreNonCoorPDBErrors = false; bool ignoreUnmatch = false; // ========================== Atom ============================= Atom::Atom() : UDData() { InitAtom(); } Atom::Atom ( PResidue res ) : UDData() { InitAtom(); if (res) res->AddAtom ( this ); } Atom::Atom ( io::RPStream Object ) : UDData(Object) { InitAtom(); } Atom::~Atom() { PPAtom A; int nA; FreeMemory(); if (residue) { A = NULL; nA = 0; if (residue->chain) { if (residue->chain->model) { A = residue->chain->model->GetAllAtoms(); nA = residue->chain->model->GetNumberOfAllAtoms(); } } residue->_ExcludeAtom ( index ); if ((0index; else atomBondI[i].index = -1; atomBondI[i].order = Bond[i].order; } } } void Atom::GetBonds ( PAtomBondI AtomBondI, int & nAtomBonds, int maxlength ) { // This GetBonds(..) does not dispose or allocate AtomBond. // It is assumed that length of AtomBond is sufficient to // accomodate all bonded atoms. int i; nAtomBonds = IMin(maxlength,nBonds & 0x000000FF); for (i=0;iindex; else AtomBondI[i].index = -1; AtomBondI[i].order = Bond[i].order; } } int Atom::AddBond ( PAtom bond_atom, int bond_order, int nAdd_bonds ) { PAtomBond B1; int i,k,nb,nballoc; nb = nBonds & 0x000000FF; k = -1; for (i=0;(i=0) return -k; nballoc = (nBonds >> 8) & 0x000000FF; if (nBonds>=nballoc) { nballoc += nAdd_bonds; B1 = new AtomBond[nballoc]; for (i=0;i99999) { hy36encode ( 5,serNum,N ); strcpy_n ( &(S[6]),N,5 ); } else if (serNum>0) PutInteger ( &(S[6]),serNum,5 ); else if (index<=99999) PutInteger ( &(S[6]),index,5 ); else { hy36encode ( 5,index,N ); strcpy_n ( &(S[6]),N,5 ); } if (!Ter) { if (altLoc[0]) S[16] = altLoc[0]; strcpy_n ( &(S[12]),name ,4 ); strcpy_n ( &(S[72]),segID ,4 ); strcpy_nr ( &(S[76]),element,2 ); if (WhatIsSet & ASET_Charge) { if (charge>0) sprintf ( N,"%1i+",mround(charge) ); else if (charge<0) sprintf ( N,"%1i-",mround(-charge) ); else strcpy ( N," " ); strcpy_n ( &(S[78]),N,2 ); } else strcpy_n ( &(S[78])," ",2 ); } strcpy_nr ( &(S[17]),residue->name,3 ); strcpy_nr ( &(S[20]),residue->chain->chainID,2 ); if (residue->seqNum>MinInt4) { if ((-999<=residue->seqNum) && (residue->seqNum<=9999)) PutIntIns ( &(S[22]),residue->seqNum,4,residue->insCode ); else { hy36encode ( 4,residue->seqNum,N ); strcpy_n ( &(S[22]),N,4 ); } } } void Atom::PDBASCIIDump ( io::RFile f ) { // makes the ASCII PDB ATOM, HETATM, SIGATOM, ANISOU // SIGUIJ and TER lines from the class' data char S[100]; if (Ter) { if (WhatIsSet & ASET_Coordinates) { StandardPDBOut ( pstr("TER"),S ); f.WriteLine ( S ); } } else { if (WhatIsSet & ASET_Coordinates) { if (Het) StandardPDBOut ( pstr("HETATM"),S ); else StandardPDBOut ( pstr("ATOM") ,S ); PutRealF ( &(S[30]),x,8,3 ); PutRealF ( &(S[38]),y,8,3 ); PutRealF ( &(S[46]),z,8,3 ); if (WhatIsSet & ASET_Occupancy) PutRealF ( &(S[54]),occupancy ,6,2 ); if (WhatIsSet & ASET_tempFactor) PutRealF ( &(S[60]),tempFactor,6,2 ); f.WriteLine ( S ); } if (WhatIsSet & ASET_CoordSigma) { StandardPDBOut ( pstr("SIGATM"),S ); PutRealF ( &(S[30]),sigX,8,3 ); PutRealF ( &(S[38]),sigY,8,3 ); PutRealF ( &(S[46]),sigZ,8,3 ); if ((WhatIsSet & ASET_OccSigma) && (WhatIsSet & ASET_Occupancy)) PutRealF ( &(S[54]),sigOcc,6,2 ); if ((WhatIsSet & ASET_tFacSigma) && (WhatIsSet & ASET_tempFactor)) PutRealF ( &(S[60]),sigTemp,6,2 ); f.WriteLine ( S ); } if (WhatIsSet & ASET_Anis_tFac) { StandardPDBOut ( pstr("ANISOU"),S ); PutInteger ( &(S[28]),mround(u11*1.0e4),7 ); PutInteger ( &(S[35]),mround(u22*1.0e4),7 ); PutInteger ( &(S[42]),mround(u33*1.0e4),7 ); PutInteger ( &(S[49]),mround(u12*1.0e4),7 ); PutInteger ( &(S[56]),mround(u13*1.0e4),7 ); PutInteger ( &(S[63]),mround(u23*1.0e4),7 ); f.WriteLine ( S ); if (WhatIsSet & ASET_Anis_tFSigma) { StandardPDBOut ( pstr("SIGUIJ"),S ); PutInteger ( &(S[28]),mround(su11*1.0e4),7 ); PutInteger ( &(S[35]),mround(su22*1.0e4),7 ); PutInteger ( &(S[42]),mround(su33*1.0e4),7 ); PutInteger ( &(S[49]),mround(su12*1.0e4),7 ); PutInteger ( &(S[56]),mround(su13*1.0e4),7 ); PutInteger ( &(S[63]),mround(su23*1.0e4),7 ); f.WriteLine ( S ); } } } } void Atom::MakeCIF ( mmcif::PData CIF ) { mmcif::PLoop Loop; AtomName AtName; Element el; char N[10]; int i,j,RC; PChain chain = NULL; PModel model = NULL; //bool singleModel = true; if (residue) chain = residue->chain; if (chain) model = PModel(chain->model); // if (model) { // if (model->manager) // singleModel = PRoot(model->manager)->nModels<=1; // } /* loop_ *0 _atom_site.group_PDB *1 _atom_site.id *2 _atom_site.type_symbol <- chem elem -3 _atom_site.label_atom_id <- atom name *4 _atom_site.label_alt_id <- alt code =5 _atom_site.label_comp_id <- res name ??? =6 _atom_site.label_asym_id <- chain id ??? =7 _atom_site.label_entity_id < ??? =8 _atom_site.label_seq_id <- poly seq id +9 _atom_site.pdbx_PDB_ins_code <- ins code -10 _atom_site.segment_id <- segment id *11 _atom_site.Cartn_x *12 _atom_site.Cartn_y *13 _atom_site.Cartn_z *14 _atom_site.occupancy *15 _atom_site.B_iso_or_equiv *16 _atom_site.Cartn_x_esd *17 _atom_site.Cartn_y_esd *18 _atom_site.Cartn_z_esd *19 _atom_site.occupancy_esd *20 _atom_site.B_iso_or_equiv_esd *21 _atom_site.pdbx_formal_charge +22 _atom_site.auth_seq_id <- seq id we want +23 _atom_site.auth_comp_id <- res name we want +24 _atom_site.auth_asym_id <- ch id we want ? *25 _atom_site.auth_atom_id <- atom name we want ? +26 _atom_site.pdbx_PDB_model_num <- model no '+' is read in Root::CheckAtomPlace() '=' new in residue '-' new in atom */ RC = CIF->AddLoop ( CIFCAT_ATOM_SITE,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_GROUP_PDB ); // ATOM, TER etc. Loop->AddLoopTag ( CIFTAG_ID ); // serial number Loop->AddLoopTag ( CIFTAG_TYPE_SYMBOL ); // element symbol Loop->AddLoopTag ( CIFTAG_LABEL_ATOM_ID ); // atom name Loop->AddLoopTag ( CIFTAG_LABEL_ALT_ID ); // alt location Loop->AddLoopTag ( CIFTAG_LABEL_COMP_ID ); // residue name Loop->AddLoopTag ( CIFTAG_LABEL_ASYM_ID ); // chain ID Loop->AddLoopTag ( CIFTAG_LABEL_ENTITY_ID ); // entity ID Loop->AddLoopTag ( CIFTAG_LABEL_SEQ_ID ); // res seq number Loop->AddLoopTag ( CIFTAG_PDBX_PDB_INS_CODE ); // insertion code Loop->AddLoopTag ( CIFTAG_SEGMENT_ID ); // segment ID Loop->AddLoopTag ( CIFTAG_CARTN_X ); // x-coordinate Loop->AddLoopTag ( CIFTAG_CARTN_Y ); // y-coordinate Loop->AddLoopTag ( CIFTAG_CARTN_Z ); // z-coordinate Loop->AddLoopTag ( CIFTAG_OCCUPANCY ); // occupancy Loop->AddLoopTag ( CIFTAG_B_ISO_OR_EQUIV ); // temp factor Loop->AddLoopTag ( CIFTAG_CARTN_X_ESD ); // x-sigma Loop->AddLoopTag ( CIFTAG_CARTN_Y_ESD ); // y-sigma Loop->AddLoopTag ( CIFTAG_CARTN_Z_ESD ); // z-sigma Loop->AddLoopTag ( CIFTAG_OCCUPANCY_ESD ); // occupancy-sigma Loop->AddLoopTag ( CIFTAG_B_ISO_OR_EQUIV_ESD ); // t-factor-sigma Loop->AddLoopTag ( CIFTAG_PDBX_FORMAL_CHARGE ); // charge on atom Loop->AddLoopTag ( CIFTAG_AUTH_SEQ_ID ); // res seq number Loop->AddLoopTag ( CIFTAG_AUTH_COMP_ID ); // residue name Loop->AddLoopTag ( CIFTAG_AUTH_ASYM_ID ); // chain id Loop->AddLoopTag ( CIFTAG_AUTH_ATOM_ID ); // atom name Loop->AddLoopTag ( CIFTAG_PDBX_PDB_MODEL_NUM ); // model number } /* if (Ter) { // ter record if (!(WhatIsSet & ASET_Coordinates)) return; // (0) Loop->AddString ( pstr("TER") ); // (1) if (serNum>0) Loop->AddInteger ( serNum ); else Loop->AddInteger ( index ); // (2,3,4) Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // no element symbol Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // no atom name Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // no alt code if (residue) { // (5) Loop->AddString ( residue->label_comp_id ); // (6) Loop->AddString ( residue->label_asym_id ); // (7) if (residue->label_entity_id>0) Loop->AddInteger ( residue->label_entity_id ); else Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); // (8) if (residue->label_seq_id>MinInt4) Loop->AddInteger ( residue->label_seq_id ); else Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); // (9) Loop->AddString ( residue->insCode,true ); } else { // (5,6,7,8,9) Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); } // (10-21) for (i=10;i<=21;i++) Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // (22,23) if (residue) { if (residue->seqNum>MinInt4) Loop->AddInteger ( residue->seqNum ); else Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); Loop->AddString ( residue->name ); } else { Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); Loop->AddString ( NULL ); } // (24) if (chain) Loop->AddString ( chain->chainID,true ); else Loop->AddString ( NULL ); // (25) Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // no atom name } else */ if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma)) { // normal atom record if (!WhatIsSet) return; // (0) if (Het) Loop->AddString ( pstr("HETATM") ); else Loop->AddString ( pstr("ATOM") ); // (1) if (serNum>0) Loop->AddInteger ( serNum ); else Loop->AddInteger ( index ); if (WhatIsSet & ASET_Coordinates) { // (2) strcpy_css ( el,element ); Loop->AddString ( el,true ); // (3) strcpy_css ( AtName,label_atom_id ); Loop->AddString ( AtName ); // assigned atom name // (4) Loop->AddString ( altLoc,true ); // alt code if (residue) { // (5) Loop->AddString ( residue->label_comp_id ); // (6) Loop->AddString ( residue->label_asym_id ); // (7) if (residue->label_entity_id>0) Loop->AddInteger ( residue->label_entity_id ); else Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); // (8) if (residue->label_seq_id>MinInt4) Loop->AddInteger ( residue->label_seq_id ); else Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); // (9) Loop->AddString ( residue->insCode,true ); } else { // (5,6,7,8,9) Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); } // (10) Loop->AddString ( segID ,true ); // (11,12,13) Loop->AddReal ( x ); Loop->AddReal ( y ); Loop->AddReal ( z ); // (14) if (WhatIsSet & ASET_Occupancy) Loop->AddReal ( occupancy ); else Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // (15) if (WhatIsSet & ASET_tempFactor) Loop->AddReal ( tempFactor ); else Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // (16,17,18) if (WhatIsSet & ASET_CoordSigma) { Loop->AddReal ( sigX ); Loop->AddReal ( sigY ); Loop->AddReal ( sigZ ); } else { Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); } // (19) if ((WhatIsSet & ASET_OccSigma) && (WhatIsSet & ASET_Occupancy)) Loop->AddReal ( sigOcc ); else Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // (20) if ((WhatIsSet & ASET_tFacSigma) && (WhatIsSet & ASET_tempFactor)) Loop->AddReal ( sigTemp ); else Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); } else for (i=0;i<18;i++) Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); // (21) if (WhatIsSet & ASET_Charge) { sprintf ( N,"%+2i",mround(charge) ); Loop->AddString ( N,true ); } else Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); if (residue) { // (22) if (residue->seqNum>MinInt4) Loop->AddInteger ( residue->seqNum ); else Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); // (23) Loop->AddString ( residue->name ); } else { Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); } // (24) if (chain) Loop->AddString ( chain->chainID,true ); else Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); // (25) strcpy_css ( AtName,name ); Loop->AddString ( AtName ); // atom name } // (26) if (!model) Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); else if (model->serNum>0) Loop->AddInteger ( model->serNum ); else Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); if (WhatIsSet & ASET_Anis_tFac) { RC = CIF->AddLoop ( CIFCAT_ATOM_SITE_ANISOTROP,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); // serial number Loop->AddLoopTag ( CIFTAG_U11 ); // component u11 Loop->AddLoopTag ( CIFTAG_U22 ); // component u22 Loop->AddLoopTag ( CIFTAG_U33 ); // component u33 Loop->AddLoopTag ( CIFTAG_U12 ); // component u12 Loop->AddLoopTag ( CIFTAG_U13 ); // component u13 Loop->AddLoopTag ( CIFTAG_U23 ); // component u23 Loop->AddLoopTag ( CIFTAG_U11_ESD ); // component u11 sigma Loop->AddLoopTag ( CIFTAG_U22_ESD ); // component u22 sigma Loop->AddLoopTag ( CIFTAG_U33_ESD ); // component u33 sigma Loop->AddLoopTag ( CIFTAG_U12_ESD ); // component u12 sigma Loop->AddLoopTag ( CIFTAG_U13_ESD ); // component u13 sigma Loop->AddLoopTag ( CIFTAG_U23_ESD ); // component u23 sigma for (i=1;iAddInteger ( i ); for (j=0;j<12;j++) Loop->AddString ( NULL ); } } if (serNum>0) Loop->AddInteger ( serNum ); else Loop->AddInteger ( index ); Loop->AddReal ( u11 ); Loop->AddReal ( u22 ); Loop->AddReal ( u33 ); Loop->AddReal ( u12 ); Loop->AddReal ( u13 ); Loop->AddReal ( u23 ); if (WhatIsSet & ASET_Anis_tFSigma) { Loop->AddReal ( su11 ); Loop->AddReal ( su22 ); Loop->AddReal ( su33 ); Loop->AddReal ( su12 ); Loop->AddReal ( su13 ); Loop->AddReal ( su23 ); } } } ERROR_CODE Atom::ConvertPDBATOM ( int ix, cpstr S ) { // Gets data from the PDB ASCII ATOM record. // This function DOES NOT check the "ATOM" keyword and // does not decode the chain and residue parameters! These // must be treated by calling process, see // Chain::ConvertPDBASCII(). index = ix; if (WhatIsSet & ASET_Coordinates) return Error_ATOM_AlreadySet; if (!(GetReal(x,&(S[30]),8) && GetReal(y,&(S[38]),8) && GetReal(z,&(S[46]),8))) return Error_ATOM_Unrecognized; WhatIsSet |= ASET_Coordinates; Het = false; Ter = false; if (GetReal(occupancy ,&(S[54]),6)) WhatIsSet |= ASET_Occupancy; if (GetReal(tempFactor,&(S[60]),6)) WhatIsSet |= ASET_tempFactor; if (WhatIsSet & (ASET_CoordSigma | ASET_Anis_tFac | ASET_Anis_tFSigma)) // something was already submitted. check complience return CheckData ( S ); else // first data submission. just take the data GetData ( S ); return Error_NoError; } void Atom::SetAtomName ( int ix, int sN, const AtomName aName, const AltLoc aLoc, const SegID sID, const Element eName ) { index = ix; serNum = sN; strcpy ( name ,aName ); strcpy ( label_atom_id,aName ); strcpy_css ( altLoc ,pstr(aLoc) ); strcpy_css ( segID ,pstr(sID) ); if (!eName[0]) element[0] = char(0); else if (!eName[1]) { element[0] = ' '; strcpy ( &(element[1]),eName ); } else strcpy ( element,eName ); WhatIsSet = 0; } ERROR_CODE Atom::ConvertPDBSIGATM ( int ix, cpstr S ) { // Gets data from the PDB ASCII SIGATM record. // This function DOES NOT check the "SIGATM" keyword and // does not decode the chain and residue parameters! These // must be treated by the calling process, see // Chain::ConvertPDBASCII(). index = ix; if (WhatIsSet & ASET_CoordSigma) return Error_ATOM_AlreadySet; if (!(GetReal(sigX,&(S[30]),8) && GetReal(sigY,&(S[38]),8) && GetReal(sigZ,&(S[46]),8))) return Error_ATOM_Unrecognized; WhatIsSet |= ASET_CoordSigma; if (GetReal(sigOcc ,&(S[54]),6)) WhatIsSet |= ASET_OccSigma; if (GetReal(sigTemp,&(S[60]),6)) WhatIsSet |= ASET_tFacSigma; if (WhatIsSet & (ASET_Coordinates | ASET_Anis_tFac | ASET_Anis_tFSigma)) // something was already submitted. check complience return CheckData ( S ); else // first data submission. just take the data GetData ( S ); return Error_NoError; } ERROR_CODE Atom::ConvertPDBANISOU ( int ix, cpstr S ) { // Gets data from the PDB ASCII ANISOU record. // This function DOES NOT check the "ANISOU" keyword and // does not decode chain and residue parameters! These must // be treated by the calling process, see // Chain::ConvertPDBASCII(). index = ix; if (WhatIsSet & ASET_Anis_tFac) return Error_ATOM_AlreadySet; if (!(GetReal(u11,&(S[28]),7) && GetReal(u22,&(S[35]),7) && GetReal(u33,&(S[42]),7) && GetReal(u12,&(S[49]),7) && GetReal(u13,&(S[56]),7) && GetReal(u23,&(S[63]),7))) return Error_ATOM_Unrecognized; u11 /= 1.0e4; u22 /= 1.0e4; u33 /= 1.0e4; u12 /= 1.0e4; u13 /= 1.0e4; u23 /= 1.0e4; WhatIsSet |= ASET_Anis_tFac; if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma | ASET_Anis_tFSigma)) // something was already submitted. check complience return CheckData ( S ); else // first data submission. just take the data GetData ( S ); return Error_NoError; } ERROR_CODE Atom::ConvertPDBSIGUIJ ( int ix, cpstr S ) { // Gets data from the PDB ASCII SIGUIJ record. // This function DOES NOT check the "SIGUIJ" keyword and // does not decode the chain and residue parameters! These // must be treated by the calling process, see // Chain::ConvertPDBASCII(). index = ix; if (WhatIsSet & ASET_Anis_tFSigma) return Error_ATOM_AlreadySet; if (!(GetReal(su11,&(S[28]),7) && GetReal(su22,&(S[35]),7) && GetReal(su33,&(S[42]),7) && GetReal(su12,&(S[49]),7) && GetReal(su13,&(S[56]),7) && GetReal(su23,&(S[63]),7))) return Error_ATOM_Unrecognized; su11 /= 1.0e4; su22 /= 1.0e4; su33 /= 1.0e4; su12 /= 1.0e4; su13 /= 1.0e4; su23 /= 1.0e4; WhatIsSet |= ASET_Anis_tFSigma; if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma | ASET_Anis_tFac)) // something was already submitted. check complience return CheckData ( S ); else // first data submission. just take the data GetData ( S ); return Error_NoError; } ERROR_CODE Atom::ConvertPDBTER ( int ix, cpstr S ) { // Gets data from the PDB ASCII TER record. // This function DOES NOT check the "TER" keyword and // does not decode the chain and residue parameters! These // must be treated by the calling process, see // Chain::ConvertPDBASCII(). index = ix; if (((S[6]>='0') && (S[6]<='9')) || (S[6]==' ')) { // Although against strict PDB format, 'TER' is // actually allowed not to have a serial number. // This negative value implies that the number is // not set. if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; } else hy36decode ( 5,&(S[6]),5,&serNum ); // if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; if (WhatIsSet & ASET_Coordinates) return Error_ATOM_AlreadySet; WhatIsSet |= ASET_Coordinates; Het = false; Ter = true; name[0] = char(0); label_atom_id[0] = char(0); element[0] = char(0); return Error_NoError; } int Atom::GetModelNum() { if (residue) { if (residue->chain) if (residue->chain->model) return residue->chain->model->GetSerNum(); } return 0; } pstr Atom::GetChainID() { if (residue) { if (residue->chain) return residue->chain->chainID; } return pstr(""); } pstr Atom::GetLabelAsymID() { if (residue) return residue->label_asym_id; else return pstr(""); } pstr Atom::GetResName() { if (residue) return residue->name; else return pstr(""); } pstr Atom::GetLabelCompID() { if (residue) return residue->label_comp_id; else return pstr(""); } int Atom::GetAASimilarity ( const ResName resName ) { if (residue) return mmdb::GetAASimilarity ( pstr(residue->name), pstr(resName) ); else return -3; } int Atom::GetAASimilarity ( PAtom A ) { if (residue) { if (A->residue) return mmdb::GetAASimilarity ( pstr(residue->name), pstr(A->residue->name) ); else return -4; } else return -3; } realtype Atom::GetAAHydropathy() { if (residue) return mmdb::GetAAHydropathy ( pstr(residue->name) ); else return MaxReal; } realtype Atom::GetOccupancy() { if (WhatIsSet & ASET_Occupancy) return occupancy; else return 0.0; } int Atom::GetSeqNum() { if (residue) return residue->seqNum; else return ATOM_NoSeqNum; } int Atom::GetLabelSeqID() { if (residue) return residue->label_seq_id; else return ATOM_NoSeqNum; } int Atom::GetLabelEntityID() { if (residue) return residue->label_entity_id; else return -1; } pstr Atom::GetInsCode() { if (residue) return residue->insCode; else return pstr(""); } int Atom::GetSSEType() { // works only after SSE calculations if (residue) return residue->SSE; else return SSE_None; } pstr Atom::GetAtomCharge ( pstr chrg ) { if (WhatIsSet & ASET_Charge) sprintf ( chrg,"%+2i",mround(charge) ); else strcpy ( chrg," " ); return chrg; } PResidue Atom::GetResidue() { return residue; } PChain Atom::GetChain() { if (residue) return residue->chain; else return NULL; } PModel Atom::GetModel() { if (residue) { if (residue->chain) return (PModel)residue->chain->model; } return NULL; } int Atom::GetResidueNo() { if (residue) { if (residue->chain) return residue->chain->GetResidueNo ( residue->seqNum,residue->insCode ); else return -2; } else return -1; } void * Atom::GetCoordHierarchy() { if (residue) return residue->GetCoordHierarchy(); return NULL; } void Atom::GetStat ( realtype v, realtype & v_min, realtype & v_max, realtype & v_m, realtype & v_m2 ) { if (vv_max) v_max = v; v_m += v; v_m2 += v*v; } void Atom::GetChainCalphas ( PPAtom & Calphas, int & nCalphas, cpstr altLoc ) { // GetChainCalphas(...) is a specialized function for quick // access to C-alphas of chain which includes given atom. // This function works faster than an equivalent implementation // through MMDB's selection procedures. // Parameters: // Calphas - array to accept pointers on C-alpha atoms // If Calphas!=NULL, then the function will // delete and re-allocate it. When the array // is no longer needed, the application MUST // delete it: delete[] Calphas; Deleting // Calphas does not delete atoms from MMDB. // nCalphas - integer to accept number of C-alpha atoms // and the length of Calphas array. // altLoc - alternative location indicator. By default // (""), maximum-occupancy locations are taken. PChain chain; PPResidue res; PPAtom atom; int nResidues, nAtoms, i,j,k; if (Calphas) { delete[] Calphas; Calphas = NULL; } nCalphas = 0; if (residue) chain = residue->chain; else chain = NULL; if (chain) { chain->GetResidueTable ( res,nResidues ); if (nResidues>0) { Calphas = new PAtom[nResidues]; if ((!altLoc[0]) || (altLoc[0]==' ')) { // main conformation for (i=0;inAtoms; atom = res[i]->atom; for (j=0;jname," CA ")) { Calphas[nCalphas++] = atom[j]; break; } } } else { // specific conformation for (i=0;inAtoms; atom = res[i]->atom; k = 0; for (j=0;jname," CA ")) { k = 1; if (!atom[j]->altLoc[0]) { // take main conformation now as we do not know if // the specific one is in the file Calphas[nCalphas] = atom[j]; k = 2; } else if (atom[j]->altLoc[0]==altLoc[0]) { // get specific conformation and quit Calphas[nCalphas] = atom[j]; k = 2; break; } } else if (k) break; if (k==2) nCalphas++; } } } } else if (residue) { // check just this atom's residue Calphas = new PAtom[1]; // can't be more than 1 C-alpha! nAtoms = residue->nAtoms; atom = residue->atom; if ((!altLoc[0]) || (altLoc[0]==' ')) { // main conformation for (j=0;jname," CA ")) { Calphas[nCalphas++] = atom[j]; break; } } else { // specific conformation k = 0; for (j=0;jname," CA ")) { k = 1; if (!atom[j]->altLoc[0]) { Calphas[nCalphas] = atom[j]; k = 2; } else if (atom[j]->altLoc[0]==altLoc[0]) { Calphas[nCalphas] = atom[j]; k = 2; break; } } else if (k) break; if (k==2) nCalphas++; } } if (Calphas && (!nCalphas)) { delete[] Calphas; Calphas = NULL; } } bool Atom::isMetal() { return mmdb::isMetal ( element ); } bool Atom::isSolvent() { if (residue) return residue->isSolvent(); return false; } bool Atom::isInSelection ( int selHnd ) { PRoot manager = (PRoot)GetCoordHierarchy(); PMask mask; if (manager) { mask = manager->GetSelMask ( selHnd ); if (mask) return CheckMask ( mask ); } return false; } bool Atom::isNTerminus() { if (residue) return residue->isNTerminus(); return false; } bool Atom::isCTerminus() { if (residue) return residue->isCTerminus(); return false; } void Atom::CalAtomStatistics ( RAtomStat AS ) { // AS must be initialized. The function only accumulates // the statistics. if (!Ter) { AS.nAtoms++; if (AS.WhatIsSet & WhatIsSet & ASET_Coordinates) { GetStat ( x,AS.xmin,AS.xmax,AS.xm,AS.xm2 ); GetStat ( y,AS.ymin,AS.ymax,AS.ym,AS.ym2 ); GetStat ( z,AS.zmin,AS.zmax,AS.zm,AS.zm2 ); } else AS.WhatIsSet &= ~ASET_Coordinates; if (AS.WhatIsSet & WhatIsSet & ASET_Occupancy) GetStat(occupancy,AS.occ_min,AS.occ_max,AS.occ_m,AS.occ_m2); else AS.WhatIsSet &= ~ASET_Occupancy; if (AS.WhatIsSet & WhatIsSet & ASET_tempFactor) GetStat ( tempFactor,AS.tFmin,AS.tFmax,AS.tFm,AS.tFm2 ); else AS.WhatIsSet &= ~ASET_tempFactor; if (AS.WhatIsSet & WhatIsSet & ASET_Anis_tFac) { GetStat ( u11,AS.u11_min,AS.u11_max,AS.u11_m,AS.u11_m2 ); GetStat ( u22,AS.u22_min,AS.u22_max,AS.u22_m,AS.u22_m2 ); GetStat ( u33,AS.u33_min,AS.u33_max,AS.u33_m,AS.u33_m2 ); GetStat ( u12,AS.u12_min,AS.u12_max,AS.u12_m,AS.u12_m2 ); GetStat ( u13,AS.u13_min,AS.u13_max,AS.u13_m,AS.u13_m2 ); GetStat ( u23,AS.u23_min,AS.u23_max,AS.u23_m,AS.u23_m2 ); } else AS.WhatIsSet &= ~ASET_Anis_tFac; } } realtype Atom::GetDist2 ( PAtom a ) { realtype dx,dy,dz; dx = a->x - x; dy = a->y - y; dz = a->z - z; return dx*dx + dy*dy + dz*dz; } realtype Atom::GetDist2 ( PAtom a, mat44 & tm ) { realtype dx,dy,dz; dx = tm[0][0]*a->x + tm[0][1]*a->y + tm[0][2]*a->z + tm[0][3] - x; dy = tm[1][0]*a->x + tm[1][1]*a->y + tm[1][2]*a->z + tm[1][3] - y; dz = tm[2][0]*a->x + tm[2][1]*a->y + tm[2][2]*a->z + tm[2][3] - z; return dx*dx + dy*dy + dz*dz; } realtype Atom::GetDist2 ( PAtom a, mat33 & r, vect3 & t ) { realtype dx,dy,dz; dx = r[0][0]*a->x + r[0][1]*a->y + r[0][2]*a->z + t[0] - x; dy = r[1][0]*a->x + r[1][1]*a->y + r[1][2]*a->z + t[1] - y; dz = r[2][0]*a->x + r[2][1]*a->y + r[2][2]*a->z + t[2] - z; return dx*dx + dy*dy + dz*dz; } realtype Atom::GetDist2 ( realtype ax, realtype ay, realtype az ) { realtype dx,dy,dz; dx = ax - x; dy = ay - y; dz = az - z; return dx*dx + dy*dy + dz*dz; } realtype Atom::GetDist2 ( mat44 & tm, // applies to 'this' realtype ax, realtype ay, realtype az ) { realtype dx,dy,dz; dx = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3] - ax; dy = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3] - ay; dz = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3] - az; return dx*dx + dy*dy + dz*dz; } realtype Atom::GetDist2 ( vect3 & xyz ) { realtype dx,dy,dz; dx = xyz[0] - x; dy = xyz[1] - y; dz = xyz[2] - z; return dx*dx + dy*dy + dz*dz; } realtype Atom::GetCosine ( PAtom a1, PAtom a2 ) { // Calculates cosing of angle a1-this-a2, i.e. that between // bond [a1,this] and [this,a2]. realtype dx1,dy1,dz1, dx2,dy2,dz2,r; dx1 = a1->x - x; dy1 = a1->y - y; dz1 = a1->z - z; r = dx1*dx1 + dy1*dy1 + dz1*dz1; dx2 = a2->x - x; dy2 = a2->y - y; dz2 = a2->z - z; r *= dx2*dx2 + dy2*dy2 + dz2*dz2; if (r>0.0) return (dx1*dx2 + dy1*dy2 + dz1*dz2)/sqrt(r); else return 0.0; } void Atom::MakeTer() { WhatIsSet |= ASET_Coordinates; Het = false; Ter = true; } void Atom::SetAtomName ( const AtomName atomName ) { strcpy ( name,atomName ); } void Atom::SetElementName ( const Element elName ) { strcpy ( element,elName ); if (!element[0]) strcpy ( element," " ); else if ((!element[1]) || (element[1]==' ')) { element[2] = char(0); element[1] = element[0]; element[0] = ' '; } } void Atom::SetCharge ( cpstr chrg ) { pstr p; charge = strtod ( chrg,&p ); if (p!=chrg) { WhatIsSet |= ASET_Charge; if ((charge>0.0) && (*p=='-')) charge = -charge; } } void Atom::SetCharge ( realtype chrg ) { if (chrgchain) { if (residue->chain->model) sprintf (AtomID,"/%i/",residue->chain->model->GetSerNum()); else strcpy ( AtomID,"/-/" ); strcat ( AtomID,residue->chain->chainID ); } else strcpy ( AtomID,"/-/-" ); ParamStr ( AtomID,pstr("/"),residue->seqNum ); if (residue->name[0]) { strcat ( AtomID,"(" ); strcat ( AtomID,residue->name ); strcat ( AtomID,")" ); } if (residue->insCode[0]) { strcat ( AtomID,"." ); strcat ( AtomID,residue->insCode ); } strcat ( AtomID,"/" ); } else strcpy ( AtomID,"/-/-/-/" ); strcpy_css ( S,name ); if (!S[0]) strcpy ( S,"-" ); strcat ( AtomID,S ); strcpy_css ( S,element ); if (S[0]) { strcat ( AtomID,"[" ); strcat ( AtomID,S ); strcat ( AtomID,"]" ); } if (altLoc[0]) { strcat ( AtomID,":" ); strcat ( AtomID,altLoc ); } return AtomID; } pstr Atom::GetAtomIDfmt ( pstr AtomID ) { int n; char S[50]; AtomID[0] = char(0); if (residue) { if (residue->chain) { if (residue->chain->model) { n = residue->chain->model->GetNumberOfModels(); if (n<10) strcpy ( S,"/%1i/" ); else if (n<100) strcpy ( S,"/%2i/" ); else if (n<1000) strcpy ( S,"/%3i/" ); else strcpy ( S,"/%i/" ); sprintf ( AtomID,S,residue->chain->model->GetSerNum() ); } else strcpy ( AtomID,"/-/" ); strcat ( AtomID,residue->chain->chainID ); } else strcpy ( AtomID,"/-/-" ); if ((-999<=residue->seqNum) && (residue->seqNum<=9999)) sprintf ( S,"/%4i",residue->seqNum ); else sprintf ( S,"/%i" ,residue->seqNum ); strcat ( AtomID,S ); sprintf ( S,"(%3s).%1s/",residue->name,residue->insCode ); strcat ( AtomID,S ); } else strcpy ( AtomID,"/-/-/----(---).-/" ); sprintf ( S,"%4s[%2s]:%1s",name,element,altLoc ); strcat ( AtomID,S ); return AtomID; } ERROR_CODE Atom::ConvertPDBHETATM ( int ix, cpstr S ) { // Gets data from the PDB ASCII HETATM record. // This function DOES NOT check the "HETATM" keyword and // does not decode the chain and residue parameters! These // must be treated by the calling process, see // Chain::ConvertPDBASCII(). ERROR_CODE RC; RC = ConvertPDBATOM ( ix,S ); Het = true; return RC; } void Atom::GetData ( cpstr S ) { pstr p; if (((S[6]>='0') && (S[6]<='9')) || (S[6]==' ')) { // Here we forgive cards with unreadable serial numbers // as we always have index (ix) for the card. For the sake // of strict PDB syntax we would have to return // Error_UnrecognizedInteger here. if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; } else hy36decode ( 5,&(S[6]),5,&serNum ); // if (!(GetInteger(serNum,&(S[6]),5))) serNum = index; altLoc[0] = S[16]; if (altLoc[0]==' ') altLoc[0] = char(0); else altLoc[1] = char(0); GetString ( name ,&(S[12]),4 ); strcpy_ncss ( segID ,&(S[72]),4 ); GetString ( element,&(S[76]),2 ); charge = strtod ( &(S[78]),&p ); if ((charge!=0.0) && (p!=&(S[78]))) { WhatIsSet |= ASET_Charge; if ((charge>0.0) && (*p=='-')) charge = -charge; } RestoreElementName(); strcpy ( label_atom_id,name ); } ERROR_CODE Atom::CheckData ( cpstr S ) { int sN; AltLoc aloc; SegID sID; Element elmnt; pstr p; realtype achrg; aloc[0] = S[16]; if (aloc[0]==' ') aloc[0] = char(0); else aloc[1] = char(0); strcpy_ncss ( sID ,&(S[72]),4 ); GetString ( elmnt,&(S[76]),2 ); if (ignoreCharge) achrg = charge; else { achrg = strtod ( &(S[78]),&p ); if ((achrg!=0.0) && (p!=&(S[78]))) { if ((achrg>0.0) && (*p=='-')) achrg = -achrg; } } // if (!(GetInteger(sN,&(S[6]),5))) // sN = index; if (hy36decode(5,&(S[6]),5,&sN)) sN = index; if (ignoreSegID) { if (segID[0]) strcpy ( sID,segID ); else strcpy ( segID,sID ); } if (ignoreElement) { if (element[0]) strcpy ( elmnt,element ); else strcpy ( element,elmnt ); } if (ignoreUnmatch) return Error_NoError; // Here we forgive cards with unreadable serial numbers // as we always have index (ix) for the card. For the sake // of strict PDB syntax we would have to return // Error_UnrecognizedInteger . if ((sN!=serNum) || (strcmp (altLoc ,aloc )) || (strncmp(name ,&(S[12]),4)) || (strcmp (segID ,sID )) || (strcmp (element,elmnt )) || (charge!=achrg)) { /* char name1[100]; strncpy ( name1,&(S[12]),4 ); name1[4] = char(0); printf ( "\n serNum %5i %5i\n" " residue '%s' '%s'\n" " altLoc '%s' '%s'\n" " name '%s' '%s'\n" " segId '%s' '%s'\n" " element '%s' '%s'\n" " charge '%s' '%s'\n", sN,serNum, res->name,residue->name, altLoc ,aloc, name,name1, segID ,sID, element,elmnt, charge ,achrg ); if (res!=residue) printf (" it's a residue\n" ); */ return Error_ATOM_Unmatch; } return Error_NoError; } ERROR_CODE Atom::GetCIF ( int ix, mmcif::PLoop Loop, mmcif::PLoop LoopAnis ) { char PDBGroup[30]; int k; ERROR_CODE RC; index = ix; if (WhatIsSet & ASET_Coordinates) return Error_ATOM_AlreadySet; /* loop_ *0 _atom_site.group_PDB *1 _atom_site.id *2 _atom_site.type_symbol <- chem elem -3 _atom_site.label_atom_id <- atom name *4 _atom_site.label_alt_id <- alt code =5 _atom_site.label_comp_id <- res name ??? =6 _atom_site.label_asym_id <- chain id ??? =7 _atom_site.label_entity_id < ??? =8 _atom_site.label_seq_id <- poly seq id +9 _atom_site.pdbx_PDB_ins_code <- ins code -10 _atom_site.segment_id <- segment id *11 _atom_site.Cartn_x *12 _atom_site.Cartn_y *13 _atom_site.Cartn_z *14 _atom_site.occupancy *15 _atom_site.B_iso_or_equiv *16 _atom_site.Cartn_x_esd *17 _atom_site.Cartn_y_esd *18 _atom_site.Cartn_z_esd *19 _atom_site.occupancy_esd *20 _atom_site.B_iso_or_equiv_esd *21 _atom_site.pdbx_formal_charge +22 _atom_site.auth_seq_id <- seq id we want +23 _atom_site.auth_comp_id <- res name we want +24 _atom_site.auth_asym_id <- ch id we want ? *25 _atom_site.auth_atom_id <- atom name we want ? +26 _atom_site.pdbx_PDB_model_num <- model no '+' read in Root::CheckAtomPlace() '=' new in residue, read in Root::CheckAtomPlace() '-' new in atom */ // (0) k = ix-1; CIFGetString ( PDBGroup,Loop,CIFTAG_GROUP_PDB,k, sizeof(PDBGroup),pstr("") ); Ter = !strcmp(PDBGroup,pstr("TER") ); Het = !strcmp(PDBGroup,pstr("HETATM")); // (1) RC = CIFGetInteger1 ( serNum,Loop,CIFTAG_ID,k ); if (RC) { if (Ter) serNum = -1; else if (RC==Error_NoData) serNum = index; else return RC; } if (Ter) { Loop->DeleteRow ( k ); WhatIsSet |= ASET_Coordinates; return Error_NoError; } // (25) CIFGetString ( name,Loop,CIFTAG_AUTH_ATOM_ID,k, sizeof(name) ,pstr("") ); // (3) CIFGetString ( label_atom_id,Loop,CIFTAG_LABEL_ATOM_ID,k, sizeof(label_atom_id),pstr("") ); if (!name[0]) strcpy ( name,label_atom_id ); // (4) CIFGetString ( altLoc,Loop,CIFTAG_LABEL_ALT_ID ,k, sizeof(altLoc),pstr("") ); // (11,12,13) RC = CIFGetReal1 ( x,Loop,CIFTAG_CARTN_X,k ); if (!RC) RC = CIFGetReal1 ( y,Loop,CIFTAG_CARTN_Y,k ); if (!RC) RC = CIFGetReal1 ( z,Loop,CIFTAG_CARTN_Z,k ); if (RC) return Error_ATOM_Unrecognized; WhatIsSet |= ASET_Coordinates; // (14) if (!CIFGetReal1(occupancy,Loop,CIFTAG_OCCUPANCY,k)) WhatIsSet |= ASET_Occupancy; // (15) if (!CIFGetReal1(tempFactor,Loop,CIFTAG_B_ISO_OR_EQUIV,k)) WhatIsSet |= ASET_tempFactor; // (10) CIFGetString ( segID,Loop,CIFTAG_SEGMENT_ID,k, sizeof(segID) ,pstr("") ); // (21) if (!CIFGetReal1(charge,Loop,CIFTAG_PDBX_FORMAL_CHARGE,k)) WhatIsSet |= ASET_Charge; // (2) RC = CIFGetString ( element,Loop,CIFTAG_TYPE_SYMBOL,k, sizeof(element),pstr("") ); if (RC) CIFGetString ( element,Loop,CIFTAG_ATOM_TYPE_SYMBOL,k, sizeof(element),pstr("") ); RestoreElementName(); MakePDBAtomName(); // (16,17,18) RC = CIFGetReal1 ( sigX,Loop,CIFTAG_CARTN_X_ESD,k ); if (!RC) RC = CIFGetReal1 ( sigY,Loop,CIFTAG_CARTN_Y_ESD,k ); if (!RC) RC = CIFGetReal1 ( sigZ,Loop,CIFTAG_CARTN_Z_ESD,k ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= ASET_CoordSigma; // (19) if (!CIFGetReal1(sigOcc,Loop,CIFTAG_OCCUPANCY_ESD,k)) WhatIsSet |= ASET_OccSigma; // (20) if (!CIFGetReal1(sigTemp,Loop,CIFTAG_B_ISO_OR_EQUIV_ESD,k)) WhatIsSet |= ASET_tFacSigma; Loop->DeleteRow ( k ); if (LoopAnis) { RC = CIFGetReal1 ( u11,LoopAnis,CIFTAG_U11,k ); if (!RC) RC = CIFGetReal1 ( u22,LoopAnis,CIFTAG_U22,k ); if (!RC) RC = CIFGetReal1 ( u33,LoopAnis,CIFTAG_U33,k ); if (!RC) RC = CIFGetReal1 ( u13,LoopAnis,CIFTAG_U13,k ); if (!RC) RC = CIFGetReal1 ( u12,LoopAnis,CIFTAG_U12,k ); if (!RC) RC = CIFGetReal1 ( u23,LoopAnis,CIFTAG_U23,k ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= ASET_Anis_tFac; RC = CIFGetReal1 ( su11,LoopAnis,CIFTAG_U11_ESD,k ); if (!RC) RC = CIFGetReal1 ( su22,LoopAnis,CIFTAG_U22_ESD,k ); if (!RC) RC = CIFGetReal1 ( su33,LoopAnis,CIFTAG_U33_ESD,k ); if (!RC) RC = CIFGetReal1 ( su13,LoopAnis,CIFTAG_U13_ESD,k ); if (!RC) RC = CIFGetReal1 ( su12,LoopAnis,CIFTAG_U12_ESD,k ); if (!RC) RC = CIFGetReal1 ( su23,LoopAnis,CIFTAG_U23_ESD,k ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= ASET_Anis_tFSigma; LoopAnis->DeleteRow ( k ); } return Error_NoError; } bool Atom::RestoreElementName() { // This function works only if element name is not given. if (Ter) { name[0] = char(0); element[0] = char(0); return false; } if ((!element[0]) || ((element[0]==' ') && ((!element[1]) || (element[1]==' ')))) { if (strlen(name)==4) { if ((name[0]>='A') && (name[0]<='Z')) { element[0] = name[0]; element[1] = name[1]; } else { element[0] = ' '; element[1] = name[1]; } } else { // nasty hack for mmcif files without element column element[0] = ' '; element[1] = name[0]; } element[2] = char(0); return false; } else if (!element[1]) { // not aligned element name, possibly coming from mmCIF element[1] = element[0]; element[0] = ' '; element[2] = char(0); return false; } return true; } bool Atom::MakePDBAtomName() { int i,k; if (Ter) { name [0] = char(0); element[0] = char(0); return false; } UpperCase ( name ); UpperCase ( element ); if (strlen(name)>=4) return true; // nothing to do if ((element[0]==' ') && (element[1]==' ')) { // element name not given, make one from the atom name if ((name[0]>='A') && (name[0]<='Z')) { if (!name[1]) { name[4] = char(0); name[3] = ' '; name[2] = ' '; name[1] = name[0]; name[0] = ' '; } /* the commented part looks like a wrong inheritance from FORTRAN RWBrook. Commented on 04.03.2004, to be removed. else if ((name[0]=='C') && (name[1]=='A')) { name[4] = char(0); name[3] = name[2]; name[2] = name[1]; name[1] = name[0]; name[0] = ' '; } */ element[0] = name[0]; element[1] = name[1]; } else { element[0] = ' '; element[1] = name[1]; } element[2] = char(0); return false; } else if ((name[0]>='A') && (name[0]<='Z')) { if (!element[1]) { element[2] = char(0); element[1] = element[0]; element[0] = ' '; k = strlen(name); if (k<4) { for (i=3;i>0;i--) name[i] = name[i-1]; name[0] = ' '; k++; while (k<4) name[k++] = ' '; name[k] = char(0); } } else if ((element[0]==' ') && (element[1]!=name[1])) { for (i=3;i>0;i--) name[i] = name[i-1]; name[0] = ' '; name[4] = char(0); k = strlen(name); while (k<4) name[k++] = ' '; name[k] = char(0); } else { k = strlen(name); while (k<4) name[k++] = ' '; name[k] = char(0); } } return true; } void Atom::SetCoordinates ( realtype xx, realtype yy, realtype zz, realtype occ, realtype tFac ) { x = xx; y = yy; z = zz; occupancy = occ; tempFactor = tFac; WhatIsSet |= ASET_Coordinates | ASET_Occupancy | ASET_tempFactor; } void Atom::Transform ( const mat33 & tm, vect3 & v ) { realtype x1,y1,z1; x1 = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + v[0]; y1 = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + v[1]; z1 = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + v[2]; x = x1; y = y1; z = z1; } void Atom::Transform ( const mat44 & tm ) { realtype x1,y1,z1; x1 = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3]; y1 = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3]; z1 = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3]; x = x1; y = y1; z = z1; } void Atom::TransformCopy ( const mat44 & tm, realtype & xx, realtype & yy, realtype & zz ) { xx = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3]; yy = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3]; zz = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3]; } void Atom::TransformCopy ( const mat44 & tm, vect3 & xyz ) { xyz[0] = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3]; xyz[1] = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3]; xyz[2] = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3]; } void Atom::TransformSet ( const mat44 & tm, realtype xx, realtype yy, realtype zz ) { x = tm[0][0]*xx + tm[0][1]*yy + tm[0][2]*zz + tm[0][3]; y = tm[1][0]*xx + tm[1][1]*yy + tm[1][2]*zz + tm[1][3]; z = tm[2][0]*xx + tm[2][1]*yy + tm[2][2]*zz + tm[2][3]; } // ------- user-defined data handlers int Atom::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_ATOM) return UDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Atom::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_ATOM) return UDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Atom::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_ATOM) return UDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int Atom::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_ATOM) return UDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Atom::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_ATOM) return UDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Atom::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_ATOM) return UDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int Atom::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_ATOM) return UDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } void Atom::Copy ( PAtom atom ) { // this does not make any references in residues and does // not change indices!! it does change serial numbers, though. serNum = atom->serNum; x = atom->x; y = atom->y; z = atom->z; occupancy = atom->occupancy; tempFactor = atom->tempFactor; sigX = atom->sigX; sigY = atom->sigY; sigZ = atom->sigZ; sigOcc = atom->sigOcc; sigTemp = atom->sigTemp; u11 = atom->u11; u22 = atom->u22; u33 = atom->u33; u12 = atom->u12; u13 = atom->u13; u23 = atom->u23; su11 = atom->su11; su22 = atom->su22; su33 = atom->su33; su12 = atom->su12; su13 = atom->su13; su23 = atom->su23; Het = atom->Het; Ter = atom->Ter; WhatIsSet = atom->WhatIsSet; strcpy ( name ,atom->name ); strcpy ( label_atom_id,atom->label_atom_id ); strcpy ( altLoc ,atom->altLoc ); strcpy ( segID ,atom->segID ); strcpy ( element ,atom->element ); strcpy ( energyType ,atom->energyType ); charge = atom->charge; } int Atom::CheckID ( const AtomName aname, const Element elname, const AltLoc aloc ) { pstr p1,p2; if (aname) { if (aname[0]!='*') { p1 = name; while (*p1==' ') p1++; p2 = pstr(aname); while (*p2==' ') p2++; while ((*p2) && (*p1) && (*p1!=' ') && (*p2!=' ')) { if (*p1!=*p2) return 0; p1++; p2++; } if (*p1!=*p2) { if (((*p1) && (*p1!=' ')) || ((*p2) && (*p2!=' '))) return 0; } } } if (elname) { if (elname[0]!='*') { p1 = element; while (*p1==' ') p1++; p2 = pstr(elname); while (*p2==' ') p2++; while ((*p2) && (*p1) && (*p1!=' ') && (*p2!=' ')) { if (*p1!=*p2) return 0; p1++; p2++; } if (*p1!=*p2) return 0; } } if (aloc) { if ((aloc[0]!='*') && (strcmp(aloc,altLoc))) return 0; } return 1; } int Atom::CheckIDS ( cpstr ID ) { AtomName aname; Element elname; AltLoc aloc; pstr p; p = LastOccurence ( ID,'/' ); if (p) p++; else p = pstr(ID); ParseAtomID ( p,aname,elname,aloc ); return CheckID ( aname,elname,aloc ); } void Atom::SetCompactBinary() { WhatIsSet |= ASET_CompactBinary; } void Atom::write ( io::RFile f ) { int i,k; byte Version=2; byte nb; f.WriteWord ( &WhatIsSet ); if (WhatIsSet & ASET_CompactBinary) { if (Ter) WhatIsSet |= ASET_ShortTer; if (Het) WhatIsSet |= ASET_ShortHet; f.WriteInt ( &index ); f.WriteTerLine ( name ,false ); f.WriteTerLine ( altLoc ,false ); f.WriteTerLine ( element,false ); if (WhatIsSet & ASET_Coordinates) { /* char S[100]; sprintf ( S,"%8.3f%8.3f%8.3f",x,y,z ); f.WriteFile ( S,24 ); */ /* f.WriteReal ( &x ); f.WriteReal ( &y ); f.WriteReal ( &z ); */ // Make integer conversion in order to eliminate round-offs // from PDB format %8.3f for coordinates and save space // comparing to real*8 numbers. Writing floats causes // precision loss k = mround(x*10000.0); f.WriteInt ( &k ); k = mround(y*10000.0); f.WriteInt ( &k ); k = mround(z*10000.0); f.WriteInt ( &k ); /* f.WriteFloat ( &x ); f.WriteFloat ( &y ); f.WriteFloat ( &z ); */ } return; } f.WriteByte ( &Version ); UDData::write ( f ); f.WriteInt ( &serNum ); f.WriteInt ( &index ); f.WriteTerLine ( name ,false ); f.WriteTerLine ( label_atom_id,false ); f.WriteTerLine ( altLoc ,false ); f.WriteTerLine ( segID ,false ); f.WriteTerLine ( element ,false ); f.WriteTerLine ( energyType ,false ); f.WriteFloat ( &charge ); f.WriteBool ( &Het ); f.WriteBool ( &Ter ); if (WhatIsSet & ASET_Coordinates) { f.WriteFloat ( &x ); f.WriteFloat ( &y ); f.WriteFloat ( &z ); if (WhatIsSet & ASET_Occupancy) f.WriteFloat ( &occupancy ); if (WhatIsSet & ASET_tempFactor) f.WriteFloat ( &tempFactor ); } if (WhatIsSet & ASET_CoordSigma) { f.WriteFloat ( &sigX ); f.WriteFloat ( &sigY ); f.WriteFloat ( &sigZ ); if ((WhatIsSet & ASET_Occupancy) && (WhatIsSet & ASET_OccSigma)) f.WriteFloat ( &sigOcc ); if ((WhatIsSet & ASET_tempFactor) && (WhatIsSet & ASET_tFacSigma)) f.WriteFloat ( &sigTemp ); } if (WhatIsSet & ASET_Anis_tFac) { f.WriteFloat ( &u11 ); f.WriteFloat ( &u22 ); f.WriteFloat ( &u33 ); f.WriteFloat ( &u12 ); f.WriteFloat ( &u13 ); f.WriteFloat ( &u23 ); if (WhatIsSet & ASET_Anis_tFSigma) { f.WriteFloat ( &su11 ); f.WriteFloat ( &su22 ); f.WriteFloat ( &su33 ); f.WriteFloat ( &su12 ); f.WriteFloat ( &su13 ); f.WriteFloat ( &su23 ); } } nb = byte(nBonds & 0x000000FF); f.WriteByte ( &nb ); for (i=0;iindex) ); f.WriteByte ( &(Bond[i].order) ); } else { k = -1; f.WriteInt ( &k ); } } void Atom::read ( io::RFile f ) { int i,k; byte nb,Version; FreeMemory(); f.ReadWord ( &WhatIsSet ); if (WhatIsSet & ASET_CompactBinary) { f.ReadInt ( &index ); f.ReadTerLine ( name ,false ); f.ReadTerLine ( altLoc ,false ); f.ReadTerLine ( element,false ); if (WhatIsSet & ASET_Coordinates) { /* char S[100]; f.ReadFile ( S,24 ); GetReal(x,&(S[0]),8); GetReal(y,&(S[8]),8); GetReal(z,&(S[16]),8); */ /* f.ReadReal ( &x ); f.ReadReal( &y ); f.ReadReal ( &z ); */ // Make integer conversion in order to eliminate round-offs // from PDB format %8.3f for coordinates and save space // comparing to real*8 numbers. Writing floats causes // precision loss f.ReadInt ( &k ); x = realtype(k)/10000.0; f.ReadInt ( &k ); y = realtype(k)/10000.0; f.ReadInt ( &k ); z = realtype(k)/10000.0; /* f.ReadFloat ( &x ); f.ReadFloat ( &y ); f.ReadFloat ( &z ); */ } serNum = index; Ter = WhatIsSet & ASET_ShortTer; Het = WhatIsSet & ASET_ShortHet; name [4] = char(0); altLoc [1] = char(0); element[2] = char(0); segID [0] = char(0); charge = 0.0; WhatIsSet &= ASET_All; return; } f.ReadByte ( &Version ); UDData::read ( f ); f.ReadInt ( &serNum ); f.ReadInt ( &index ); f.ReadTerLine ( name ,false ); if (Version>1) f.ReadTerLine ( label_atom_id,false ); f.ReadTerLine ( altLoc ,false ); f.ReadTerLine ( segID ,false ); f.ReadTerLine ( element ,false ); f.ReadTerLine ( energyType,false ); f.ReadFloat ( &charge ); f.ReadBool ( &Het ); f.ReadBool ( &Ter ); if (WhatIsSet & ASET_Coordinates) { f.ReadFloat ( &x ); f.ReadFloat ( &y ); f.ReadFloat ( &z ); if (WhatIsSet & ASET_Occupancy) f.ReadFloat ( &occupancy ); else occupancy = 0.0; if (WhatIsSet & ASET_tempFactor) f.ReadFloat ( &tempFactor ); else tempFactor = 0.0; } else { x = 0.0; y = 0.0; z = 0.0; occupancy = 0.0; tempFactor = 0.0; } if (WhatIsSet & ASET_CoordSigma) { f.ReadFloat ( &sigX ); f.ReadFloat ( &sigY ); f.ReadFloat ( &sigZ ); if ((WhatIsSet & ASET_Occupancy) && (WhatIsSet & ASET_OccSigma)) f.ReadFloat ( &sigOcc ); else sigOcc = 0.0; if ((WhatIsSet & ASET_tempFactor) && (WhatIsSet & ASET_tFacSigma)) f.ReadFloat ( &sigTemp ); else sigTemp = 0.0; } else { sigX = 0.0; sigY = 0.0; sigZ = 0.0; sigOcc = 0.0; sigTemp = 0.0; } if (WhatIsSet & ASET_Anis_tFac) { f.ReadFloat ( &u11 ); f.ReadFloat ( &u22 ); f.ReadFloat ( &u33 ); f.ReadFloat ( &u12 ); f.ReadFloat ( &u13 ); f.ReadFloat ( &u23 ); if (WhatIsSet & ASET_Anis_tFSigma) { f.ReadFloat ( &su11 ); f.ReadFloat ( &su22 ); f.ReadFloat ( &su33 ); f.ReadFloat ( &su12 ); f.ReadFloat ( &su13 ); f.ReadFloat ( &su23 ); } else { su11 = 0.0; su22 = 0.0; su33 = 0.0; su12 = 0.0; su13 = 0.0; su23 = 0.0; } } else { u11 = 0.0; u22 = 0.0; u33 = 0.0; u12 = 0.0; u13 = 0.0; u23 = 0.0; su11 = 0.0; su22 = 0.0; su33 = 0.0; su12 = 0.0; su13 = 0.0; su23 = 0.0; } f.ReadByte ( &nb ); if (nb>0) { Bond = new AtomBond[nb]; for (i=0;i0) f.ReadByte ( &(Bond[i].order) ); else Bond[i].order = 0; // we place *index* of bonded atom temporary on the place // of its pointer, and the pointer will be calculated // after Residue::read calls _setBonds(..). memcpy ( &(Bond[i].atom),&k,4 ); } } nBonds = nb; nBonds = nBonds | (nBonds << 8); } void Atom::_setBonds ( PPAtom A ) { int i,k,nb; nb = nBonds & 0x000000FF; for (i=0;i0) Bond[i].atom = A[k]; else Bond[i].atom = NULL; } } MakeFactoryFunctions(Atom) // =========================== Residue =========================== void AtomStat::Init() { nAtoms = 0; xmin = MaxReal; xmax = MinReal; xm = 0.0; xm2 = 0.0; ymin = MaxReal; ymax = MinReal; ym = 0.0; ym2 = 0.0; zmin = MaxReal; zmax = MinReal; zm = 0.0; zm2 = 0.0; occ_min = MaxReal; occ_max = MinReal; occ_m = 0.0; occ_m2 = 0.0; tFmin = MaxReal; tFmax = MinReal; tFm = 0.0; tFm2 = 0.0; u11_min = MaxReal; u11_max = MinReal; u11_m = 0.0; u11_m2 = 0.0; u22_min = MaxReal; u22_max = MinReal; u22_m = 0.0; u22_m2 = 0.0; u33_min = MaxReal; u33_max = MinReal; u33_m = 0.0; u33_m2 = 0.0; u12_min = MaxReal; u12_max = MinReal; u12_m = 0.0; u12_m2 = 0.0; u13_min = MaxReal; u13_max = MinReal; u13_m = 0.0; u13_m2 = 0.0; u23_min = MaxReal; u23_max = MinReal; u23_m = 0.0; u23_m2 = 0.0; WhatIsSet = ASET_All; finished = false; } void AtomStat::Finish() { realtype v; if (!finished) { finished = true; if (nAtoms>0) { v = nAtoms; xm /= v; xm2 /= v; ym /= v; ym2 /= v; zm /= v; zm2 /= v; occ_m /= v; occ_m2 /= v; tFm /= v; tFm2 /= v; u11_m /= v; u11_m2 /= v; u22_m /= v; u22_m2 /= v; u33_m /= v; u33_m2 /= v; u12_m /= v; u12_m2 /= v; u13_m /= v; u13_m2 /= v; u23_m /= v; u23_m2 /= v; } } } realtype AtomStat::GetMaxSize() { realtype r; r = RMax(xmax-xmin,ymax-ymin); r = RMax(r,zmax-zmin); return RMax(r,0.0); } // ---------------------------------------------------------------- Residue::Residue() : UDData() { InitResidue(); } Residue::Residue ( PChain Chain_Owner ) : UDData() { InitResidue(); if (Chain_Owner) Chain_Owner->AddResidue ( this ); } Residue::Residue ( PChain Chain_Owner, const ResName resName, int sqNum, const InsCode ins ) : UDData() { InitResidue(); seqNum = sqNum; strcpy_css ( name,pstr(resName) ); strcpy_css ( insCode,pstr(ins) ); if (Chain_Owner) Chain_Owner->AddResidue ( this ); } Residue::Residue ( io::RPStream Object ) : UDData(Object) { InitResidue(); } Residue::~Residue() { FreeMemory(); if (chain) chain->_ExcludeResidue ( name,seqNum,insCode ); } void Residue::InitResidue() { strcpy ( name ,"---" ); // residue name strcpy ( label_comp_id,"---" ); // assigned residue name label_asym_id[0] = char(0); // assigned chain Id seqNum = -MaxInt; // residue sequence number label_seq_id = -MaxInt; // assigned residue sequence number label_entity_id = 1; // assigned entity id strcpy ( insCode,"" ); // residue insertion code chain = NULL; // reference to chain index = -1; // undefined index in chain nAtoms = 0; // number of atoms in the residue AtmLen = 0; // length of atom array atom = NULL; // array of atoms Exclude = true; SSE = SSE_None; } void Residue::SetChain ( PChain Chain_Owner ) { chain = Chain_Owner; } int Residue::GetResidueNo() { if (chain) return chain->GetResidueNo ( seqNum,insCode ); else return -1; } void Residue::SetChainID ( const ChainID chID ) { if (chain) chain->SetChainID ( chID ); } int Residue::GetCenter ( realtype & x, realtype & y, realtype & z ) { int i,k; x = 0.0; y = 0.0; z = 0.0; k = 0; for (i=0;iTer) { x += atom[i]->x; y += atom[i]->y; z += atom[i]->z; k++; } } if (k>0) { x /= k; y /= k; z /= k; return 0; } return 1; } void * Residue::GetCoordHierarchy() { if (chain) return chain->GetCoordHierarchy(); return NULL; } void Residue::GetAltLocations ( int & nAltLocs, PAltLoc & aLoc, rvector & occupancy, int & alflag ) { int i,j,k, nal,nal1; realtype occ1; bool B; PAltLoc aL; rvector occ; bvector alv; aLoc = NULL; occupancy = NULL; nAltLocs = 0; alflag = ALF_NoAltCodes; if (nAtoms>0) { // temporary array for altcodes aL = new AltLoc[nAtoms]; // temporary array for occupancies GetVectorMemory ( occ,nAtoms,0 ); // temporary array for checking altcodes GetVectorMemory ( alv,nAtoms,0 ); for (i=0;iTer) { // Find if the alternation code of ith atom is // a new one. B = false; for (j=0;(jaltLoc,aL[j]); if (!B) { // that's a new altcode, get its occupancy if (atom[i]->WhatIsSet & ASET_Occupancy) occ[k] = atom[i]->occupancy; else occ[k] = -1.0; // store new altcode in temporary array strcpy ( aL[k],atom[i]->altLoc ); // check consistency of the altcode data if: // a) the data was not found wrong so far // b) this atom name has not been checked before // c) altcode is not the "empty"-altcode if ((!(alflag & ALF_Mess)) && (!alv[i]) && (atom[i]->altLoc[0])) { B = false; // will be set true if "empty"-altcode // is found for current atom name nal1 = 0; // counts the number of different altcodes // for current atom name occ1 = 0.0; // will count the sum of occupancies for // current atom name for (j=0;jTer) && (!strcmp(atom[j]->name,atom[i]->name))) { if (atom[j]->WhatIsSet & ASET_Occupancy) occ1 += atom[j]->occupancy; if (!atom[j]->altLoc[0]) B = true; alv[j] = true; // mark it as "checked" nal1++; } } if (!(alflag & (ALF_EmptyAltLoc | ALF_NoEmptyAltLoc))) { if (B) alflag |= ALF_EmptyAltLoc; else alflag |= ALF_NoEmptyAltLoc; } else if (((alflag & ALF_EmptyAltLoc) && (!B)) || ((alflag & ALF_NoEmptyAltLoc) && (B))) alflag |= ALF_Mess; if ((occ[k]>=0) && (fabs(1.0-occ1)>0.01)) alflag |= ALF_Occupancy; if (nal==0) // first time just remember the number nal = nal1; // of different altcodes else if (nal!=nal1) // check if number of different altcodes alflag |= ALF_Mess; // is not the same through the residue } k++; } } } if (k>0) { aLoc = new AltLoc[k]; GetVectorMemory ( occupancy,k,0 ); for (i=0;iTer) { B = false; for (j=0;(jTer) B = !strcmp(atom[i]->altLoc,atom[j]->altLoc); } if (!B) k++; } } return k; } void Residue::SetResID ( const ResName resName, int sqNum, const InsCode ins ) { strcpy_css ( name,pstr(resName) ); seqNum = sqNum; strcpy_css ( insCode,pstr(ins) ); strcpy (label_comp_id,name ); } void Residue::FreeMemory() { // NOTE: individual atoms are disposed here as well! DeleteAllAtoms(); if (atom) delete[] atom; atom = NULL; nAtoms = 0; AtmLen = 0; } void Residue::ExpandAtomArray ( int nAdd ) { int i; PPAtom atom1; AtmLen += abs(nAdd); atom1 = new PAtom[AtmLen]; for (i=0;i=AtmLen) ExpandAtomArray ( nAtoms+10-AtmLen ); atom[nAtoms] = atm; atom[nAtoms]->residue = this; nAtoms++; return 0; } int Residue::AddAtom ( PAtom atm ) { // AddAtom(..) adds atom to the residue. If residue is associated // with a coordinate hierarchy, and atom 'atm' is not, the latter // is checked in automatically. If atom 'atm' belongs to any // coordinate hierarchy (even though that of the residue), it is // *copied* rather than simply taken over, and is checked in. // If residue is not associated with a coordinate hierarchy, all // added atoms will be checked in automatically once the residue // is checked in. PRoot manager; PResidue res; int i; for (i=0;i=AtmLen) ExpandAtomArray ( nAtoms+10-AtmLen ); if (atm->GetCoordHierarchy()) { atom[nAtoms] = newAtom(); atom[nAtoms]->Copy ( atm ); } else { res = atm->GetResidue(); if (res) for (i=0;inAtoms;i++) if (res->atom[i]==atm) { res->atom[i] = NULL; break; } atom[nAtoms] = atm; } atom[nAtoms]->residue = this; manager = PRoot(GetCoordHierarchy()); if (manager) manager->CheckInAtom ( 0,atom[nAtoms] ); nAtoms++; return nAtoms; } int Residue::InsertAtom ( PAtom atm, int position ) { // InsertAtom(..) inserts atom into the specified position of // the residue. If residue is associated with a coordinate hierarchy, // and atom 'atm' is not, the latter is checked in automatically. // If atom 'atm' belongs to any coordinate hierarchy (even though // that of the residue), it is *copied* rather than simply taken // over, and is checked in. // If residue is not associated with a coordinate hierarchy, all // added atoms will be checked in automatically once the residue // is checked in. PRoot manager; PResidue res; int i,pos; for (i=0;i=AtmLen) ExpandAtomArray ( nAtoms+10-AtmLen ); pos = IMin(position,nAtoms); for (i=nAtoms;i>pos;i--) atom[i] = atom[i-1]; if (atm->GetCoordHierarchy()) { atom[pos] = newAtom(); atom[pos]->Copy ( atm ); } else { res = atm->GetResidue(); if (res) for (i=0;inAtoms;i++) if (res->atom[i]==atm) { res->atom[i] = NULL; break; } atom[pos] = atm; } atom[pos]->residue = this; manager = PRoot(GetCoordHierarchy()); if (manager) manager->CheckInAtom ( 0,atom[pos] ); nAtoms++; return nAtoms; } int Residue::InsertAtom ( PAtom atm, const AtomName aname ) { // This version inserts before the atom with given name. If such // name is not found, the atom is appended to the end. int i; i = 0; while (iname)) break; else i++; return InsertAtom ( atm,i ); } void Residue::CheckInAtoms() { PRoot manager; int i; manager = PRoot(GetCoordHierarchy()); if (manager) for (i=0;iindex<0) manager->CheckInAtom ( 0,atom[i] ); } } int Residue::_ExcludeAtom ( int kndex ) { // deletes atom from the residue int i,k; if (!Exclude) return 0; k = -1; for (i=0;(iindex==kndex) k = i; } if (k>=0) { for (i=k+1;iPDBASCIIDump ( f ); } void Residue::MakeAtomCIF ( mmcif::PData CIF ) { int i; for (i=0;iMakeCIF ( CIF ); } void Residue::Copy ( PResidue res ) { // // Modify Residue::Copy and both Residues::_copy methods // simultaneously! // // This function will nake a copy of residue res in 'this' one. // All atoms are copied, none is moved regardless to the association // with coordinate hierarchy. If 'this' residue is associated with // a coordinate hierarchy, all atoms are checked in. PRoot manager; int i; FreeMemory(); seqNum = res->seqNum; label_seq_id = res->label_seq_id; label_entity_id = res->label_entity_id; index = res->index; AtmLen = res->nAtoms; SSE = res->SSE; strcpy ( name ,res->name ); strcpy ( label_comp_id,res->label_comp_id ); strcpy ( label_asym_id,res->label_asym_id ); strcpy ( insCode ,res->insCode ); if (AtmLen>0) { atom = new PAtom[AtmLen]; nAtoms = 0; for (i=0;inAtoms;i++) if (res->atom[i]) { atom[nAtoms] = newAtom(); atom[nAtoms]->Copy ( res->atom[i] ); atom[nAtoms]->SetResidue ( this ); nAtoms++; } for (i=nAtoms;iCheckInAtoms ( 0,atom,nAtoms ); } } void Residue::_copy ( PResidue res ) { // Modify both Residue::_copy and Residue::Copy methods // simultaneously! // // will work properly only if atomic arrays // this->chain->model->GetAtom() and // res->chain->model->GetAtom() are identical // int i; PPAtom A; FreeMemory(); seqNum = res->seqNum; label_seq_id = res->label_seq_id; label_entity_id = res->label_entity_id; index = res->index; nAtoms = res->nAtoms; SSE = res->SSE; strcpy ( name ,res->name ); strcpy ( label_comp_id,res->label_comp_id ); strcpy ( label_asym_id,res->label_asym_id ); strcpy ( insCode ,res->insCode ); AtmLen = nAtoms; A = NULL; if (chain) { if (chain->model) A = chain->model->GetAllAtoms(); } if ((nAtoms>0) && (A)) { atom = new PAtom[nAtoms]; for (i=0;iatom[i]->index-1]; atom[i]->SetResidue ( this ); } } else { nAtoms = 0; AtmLen = 0; } } void Residue::_copy ( PResidue res, PPAtom atm, int & atom_index ) { // modify both Residue::_copy and Residue::Copy methods // simultaneously! // // This function physically copies the atoms, creating new atom // instances and putting them into array 'atm' sequentially from // 'atom_index' position. 'atom_index' is modified (advanced). // int i; FreeMemory(); seqNum = res->seqNum; label_seq_id = res->label_seq_id; label_entity_id = res->label_entity_id; index = res->index; nAtoms = res->nAtoms; SSE = res->SSE; strcpy ( name ,res->name ); strcpy ( label_comp_id,res->label_comp_id ); strcpy ( label_asym_id,res->label_asym_id ); strcpy ( insCode ,res->insCode ); AtmLen = nAtoms; if (AtmLen>0) { atom = new PAtom[AtmLen]; for (i=0;iatom[i]) { if (!atm[atom_index]) atm[atom_index] = newAtom(); atm[atom_index]->Copy ( res->atom[i] ); atm[atom_index]->residue = this; atm[atom_index]->index = atom_index+1; atom[i] = atm[atom_index]; atom_index++; } else atom[i] = NULL; } } void Residue::GetAtomStatistics ( RAtomStat AS ) { AS.Init(); CalAtomStatistics ( AS ); AS.Finish(); } void Residue::CalAtomStatistics ( RAtomStat AS ) { // AS must be initialized. The function only accumulates // the statistics. int i; for (i=0;iCalAtomStatistics ( AS ); } PChain Residue::GetChain() { return chain; } PModel Residue::GetModel() { if (chain) return (PModel)chain->model; else return NULL; } int Residue::GetModelNum() { if (chain) { if (chain->model) return chain->model->GetSerNum(); } return 0; } pstr Residue::GetChainID() { if (chain) return chain->chainID; return pstr(""); } pstr Residue::GetLabelAsymID() { return label_asym_id; } pstr Residue::GetResName() { return name; } pstr Residue::GetLabelCompID() { return label_comp_id; } int Residue::GetAASimilarity ( const ResName resName ) { return mmdb::GetAASimilarity ( pstr(name),pstr(resName) ); } int Residue::GetAASimilarity ( PResidue res ) { return mmdb::GetAASimilarity ( name,res->name ); } realtype Residue::GetAAHydropathy() { return mmdb::GetAAHydropathy ( name ); } void Residue::SetResName ( const ResName resName ) { strcpy ( name,resName ); } int Residue::GetSeqNum() { return seqNum; } int Residue::GetLabelSeqID() { return label_seq_id; } int Residue::GetLabelEntityID() { return label_entity_id; } pstr Residue::GetInsCode() { return insCode; } bool Residue::isAminoacid () { return mmdb::isAminoacid ( name ); } bool Residue::isNucleotide() { return mmdb::isNucleotide ( name ); } int Residue::isDNARNA() { return mmdb::isDNARNA ( name ); } bool Residue::isSugar() { return mmdb::isSugar ( name ); } bool Residue::isSolvent() { return mmdb::isSolvent ( name ); } bool Residue::isModRes() { PChain chn; PModRes modRes; int nModRes,i; chn = GetChain(); if (chn) { nModRes = chn->GetNofModResidues(); for (i=0;iGetModResidue ( i ); if (modRes) { if ((!strcmp(modRes->resName,name)) && (modRes->seqNum==seqNum) && (!strcmp(modRes->insCode,insCode))) return true; } } } return false; } bool Residue::isInSelection ( int selHnd ) { PRoot manager = (PRoot)GetCoordHierarchy(); PMask mask; if (manager) { mask = manager->GetSelMask ( selHnd ); if (mask) return CheckMask ( mask ); } return false; } bool Residue::isNTerminus() { PPResidue Res; int i,j,nRes; if (chain) { chain->GetResidueTable ( Res,nRes ); i = 0; j = -1; while ((i=0) return (Res[j]->index==index); } return false; } bool Residue::isCTerminus() { PPResidue Res; int i,j,nRes; if (chain) { chain->GetResidueTable ( Res,nRes ); i = nRes-1; j = -1; while ((i>=0) && (j<0)) { if (Res[i]) j = i; i--; } if (j>=0) return (Res[j]->index==index); } return false; } pstr Residue::GetResidueID ( pstr ResidueID ) { ResidueID[0] = char(0); if (chain) { if (chain->model) sprintf ( ResidueID,"/%i/",chain->model->GetSerNum() ); else strcpy ( ResidueID,"/-/" ); strcat ( ResidueID,chain->chainID ); } else strcpy ( ResidueID,"/-/-" ); ParamStr ( ResidueID,pstr("/"),seqNum ); strcat ( ResidueID,"(" ); strcat ( ResidueID,name ); strcat ( ResidueID,")" ); if (insCode[0]) { strcat ( ResidueID,"." ); strcat ( ResidueID,insCode ); } return ResidueID; } int Residue::CheckID ( int * snum, const InsCode inscode, const ResName resname ) { if (snum) { if (*snum!=seqNum) return 0; } if (inscode) { if ((inscode[0]!='*') && (strcmp(inscode,insCode))) return 0; } if (!resname) return 1; if ((resname[0]!='*') && (strcmp(resname,name))) return 0; return 1; } int Residue::CheckIDS ( cpstr CID ) { ChainID chn; InsCode inscode; ResName resname; AtomName atm; Element elm; AltLoc aloc; pstr p1,p2; int mdl,sn,rc; rc = ParseAtomPath ( CID,mdl,chn,sn,inscode,resname, atm,elm,aloc,NULL ); // rc = ParseResID ( CID,sn,inscode,resname ); if (rc>=0) { p1 = NULL; p2 = NULL; if (inscode[0]!='*') p1 = inscode; if (resname[0]!='*') p2 = resname; if (!rc) return CheckID ( &sn ,p1,p2 ); else return CheckID ( NULL,p1,p2 ); } return 0; } // -------------------- Extracting atoms ------------------------- int Residue::GetNumberOfAtoms() { return nAtoms; } int Residue::GetNumberOfAtoms ( bool countTers ) { int i,na; na = 0; for (i=0;iTer)) na++; } return na; } PAtom Residue::GetAtom ( const AtomName aname, const Element elname, const AltLoc aloc ) { int i; for (i=0;iCheckID(aname,elname,aloc)) return atom[i]; } return NULL; } PAtom Residue::GetAtom ( int atomNo ) { if ((0<=atomNo) && (atomNo0) { atomTable = new PAtom[nAtoms]; j = 0; for (i=0;iTer) atomTable[j++] = atom[i]; } NumberOfAtoms = j; } else { atomTable = NULL; NumberOfAtoms = 0; } } void Residue::TrimAtomTable() { int i,j; j = 0; for (i=0;imodel) { A = chain->model->GetAllAtoms(); nA = chain->model->GetNumberOfAllAtoms(); } } k = 0; for (i=0;iCheckID(aname,elname,aloc)) { k++; kndex = atom[i]->index; if ((0model) { A = chain->model->GetAllAtoms(); nA = chain->model->GetNumberOfAllAtoms(); } } kndex = atom[atomNo]->index; if ((0model) { A = chain->model->GetAllAtoms(); nA = chain->model->GetNumberOfAllAtoms(); } } k = 0; for (i=0;iindex; if ((0model) { A = chain->model->GetAllAtoms(); nA = chain->model->GetNumberOfAllAtoms(); } } Exclude = false; n = 0; for (i=0;iTer) { occupancy = atom[i]->GetOccupancy(); strcpy ( aname,atom[i]->name ); strcpy ( aLoc ,atom[i]->altLoc ); i1 = -1; i2 = i; k = 0; for (j=i+1;jTer) && (!strcmp(atom[j]->name,aname))) { k++; occ = atom[j]->GetOccupancy(); if (occ>occupancy) { occupancy = occ; i1 = j; } if (aLoc[0]) { strcpy ( aL,atom[j]->altLoc ); if (!aL[0]) { aLoc[0] = char(0); i2 = j; } else if (strcmp(aL,aLoc)<0) { strcpy ( aLoc,aL ); i2 = j; } } } } if (k>0) { if (i1<0) { if (atom[i]->WhatIsSet & ASET_Occupancy) i1 = i; else i1 = i2; } for (j=i;jTer) && (!strcmp(atom[j]->name,aname))) { n++; kndex = atom[j]->index; if ((0Ter) atom[i]->Transform ( TMatrix ); } } // ----------------------------------------------------------------- void Residue::MaskAtoms ( PMask Mask ) { int i; for (i=0;iSetMask ( Mask ); } void Residue::UnmaskAtoms ( PMask Mask ) { int i; for (i=0;iRemoveMask ( Mask ); } // ------- user-defined data handlers int Residue::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_RESIDUE) return UDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Residue::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_RESIDUE) return UDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Residue::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_RESIDUE) return UDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int Residue::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_RESIDUE) return UDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Residue::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_RESIDUE) return UDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Residue::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_RESIDUE) return UDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int Residue::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_RESIDUE) return UDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } #define NOmaxdist2 12.25 bool Residue::isMainchainHBond ( PResidue res ) { // Test if there is main chain Hbond between PCRes1 (donor) and // PCRes2 (acceptor). // As defined Kabsch & Sanders // This probably needs the option of supporting alternative criteria PAtom NAtom,OAtom,Atom; realtype abx,aby,abz; realtype acx,acy,acz; realtype bcx,bcy,bcz; realtype absq,acsq,bcsq; NAtom = GetAtom ( "N" ); OAtom = res->GetAtom ( "O" ); Atom = res->GetAtom ( "C" ); if (NAtom && OAtom && Atom) { abx = OAtom->x - NAtom->x; aby = OAtom->y - NAtom->y; abz = OAtom->z - NAtom->z; absq = abx*abx + aby*aby + abz*abz; if (absq<=NOmaxdist2) { acx = NAtom->x - Atom->x; acy = NAtom->y - Atom->y; acz = NAtom->z - Atom->z; bcx = Atom->x - OAtom->x; bcy = Atom->y - OAtom->y; bcz = Atom->z - OAtom->z; acsq = acx*acx + acy*acy + acz*acz; bcsq = bcx*bcx + bcy*bcy + bcz*bcz; return (acos((bcsq+absq-acsq)/(2.0*sqrt(bcsq*absq)))>=Pi/2.0); } } return false; } void Residue::write ( io::RFile f ) { int i; bool shortBinary = false; byte Version=3; f.WriteByte ( &Version ); if (nAtoms>0) { if (atom[0]->WhatIsSet & ASET_CompactBinary) shortBinary = true; } f.WriteBool ( &shortBinary ); if (!shortBinary) { UDData::write ( f ); f.WriteInt ( &label_seq_id ); f.WriteInt ( &label_entity_id ); f.WriteTerLine ( label_comp_id,false ); f.WriteTerLine ( label_asym_id,false ); } f.WriteInt ( &seqNum ); f.WriteInt ( &index ); f.WriteInt ( &nAtoms ); f.WriteByte ( &SSE ); f.WriteTerLine ( name ,false ); f.WriteTerLine ( insCode,false ); for (i=0;iindex) ); } void Residue::read ( io::RFile f ) { // IMPORTANT: array Atom in Root class should be // read prior calling this function! PPAtom A; int i,k; byte Version; bool shortBinary; FreeMemory(); f.ReadByte ( &Version ); f.ReadBool ( &shortBinary ); if (!shortBinary) { UDData::read ( f ); f.ReadInt ( &label_seq_id ); f.ReadInt ( &label_entity_id ); f.ReadTerLine ( label_comp_id,false ); f.ReadTerLine ( label_asym_id,false ); } f.ReadInt ( &seqNum ); f.ReadInt ( &index ); f.ReadInt ( &nAtoms ); f.ReadByte ( &SSE ); f.ReadTerLine ( name ,false ); f.ReadTerLine ( insCode,false ); AtmLen = nAtoms; A = NULL; if (chain) { if (chain->model) A = chain->model->GetAllAtoms(); } if ((nAtoms>0) && (A)) { atom = new PAtom[nAtoms]; for (i=0;iSetResidue ( this ); atom[i]->_setBonds ( A ); } } else { for (i=0;i1) { f.ReadInt ( &label_seq_id ); f.ReadInt ( &label_entity_id ); } f.ReadInt ( &index ); f.ReadInt ( &nAtoms ); f.ReadByte ( &SSE ); f.ReadTerLine ( name,false ); if (Version>1) { f.ReadTerLine ( label_comp_id,false ); f.ReadTerLine ( label_asym_id,false ); } f.ReadTerLine ( insCode,false ); AtmLen = nAtoms; A = NULL; if (chain) { if (chain->model) A = chain->model->GetAllAtoms(); } if ((nAtoms>0) && (A)) { atom = new PAtom[nAtoms]; for (i=0;iSetResidue ( this ); atom[i]->_setBonds ( A ); } } else { for (i=0;i // ~~~~~~~~~ // **** Functions : mmdb::machine::GetMachineID - returns ID code // ~~~~~~~~~~~ for the machine // mmdb::machine::GetMachineName - returns name of // the machine // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include "mmdb_machine_.h" namespace mmdb { namespace machine { #ifdef CALL_LIKE_SUN int GetMachineID() { int k = CALL_LIKE_SUN; switch (k) { case 1 : return MACHINE_ALLIANT; case 2 : return MACHINE_CONVEX; case 3 : return MACHINE_ESV; case 4 : return MACHINE_SGI; case 5 : return MACHINE_SOLBOURNE; case 6 : return MACHINE_SOLARIS; case 7 : return MACHINE_ALPHA; case 8 : return MACHINE_F2C_G77; case 9 : return MACHINE_LINUX; default : return MACHINE_UNKNOWN; } } #elif defined(CALL_LIKE_HPUX) int GetMachineID() { int k = CALL_LIKE_HPUX; switch (k) { case 1 : return MACHINE_RS6000; case 2 : return MACHINE_HP9000; default : return MACHINE_UNKNOWN; } } #elif defined(CALL_LIKE_STARDENT) int GetMachineID() { int k = CALL_LIKE_STARDENT; switch (k) { case 1 : return MACHINE_ARDENT; case 2 : return MACHINE_TITAN; case 3 : return MACHINE_STARDENT; default : return MACHINE_UNKNOWN; } } #elif defined(CALL_LIKE_VMS) int GetMachineID() { return MACHINE_VMS; } #elif defined(CALL_LIKE_MVS) int GetMachineID() { return MACHINE_MVS; } #else int GetMachineID() { return MACHINE_UNKNOWN; } #endif static cpstr MCH_SGI = cpstr("Silicon Graphics"); static cpstr MCH_RS6000 = cpstr("IBM RS/6000"); static cpstr MCH_ALLIANT = cpstr("Alliant"); static cpstr MCH_ARDENT = cpstr("Ardent"); static cpstr MCH_TITAN = cpstr("Titan"); static cpstr MCH_STARDENT = cpstr("Stardent"); static cpstr MCH_CONVEX = cpstr("Convex"); static cpstr MCH_ESV = cpstr("Evans or Sutherland"); static cpstr MCH_HP9000 = cpstr("Hewlett Packard 9000"); static cpstr MCH_SOLBOURNE = cpstr("Solbourne"); static cpstr MCH_SOLARIS = cpstr("Solaris"); static cpstr MCH_ALPHA = cpstr("DEC Alpha"); static cpstr MCH_VMS = cpstr("A VMS machine"); static cpstr MCH_MVS = cpstr("MS Windows"); static cpstr MCH_F2C_G77 = cpstr("SUN compatible"); static cpstr MCH_LINUX = cpstr("Linux"); cpstr GetMachineName ( int MachineID ) { switch (MachineID) { case MACHINE_SGI : return MCH_SGI; case MACHINE_RS6000 : return MCH_RS6000; case MACHINE_ALLIANT : return MCH_ALLIANT; case MACHINE_ARDENT : return MCH_ARDENT; case MACHINE_TITAN : return MCH_TITAN; case MACHINE_STARDENT : return MCH_STARDENT; case MACHINE_CONVEX : return MCH_CONVEX; case MACHINE_ESV : return MCH_ESV; case MACHINE_HP9000 : return MCH_HP9000; case MACHINE_SOLBOURNE : return MCH_SOLBOURNE; case MACHINE_SOLARIS : return MCH_SOLARIS; case MACHINE_ALPHA : return MCH_ALPHA; case MACHINE_VMS : return MCH_VMS; case MACHINE_MVS : return MCH_MVS; case MACHINE_F2C_G77 : return MCH_F2C_G77; case MACHINE_LINUX : return MCH_LINUX; default : case MACHINE_UNKNOWN : return pstr("Unidentified machine"); } } cpstr GetMachineName() { return GetMachineName ( GetMachineID() ); } } } mmdb2-2.0.20/mmdb2/mmdb_math_fft.cpp0000744000175000017500000002606413271367640016752 0ustar maartenmaarten// $Id: mmdb_math_fft.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2005-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : FFT // ~~~~~~~~~ // **** Functions: mmdb::math::FFT // ~~~~~~~~~ mmdb::math::RealFFT // mmdb::math::TwoFFT // mmdb::math::Convolve // mmdb::math::mConvolve // // (C) E.Krissinel 2005-2013 // // ================================================================= // #include #include "mmdb_math_fft.h" namespace mmdb { namespace math { void FFT ( rvector data, int nn, bool Forward ) { // Replaces data[1:2*nn] by its discrete Fourier transform, // if Forward is true; or replaces data[1:2*nn] by nn times its // inverse discrete Fourier transform if Forward is false. // On call, // data[i], i=1,3,5 ... nn-1 are real parts of function, // data[i], i=2,4,6 ... nn are imaginary parts. // nn MUST be an integer power of 2 (this is not checked for!). // User should allocate data with GetVectorMemory and deallocate // it with FreeVectorMemory to assure correct managing of indices // 1..2*nn (not 0..2*nn-1). // On return, // data[i], i=1,3,5 ... nn-1 are real parts, and // data[i], i=2,4,6 ... nn are imaginary parts of positive part // of spectra, with frequences // 0,1/(nn*D),2/(nn*D) ... (nn/2-1)/(nn*D); // data[nn+1] and data[nn+2] are real and imaginary parts for // the frequances +/-1/(2*D) // data[i], i=nn+3,nn+5,nn+7 ... 2*nn-1 are real parts, and // data[i], i=nn+4,nn+6,nn+8 ... 2*nn are imaginary parts of // negative part of the spectra with frequences // -(nn/2-1)/(nn*D), -(nn/2-2)/(nn*D), -1/(nn*D) // int i,istep,j,m,mmax,n; realtype tempi,tempr; long double theta,wi,wpi,wpr,wr,wtemp; // this should be of // maximal precision n = 2*nn; j = 1; for (i=1;i<=n;i+=2) { if (j>i) { tempr = data[j]; tempi = data[j+1]; data[j] = data[i]; data[j+1] = data[i+1]; data[i] = tempr; data[i+1] = tempi; } m = n/2; while ((m>=2) && (j>m)) { j -= m; m /= 2; } j += m; } mmax = 2; while (n>mmax) { istep = 2*mmax; theta = 2.0*Pi/mmax; if (!Forward) theta = -theta; wpr = sin(0.5*theta); wpr = -2.0*wpr*wpr; wpi = sin(theta); wr = 1.0; wi = 0.0; for (m=1;m<=mmax;m+=2) { for (i=m;i<=n;i+=istep) { j = i + mmax; tempr = wr*data[j] - wi*data[j+1]; tempi = wr*data[j+1] + wi*data[j]; data[j] = data[i] - tempr; data[j+1] = data[i+1] - tempi; data[i] = data[i] + tempr; data[i+1] = data[i+1] + tempi; } wtemp = wr; wr = wr*wpr - wi*wpi + wr; wi = wi*wpr + wtemp*wpi + wi; } mmax = istep; } } void RealFFT ( rvector data, int n, bool Forward ) { // Calculates the Fourier transform of a set of n real-valued data // points. Replaces this data (which is stored in array data[1:n]) // by the positive frequency half of its complex Fourier transform. // The real-valued first and last components of the complex transform // are returned as elements data[1] and data[2], respectively. // n MUST be a power of 2. This routine also calculates the // inverse transform of a complex data array if it is the transform // of real data (Result in this case must be multiplied by 2/n). // Array data should be allocated with GetVectorMemory. // int i,i1,i2,i3,i4,n2p3; realtype c1,c2,h1i,h1r,h2i,h2r; long double theta,wi,wpi,wpr,wr,wtemp; theta = 2.0*Pi/n; c1 = 0.5; if (Forward) { c2 = -0.5; FFT ( data,n/2,true ); } else { c2 = 0.5; theta = -theta; } wpr = sin(0.5*theta); wpr = -2.0*wpr*wpr; wpi = sin(theta); wr = 1.0 + wpr; wi = wpi; n2p3 = n + 3; for (i=2;i<=n/4;i++) { i1 = 2*i - 1; i2 = i1 + 1; i3 = n2p3 - i2; i4 = i3 + 1; h1r = c1*(data[i1] + data[i3]); h1i = c1*(data[i2] - data[i4]); h2r = -c2*(data[i2] + data[i4]); h2i = c2*(data[i1] - data[i3]); data[i1] = h1r + wr*h2r - wi*h2i; data[i2] = h1i + wr*h2i + wi*h2r; data[i3] = h1r - wr*h2r + wi*h2i; data[i4] = -h1i + wr*h2i + wi*h2r; wtemp = wr; wr = wr*wpr - wi*wpi + wr; wi = wi*wpr + wtemp*wpi + wi; } if (Forward) { h1r = data[1]; data[1] = h1r + data[2]; data[2] = h1r - data[2]; } else { h1r = data[1]; data[1] = c1*(h1r+data[2]); data[2] = c1*(h1r-data[2]); FFT ( data,n/2,false ); } } void TwoFFT ( rvector data1, rvector data2, rvector fft1, rvector fft2, int n ) { // Given two real input arrays data1[1:n] and data2[1:n], // this routine calls FFT and returns two "complex" output // arrays fft1[1:2*n] and fft2[1:2*n] (2*i-1 ith real, // 2*i ith imaginary), which contain the discrete Fourier // transforms of the respective data arrays. n MUST be // an integer power of 2. int i,j,n2, bj,bn; realtype h1r,h1i,h2r,h2i; i = 1; for (j=1;j<=n;j++) { fft1[i++] = data1[j]; fft1[i++] = data2[j]; } FFT ( fft1,n,true ); fft2[1] = fft1[2]; fft2[2] = 0.0; fft1[2] = 0.0; n2 = n + 2; for (j=2;j<=n/2+1;j++) { bj = 2*j-1; bn = 2*(n2-j)-1; h1r = 0.5*(fft1[bj] + fft1[bn]); h1i = 0.5*(fft1[bj+1] - fft1[bn+1]); h2r = 0.5*(fft1[bj+1] + fft1[bn+1]); h2i = 0.5*(fft1[bn] - fft1[bj]); fft1[bj] = h1r; fft1[bj+1] = h1i; fft1[bn] = h1r; fft1[bn+1] = -h1i; fft2[bj] = h2r; fft2[bj+1] = h2i; fft2[bn] = h2r; fft2[bn+1] = -h2i; } } void Convolve ( rvector data, int n, rvector respns, int m, rvector ans, bool Conv ) { // Convolves or Deconvolves a real data set data[1:n] (including // any user-supplied zero padding) with a response function // respns[1..n], stored in wrap-around order in a real array of // length m1) defined as // // data_m = data (*) data_{m-1} // // where data_m is the result of mth convolution, data_0=data. // The definition of the convolution is // // [a (*) b]_i = Sum_j { a_j * b_{i-j} } // // On input, data[] is considered as containing the signal // sampled at both positive and negative times in the wrap-around // order, that is // // data[i], 0<=i1) G = data[i+1]; else G = 0.0; } else { R = d1; G = 0.0; } phi = atan2(G,R) * m1; B = pow(R*R+G*G,m2); R = B*cos(phi); G = B*sin(phi); if (i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : mmdb::UDData ( user-defined data ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_UDData__ #define __MMDB_UDData__ #include "mmdb_mask.h" namespace mmdb { // ======================= UDRegister ========================= enum UDR_TYPE { UDR_ATOM = 0, UDR_RESIDUE = 1, UDR_CHAIN = 2, UDR_MODEL = 3, UDR_HIERARCHY = 4 }; enum UDD_FLAG { UDRF_ATOM = 0x01000000, UDRF_RESIDUE = 0x02000000, UDRF_CHAIN = 0x04000000, UDRF_MODEL = 0x08000000, UDRF_HIERARCHY = 0x10000000, UDRF_MASK = 0x00FFFFFF }; DefineClass(UDRegister); DefineStreamFunctions(UDRegister); class UDRegister : public io::Stream { public : UDRegister (); UDRegister ( io::RPStream Object ); ~UDRegister(); int RegisterUDInteger ( UDR_TYPE udr_type, cpstr UDDataID ); int RegisterUDReal ( UDR_TYPE udr_type, cpstr UDDataID ); int RegisterUDString ( UDR_TYPE udr_type, cpstr UDDataID ); int GetUDDHandle ( UDR_TYPE udr_type, cpstr UDDataID ); void write ( io::RFile f ); void read ( io::RFile f ); protected : int nIUDR[5],nRUDR[5],nSUDR[5]; psvector IUDRegister[5]; psvector RUDRegister[5]; psvector SUDRegister[5]; void InitUDRegister (); void FreeUDRegister (); int RegisterUDData ( psvector & UDRegister, int & nUDR, cpstr UDDataID ); }; // ========================== UDData =========================== enum UDDATA_RC { UDDATA_Ok = 0, UDDATA_WrongHandle = -1, UDDATA_WrongUDRType = -2, UDDATA_NoData = -3 }; DefineClass(UDData); DefineStreamFunctions(UDData); class UDData : public Mask { friend class SelManager; public : UDData (); UDData ( io::RPStream Object ); ~UDData(); protected : ivector IUData; rvector RUData; psvector SUData; void InitUDData (); void FreeUDDMemory(); int getNofIUData (); int getNofRUData (); int getNofSUData (); void setNofSUData ( int newN ); int putUDData ( int UDDhandle, int iudd ); int putUDData ( int UDDhandle, realtype rudd ); int putUDData ( int UDDhandle, cpstr sudd ); int getUDData ( int UDDhandle, int & iudd ); int getUDData ( int UDDhandle, realtype & rudd ); int getUDData ( int UDDhandle, pstr sudd, int maxLen ); pstr getUDData ( int UDDhandle, int * retcode=NULL ); int getUDData ( int UDDhandle, pstr & sudd ); void write ( io::RFile f ); void read ( io::RFile f ); }; } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_math_rand.h0000644000175000017500000000456213271367640016562 0ustar maartenmaarten// $Id: mmdb_math_rand.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Rand // ~~~~~~~~~ // **** Classes : RandomNumber ( random number generator ) // ~~~~~~~~~ // // (C) E. Krissinel 1997-2013 // // ================================================================= // #ifndef __MMDB_MATH_Rand__ #define __MMDB_MATH_Rand__ #include "mmdb_io_file.h" namespace mmdb { namespace math { // ------------------------------------------------------------- enum RN_MAX_SEED { _RN_MAX_IJ = 31328, _RN_MAX_KL = 30081 }; DefineClass(RandomNumber); class RandomNumber { public : RandomNumber ( long IJ=0, long KL=0 ); void Init ( long IJ=0, long KL=0 ); realtype gauss_rnd(); //!< Gaussian random numbers realtype random (); //!< Uniform [0..1] random number generator realtype srandom (); //!< Uniform [-1..1] random number generator void read ( io::RFile f ); void write ( io::RFile f ); protected : long I97,J97; realtype U[97],C,CD,CM; realtype gset; long iset; }; } // namespace math } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_root.cpp0000644000175000017500000026450213524560235016141 0ustar maartenmaarten// $Id: mmdb_root.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 14.12.18 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Root // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Root // ~~~~~~~~~ // // (C) E. Krissinel 2000-2018 // // ================================================================= // #include "string.h" #include "stdlib.h" #include "mmdb_root.h" #include "mmdb_atom.h" #include "mmdb_mmcif_.h" #include "mmdb_cifdefs.h" #include "mmdb_tables.h" #include "mmdb_defs.h" namespace mmdb { // ===================== Root ======================= Root::Root() : UDData() { InitMMDBRoot(); } Root::Root ( io::RPStream Object ) : UDData(Object) { InitMMDBRoot(); } Root::~Root() { FreeFileMemory(); } void Root::InitMMDBRoot() { nModels = 0; model = NULL; nAtoms = 0; atmLen = 0; atom = NULL; CIF = NULL; crModel = NULL; crChain = NULL; crRes = NULL; lcount = 0; strcpy ( S,"" ); // Flags = 0x00000000; // no special effects Flags = MMDBF_IgnoreElement; // done at request for default FType = MMDB_FILE_Undefined; // undefined file operation Exclude = true; ignoreRemarks = false; // used temporarily allowDuplChID = false; // used temporarily enforceUniqueChID = false; // used temporarily modelCnt = 0; // used only at reading files } void Root::FreeCoordMemory() { //int i; /* // All atoms are kept in array Atom. Models, chains // and residues have only references to Atom and // they do not dispose Atoms when disposed themselves. // It is important, however, to dispose Atom at // still alive residues, because each atom wipes out // reference to itself from the corresponding residue // before it dies. if (Atom) { for (i=0;iConvertPDBString ( S ); if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) RC = Error_NoError; if (RC) break; } fend = f.FileEnd(); if (!fend) { ReadPDBLine ( f,S,sizeof(S) ); title.TrimInput ( S ); lcount++; } } while (!fend); if (RC!=Error_WrongSection) return RC; // temporary solution: the rest of file is stored // in the form of strings while (!f.FileEnd() && strncmp(S,"CRYST" ,5) && strncmp(S,"ORIGX" ,5) && strncmp(S,"SCALE" ,5) && strncmp(S,"MTRIX" ,5) && strncmp(S,"TVECT" ,5) && strncmp(S,"MODEL ",6) && strncmp(S,"ATOM ",6) && strncmp(S,"SIGATM",6) && strncmp(S,"ANISOU",6) && strncmp(S,"SIGUIJ",6) && strncmp(S,"TER ",6) && strncmp(S,"HETATM",6) && strncmp(S,"ENDMDL",6)) { if (!strncmp(S,"LINK ",6)) crModel->ConvertPDBString ( S ); else if (!strncmp(S,"LINKR ",6)) crModel->ConvertPDBString ( S ); else if (!strncmp(S,"CISPEP",6)) { GetInteger ( modNum,&(S[43]),3 ); if (modNum<=0) modNum = 1; if (modNum!=1) SwitchModel ( modNum ); crModel->ConvertPDBString ( S ); if (modNum!=1) SwitchModel ( 1 ); } else { contString = new ContString(S); SA.AddData ( contString ); } ReadPDBLine ( f,S,sizeof(S) ); title.TrimInput ( S ); lcount++; } // read crystallographic information section do { RC = cryst.ConvertPDBString ( S ); if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) RC = Error_NoError; if (RC) break; fend = f.FileEnd(); if (!fend) { ReadPDBLine ( f,S,sizeof(S) ); title.TrimInput ( S ); lcount++; } } while (!fend); if (!RC) { RC = cryst.ConvertPDBString ( S ); if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) RC = Error_WrongSection; } cryst.CalcCoordTransforms(); if (Flags & MMDBF_SimRWBROOK) cryst.RWBROOKReadPrintout(); if (RC!=Error_WrongSection) return RC; // temporary solution: the rest of file is stored // in the form of strings while (!f.FileEnd() && strncmp(S,"MODEL ",6) && strncmp(S,"ATOM ",6) && strncmp(S,"SIGATM",6) && strncmp(S,"ANISOU",6) && strncmp(S,"SIGUIJ",6) && strncmp(S,"TER ",6) && strncmp(S,"HETATM",6) && strncmp(S,"ENDMDL",6)) { contString = new ContString(S); SB.AddData ( contString ); ReadPDBLine ( f,S,sizeof(S) ); title.TrimInput ( S ); lcount++; } if (Flags & MMDBF_NoCoordRead) return Error_NoError; // read coordinate section RC = Error_NoError; do { RC = ReadPDBAtom ( S ); if (RC) break; fend = f.FileEnd(); if (!fend) { ReadPDBLine ( f,S,sizeof(S) ); title.TrimInput ( S ); lcount++; } } while (!fend); // if (!RC) // RC = ReadPDBAtom(S); // commented on 28.05.2004, it appears that "CHAIN_ORDER" should not // be enforced here // cleanKey = PDBCLEAN_ATNAME | PDBCLEAN_CHAIN_ORDER; cleanKey = 0x00000000; if (Flags & MMDBF_EnforceAtomNames) cleanKey = PDBCLEAN_ATNAME; if (Flags & MMDBF_AutoSerials) cleanKey |= PDBCLEAN_SERIAL; if (cleanKey) PDBCleanup ( cleanKey ); if ((!f.FileEnd()) && (RC!=Error_WrongSection)) return RC; // temporary solution: the rest of file is stored // in the form of strings while (!f.FileEnd()) { if (strncmp(S,"END ",6)) { // END is added automatically contString = new ContString(S); SC.AddData ( contString ); } ReadPDBLine ( f,S,sizeof(S) ); title.TrimInput ( S ); lcount++; } lcount--; // last line was not read return Error_NoError; } ERROR_CODE Root::ReadCIFASCII1 ( cpstr CIFLFName, io::GZ_MODE gzipMode ) { pstr FName; FName = getenv ( CIFLFName ); if (FName) return ReadCIFASCII ( FName,gzipMode ); else return Error_NoLogicalName; } ERROR_CODE Root::ReadCIFASCII ( cpstr CIFFileName, io::GZ_MODE gzipMode ) { io::File f; ERROR_CODE rc; // open the file as ASCII for reading // opening it in pseudo-binary mode helps reading various // line terminators for files coming from different platforms f.assign ( CIFFileName,false,false,gzipMode ); if (f.reset(true)) { rc = ReadCIFASCII ( f ); f.shut(); } else rc = Error_CantOpenFile; return rc; } ERROR_CODE Root::ReadCIFASCII ( io::RFile f ) { int W; ERROR_CODE RC; // remove previous data ResetManager (); FreeFileMemory(); FType = MMDB_FILE_CIF; SetFlag ( 0 ); CIFErrorLocation[0] = char(0); // CIF reading phase lcount = 0; // line counter S[0] = char(0); if (f.FileEnd()) return Error_EmptyFile; if (!CIF) CIF = new mmcif::Data(); CIF->SetStopOnWarning ( true ); CIF->SetPrintWarnings ( (Flags & MMDBF_PrintCIFWarnings)!=0 ); W = CIF->ReadMMCIFData ( f,S,lcount ); if (W) { if (W == mmcif::CIFRC_NoDataLine) return Error_NotACIFFile; if (W & mmcif::CIFW_UnrecognizedItems) return Error_UnrecognCIFItems; if (W & mmcif::CIFW_MissingField) return Error_MissingCIFField; if (W & mmcif::CIFW_EmptyLoop) return Error_EmptyCIFLoop; if (W & mmcif::CIFW_UnexpectedEOF) return Error_UnexpEndOfCIF; if (W & mmcif::CIFW_LoopFieldMissing) return Error_MissgCIFLoopField; if (W & mmcif::CIFW_NotAStructure) return Error_NotACIFStructure; if (W & mmcif::CIFW_NotALoop) return Error_NotACIFLoop; return Error_Unknown; } RC = ReadFromCIF ( CIF ); if (CIF) { delete CIF; CIF = NULL; } return RC; } ERROR_CODE Root::ReadFromCIF ( mmcif::PData CIFD ) { mmcif::PLoop Loop1,Loop2; pstr F,FC; word cleanKey; int i,l,j,n,retc; ERROR_CODE RC; RC = title.GetCIF ( CIFD ); if (RC!=Error_NoError) { CIFD->Optimize(); return RC; } SwitchModel ( 1 ); if (!crModel) return Error_GeneralError1; RC = crModel->GetCIF ( CIFD ); if (RC!=Error_NoError) { CIFD->Optimize(); return RC; } RC = cryst.GetCIF ( CIFD ); if (RC!=Error_NoError) { CIFD->Optimize(); return RC; } cryst.CalcCoordTransforms(); if (Flags & MMDBF_SimRWBROOK) cryst.RWBROOKReadPrintout(); RC = ReadCIFAtom ( CIFD ); Loop1 = CIFD->GetLoop ( CIFCAT_ENTITY ); Loop2 = CIFD->GetLoop ( CIFCAT_STRUCT_ASYM ); if (Loop1 && Loop2) { // make 'Het' atoms l = Loop1->GetLoopLength(); n = Loop2->GetLoopLength(); for (i=0;iGetString ( CIFTAG_TYPE,i,retc ); if (F && (!retc)) { if (!strcasecmp(F,"non-polymer")) { F = Loop1->GetString ( CIFTAG_ID,i,retc ); if (F && (!retc)) for (j=0;jGetString ( CIFTAG_ENTITY_ID,j,retc ); if (FC && (!retc)) { if (!strcasecmp(FC,F)) { FC = Loop2->GetString ( CIFTAG_ID,j,retc ); if (FC && (!retc)) MakeHetAtoms ( FC,true ); } } } } } } } if (RC==Error_NoError) { // deleting these CIF loops here is a temporary solution // taken in order to avoid mess at rewriting the CIF file. CIFD->DeleteLoop ( CIFCAT_ATOM_SITE ); CIFD->DeleteLoop ( CIFCAT_ATOM_SITE_ANISOTROP ); CIFD->Optimize (); } cleanKey = 0x00000000; if (Flags & MMDBF_EnforceAtomNames) cleanKey = PDBCLEAN_ATNAME; if (Flags & MMDBF_AutoSerials) cleanKey |= PDBCLEAN_SERIAL; if (cleanKey) PDBCleanup ( cleanKey ); return RC; } ERROR_CODE Root::ReadCoorFile1 ( cpstr LFName, io::GZ_MODE gzipMode ) { pstr FName; FName = getenv ( LFName ); if (FName) return ReadCoorFile ( FName,gzipMode ); else return Error_NoLogicalName; } ERROR_CODE Root::ReadCoorFile ( cpstr CFName, io::GZ_MODE gzipMode ) { // auto format recognition int kin; bool IBL; kin = isMMDBBIN ( CFName,gzipMode ); if (kin==Error_EmptyFile) return Error_EmptyFile; if (kin<0) return Error_CantOpenFile; if (kin==0) return ReadMMDBF ( CFName,gzipMode ); IBL = ((Flags & MMDBF_IgnoreBlankLines)!=0); if (isPDB(CFName,gzipMode,IBL)==0) return ReadPDBASCII ( CFName,gzipMode ); if (mmcif::isCIF(CFName,gzipMode)==0) return ReadCIFASCII ( CFName,gzipMode ); return Error_ForeignFile; } ERROR_CODE Root::ReadCoorFile ( io::RFile f ) { // auto format recognition int kin; bool IBL; kin = isMMDBBIN ( f ); f.reset ( true ); if (kin==Error_EmptyFile) return Error_EmptyFile; if (kin<0) return Error_CantOpenFile; if (kin==0) return ReadMMDBF ( f ); IBL = ((Flags & MMDBF_IgnoreBlankLines)!=0); kin = isPDB ( f,IBL ); f.reset ( true ); if (kin==0) return ReadPDBASCII ( f ); kin = mmcif::isCIF ( f ); f.reset ( true ); if (kin==0) return ReadCIFASCII ( f ); return Error_ForeignFile; } word Root::PDBCleanup ( word CleanKey ) { // cleans coordinate part to comply with PDB standards: // // CleanKey Action // PDBCLEAN_ATNAME pads atom names with spaces to form 4-symbol names // PDBCLEAN_TER inserts TER cards in the end of each chain // PDBCLEAN_CHAIN generates 1-character chain ids instead of // those many-character // PDBCLEAN_CHAIN_STRONG generates 1-character chain ids starting // from 'A' on for all ids, including single-char // PDBCLEAN_ALTCODE generates 1-character alternative codes instead // of those many-character // PDBCLEAN_ALTCODE_STRONG generates 1-character alternative codes // from 'A' on for all codes, including // single-character ones // PDBCLEAN_SERIAL puts serial numbers in due order // PDBCLEAN_INDEX reorders the internal index of atoms such that // it follows the actual order of atoms in // the object hierarchy // PDBCLEAN_SEQNUM renumbers all residues so that they go // incrementally-by-one without insertion codes // PDBCLEAN_CHAIN_ORDER puts chains in order of atom's serial numbers // PDBCLEAN_SOLVENT moves solvent chains at the end of each model // PDBCLEAN_ELEMENT calculates PDB element names where they are not // found in the chemical element table // PDBCLEAN_ELEMENT_STRONG calculates all chemical element names // // Return codes (as bits): // 0 Ok // PDBCLEAN_CHAIN too many chains for assigning them 1-letter codes // PDBCLEAN_ATNAME element names were not available // PDBCLEAN_ALTCODE too many alternative codes encountered. // PPAtom atom1; PPChain Chain1,Chain2; PModel crModel0; PChain crChain0; PResidue crRes0; PPResidue resTable; PAtom A; AltLoc * altLoc; ChainID * chain_ID; // ChainID chainID; // pstr chID; char aLoc [257]; char chnID[257]; word RC; int i,j,k,nal,nch,nr, nch1,nch2; // int modN,modl; char c; bool Done,Solvent; // bool NewChain; RC = 0; if (nAtoms<=0) return RC; if (CleanKey & PDBCLEAN_ATNAME) for (i=0;iMakePDBAtomName()) RC |= PDBCLEAN_ATNAME; k = -1; if (CleanKey & PDBCLEAN_TER) { for (i=0;iGetChainTable ( Chain1,nch1 ); for (j=0;jTrimResidueTable(); Chain1[j]->GetResidueTable ( resTable,nr ); if (nr>0) { nr--; Done = false; while ((nr>=0) && (!Done)) { Done = resTable[nr]->isAminoacid(); if (!Done) nr--; } if (nr>=0) { resTable[nr]->TrimAtomTable(); resTable[nr]->GetAtomTable ( atom1,nal ); if (nal>0) { nal--; if (!atom1[nal]->isTer()) { A = newAtom(); A->Copy ( atom1[nal] ); A->MakeTer(); resTable[nr]->AddAtom ( A ); } } } } } } /* modN = -1; crModel0 = crModel; for (i=0;iGetModelNum(); chID = atom[i]->GetChainID (); if (modN<0) { modN = modl; SwitchModel ( modN ); if (chID) strcpy ( chainID,chID ); else chainID[0] = char(0); } else { if (modN!=modl) NewChain = true; else if (chID) NewChain = strcmp(chID,chainID)!=0; else NewChain = chainID[0]!=char(0); if (NewChain) { if (k>=0) { if ((!atom[k]->Ter) && (!atom[k]->Het)) { // insert 'Ter' before atom in position 'i' PutAtom ( -(i+1),atom[k]->serNum+1,pstr("TER"), atom[k]->GetResName(),atom[k]->GetChainID(), atom[k]->GetSeqNum (),atom[k]->GetInsCode(), pstr(" "),pstr(" "),pstr(" ") ); atom[i]->MakeTer(); } } modN = modl; SwitchModel ( modN ); if (chID) strcpy ( chainID,chID ); else chainID[0] = char(0); } } k = i; } if (k>=0) { if ((!atom[k]->Ter) && (!atom[k]->Het)) { // add last TER i = nAtoms; SwitchModel ( atom[k]->GetModelNum() ); PutAtom ( 0,nAtoms+1,pstr("TER"),atom[k]->GetResName(), atom[k]->GetChainID(),atom[k]->GetSeqNum(), atom[k]->GetInsCode(),pstr(" "),pstr(" "), pstr(" ") ); atom[i]->MakeTer(); } } crModel = crModel0; */ } if (CleanKey & (PDBCLEAN_CHAIN | PDBCLEAN_CHAIN_STRONG)) { chain_ID = new ChainID[256]; for (i=0;inChains;j++) { crChain0 = model[i]->chain[j]; if (crChain0) { if (!crChain0->chainID[0]) strcpy ( crChain0->chainID," " ); k = 0; while ((kchainID))) k++; if (k>=nch) { if (nch>=255) RC |= PDBCLEAN_CHAIN; else { strcpy ( chain_ID[nch],crChain0->chainID ); if (!chain_ID[nch][1]) chnID[nch] = chain_ID[nch][0]; nch++; } } } } c = 'A'; if (CleanKey & PDBCLEAN_CHAIN_STRONG) { // rename all chains through from A to Z for (k=0;knChains;j++) { crChain0 = model[i]->chain[j]; if (crChain0) { k = 0; while ((kchainID))) k++; strcpy ( crChain0->prevChainID,crChain0->chainID ); crChain0->chainID[0] = chnID[k]; crChain0->chainID[1] = char(0); } } } delete[] chain_ID; } if (CleanKey & (PDBCLEAN_ALTCODE | PDBCLEAN_ALTCODE_STRONG)) { altLoc = new AltLoc[256]; for (i=0;i<256;i++) { strcpy ( altLoc[i]," " ); aLoc[i] = char(0); } aLoc[0] = ' '; aLoc[256] = char(0); nal = 1; for (i=0;ialtLoc[0]) strcpy ( atom[i]->altLoc," " ); else { k = 0; while ((kaltLoc))) k++; if (k>=nal) { if (nal>=255) RC |= PDBCLEAN_ALTCODE; else { strcpy ( altLoc[nal],atom[i]->altLoc ); if (!altLoc[nal][1]) aLoc[nal] = altLoc[nal][0]; nal++; } } } } c = 'A'; if (CleanKey & PDBCLEAN_ALTCODE_STRONG) for (i=1;ialtLoc))) k++; atom[i]->altLoc[0] = aLoc[k]; atom[i]->altLoc[1] = char(0); } delete[] altLoc; } if (CleanKey & PDBCLEAN_SEQNUM) for (i=0;inChains;j++) { crChain0 = crModel0->chain[j]; if (crChain0) { nr = 0; for (k=0;knResidues;k++) { crRes0 = crChain0->residue[k]; if (crRes0) { nr++; crRes0->seqNum = nr; crRes0->insCode[0] = char(0); } } } } } if (CleanKey & PDBCLEAN_SOLVENT) { atom1 = new PAtom[nAtoms]; k = 1; for (i=0;inChains>k) k = model[i]->nChains; } Chain1 = new PChain[k]; Chain2 = new PChain[k]; k = 0; for (i=0;inChains;nch++) { crChain0 = crModel0->chain[nch]; if (crChain0) { Solvent = false; for (nr=0;(nrnResidues) && (!Solvent);nr++) { crRes0 = crChain0->residue[nr]; if (crRes0) for (j=0;(jname ); } if (Solvent) Chain2[nch2++] = crChain0; else Chain1[nch1++] = crChain0; } } for (nch=0;nchnResidues;nr++) { crRes0 = crChain0->residue[nr]; if (crRes0) for (j=0;jnAtoms;j++) if (crRes0->atom[j]) { atom1[k] = crRes0->atom[j]; atom1[k]->index = k+1; k++; } } crModel0->chain[nch] = Chain1[nch]; } for (nch=0;nchnResidues;nr++) { crRes0 = crChain0->residue[nr]; if (crRes0) for (j=0;jnAtoms;j++) if (crRes0->atom[j]) { atom1[k] = crRes0->atom[j]; atom1[k]->index = k+1; k++; } } crModel0->chain[nch1++] = Chain2[nch]; } crModel0->nChains = nch1; } } delete[] Chain1; delete[] Chain2; if (atom) delete[] atom; atom = atom1; atmLen = nAtoms; nAtoms = k; } if (CleanKey & (PDBCLEAN_CHAIN_ORDER | PDBCLEAN_CHAIN_ORDER_IX)) { for (i=0;inChains;j++) { crChain0 = crModel0->chain[j]; if (crChain0) { crChain0->nWeights = 0; crChain0->Weight = 0.0; if (kchain[k] = crModel0->chain[j]; crModel0->chain[j] = NULL; } k++; } } crModel0->nChains = k; } } if (CleanKey & PDBCLEAN_CHAIN_ORDER) { for (i=0;iGetChain(); crChain0->nWeights++; crChain0->Weight += atom[i]->serNum; } } else { for (i=0;iGetChain(); crChain0->nWeights++; crChain0->Weight += atom[i]->GetIndex(); } } for (i=0;inChains;j++) { crChain0 = crModel0->chain[j]; if (crChain0->nWeights) crChain0->Weight /= crChain0->nWeights; } // bubble sorting do { Done = true; for (j=1;jnChains;j++) if (crModel0->chain[j-1]->Weight > crModel0->chain[j]->Weight) { crChain0 = crModel0->chain[j-1]; crModel0->chain[j-1] = crModel0->chain[j]; crModel0->chain[j] = crChain0; Done = false; } } while (!Done); } } } if (CleanKey & PDBCLEAN_INDEX) { k = 0; for (i=0;inChains;nch++) { crChain0 = crModel0->chain[nch]; if (crChain0) { for (nr=0;nrnResidues;nr++) { crRes0 = crChain0->residue[nr]; if (crRes0) { for (j=0;jnAtoms;j++) { A = crRes0->atom[j]; if (A) { atom[A->index-1] = atom[k]; if (atom[k]) atom[k]->index = A->index; atom[k] = A; k++; A->index = k; } } } } } } } } nAtoms = k; } if (CleanKey & PDBCLEAN_SERIAL) { k = 0; for (i=0;iindex = k+1; atom[k]->serNum = atom[k]->index; k++; } nAtoms = k; } if (CleanKey & PDBCLEAN_ELEMENT) { for (i=0;iTer)) { if (getElementNo(atom[i]->element)==ELEMENT_UNKNOWN) { strcpy ( atom[i]->element," " ); //atom[i]->MakePDBAtomName(); atom[i]->RestoreElementName(); } } } if (CleanKey & PDBCLEAN_ELEMENT_STRONG) { for (i=0;iTer)) { strcpy ( atom[i]->element," " ); //atom[i]->MakePDBAtomName(); atom[i]->RestoreElementName(); } } return RC; } void Root::MakeHetAtoms ( cpstr chainID, bool Make ) { // Makes all atoms in chain 'chainID', in all models, as 'Het' atoms // if Make is set true, and makes them 'ordinary' atoms otherwise. // 'Ter' is automatically removed when converting to 'Het' atoms, // and is automatically added when converting to 'ordinary' atoms. int i,j,k,l,n; PModel crModel0; PChain crChain0; PResidue crRes0; crModel0 = crModel; for (i=0;inChains;j++) { crChain0 = model[i]->chain[j]; if (crChain0) { if (!strcmp(crChain0->chainID,chainID)) { n = 0; for (k=0;knResidues;k++) { crRes0 = crChain0->residue[k]; if (crRes0) for (l=0;lnAtoms;l++) if (crRes0->atom[l]) { crRes0->atom[l]->Het = Make; n = crRes0->atom[l]->index; } } if (n>0) { n--; if (atom[n]->Het && atom[n]->Ter) RemoveAtom ( n+1 ); else if ((!atom[n]->Het) && (!atom[n]->Ter)) { SwitchModel ( model[i]->GetSerNum() ); if (nserNum+1,pstr("TER"), atom[n]->GetResName(),atom[n]->GetChainID(), atom[n]->GetSeqNum (),atom[n]->GetInsCode(), pstr(" "),pstr(" "),pstr(" ") ); else PutAtom ( 0,nAtoms+1,pstr("TER"), atom[n]->GetResName(),atom[n]->GetChainID(), atom[n]->GetSeqNum (),atom[n]->GetInsCode(), pstr(" "),pstr(" "),pstr(" ") ); atom[n+1]->MakeTer(); } } } } } crModel = crModel0; } void Root::RemoveAtom ( int index ) { // Removes atom at the specified index in the Atom array. // This index is always accessible as atom[index]->index. // If this leaves a residue empty, the residue is removed. // If this leaves an empty chain, the chain is removed as well; // the same happens to the model. PResidue crRes0; PChain crChain0; PModel crModel0; int i,j; if ((index>0) && (index<=nAtoms)) { if (atom[index-1]) { crRes0 = atom[index-1]->residue; if (crRes0) { if (crRes0->_ExcludeAtom(index)) { // the residue appears empty after the exclusion if (crRes) { if ((crRes->seqNum==crRes0->seqNum) && (!strcmp(crRes->insCode,crRes0->insCode))) crRes = NULL; } crChain0 = crRes0->chain; if (crChain0) { if (crChain0->_ExcludeResidue(crRes0->name,crRes0->seqNum, crRes0->insCode)) { // the chain appears empty after the exclusion if (crChain) { if (!strcmp(crChain->chainID,crChain0->chainID)) crChain = NULL; } crModel0 = PModel(crChain0->model); if (crModel0) { if (crModel0->_ExcludeChain(crChain0->chainID)) { // the model appears ampty after the exclusion if (crModel) { if (crModel->serNum==crModel0->serNum) crModel = NULL; } i = crModel0->serNum-1; delete model[i]; model[i] = NULL; } } delete crChain0; // it is already excluded from the hierarchy! } } delete crRes0; // it is already excluded from the hierarchy! } } delete atom[index-1]; // it is already excluded from the hierarchy! atom[index-1] = NULL; // now rearrange and re-index atoms. j = 0; for (i=0;iindex = j+1; j++; } nAtoms = j; } } } int Root::_ExcludeModel ( int serNum ) { // _ExcludeModel(..) excludes (but does not dispose!) a model // from the file. Returns 1 if the file gets empty and 0 otherwise. int i,k; if (!Exclude) return 0; if ((0serNum = k+1; k++; } nModels = k; if (nModels<=0) return 1; else return 0; } int Root::FinishStructEdit() { // Makes a new atom index after insertion or deletion of atoms. // This function may change atoms' positions in the index and // correspondingly the Atom::index field. PResidue res; PChain chain; PModel Model1; PPAtom Atom1; int i,j,k,l,n,index,nAtoms1; // calculate new number of atoms nAtoms1 = 0; for (i=0;inChains;j++) { chain = Model1->chain[j]; if (chain) { for (k=0;knResidues;k++) { res = chain->residue[k]; if (res) { res->TrimAtomTable(); nAtoms1 += res->nAtoms; } } chain->TrimResidueTable(); } } Model1->TrimChainTable(); } } TrimModelTable(); // compile a new index and null the old one if (nAtoms1>0) Atom1 = new PAtom[nAtoms1]; else Atom1 = NULL; n = 0; for (i=0;inChains;j++) { chain = Model1->chain[j]; for (k=0;knResidues;k++) { res = chain->residue[k]; for (l=0;lnAtoms;l++) { Atom1[n] = res->atom[l]; index = Atom1[n]->index; if ((index>0) && (index<=atmLen)) atom[index-1] = NULL; Atom1[n]->index = n+1; n++; } } } } // if (n!=nAtoms1) { // printf ( " **** PROGRAM ERROR IN Root::FinishStructEdit\n" ); // exit ( 1 ); // } // check if there are dead atoms in the old index for (i=0;iserNum = j+1; j++; } nModels = j; } int Root::GenerateNCSMates() { // // Generates NCS mates according to NCS matrices given // in cryst. This will result in generating many-character // chain names, composed as 'x_n' where 'x' is the original // name and 'n' is a unique number, which will coincide with // the symmetry operation (order) number. Another side // effect will be a disorder in atoms' serial numbers. // The hierarchy should therefore be cleaned after // generating the NCS mates. An appropriate way to do that // is to issue the following call: // // PDBCleanup ( PDBCLEAN_TER | PDBCLEAN_ALTCODE_STRONG | // PDBCLEAN_CHAIN_STRONG | PDBCLEAN_SERIAL ); // PPChain chainTable,chain; PChain chn; mat44 ncs_m; ChainID chainID; int i,j,k,nNCSOps,nChains,iGiven; nNCSOps = cryst.GetNumberOfNCSMatrices(); if (nNCSOps<=0) return 1; for (i=0;iGetChainTable ( chainTable,nChains ); if (nChains>0) { chain = new PChain[nChains]; for (j=0;jCopy ( chain[j] ); sprintf ( chainID,"%s_%i", chain[j]->GetChainID(),k+1 ); chn->SetChainID ( chainID ); chn->ApplyTransform ( ncs_m ); model[i]->AddChain ( chn ); } } } delete[] chain; } } return 0; } void Root::ApplyNCSTransform ( int NCSMatrixNo ) { mat33 t; vect3 v; int i; if (!cryst.GetNCSMatrix(NCSMatrixNo,t,v)) return; for (i=0;iTransform ( t,v ); } ERROR_CODE Root::PutPDBString ( cpstr PDBString ) { PContString contString; ERROR_CODE RC; strcpy ( S,PDBString ); // maintain the buffer! PadSpaces ( S,80 ); lcount++; // belongs to title? RC = title.ConvertPDBString ( S ); if (RC!=Error_WrongSection) return RC; // belongs to primary structure section? SwitchModel ( 1 ); RC = crModel->ConvertPDBString ( S ); if (RC!=Error_WrongSection) return RC; // belongs to the crystallographic information section? RC = cryst.ConvertPDBString ( S ); if (RC!=Error_WrongSection) { // if (RC==0) cryst.CalcCoordTransforms(); return RC; } // belongs to the coordinate section? RC = ReadPDBAtom ( S ); if (RC!=Error_WrongSection) return RC; // temporary solution: the rest of file is stored // in the form of strings if ((S[0]) && (S[0]!=' ') && (strncmp(S,"END ",6))) { // END is added automatically contString = new ContString(S); SC.AddData ( contString ); } return Error_NoError; } ERROR_CODE Root::AddPDBASCII1 ( cpstr PDBLFName, io::GZ_MODE gzipMode ) { pstr FName; FName = getenv ( PDBLFName ); if (FName) return AddPDBASCII ( FName,gzipMode ); else return Error_NoLogicalName; } ERROR_CODE Root::AddPDBASCII ( cpstr PDBFileName, io::GZ_MODE gzipMode ) { io::File f; ERROR_CODE RC; // open the file as ASCII for reading // opening it in pseudo-binary mode helps reading various // line terminators for files coming from different platforms f.assign ( PDBFileName,false,false,gzipMode ); if (f.reset(true)) { lcount = 1; // line counter RC = Error_NoError; while ((!f.FileEnd()) && (!RC)) { ReadPDBLine ( f,S,sizeof(S) ); RC = PutPDBString ( S ); } f.shut(); } else RC = Error_CantOpenFile; return RC; } void Root::GetInputBuffer ( pstr Line, int & count ) { if (FType==MMDB_FILE_PDB) { // PDB File strcpy ( Line,S ); count = lcount; } else if (FType==MMDB_FILE_CIF) { if (!CIFErrorLocation[0]) { // CIF reading phase strcpy ( Line,S ); count = lcount; } else { strcpy ( Line,CIFErrorLocation ); count = -1; // CIF interpretation phase } } else { Line[0] = char(0); count = -2; } } bool Root::isCompactBinary() { if (Flags & MMDBF_MakeCompactBinary) return true; return false; } int Root::CrystReady() { // Returns flags: // CRRDY_Complete if crystallographic information is complete // CRRDY_NotPrecise if cryst. inf-n is not precise // CRRDY_isTranslation if cryst. inf-n contains translation // CRRDY_NoOrthCode no orthogonalization code // Fatal: // CRRDY_NoTransfMatrices if transform. matrices were not calculated // CRRDY_Unchecked if cryst. inf-n was not checked // CRRDY_Ambiguous if cryst. inf-n is ambiguous // CRRDY_NoCell if cryst. inf-n is unusable // CRRDY_NoSpaceGroup if space group is not set int k; if (!(cryst.WhatIsSet & CSET_Transforms)) return CRRDY_NoTransfMatrices; if ((cryst.WhatIsSet & CSET_CellParams)!=CSET_CellParams) return CRRDY_NoCell; if (!(cryst.WhatIsSet & CSET_SpaceGroup)) return CRRDY_NoSpaceGroup; if (cryst.CellCheck & CCHK_Unchecked) return CRRDY_Unchecked; if (cryst.CellCheck & CCHK_Disagreement) return CRRDY_Ambiguous; k = 0x0000; if (cryst.CellCheck & CCHK_Error) k |= CRRDY_NotPrecise; if (cryst.CellCheck & CCHK_Translations) k |= CRRDY_isTranslation; if (cryst.CellCheck & CCHK_NoOrthCode) k |= CRRDY_NoOrthCode; return k; } bool Root::isCrystInfo() { return (((cryst.WhatIsSet & CSET_CellParams)==CSET_CellParams) && (cryst.WhatIsSet & CSET_SpaceGroup)); } bool Root::isCellInfo() { return ((cryst.WhatIsSet & CSET_CellParams)==CSET_CellParams); } bool Root::isSpaceGroup() { return (cryst.WhatIsSet & CSET_SpaceGroup); } bool Root::isTransfMatrix() { return cryst.areMatrices(); } bool Root::isScaleMatrix() { return ((cryst.WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix); } bool Root::isNCSMatrix() { return cryst.isNCSMatrix(); } int Root::AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ) { return cryst.AddNCSMatrix ( ncs_m,ncs_v,iGiven ); } int Root::GetNumberOfNCSMatrices() { return cryst.GetNumberOfNCSMatrices(); } int Root::GetNumberOfNCSMates() { // Returns the number of NCS mates not given in the file (iGiven==0) return cryst.GetNumberOfNCSMates(); } bool Root::GetNCSMatrix ( int NCSMatrixNo, // 0..N-1 mat44 & ncs_m, int & iGiven ) { return cryst.GetNCSMatrix ( NCSMatrixNo,ncs_m,iGiven ); } ERROR_CODE Root::ReadPDBAtom ( cpstr L ) { // If string L belongs to the coordinate section // (records ATOM, SIGATM, ANISOU, SIGUIJ, TER, HETATM), // the correspondent information is retrieved and // stored in the dynamic Atom array. In parallel, the // structures of Model/Chain/Residue are generated and // referenced to the corresponding Atom. // If processing of L was successful, the return is 0, // otherwise it returns the corresponding Error_XXX // code. // If L does not belong to the coordinate section, // Error_WrongSection is returned. int index,i; ERROR_CODE RC; if (!strncmp(L,"ATOM ",6)) { index = nAtoms+1; // index for the next atom in Atom array RC = CheckAtomPlace ( index,L ); if (!RC) RC = atom[index-1]->ConvertPDBATOM ( index,L ); } else if (!strncmp(L,"SIGATM",6)) { index = nAtoms; // keep index! RC = CheckAtomPlace ( index,L ); if (!RC) RC = atom[index-1]->ConvertPDBSIGATM ( index,L ); } else if (!strncmp(L,"ANISOU",6)) { index = nAtoms; // keep index RC = CheckAtomPlace ( index,L ); if (!RC) RC = atom[index-1]->ConvertPDBANISOU ( index,L ); } else if (!strncmp(L,"SIGUIJ",6)) { index = nAtoms; // keep index RC = CheckAtomPlace ( index,L ); if (!RC) RC = atom[index-1]->ConvertPDBSIGUIJ ( index,L ); } else if (!strncmp(L,"TER ",6)) { index = nAtoms+1; // new place in Atom array RC = CheckAtomPlace ( index,L ); if (!RC) RC = atom[index-1]->ConvertPDBTER ( index,L ); } else if (!strncmp(L,"HETATM",6)) { index = nAtoms+1; // new place in Atom array RC = CheckAtomPlace ( index,L ); if (!RC) RC = atom[index-1]->ConvertPDBHETATM ( index,L ); } else if (!strncmp(L,"MODEL ",6)) { modelCnt++; RC = SwitchModel ( L ); for (i=0;(iserNum==model[i]->serNum) RC = Error_DuplicatedModel; } // if (!RC) { // if (crModel->serNum!=modelCnt) // RC = Error_DuplicatedModel; // } } else if (!strncmp(L,"ENDMDL",6)) { crModel = NULL; crChain = NULL; crRes = NULL; RC = Error_NoError; } else return Error_WrongSection; return RC; } ERROR_CODE Root::ReadCIFAtom ( mmcif::PData CIFD ) { mmcif::PLoop Loop,LoopAnis; int i,index,nATS; ERROR_CODE RC; Loop = CIFD->GetLoop ( CIFCAT_ATOM_SITE ); if (!Loop) return Error_NoError; // no atom coordinates in the file LoopAnis = CIFD->GetLoop ( CIFCAT_ATOM_SITE_ANISOTROP ); nATS = Loop->GetLoopLength(); for (i=1;i<=nATS;i++) { // nAtoms and i should always coincide at this point. This piece // of code was however left in order to reach identity with // ReadPDBAtom(..). index = nAtoms+1; // index for the next atom in Atom array RC = CheckAtomPlace ( index,Loop ); if (!RC) RC = atom[index-1]->GetCIF ( i,Loop,LoopAnis ); if (RC && (RC!=Error_CIF_EmptyRow)) return RC; } if (Flags & MMDBF_AutoSerials) PDBCleanup ( PDBCLEAN_SERIAL ); return Error_NoError; } int Root::PutAtom ( int index, int serNum, const AtomName atomName, const ResName resName, const ChainID chainID, int seqNum, const InsCode insCode, const AltLoc altLoc, const SegID segID, const Element element ) { // An atom with the specified properties is put into the // structure. The current model is used; if no model is // set (crModel==NULL), one is created. Coordinates and // other parameters of the atom need to be set separately. // // If index is positive and there is already an atom at // this position in the system, the new atom will REPLACE // it. The corresponding residues are automatically // updated. // // If index is null (=0), the new atom will be put on // the top of the structure, i.e. it will be put into // (index=nAtoms+1)-th position. // // If index is negative, then the new atom is INSERTED // BEFORE the atom in the (-index)th position. For // saving the computational efforts, this WILL NOT cause // the recalculation of all atoms' serial numbers // according to their actual positions. It will be needed // however to put the things in order by calling // Root::OrderAtoms() at a certain point, especially // before writing an output ASCII file. NOTE that this // ordering is never done automatically. // // Limitation: if PutAtom implies creating new // chains/residues, these are always created on the top // of existing chains/residues. int i,kndex,RC; kndex = index; if (kndex<0) { // the new atom is to be inserted kndex = -kndex; if (kndex>atmLen) ExpandAtomArray ( kndex+1000-atmLen ); if (atom[kndex-1]!=NULL) { // the position is occupied // expand the array if necessary if (nAtoms>=atmLen) ExpandAtomArray ( IMax(kndex,nAtoms)+1000-atmLen ); // now shift all atoms from (kndex-1)th to the end of array. // note that this does not affect residues as they keep only // pointers on atoms for (i=nAtoms;i>=kndex;i--) { atom[i] = atom[i-1]; atom[i]->index = i+1; // this is Ok because residues keep // POINTERS rather than indices! } atom[kndex-1] = NULL; nAtoms++; } } if (kndex==0) kndex = nAtoms+1; if (!crModel) SwitchModel ( 1 ); RC = AllocateAtom ( kndex,chainID,chainID,resName,resName, seqNum,seqNum,1,insCode,true ); if (!RC) atom[kndex-1]->SetAtomName ( kndex,serNum,atomName,altLoc, segID,element ); return RC; } int Root::PutAtom ( int index, // same meaning as above PAtom A, // pointer to completed atom class int serNum // 0 means that the serial // number will be set equal // to "index". Otherwise, // the serial number is set // to the specified value ) { int i,kndex,RC,sn; if (!A) return -1; kndex = index; if (kndex<0) { // the new atom is to be inserted kndex = -kndex; if (kndex>atmLen) ExpandAtomArray ( kndex+1000-atmLen ); if (atom[kndex-1]!=NULL) { // the position is occupied // expand the array if necessary if (nAtoms>=atmLen) ExpandAtomArray ( IMax(kndex,nAtoms)+1000-atmLen ); // now shift all atoms from (kndex-1)th to the end of array. // note that this does not affect residues as they keep only // pointers on atoms for (i=nAtoms;i>=kndex;i--) { atom[i] = atom[i-1]; atom[i]->index = i+1; // this is Ok because residues keep // POINTERS rather than indices! } atom[kndex-1] = NULL; nAtoms++; } } if (kndex==0) kndex = nAtoms+1; RC = AllocateAtom ( kndex,A->GetChainID(),A->GetLabelAsymID(), A->GetResName(),A->GetLabelCompID(), A->GetSeqNum (),A->GetLabelSeqID (), A->GetLabelEntityID(),A->GetInsCode(), true ); if (serNum<=0) sn = kndex; else sn = serNum; if (!RC) { atom[kndex-1]->Copy ( A ); atom[kndex-1]->serNum = sn; } return RC; } int Root::CheckInAtom ( int index, // same meaning as above PAtom A // pointer to completed // atom class ) { int i,kndex; if (!A) return -1; kndex = index; if (kndex<0) { // the new atom is to be inserted kndex = -kndex; if (kndex>atmLen) ExpandAtomArray ( kndex+1000-atmLen ); if (atom[kndex-1]!=NULL) { // the position is occupied // expand the array if necessary if (nAtoms>=atmLen) ExpandAtomArray ( IMax(kndex,nAtoms)+1000-atmLen ); // now shift all atoms from (kndex-1)th to the end of array. // note that this does not affect residues as they keep only // pointers on atoms for (i=nAtoms;i>=kndex;i--) { atom[i] = atom[i-1]; if (atom[i]) atom[i]->index = i+1; // this is Ok because residues keep // POINTERS rather than indices! } } nAtoms++; } else { if (kndex==0) kndex = nAtoms + 1; // add atom on the very top if (kndex>atmLen) ExpandAtomArray ( kndex+1000-atmLen ); if (kndex>nAtoms) nAtoms = kndex; if (atom[kndex-1]) delete atom[kndex-1]; } atom[kndex-1] = A; A->index = kndex; return 0; } int Root::CheckInAtoms ( int index, // same meaning as above PPAtom A, // array of atoms to check in int natms // number of atoms to check in ) { PPAtom A1; int i,j,k,k1,kndex; if (!A) return -1; A1 = NULL; kndex = index; if (kndex<0) { // the new atoms are to be inserted kndex = -kndex; if (nAtoms+natms>=atmLen) ExpandAtomArray ( IMax(kndex,nAtoms)+1000+natms-atmLen ); if (kndexindex = k+1; k++; } if (j>0) { // insert removed atoms into the gap nAtoms += j; k1 = k+j; for (i=nAtoms-1;i>=k1;i--) { atom[i] = atom[i-j]; if (atom[i]) atom[i]->index = i+1; // this is Ok because residues keep // POINTERS rather than indices! } for (i=0;iindex = k+1; k++; } } delete[] A1; } else { if (kndex==0) kndex = nAtoms + 1; // add atom on the very top k = kndex + natms; if (k>atmLen) ExpandAtomArray ( k+1000-atmLen ); kndex--; for (i=0;iindex = kndex+1; kndex++; } nAtoms = IMax(nAtoms,kndex); } return 0; } ERROR_CODE Root::SwitchModel ( cpstr L ) { int nM; if (!GetInteger(nM,&(L[10]),4)) return Error_UnrecognizedInteger; return SwitchModel ( nM ); } ERROR_CODE Root::SwitchModel ( int nM ) { PPModel Mdl; int i; bool Transfer; if (nM<=0) return Error_WrongModelNo; if (nM>nModels) { if ((nModels==1) && model[0]) Transfer = (nAtoms<=0); else Transfer = false; Mdl = new PModel[nM]; for (i=0;iSetMMDBManager ( PManager(this),nM ); crModel = model[nM-1]; crChain = NULL; // new model - new chain crRes = NULL; // new chain - new residue return Error_NoError; } ERROR_CODE Root::CheckAtomPlace ( int index, cpstr L ) { // This function gets the residue/chain information stored // in PDB string L (the records should start with the // keywords ATOM, SIGATM, ANISOU, SIGUIJ, TER, HETATM) and // sets the pointers crChain and crRes to the respective. // chain and residue. If there is no chain/residue to place // the atom in, these will be created. // The function prepares place for the atom in the index-th // cell of the Atom array, expanding it as necessary. If the // corresponding element in the Atom array was not initialized, // a Atom class is created with reference to the current // residue. // This function DOES NOT check the PDB string L for // atom keywords. ResName resName; int seqNum; ChainID chainID; InsCode insCode; // get the residue sequence number/ insert code if (!GetIntIns(seqNum,insCode,&(L[22]),4)) { if (strncmp(L,"TER ",6)) return Error_UnrecognizedInteger; else { // we allow for empty TER card here seqNum = 0; insCode[0] = char(1); // unprintable symbol! used as // flag that TER card does not // have serial number insCode[1] = char(0); } } // get chain ID if (L[20]!=' ') { chainID[0] = L[20]; chainID[1] = L[21]; chainID[2] = char(0); } else if (L[21]!=' ') { chainID[0] = L[21]; chainID[1] = char(0); } else chainID[0] = char(0); // get residue name strcpy_ncss ( resName,&(L[17]),3 ); if ((!resName[0]) && (!strncmp(L,"TER ",6))) { insCode[0] = char(1); insCode[1] = char(0); } return AllocateAtom ( index ,chainID,chainID,resName,resName, seqNum,seqNum,1,insCode,false ); } ERROR_CODE Root::CheckAtomPlace ( int index, mmcif::PLoop Loop ) { // Version of CheckAtomPlace(..) for reading from CIF file. ResName resName,label_comp_id; int seqNum ,label_seq_id,label_entity_id,RC,k,nM; ChainID chainID,label_asym_id; InsCode insCode; pstr F; // Get the residue sequence number/insert code. They are // removed from the file after reading. k = index-1; // if (!CIFGetInteger1(seqNum,Loop,CIFTAG_LABEL_SEQ_ID,k)) if (!CIFGetInteger1(seqNum,Loop,CIFTAG_AUTH_SEQ_ID,k)) //CIFGetString ( insCode,Loop,CIFTAG_NDB_HELIX_CLASS_PDB,k, CIFGetString ( insCode,Loop,CIFTAG_PDBX_PDB_INS_CODE,k, // fix from B. Lohkamp sizeof(InsCode),pstr("") ); else { F = Loop->GetString ( CIFTAG_GROUP_PDB,k,RC ); if ((!F) || (RC)) return Error_CIF_EmptyRow; if (strcmp(F,"TER")) { seqNum = MinInt4; // only at reading CIF we allow this //CIFGetString ( insCode,Loop,CIFTAG_NDB_HELIX_CLASS_PDB,k, CIFGetString ( insCode,Loop,CIFTAG_PDBX_PDB_INS_CODE,k, // fix from B. Lohkamp sizeof(InsCode),pstr("") ); } else { // we allow for empty TER card here seqNum = 0; insCode[0] = char(1); // unprintable symbol! used as // flag that TER card does not // have serial number insCode[1] = char(0); } } CIFGetInteger1 ( label_seq_id ,Loop,CIFTAG_LABEL_SEQ_ID ,k ); CIFGetInteger1 ( label_entity_id,Loop,CIFTAG_LABEL_ENTITY_ID,k ); // get chain/residue ID CIFGetString ( chainID,Loop,CIFTAG_AUTH_ASYM_ID,k, sizeof(ChainID),pstr("") ); CIFGetString ( resName,Loop,CIFTAG_AUTH_COMP_ID,k, sizeof(ResName),pstr("") ); CIFGetString ( label_asym_id,Loop,CIFTAG_LABEL_ASYM_ID,k, sizeof(ChainID),pstr("") ); CIFGetString ( label_comp_id,Loop,CIFTAG_LABEL_COMP_ID,k, sizeof(ResName),pstr("") ); if (!resName[0]) strcpy ( resName,label_comp_id ); if (!CIFGetInteger1(nM,Loop,CIFTAG_PDBX_PDB_MODEL_NUM,k)) { if (crModel) { if (nM!=crModel->serNum) SwitchModel ( nM ); } else SwitchModel ( nM ); } return AllocateAtom ( index ,chainID,label_asym_id,resName, label_comp_id,seqNum,label_seq_id, label_entity_id,insCode,false ); } ERROR_CODE Root::AllocateAtom ( int index, const ChainID chainID, const ChainID label_asym_id, const ResName resName, const ResName label_comp_id, int seqNum, int label_seq_id, int label_entity_id, const InsCode insCode, bool Replace ) { if ((!resName[0]) && (insCode[0]!=char(1))) return Error_EmptyResidueName; // check if there is a pointer to model if (!crModel) { // the model pointer was not set. Check if there are // models already defined if (!model) SwitchModel ( 1 ); // creates a model else return Error_NoModel; } if (crChain && (insCode[0]!=char(1))) { // If crChain is not NULL, the model pointer was not // changed and we may try to keep using crChain as // pointer to the being-read chain. However, we must // check that the record still belongs to the same chain. // All this does not work if insCode[0] is set to 1 // which indicates a special case of 'TER' card without // parameters. if (enforceUniqueChID) { // enforcing unique chain IDs should be used only in case // of multi-chain complexes where 1-letter chain IDs are // not enough to accomodate all chains. Then chains are // dynamically renamed like A0,A1,A2,.. etc. Therefore, we // check only first symbol here. if (chainID[0]!=crChain->chainID[0]) crChain = NULL; // the chain has to be changed } else if (strcmp(chainID,crChain->chainID)) crChain = NULL; // the chain has to be changed } if (!crChain) { // either the model or chain was changed -- get a new chain if (allowDuplChID) crChain = crModel->CreateChain ( chainID ); else crChain = crModel->GetChainCreate ( chainID, enforceUniqueChID ); crRes = NULL; // new chain - new residue } if (crRes && (insCode[0]!=char(1))) { // If crRes is not NULL, neither the model nor chain were // changed. Check if this record still belongs to the // same residue. // All this does not work if insCode[0] is set to 1 // which indicates a special case of 'TER' card without // parameters. if ((seqNum!=crRes->seqNum) || strcmp(insCode,crRes->insCode) || strcmp(resName,crRes->name)) crRes = NULL; // the residue has to be changed } if (!crRes) { // either the chain or residue was changed -- get a new residue crRes = crChain->GetResidueCreate ( resName,seqNum,insCode, Flags & MMDBF_IgnoreDuplSeqNum ); if (!crRes) return Error_DuplicateSeqNum; } strcpy ( crRes->label_asym_id,label_asym_id ); strcpy ( crRes->label_comp_id,label_comp_id ); crRes->label_seq_id = label_seq_id; crRes->label_entity_id = label_entity_id; // now check if there is place in the Atom array if (index>atmLen) // there is no place, expand Atom by 1000 atom places at once ExpandAtomArray ( index+1000-atmLen ); nAtoms = IMax(nAtoms,index); // delete the to-be-replaced atom if there is any if (Replace && atom[index-1]) { delete atom[index-1]; atom[index-1] = NULL; } if (!atom[index-1]) { atom[index-1] = newAtom(); crRes->_AddAtom ( atom[index-1] ); atom[index-1]->index = index; } return Error_NoError; } void Root::ExpandAtomArray ( int inc ) { // Expands the Atom array by adding more inc positions. // The length of Atom array is increased unconditionally. PPAtom Atom1; int i; atmLen += inc; Atom1 = new PAtom[atmLen]; for (i=0;iatmLen) { atmLen = nAtoms+inc; Atom1 = new PAtom[atmLen]; for (i=0;iPDBASCIIDumpPS ( f ); // output cispep records for (i=0;iPDBASCIIDumpCP ( f ); SA .PDBASCIIDump ( f ); Footnote.PDBASCIIDump ( f ); cryst .PDBASCIIDump ( f ); SB .PDBASCIIDump ( f ); for (i=0;iPDBASCIIDump ( f ); SC.PDBASCIIDump ( f ); f.WriteLine ( pstr("END") ); } ERROR_CODE Root::WriteCIFASCII1 ( cpstr CIFLFName, io::GZ_MODE gzipMode ) { pstr FName; FName = getenv ( CIFLFName ); if (FName) return WriteCIFASCII ( FName,gzipMode ); else return Error_NoLogicalName; } ERROR_CODE Root::WriteCIFASCII ( cpstr CIFFileName, io::GZ_MODE gzipMode ) { int i; if (!CIF) CIF = new mmcif::Data(); CIF->SetStopOnWarning ( true ); CIF->SetPrintWarnings ( (Flags & MMDBF_PrintCIFWarnings)!=0 ); FType = MMDB_FILE_CIF; title.MakeCIF ( CIF ); i = 0; while (iMakePSCIF ( CIF ); cryst.MakeCIF ( CIF ); for (i=0;iMakeAtomCIF ( CIF ); CIF->Optimize(); CIF->WriteMMCIFData ( CIFFileName,gzipMode ); return Error_NoError; } PAtom Root::GetAtomI ( int index ) { if (index>nAtoms) return NULL; if (index<1) return NULL; if (!atom) return NULL; return atom[index-1]; } #define MMDBFLabel "**** This is MMDB binary file ****" #define Edition 1 ERROR_CODE Root::ReadMMDBF1 ( cpstr MMDBLFName, io::GZ_MODE gzipMode ) { pstr FName; FName = getenv ( MMDBLFName ); if (FName) return ReadCoorFile ( FName,gzipMode ); else return Error_NoLogicalName; } ERROR_CODE Root::ReadMMDBF ( cpstr MMDBRootName, io::GZ_MODE gzipMode ) { io::File f; ERROR_CODE rc; f.assign ( MMDBRootName,false,true,gzipMode ); FType = MMDB_FILE_Binary; if (f.reset(true)) { rc = ReadMMDBF ( f ); f.shut(); } else rc = Error_CantOpenFile; return rc; } ERROR_CODE Root::ReadMMDBF ( io::File & f ) { char Label[100]; byte Version; FType = MMDB_FILE_Binary; f.ReadFile ( Label,sizeof(MMDBFLabel) ); if (strncmp(Label,MMDBFLabel,sizeof(MMDBFLabel))) return Error_ForeignFile; f.ReadByte ( &Version ); if (Version>Edition) return Error_WrongEdition; read ( f ); return Error_NoError; } ERROR_CODE Root::WriteMMDBF1 ( cpstr MMDBLFName, io::GZ_MODE gzipMode ) { pstr FName; FName = getenv ( MMDBLFName ); if (FName) return WriteMMDBF ( FName,gzipMode ); else return Error_NoLogicalName; } /* ERROR_CODE Root::WriteMMDBF ( cpstr MMDBRootName, io::GZ_MODE gzipMode ) { io::File f; char Label[100]; byte Version=Edition; f.assign ( MMDBRootName,false,true,gzipMode ); FType = MMDB_FILE_Binary; if (f.rewrite()) { strcpy ( Label,MMDBFLabel ); f.WriteFile ( Label,sizeof(MMDBFLabel) ); f.WriteByte ( &Version ); write ( f ); f.shut(); } else return Error_CantOpenFile; return Error_NoError; } */ ERROR_CODE Root::WriteMMDBF ( cpstr MMDBRootName, io::GZ_MODE gzipMode ) { io::File f; f.assign ( MMDBRootName,false,true,gzipMode ); if (f.rewrite()) { WriteMMDBF ( f ); f.shut(); } else return Error_CantOpenFile; return Error_NoError; } void Root::WriteMMDBF ( io::File & f ) { char Label[100]; byte Version=Edition; FType = MMDB_FILE_Binary; strcpy ( Label,MMDBFLabel ); f.WriteFile ( Label,sizeof(MMDBFLabel) ); f.WriteByte ( &Version ); write ( f ); } pstr Root::GetEntryID() { return title.idCode; } void Root::SetEntryID ( const IDCode idCode ) { strcpy ( title.idCode,idCode ); } void Root::SetSyminfoLib ( cpstr syminfo_lib ) { cryst.SetSyminfoLib ( syminfo_lib ); } pstr Root::GetSyminfoLib() { return cryst.GetSyminfoLib(); } int Root::SetSpaceGroup ( cpstr spGroup ) { return cryst.SetSpaceGroup ( spGroup ); } pstr Root::GetSpaceGroup() { return cryst.GetSpaceGroup(); } pstr Root::GetSpaceGroupFix() { return cryst.GetSpaceGroupFix(); } void Root::GetAtomStatistics ( RAtomStat AS ) { int i; AS.Init(); for (i=0;iCalAtomStatistics ( AS ); AS.Finish(); } void Root::SetIgnoreSCALEi ( bool ignoreScalei ) { cryst.ignoreScalei = ignoreScalei; } void Root::SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { cryst.SetCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, cell_gamma,OrthCode ); } void Root::PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { cryst.PutCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, cell_gamma,OrthCode ); } int Root::GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & vol, int & OrthCode ) { if (cryst.WhatIsSet & CSET_CellParams) { cryst.GetCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, cell_gamma,vol ); OrthCode = cryst.NCode + 1; return 1; } else { cell_a = 0.0; cell_b = 0.0; cell_c = 0.0; cell_alpha = 0.0; cell_beta = 0.0; cell_gamma = 0.0; vol = 0.0; OrthCode = 0; return 0; } } int Root::GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & vols, int & OrthCode ) { if (cryst.WhatIsSet & CSET_CellParams) { cryst.GetRCell ( cell_as,cell_bs,cell_cs,cell_alphas,cell_betas, cell_gammas,vols ); OrthCode = cryst.NCode + 1; return 1; } else { cell_as = 0.0; cell_bs = 0.0; cell_cs = 0.0; cell_alphas = 0.0; cell_betas = 0.0; cell_gammas = 0.0; vols = 0.0; OrthCode = 0; return 0; } } int Root::GetNumberOfSymOps() { if (cryst.WhatIsSet & CSET_SpaceGroup) return cryst.GetNumberOfSymOps(); else return 0; } pstr Root::GetSymOp ( int Nop ) { return cryst.GetSymOp ( Nop ); } void Root::GetROMatrix ( mat44 & RO ) { Mat4Copy ( cryst.RO,RO ); } int Root::GetTMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c ) { // GetTMatrix(..) calculates and returns the coordinate transformation // matrix, which converts orthogonal coordinates according to // the symmetry operation number Nop and places them into unit cell // shifted by cellshift_a a's, cellshift_b b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. return cryst.GetTMatrix ( TMatrix,Nop,cellshift_a,cellshift_b, cellshift_c,NULL ); } int Root::GetUCTMatrix ( mat44 & TMatrix, int Nop, realtype x, realtype y, realtype z, int cellshift_a, int cellshift_b, int cellshift_c ) { // GetUCTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation number Nop. Translation // part of the resulting matrix is being chosen such that point // (x,y,z) has least distance to the center of primary (333) // unit cell, and then it is shifted by cellshift_a a's, // cellshift_b b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. return cryst.GetUCTMatrix ( TMatrix,Nop,x,y,z, cellshift_a,cellshift_b,cellshift_c, NULL ); } int Root::GetFractMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c ) { // GetFractMatrix(..) calculates and returns the coordinate // transformation matrix, which converts fractional coordinates // according to the symmetry operation number Nop and places them // into unit cell shifted by cellshift_a a's, cellshift_b b's and // cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. return cryst.GetFractMatrix ( TMatrix,Nop,cellshift_a,cellshift_b, cellshift_c,NULL ); } int Root::GetSymOpMatrix ( mat44 & TMatrix, int Nop ) { // // GetSymOpMatrix(..) returns the transformation matrix for // Nop-th symmetry operator in the space group // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // return cryst.GetSymOpMatrix ( TMatrix,Nop ); } // ------------- User-Defined Data ------------------------ int Root::RegisterUDInteger ( UDR_TYPE udr_type, cpstr UDDataID ) { return udRegister.RegisterUDInteger ( udr_type,UDDataID ); } int Root::RegisterUDReal ( UDR_TYPE udr_type, cpstr UDDataID ) { return udRegister.RegisterUDReal ( udr_type,UDDataID ); } int Root::RegisterUDString ( UDR_TYPE udr_type, cpstr UDDataID ) { return udRegister.RegisterUDString ( udr_type,UDDataID ); } int Root::GetUDDHandle ( UDR_TYPE udr_type, cpstr UDDataID ) { return udRegister.GetUDDHandle ( udr_type,UDDataID ); } // ---------------------------------------------------------- int Root::DeleteAllModels() { int i,k; Exclude = false; k = 0; for (i=0;i=1) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->GetNewChainID ( chID,length ); } return false; } // ------------------------------------------------------------- PMask Root::GetSelMask ( int selHnd ) { UNUSED_ARGUMENT(selHnd); return NULL; } // ------------------------------------------------------------- int Root::GetNofExpDataRecs() { return title.expData.Length(); } pstr Root::GetExpDataRec ( int recNo ) { PExpData expData; expData = PExpData(title.expData.GetContainerClass(recNo)); if (expData) return expData->Line; return NULL; } // ------------------------------------------------------------- int Root::GetNofMdlTypeRecs() { return title.mdlType.Length(); } pstr Root::GetMdlTypeRec ( int recNo ) { PMdlType mdlType; mdlType = PMdlType(title.mdlType.GetContainerClass(recNo)); if (mdlType) return mdlType->Line; return NULL; } // ------------------- Stream functions ---------------------- void Root::Copy ( PRoot MMDBRoot ) { int i; title.Copy ( &MMDBRoot->title ); cryst.Copy ( &MMDBRoot->cryst ); // It is important to copy atoms _before_ models, // residues and chains! Flags = MMDBRoot->Flags; nAtoms = MMDBRoot->nAtoms; atmLen = nAtoms; if (nAtoms>0) { atom = new PAtom[atmLen]; for (i=0;iatom[i]) { atom[i] = newAtom(); atom[i]->Copy ( MMDBRoot->atom[i] ); atom[i]->index = i+1; // the internal atom references are installed // by residue classes when they are copied in // model->chain below } else atom[i] = NULL; } nModels = MMDBRoot->nModels; if (nModels>0) { model = new PModel[nModels]; for (i=0;imodel[i]) { model[i] = newModel(); model[i]->SetMMDBManager ( PManager(this),i+1 ); model[i]->_copy ( MMDBRoot->model[i] ); } else model[i] = NULL; } } SA .Copy ( &MMDBRoot->SA ); Footnote.Copy ( &MMDBRoot->Footnote ); SB .Copy ( &MMDBRoot->SB ); SC .Copy ( &MMDBRoot->SC ); if (MMDBRoot->CIF) { CIF = new mmcif::Data; CIF->Copy ( MMDBRoot->CIF ); } } // ------- user-defined data handlers int Root::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_HIERARCHY) return UDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Root::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_HIERARCHY) return UDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Root::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_HIERARCHY) return UDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int Root::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_HIERARCHY) return UDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Root::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_HIERARCHY) return UDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Root::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_HIERARCHY) return UDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int Root::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_HIERARCHY) return UDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } pstr Root::GetStructureTitle ( pstr & L ) { return title.GetStructureTitle ( L ); } void Root::SetCompactBinary() { // leaves only coordinates in binary files int i; SetFlag ( MMDBF_MakeCompactBinary ); for (i=0;iSetCompactBinary(); } void Root::write ( io::RFile f ) { int i,k; byte Version=2; f.WriteByte ( &Version ); f.WriteWord ( &Flags ); f.WriteInt ( &nAtoms ); for (i=0;iwrite ( f ); } f.WriteInt ( &nModels ); for (i=0;iwrite ( f ); } if (Flags & MMDBF_MakeCompactBinary) { f.WriteTerLine ( title.idCode,false ); f.WriteReal ( &title.resolution ); title.title.write ( f ); cryst .write ( f ); } else { UDData::write ( f ); title .write ( f ); cryst .write ( f ); udRegister.write ( f ); DefPath .write ( f ); SA .write ( f ); Footnote.write ( f ); SB .write ( f ); SC .write ( f ); StreamWrite ( f,CIF ); } } void Root::read ( io::RFile f ) { int i,k; byte Version; ResetManager (); FreeFileMemory(); f.ReadByte ( &Version ); f.ReadWord ( &Flags ); // It is important to read atoms before models, // residues and chains! f.ReadInt ( &nAtoms ); atmLen = nAtoms; if (nAtoms>0) { atom = new PAtom[atmLen]; for (i=0;iread ( f ); // the internal atom references are installed // by residue classes when they are read in // model->chain below } else atom[i] = NULL; } } f.ReadInt ( &nModels ); if (nModels>0) { model = new PModel[nModels]; for (i=0;iSetMMDBManager ( PManager(this),0 ); model[i]->read ( f ); } else model[i] = NULL; } } if (Flags & MMDBF_MakeCompactBinary) { f.ReadTerLine ( title.idCode,false ); f.ReadReal ( &title.resolution ); title.title.read ( f ); cryst .read ( f ); } else { UDData::read ( f ); title .read ( f ); cryst .read ( f ); udRegister.read ( f ); DefPath .read ( f ); SA .read ( f ); Footnote.read ( f ); SB .read ( f ); SC .read ( f ); StreamRead ( f,CIF ); } } MakeStreamFunctions(Root) int isMMDBBIN ( cpstr FName, io::GZ_MODE gzipMode ) { io::File f; int rc; f.assign ( FName,false,true,gzipMode ); if (f.reset(true)) { rc = isMMDBBIN ( f ); f.shut(); } else rc = -1; return rc; } int isMMDBBIN ( io::RFile f ) { char Label[100]; byte Version; if (f.FileEnd()) return Error_EmptyFile; f.ReadFile ( Label,sizeof(MMDBFLabel) ); if (strncmp(Label,MMDBFLabel,sizeof(MMDBFLabel))) return 1; f.ReadByte ( &Version ); if (Version>Edition) return 2; else return 0; } int isPDB ( cpstr FName, io::GZ_MODE gzipMode, bool IgnoreBlankLines ) { io::File f; int rc; f.assign ( FName,false,false,gzipMode ); if (f.reset(true)) { // opening it in pseudo-binary mode helps reading various // line terminators for files coming from different platforms rc = isPDB ( f,IgnoreBlankLines ); f.shut(); } else rc = -1; return rc; } int isPDB ( io::RFile f, bool IgnoreBlankLines ) { char S[256]; int i; bool Done; if (f.FileEnd()) return Error_EmptyFile; do { Done = true; f.ReadLine ( S,sizeof(S)-1 ); if (IgnoreBlankLines) { i = 0; while (S[i] && (S[i]==' ')) i++; if (!S[i]) Done = false; } } while ((!f.FileEnd()) && (!Done)); PadSpaces ( S,80 ); if (!strncasecmp(S,"HEADER",6)) return 0; if (!strncasecmp(S,"OBSLTE",6)) return 0; if (!strncasecmp(S,"TITLE ",6)) return 0; if (!strncasecmp(S,"CAVEAT",6)) return 0; if (!strncasecmp(S,"COMPND",6)) return 0; if (!strncasecmp(S,"SOURCE",6)) return 0; if (!strncasecmp(S,"KEYWDS",6)) return 0; if (!strncasecmp(S,"EXPDTA",6)) return 0; if (!strncasecmp(S,"AUTHOR",6)) return 0; if (!strncasecmp(S,"REVDAT",6)) return 0; if (!strncasecmp(S,"SPRSDE",6)) return 0; if (!strncasecmp(S,"JRNL ",6)) return 0; if (!strncasecmp(S,"REMARK",6)) return 0; if (!strncasecmp(S,"DBREF ",6)) return 0; if (!strncasecmp(S,"SEQADV",6)) return 0; if (!strncasecmp(S,"SEQRES",6)) return 0; if (!strncasecmp(S,"MODRES",6)) return 0; if (!strncasecmp(S,"HET ",6)) return 0; if (!strncasecmp(S,"HETNAM",6)) return 0; if (!strncasecmp(S,"HETSYN",6)) return 0; if (!strncasecmp(S,"FORMUL",6)) return 0; if (!strncasecmp(S,"HELIX ",6)) return 0; if (!strncasecmp(S,"SHEET ",6)) return 0; if (!strncasecmp(S,"TURN ",6)) return 0; if (!strncasecmp(S,"SSBOND",6)) return 0; if (!strncasecmp(S,"LINK ",6)) return 0; if (!strncasecmp(S,"HYDBND",6)) return 0; if (!strncasecmp(S,"SLTBRG",6)) return 0; if (!strncasecmp(S,"CISPEP",6)) return 0; if (!strncasecmp(S,"SITE ",6)) return 0; if (!strncasecmp(S,"NUMMDL",6)) return 0; if (!strncasecmp(S,"CRYST1",6)) return 0; if (!strncasecmp(S,"CRYST ",6)) return 0; if (!strncasecmp(S,"ORIGX1",6)) return 0; if (!strncasecmp(S,"ORIGX2",6)) return 0; if (!strncasecmp(S,"ORIGX3",6)) return 0; if (!strncasecmp(S,"SCALE1",6)) return 0; if (!strncasecmp(S,"SCALE2",6)) return 0; if (!strncasecmp(S,"SCALE3",6)) return 0; if (!strncasecmp(S,"MTRIX1",6)) return 0; if (!strncasecmp(S,"MTRIX2",6)) return 0; if (!strncasecmp(S,"MTRIX3",6)) return 0; if (!strncasecmp(S,"TVECT ",6)) return 0; if (!strncasecmp(S,"MODEL ",6)) return 0; if (!strncasecmp(S,"ATOM ",6)) return 0; if (!strncasecmp(S,"SIGATM",6)) return 0; if (!strncasecmp(S,"ANISOU",6)) return 0; if (!strncasecmp(S,"SIGUIJ",6)) return 0; if (!strncasecmp(S,"TER ",6)) return 0; if (!strncasecmp(S,"HETATM",6)) return 0; if (!strncasecmp(S,"ENDMDL",6)) return 0; if (!strncasecmp(S,"CONECT",6)) return 0; if (!strncasecmp(S,"MASTER",6)) return 0; if (!strncasecmp(S,"END ",6)) return 0; if (!strncasecmp(S,"USER ",6)) return 0; return 1; } } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_cryst.cpp0000644000175000017500000017400013271367640016317 0ustar maartenmaarten// $Id: mmdb_cryst.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 21.11.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Cryst // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::CrystContainer ( container for cryst. data ) // ~~~~~~~~~ mmdb::NCSMatrix ( non-cryst. symm. matrix class ) // mmdb::TVect ( translation vector class ) // mmdb::Cryst ( MMDB cryst. section class ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include #include #include "mmdb_cryst.h" #include "mmdb_defs.h" #include "mmdb_cifdefs.h" namespace mmdb { // ============== CrystContainer ==================== PContainerClass CrystContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return ClassContainer::MakeContainerClass(ClassID); case ClassID_NCSMatrix : return new NCSMatrix(); case ClassID_TVect : return new TVect (); } } ERROR_CODE CrystContainer::AddMTRIXLine ( cpstr S ) { int i; ERROR_CODE RC; RC = Error_NCSM_WrongSerial; for (i=0;iConvertPDBASCII(S); if (RC==0) break; if (RC!=Error_NCSM_WrongSerial) break; } return RC; } MakeStreamFunctions(CrystContainer) // ================ NCSMatrix =================== NCSMatrix::NCSMatrix() : ContainerClass() { Init(); } NCSMatrix::NCSMatrix ( cpstr S ) : ContainerClass() { Init(); ConvertPDBASCII ( S ); } NCSMatrix::NCSMatrix ( io::RPStream Object ) : ContainerClass(Object) { Init(); } NCSMatrix::~NCSMatrix() {} void NCSMatrix::Init() { int i,j; serNum = -1; iGiven = -1; for (i=0;i<3;i++) { for (j=0;j<3;j++) m[i][j] = 0.0; m[i][i] = 1.0; v[i] = 0.0; } WhatIsSet = 0; // nothing is set } bool NCSMatrix::PDBASCIIDump1 ( io::RFile f ) { // makes the ASCII PDB MATRIXn lines if all // of them were set. char S[100]; int i,j; if ((WhatIsSet & NCSMSET_All)==NCSMSET_All) for (i=0;i<3;i++) { sprintf ( S,"MTRIX%1i %3i",i+1,serNum ); PadSpaces ( S,80 ); for (j=0;j<3;j++) PutRealF ( &(S[10+j*10]),m[i][j],10,6 ); PutRealF ( &(S[45]),v[i],10,5 ); if (iGiven) S[59] = '1'; f.WriteLine ( S ); } return true; // container should use this virtual } ERROR_CODE NCSMatrix::ConvertPDBASCII ( cpstr S ) { realtype m0,m1,m2,v0; int sN,iG; if (!(GetInteger(sN,&(S[7]) ,3 ) && GetReal (m0,&(S[10]),10) && GetReal (m1,&(S[20]),10) && GetReal (m2,&(S[30]),10) && GetReal (v0,&(S[45]),10))) return Error_NCSM_Unrecognized; if (S[59]=='1') iG = 1; else iG = 0; if (WhatIsSet & NCSMSET_All) { if (sN!=serNum) return Error_NCSM_WrongSerial; if (iG!=iGiven) return Error_NCSM_UnmatchIG; } if (!strncmp(S,"MTRIX1",6)) { if (WhatIsSet & NCSMSET_Matrix1) return Error_NCSM_AlreadySet; serNum = sN; iGiven = iG; m[0][0] = m0; m[0][1] = m1; m[0][2] = m2; v[0] = v0; WhatIsSet |= NCSMSET_Matrix1; } else if (!strncmp(S,"MTRIX2",6)) { if (WhatIsSet & NCSMSET_Matrix2) return Error_NCSM_AlreadySet; serNum = sN; iGiven = iG; m[1][0] = m0; m[1][1] = m1; m[1][2] = m2; v[1] = v0; WhatIsSet |= NCSMSET_Matrix2; } else if (!strncmp(S,"MTRIX3",6)) { if (WhatIsSet & NCSMSET_Matrix3) return Error_NCSM_AlreadySet; serNum = sN; iGiven = iG; m[2][0] = m0; m[2][1] = m1; m[2][2] = m2; v[2] = v0; WhatIsSet |= NCSMSET_Matrix3; } else return Error_WrongSection; return Error_NoError; } void NCSMatrix::MakeCIF ( mmcif::PData CIF, int N ) { mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_NCS_OPER,Loop ); if ((RC!=mmcif::CIFRC_Ok) || (N==0)) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_MATRIX11 ); Loop->AddLoopTag ( CIFTAG_MATRIX12 ); Loop->AddLoopTag ( CIFTAG_MATRIX13 ); Loop->AddLoopTag ( CIFTAG_VECTOR1 ); Loop->AddLoopTag ( CIFTAG_MATRIX21 ); Loop->AddLoopTag ( CIFTAG_MATRIX22 ); Loop->AddLoopTag ( CIFTAG_MATRIX23 ); Loop->AddLoopTag ( CIFTAG_VECTOR2 ); Loop->AddLoopTag ( CIFTAG_MATRIX31 ); Loop->AddLoopTag ( CIFTAG_MATRIX32 ); Loop->AddLoopTag ( CIFTAG_MATRIX33 ); Loop->AddLoopTag ( CIFTAG_VECTOR3 ); Loop->AddLoopTag ( CIFTAG_CODE ); } Loop->AddInteger ( serNum ); if (WhatIsSet & NCSMSET_Matrix1) { Loop->AddReal ( m[0][0] ); Loop->AddReal ( m[0][1] ); Loop->AddReal ( m[0][2] ); Loop->AddReal ( v[0] ); } else { Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); } if (WhatIsSet & NCSMSET_Matrix2) { Loop->AddReal ( m[1][0] ); Loop->AddReal ( m[1][1] ); Loop->AddReal ( m[1][2] ); Loop->AddReal ( v[1] ); } else { Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); } if (WhatIsSet & NCSMSET_Matrix3) { Loop->AddReal ( m[2][0] ); Loop->AddReal ( m[2][1] ); Loop->AddReal ( m[2][2] ); Loop->AddReal ( v[2] ); } else { Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); } if (iGiven==1) Loop->AddString ( pstr("generated") ); else Loop->AddNoData ( mmcif::CIF_NODATA_DOT ); } ERROR_CODE NCSMatrix::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; char Code[100]; ERROR_CODE rc; Loop = CIF->GetLoop ( CIFCAT_STRUCT_NCS_OPER ); if (!Loop) { n = -1; // signal to finish processing of this structure return Error_EmptyCIF; } if (n>=Loop->GetLoopLength()) { n = -1; return Error_EmptyCIF; } WhatIsSet = 0; rc = CIFGetInteger ( serNum,Loop,CIFTAG_ID,n ); if (rc!=Error_NoError) return rc; if (CIFGetString(Code,Loop,CIFTAG_CODE,n,sizeof(Code), pstr(""))) iGiven = MinInt4; else if (!strcasecmp(Code,"generated")) iGiven = 1; else iGiven = MinInt4; rc = CIFGetReal ( m[0][0],Loop,CIFTAG_MATRIX11,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( m[0][1],Loop,CIFTAG_MATRIX12,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( m[0][2],Loop,CIFTAG_MATRIX13,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( v[0] ,Loop,CIFTAG_VECTOR1 ,n ); if (rc!=Error_NoError) return rc; WhatIsSet |= NCSMSET_Matrix1; rc = CIFGetReal ( m[1][0],Loop,CIFTAG_MATRIX21,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( m[1][1],Loop,CIFTAG_MATRIX22,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( m[1][2],Loop,CIFTAG_MATRIX23,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( v[1] ,Loop,CIFTAG_VECTOR2 ,n ); if (rc!=Error_NoError) return rc; WhatIsSet |= NCSMSET_Matrix2; rc = CIFGetReal ( m[2][0],Loop,CIFTAG_MATRIX31,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( m[2][1],Loop,CIFTAG_MATRIX32,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( m[2][2],Loop,CIFTAG_MATRIX33,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal ( v[2] ,Loop,CIFTAG_VECTOR3 ,n ); if (rc!=Error_NoError) return rc; WhatIsSet |= NCSMSET_Matrix3; n++; return Error_NoError; } void NCSMatrix::SetNCSMatrix ( int serialNum, mat33 & ncs_m, vect3 & ncs_v, int i_Given ) { int i,j; serNum = serialNum; for (i=0;i<3;i++) { for (j=0;j<3;j++) m[i][j] = ncs_m[i][j]; v[i] = ncs_v[i]; } iGiven = i_Given; WhatIsSet |= NCSMSET_All; } void NCSMatrix::Copy ( PContainerClass NCSMatrix ) { int i,j; serNum = PNCSMatrix(NCSMatrix)->serNum; iGiven = PNCSMatrix(NCSMatrix)->iGiven; for (i=0;i<3;i++) { for (j=0;j<3;j++) m[i][j] = PNCSMatrix(NCSMatrix)->m[i][j]; v[i] = PNCSMatrix(NCSMatrix)->v[i]; } WhatIsSet = PNCSMatrix(NCSMatrix)->WhatIsSet; } void NCSMatrix::write ( io::RFile f ) { int i,j; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); f.WriteInt ( &iGiven ); for (i=0;i<3;i++) { for (j=0;j<3;j++) f.WriteReal ( &(m[i][j]) ); f.WriteReal ( &(v[i]) ); } f.WriteWord ( &WhatIsSet ); } void NCSMatrix::read ( io::RFile f ) { int i,j; byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); f.ReadInt ( &iGiven ); for (i=0;i<3;i++) { for (j=0;j<3;j++) f.ReadReal ( &(m[i][j]) ); f.ReadReal ( &(v[i]) ); } f.ReadWord ( &WhatIsSet ); } MakeStreamFunctions(NCSMatrix) // ================ TVect =================== TVect::TVect() : ContainerClass() { Init(); } TVect::TVect ( cpstr S ) : ContainerClass() { Init(); ConvertPDBASCII ( S ); } TVect::TVect ( io::RPStream Object ) : ContainerClass(Object) { Init(); } TVect::~TVect() { if (comment) delete[] comment; } void TVect::Init() { serNum = -1; t[0] = 0.0; t[1] = 0.0; t[2] = 0.0; comment = NULL; } void TVect::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB TVECT line number N sprintf ( S,"TVECT %3i",serNum ); PadSpaces ( S,80 ); PutRealF ( &(S[10]),t[0],10,5 ); PutRealF ( &(S[20]),t[1],10,5 ); PutRealF ( &(S[30]),t[2],10,5 ); if (comment) strncpy ( &(S[40]),comment,IMin(30,strlen(comment)) ); } ERROR_CODE TVect::ConvertPDBASCII ( cpstr S ) { GetInteger ( serNum ,&(S[7]) ,3 ); GetReal ( t[0] ,&(S[10]),10 ); GetReal ( t[1] ,&(S[20]),10 ); GetReal ( t[2] ,&(S[30]),10 ); CreateCopy ( comment,&(S[40]) ); return Error_NoError; } void TVect::MakeCIF ( mmcif::PData CIF, int N ) { mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_DATABASE_PDB_TVECT,Loop ); if ((RC!=mmcif::CIFRC_Ok) || (N==0)) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_VECTOR1 ); Loop->AddLoopTag ( CIFTAG_VECTOR2 ); Loop->AddLoopTag ( CIFTAG_VECTOR3 ); Loop->AddLoopTag ( CIFTAG_DETAILS ); } Loop->AddInteger ( serNum ); Loop->AddReal ( t[0] ); Loop->AddReal ( t[1] ); Loop->AddReal ( t[2] ); Loop->AddString ( comment ); } ERROR_CODE TVect::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; ERROR_CODE rc; Loop = CIF->GetLoop ( CIFCAT_DATABASE_PDB_TVECT ); if (!Loop) { n = -1; // signal to finish processing of this structure return Error_EmptyCIF; } if (n>=Loop->GetLoopLength()) { n = -1; return Error_EmptyCIF; } rc = CIFGetInteger(serNum,Loop,CIFTAG_ID,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal(t[0],Loop,CIFTAG_VECTOR1,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal(t[1],Loop,CIFTAG_VECTOR2,n ); if (rc!=Error_NoError) return rc; rc = CIFGetReal(t[2],Loop,CIFTAG_VECTOR3,n ); if (rc!=Error_NoError) return rc; Loop->GetString ( comment,CIFTAG_DETAILS,n,true ); n++; return Error_NoError; } void TVect::Copy ( PContainerClass TVect ) { int i; serNum = PTVect(TVect)->serNum; for (i=0;i<3;i++) t[i] = PTVect(TVect)->t[i]; CreateCopy ( comment,PTVect(TVect)->comment ); } void TVect::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); for (i=0;i<3;i++) f.WriteReal ( &(t[i]) ); f.CreateWrite ( comment ); } void TVect::read ( io::RFile f ) { int i; byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); for (i=0;i<3;i++) f.ReadReal ( &(t[i]) ); f.CreateRead ( comment ); } MakeStreamFunctions(TVect) // ===================== Cryst ======================= Cryst::Cryst() : io::Stream() { Init ( true ); } Cryst::Cryst ( io::RPStream Object ) : io::Stream(Object) { Init ( true ); } void Cryst::Init ( bool fullInit ) { int i,j,k; WhatIsSet = 0; // nothing is set a = 1.0; b = 1.0; c = 1.0; alpha = 90.0; beta = 90.0; gamma = 90.0; strcpy ( spaceGroup ,"" ); strcpy ( spaceGroupFix,"" ); Z = 1; CellCheck = CCHK_NoCell; for (i=0;i<3;i++) { for (j=0;j<3;j++) { o[i][j] = 0.0; s[i][j] = 0.0; for (k=0;k<6;k++) RR[k][i][j] = 0.0; } o[i][i] = 1.0; s[i][i] = 1.0; t[i] = 0.0; u[i] = 0.0; for (k=0;k<6;k++) RR[k][i][i] = 1.0; } for (i=0;i<4;i++) { for (j=0;j<4;j++) { RO [i][j] = 0.0; RF [i][j] = 0.0; ROU[i][j] = 0.0; RFU[i][j] = 0.0; } RO [i][i] = 1.0; RF [i][i] = 1.0; ROU[i][i] = 1.0; RFU[i][i] = 1.0; } Vol = 0.0; VolChk = 0.0; VolErr = 0.0; as = 1.0; bs = 1.0; cs = 1.0; alphas = 90.0; betas = 90.0; gammas = 90.0; for (k=0;k<6;k++) AC[k] = 0.0; NCode = 0; if (fullInit) { syminfo_lib = NULL; ignoreScalei = false; // flag to ignore SCALEi cards processSG = true; // flag to process space group at file read fixSpaceGroup = true; // flag to fix space group at file read } } Cryst::~Cryst() { FreeMemory(); if (syminfo_lib) delete[] syminfo_lib; } void Cryst::FreeMemory() { ncsMatrix.FreeContainer(); tVect .FreeContainer(); symOps .FreeMemory (); } void Cryst::Reset() { FreeMemory(); Init ( false ); } cpstr rhombohedral[] = { cpstr("R 3" ), cpstr("R 3" ), cpstr("R 3 2"), cpstr("R 3 2") }; cpstr short_mono[] = { cpstr("P 2" ), cpstr("P 21"), cpstr("C 2" ), cpstr("A 2" ), cpstr("B 2" ), cpstr("I 2" ) }; cpstr special[] = { cpstr("A1" ), cpstr("Hall: P 1 (-x,-1/2*y+1/2*z,1/2*y+1/2*z)" ), cpstr("C1211" ), cpstr("Hall: C 2y (x+1/4,y+1/4,z)" ), cpstr("C21" ), cpstr("Hall: C 2y (x+1/4,y+1/4,z)" ), cpstr("I1211" ), cpstr("Hall: C 2y (x+1/4,y+1/4,-x+z-1/4)" ), cpstr("I21" ), cpstr("Hall: C 2y (x+1/4,y+1/4,-x+z-1/4)" ), cpstr("P21212A"), cpstr("Hall: P 2 2ab (x+1/4,y+1/4,z)" ), cpstr("F422" ), cpstr("Hall: I 4 2 (1/2*x+1/2*y,-1/2*x+1/2*y,z)" ), cpstr("C4212" ), cpstr("Hall: P 4 2 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)") }; int Cryst::FixSpaceGroup() { // This function attempts to clean up the Brookhaven mess in space // group naming, by checking the space group symbol with cell // parameters. Returns: // // 0 - space group symbol is correct, spaceGroupFix receives // a copy of spaceGroup // 1 - space group symbol does not agree with cell parameters, // and fixed successfully. spaceGroupFix receives // the appropriate space group symbol // -1 - space group symbol does not agree with cell parameters, // however fix is not possible. spaceGroupFix receives // a copy of spaceGroup // -2 - any checks are not possible because cell parameters // are not found, spaceGroupFix receives a copy of // spaceGroup // realtype eps,m1,m2; SymGroup s; int i,k; char c; strcpy ( spaceGroupFix,spaceGroup ); if ((WhatIsSet & CSET_CellParams)!=CSET_CellParams) return -2; eps = 0.01; k = -1; for (i=0;(i<4) && (k<0);i++) if (!strcmp(spaceGroup,rhombohedral[i])) k = i; if (k>=0) { c = 'N'; if ((fabs(a-b)<=eps) && (fabs(alpha-90.0)<=eps) && (fabs(beta-90.0)<=eps) && (fabs(gamma-120.0)<=eps)) c = 'H'; else { m1 = (a+b+c)/3.0; m2 = (alpha+beta+gamma)/3.0; if ((fabs(a-m1)<=eps) && (fabs(b-m1)<=eps) && (fabs(c-m1)<=eps) && (fabs(alpha-m2)<=eps) && (fabs(beta-m2)<=eps) && (fabs(gamma-m2)<=eps)) c = 'R'; } if (c!=spaceGroup[0]) { if (c!='N') { spaceGroupFix[0] = c; return 1; } return -1; } return 0; } for (i=0;(i<6) && (k<0);i++) if (!strcmp(spaceGroup,short_mono[i])) k = i; if (k>=0) { if ((fabs(alpha-90.0)<=eps) && (fabs(gamma-90.0)<=eps)) { if (spaceGroup[0]=='B') return -1; sprintf ( spaceGroupFix,"%c 1 %s 1",spaceGroup[0], &(spaceGroup[2]) ); return 1; } if ((fabs(alpha-90.0)<=eps) && (fabs(beta-90.0)<=eps)) { if (spaceGroup[0]=='C') return -1; sprintf ( spaceGroupFix,"%c 1 1 %s",spaceGroup[0], &(spaceGroup[2]) ); return 1; } return -1; } i = 0; k = 0; while (spaceGroup[i]) { if (spaceGroup[i]!=' ') s[k++] = spaceGroup[i]; i++; } s[k] = char(0); k = -1; for (i=0;(i<16) && (k<0);i+=2) if (!strcmp(s,special[i])) k = i; if (k>=0) { strcpy ( spaceGroupFix,special[k+1] ); return 1; } return 0; } ERROR_CODE Cryst::ConvertPDBString ( pstr PDBString ) { // Interprets the ASCII PDB line and fills the corresponding fields. // Returns zero if the line was converted, otherwise returns a // non-negative value of Error_XXXX. // PDBString must be not shorter than 81 characters. PNCSMatrix ncsMtx; PTVect tV; ERROR_CODE RC; // pad input line with spaces, if necessary PadSpaces ( PDBString,80 ); if (!strncmp(PDBString,"CRYST",5)) { // Here we check for "CRYST" and not for "CRYST1" keyword. // As seems, people tend to not differentiating them. if (GetReal(a,&(PDBString[6]) ,9) && GetReal(b,&(PDBString[15]),9) && GetReal(c,&(PDBString[24]),9)) WhatIsSet |= CSET_CellParams1; if (GetReal(alpha,&(PDBString[33]),7) && GetReal(beta ,&(PDBString[40]),7) && GetReal(gamma,&(PDBString[47]),7)) WhatIsSet |= CSET_CellParams2; GetString ( spaceGroup,&(PDBString[55]),11 ); CutSpaces ( spaceGroup,SCUTKEY_BEGEND ); if (fixSpaceGroup) FixSpaceGroup(); else strcpy ( spaceGroupFix,spaceGroup ); if (spaceGroupFix[0] && processSG) { if (symOps.SetGroup(spaceGroupFix,syminfo_lib)==SYMOP_Ok) WhatIsSet |= CSET_SpaceGroup; } if (GetInteger(Z,&(PDBString[66]),4)) WhatIsSet |= CSET_ZValue; WhatIsSet &= 0xFBFF; if ((a*b*c*alpha*beta*gamma==0.0) || ((a==1.0) && (b==1.0) && (c==1.0) && (alpha==90.0) && (beta==90.0) && (gamma==90.0) && (!strcmp(spaceGroup,"P 1")))) { WhatIsSet &= ~(CSET_CellParams1 | CSET_CellParams2 | CSET_SpaceGroup); WhatIsSet |= CSET_DummyCell; } } else if (!strncmp(PDBString,"ORIGX1",6)) { if (GetReal(o[0][0],&(PDBString[10]),10) && GetReal(o[0][1],&(PDBString[20]),10) && GetReal(o[0][2],&(PDBString[30]),10) && GetReal(t[0] ,&(PDBString[45]),10)) WhatIsSet |= CSET_OrigMatrix1; } else if (!strncmp(PDBString,"ORIGX2",6)) { if (GetReal(o[1][0],&(PDBString[10]),10) && GetReal(o[1][1],&(PDBString[20]),10) && GetReal(o[1][2],&(PDBString[30]),10) && GetReal(t[1] ,&(PDBString[45]),10)) WhatIsSet |= CSET_OrigMatrix2; } else if (!strncmp(PDBString,"ORIGX3",6)) { if (GetReal(o[2][0],&(PDBString[10]),10) && GetReal(o[2][1],&(PDBString[20]),10) && GetReal(o[2][2],&(PDBString[30]),10) && GetReal(t[2] ,&(PDBString[45]),10)) WhatIsSet |= CSET_OrigMatrix3; } else if (!strncmp(PDBString,"SCALE1",6)) { if (GetReal(s[0][0],&(PDBString[10]),10) && GetReal(s[0][1],&(PDBString[20]),10) && GetReal(s[0][2],&(PDBString[30]),10) && GetReal(u[0] ,&(PDBString[45]),10)) WhatIsSet |= CSET_ScaleMatrix1; WhatIsSet &= 0xFBFF; CellCheck |= CCHK_Unchecked; } else if (!strncmp(PDBString,"SCALE2",6)) { if (GetReal(s[1][0],&(PDBString[10]),10) && GetReal(s[1][1],&(PDBString[20]),10) && GetReal(s[1][2],&(PDBString[30]),10) && GetReal(u[1] ,&(PDBString[45]),10)) WhatIsSet |= CSET_ScaleMatrix2; WhatIsSet &= 0xFBFF; CellCheck |= CCHK_Unchecked; } else if (!strncmp(PDBString,"SCALE3",6)) { if (GetReal(s[2][0],&(PDBString[10]),10) && GetReal(s[2][1],&(PDBString[20]),10) && GetReal(s[2][2],&(PDBString[30]),10) && GetReal(u[2] ,&(PDBString[45]),10)) WhatIsSet |= CSET_ScaleMatrix3; WhatIsSet &= 0xFBFF; CellCheck |= CCHK_Unchecked; } else if (!strncmp(PDBString,"MTRIX",5)) { RC = ncsMatrix.AddMTRIXLine ( PDBString ); if (RC==Error_NCSM_WrongSerial) { ncsMtx = new NCSMatrix(); RC = ncsMtx->ConvertPDBASCII ( PDBString ); if (RC==0) ncsMatrix.AddData ( ncsMtx ); else delete ncsMtx; } return RC; } else if (!strncmp(PDBString,"TVECT ",6)) { tV = new TVect(); RC = tV->ConvertPDBASCII(PDBString); if (RC==0) tVect.AddData ( tV ); else delete tV; return RC; } else return Error_WrongSection; return Error_NoError; } void Cryst::PDBASCIIDump ( io::RFile f ) { int i,j; char S[100]; if (WhatIsSet & (CSET_CrystCard | CSET_DummyCell)) { strcpy ( S,"CRYST1" ); PadSpaces ( S,80 ); if (WhatIsSet & CSET_CellParams1) { PutRealF ( &(S[6 ]),a,9,3 ); PutRealF ( &(S[15]),b,9,3 ); PutRealF ( &(S[24]),c,9,3 ); } if (WhatIsSet & CSET_CellParams2) { PutRealF ( &(S[33]),alpha,7,2 ); PutRealF ( &(S[40]),beta ,7,2 ); PutRealF ( &(S[47]),gamma,7,2 ); } if ((WhatIsSet & CSET_SpaceGroup) || (spaceGroup[0])) strncpy ( &(S[55]),spaceGroup,IMin(11,strlen(spaceGroup)) ); if (WhatIsSet & CSET_ZValue) PutInteger ( &(S[66]),Z,4 ); f.WriteLine ( S ); } if ((WhatIsSet & CSET_OrigMatrix)==CSET_OrigMatrix) for (i=0;i<3;i++) { sprintf ( S,"ORIGX%1i",i+1); PadSpaces ( S,80 ); for (j=0;j<3;j++) PutRealF ( &(S[10+j*10]),o[i][j],10,6 ); PutRealF ( &(S[45]),t[i],10,5 ); f.WriteLine ( S ); } if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) for (i=0;i<3;i++) { sprintf ( S,"SCALE%1i",i+1); PadSpaces ( S,80 ); for (j=0;j<3;j++) PutRealF ( &(S[10+j*10]),s[i][j],10,6 ); PutRealF ( &(S[45]),u[i],10,5 ); f.WriteLine ( S ); } ncsMatrix.PDBASCIIDump ( f ); tVect .PDBASCIIDump ( f ); } ERROR_CODE Cryst::GetCIF ( mmcif::PData CIF ) { mmcif::PStruct cifStruct; ERROR_CODE RC; WhatIsSet = 0; cifStruct = CIF->GetStructure ( CIFCAT_CELL ); if (cifStruct) { RC = CIFGetReal ( a,cifStruct,CIFTAG_LENGTH_A ); if (RC==Error_NoError) RC = CIFGetReal ( b,cifStruct,CIFTAG_LENGTH_B ); if (RC==Error_NoError) RC = CIFGetReal ( c,cifStruct,CIFTAG_LENGTH_C ); if (RC==Error_UnrecognizedReal) return RC; if (RC==Error_NoError) WhatIsSet |= CSET_CellParams1; RC = CIFGetReal ( alpha,cifStruct,CIFTAG_ANGLE_ALPHA ); if (RC==Error_NoError) RC = CIFGetReal ( beta,cifStruct,CIFTAG_ANGLE_BETA ); if (RC==Error_NoError) RC = CIFGetReal ( gamma,cifStruct,CIFTAG_ANGLE_GAMMA ); if (RC==Error_UnrecognizedReal) return RC; if (RC==Error_NoError) WhatIsSet |= CSET_CellParams2; RC = CIFGetInteger ( Z,cifStruct,CIFTAG_Z_PDB ); if (RC==Error_UnrecognizedReal) return RC; if (RC==Error_NoError) WhatIsSet |= CSET_ZValue; } cifStruct = CIF->GetStructure ( CIFCAT_SYMMETRY ); if (cifStruct) { CIFGetString ( spaceGroup,cifStruct,CIFTAG_SPACE_GROUP_NAME_H_M, sizeof(spaceGroup),pstr("") ); CutSpaces ( spaceGroup,SCUTKEY_BEGEND ); if (fixSpaceGroup) FixSpaceGroup(); else strcpy ( spaceGroupFix,spaceGroup ); /* if (fixSpaceGroup) { if (!strcasecmp(spaceGroup,"P 21")) strcpy ( spaceGroup,"P 1 21 1" ); else if (!strcasecmp(spaceGroup,"C 2")) strcpy ( spaceGroup,"C 1 2 1" ); } */ if (spaceGroupFix[0] && processSG) { if (symOps.SetGroup(spaceGroupFix,syminfo_lib)==SYMOP_Ok) WhatIsSet |= CSET_SpaceGroup; } } if ((a*b*c*alpha*beta*gamma==0.0) || ((a==1.0) && (b==1.0) && (c==1.0) && (alpha==90.0) && (beta==90.0) && (gamma==90.0) && (!strcmp(spaceGroup,"P 1")))) { WhatIsSet &= ~(CSET_CellParams1 | CSET_CellParams2 | CSET_SpaceGroup); WhatIsSet |= CSET_DummyCell; } cifStruct = CIF->GetStructure ( CIFCAT_DATABASE_PDB_MATRIX ); if (cifStruct) { RC = CIFGetReal ( o[0][0],cifStruct,CIFTAG_ORIGX11 ); if (RC==Error_NoError) RC = CIFGetReal ( o[0][1],cifStruct,CIFTAG_ORIGX12 ); if (RC==Error_NoError) RC = CIFGetReal ( o[0][2],cifStruct,CIFTAG_ORIGX13 ); if (RC==Error_NoError) RC = CIFGetReal ( o[1][0],cifStruct,CIFTAG_ORIGX21 ); if (RC==Error_NoError) RC = CIFGetReal ( o[1][1],cifStruct,CIFTAG_ORIGX22 ); if (RC==Error_NoError) RC = CIFGetReal ( o[1][2],cifStruct,CIFTAG_ORIGX23 ); if (RC==Error_NoError) RC = CIFGetReal ( o[2][0],cifStruct,CIFTAG_ORIGX31 ); if (RC==Error_NoError) RC = CIFGetReal ( o[2][1],cifStruct,CIFTAG_ORIGX32 ); if (RC==Error_NoError) RC = CIFGetReal ( o[2][2],cifStruct,CIFTAG_ORIGX33 ); if (RC==Error_NoError) RC = CIFGetReal ( t[0],cifStruct,CIFTAG_ORIGX_VECTOR1 ); if (RC==Error_NoError) RC = CIFGetReal ( t[1],cifStruct,CIFTAG_ORIGX_VECTOR2 ); if (RC==Error_NoError) RC = CIFGetReal ( t[2],cifStruct,CIFTAG_ORIGX_VECTOR3 ); if (RC!=Error_NoError) return RC; WhatIsSet |= CSET_OrigMatrix; } cifStruct = CIF->GetStructure ( CIFCAT_ATOM_SITES ); if (cifStruct) { RC = CIFGetReal ( s[0][0],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX11 ); if (RC==Error_NoError) RC = CIFGetReal(s[0][1],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX12); if (RC==Error_NoError) RC = CIFGetReal(s[0][2],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX13); if (RC==Error_NoError) RC = CIFGetReal(s[1][0],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX21); if (RC==Error_NoError) RC = CIFGetReal(s[1][1],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX22); if (RC==Error_NoError) RC = CIFGetReal(s[1][2],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX23); if (RC==Error_NoError) RC = CIFGetReal(s[2][0],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX31); if (RC==Error_NoError) RC = CIFGetReal(s[2][1],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX32); if (RC==Error_NoError) RC = CIFGetReal(s[2][2],cifStruct,CIFTAG_FRACT_TRANSF_MATRIX33); if (RC==Error_NoError) RC = CIFGetReal(u[0] ,cifStruct,CIFTAG_FRACT_TRANSF_VECTOR1 ); if (RC==Error_NoError) RC = CIFGetReal(u[1] ,cifStruct,CIFTAG_FRACT_TRANSF_VECTOR2 ); if (RC==Error_NoError) RC = CIFGetReal(u[2] ,cifStruct,CIFTAG_FRACT_TRANSF_VECTOR3 ); if (RC!=Error_NoError) return RC; WhatIsSet |= CSET_ScaleMatrix; } RC = ncsMatrix.GetCIF(CIF,ClassID_NCSMatrix); if (RC!=Error_NoError) return RC; RC = tVect.GetCIF(CIF,ClassID_TVect); return RC; } void Cryst::MakeCIF ( mmcif::PData CIF ) { mmcif::PStruct cifStruct; char S[200]; if (WhatIsSet & (CSET_CellParams1 | CSET_DummyCell)) { CIF->AddStructure ( CIFCAT_CELL,cifStruct ); cifStruct->PutReal ( a,CIFTAG_LENGTH_A,8 ); cifStruct->PutReal ( b,CIFTAG_LENGTH_B,8 ); cifStruct->PutReal ( c,CIFTAG_LENGTH_C,8 ); } if (WhatIsSet & (CSET_CellParams2 | CSET_DummyCell)) { CIF->AddStructure ( CIFCAT_CELL,cifStruct ); cifStruct->PutReal ( alpha,CIFTAG_ANGLE_ALPHA,8 ); cifStruct->PutReal ( beta ,CIFTAG_ANGLE_BETA, 8 ); cifStruct->PutReal ( gamma,CIFTAG_ANGLE_GAMMA,8 ); } if ((WhatIsSet & (CSET_SpaceGroup | CSET_DummyCell)) || (spaceGroup[0])) CIF->PutString ( strcpy_cs(S,spaceGroup),CIFCAT_SYMMETRY, CIFTAG_SPACE_GROUP_NAME_H_M ); if (WhatIsSet & (CSET_ZValue | CSET_DummyCell)) CIF->PutInteger ( Z,CIFCAT_CELL,CIFTAG_Z_PDB ); if ((WhatIsSet & CSET_OrigMatrix)==CSET_OrigMatrix) { CIF->AddStructure ( CIFCAT_DATABASE_PDB_MATRIX,cifStruct ); cifStruct->PutReal ( o[0][0],CIFTAG_ORIGX11 ,8 ); cifStruct->PutReal ( o[0][1],CIFTAG_ORIGX12 ,8 ); cifStruct->PutReal ( o[0][2],CIFTAG_ORIGX13 ,8 ); cifStruct->PutReal ( o[1][0],CIFTAG_ORIGX21 ,8 ); cifStruct->PutReal ( o[1][1],CIFTAG_ORIGX22 ,8 ); cifStruct->PutReal ( o[1][2],CIFTAG_ORIGX23 ,8 ); cifStruct->PutReal ( o[2][0],CIFTAG_ORIGX31 ,8 ); cifStruct->PutReal ( o[2][1],CIFTAG_ORIGX32 ,8 ); cifStruct->PutReal ( o[2][2],CIFTAG_ORIGX33 ,8 ); cifStruct->PutReal ( t[0] ,CIFTAG_ORIGX_VECTOR1,8 ); cifStruct->PutReal ( t[1] ,CIFTAG_ORIGX_VECTOR2,8 ); cifStruct->PutReal ( t[2] ,CIFTAG_ORIGX_VECTOR3,8 ); } if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) { CIF->AddStructure ( CIFCAT_ATOM_SITES,cifStruct ); cifStruct->PutReal ( s[0][0],CIFTAG_FRACT_TRANSF_MATRIX11,8 ); cifStruct->PutReal ( s[0][1],CIFTAG_FRACT_TRANSF_MATRIX12,8 ); cifStruct->PutReal ( s[0][2],CIFTAG_FRACT_TRANSF_MATRIX13,8 ); cifStruct->PutReal ( s[1][0],CIFTAG_FRACT_TRANSF_MATRIX21,8 ); cifStruct->PutReal ( s[1][1],CIFTAG_FRACT_TRANSF_MATRIX22,8 ); cifStruct->PutReal ( s[1][2],CIFTAG_FRACT_TRANSF_MATRIX23,8 ); cifStruct->PutReal ( s[2][0],CIFTAG_FRACT_TRANSF_MATRIX31,8 ); cifStruct->PutReal ( s[2][1],CIFTAG_FRACT_TRANSF_MATRIX32,8 ); cifStruct->PutReal ( s[2][2],CIFTAG_FRACT_TRANSF_MATRIX33,8 ); cifStruct->PutReal ( u[0] ,CIFTAG_FRACT_TRANSF_VECTOR1 ,8 ); cifStruct->PutReal ( u[1] ,CIFTAG_FRACT_TRANSF_VECTOR2 ,8 ); cifStruct->PutReal ( u[2] ,CIFTAG_FRACT_TRANSF_VECTOR3 ,8 ); } ncsMatrix.MakeCIF ( CIF ); tVect .MakeCIF ( CIF ); } cpstr OrthCode[6] = { cpstr("A/X0, C*/Z0"), // (standard brookhaven) cpstr("B/X0, A*/Z0"), cpstr("C/X0, B*/Z0"), cpstr("HEX A+B/X0, C*/Z0"), cpstr("A*/X0, C/Z0 (rollett)"), cpstr("A/X0, B*/Y0") }; cpstr getOrthCodeName ( int NCode ) { if ((NCode>0) && (NCode<=6)) return OrthCode[NCode-1]; return cpstr("CUSTOM"); } void Cryst::CalcCoordTransforms() { realtype rChk1,rChk2,Fac; int i,j,k; WhatIsSet &= ~CSET_Transforms; // clear the flag if ((WhatIsSet & CSET_CellParams)==CSET_CellParams) { // The 'cryst1' card was supplied. Calculate // standard orthogonalizations. CalcOrthMatrices(); if (NCode<0) NCode = 0; for (i=0;i<3;i++) { for (j=0;j<3;j++) RO[i][j] = RR[NCode][i][j]; RO[i][3] = 0.0; RO[3][i] = 0.0; } RO[3][3] = 1.0; Mat4Inverse ( RO,RF ); WhatIsSet |= CSET_Transforms; if (ignoreScalei) CellCheck = CCHK_Ok; else if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) { // All 'scalei' cards were supplied. Calculate // rotation and translation matrices and check // if they are in consistence with the cell. for (i=0;i<3;i++) { for (j=0;j<3;j++) RF[i][j] = s[i][j]; RF[i][3] = u[i]; RF[3][i] = 0.0; } RF[3][3] = 1.0; Mat4Inverse ( RF,RO ); // Find orthogonalisation type VolChk = RO[0][0]*(RO[1][1]*RO[2][2] - RO[1][2]*RO[2][1]) + RO[0][1]*(RO[1][2]*RO[2][0] - RO[1][0]*RO[2][2]) + RO[0][2]*(RO[1][0]*RO[2][1] - RO[1][1]*RO[2][0]); CellCheck = CCHK_Ok; if (Vol>0.0) { VolErr = fabs(VolChk-Vol)/Vol; if (VolErr>0.02) CellCheck |= CCHK_Error; else if (VolErr>0.1) CellCheck |= CCHK_Disagreement; } else CellCheck |= CCHK_NoCell; // try to find NCode NCode = -1; for (k=0;(k<6) && (NCode<0);k++) { NCode = k; for (i=0;i<3;i++) for (j=0;j<3;j++) { rChk1 = RO[i][j] + RR[k][i][j]; rChk2 = RO[i][j] - RR[k][i][j]; if (fabs(rChk1)>=0.1) { if (fabs(rChk2/rChk1)>0.01) NCode = -1; } } } // Correct inaccuracy of SCALEi input due to FORMAT, // replace RF,RO with RR[NCode][][] if possible. if (NCode>=0) { for (i=0;i<3;i++) for (j=0;j<3;j++) RO[i][j] = RR[NCode][i][j]; Mat4Inverse ( RO,RF ); } else CellCheck |= CCHK_NoOrthCode; if ((u[0]!=0.0) || (u[1]!=0.0) || (u[2]!=0.0)) CellCheck |= CCHK_Translations; } // Generate ROU and RFU for AnisoU stuff RFU[3][3] = 1.0; for (i=0;i<3;i++) { Fac = sqrt(RF[i][0]*RF[i][0] + RF[i][1]*RF[i][1] + RF[i][2]*RF[i][2]); RFU[i][0] = RF[i][0]/Fac; RFU[i][1] = RF[i][1]/Fac; RFU[i][2] = RF[i][2]/Fac; RFU[i][3] = 0.0; RFU[3][i] = 0.0; } RFU[3][3] = 1.0; Mat4Inverse ( RFU,ROU ); } else CellCheck |= CCHK_NoCell; } void Cryst::RWBROOKReadPrintout() { int i,j; if ((WhatIsSet & CSET_CellParams)==CSET_CellParams) { printf ( " MATRICES DERIVED FROM CRYST1" " CARD IN COORDINATE FILE\n\n\n" " RF " " RO\n\n" ); for (i=0;i<4;i++) { printf ( " " ); for (j=0;j<4;j++) printf ( "%8.3f",RF[i][j] ); printf ( " " ); for (j=0;j<4;j++) printf ( "%8.3f",RO[i][j] ); printf ( "\n" ); } printf ( "\n" ); } else printf ( "\n $WARNING: NO CRYST CARDS READ$\n" ); if ((WhatIsSet & CSET_ScaleMatrix)!=CSET_ScaleMatrix) printf ( "\n $WARNING: NO SCALE CARDS READ$\n" ); } void Cryst::CalcOrthMatrices() { // Calculates matrices for standard orthogonalizations // and the cell volume. // The matrices are stored in array RR realtype Conv,Alph,Bet,Gamm,Sum,V; realtype sinA,cosA,sinB,cosB,sinG,cosG; realtype sinAS,cosAS,sinBS,cosBS,sinGS,cosGS; int i,j,k; if ((WhatIsSet & CSET_CellParams)!=CSET_CellParams) return; Conv = Pi/180.0; Alph = alpha*Conv; Bet = beta *Conv; Gamm = gamma*Conv; Sum = (Alph+Bet+Gamm)*0.5; V = sqrt(sin(Sum-Alph)*sin(Sum-Bet)*sin(Sum-Gamm)*sin(Sum)); Vol = 2.0*a*b*c*V; // Precaution measure for erratic use of the library if ((fabs(Alph)<1.0e-6) || (fabs(Bet)<1.0e-6) || (fabs(Gamm)<1.0e-6)) { as = 0.0; bs = 0.0; cs = 0.0; alphas = 0.0; betas = 0.0; gammas = 0.0; for (k=0;k<6;k++) { AC[k] = 0.0; for (i=0;i<3;i++) { for (j=0;j<3;j++) RR[k][i][j] = 0.0; RR[k][i][i] = 1.0; } } return; } sinA = sin(Alph); cosA = cos(Alph); sinB = sin(Bet); cosB = cos(Bet); sinG = sin(Gamm); cosG = cos(Gamm); cosAS = (cosG*cosB-cosA) / (sinB*sinG); sinAS = sqrt(1.0-cosAS*cosAS); cosBS = (cosA*cosG-cosB) / (sinA*sinG); sinBS = sqrt(1.0-cosBS*cosBS); cosGS = (cosA*cosB-cosG) / (sinA*sinB); sinGS = sqrt(1.0-cosGS*cosGS); as = b*c*sinA/Vol; bs = c*a*sinB/Vol; cs = a*b*sinG/Vol; alphas = atan2(sinAS,cosAS)/Conv; betas = atan2(sinBS,cosBS)/Conv; gammas = atan2(sinGS,cosGS)/Conv; // ---- Set useful things for calculating dstar AC[0] = as*as; AC[1] = bs*bs; AC[2] = cs*cs; AC[3] = 2.0*bs*cs*cosAS; AC[4] = 2.0*cs*as*cosBS; AC[5] = 2.0*as*bs*cosGS; // ---- Zero matrices for (k=0;k<6;k++) for (i=0;i<3;i++) for (j=0;j<3;j++) RR[k][i][j] = 0.0; // ---- Calculate matrices // ---- XO along a Zo along c* RR[0][0][0] = a; RR[0][0][1] = b*cosG; RR[0][0][2] = c*cosB; RR[0][1][1] = b*sinG; RR[0][1][2] = -c*sinB*cosAS; RR[0][2][2] = c*sinB*sinAS; // ---- XO along b Zo along a* RR[1][0][0] = a*cosG; RR[1][0][1] = b; RR[1][0][2] = c*cosA; RR[1][1][0] = -a*sinG*cosBS; RR[1][1][2] = c*sinA; RR[1][2][0] = a*sinG*sinBS; // ---- XO along c Zo along b* RR[2][0][0] = a*cosB; RR[2][0][1] = b*cosA; RR[2][0][2] = c; RR[2][1][0] = a*sinB; RR[2][1][1] = -b*sinA*cosGS; RR[2][2][1] = b*sinA*sinGS; // ---- trigonal only - XO along a+b YO alon a-b Zo along c* RR[3][0][0] = a/2.0; RR[3][0][1] = a/2.0; RR[3][1][0] = -a*sinG; RR[3][1][1] = a*sinG; RR[3][2][2] = c; // ---- XO along a*, ZO along c RR[4][0][0] = a*sinB*sinGS; RR[4][1][0] = -a*sinB*cosGS; RR[4][1][1] = b*sinA; RR[4][2][0] = a*cosB; RR[4][2][1] = b*cosA; RR[4][2][2] = c; // ---- Grr*! to Gerard Bricogne - his setting for P1 in SKEW. // XO along a, Y0 along b* RR[5][0][0] = a; RR[5][0][1] = b*cosG; RR[5][0][2] = c*cosB; RR[5][1][1] = b*sinG*sinAS; RR[5][2][1] = -b*sinG*cosAS; RR[5][2][2] = c*sinB; } bool Cryst::areMatrices() { // returns true if the orthogonal-to-fractional and // fractional-to-orthogonal matrices are defined return (WhatIsSet & CSET_Transforms)!=0x0000; } bool Cryst::Frac2Orth ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ) { if (areMatrices()) { xx = RO[0][0]*x + RO[0][1]*y + RO[0][2]*z + RO[0][3]; yy = RO[1][0]*x + RO[1][1]*y + RO[1][2]*z + RO[1][3]; zz = RO[2][0]*x + RO[2][1]*y + RO[2][2]*z + RO[2][3]; return true; } else { xx = x; yy = y; zz = z; return false; } } bool Cryst::Orth2Frac ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ) { if (areMatrices()) { xx = RF[0][0]*x + RF[0][1]*y + RF[0][2]*z + RF[0][3]; yy = RF[1][0]*x + RF[1][1]*y + RF[1][2]*z + RF[1][3]; zz = RF[2][0]*x + RF[2][1]*y + RF[2][2]*z + RF[2][3]; return true; } else { xx = x; yy = y; zz = z; return false; } } bool Cryst::Frac2Orth ( mat44 & F, mat44 & T ) { mat44 A; if (areMatrices()) { Mat4Mult ( A,F,RF ); Mat4Mult ( T,RO,A ); return true; } else { Mat4Init ( T ); return false; } } bool Cryst::Orth2Frac ( mat44 & T, mat44 & F ) { mat44 A; if (areMatrices()) { Mat4Mult ( A,T,RO ); Mat4Mult ( F,RF,A ); return true; } else { Mat4Init ( F ); return false; } } int Cryst::GetNumberOfSymOps() { return symOps.GetNofSymOps(); } pstr Cryst::GetSymOp ( int Nop ) { return symOps.GetSymOp ( Nop ); } int Cryst::GetTMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c, PSymOps symOpers ) { // // GetTMatrix(..) calculates and returns the coordinate transformation // matrix, which converts orthogonal coordinates according to the // symmetry operation Nop and places them into unit cell shifted by // cellshift_a a's, cellshift_b b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // mat44 fm; int i,j,k; if (cellshift_a<=-MaxInt4) { k = GetFractMatrix ( fm,Nop,0,0,0,symOpers ); fm[0][3] = frac(fm[0][3]); fm[1][3] = frac(fm[1][3]); fm[2][3] = frac(fm[2][3]); } else k = GetFractMatrix ( fm,Nop,cellshift_a,cellshift_b,cellshift_c, symOpers ); if (k) { Mat4Init ( TMatrix ); return k; } // transformation back to orthogonal coordinates for (i=0;i<3;i++) { for (j=0;j<4;j++) { TMatrix[i][j] = 0.0; for (k=0;k<3;k++) TMatrix[i][j] += RO[i][k]*fm[k][j]; } TMatrix[i][3] += RO[i][3]; } TMatrix[3][0] = 0.0; TMatrix[3][1] = 0.0; TMatrix[3][2] = 0.0; TMatrix[3][3] = 1.0; return 0; } int Cryst::GetUCTMatrix ( mat44 & TMatrix, int Nop, realtype x, realtype y, realtype z, int cellshift_a, int cellshift_b, int cellshift_c, PSymOps symOpers ) { // // GetUCTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation Nop. Translation part of // the matrix is being chosen such that point (x,y,z) has least // distance to the center of primary (333) unit cell, and then // it is shifted by cellshift_a a's, cellshift_b b's and // cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // mat44 fm,tm; vect3 ft; realtype x0,y0,z0, dx,dy,dz, d,d0; int i,j,k, ic,jc,kc; k = GetFractMatrix ( fm,Nop,0,0,0,symOpers ); if (k) { Mat4Init ( TMatrix ); return k; } fm[0][3] = frac(fm[0][3]) + cellshift_a; fm[1][3] = frac(fm[1][3]) + cellshift_b; fm[2][3] = frac(fm[2][3]) + cellshift_c; Frac2Orth ( cellshift_a+0.5,cellshift_b+0.5,cellshift_c+0.5, x0,y0,z0 ); // transformation back to orthogonal coordinates for (i=0;i<3;i++) for (j=0;j<3;j++) { tm[i][j] = 0.0; for (k=0;k<3;k++) tm[i][j] += RO[i][k]*fm[k][j]; } tm[3][0] = 0.0; tm[3][1] = 0.0; tm[3][2] = 0.0; tm[3][3] = 1.0; d0 = MaxReal; for (ic=-3;ic<3;ic++) for (jc=-3;jc<3;jc++) for (kc=-3;kc<3;kc++) { ft[0] = fm[0][3] + ic; ft[1] = fm[1][3] + jc; ft[2] = fm[2][3] + kc; for (i=0;i<3;i++) { tm[i][3] = 0.0; for (k=0;k<3;k++) tm[i][3] += RO[i][k]*ft[k]; tm[i][3] += RO[i][3]; } dx = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3] - x0; dy = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3] - y0; dz = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3] - z0; d = dx*dx + dy*dy + dz*dz; if (dGetTMatrix ( tm,Nop ); else k = symOps.GetTMatrix ( tm,Nop ); if (!k) { if (!areMatrices()) k = 2; if (!isCellParameters()) k = 3; } else k = 1; if (k) { Mat4Init ( TMatrix ); return k; } // transformation to fractional coordinates + symmetry operation for (i=0;i<3;i++) { for (j=0;j<4;j++) { TMatrix[i][j] = 0.0; for (k=0;k<3;k++) TMatrix[i][j] += tm[i][k]*RF[k][j]; } TMatrix[i][3] += tm[i][3]; // symmetry operation shift } // cell shift TMatrix[0][3] += cellshift_a; TMatrix[1][3] += cellshift_b; TMatrix[2][3] += cellshift_c; TMatrix[3][0] = 0.0; TMatrix[3][1] = 0.0; TMatrix[3][2] = 0.0; TMatrix[3][3] = 1.0; return 0; } int Cryst::GetSymOpMatrix ( mat44 & TMatrix, int Nop ) { // // GetSymOpMatrix(..) returns the transformation matrix for // Nop-th symmetry operator in the space group // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // return symOps.GetTMatrix ( TMatrix,Nop ); } bool Cryst::Cryst2Orth ( rvector U ) { mat33 A,AT,Tmp,TmpMat; realtype BB; int i,j,k; if (areMatrices()) { Tmp[0][0] = U[0]; Tmp[1][1] = U[1]; Tmp[2][2] = U[2]; Tmp[0][1] = U[3]; Tmp[1][0] = U[3]; Tmp[0][2] = U[4]; Tmp[2][0] = U[4]; Tmp[1][2] = U[5]; Tmp[2][1] = U[5]; for (i=0;i<3;i++) for (j=0;j<3;j++) { A [j][i] = ROU[j][i]; AT[i][j] = ROU[j][i]; } // TmpMat = Tmp*AT for (i=0;i<3;i++) for (j=0;j<3;j++) { BB = 0.0; for (k=0;k<3;k++) BB += Tmp[i][k]*AT[k][j]; TmpMat[i][j] = BB; } // Tmp = A*TmpMat for (i=0;i<3;i++) for (j=0;j<3;j++) { BB = 0.0; for (k=0;k<3;k++) BB += A[i][k]*TmpMat[k][j]; Tmp[i][j] = BB; } U[0] = Tmp[0][0]; U[1] = Tmp[1][1]; U[2] = Tmp[2][2]; U[3] = Tmp[0][1]; U[4] = Tmp[0][2]; U[5] = Tmp[1][2]; return true; } return false; } bool Cryst::Orth2Cryst ( rvector U ) { mat33 A,AT,Tmp,TmpMat; realtype BB; int i,j,k; if (areMatrices()) { Tmp[0][0] = U[0]; Tmp[1][1] = U[1]; Tmp[2][2] = U[2]; Tmp[0][1] = U[3]; Tmp[1][0] = U[3]; Tmp[0][2] = U[4]; Tmp[2][0] = U[4]; Tmp[1][2] = U[5]; Tmp[2][1] = U[5]; for (i=0;i<3;i++) for (j=0;j<3;j++) { A [j][i] = RFU[j][i]; AT[i][j] = RFU[j][i]; } // TmpMat = Tmp*AT for (i=0;i<3;i++) for (j=0;j<3;j++) { BB = 0.0; for (k=0;k<3;k++) BB += Tmp[i][k]*AT[k][j]; TmpMat[i][j] = BB; } // Tmp = A*TmpMat for (i=0;i<3;i++) for (j=0;j<3;j++) { BB = 0.0; for (k=0;k<3;k++) BB += A[i][k]*TmpMat[k][j]; Tmp[i][j] = BB; } U[0] = Tmp[0][0]; U[1] = Tmp[1][1]; U[2] = Tmp[2][2]; U[3] = Tmp[0][1]; U[4] = Tmp[0][2]; U[5] = Tmp[1][2]; return true; } return false; } void Cryst::SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { // this function should be used for changing the cell parameters int i,j; if ((cell_a>0.0) && (cell_b>0.0) && (cell_c>0.0) && (cell_alpha!=0.0) && (cell_beta!=0.0) && (cell_gamma!=0.0)) { if (OrthCode>0) NCode = OrthCode-1; else NCode = 0; a = cell_a; b = cell_b; c = cell_c; alpha = cell_alpha; beta = cell_beta; gamma = cell_gamma; WhatIsSet |= CSET_CellParams; // calculate matrices for (i=0;i<4;i++) { for (j=0;j<4;j++) { RO [i][j] = 0.0; RF [i][j] = 0.0; ROU[i][j] = 0.0; RFU[i][j] = 0.0; } RO [i][i] = 1.0; RF [i][i] = 1.0; ROU[i][i] = 1.0; RFU[i][i] = 1.0; } CalcCoordTransforms(); if (!(CellCheck & CCHK_NoOrthCode)) { for (i=0;i<3;i++) { for (j=0;j<3;j++) RO[i][j] = RR[NCode][i][j]; RO[i][3] = 0.0; RO[3][i] = 0.0; } RO[3][3] = 1.0; Mat4Inverse ( RO,RF ); } WhatIsSet |= CSET_Transforms; } else WhatIsSet &= ~(CSET_CellParams | CSET_Transforms); } void Cryst::SetSyminfoLib ( cpstr syminfoLib ) { CreateCopy ( syminfo_lib,syminfoLib ); } pstr Cryst::GetSyminfoLib() { return syminfo_lib; } int Cryst::SetSpaceGroup ( cpstr spGroup ) { // This function does not attempt to fix the space group int RC,l; RC = SYMOP_UnknownSpaceGroup; WhatIsSet &= ~CSET_SpaceGroup; if (spGroup) { if (spGroup[0]) { l = IMin ( strlen(spGroup),sizeof(spaceGroup)-1 ); strcpy_ncss ( spaceGroup,spGroup,l ); strcpy ( spaceGroupFix,spaceGroup ); if (spaceGroup[0]) { RC = symOps.SetGroup ( spaceGroup,syminfo_lib ); // RC = SymOps.SetGroup ( spGroup,syminfo_lib ); // strncpy ( spaceGroup,spGroup,l ); // spaceGroup[l] = char(0); if (RC==SYMOP_Ok) WhatIsSet |= CSET_SpaceGroup; } } } return RC; } void Cryst::PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { // this function should be used for setting the cell parameters int i,j; if ((cell_a!=0.0) || (OrthCode>0)) { a = cell_a; b = cell_b; c = cell_c; alpha = cell_alpha; beta = cell_beta; gamma = cell_gamma; WhatIsSet |= CSET_CellParams; } if (OrthCode>0) { // calculate matrices NCode = OrthCode-1; CalcOrthMatrices(); for (i=0;i<3;i++) { for (j=0;j<3;j++) RO[i][j] = RR[NCode][i][j]; RO[i][3] = 0.0; RO[3][i] = 0.0; } RO[3][3] = 1.0; Mat4Inverse ( RO,RF ); WhatIsSet |= CSET_Transforms; } else WhatIsSet &= ~CSET_Transforms; for (i=0;i<3;i++) { for (j=0;j<3;j++) s[i][j] = RF[i][j]; u[i] = RF[i][3]; } WhatIsSet |= CSET_ScaleMatrix; } bool Cryst::isScaleMatrix() { return ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix); } bool Cryst::isCellParameters() { return ((WhatIsSet & CSET_CellParams)==CSET_CellParams); } bool Cryst::isNCSMatrix() { return (ncsMatrix.Length()>0); } int Cryst::GetNumberOfNCSMatrices() { return ncsMatrix.Length(); } int Cryst::GetNumberOfNCSMates() { // Returns the number of NCS mates not given in the file (iGiven==0) int i,l,iG; PNCSMatrix NCSM; iG = 0; l = ncsMatrix.Length(); for (i=0;iiGiven) iG++; } } return iG; } bool Cryst::GetNCSMatrix ( int NCSMatrixNo, mat33 & ncs_m, vect3 & ncs_v ) { int i,j; PNCSMatrix NCSM; NCSM = PNCSMatrix(ncsMatrix.GetContainerClass(NCSMatrixNo)); if (NCSM) { for (i=0;i<3;i++) { for (j=0;j<3;j++) ncs_m[i][j] = NCSM->m[i][j]; ncs_v[i] = NCSM->v[i]; } return true; } return false; } bool Cryst::GetNCSMatrix ( int NCSMatrixNo, mat44 & ncs_m, int & iGiven ) { int i,j; PNCSMatrix NCSM; NCSM = PNCSMatrix(ncsMatrix.GetContainerClass(NCSMatrixNo)); if (NCSM) { for (i=0;i<3;i++) { for (j=0;j<3;j++) ncs_m[i][j] = NCSM->m[i][j]; ncs_m[i][3] = NCSM->v[i]; } ncs_m[3][0] = 0.0; ncs_m[3][1] = 0.0; ncs_m[3][2] = 0.0; ncs_m[3][3] = 1.0; iGiven = NCSM->iGiven; return true; } else { for (i=0;i<4;i++) { for (j=0;j<4;j++) ncs_m[i][j] = 0.0; ncs_m[i][i] = 1.0; } return false; } } int Cryst::AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ) { PNCSMatrix ncsMtx; ncsMtx = new NCSMatrix(); ncsMtx->SetNCSMatrix ( ncsMatrix.Length()+1,ncs_m,ncs_v,iGiven ); ncsMatrix.AddData ( ncsMtx ); return ncsMtx->serNum; } void Cryst::GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & vols ) { cell_as = as; cell_bs = bs; cell_cs = cs; cell_alphas = alphas; cell_betas = betas; cell_gammas = gammas; if (Vol!=0.0) vols = 1.0/Vol; else vols = 0.0; } void Cryst::GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & vol ) { if (WhatIsSet & CSET_CellParams) { cell_a = a; cell_b = b; cell_c = c; cell_alpha = alpha; cell_beta = beta; cell_gamma = gamma; vol = Vol; } else { cell_a = 0.0; cell_b = 0.0; cell_c = 0.0; cell_alpha = 0.0; cell_beta = 0.0; cell_gamma = 0.0; vol = 0.0; } } pstr Cryst::GetSpaceGroup() { if (WhatIsSet & CSET_SpaceGroup) return spaceGroup; else return NULL; } pstr Cryst::GetSpaceGroupFix() { if (WhatIsSet & CSET_SpaceGroup) return spaceGroupFix; else return NULL; } void Cryst::Copy ( PCryst Cryst ) { int i,j,k; if (Cryst) { a = Cryst->a; b = Cryst->b; c = Cryst->c; alpha = Cryst->alpha; beta = Cryst->beta; gamma = Cryst->gamma; for (i=0;i<4;i++) for (j=0;j<4;j++) { RO [i][j] = Cryst->RO [i][j]; RF [i][j] = Cryst->RF [i][j]; ROU[i][j] = Cryst->ROU[i][j]; RFU[i][j] = Cryst->RFU[i][j]; } for (i=0;i<3;i++) { for (j=0;j<3;j++) { o[i][j] = Cryst->o[i][j]; s[i][j] = Cryst->s[i][j]; for (k=0;k<6;k++) RR[k][i][j] = Cryst->RR[k][i][j]; } t[i] = Cryst->t[i]; u[i] = Cryst->u[i]; } Vol = Cryst->Vol; NCode = Cryst->NCode; Z = Cryst->Z; CellCheck = Cryst->CellCheck; WhatIsSet = Cryst->WhatIsSet; strcpy ( spaceGroup ,Cryst->spaceGroup ); strcpy ( spaceGroupFix,Cryst->spaceGroupFix ); ncsMatrix.Copy ( &(Cryst->ncsMatrix) ); tVect .Copy ( &(Cryst->tVect) ); symOps .Copy ( &(Cryst->symOps) ); as = Cryst->as; bs = Cryst->bs; cs = Cryst->cs; alphas = Cryst->alphas; betas = Cryst->betas; gammas = Cryst->betas; VolChk = Cryst->VolChk; VolErr = Cryst->VolErr; for (k=0;k<6;k++) AC[k] = Cryst->AC[k]; } else { ncsMatrix.FreeContainer(); tVect .FreeContainer(); WhatIsSet = 0; } } void Cryst::write ( io::RFile f ) { int i,j,k; byte Version=3; f.WriteByte ( &Version ); f.WriteWord ( &WhatIsSet ); f.WriteReal ( &a ); f.WriteReal ( &b ); f.WriteReal ( &c ); f.WriteReal ( &alpha ); f.WriteReal ( &beta ); f.WriteReal ( &gamma ); f.WriteWord ( &CellCheck ); f.WriteBool ( &ignoreScalei ); for (i=0;i<4;i++) for (j=0;j<4;j++) { f.WriteReal ( &(RO [i][j]) ); f.WriteReal ( &(RF [i][j]) ); f.WriteReal ( &(ROU[i][j]) ); f.WriteReal ( &(RFU[i][j]) ); } for (i=0;i<3;i++) { for (j=0;j<3;j++) { f.WriteReal ( &(o[i][j]) ); f.WriteReal ( &(s[i][j]) ); for (k=0;k<6;k++) f.WriteReal ( &(RR[k][i][j]) ); } f.WriteReal ( &(t[i]) ); f.WriteReal ( &(u[i]) ); } f.WriteReal ( &Vol ); f.WriteReal ( &VolChk ); f.WriteReal ( &VolErr ); f.WriteInt ( &NCode ); f.WriteInt ( &Z ); f.WriteTerLine ( spaceGroup ,false ); f.WriteTerLine ( spaceGroupFix,false ); for (i=0;i<6;i++) f.WriteReal ( &(AC[6]) ); f.WriteReal ( &as ); f.WriteReal ( &bs ); f.WriteReal ( &cs ); f.WriteReal ( &alphas ); f.WriteReal ( &betas ); f.WriteReal ( &gammas ); ncsMatrix.write ( f ); tVect .write ( f ); symOps .write ( f ); } void Cryst::read ( io::RFile f ) { int i,j,k; byte Version; f.ReadByte ( &Version ); f.ReadWord ( &WhatIsSet ); f.ReadReal ( &a ); f.ReadReal ( &b ); f.ReadReal ( &c ); f.ReadReal ( &alpha ); f.ReadReal ( &beta ); f.ReadReal ( &gamma ); f.ReadWord ( &CellCheck ); if (Version>2) f.ReadBool ( &ignoreScalei ); else ignoreScalei = false; for (i=0;i<4;i++) for (j=0;j<4;j++) { f.ReadReal ( &(RO [i][j]) ); f.ReadReal ( &(RF [i][j]) ); f.ReadReal ( &(ROU[i][j]) ); f.ReadReal ( &(RFU[i][j]) ); } for (i=0;i<3;i++) { for (j=0;j<3;j++) { f.ReadReal ( &(o[i][j]) ); f.ReadReal ( &(s[i][j]) ); for (k=0;k<6;k++) f.ReadReal ( &(RR[k][i][j]) ); } f.ReadReal ( &(t[i]) ); f.ReadReal ( &(u[i]) ); } f.ReadReal ( &Vol ); f.ReadReal ( &VolChk ); f.ReadReal ( &VolErr ); f.ReadInt ( &NCode ); f.ReadInt ( &Z ); f.ReadTerLine ( spaceGroup,false ); if (Version>1) f.ReadTerLine ( spaceGroupFix,false ); else strcpy ( spaceGroupFix,spaceGroup ); for (i=0;i<6;i++) f.ReadReal ( &(AC[6]) ); f.ReadReal ( &as ); f.ReadReal ( &bs ); f.ReadReal ( &cs ); f.ReadReal ( &alphas ); f.ReadReal ( &betas ); f.ReadReal ( &gammas ); ncsMatrix.read ( f ); tVect .read ( f ); symOps .read ( f ); } MakeStreamFunctions(Cryst) // =================================================================== void TestCryst() { // reads from 'in.cryst', writes into // 'out.cryst' and 'abin.cryst' io::File f; char S[81]; PCryst cryst; cryst = new Cryst(); f.assign ( pstr("in.cryst"),true ); if (f.reset()) { while (!f.FileEnd()) { f.ReadLine ( S,sizeof(S) ); cryst->ConvertPDBString ( S ); } f.shut(); } else { printf ( " Can't open input file 'in.chain' \n" ); delete cryst; return; } f.assign ( pstr("out.cryst"),true ); if (f.rewrite()) { cryst->PDBASCIIDump ( f ); f.shut(); } else { printf ( " Can't open output file 'out.cryst' \n" ); delete cryst; return; } f.assign ( pstr("mmdb.cryst.bin"),false ); if (f.rewrite()) { cryst->write ( f ); f.shut(); } else { printf ( " Can't open binary cryst file for writing.\n" ); delete cryst; return; } delete cryst; printf ( " Cryst deleted.\n" ); cryst = new Cryst(); if (f.reset()) { cryst->read ( f ); f.shut(); } else { printf ( " Can't open binary cryst file for reading.\n" ); delete cryst; return; } f.assign ( pstr("abin.cryst"),true ); if (f.rewrite()) { cryst->PDBASCIIDump ( f ); f.shut(); } else printf ( " Can't open output file 'abin.cryst' \n" ); delete cryst; } } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_math_bfgsmin.cpp0000644000175000017500000006256513271367640017625 0ustar maartenmaarten// $Id: mmdb_math_bfgsmin.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : BFGSMin // ~~~~~~~~~ // **** Classes : mmdb::math::BFGSMin ( minimization driver ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include "mmdb_math_bfgsmin.h" namespace mmdb { namespace math { // ============================================================== BFGSMin::BFGSMin() { MFunc = NULL; MFuncData = NULL; PFunc = NULL; PFuncData = NULL; N = 0; NAlloc = 0; Hsn = NULL; TL = NULL; LL = NULL; XOpt = NULL; XPlus = NULL; Sx = NULL; SN = NULL; HDiag = NULL; GradX = NULL; GPlus = NULL; StepSize = NULL; FNeighbor = NULL; us = NULL; uy = NULL; ut = NULL; Freese = NULL; Func = 0.0; FPlus = 0.0; FOpt = 0.0; TakenLambda = 0.0; ForDiff = false; CalcHess = false; Etha = 0.0; SqrtEtha = 0.0; CubertEtha = 0.0; TpF = 1.0; GrdEps = 0.0; StpEps = 0.0; MxStep = MaxReal; CnsMax = 0; MaxItn = 100; TermCode = BFGS_NoTermination; ModF = false; } BFGSMin::~BFGSMin() { FreeMemory(); } void BFGSMin::MinFunc ( rvector X, realtype & F ) { if (MFunc) (*MFunc)(MFuncData,N,X,F); else F = 0.0; } void BFGSMin::MinFunc1 ( rvector X, realtype & F ) { int i; MinFunc ( X,F ); if (ModF && (FEtha) Etha = MachEps; } SqrtEtha = sqrt(Etha); CubertEtha = Exp ( log(Etha)/3.0 ); if (Etha>0.01) { TermCode = BFGS_TooFewDigits; return; } if (TypF<=0.0) TpF = 1.0; else TpF = TypF; S1 = Exp(log(MachEps)/3.0); if (GrdTol>0.0) GrdEps = GrdTol; else { GrdEps = sqrt(Etha); if (S1>GrdEps) GrdEps = S1; } if (StpTol>0.0) StpEps = StpTol; else StpEps = Exp ( log(MachEps)*2.0/3.0 ); if (MaxStp>0.0) MxStep = MaxStp; else { S1 = 0.0; S2 = 0.0; for (i=1;i<=N;i++) { S0 = Sx[i]; S0 *= Sx[i]; S2 += S0; S0 *= x0[i]; S1 += S0*x0[i]; } S1 = sqrt(S1); S2 = sqrt(S2); if (S2>S1) MxStep = S2; else MxStep = S1; MxStep *= 1000.0; } if (ItnLmt>0) MaxItn = ItnLmt; else MaxItn = 100; TermCode = BFGS_NoTermination; } // ------------------------------------------------------------------- void BFGSMin::UMStop0 ( rvector x0, rvector Grad ) { int i; realtype S,Fmax,St; CnsMax = 0; if (TpF>fabs(Func)) Fmax = TpF; else Fmax = fabs(Func); S = 0.0; for (i=1;i<=N;i++) { St = fabs(x0[i]); if (1.0/Sx[i]>St) St = 1.0/Sx[i]; St = fabs(Grad[i])*St/Fmax; if (St>S) S = St; } if (S>=0.001*GrdEps) TermCode = BFGS_NoTermination; else TermCode = BFGS_SmallGradient; } // ------------------------------------------------------------------- void BFGSMin::UMStop ( rvector x0, rvector Grad, int RetCode, int ItnCnt, bool MaxTkn ) { // A7.2.1 : Checking the Stop Conditions int i; realtype Max1,Max2,MaxGrad,MaxStep, BB1,BB2; TermCode = BFGS_NoTermination; if (RetCode==1) TermCode = BFGS_LineSearchComplete; else { if (fabs(FPlus)>TpF) Max2 = fabs(FPlus); else Max2 = TpF; MaxGrad = 0.0; MaxStep = 0.0; for (i=1;i<=N;i++) { BB1 = fabs(XPlus[i]); BB2 = 1.0/Sx[i]; if (BB1>BB2) Max1 = BB1; else Max1 = BB2; BB1 = fabs(Grad[i])*Max1/Max2; if (BB1>MaxGrad) MaxGrad = BB1; BB2 = fabs(XPlus[i]-x0[i])/Max1; if (BB2>MaxStep) MaxStep = BB2; } if (MaxGradMaxItn) TermCode = BFGS_IterationLimit; else if (MaxTkn) { CnsMax++; if (CnsMax==5) TermCode = BFGS_LargeSteps; } else CnsMax = 0; } } // ------------------------------------------------------------------- void BFGSMin::MdHess ( rmatrix H, rvector HDg ) { // A5.5.1 : Setting up the hessian of model int i,j; realtype MaxDiag,MaxOff, MinEv,Mue,MaxPosDiag; realtype MaxOffl,MinDiag,MaxEv,MaxAdd,Sdd,OffRow; realtype BB; // Scaling for (i=1;i<=N;i++) for (j=i;j<=N;j++) H[i][j] /= (Sx[i]*Sx[j]); MaxDiag = H[1][1]; MinDiag = H[1][1]; MaxOff = 0.0; for (i=1;i<=N;i++) { if (H[i][i]>MaxDiag) MaxDiag = H[i][i]; if (H[i][i]MaxOff) MaxOff = BB; } } MaxPosDiag = 0.0; if (MaxDiag>MaxPosDiag) MaxPosDiag = MaxDiag; // Computing the shift of the spectra (the Mue) if (MinDiag>SqrtEps*MaxPosDiag) Mue = 0.0; else { Mue = 2.0*(MaxPosDiag-MinDiag)*SqrtEps-MinDiag; MaxDiag += Mue; } BB = MaxOff*(1.0+2.0*SqrtEps); if (BB>MaxDiag) { Mue = Mue+(MaxOff-MaxDiag)+2.0*SqrtEps*MaxOff; MaxDiag = BB; } if (MaxDiag==0.0) { // H = 0 Mue = 1.0; MaxDiag = 1.0; } if (Mue>0.0) for (i=1;i<=N;i++) Hsn[i][i] += Mue; MaxOffl = MaxOff/N; if (MaxDiag>MaxOffl) MaxOffl = MaxDiag; MaxOffl = sqrt(MaxOffl); for (i=1;i<=N;i++) HDg[i] = H[i][i]; PbCholDecomp ( N,HDg,MaxOffl,MachEps,H,MaxAdd ); if (MaxAdd>0.0) { MaxEv = HDg[1]; MinEv = HDg[1]; for (i=1;i<=N;i++) { OffRow = 0.0; if (i>1) for (j=1;jMaxEv) MaxEv = BB; BB = HDg[i]-OffRow; if (BBBB2) StepSizeJ = BB1; else StepSizeJ = BB2; if (X[j]<0.0) StepSizeJ = -StepSizeJ; StepSizeJ *= SqrtEtha; TempJ = X[j]; X[j] += StepSizeJ; StepSizeJ = X[j]-TempJ; MinFunc1 ( X,Fj ); if (TermCode!=BFGS_NoTermination) return; G[j] = (Fj-Fc)/StepSizeJ; X[j] = TempJ; Freese[j] = false; if (TL) { if ((fabs(X[j]-TL[j])<=StepSizeJ) && (G[j]<0.0)) { G[j] = 0.0; Freese[j] = true; } } if (LL) { if ((fabs(X[j]-LL[j])<=StepSizeJ) && (G[j]>0.0)) { G[j] = 0.0; Freese[j] = true; } } } } // ------------------------------------------------------------------- void BFGSMin::CDGrad ( rvector X, rvector G ) { // A5.6.4 : Central Differencies Approximation of // Gradient realtype StepSizeJ,TempJ,Fp,Fm, BB1,BB2; int j; for (j=1;j<=N;j++) { BB1 = fabs(X[j]); BB2 = 1.0/Sx[j]; if (BB1>BB2) StepSizeJ = BB1; else StepSizeJ = BB2; if (X[j]<0.0) StepSizeJ = -StepSizeJ; StepSizeJ *= CubertEtha; TempJ = X[j]; X[j] += StepSizeJ; StepSizeJ = X[j]-TempJ; MinFunc1 ( X,Fp ); if (TermCode!=BFGS_NoTermination) return; X[j] = TempJ-StepSizeJ; MinFunc1 ( X,Fm ); if (TermCode!=BFGS_NoTermination) return; G[j] = (Fp-Fm)/(2.0*StepSizeJ); X[j] = TempJ; } } // ------------------------------------------------------------------- void BFGSMin::Gradient ( rvector X, rvector G, realtype Fc ) { if (ForDiff) FDGrad ( X,G,Fc ); else CDGrad ( X,G ); } // ------------------------------------------------------------------- void BFGSMin::FDHessF ( realtype Fc, rvector X ) { // A5.6.2 : Finite-Difference Approximation of // the Hessian employing only the // function's values int i,j; realtype S,TempI,Fii,TempJ,Fij, BB1,BB2; for (i=1;i<=N;i++) if (!Freese[i]) { BB1 = fabs(X[i]); BB2 = 1.0/Sx[i]; if (BB1>BB2) S = BB1; else S = BB2; if (X[i]<0.0) S = -S; StepSize[i] = S*CubertEtha; TempI = X[i]; X[i] += StepSize[i]; StepSize[i] = X[i]-TempI; MinFunc1 ( X,FNeighbor[i] ); X[i] = TempI; if (TermCode!=BFGS_NoTermination) return; } for (i=1;i<=N;i++) if (!Freese[i]) { TempI = X[i]; X[i] += 2.0*StepSize[i]; MinFunc1 ( X,Fii ); if (TermCode!=BFGS_NoTermination) return; Hsn[i][i] = (( Fc -FNeighbor[i] ) + ( Fii-FNeighbor[i] )) / (StepSize[i]*StepSize[i]); X[i] = TempI+StepSize[i]; if (iTemp) Temp = TpF; for (i=1;i<=N;i++) { H[i][i] = Temp*Sx[i]*Sx[i]; if (isqrt(MachEps*NormS*NormY)) { if (AnalGrad) Tol = Etha; else Tol = sqrt(Etha); SkipUpdate = true; for (i=1;i<=N;i++) { tt = 0.0; for (j=1;j<=i;j++) tt += H[j][i]*us[j]; if (itt) tt = BB; if (fabs(uy[i]-ut[i])>=Tol*tt) SkipUpdate = false; } if (!SkipUpdate) { Temp2 = 0.0; for (i=1;i<=N;i++) Temp2 += us[i]*ut[i]; for (i=1;i<=N;i++) for (j=i;j<=N;j++) H[i][j] += uy[i]*uy[j]/Temp1 - ut[i]*ut[j]/Temp2; } } } // ------------------------------------------------------------------- void BFGSMin::Choose_Lambda ( rvector X, rvector S, realtype & Lambda0 ) { int i; realtype SS; for (i=1;i<=N;i++) if ((S[i]!=0.0) && (!Freese[i])) { SS = X[i] + Lambda0*S[i]; if (TL) { if (SS>TL[i]) Lambda0 = (TL[i]-X[i])/S[i]/(1.0+MachEps); } if (LL) { if (SSMxStep) { // restrict Newtonian step to MxStep S = MxStep/NewtLn; for (i=1;i<=N;i++) P[i] *= S; NewtLn = MxStep; } InitSp = 0.0; RelLng = 0.0; Lambda0 = 1.0; Choose_Lambda ( px0,P,Lambda0 ); for (i=1;i<=N;i++) { InitSp += G[i]*P[i]; B1 = fabs(px0[i]); B2 = 1.0/Sx[i]; if (B1>B2) S = B1; else S = B2; S = fabs(P[i])/S; if (S>RelLng) RelLng = S; } InitSp *= Lambda0; MinLam = StpEps/RelLng; Lambda = Lambda0; do { for (i=1;i<=N;i++) XPlus[i] = px0[i] + Lambda*P[i]; MinFunc1 ( XPlus,FPlus ); if (TermCode!=BFGS_NoTermination) return; if (FPlus<=pFunc+Alpha*Lambda*InitSp) { RetCode = 0; MaxTkn = (Lambda==Lambda0) && (NewtLn>0.99*MxStep); } else if (Lambda0.1*Lambda) Lambda = LamTem; else { Lambda *= 0.1; Lambda0 = Lambda; } if (Lambda>Lambda0) { Lambda = Lambda0; RetCode = 0; for (i=1;i<=N;i++) XPlus[i] = px0[i] + Lambda*P[i]; } } else { B1 = FPlus - pFunc - Lambda*InitSp; B2 = FplPre - pFunc - LamPre*InitSp; A = ( B1/(Lambda*Lambda) - B2/(LamPre*LamPre) ) / ( Lambda - LamPre ); B = ( -LamPre*B1/(Lambda*Lambda) + Lambda*B2/(LamPre*LamPre) ) / ( Lambda - LamPre ); Disc = B*B - 3.0*A*InitSp; if (A==0.0) LamTem = -InitSp/(2.0*B); else LamTem = (-B+sqrt(RMax(Disc,0.0)))/(3.0*A); B1 = 0.5*Lambda; if (B10.1*Lambda) Lambda = LamTem; else { Lambda *= 0.1; Lambda0 = Lambda; } if (Lambda>Lambda0) { Lambda = Lambda0; RetCode = 0; for (i=1;i<=N;i++) XPlus[i] = px0[i] + Lambda*P[i]; } } } while (RetCode>=2); TakenLambda = Lambda; } // ------------------------------------------------------------------- void BFGSMin::GetMemory() { if (N!=NAlloc) { FreeMemory(); GetMatrixMemory ( Hsn , N,N, 1,1 ); GetVectorMemory ( GPlus , N, 1 ); GetVectorMemory ( GradX , N, 1 ); GetVectorMemory ( HDiag , N, 1 ); GetVectorMemory ( SN , N, 1 ); GetVectorMemory ( Sx , N, 1 ); GetVectorMemory ( XPlus , N, 1 ); GetVectorMemory ( XOpt , N, 1 ); GetVectorMemory ( Freese, N, 1 ); if (CalcHess) { GetVectorMemory ( StepSize , N, 1 ); GetVectorMemory ( FNeighbor, N, 1 ); } else { GetVectorMemory ( us , N, 1 ); GetVectorMemory ( uy , N, 1 ); GetVectorMemory ( ut , N, 1 ); } NAlloc = N; } } void BFGSMin::FreeMemory() { if (NAlloc>0) { FreeVectorMemory ( us , 1 ); FreeVectorMemory ( uy , 1 ); FreeVectorMemory ( ut , 1 ); FreeVectorMemory ( Freese , 1 ); FreeVectorMemory ( StepSize , 1 ); FreeVectorMemory ( FNeighbor, 1 ); FreeVectorMemory ( XOpt , 1 ); FreeVectorMemory ( XPlus , 1 ); FreeVectorMemory ( Sx , 1 ); FreeVectorMemory ( SN , 1 ); FreeVectorMemory ( HDiag , 1 ); FreeVectorMemory ( GradX , 1 ); FreeVectorMemory ( GPlus , 1 ); FreeMatrixMemory ( Hsn , NAlloc, 1,1 ); } NAlloc = 0; } // ------------------------------------------------------------------- void BFGSMin::Relax() { int i; if (FPlus>FOpt) { for (i=1;i<=N;i++) XPlus[i] = XOpt[i]; FPlus = FOpt; } else { for (i=1;i<=N;i++) XOpt[i] = XPlus[i]; FOpt = FPlus; } } void BFGSMin::CopyPlus ( rvector x0 ) { int i; for (i=1;i<=N;i++) { x0 [i] = XPlus[i]; GradX[i] = GPlus[i]; } Func = FPlus; } // ------------------------------------------------------------------- void BFGSMin::BFGS_Driver ( int MinN, rvector x0, rvector TypX, realtype & FuncValue, int & TerminationCode, int Digits, int ItnLmt, realtype TypF, realtype GrdTol, realtype StpTol, realtype MaxStp, bool Hess, rvector LowLimit, rvector TopLimit ) { // D6.1.1 : Unconstrained Minimization Driver int i,RetCode; int ItnCnt; bool MaxTkn; TL = TopLimit; LL = LowLimit; ForDiff = true; N = MinN; CalcHess = Hess; ModF = false; GetMemory(); UMInCk ( x0,TypX,Digits,TypF, GrdTol,StpTol,MaxStp, ItnLmt ); if (TermCode!=BFGS_NoTermination) { FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } ItnCnt = 0; MinFunc1 ( x0,Func ); if (TermCode!=BFGS_NoTermination) { FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } FOpt = Func; FPlus = Func; for (i=1;i<=N;i++) { XOpt [i] = x0[i]; XPlus[i] = x0[i]; } ModF = true; Gradient ( x0,GradX,Func ); Print ( ItnCnt,x0,GradX,Func ); for (i=1;i<=N;i++) GPlus[i] = GradX[i]; if (TermCode!=BFGS_NoTermination) { Relax (); CopyPlus ( x0 ); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } UMStop0 ( x0,GradX ); if (TermCode!=BFGS_NoTermination) { FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } if (!CalcHess) InitHessUnFac ( Func,Hsn ); RetCode = 0; while (TermCode==BFGS_NoTermination) { ItnCnt++; if (RetCode>=0) { if (CalcHess) { FDHessF ( Func,x0 ); if (TermCode!=BFGS_NoTermination) { Relax (); CopyPlus ( x0 ); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } } MdHess ( Hsn,HDiag ); } ChSolve ( N,Hsn,GradX,SN ); LineSearch ( x0,GradX,SN,Func,RetCode,MaxTkn ); if ((RetCode==1) && ForDiff) { RetCode = -1; ForDiff = false; } else Relax(); if (TermCode!=BFGS_NoTermination) { Relax (); CopyPlus ( x0 ); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } else Gradient ( XPlus,GPlus,FPlus ); if (TermCode!=BFGS_NoTermination) { Relax (); CopyPlus ( x0 ); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } if (RetCode>=0) { UMStop ( x0,GPlus,RetCode,ItnCnt,MaxTkn ); if ((!CalcHess) && (TermCode==BFGS_NoTermination)) BFGSUnFac ( x0,XPlus,GradX,GPlus,false,HDiag,Hsn ); } CopyPlus ( x0 ); Print ( ItnCnt, x0,GradX,Func ); } Relax (); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; } } // namespace math } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_math_align.cpp0000644000175000017500000010320713271367640017257 0ustar maartenmaarten// $Id: mmdb_math_align.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Align // ~~~~~~~~~ // **** Classes : mmdb::math::Alignment (char strings alignment) // ~~~~~~~~~~~~ mmdb::math::Alignment1 (int vectors alignment) // // (C) E.Krissinel 2000-2013 // // ================================================================= // #include #include #include "mmdb_math_align.h" namespace mmdb { namespace math { // ===================== CAligParams ====================== AlignParams::AlignParams() : Stream() { InitAlignParams(); } AlignParams::AlignParams ( io::RPStream Object ) : io::Stream ( Object ) { InitAlignParams(); } void AlignParams::InitAlignParams() { gapWeight = -1.0; spaceWeight = -1.0; equalScore = 2.0; nequalScore = -1.0; method = ALIGN_GLOBAL; } void AlignParams::write ( io::RFile f ) { f.WriteReal ( &gapWeight ); f.WriteReal ( &spaceWeight ); f.WriteReal ( &equalScore ); f.WriteReal ( &nequalScore ); f.WriteInt ( &method ); } void AlignParams::read ( io::RFile f ) { f.ReadReal ( &gapWeight ); f.ReadReal ( &spaceWeight ); f.ReadReal ( &equalScore ); f.ReadReal ( &nequalScore ); f.ReadInt ( &method ); } MakeStreamFunctions(AlignParams) // ===================== Alignment ====================== Alignment::Alignment() : io::Stream() { InitAlignment(); } Alignment::Alignment ( io::RPStream Object ) : io::Stream ( Object ) { InitAlignment(); } Alignment::~Alignment() { FreeMemory(); } void Alignment::InitAlignment() { Space = '-'; SLen = 0; TLen = 0; VT = NULL; ET = NULL; FT = NULL; AlgnS = NULL; AlgnT = NULL; AlignKey = ALIGN_GLOBAL; VAchieved = 0.0; SEq = 2.0; SNEq = -1.0; Wg = 0.0; Ws = -1.0; } void Alignment::FreeMemory() { FreeMatrixMemory ( VT,TLen+1,0,0 ); FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); if (AlgnS) { delete[] AlgnS; AlgnS = NULL; } if (AlgnT) { delete[] AlgnT; AlgnT = NULL; } TLen = 0; SLen = 0; } void Alignment::SetAffineModel ( realtype WGap, realtype WSpace ) { Wg = WGap; Ws = WSpace; } void Alignment::SetScores ( realtype SEqual, realtype SNEqual ) { SEq = SEqual; SNEq = SNEqual; } void Alignment::Align ( cpstr S, cpstr T, ALIGN_METHOD Method ) { int i,j,i0,j0; FreeMemory(); AlignKey = Method; switch (Method) { default : case ALIGN_GLOBAL : // global pairwise alignment of S and T BuildGATable ( S,T, false,false ); VAchieved = VT[TLen][SLen]; Backtrace ( S,T,SLen,TLen,false ); if ((AlgnS[0]!=Space) && (AlgnT[0]!=Space)) VAchieved -= Wg; break; case ALIGN_LOCAL : // local pairwise alignment of S and T BuildLATable ( S,T ); VAchieved = 0.0; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) for (j=0;j<=SLen;j++) if (VT[i][j]>VAchieved) { VAchieved = VT[i][j]; i0 = i; j0 = j; } Backtrace ( S,T,j0,i0,true ); break; case ALIGN_GLOBLOC : // global alignment with non-penalized // end gaps in T BuildGATable ( S,T,false,true ); VAchieved = -MaxReal; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) if (VT[i][SLen]>VAchieved) { VAchieved = VT[i][SLen]; i0 = i; j0 = SLen; } Backtrace ( S,T,j0,i0,false ); AdjustEnds ( S,T,j0,i0 ); break; case ALIGN_FREEENDS : // global alignment with non-penalized // end gaps in both S and T BuildGATable ( S,T,true,true ); VAchieved = -MaxReal; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) if (VT[i][SLen]>VAchieved) { VAchieved = VT[i][SLen]; i0 = i; j0 = SLen; } for (j=0;j<=SLen;j++) if (VT[TLen][j]>VAchieved) { VAchieved = VT[TLen][j]; i0 = TLen; j0 = j; } Backtrace ( S,T,j0,i0,false ); AdjustEnds ( S,T,j0,i0 ); } } void Alignment::BuildGATable ( cpstr S, cpstr T, bool FreeSEnd, bool FreeTEnd ) { int i,j; realtype V1; SLen = strlen ( S ); TLen = strlen ( T ); GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); // Base conditions if (FreeSEnd || FreeTEnd) VT[0][0] = RMax(0.0,Wg); else VT[0][0] = Wg; ET[0][0] = VT[0][0]; FT[0][0] = VT[0][0]; if (FreeTEnd) for (i=1;i<=TLen;i++) { V1 = RMax ( 0.0,VT[i-1][0]+Ws ); VT[i][0] = V1; ET[i][0] = V1; } else for (i=1;i<=TLen;i++) { V1 = VT[i-1][0] + Ws; VT[i][0] = V1; ET[i][0] = V1; } if (FreeSEnd) for (j=1;j<=SLen;j++) { V1 = RMax ( 0.0,VT[0][j-1]+Ws ); VT[0][j] = V1; FT[0][j] = V1; } else for (j=1;j<=SLen;j++) { V1 = VT[0][j-1] + Ws; VT[0][j] = V1; FT[0][j] = V1; } // Recurrence for (i=1;i<=TLen;i++) for (j=1;j<=SLen;j++) { V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); VT[i][j] = RMax ( RMax(V1,ET[i][j]),FT[i][j] ); } FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); // PrintVT ( S,T ); } void Alignment::BuildLATable ( cpstr S, cpstr T ) { int i,j; realtype V1; SLen = strlen ( S ); TLen = strlen ( T ); GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); // Base conditions VT[0][0] = RMax ( 0.0,Wg ); ET[0][0] = VT[0][0]; FT[0][0] = VT[0][0]; for (i=1;i<=TLen;i++) { V1 = RMax ( 0.0,VT[i-1][0]+Ws ); VT[i][0] = V1; ET[i][0] = V1; } for (j=1;j<=SLen;j++) { V1 = RMax ( 0.0,VT[0][j-1]+Ws ); VT[0][j] = V1; FT[0][j] = V1; } // Recurrence for (i=1;i<=TLen;i++) for (j=1;j<=SLen;j++) { V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); VT[i][j] = RMax ( RMax(V1,ET[i][j]),RMax(0.0,FT[i][j]) ); } FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); // PrintVT ( S,T ); } void Alignment::PrintVT ( cpstr S, cpstr T ) { int i,j; printf ( "\n " ); for (j=0;j<=SLen;j++) printf ( " %2i",j ); printf ( " \n " ); for (j=1;j<=SLen;j++) printf ( " %c ",S[j-1] ); printf ( " \n\n " ); for (i=0;i<=TLen;i++) { if (i>0) printf ( " %2i %c ",i,T[i-1] ); else printf ( " %2i ",i ); for (j=0;j<=SLen;j++) printf ( " %2i",mround(VT[i][j]) ); printf ( " \n " ); } printf ( " \n" ); } void Alignment::Backtrace ( cpstr S, cpstr T, int J, int I, bool StopAtZero ) { int i,j,k, i1,j1, sk,tk; char C; realtype V,SV,TV; bool Stop; // 1. Allocate memory if (AlgnS) delete[] AlgnS; if (AlgnT) delete[] AlgnT; i = SLen+TLen+1; AlgnS = new char[i]; AlgnT = new char[i]; memset ( AlgnS,Space,i ); memset ( AlgnT,Space,i ); // 2. Initialize backtracing i = I; // backtracing j = J; // indices k = 0; // alignment index SV = 0.0; sk = -1; // alignment indices and leading elements TV = 0.0; tk = -1; // for vertical and horizontal sections // 3. Backtracing Stop = false; while ((!Stop) && (i>0) && (j>0)) { V = VT[i][j]; // find next leading element if (VT[i][j-1]>VT[i-1][j]) { i1 = i; j1 = j-1; } else { i1 = i-1; j1 = j; } if (VT[i-1][j-1]>=VT[i1][j1]) { i1 = i-1; j1 = j-1; } //printf ( " i=%i j=%i \n",i,j ); Stop = StopAtZero && (VT[i1][j1]<=0.0); // used at local alignment // treat horizontal section if ((sk<0) || (V>SV)) { sk = k; SV = V; } if ((j1!=j) || Stop) { // end of horizontal section AlgnS[sk] = S[j-1]; sk = -1; } // treat vertical section if ((tk<0) || (V>TV)) { tk = k; TV = V; } if ((i1!=i) || Stop) { // end of vertical section AlgnT[tk] = T[i-1]; tk = -1; } i = i1; j = j1; k++; } if (!StopAtZero) { // 4. Finish the last horizontal section sk = k; while (j>0) AlgnS[k++] = S[--j]; // 5. Finish the last vertical section while (i>0) AlgnT[sk++] = T[--i]; k = IMax ( k,sk ); } // 6. Put the termination character AlgnS[k] = char(0); AlgnT[k] = char(0); // 7. Reverse the strings i = 0; j = k-1; if (StopAtZero) { // should work only for local alignment while ((j>0) && ((AlgnS[j]==Space) || (AlgnT[j]==Space))) j--; k = j+1; AlgnS[k] = char(0); AlgnT[k] = char(0); } while (j>i) { C = AlgnS[i]; AlgnS[i] = AlgnS[j]; AlgnS[j] = C; C = AlgnT[i]; AlgnT[i] = AlgnT[j]; AlgnT[j] = C; i++; j--; } // 8. Collapse the alternating spaces do { k = 0; i = 0; while (AlgnS[k]) { if ((AlgnS[k]==Space) && (AlgnT[k]==Space)) k++; else if ((AlgnS[k]==Space) && (AlgnS[k+1]!=Space) && (AlgnT[k]!=Space) && (AlgnT[k+1]==Space)) { AlgnS[i] = AlgnS[k+1]; AlgnT[i] = AlgnT[k]; k++; } else if ((AlgnS[k]!=Space) && (AlgnS[k+1]==Space) && (AlgnT[k]==Space) && (AlgnT[k+1]!=Space)) { AlgnS[i] = AlgnS[k]; AlgnT[i] = AlgnT[k+1]; k++; } else if (i!=k) { AlgnS[i] = AlgnS[k]; AlgnT[i] = AlgnT[k]; } if (AlgnS[k]) { k++; i++; } } if (i!=k) { // terminating character AlgnS[i] = AlgnS[k]; AlgnT[i] = AlgnT[k]; } } while (k>i); } void Alignment::AdjustEnds ( cpstr S, cpstr T, int J, int I ) { int si,ti,m; if (JI) { k = J-I; strcat ( AlgnT,&(T[IMax(0,TLen-k)]) ); k = strlen ( AlgnS ); m = strlen ( AlgnT ); while (kJ) { k = I-J; strcat ( AlgnS,&(S[IMax(0,SLen-k)]) ); k = strlen ( AlgnT ); m = strlen ( AlgnS ); while (k0.0) && (a>0.0)) return s/a; return 0.0; } int Alignment::GetNAlign() { int i,n,ne; ne = 0; n = IMin ( strlen(AlgnS),strlen(AlgnT) ); for (i=0;i0.0) return ne/s; return 0.0; } #define WrapPeriod 61 void Alignment::OutputResults ( io::RFile f, cpstr S, cpstr T ) { int k,l,n; char P[3]; P[1] = char(0); if ((!AlgnS) || (!AlgnT)) { f.LF(); f.WriteLine ( pstr(" NO ALIGNMENT HAS BEEN DONE.") ); f.shut(); return; } f.LF(); f.WriteLine ( pstr(" ======== INPUT DATA") ); f.LF(); f.WriteLine ( pstr(" String S:") ); f.Write ( pstr(" ") ); l = 1; k = 0; while (S[k]) { P[0] = S[k++]; f.Write ( P ); l++; if (l>=WrapPeriod) { f.LF(); f.Write ( pstr(" ") ); l = 1; } } f.LF(); f.LF(); f.WriteLine ( pstr(" String T:") ); f.Write ( pstr(" ") ); l = 1; k = 0; while (T[k]) { P[0] = T[k++]; f.Write ( P ); l++; if (l>=WrapPeriod) { f.LF(); f.Write ( pstr(" ") ); l = 1; } } f.LF(); f.LF(); f.WriteParameter ( pstr(" Score equal") ,SEq ,20,10 ); f.WriteParameter ( pstr(" Score unequal"),SNEq,20,10 ); f.LF(); f.WriteParameter ( pstr(" Gap weight") ,Wg ,20,10 ); f.WriteParameter ( pstr(" Space weight") ,Ws ,20,10 ); f.LF(); f.LF(); f.Write ( pstr(" ======== RESULT OF ") ); switch (AlignKey) { default : case ALIGN_GLOBAL : f.Write ( pstr("GLOBAL") ); break; case ALIGN_LOCAL : f.Write ( pstr("LOCAL") ); break; case ALIGN_GLOBLOC : f.Write ( pstr("GLOBAL/LOCAL") ); break; case ALIGN_FREEENDS : f.Write ( pstr("FREE-ENDS") ); } f.WriteLine ( pstr(" ALIGNMENT") ); f.LF(); if (AlignKey==ALIGN_GLOBLOC) { f.WriteLine ( pstr(" End gaps in T-string were not penalized") ); f.LF(); } f.WriteParameter ( pstr(" Highest score achieved:"),VAchieved,26,10 ); f.LF(); f.WriteLine ( pstr(" Aligned S (upper string) and T (lower string):") ); f.LF(); k = 0; n = 0; l = 1; f.Write ( pstr(" ") ); while (AlgnS[k]) { P[0] = AlgnS[k++]; f.Write ( P ); l++; if ((l>=WrapPeriod) || (!AlgnS[k])) { f.LF(); f.Write ( pstr(" ") ); l = 1; while (AlgnT[n] && (lVAchieved) { VAchieved = VT[i][j]; i0 = i; j0 = j; } Backtrace ( S,T,j0,i0,true ); break; case ALIGN_GLOBLOC : // global alignment with non-penalized // end gaps in T BuildGATable ( S,T,false,true ); VAchieved = -MaxReal; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) if (VT[i][SLen]>VAchieved) { VAchieved = VT[i][SLen]; i0 = i; j0 = SLen; } Backtrace ( S,T,j0,i0,false ); AdjustEnds ( S,T,j0,i0 ); break; case ALIGN_FREEENDS : // global alignment with non-penalized // end gaps in both S and T BuildGATable ( S,T,true,true ); VAchieved = -MaxReal; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) if (VT[i][SLen]>VAchieved) { VAchieved = VT[i][SLen]; i0 = i; j0 = SLen; } for (j=0;j<=SLen;j++) if (VT[TLen][j]>VAchieved) { VAchieved = VT[TLen][j]; i0 = TLen; j0 = j; } Backtrace ( S,T,j0,i0,false ); AdjustEnds ( S,T,j0,i0 ); } } void Alignment1::BuildGATable ( ivector S, ivector T, bool FreeSEnd, bool FreeTEnd ) { int i,j; realtype V1; GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); // Base conditions if (FreeSEnd || FreeTEnd) VT[0][0] = RMax(0.0,Wg); else VT[0][0] = Wg; ET[0][0] = VT[0][0]; FT[0][0] = VT[0][0]; if (FreeTEnd) for (i=1;i<=TLen;i++) { V1 = RMax ( 0.0,VT[i-1][0]+Ws ); VT[i][0] = V1; ET[i][0] = V1; } else for (i=1;i<=TLen;i++) { V1 = VT[i-1][0] + Ws; VT[i][0] = V1; ET[i][0] = V1; } if (FreeSEnd) for (j=1;j<=SLen;j++) { V1 = RMax ( 0.0,VT[0][j-1]+Ws ); VT[0][j] = V1; FT[0][j] = V1; } else for (j=1;j<=SLen;j++) { V1 = VT[0][j-1] + Ws; VT[0][j] = V1; FT[0][j] = V1; } // Recurrence for (i=1;i<=TLen;i++) for (j=1;j<=SLen;j++) { V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); VT[i][j] = RMax ( RMax(V1,ET[i][j]),FT[i][j] ); } FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); // PrintVT ( S,T ); } void Alignment1::BuildLATable ( ivector S, ivector T ) { int i,j; realtype V1; GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); // Base conditions VT[0][0] = RMax ( 0.0,Wg ); ET[0][0] = VT[0][0]; FT[0][0] = VT[0][0]; for (i=1;i<=TLen;i++) { V1 = RMax ( 0.0,VT[i-1][0]+Ws ); VT[i][0] = V1; ET[i][0] = V1; } for (j=1;j<=SLen;j++) { V1 = RMax ( 0.0,VT[0][j-1]+Ws ); VT[0][j] = V1; FT[0][j] = V1; } // Recurrence for (i=1;i<=TLen;i++) for (j=1;j<=SLen;j++) { V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); VT[i][j] = RMax ( RMax(V1,ET[i][j]),RMax(0.0,FT[i][j]) ); } FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); // PrintVT ( S,T ); } void Alignment1::PrintVT ( ivector S, ivector T ) { int i,j; printf ( "\n " ); for (j=0;j<=SLen;j++) printf ( " %2i",j ); printf ( " \n " ); for (j=1;j<=SLen;j++) printf ( " %3i ",S[j-1] ); printf ( " \n\n " ); for (i=0;i<=TLen;i++) { if (i>0) printf ( " %2i %3i ",i,T[i-1] ); else printf ( " %2i ",i ); for (j=0;j<=SLen;j++) printf ( " %2i",mround(VT[i][j]) ); printf ( " \n " ); } printf ( " \n" ); } void Alignment1::Backtrace ( ivector S, ivector T, int J, int I, bool StopAtZero ) { int i,j,k, i1,j1, sk,tk; int C; realtype V,SV,TV; bool Stop; // 1. Allocate memory FreeVectorMemory ( AlgnS,0 ); FreeVectorMemory ( AlgnT,0 ); AlgnLen = 0; k = SLen+TLen+1; GetVectorMemory ( AlgnS,k,0 ); GetVectorMemory ( AlgnT,k,0 ); for (i=0;i0) && (j>0)) { V = VT[i][j]; // find next leading element if (VT[i][j-1]>VT[i-1][j]) { i1 = i; j1 = j-1; } else { i1 = i-1; j1 = j; } if (VT[i-1][j-1]>=VT[i1][j1]) { i1 = i-1; j1 = j-1; } Stop = StopAtZero && (VT[i1][j1]<=0.0); // used at local alignment // treat horizontal section if ((sk<0) || (V>SV)) { sk = k; SV = V; } if ((j1!=j) || Stop) { // end of horizontal section AlgnS[sk] = S[j-1]; sk = -1; } // treat vertical section if ((tk<0) || (V>TV)) { tk = k; TV = V; } if ((i1!=i) || Stop) { // end of vertical section AlgnT[tk] = T[i-1]; tk = -1; } i = i1; j = j1; k++; } if (!StopAtZero) { // 4. Finish the last horizontal section sk = k; while (j>0) AlgnS[k++] = S[--j]; // 5. Finish the last vertical section while (i>0) AlgnT[sk++] = T[--i]; k = IMax ( k,sk ); } // 6. Put the termination character AlgnLen = k; // 7. Reverse the strings i = 0; j = k-1; if (StopAtZero) { // should work only for local alignment while ((j>0) && ((AlgnS[j]==Space) || (AlgnT[j]==Space))) j--; AlgnLen = j+1; } while (j>i) { C = AlgnS[i]; AlgnS[i] = AlgnS[j]; AlgnS[j] = C; C = AlgnT[i]; AlgnT[i] = AlgnT[j]; AlgnT[j] = C; i++; j--; } // 8. Filter out parasite spaces k = 0; i = 0; while (ki); } void Alignment1::AdjustEnds ( ivector S, ivector T, int J, int I ) { int is,it; is = J; it = I; while ((is0.0) && (a>0.0)) return s/a; return 0.0; } void Alignment1::OutputResults ( io::RFile f, ivector S, int lenS, ivector T, int lenT ) { int k,l,n; char P[10]; if ((!AlgnS) || (!AlgnT)) { f.LF(); f.WriteLine ( pstr(" NO ALIGNMENT HAS BEEN DONE.") ); f.shut(); return; } f.LF(); f.WriteLine ( pstr(" ======== INPUT DATA") ); f.LF(); f.WriteLine ( pstr(" String S:") ); f.Write ( pstr(" ") ); l = 1; k = 0; while (k=WrapPeriod) { f.LF(); f.Write ( pstr(" ") ); l = 1; } } f.LF(); f.LF(); f.WriteLine ( pstr(" String T:") ); f.Write ( pstr(" ") ); l = 1; k = 0; while (k=WrapPeriod) { f.LF(); f.Write ( pstr(" ") ); l = 1; } } f.LF(); f.LF(); f.WriteParameter ( pstr(" Score equal") ,SEq ,20,10 ); f.WriteParameter ( pstr(" Score unequal"),SNEq,20,10 ); f.LF(); f.WriteParameter ( pstr(" Gap weight") ,Wg ,20,10 ); f.WriteParameter ( pstr(" Space weight") ,Ws ,20,10 ); f.LF(); f.LF(); f.Write ( pstr(" ======== RESULT OF ") ); switch (AlignKey) { default : case ALIGN_GLOBAL : f.Write ( pstr("GLOBAL") ); break; case ALIGN_LOCAL : f.Write ( pstr("LOCAL") ); break; case ALIGN_GLOBLOC : f.Write ( pstr("GLOBAL/LOCAL") ); break; case ALIGN_FREEENDS : f.Write ( pstr("FREE-ENDS") ); } f.WriteLine ( pstr(" ALIGNMENT") ); f.LF(); if (AlignKey==ALIGN_GLOBLOC) { f.WriteLine ( pstr(" End gaps in T-string were not penalized") ); f.LF(); } f.WriteParameter ( pstr(" Highest score achieved:"), VAchieved,26,10 ); f.LF(); f.WriteLine ( pstr(" Aligned S (upper string) and T " "(lower string):") ); f.LF(); k = 0; n = 0; l = 1; f.Write ( pstr(" ") ); while (k=WrapPeriod) || (!AlgnS[k])) { f.LF(); f.Write ( pstr(" ") ); l = 1; while ((n // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // Definition of types, constants and important classes. // // (C) E. Krissinel 2000-2019 // // ================================================================= // #ifndef __MMDB_Defs__ #define __MMDB_Defs__ #include "mmdb_mattype.h" namespace mmdb { enum MMDB_VERSION { MAJOR_VERSION = 2, //!< MMDB major version MINOR_VERSION = 0, //!< MMDB minor version MICRO_VERSION = 20 //!< MMDB micro version }; // ======================= types ================================= typedef char IDCode [16]; //!< ID code of PDB entry typedef IDCode * PIDCode; //!< pointer to ID code typedef PIDCode & RPIDCode; //!< ref. to pointer to ID code typedef char Date [12]; //!< date DD-MMM-YYYY typedef char RecName [7]; //!< name of PDB record typedef char ChainID [10]; //!< chain ID typedef ChainID * PChainID; //!< pointer to chain ID typedef char InsCode [10]; //!< insertion code typedef char DBName [10]; //!< sequence database name typedef char DBAcCode[20]; //!< seq. database accession code typedef DBAcCode * PDBAcCode; //!< pointer to seq. db acc code typedef char DBIdCode[20]; //!< seq. database ident-n code typedef DBIdCode * PDBIdCode; //!< pointer to DBIdCode typedef char ResName [20]; //!< residue name typedef ResName * PResName; //!< pointer to residue name typedef PResName * PPResName; //!< ptr to vector of residue names typedef char HelixID [20]; //!< helix ID typedef char StrandID[20]; //!< strand ID typedef char SheetID [20]; //!< sheet ID typedef char TurnID [20]; //!< turn ID typedef char LinkRID [20]; //!< Refmac link ID typedef char SymGroup[100]; //!< group of space symmetry typedef realtype vect3 [3]; //!< vector of 3 real numbers typedef vect3 * pvect3; //!< ptr to vector 3 typedef pvect3 & rpvect3; //!< ref to ptr to vector 3 typedef realtype vect4 [4]; //!< vector of 4 real numbers typedef vect3 mat33 [3]; //!< matrix 3x3 of real numbers typedef vect4 mat44 [4]; //!< matrix 4x4 of real numbers typedef mat44 * pmat44; //!< ptr to matrix 4x4 typedef mat44 & rmat44; //!< ref to matrix 4x4 typedef pmat44 * ppmat44; //!< ptr to ptr to matrix 4x4 typedef pmat44 & rpmat44; //!< ref to ptr to matrix 4x4 typedef mat33 mat633 [6]; //!< matrix 6x3x3 of real numbers typedef char AtomName[20]; //!< name of the atom typedef AtomName * PAtomName; //!< pointer to atom name typedef char AltLoc [20]; //!< alternate location indicator typedef AltLoc * PAltLoc; //!< pointer to alt loc indicator typedef char SegID [20]; //!< segment identifier typedef char Element [10]; //!< chemical element name typedef Element * PElement; //!< ptr to chemical element name typedef char EnergyType[10]; //!< energy type name typedef EnergyType * PEnergyType; //!< pointer to energy type name // do not forget update this when change the above typedefs: typedef char maxMMDBName[40]; // ===================== constants =============================== // ANY_RES should be used in selection functions for specifying // "any residue" to select. Defined in mmdb_selmngr.cpp extern const int ANY_RES; // PRNK_XXXXX are the print keys. PRNK_Silent supresses all print // inside mmdb_xxxx unless specifically ordered or catastrophic. // PRNK_SimRWBROOK instructs mmdb to issue, whenever possible and // necessary, printouts and warnings of RWBROOK (fortran) package. enum PRINT_KEY { PRNK_Silent = 0, PRNK_SimRWBROOK = 1 }; // Error_XXXX may be returned by XX::ConvertPDBString() and GetCIF(..) // functions. // Error_WrongSection is returned if the string passed into function // does not belong to the corresponding PDB section. enum ERROR_CODE { Error_EmptyCIF =-1, //!< used as signal at reading CIF files Error_NoError = 0, Error_Ok = 0, Error_WrongSection = 1, Error_WrongChainID = 2, Error_WrongEntryID = 3, // Error_SEQRES_serNum is returned by CSeqRes::ConvertPDBASCII() if // serial numbers of SEQRES records do not increment by 1 Error_SEQRES_serNum = 4, // Error_SEQRES_numRes is returned by CSeqRes::ConvertPDBASCII() if // SEQRES records show different number of residues Error_SEQRES_numRes = 5, // Error_SEQRES_extraRes is returned by CSeqRes::ConvertPDBASCII() if // SEQRES contains more residues than specified Error_SEQRES_extraRes = 6, Error_NCSM_Unrecognized = 7, Error_NCSM_AlreadySet = 8, Error_NCSM_WrongSerial = 9, Error_NCSM_UnmatchIG = 10, Error_ATOM_Unrecognized = 11, Error_ATOM_AlreadySet = 12, Error_ATOM_NoResidue = 13, Error_ATOM_Unmatch = 14, Error_CantOpenFile = 15, Error_UnrecognizedInteger = 16, Error_WrongModelNo = 17, Error_DuplicatedModel = 18, Error_NoModel = 19, Error_ForeignFile = 20, Error_WrongEdition = 21, // CIF specific Error_NotACIFFile = 22, Error_NoData = 23, Error_NoLoop = 24, Error_NoStruct = 25, Error_UnrecognCIFItems = 26, Error_MissingCIFField = 27, Error_EmptyCIFLoop = 28, Error_EmptyCIFStruct = 29, Error_UnexpEndOfCIF = 30, Error_MissgCIFLoopField = 31, Error_NotACIFStructure = 32, Error_NotACIFLoop = 33, Error_UnrecognizedReal = 34, Error_NoSheetID = 35, Error_WrongSheetID = 36, Error_WrongStrandNo = 37, // Error_WrongNumberOfStrands may be issued when reading // sheet data from CIF Error_WrongNumberOfStrands = 38, // Error_WrongSheetOrder may be issued when reading // sheet data from CIF Error_WrongSheetOrder = 39, // Error_HBondInconsistency may be issued when reading // sheet data from CIF Error_HBondInconsistency = 40, // Error_EmptyResidueName is issued when PDB ATOM record // does not have a residue name Error_EmptyResidueName = 41, // Error_DuplicateSeqNum is issued when PDB ATOM records // show the sequence number and insertion code assigned // to more than one residue name Error_DuplicateSeqNum = 42, // Error_NoLogicalName may be returned by file i/o functions // if the specified environmental variable for file name // is not found. Error_NoLogicalName = 43, // Error_EmptyFile may be returned at reading non-existing // coordinate files Error_EmptyFile = 44, Error_Unknown = 45, // Error_CIF_EmptyRow is the event of encountering // an empty row in _atom_site loop. It is handled // internally and has no effect on API Error_CIF_EmptyRow = 99999, Error_GeneralError1 = 10000 }; // ClassID_XXXX are used by container classes for proper // creating containered classes when reading from binary file. enum CLASS_ID { ClassID_Template , ClassID_String , ClassID_ObsLine , ClassID_TitleLine , ClassID_CAVEAT , ClassID_Compound , ClassID_Source , ClassID_ExpData , ClassID_MdlType , ClassID_Author , ClassID_RevData , ClassID_Supersede , ClassID_Journal , ClassID_Remark , ClassID_DBReference, ClassID_SeqAdv , ClassID_ModRes , ClassID_Het , ClassID_NCSMatrix , ClassID_TVect , ClassID_Helix , ClassID_Turn , ClassID_Link , ClassID_LinkR , ClassID_CisPep }; // ===================== classes =============================== DefineClass(Atom); DefineClass(Residue); DefineClass(Chain); DefineClass(Model); DefineClass(Manager); } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_selmngr.cpp0000644000175000017500000034460513271367640016634 0ustar maartenmaarten// $Id: mmdb_selmngr.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 15.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_selmngr // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Manager ( MMDB atom selection manager ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include #include #include "mmdb_selmngr.h" namespace mmdb { const int ANY_RES = MinInt4; // ==================== SelManager ===================== SelManager::SelManager() : CoorManager() { InitSelManager(); } SelManager::SelManager ( io::RPStream Object ) : CoorManager(Object) { InitSelManager(); } SelManager::~SelManager() { DeleteAllSelections(); } void SelManager::ResetManager() { CoorManager::ResetManager(); DeleteAllSelections(); InitSelManager (); } void SelManager::InitSelManager() { nSelections = 0; // number of selections mask = NULL; // vector of selections selType = NULL; // vector of selection types nSelItems = NULL; // numbers of selected items selection = NULL; // vector of selected items } // ------------------------ Selection ----------------------------- int SelManager::NewSelection() { PMask M; PPMask Mask1; PPMask * Selection1; ivector nSelItems1; SELECTION_TYPE * SelType1; int i,l; M = new Mask(); M->NewMask ( mask,nSelections ); i = 0; while (i=nSelections) { l = nSelections+10; Mask1 = new PMask [l]; Selection1 = new PPMask[l]; nSelItems1 = new int[l]; SelType1 = new SELECTION_TYPE[l]; for (i=0;i0) && (selHnd<=nSelections)) { k = selHnd-1; if (mask[k]) return selType[k]; } return STYPE_INVALID; } void SelManager::DeleteSelection ( int selHnd ) { int i,k; if ((selHnd>0) && (selHnd<=nSelections)) { k = selHnd-1; if (mask[k]) { for (i=0;iRemoveMask ( mask[k] ); // for (i=0;iRemoveMask ( mask[k] ); delete mask[k]; } mask[k] = NULL; if (selection[k]) delete[] selection[k]; selection[k] = NULL; nSelItems[k] = 0; selType [k] = STYPE_UNDEFINED; } } PMask SelManager::GetSelMask ( int selHnd ) { if ((selHnd>0) && (selHnd<=nSelections)) return mask[selHnd-1]; else return NULL; } void SelManager::DeleteAllSelections() { PResidue res ,res1; PChain chain,chain1; PModel model,model1; int i; if (mask) { res = NULL; chain = NULL; model = NULL; if (atom) for (i=0;iClearMask(); res1 = atom[i]->GetResidue(); if (res1!=res) { res = res1; res->ClearMask(); chain1 = res->GetChain(); if (chain1!=chain) { chain = chain1; chain->ClearMask(); model1 = chain->GetModel(); if (model1!=model) { model = model1; model->ClearMask(); } } } } for (i=0;inSelections) || (nAtoms<=0)) return; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = STYPE_ATOM; else if (selType[k]!=STYPE_ATOM) return; switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; case SKEY_XAND: nsel = 0; break; } if ((iSer1==0) && (iSer2==0)) { for (i=0;iTer) SelectAtom ( atom[i],k,sk,nsel ); } } else { if (iSer1<=iSer2) { s1 = iSer1; s2 = iSer2; } else { s1 = iSer2; s2 = iSer1; } // for a very general use, we allow the serial number // to differ from the atom's index, although this is // against PDB format. Therefore we apply here the most // primitive and less efficient way of selection for (i=0;iTer) { if ((s1<=atom[i]->serNum) && (atom[i]->serNum<=s2)) SelectAtom ( atom[i],k,sk,nsel ); else if (sk==SKEY_AND) atom[i]->RemoveMask ( mask[k] ); } } } MakeSelIndex ( selHnd,STYPE_ATOM,nsel ); } void SelManager::SelectAtoms ( int selHnd, ivector asn, int nsn, SELECTION_KEY selKey ) { // SelectAtoms(..) selects atoms with serial numbers given in // vector asn[0..nsn-1]. QuickSort QS; ivector asn1; int i,k,nsn1,j,j1,j2, sn,nsel; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections) || (nAtoms<=0)) return; k = selHnd-1; sk = selKey; if ((selType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) selType[k] = STYPE_ATOM; else if (selType[k]!=STYPE_ATOM) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; case SKEY_XAND: nsel = 0; break; } GetVectorMemory ( asn1,nsn,0 ); for (i=0;iTer) { sn = atom[i]->serNum; if ((asn1[0]<=sn) && (sn<=asn1[nsn1])) { // binary search j1 = 0; j2 = nsn1; do { j = (j1+j2)/2; if (snasn1[j]) j1 = j; else j1 = j2; } while (j1RemoveMask ( mask[k] ); } else if (sk==SKEY_AND) atom[i]->RemoveMask ( mask[k] ); } } FreeVectorMemory ( asn1,0 ); MakeSelIndex ( selHnd,STYPE_ATOM,nsel ); } void SelManager::UnselectAtoms ( int selHnd, int iSer1, int iSer2 ) { // UnselectAtoms(..) clears the specified mask for atoms in // the serial number range of iSer1 to iSer2. If iSer1=iSer2=0 // then all atoms are cleared of the specified mask. If selHnd // is set to 0, then the atoms are cleared of any mask. int i,s1,s2,k; if ((selHnd<=nSelections) && (nAtoms>0)) { k = selHnd-1; if (selType[k]==STYPE_UNDEFINED) selType[k] = STYPE_ATOM; else if (selType[k]!=STYPE_ATOM) return; if ((iSer1==0) && (iSer2==0)) { if (k<0) { for (i=0;iClearMask(); } else { for (i=0;iRemoveMask ( mask[k] ); } } else { if (iSer1<=iSer2) { s1 = iSer1; s2 = iSer2; } else { s1 = iSer2; s2 = iSer1; } // for a very general use, we allow the serial number // to differ from the atom's index, although this is // against PDB format. Therefore we apply here the most // primitive and less efficient way of selection if (k<0) { for (i=0;iserNum) && (atom[i]->serNum<=s2)) atom[i]->ClearMask(); } } else { for (i=0;iserNum) && (atom[i]->serNum<=s2)) atom[i]->RemoveMask ( mask[k] ); } } } MakeSelIndex ( selHnd,STYPE_ATOM,-1 ); } } pstr MakeList ( cpstr S ) { // makes the list of selecting items: // 1st character - special use, // then each item from S embraced by commas pstr L; int i,j; i = 0; while (S[i]==' ') i++; if (S[i]!='*') { // compile a searchable list L = new char[strlen(S)+5]; if (S[i]=='!') { L[0] = '!'; i++; } else L[0] = ' '; if (FirstOccurence(S,'[')) L[1] = '"'; else L[1] = ' '; L[2] = ','; j = 3; while (S[i]) { while (S[i]==' ') i++; if (S[i]=='[') { while (S[i] && (S[i]!=']')) L[j++] = S[i++]; L[j++] = ']'; if (S[i]==']') i++; } else while (S[i] && (S[i]!=' ') && (S[i]!=',')) L[j++] = S[i++]; while (S[i]==' ') i++; L[j++] = ','; if (S[i]==',') { i++; if (!S[i]) L[j++] = ','; // blank chain ID at the end assumed } } if (j==3) L[j++] = ','; L[j] = char(0); } else L = NULL; return L; } bool MatchName ( pstr L, pstr N ) { char M[sizeof(maxMMDBName)+5]; int i,j; if (L) { i = 0; M[0] = ','; j = 1; while (N[i]) if (N[i]==' ') i++; else M[j++] = N[i++]; M[j++] = ','; M[j] = char(0); if (strstr(&(L[2]),M)) return (L[0]!='!'); else if (L[1]!='"') return (L[0]=='!'); else { strcpy ( M,",[" ); strcat ( M,N ); strcat ( M,"]," ); if (strstr(&(L[2]),M)) return (L[0]!='!'); else return (L[0]=='!'); } } else return true; } bool MatchCharge ( pstr L, PAtom atom ) { char N[100]; if (L) { if (atom->WhatIsSet & ASET_Charge) { sprintf ( N,"%+2i",mround(atom->charge) ); return MatchName ( L,N ); } else return false; } else return true; } void SelManager::SelectAtom ( int selHnd, PAtom A, SELECTION_KEY selKey, bool makeIndex ) { int i, k, nsel; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections)) return; k = selHnd-1; sk = selKey; if ((selType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) selType[k] = STYPE_ATOM; else if (selType[k]!=STYPE_ATOM) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; case SKEY_XAND: nsel = 0; break; } SelectAtom ( A,k,sk,nsel); if (makeIndex) MakeSelIndex ( selHnd,STYPE_ATOM,nsel ); } void SelManager::SelectResidue ( int selHnd, PResidue Res, SELECTION_TYPE sType, SELECTION_KEY sKey, bool makeIndex ) { // Selects residue Res or all its atoms depending on selType PPAtom A; int i, k, nsel, nat; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections)) return; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; case SKEY_XAND: nsel = 0; break; } switch (sType) { case STYPE_ATOM : Res->GetAtomTable ( A,nat ); for (i=0;iTer) SelectAtom ( A[i],k,sk,nsel); } break ; case STYPE_RESIDUE : SelectObject ( Res,k,sk,nsel ); break ; default : ; } if (makeIndex) MakeSelIndex ( selHnd,sType,nsel ); } void SelManager::SelectChain ( int selHnd, PChain Chain, SELECTION_TYPE sType, SELECTION_KEY sKey, bool makeIndex ) { // Selects chain Chain or all its residues or atoms depending on selType PPAtom A; PPResidue Res; int i,j, k, nsel, nat,nres; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections)) return; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; case SKEY_XAND: nsel = 0; break; } switch (sType) { case STYPE_ATOM : Chain->GetResidueTable ( Res,nres ); for (i=0;iGetAtomTable ( A,nat ); for (j=0;jTer) SelectAtom ( A[j],k,sk,nsel); } } break ; case STYPE_RESIDUE : Chain->GetResidueTable ( Res,nres ); for (i=0;inSelections)) return; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; case SKEY_XAND: nsel = 0; break; } switch (sType) { case STYPE_ATOM : model->GetChainTable ( Chain,nch ); for (i=0;iGetResidueTable ( Res,nres ); for (j=0;jGetAtomTable ( A,nat ); for (n=0;nTer) SelectAtom ( A[n],k,sk,nsel); } } } break ; case STYPE_RESIDUE : model->GetChainTable ( Chain,nch ); for (i=0;iGetResidueTable ( Res,nres ); for (j=0;jGetChainTable ( Chain,nch ); for (i=0;inSelections)) return 0; k = selHnd-1; if (selType[k]==STYPE_UNDEFINED) return 0; MakeSelIndex ( selHnd,selType[k],-1 ); return nSelItems[k]; } void SelManager::MakeAllSelIndexes() { int k; for (k=0;knSelections) || (nAtoms<=0)) return; modelSel = false; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (sKey==SKEY_AND); altLocs1 = NULL; if (altLocs) { if (FirstOccurence(altLocs,hetIndicator)) { CreateCopy ( altLocs1,altLocs ); DelSpaces ( altLocs1 ); aloc_l = FirstOccurence ( altLocs1,hetIndicator ); aloc_l[0] = ' '; if (aloc_l[1]) aloc_l[1] = ' '; // instead of comma else if (aloc_l!=altLocs1) { aloc_l--; aloc_l[0] = ' '; } DelSpaces ( altLocs1 ); aloc_l = MakeList ( altLocs1 ); } else aloc_l = MakeList ( altLocs ); } else aloc_l = MakeList ( altLocs ); chain_l = MakeList ( Chains ); res_l = MakeList ( RNames ); atom_l = MakeList ( ANames ); elem_l = MakeList ( Elements ); segm_l = MakeList ( Segments ); charge_l = MakeList ( Charges ); // noRes==true means no residue restrictions noRes = (ResNo1==ResNo2) && (ResNo1==ANY_RES) && (Ins1[0]==Ins2[0]) && (Ins1[0]=='*'); Occ = (occ1>=0.0) || (occ2>=0.0); Dist = (d0>0.0); d02 = d0*d0; m1 = iModel-1; if (m1>=0) m2 = m1+1; // will take only this model else { m1 = 0; // will take m2 = nModels; // all models } if (m1>=nModels) return; for (n=0;nnChains;c++) { chain = mdl->chain[c]; if (chain) { // again check for safety if (MatchName(chain_l,chain->chainID)) { // the chain has to be taken i = 0; if (!noRes) while (inResidues) { res = chain->residue[i]; if (res) { if ((res->seqNum==ResNo1) && MatchName(res_l,res->name) && ((Ins1[0]=='*') || (!strcmp(res->insCode,Ins1)))) break; else if (selAND) { if (sType==STYPE_ATOM) res->UnmaskAtoms ( mask[k] ); else if (sType==STYPE_RESIDUE) res->RemoveMask ( mask[k] ); } } i++; } while (inResidues) { res = chain->residue[i]; if (res) { resSel = false; // will be true on 1st sel-n in the res-e if (MatchName(res_l,res->name)) { for (j=0;jnAtoms;j++) { atom = res->atom[j]; if (atom) { if ((!atom->Ter) && MatchName(atom_l ,atom->name ) && MatchName(elem_l ,atom->element) && MatchName(aloc_l ,atom->altLoc ) && MatchName(segm_l ,atom->segID ) && MatchCharge(charge_l,atom ) && ((!altLocs1) || atom->Het)) { Sel = true; if (Occ) Sel = ((occ1<=atom->occupancy) && (atom->occupancy<=occ2)); if (Dist) { dx = atom->x - x0; dy = atom->y - y0; dz = atom->z - z0; Sel = Sel && ((dx*dx+dy*dy+dz*dz)<=d02); } } else Sel = false; if (Sel) { SelectObject ( sType,atom,k,sk,nsel ); resSel = true; chainSel = true; modelSel = true; } else if (selAND && (sType==STYPE_ATOM)) atom->RemoveMask ( mask[k] ); } if (resSel && (sType!=STYPE_ATOM)) break; } } else if (selAND && (sType==STYPE_ATOM)) res->UnmaskAtoms ( mask[k] ); if ((!resSel) && selAND && (sType==STYPE_RESIDUE)) res->RemoveMask ( mask[k] ); if (chainSel && (sType>STYPE_RESIDUE)) break; if (!noRes) { if ((res->seqNum==ResNo2) && ((Ins2[0]=='*') || (!strcmp(res->insCode,Ins2))) ) break; } } i++; } if (selAND) { if (sType==STYPE_ATOM) while (inResidues) { res = chain->residue[i]; if (res) res->UnmaskAtoms ( mask[k] ); i++; } if (sType==STYPE_RESIDUE) while (inResidues) { res = chain->residue[i]; if (res) res->RemoveMask ( mask[k] ); i++; } } } else if (selAND) switch (sType) { case STYPE_ATOM : chain->UnmaskAtoms ( mask[k] ); break; case STYPE_RESIDUE : chain->UnmaskResidues ( mask[k] ); break; case STYPE_CHAIN : chain->RemoveMask ( mask[k] ); break; default : ; } if ((!chainSel) && selAND && (sType==STYPE_CHAIN)) chain->RemoveMask ( mask[k] ); if (modelSel && (sType>STYPE_CHAIN)) break; } } } else if (selAND) switch (sType) { case STYPE_ATOM : mdl->UnmaskAtoms ( mask[k] ); break; case STYPE_RESIDUE : mdl->UnmaskResidues ( mask[k] ); break; case STYPE_CHAIN : mdl->UnmaskChains ( mask[k] ); break; default : ; } if ((!modelSel) && selAND && (sType==STYPE_MODEL)) mdl->RemoveMask ( mask[k] ); } } // release dynamic memory if (chain_l) delete[] chain_l; if (res_l) delete[] res_l; if (atom_l) delete[] atom_l; if (elem_l) delete[] elem_l; if (altLocs1) delete[] altLocs1; if (aloc_l) delete[] aloc_l; if (segm_l) delete[] segm_l; if (charge_l) delete[] charge_l; MakeSelIndex ( selHnd,STYPE_ATOM,nsel ); } void SelManager::SelectAtoms ( int selHnd, // must be obtained from NewSelection() int iModel, // model number; iModel=0 means // 'any models' cpstr Chains, // may be several chains "A,B,W"; // "*" means 'any chain' (in model) int ResNo1, // starting residue number cpstr Ins1, // starting residue insertion code; // "*" means 'any code' int ResNo2, // ending residue number. // ResNo1=ResNo2=ANY_RES means 'any // residue number' (in chain) cpstr Ins2, // ending residue insertion code // "*" means 'any code' cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means 'any // residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in residue) cpstr Elements, // may be several element types like // "H,C,O,CU"; "*" means 'any // element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means 'any // alternative location' SELECTION_KEY sKey // selection key ) { Select ( selHnd,STYPE_ATOM,iModel,Chains,ResNo1,Ins1,ResNo2,Ins2, RNames,ANames,Elements,altLocs,sKey ); } int SelManager::Select ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX cpstr CID, // coordinate ID SELECTION_KEY sKey // selection key ) { InsCode insCode1,insCode2; pstr RNames; pstr ANames; pstr Elements; pstr altLocs; pstr Chains; int seqNum1 ,seqNum2; int iModel,l,RC; l = IMax(10,strlen(CID))+1; Chains = new char[l]; RNames = new char[l]; ANames = new char[l]; Elements = new char[l]; altLocs = new char[l]; if (strcmp(CID,"-all")) { RC = ParseSelectionPath ( CID,iModel,Chains,seqNum1,insCode1, seqNum2,insCode2,RNames,ANames, Elements,altLocs ); } else { iModel = 0; strcpy ( Chains,"*" ); seqNum1 = ANY_RES; seqNum2 = ANY_RES; strcpy ( insCode1,"*" ); strcpy ( insCode2,"*" ); strcpy ( RNames ,"*" ); strcpy ( ANames ,"*" ); strcpy ( Elements,"*" ); strcpy ( altLocs ,"" ); // only main conformation by default RC = 0; } if (!RC) { Select ( selHnd,sType,iModel,Chains,seqNum1,insCode1, seqNum2,insCode2,RNames,ANames,Elements,altLocs,sKey ); RC = 0; } delete[] Chains; delete[] RNames; delete[] ANames; delete[] Elements; delete[] altLocs; return RC; } void SelManager::Select ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; // "*" means 'any chain' (in model) int ResNo1, // starting residue number cpstr Ins1, // starting residue insertion code; // "*" means 'any code' int ResNo2, // ending residue number. // ResNo1=ResNo2=ANY_RES means 'any // residue number' (in chain) cpstr Ins2, // ending residue insertion code // "*" means 'any code' cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means 'any // residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in residue) cpstr Elements, // may be several element types like // "H,C,O,CU"; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means 'any // alternative location' SELECTION_KEY sKey // selection key ) { PModel mdl; PChain chain; PResidue res; PAtom atom; pstr chain_l; pstr res_l; pstr atom_l; pstr elem_l; pstr altLocs1; pstr aloc_l; int i,j,k,n,m1,m2,c, nsel; bool noRes,modelSel,chainSel,resSel,selAND; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections) || (nAtoms<=0)) return; modelSel = false; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (sKey==SKEY_AND); altLocs1 = NULL; if (altLocs) { if (FirstOccurence(altLocs,hetIndicator)) { CreateCopy ( altLocs1,altLocs ); DelSpaces ( altLocs1 ); aloc_l = FirstOccurence ( altLocs1,hetIndicator ); aloc_l[0] = ' '; if (aloc_l[1]) aloc_l[1] = ' '; // instead of comma else if (aloc_l!=altLocs1) { aloc_l--; aloc_l[0] = ' '; } DelSpaces ( altLocs1 ); aloc_l = MakeList ( altLocs1 ); } else aloc_l = MakeList ( altLocs ); } else aloc_l = MakeList ( altLocs ); chain_l = MakeList ( Chains ); res_l = MakeList ( RNames ); atom_l = MakeList ( ANames ); elem_l = MakeList ( Elements ); // noRes==true means no residue restrictions noRes = (ResNo1==ResNo2) && (ResNo1==ANY_RES) && (Ins1[0]=='*') && (Ins2[0]=='*'); m1 = iModel-1; if (m1>=0) m2 = m1+1; // will take only this model else { m1 = 0; // will take m2 = nModels; // all models } if (m1>=nModels) return; for (n=0;nnChains;c++) { chain = mdl->chain[c]; if (chain) { // again check for safety chainSel = false; // will be true on 1st sel-n in the chain if (MatchName(chain_l,chain->chainID)) { // the chain is to be taken i = 0; if (!noRes) // skip "leading" residues while (inResidues) { res = chain->residue[i]; if (res) { if ((res->seqNum==ResNo1) && MatchName(res_l,res->name) && ((Ins1[0]=='*') || (!strcmp(res->insCode,Ins1)))) break; else if (selAND) { if (sType==STYPE_ATOM) res->UnmaskAtoms ( mask[k] ); else if (sType==STYPE_RESIDUE) res->RemoveMask ( mask[k] ); } } i++; } while (inResidues) { res = chain->residue[i]; i++; if (res) { resSel = false; // will be true on 1st selection // in the residue if (MatchName(res_l,res->name)) { for (j=0;jnAtoms;j++) { atom = res->atom[j]; if (atom) { if ((!atom->Ter) && MatchName(atom_l,atom->name ) && MatchName(elem_l,atom->element) && MatchName(aloc_l,atom->altLoc ) && ((!altLocs1) || atom->Het)) { SelectObject ( sType,atom,k,sk,nsel ); resSel = true; chainSel = true; modelSel = true; } else if (selAND && (sType==STYPE_ATOM)) atom->RemoveMask ( mask[k] ); } if (resSel && (sType!=STYPE_ATOM)) break; } } else if (selAND && (sType==STYPE_ATOM)) res->UnmaskAtoms ( mask[k] ); if ((!resSel) && selAND && (sType==STYPE_RESIDUE)) res->RemoveMask ( mask[k] ); if (chainSel && (sType>STYPE_RESIDUE)) break; if (!noRes) { if ((res->seqNum==ResNo2) && ((Ins2[0]=='*') || (!strcmp(res->insCode,Ins2))) ) break; } } } if (selAND) { if (sType==STYPE_ATOM) while (inResidues) { res = chain->residue[i]; if (res) res->UnmaskAtoms ( mask[k] ); i++; } if (sType==STYPE_RESIDUE) while (inResidues) { res = chain->residue[i]; if (res) res->RemoveMask ( mask[k] ); i++; } } } else if (selAND) switch (sType) { case STYPE_ATOM : chain->UnmaskAtoms ( mask[k] ); break; case STYPE_RESIDUE : chain->UnmaskResidues ( mask[k] ); break; default : ; } if ((!chainSel) && selAND && (sType==STYPE_CHAIN)) chain->RemoveMask ( mask[k] ); if (modelSel && (sType>STYPE_CHAIN)) break; } } } else if (selAND) switch (sType) { case STYPE_ATOM : mdl->UnmaskAtoms ( mask[k] ); break; case STYPE_RESIDUE : mdl->UnmaskResidues ( mask[k] ); break; case STYPE_CHAIN : mdl->UnmaskChains ( mask[k] ); break; default : ; } if ((!modelSel) && selAND && (sType==STYPE_MODEL)) mdl->RemoveMask ( mask[k] ); } } // release dynamic memory if (chain_l) delete[] chain_l; if (res_l) delete[] res_l; if (atom_l) delete[] atom_l; if (elem_l) delete[] elem_l; if (altLocs1) delete[] altLocs1; if (aloc_l) delete[] aloc_l; MakeSelIndex ( selHnd,sType,nsel ); } void SelManager::Select ( int selHnd1, // destination, must be obtained // from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int selHnd2, // source, must be obtained from // NewSelection() and have been // used for selection SELECTION_KEY sKey // selection key ) { // SKEY_XOR works only downward the hierarchy! PAtom atom; PResidue res; PChain chain; PModel model; int k1,k2,i,j,l,n,nsel; SELECTION_KEY sk; if ((selHnd1<=0) || (selHnd1>nSelections) || (selHnd2<=0) || (selHnd2>nSelections) || (nAtoms<=0)) return; k1 = selHnd1-1; k2 = selHnd2-1; sk = sKey; if ((selType[k1]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k1] = sType; else if (selType[k1]!=sType) return; if (selType[k2]==STYPE_UNDEFINED) return; switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k1] ); nSelItems[k1] = 0; sk = SKEY_OR; nsel = 0; break; case SKEY_OR : if (nSelItems[k1]==0) sk = SKEY_NEW; nsel = nSelItems[k1]; break; case SKEY_AND : if (nSelItems[k1]==0) return; sk = SKEY_XAND; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k1]; break; case SKEY_CLR : nsel = nSelItems[k1]; if (nsel<=0) return; break; default : return; } switch (selType[k2]) { case STYPE_ATOM : for (i=0;iTer) SelectObject ( sType,atom,k1,sk,nsel ); } } break; case STYPE_RESIDUE : for (i=0;inAtoms;j++) { atom = res->atom[j]; if (atom) { if (!atom->Ter) SelectObject (atom,k1,sk,nsel); } } break; case STYPE_RESIDUE : //if (res->chain) SelectObject ( res,k1,sk,nsel ); break; case STYPE_CHAIN : if (res->chain) SelectObject ( res->chain,k1, sk,nsel ); break; case STYPE_MODEL : if (res->chain) { if (res->chain->model) SelectObject ( res->chain->model, k1,sk,nsel ); } default : ; } } break; case STYPE_CHAIN : for (i=0;inResidues;j++) { res = chain->residue[j]; if (res) for (l=0;lnAtoms;l++) { atom = res->atom[l]; if (atom) { if (!atom->Ter) SelectObject ( atom,k1, sk,nsel ); } } } break; case STYPE_RESIDUE : for (j=0;jnResidues;j++) { res = chain->residue[j]; if (res) SelectObject ( res,k1,sk,nsel ); } break; case STYPE_CHAIN : //if (chain->model) SelectObject ( chain,k1,sk,nsel ); break; case STYPE_MODEL : if (chain->model) SelectObject ( chain->model,k1, sk,nsel ); default : ; } } break; case STYPE_MODEL : for (i=0;inChains;j++) { chain = model->chain[j]; if (chain) for (l=0;lnResidues;l++) { res = chain->residue[l]; if (res) for (n=0;nnAtoms;n++) { atom = res->atom[n]; if (atom) { if (!atom->Ter) SelectObject ( atom,k1,sk,nsel ); } } } } break; case STYPE_RESIDUE : for (j=0;jnChains;j++) { chain = model->chain[j]; if (chain) for (l=0;lnResidues;l++) { res = chain->residue[j]; if (res) SelectObject ( res,k1,sk,nsel ); } } break; case STYPE_CHAIN : for (j=0;jnChains;j++) { chain = model->chain[j]; if (chain) SelectObject (chain,k1,sk,nsel); } break; case STYPE_MODEL : SelectObject ( model,k1,sk,nsel ); default : ; } } break; default : ; } if (sKey==SKEY_AND) for (i=0;iXadMask ( mask[k1] ); MakeSelIndex ( selHnd1,sType,nsel ); } void SelManager::SelectProperty ( int selHnd, // must be obtained from NewSelection() SELECTION_PROPERTY propKey, // property key SELECTION_TYPE sType, // selection type STYPE_XXXXX SELECTION_KEY sKey // selection key ) { PModel mdl; PChain chain; PResidue res; int i,k,selHnd1,nsel, m,c,r; bool doSelect; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections) || (nAtoms<=0)) return; k = selHnd-1; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; if (sType!=STYPE_RESIDUE) { selHnd1 = NewSelection(); if ((sKey==SKEY_AND) || (sKey==SKEY_CLR)) Select ( selHnd1,STYPE_RESIDUE,selHnd,SKEY_NEW ); } else selHnd1 = selHnd; k = selHnd1-1; selType[k] = STYPE_RESIDUE; sk = sKey; switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; sk = SKEY_OR; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; sk = SKEY_XAND; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } if ((sKey==SKEY_AND) || (sKey==SKEY_CLR)) { for (i=0;iisSolvent(); break; case SELPROP_Aminoacid : doSelect = res->isAminoacid(); break; case SELPROP_Nucleotide : doSelect = res->isNucleotide(); break; case SELPROP_Sugar : doSelect = res->isSugar(); break; case SELPROP_ModRes : doSelect = res->isModRes(); break; default : doSelect = false; } if (doSelect) SelectObject ( res,k,sk,nsel ); } } if (sKey==SKEY_AND) for (i=0;iXadMask ( mask[k] ); } else { for (m=0;mnChains;c++) { chain = mdl->chain[c]; if (chain) { for (r=0;rnResidues;r++) { res = chain->residue[r]; if (res) { switch (propKey) { case SELPROP_Solvent : doSelect = res->isSolvent(); break; case SELPROP_Aminoacid : doSelect = res->isAminoacid(); break; case SELPROP_Nucleotide : doSelect = res->isNucleotide(); break; case SELPROP_Sugar : doSelect = res->isSugar(); break; case SELPROP_ModRes : doSelect = res->isModRes(); break; default : doSelect = false; } if (doSelect) SelectObject ( res,k,sk,nsel ); } } } } } } } MakeSelIndex ( selHnd1,STYPE_RESIDUE,nsel ); if (sType!=STYPE_RESIDUE) { Select ( selHnd,sType,selHnd1,SKEY_NEW ); DeleteSelection ( selHnd1 ); } } void SelManager::SelectUDD ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle int selMin, // lower selection boundary int selMax, // upper selection boundary SELECTION_KEY sKey // selection key ) { PModel mdl; PChain chain; PResidue res; PAtom atom; int i,k,nsel,iudd, n,c,r,a; bool selAND; SELECTION_KEY sk; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; if ((selHnd<=0) || (selHnd>nSelections)) return; switch (sType) { case STYPE_ATOM : if ((UDDhandle & UDRF_ATOM)==0) return; break; case STYPE_RESIDUE : if ((UDDhandle & UDRF_RESIDUE)==0) return; break; case STYPE_CHAIN : if ((UDDhandle & UDRF_CHAIN)==0) return; break; case STYPE_MODEL : if ((UDDhandle & UDRF_MODEL)==0) return; break; default : return; } // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (sKey==SKEY_AND); for (n=0;ngetUDData ( UDDhandle,iudd ); if ((selMin<=iudd) && (iudd<=selMax)) SelectObject ( mdl,k,sk,nsel ); else if (selAND) mdl->RemoveMask ( mask[k] ); } else { for (c=0;cnChains;c++) { chain = mdl->chain[c]; if (chain) { // again check for safety if (sType==STYPE_CHAIN) { chain->getUDData ( UDDhandle,iudd ); if ((selMin<=iudd) && (iudd<=selMax)) SelectObject ( chain,k,sk,nsel ); else if (selAND) chain->RemoveMask ( mask[k] ); } else { for (r=0;rnResidues;r++) { res = chain->residue[r]; if (res) { if (sType==STYPE_RESIDUE) { res->getUDData ( UDDhandle,iudd ); if ((selMin<=iudd) && (iudd<=selMax)) SelectObject ( res,k,sk,nsel ); else if (selAND) res->RemoveMask ( mask[k] ); } else { for (a=0;anAtoms;a++) { atom = res->atom[a]; if (atom) { if (!atom->Ter) { atom->getUDData ( UDDhandle,iudd ); if ((selMin<=iudd) && (iudd<=selMax)) SelectObject ( atom,k,sk,nsel ); else if (selAND) atom->RemoveMask ( mask[k] ); } } } } } } } } } } } } MakeSelIndex ( selHnd,sType,nsel ); } void SelManager::SelectUDD ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle realtype selMin, // lower selection boundary realtype selMax, // upper selection boundary SELECTION_KEY sKey // selection key ) { PModel mdl; PChain chain; PResidue res; PAtom atom; realtype rudd; int i,k,nsel, n,c,r,a; bool selAND; SELECTION_KEY sk; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; if ((selHnd<=0) || (selHnd>nSelections)) return; switch (sType) { case STYPE_ATOM : if ((UDDhandle & UDRF_ATOM)==0) return; break; case STYPE_RESIDUE : if ((UDDhandle & UDRF_RESIDUE)==0) return; break; case STYPE_CHAIN : if ((UDDhandle & UDRF_CHAIN)==0) return; break; case STYPE_MODEL : if ((UDDhandle & UDRF_MODEL)==0) return; break; default : return; } // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (sKey==SKEY_AND); for (n=0;ngetUDData ( UDDhandle,rudd ); if ((selMin<=rudd) && (rudd<=selMax)) SelectObject ( mdl,k,sk,nsel ); else if (selAND) mdl->RemoveMask ( mask[k] ); } else { for (c=0;cnChains;c++) { chain = mdl->chain[c]; if (chain) { // again check for safety if (sType==STYPE_CHAIN) { chain->getUDData ( UDDhandle,rudd ); if ((selMin<=rudd) && (rudd<=selMax)) SelectObject ( chain,k,sk,nsel ); else if (selAND) chain->RemoveMask ( mask[k] ); } else { for (r=0;rnResidues;r++) { res = chain->residue[r]; if (res) { if (sType==STYPE_RESIDUE) { res->getUDData ( UDDhandle,rudd ); if ((selMin<=rudd) && (rudd<=selMax)) SelectObject ( res,k,sk,nsel ); else if (selAND) res->RemoveMask ( mask[k] ); } else { for (a=0;anAtoms;a++) { atom = res->atom[a]; if (atom) { if (!atom->Ter) { atom->getUDData ( UDDhandle,rudd ); if ((selMin<=rudd) && (rudd<=selMax)) SelectObject ( atom,k,sk,nsel ); else if (selAND) atom->RemoveMask ( mask[k] ); } } } } } } } } } } } } MakeSelIndex ( selHnd,sType,nsel ); } bool selSUDD ( cpstr sudd, cpstr selStr, int cmpRule, int ssLen ) { if (!sudd) return false; switch (cmpRule) { case UDSCR_LT : return (strcmp(sudd,selStr)<0); case UDSCR_LE : return (strcmp(sudd,selStr)<=0); case UDSCR_EQ : return (strcmp(sudd,selStr)==0); case UDSCR_NE : return (strcmp(sudd,selStr)!=0); case UDSCR_GE : return (strcmp(sudd,selStr)>=0); case UDSCR_GT : return (strcmp(sudd,selStr)>=0); case UDSCR_LTcase : return (strcasecmp(sudd,selStr)<0); case UDSCR_LEcase : return (strcasecmp(sudd,selStr)<=0); case UDSCR_EQcase : return (strcasecmp(sudd,selStr)==0); case UDSCR_NEcase : return (strcasecmp(sudd,selStr)!=0); case UDSCR_GEcase : return (strcasecmp(sudd,selStr)>=0); case UDSCR_GTcase : return (strcasecmp(sudd,selStr)>=0); case UDSCR_LTn : return (strncmp(sudd,selStr,ssLen)<0); case UDSCR_LEn : return (strncmp(sudd,selStr,ssLen)<=0); case UDSCR_EQn : return (strncmp(sudd,selStr,ssLen)==0); case UDSCR_NEn : return (strncmp(sudd,selStr,ssLen)!=0); case UDSCR_GEn : return (strncmp(sudd,selStr,ssLen)>=0); case UDSCR_GTn : return (strncmp(sudd,selStr,ssLen)>=0); case UDSCR_LTncase : return (strncasecmp(sudd,selStr,ssLen)<0); case UDSCR_LEncase : return (strncasecmp(sudd,selStr,ssLen)<=0); case UDSCR_EQncase : return (strncasecmp(sudd,selStr,ssLen)==0); case UDSCR_NEncase : return (strncasecmp(sudd,selStr,ssLen)!=0); case UDSCR_GEncase : return (strncasecmp(sudd,selStr,ssLen)>=0); case UDSCR_GTncase : return (strncasecmp(sudd,selStr,ssLen)>=0); case UDSCR_Substr : return (strstr(sudd,selStr)!=NULL); case UDSCR_NoSubstr : return (strstr(sudd,selStr)==NULL); case UDSCR_Substr1 : return (strstr(selStr,sudd)!=NULL); case UDSCR_NoSubstr1 : return (strstr(selStr,sudd)==NULL); default : return false; } } void SelManager::SelectUDD ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle cpstr selStr, // selection string int cmpRule, // comparison rule SELECTION_KEY sKey // selection key ) { PModel mdl; PChain chain; PResidue res; PAtom atom; int i,k,nsel,ssLen, n,c,r,a; bool selAND; SELECTION_KEY sk; k = selHnd-1; sk = sKey; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; if ((selHnd<=0) || (selHnd>nSelections)) return; switch (sType) { case STYPE_ATOM : if ((UDDhandle & UDRF_ATOM)==0) return; break; case STYPE_RESIDUE : if ((UDDhandle & UDRF_RESIDUE)==0) return; break; case STYPE_CHAIN : if ((UDDhandle & UDRF_CHAIN)==0) return; break; case STYPE_MODEL : if ((UDDhandle & UDRF_MODEL)==0) return; break; default : return; } // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (sKey==SKEY_AND); ssLen = strlen ( selStr ); for (n=0;ngetUDData(UDDhandle),selStr, cmpRule,ssLen)) SelectObject ( mdl,k,sk,nsel ); else if (selAND) mdl->RemoveMask ( mask[k] ); } else { for (c=0;cnChains;c++) { chain = mdl->chain[c]; if (chain) { // again check for safety if (sType==STYPE_CHAIN) { if (selSUDD(chain->getUDData(UDDhandle),selStr, cmpRule,ssLen)) SelectObject ( chain,k,sk,nsel ); else if (selAND) chain->RemoveMask ( mask[k] ); } else { for (r=0;rnResidues;r++) { res = chain->residue[r]; if (res) { if (sType==STYPE_RESIDUE) { if (selSUDD(res->getUDData(UDDhandle),selStr, cmpRule,ssLen)) SelectObject ( res,k,sk,nsel ); else if (selAND) res->RemoveMask ( mask[k] ); } else { for (a=0;anAtoms;a++) { atom = res->atom[a]; if (atom) { if (!atom->Ter) { if (selSUDD(atom->getUDData(UDDhandle),selStr, cmpRule,ssLen)) SelectObject ( atom,k,sk,nsel ); else if (selAND) atom->RemoveMask ( mask[k] ); } } } } } } } } } } } } MakeSelIndex ( selHnd,sType,nsel ); } void SelManager::SelectSphere ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX realtype x, // x-coordinate of the sphere's center realtype y, // y-coordinate of the sphere's center realtype z, // z-coordinate of the sphere's center realtype r, // radius of the sphere SELECTION_KEY sKey // selection key ) { // Selecting a sphere PPAtom A; PAtom atm; PResidue res; PChain chain; PModel mdl; realtype dx,dy,dz, r2; int i,k, nat,nsel, im,ic,ir; bool ASel, resSel,chainSel,modelSel,selAND; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections) || (r<=0.0)) return; k = selHnd-1; sk = sKey; A = atom; nat = nAtoms; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; nat = nSelItems[k]; A = (PPAtom)selection[k]; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; nat = nSelItems[k]; A = (PPAtom)selection[k]; break; default : return; } selAND = (sKey==SKEY_AND); if ((nat<=0) || (!A)) return; r2 = r*r; if (sType==STYPE_ATOM) { for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { dx = fabs(A[i]->x-x); if (dx<=r) { dy = fabs(A[i]->y-y); if (dy<=r) { dz = fabs(A[i]->z-z); if (dz<=r) { if (dx*dx+dy*dy+dz*dz<=r2) { ASel = true; SelectAtom ( A[i],k,sk,nsel ); } } } } } if (!ASel) A[i]->RemoveMask ( mask[k] ); } } else { for (im=0;imnChains;ic++) { chain = mdl->chain[ic]; if (chain) { chainSel = false; for (ir=0;irnResidues;ir++) { res = chain->residue[ir]; if (res) { resSel = false; for (i=0;inAtoms;i++) { atm = res->atom[i]; if (atm) { ASel = false; if ((!atm->Ter) && (atm->WhatIsSet & ASET_Coordinates)) { dx = fabs(atm->x-x); if (dx<=r) { dy = fabs(atm->y-y); if (dy<=r) { dz = fabs(atm->z-z); if (dz<=r) { if (dx*dx+dy*dy+dz*dz<=r2) { SelectObject ( sType,atm,k,sk,nsel ); ASel = true; resSel = true; chainSel = true; modelSel = true; } } } } } if (ASel) break; // selType>=STYPE_RESIDUE } } if ((!resSel) && selAND && (sType==STYPE_RESIDUE)) res->RemoveMask ( mask[k] ); if (chainSel && (sType>STYPE_RESIDUE)) break; } } if ((!chainSel) && selAND && (sType==STYPE_CHAIN)) chain->RemoveMask ( mask[k] ); if (modelSel && (sType>STYPE_CHAIN)) break; } } if ((!modelSel) && selAND && (sType==STYPE_MODEL)) mdl->RemoveMask ( mask[k] ); } } } MakeSelIndex ( selHnd,sType,nsel ); } void SelManager::SelectCylinder ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX realtype x1, // x-coordinate of the cylinder axis' 1st end realtype y1, // y-coordinate of the cylinder axis' 1st end realtype z1, // z-coordinate of the cylinder axis' 1st end realtype x2, // x-coordinate of the cylinder axis' 2nd end realtype y2, // y-coordinate of the cylinder axis' 2nd end realtype z2, // z-coordinate of the cylinder axis' 2nd end realtype r, // radius of the cylinder SELECTION_KEY sKey // selection key ) { // // Selecting a cylinder // // Method : given a line running through (x1,y1,z1) to (x2,y2,z2) on, // a point (x,y,z) is then projected on it at distance // // c1 = (c^2-a^2+b^2)/(2c), // // from (x1,y1,z1), where // 'a' is the distance between (x,y,z) and (x2,y2,z2) // 'b' is the distance between (x,y,z) and (x1,y1,z1) // 'c' is the distance between (x1,y1,z1) and (x2,y2,z2). // The distance between point (x,y,z) and line is determined as // // h^2 = b^2 - c1^2 // // If c1>=0 and c1<=c and h^2<=r^2 then point (x,y,z) is inside // a cylinder of radius 'r' with axis running from point // (x1,y1,z1) to (x2,y2,z2). // PPAtom A; PAtom atm; PResidue res; PChain chain; PModel mdl; realtype dx,dy,dz, c,dc,c1,c2, a2,b2, r2; int i,k, nat,nsel, im,ic,ir; bool resSel,chainSel,modelSel,selAND; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections) || (r<=0.0)) return; dx = x1-x2; dy = y1-y2; dz = z1-z2; c2 = dx*dx + dy*dy + dz*dz; if (c2<=0.0) return; c = sqrt(c2); dc = 2.0*c; r2 = r*r; k = selHnd-1; sk = sKey; A = atom; nat = nAtoms; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; nat = nSelItems[k]; A = (PPAtom)selection[k]; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; nat = nSelItems[k]; A = (PPAtom)selection[k]; break; default : return; } selAND = (sKey==SKEY_AND); if ((nat<=0) || (!A)) return; if (sType==STYPE_ATOM) { for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { dx = fabs(A[i]->x-x1); dy = fabs(A[i]->y-y1); dz = fabs(A[i]->z-z1); a2 = dx*dx + dy*dy + dz*dz; dx = fabs(A[i]->x-x2); dy = fabs(A[i]->y-y2); dz = fabs(A[i]->z-z2); b2 = dx*dx + dy*dy + dz*dz; c1 = (c2-a2+b2)/dc; if ((0.0<=c1) && (c1<=c) && (b2-c1*c1<=r2)) SelectAtom ( A[i],k,sk,nsel ); else if (sk==SKEY_AND) A[i]->RemoveMask ( mask[k] ); } } } else { for (im=0;imnChains;ic++) { chain = mdl->chain[ic]; if (chain) { chainSel = false; for (ir=0;irnResidues;ir++) { res = chain->residue[ir]; if (res) { resSel = false; for (i=0;inAtoms;i++) { atm = res->atom[i]; if (atm) { if ((!atm->Ter) && (atm->WhatIsSet & ASET_Coordinates)) { dx = fabs(atm->x-x1); dy = fabs(atm->y-y1); dz = fabs(atm->z-z1); a2 = dx*dx + dy*dy + dz*dz; dx = fabs(atm->x-x2); dy = fabs(atm->y-y2); dz = fabs(atm->z-z2); b2 = dx*dx + dy*dy + dz*dz; c1 = (c2-a2+b2)/dc; if ((0.0<=c1) && (c1<=c) && (b2-c1*c1<=r2)) { SelectObject ( sType,atm,k,sk,nsel ); resSel = true; chainSel = true; modelSel = true; break; // selType>=STYPE_RESIDUE } } } } if ((!resSel) && selAND && (sType==STYPE_RESIDUE)) res->RemoveMask ( mask[k] ); if (chainSel && (sType>STYPE_RESIDUE)) break; } } if ((!chainSel) && selAND && (sType==STYPE_CHAIN)) chain->RemoveMask ( mask[k] ); if (modelSel && (sType>STYPE_CHAIN)) break; } } if ((!modelSel) && selAND && (sType==STYPE_MODEL)) mdl->RemoveMask ( mask[k] ); } } } MakeSelIndex ( selHnd,sType,nsel ); } void SelManager::SelectSlab ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX realtype a, // a-parameter of the plane ax+by+cz=d realtype b, // b-parameter of the plane ax+by+cz=d realtype c, // c-parameter of the plane ax+by+cz=d realtype d, // d-parameter of the plane ax+by+cz=d realtype r, // distance to the plane SELECTION_KEY sKey // selection key ) { // // Selecting all atoms on a given distance from a plane // // Method : the distance between a point (x0,y0,z0) and a plane // defined by equation // // a*x + b*y + c*z = d // // is found as // // h = (d-a*x0-b*y0-c*z0)/sqrt(a^2+b^2+c^2) // // If |h|nSelections) || (r<=0.0)) return; v = sqrt(a*a + b*b + c*c); if (v<=0.0) return; k = selHnd-1; sk = sKey; A = atom; nat = nAtoms; if ((selType[k]==STYPE_UNDEFINED) || (sKey==SKEY_NEW)) selType[k] = sType; else if (selType[k]!=sType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; nat = nSelItems[k]; A = (PPAtom)selection[k]; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; nat = nSelItems[k]; A = (PPAtom)selection[k]; break; default : return; } selAND = (sKey==SKEY_AND); if ((nat<=0) || (!A)) return; if (sType==STYPE_ATOM) { for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { h = fabs(d-a*A[i]->x-b*A[i]->y-c*A[i]->z)/v; if (h<=r) SelectAtom ( A[i],k,sk,nsel ); else if (sk==SKEY_AND) A[i]->RemoveMask ( mask[k] ); } } } else { for (im=0;imnChains;ic++) { chain = mdl->chain[ic]; if (chain) { chainSel = false; for (ir=0;irnResidues;ir++) { res = chain->residue[ir]; if (res) { resSel = false; for (i=0;inAtoms;i++) { atm = res->atom[i]; if (atm) { if ((!atm->Ter) && (atm->WhatIsSet & ASET_Coordinates)) { h = fabs(d-a*A[i]->x-b*A[i]->y-c*A[i]->z)/v; if (h<=r) { SelectObject ( sType,atm,k,sk,nsel ); resSel = true; chainSel = true; modelSel = true; break; // selType>=STYPE_RESIDUE } } } } if ((!resSel) && selAND && (sType==STYPE_RESIDUE)) res->RemoveMask ( mask[k] ); if (chainSel && (sType>STYPE_RESIDUE)) break; } } if ((!chainSel) && selAND && (sType==STYPE_CHAIN)) chain->RemoveMask ( mask[k] ); if (modelSel && (sType>STYPE_CHAIN)) break; } } if ((!modelSel) && selAND && (sType==STYPE_MODEL)) mdl->RemoveMask ( mask[k] ); } } } MakeSelIndex ( selHnd,sType,nsel ); } void SelManager::SelectNeighbours ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX PPAtom sA, // array of already selected atoms int alen, // length of A realtype d1, // minimal distance to already selected atoms realtype d2, // maximal distance to already selected atoms SELECTION_KEY sKey // selection key ) { // Selecting all atoms on a given distance from already selected PPAtom A; PBrick B; PAtom atm; PResidue res; PChain chain; PModel mdl; realtype x,y,z, dx,dy,dz, dst, d12,d22; int i,j,k, dn, nx,ny,nz, nat,nsel, im,ic,ir; int ix1,ix2,ix, iy1,iy2,iy, iz1,iz2,iz; bool ASel,resSel,chainSel,modelSel,selAND; SELECTION_KEY sk; if ((selHnd<=0) || (selHnd>nSelections) || (d2<=0.0) || (d2RemoveMask ( mask[k] ); nSelItems[k] = 0; } return; } // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (sKey) { case SKEY_NEW : for (i=0;iRemoveMask ( mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; nat = nSelItems[k]; A = (PPAtom)selection[k]; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; nat = nSelItems[k]; A = (PPAtom)selection[k]; break; default : return; } selAND = (sk==SKEY_AND); if ((nat<=0) || (!A)) return; MakeBricks ( sA,alen,d2*1.5 ); dn = mround(d2/brick_size)+1; if (brick && (sType==STYPE_ATOM)) { for (i=0;iTer) { ASel = false; GetBrickCoor ( A[i],nx,ny,nz ); if (nx<0) nx++; ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); x = A[i]->x; y = A[i]->y; z = A[i]->z; for (ix=ix1;(ixnAtoms) && (!ASel);j++) if (B->atom[j]!=A[i]) { dx = fabs(x-B->atom[j]->x); if (dx<=d2) { dy = fabs(y-B->atom[j]->y); if (dy<=d2) { dz = fabs(z-B->atom[j]->z); if (dz<=d2) { dst = dx*dx+dy*dy+dz*dz; if ((dst>=d12) && (dst<=d22)) { ASel = true; SelectAtom ( A[i],k,sk,nsel ); } } } } } } if ((!ASel) && selAND) A[i]->RemoveMask ( mask[k] ); } } } else if (brick) { for (im=0;imnChains;ic++) { chain = mdl->chain[ic]; if (chain) { chainSel = false; for (ir=0;irnResidues;ir++) { res = chain->residue[ir]; if (res) { resSel = false; for (i=0;(inAtoms) && (!resSel);i++) { atm = res->atom[i]; if (atm) { if ((!atm->Ter) && (atm->WhatIsSet & ASET_Coordinates)) { GetBrickCoor ( atm,nx,ny,nz ); if (nx<0) nx++; ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); x = atm->x; y = atm->y; z = atm->z; for (ix=ix1;(ixnAtoms) && (!resSel);j++) if (B->atom[j]!=atm) { dx = fabs(x-B->atom[j]->x); if (dx<=d2) { dy = fabs(y-B->atom[j]->y); if (dy<=d2) { dz = fabs(z-B->atom[j]->z); if (dz<=d2) { dst = dx*dx+dy*dy+dz*dz; if ((dst>=d12) && (dst<=d22)) { SelectObject ( sType, atm,k,sk,nsel ); resSel = true; chainSel = true; modelSel = true; } } } } } } } } } if ((!resSel) && selAND && (sType==STYPE_RESIDUE)) res->RemoveMask ( mask[k] ); if (chainSel && (sType>STYPE_RESIDUE)) break; } } if ((!chainSel) && selAND && (sType==STYPE_CHAIN)) chain->RemoveMask ( mask[k] ); if (modelSel && (sType>STYPE_CHAIN)) break; } } if ((!modelSel) && selAND && (sType==STYPE_MODEL)) mdl->RemoveMask ( mask[k] ); } } } MakeSelIndex ( selHnd,sType,nsel ); } int TakeChainID ( pstr & p, pstr chainID ) { int RC,k; chainID[0] = char(0); if (*p) { RC = 0; if (*p==':') { // starts with colon <=> empty chain ID chainID[0] = char(0); p++; // advance to residue number } else if (p[1]==':') { // second symbol is colon <=> regular chain ID chainID[0] = *p; chainID[1] = char(0); p++; p++; // advance to residue number } else if (*p=='\'') { // starts with a strip <=> assume empty chain ID chainID[0] = char(0); p++; if (*p=='\'') { // closing strip must be followed by colon p++; if (*p!=':') RC = -1; } else { // no concluding strip <=> could be a strip chain ID, // although this must be captured by 2nd "if" chainID[0] = '\''; chainID[1] = char(0); // assume that residue number is following the strip } } else if ((int(*p)>=int('0')) && (int(*p)<=int('9'))) { // a digit without following semicolon looks very much // like residue number with unspecified empty chain ID chainID[0] = char(0); // assume that p already points on residue number } else { // assume a long chain ID k = 0; while (*p && (*p!=':') && (k<(int)sizeof(ChainID)-1)) { chainID[k++] = *p; p++; } if (*p==':') { chainID[k] = char(0); } else { // a mistake chainID[0] = char(0); RC = -1; } } while (*p==' ') p++; } else RC = 1; return RC; } int TakeResID( pstr & p, int & seqNum, pstr inscode ) { char N[100]; int i,RC; pstr endptr; RC = 1; inscode[0] = '*'; inscode[1] = char(0); seqNum = ANY_RES; if (((*p) && (int(*p)>=int('0')) && (int(*p)<=int('9'))) || (*p=='-')) { N[0] = *p; p++; i = 1; while ((*p) && (int(*p)>=int('0')) && (int(*p)<=int('9'))) { N[i++] = *p; p++; } N[i] = char(0); seqNum = mround(strtod(N,&endptr)); if ((seqNum==0) && (endptr==N)) RC = -1; else { RC = 0; if ((*p) && (*p!='-') && (*p!=',') && (*p!=' ')) { inscode[0] = *p; inscode[1] = char(0); p++; } else inscode[0] = char(0); if ((*p=='-') || (*p==',')) p++; } while (*p==' ') p++; } return RC; } int SelManager::SelectDomain ( int selHnd , cpstr domainRange, SELECTION_TYPE sType, SELECTION_KEY sKey, int modelNo ) { // domainRange is of the following format: // "*", "(all)" - take all file // "-" - take chain without chain ID // "a:Ni-Mj,b:Kp-Lq,..." - take chain a residue number N // insertion code i to residue number M // insertion code j plus chain b // residue number K insertion code p to // residue number L insertion code q and // so on. // "a:,b:..." - take whole chains a and b and so on // "a:,b:Kp-Lq,..." - any combination of the above. ChainID chainID; InsCode insCode1,insCode2; pstr S,p; int seqNum1,seqNum2,rc; SELECTION_KEY selKey1; if ((selHnd<=0) || (selHnd>nSelections)) return 1; // leave only required residues rc = 1; if (!domainRange) rc = 0; else if ((!domainRange[0]) || (domainRange[0]=='*')) rc = 0; else if (!strcasecmp(domainRange,"(all)")) rc = 0; if (!rc) { // select all Select ( selHnd,sType,modelNo,"*",ANY_RES,"*",ANY_RES,"*", "*","*","*","*",sKey ); return 0; } if (!strcasecmp(domainRange,"-")) { // select chain without chain ID Select ( selHnd,sType,modelNo,"",ANY_RES,"*",ANY_RES,"*", "*","*","*","*",sKey ); return 0; } S = new char[strlen(domainRange)+10]; strcpy ( S,domainRange ); DelSpaces ( S ); // UpperCase ( S ); p = S; rc = 0; selKey1 = sKey; while ((*p) && (!rc)) { if (TakeChainID(p,chainID)<0) rc = -1; else if (TakeResID(p,seqNum1,insCode1)<0) rc = -2; else if (TakeResID(p,seqNum2,insCode2)<0) rc = -3; else { Select ( selHnd,sType,modelNo,chainID, seqNum1,insCode1,seqNum2,insCode2, "*","*","*","*",selKey1 ); if (*p==',') p++; if (selKey1==SKEY_NEW) selKey1 = SKEY_OR; } } delete[] S; return rc; } int SelManager::GetSelLength ( int selHnd ) { if ((selHnd>0) && (selHnd<=nSelections)) return nSelItems[selHnd-1]; else return 0; } void SelManager::GetSelIndex ( int selHnd, PPAtom & SelAtom, int & nSelAtoms ) { if ((selHnd>0) && (selHnd<=nSelections)) { if (selType[selHnd-1]!=STYPE_ATOM) { SelAtom = NULL; nSelAtoms = 0; } else { SelAtom = (PPAtom)selection[selHnd-1]; nSelAtoms = nSelItems[selHnd-1]; } } else { SelAtom = NULL; nSelAtoms = 0; } } void SelManager::GetSelIndex ( int selHnd, PPResidue & SelResidue, int & nSelResidues ) { if ((selHnd>0) && (selHnd<=nSelections)) { if (selType[selHnd-1]!=STYPE_RESIDUE) { SelResidue = NULL; nSelResidues = 0; } else { SelResidue = (PPResidue)selection[selHnd-1]; nSelResidues = nSelItems[selHnd-1]; } } else { SelResidue = NULL; nSelResidues = 0; } } void SelManager::GetSelIndex ( int selHnd, PPChain & SelChain, int & nSelChains ) { if ((selHnd>0) && (selHnd<=nSelections)) { if (selType[selHnd-1]!=STYPE_CHAIN) { SelChain = NULL; nSelChains = 0; } else { SelChain = (PPChain)selection[selHnd-1]; nSelChains = nSelItems[selHnd-1]; } } else { SelChain = NULL; nSelChains = 0; } } void SelManager::GetSelIndex ( int selHnd, PPModel & SelModel, int & nSelModels ) { if ((selHnd>0) && (selHnd<=nSelections)) { if (selType[selHnd-1]!=STYPE_MODEL) { SelModel = NULL; nSelModels = 0; } else { SelModel = (PPModel)selection[selHnd-1]; nSelModels = nSelItems[selHnd-1]; } } else { SelModel = NULL; nSelModels = 0; } } void SelManager::GetAtomStatistics ( int selHnd, RAtomStat AS ) { int i,k; AS.Init(); if ((selHnd>0) && (selHnd<=nSelections)) { k = selHnd-1; switch (selType[k]) { case STYPE_MODEL : if (selection[k]) for (i=0;i CalAtomStatistics ( AS ); break; case STYPE_CHAIN : if (selection[k]) for (i=0;i CalAtomStatistics ( AS ); break; case STYPE_RESIDUE : if (selection[k]) for (i=0;i CalAtomStatistics ( AS ); break; case STYPE_ATOM : if (selection[k]) for (i=0;i CalAtomStatistics ( AS ); break; default : break; } } AS.Finish(); } void SelManager::SelectAtom ( PAtom atom, int maskNo, SELECTION_KEY sKey, int & nsel ) { bool ASel; ASel = atom->CheckMask ( mask[maskNo] ); switch (sKey) { default : case SKEY_NEW : case SKEY_OR : if (!ASel) { atom->SetMask ( mask[maskNo] ); nsel++; } break; case SKEY_AND : if (ASel) nsel++; break; case SKEY_XOR : if (ASel) { atom->RemoveMask ( mask[maskNo] ); nsel--; } else { atom->SetMask ( mask[maskNo] ); nsel++; } break; case SKEY_CLR : if (ASel) { atom->RemoveMask ( mask[maskNo] ); nsel--; } } } void SelManager::SelectObject ( SELECTION_TYPE sType, PAtom atm, int maskNo, SELECTION_KEY sKey, int & nsel ) { PMask object; switch (sType) { default : case STYPE_UNDEFINED : return; case STYPE_ATOM : object = atm; break; case STYPE_RESIDUE : object = atm->GetResidue(); break; case STYPE_CHAIN : object = atm->GetChain (); break; case STYPE_MODEL : object = atm->GetModel (); break; } if (!object) return; SelectObject ( object,maskNo,sKey,nsel ); } void SelManager::SelectObject ( PMask object, int maskNo, SELECTION_KEY sKey, int & nsel ) { bool ASel; ASel = object->CheckMask ( mask[maskNo] ); switch (sKey) { default : case SKEY_NEW : case SKEY_OR : if (!ASel) { object->SetMask ( mask[maskNo] ); nsel++; } break; case SKEY_AND : if (ASel) nsel++; break; case SKEY_XOR : if (ASel) { object->RemoveMask ( mask[maskNo] ); nsel--; } else { object->SetMask ( mask[maskNo] ); nsel++; } break; case SKEY_CLR : if (ASel) { object->RemoveMask ( mask[maskNo] ); nsel--; } break; case SKEY_XAND : if (ASel) { object->RemoveMask ( mask[maskNo] ); nsel++; } } } void SelManager::DeleteSelObjects ( int selHnd ) { PPModel model; PPChain chain; PPResidue res; PPAtom atom; int i,k,nSel; if ((selHnd>0) && (selHnd<=nSelections)) { k = selHnd-1; nSel = nSelItems[k]; switch (selType[k]) { case STYPE_MODEL : model = (PPModel)selection[k]; for (i=0;i0) && (selHnd<=nSelections)) { k1 = selHnd-1; k2 = k1+1; } else { k1 = 0; k2 = nSelections; } for (k=k1;kCheckMask(mask[k])) ns++; break; case STYPE_RESIDUE : for (n=0;nnChains;i++) { chain = mdl->chain[i]; if (chain) for (j=0;jnResidues;j++) { res = chain->residue[j]; if (res) if (res->CheckMask(mask[k])) ns++; } } } break; case STYPE_CHAIN : for (i=0;inChains;j++) { chain = mdl->chain[j]; if (chain) if (chain->CheckMask(mask[k])) ns++; } } break; case STYPE_MODEL : for (i=0;iCheckMask(mask[k])) ns++; break; default : ; } } else ns = nsel; if (selection[k]) delete[] selection[k]; if (ns>0) { selection[k] = new PMask[ns]; nns = 0; switch (sType) { case STYPE_ATOM : for (i=0;iCheckMask(mask[k])) { selection[k][nns++] = atom[i]; if (nns>=ns) nns = ns-1; } } break; case STYPE_RESIDUE : for (n=0;nnChains;i++) { chain = mdl->chain[i]; if (chain) for (j=0;jnResidues;j++) { res = chain->residue[j]; if (res) if (res->CheckMask(mask[k])) { selection[k][nns++] = res; if (nns>=ns) nns = ns-1; } } } } break; case STYPE_CHAIN : for (i=0;inChains;j++) { chain = mdl->chain[j]; if (chain) if (chain->CheckMask(mask[k])) { selection[k][nns++] = chain; if (nns>=ns) nns = ns-1; } } } break; case STYPE_MODEL : for (i=0;iCheckMask(mask[k])) { selection[k][nns++] = model[i]; if (nns>=ns) nns = ns-1; } break; default : ; } } else selection[k] = NULL; nSelItems[k] = ns; } } // ------------------- Stream functions ---------------------- void SelManager::write ( io::RFile f ) { int i,sType; byte Version=1; f.WriteByte ( &Version ); CoorManager::write ( f ); if (!isCompactBinary()) { f.WriteInt ( &nSelections ); for (i=0;i0) { mask = new PMask [nSelections]; selection = new PPMask[nSelections]; nSelItems = new int [nSelections]; selType = new SELECTION_TYPE[nSelections]; for (i=0;i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_FICIF__ #define __MMDB_FICIF__ #include "mmdb_machine_.h" using namespace mmdb; using namespace mmdb::machine; // ==================== FORTRAN INTERFACE ======================== FORTRAN_SUBR ( MMDB_FCIF_INIT, mmdb_fcif_init,(),(),() ); FORTRAN_SUBR ( MMDB_FCIF_QUIT, mmdb_fcif_quit,(),(),() ); FORTRAN_SUBR ( MMDB_FCIF_CREATE, mmdb_fcif_create, ( // lengths-at-end list fpstr DataName, // file name int DataName_len // fortran-hidden length of DataName ), ( // lengths-in-structure list fpstr DataName ), ( // lengths-follow list fpstr DataName, int DataName_len ) ); FORTRAN_SUBR ( MMDB_FCIF_WRITE, mmdb_fcif_write, ( // lengths-at-end list fpstr FileName, // file name int * iRet, // return code int FileName_len // fortran-hidden length of FileName ), ( // lengths-in-structure list fpstr FileName, int *iRet ), ( // lengths-follow list fpstr FileName, int FileName_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTDATE, mmdb_fcif_putdate, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTDOT, mmdb_fcif_putdot, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTQUESTION, mmdb_fcif_putquestion, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTSTRING, mmdb_fcif_putstring, ( // lengths-at-end list fpstr Data, // data string to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int Data_len, // fortran-hidden length of Data int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr Data, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr Data, int Data_len, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTREAL, mmdb_fcif_putreal, ( // lengths-at-end list apireal * V, // real value to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list apireal * V, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list apireal * V, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTINTEGER, mmdb_fcif_putinteger, ( // lengths-at-end list int * I, // integer value to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list int * I, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list int * I, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPDOT, mmdb_fcif_putloopdot, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPQUESTION, mmdb_fcif_putloopquestion, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPSTRING, mmdb_fcif_putloopstring, ( // lengths-at-end list fpstr Data, // data string to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int Data_len, // fortran-hidden length of Data int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr Data, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr Data, int Data_len, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPREAL, mmdb_fcif_putloopreal, ( // lengths-at-end list apireal * V, // real value to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list apireal * V, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list apireal * V, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPINTEGER, mmdb_fcif_putloopinteger, ( // lengths-at-end list int * I, // integer value to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list int * I, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list int * I, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); // ==================== C INTERFACE ======================== extern "C" void MMDB_CCIF_Init(); extern "C" void MMDB_CCIF_Quit(); extern "C" void MMDB_CCIF_Create ( pstr DataName ); extern "C" int MMDB_CCIF_Write ( pstr FileName ); extern "C" int MMDB_CCIF_PutDate ( pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutDot ( pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutQuestion ( pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutString ( pstr Data, pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutReal ( realtype V, pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutInteger ( int I, pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutLoopDot ( pstr CatName, pstr Tag, int nrow ); extern "C" int MMDB_CCIF_PutLoopQuestion ( pstr CatName, pstr Tag, int nrow ); extern "C" int MMDB_CCIF_PutLoopString ( pstr Data, pstr CatName, pstr Tag, int nrow ); extern "C" int MMDB_CCIF_PutLoopReal ( realtype V, pstr CatName, pstr Tag, int nrow ); extern "C" int MMDB_CCIF_PutLoopInteger ( int I, pstr CatName, pstr Tag, int nrow ); #endif mmdb2-2.0.20/mmdb2/mmdb_seqsuperpose.h0000744000175000017500000001211113271367640017351 0ustar maartenmaarten// $Id: mmdb_seqsuperpose.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 19.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : SeqSuperpose // ~~~~~~~~~ // **** Classes : mmdb::SeqSuperpose // ~~~~~~~~~ // // (C) E.Krissinel 2005-2013 // // ================================================================= // #ifndef __Seq_Superpose__ #define __Seq_Superpose__ #include "mmdb_manager.h" #include "mmdb_math_align.h" namespace mmdb { // ================================================================= enum SEQSP_RC { SEQSP_Ok = 0, SEQSP_IterLimit = 100, SEQSP_SeqThreshold = 101 }; DefineClass(SeqSuperpose); class SeqSuperpose { public : mat44 TMatrix; // superposes Ca1 over Ca2: |T*Ca1 - Ca2|->min realtype Q; // Q-score realtype rmsd; // rmsd realtype seqId; // sequence identity in structure alignment realtype _seqId; // sequence identity in sequence alignment int Nalign; // alignment length in structure alignment ivector c1; // sup-n vector: Ca1[i]->Ca2[c1[i]] if c1[i]>=0 ivector c2; // sup-n vector: Ca2[i]->Ca1[c2[i]] if c2[i]>=0 SeqSuperpose(); ~SeqSuperpose(); // Given two sets of atoms, Calpha1 and Calpha2, Superpose(...) // calculates the rotational-translational matrix TMatrix such // that |TMatrix*Calpha1 - Calpha2| is minimal in least-square // terms. // In difference of a full-scale SSM, this simplified version // uses initial superposition from sequence alignment, hence // it should be applied only to similar chains where calculation // time is crucial. seqThreshold specifies a threshold of // sequence identity (0<=seqThreshold<=1), below which // structural alignment is not performed and Superpose(..) // returns SEQSP_SeqThreshold. // // If keepBricks is set True, then space bricks are not // removed in MMDB and may be used in the next call if // vector Calpha2 does not change. This saves computation // time. // // The alignment results return in public fields above: // TMatrix - transformation matrix (1 if not aligned) // Q - quality Q-score (-1 if not aligned) // rmsd - r.m.s.d (MaxReal if not aligned) // seqId - sequence identity in structure alignment // (0 if not aligned) // Nalign - alignment length in structure alignment // (0 if not aligned) // c1,c2 - atom corrspondences: // Calpha1[i] <=> Calpha2[c1[i]] // Calpha2[i] <=> Calpha1[c2[i]] // // Upon success, Superpose(...) returns SEQSP_Ok // int Superpose ( PManager MMDB, PPAtom Calpha1, int nCalpha1, PPAtom Calpha2, int nCalpha2, realtype seqThreshold, bool keepBricks ); protected : math::PAlignment Align; PManager M; // pointers to PPAtom Ca1,Ca2; // the input data int nCa1,nCa2; // copy chain lengths ivector cn1,cn2; // temporary contact arrays realtype Rmsd0; // quality optimization parameter realtype maxContact; // maximal Calpha-pair contact parameter PContact contact; int ncontacts; void SeqSuperposeInit(); void FreeMemory (); realtype MatchQuality ( int Nalign, realtype Rmsd, int nres1, int nres2 ); realtype MatchQuality2 ( int Nalign, realtype dist2, int nres1, int nres2 ); void MakeContacts ( mat44 & TM, realtype cont_est ); int makeStructAlignment ( realtype seqThreshold, bool keepBricks ); }; } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_io_stream.h0000644000175000017500000001777713271367640016623 0ustar maartenmaarten// $Id: mmdb_io_stream.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 11.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Stream // ~~~~~~~~~ // **** Classes : mmdb::io::Stream ( Basic Stream Class ) // ~~~~~~~~~ // // (C) E. Krissinel 1995-2013 // // ================================================================= // #ifndef __MMDB_IO_Stream__ #define __MMDB_IO_Stream__ #include "mmdb_io_file.h" // ******************************************************************* #ifndef __ClassMacros # define __ClassMacros // A Class definition macros # define DefineClass(ClassName) \ class ClassName; \ typedef ClassName * P##ClassName; \ typedef ClassName & R##ClassName; \ typedef P##ClassName * PP##ClassName; \ typedef P##ClassName & RP##ClassName; // A Structure definition macros # define DefineStructure(StructureName) \ struct StructureName; \ typedef StructureName * P##StructureName; \ typedef StructureName & R##StructureName; \ typedef P##StructureName * PP##StructureName; \ typedef P##StructureName & RP##StructureName; #endif #define DefineStreamFunctions(ClassName) \ extern void StreamWrite ( mmdb::io::RFile f, RP##ClassName Object ); \ extern void StreamRead ( mmdb::io::RFile f, RP##ClassName Object ); #define MakeStreamFunctions(ClassName) \ void StreamWrite ( mmdb::io::RFile f, RP##ClassName Object ) { \ StreamWrite_ ( f,(mmdb::io::RPStream)Object ); \ } \ mmdb::io::PStream StreamInit##ClassName ( mmdb::io::RPStream Object ) { \ return (mmdb::io::PStream)(new ClassName(Object)); \ } \ void StreamRead ( mmdb::io::RFile f, RP##ClassName Object ) { \ StreamRead_ ( f,(mmdb::io::RPStream)Object,StreamInit##ClassName );\ } #define DefineFactoryFunctions(ClassName) \ typedef P##ClassName Make##ClassName(); \ typedef Make##ClassName * PMake##ClassName; \ typedef P##ClassName StreamMake##ClassName ( mmdb::io::RPStream Object ); \ P##ClassName new##ClassName (); \ P##ClassName streamNew##ClassName ( mmdb::io::RPStream Object ); \ typedef StreamMake##ClassName * PStreamMake##ClassName; \ extern void SetMakers##ClassName ( void * defMk, void * streamMk ); \ extern void StreamWrite ( mmdb::io::RFile f, RP##ClassName Object ); \ extern void StreamRead ( mmdb::io::RFile f, RP##ClassName Object ); #define MakeFactoryFunctions(ClassName) \ static PMake##ClassName make##ClassName = NULL; \ static PStreamMake##ClassName streamMake##ClassName = NULL; \ P##ClassName new##ClassName() { \ if (make##ClassName) return (*make##ClassName)(); \ else return new ClassName(); \ } \ P##ClassName streamNew##ClassName ( mmdb::io::RPStream Object ) { \ if (streamMake##ClassName) \ return (*streamMake##ClassName)(Object); \ else return new ClassName(Object); \ } \ void SetMakers##ClassName ( void * defMk, void * streamMk ) { \ make##ClassName = PMake##ClassName(defMk); \ streamMake##ClassName = PStreamMake##ClassName(streamMk); \ } \ void StreamWrite ( mmdb::io::RFile f, RP##ClassName Object ) { \ StreamWrite_ ( f,(mmdb::io::RPStream)Object ); \ } \ mmdb::io::PStream StreamInit##ClassName ( mmdb::io::RPStream Object ) { \ return (mmdb::io::PStream)(streamNew##ClassName(Object)); \ } \ void StreamRead ( mmdb::io::RFile f, RP##ClassName Object ) { \ StreamRead_ ( f,(mmdb::io::RPStream)Object,StreamInit##ClassName ); \ } namespace mmdb { namespace io { // ========================== Stream =========================== // Each streamable class should be derived from Stream // and have constructor Class(PStream & Object), which should // initialize all memory of the class, and virtual functions // read(..) and write(..) (see below). Constructor Class(PStream&) // must not touch the Object variable. This constructor is used // only once just before the read(..) function. It is assumed that // read(..)/write(..) functions of the Class provide storage/reading // of all vital data. Function read(..) must read data in exactly // the same way as function write(..) stores it. // For using Class in streams, three following functions should // be supplied: // // 1. // void StreamWrite ( File & f, PClass & Object ) { // StreamWrite ( f,(PStream)Object ); // } // // 2. // PStream ClassInit ( PStream & Object ) { // return (PStream)(new Class(Object)); // } // // 3. // void StreamRead ( File & f, PClass & Object ) { // StreamRead_ ( f,(PStream)Object,ClassInit ); // } // // All these functions are automatically generated by macros // DefineStreamFunctions(Class) -- in the header -- and // MakeStreamFunctions(Class) -- in the implementation body. Note // that macro DefineClass(Class) should always be issued for // streamable classes prior to the stream-making macros. Then // Class may be streamed using functions #1 and #3. // StreamRead will return NULL for Object if it was not in // the stream. If Object existed before calling StreamRead(..) // but was not found in the stream, it will be disposed (NULL // assigned). DefineClass(Stream); DefineStreamFunctions(Stream); class Stream { public : Stream () {} Stream ( RPStream ) {} virtual ~Stream () {} virtual void read ( RFile ) {} virtual void write ( RFile ) {} }; typedef PStream InitStreamObject(RPStream Object); extern void StreamRead_ ( RFile f, RPStream Object, InitStreamObject Init ); extern void StreamWrite_ ( RFile f, RPStream Object ); } } #endif mmdb2-2.0.20/mmdb2/mmdb_model.h0000644000175000017500000011371313271367640015724 0ustar maartenmaarten// $Id: mmdb_model.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 10.05.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Model // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::HetCompound ( description of het compounds ) // ~~~~~~~~~ mmdb::HetCompounds (HETNAM, HETSYN, FORMULA records) // mmdb::SSContainer (container for helixes and turns) // mmdb::Helix ( helix info ) // mmdb::Strand ( strand info ) // mmdb::Sheet ( sheet info ) // mmdb::Sheets ( container for sheets ) // mmdb::Turn ( turn info ) // mmdb::LinkContainer ( container for link data ) // mmdb::Link ( link data ) // mmdb::LinkRContainer ( container for refmac link ) // mmdb::LinkR ( link data ) // mmdb::CisPepContainer ( container for CisPep data ) // mmdb::CisPep ( CisPep data ) // mmdb::Model ( PDB model ) // // Copyright (C) E. Krissinel 2000-2015 // // ================================================================= // #ifndef __MMDB_Model__ #define __MMDB_Model__ #include "mmdb_io_stream.h" #include "mmdb_utils.h" #include "mmdb_chain.h" #include "mmdb_defs.h" namespace mmdb { // ==================== HetCompound ======================= DefineClass(HetCompound); DefineStreamFunctions(HetCompound); class HetCompound : public io::Stream { public : ResName hetID; // Het identifiers, right-justified pstr comment; int nSynonyms; psvector hetSynonym; // synonyms int compNum; // component number char wc; // '*' for water, otherwise space pstr Formula; // formulas HetCompound ( cpstr HetName ); HetCompound ( io::RPStream Object ); ~HetCompound(); void AddKeyWord ( cpstr W, bool Closed ); void HETNAM_PDBDump ( io::RFile f ); void HETSYN_PDBDump ( io::RFile f ); void FORMUL_PDBDump ( io::RFile f ); void FormComString ( pstr & F ); void FormSynString ( pstr & F ); void FormForString ( pstr & F ); void Copy ( PHetCompound hetCompound ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitHetCompound ( cpstr HetName ); void FreeMemory (); }; // ==================== SSContainer ====================== DefineClass(SSContainer); DefineStreamFunctions(SSContainer); class SSContainer : public ClassContainer { public : SSContainer () : ClassContainer() {} SSContainer ( io::RPStream Object ) : ClassContainer ( Object ) {} ~SSContainer () {} PContainerClass MakeContainerClass ( int ClassID ); }; // ==================== Helix ============================ DefineClass(Helix); DefineStreamFunctions(Helix); class Helix : public ContainerClass { public : int serNum; // serial number HelixID helixID; // helix ID ResName initResName; // name of the helix's initial residue ChainID initChainID; // chain ID for the chain containing the helix int initSeqNum; // sequence number of the initial residue InsCode initICode; // insertion code of the initial residue ResName endResName; // name of the helix's terminal residue ChainID endChainID; // chain ID for the chain containing the helix int endSeqNum; // sequence number of the terminal residue InsCode endICode; // insertion code of the terminal residue int helixClass; // helix class pstr comment; // comment about the helix int length; // length of the helix Helix (); Helix ( cpstr S ); Helix ( io::RPStream Object ); ~Helix(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_Helix; } void Copy ( PContainerClass Helix ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitHelix(); }; // ==================== Strand ============================ DefineClass(Strand); DefineStreamFunctions(Strand); class Strand : public io::Stream { public : StrandID sheetID; // sheet ID int strandNo; // strand number ResName initResName; // name of the strand's initial residue ChainID initChainID; // chain ID of initial residue in the strand int initSeqNum; // sequence number of the initial residue InsCode initICode; // insertion code of the initial residue ResName endResName; // name of the strand's terminal residue ChainID endChainID; // chain ID of terminal residue in the strand int endSeqNum; // sequence number of the terminal residue InsCode endICode; // insertion code of the terminal residue int sense; // sense of strand with respect to previous // strand AtomName curAtom; // registration; atom name in current strand ResName curResName; // registration; residue name in current // strand ChainID curChainID; // registration; chain ID in current strand int curResSeq; // registration; res-e seq numb in current // strand InsCode curICode; // registration; ins code in current strand AtomName prevAtom; // registration; atom name in previous strand ResName prevResName; // registration; residue name in previous // strand ChainID prevChainID; // registration; chain ID in previous strand int prevResSeq; // registration; res-e seq numb in previous // strand InsCode prevICode; // registration; ins code in previous strand Strand (); Strand ( io::RPStream Object ); ~Strand(); void PDBASCIIDump ( pstr S ); void MakeCIF ( mmcif::PData CIF ); ERROR_CODE ConvertPDBASCII ( cpstr S ); int GetCIF ( mmcif::PData CIF, cpstr sheet_id ); void Copy ( PStrand Strand ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitStrand(); }; // ==================== Sheet ============================ DefineClass(Sheet); DefineStreamFunctions(Sheet); class Sheet : public io::Stream { public : SheetID sheetID; // sheet ID int nStrands; // number of strands in the sheet PPStrand strand; // array of strands Sheet (); Sheet ( io::RPStream Object ); ~Sheet(); void FreeMemory(); void OrderSheet(); void PDBASCIIDump ( io::RFile f ); void MakeCIF ( mmcif::PData CIF ); ERROR_CODE ConvertPDBASCII ( cpstr S ); int GetCIF ( mmcif::PData CIF ); void Copy ( PSheet sheet ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitSheet (); void CIFFindStrands ( mmcif::PData CIF, cpstr Category ); void TryStrand ( int strand_no ); int GetStrand ( int strand_no ); }; // ==================== Sheets ============================ DefineClass(Sheets); DefineStreamFunctions(Sheets); class Sheets : public io::Stream { public : int nSheets; PPSheet sheet; Sheets (); Sheets ( io::RPStream Object ); ~Sheets(); void FreeMemory(); void PDBASCIIDump ( io::RFile f ); void MakeCIF ( mmcif::PData CIF ); ERROR_CODE ConvertPDBASCII ( cpstr S ); int GetCIF ( mmcif::PData CIF ); void Copy ( PSheets Sheets ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitSheets (); void CIFFindSheets ( mmcif::PData CIF, cpstr Category ); }; // ==================== Turn ============================ DefineClass(Turn); DefineStreamFunctions(Turn); class Turn : public ContainerClass { public : int serNum; // serial number TurnID turnID; // turn ID ResName initResName; // name of the turn's initial residue ChainID initChainID; // chain ID for the chain containing the turn int initSeqNum; // sequence number of the initial residue InsCode initICode; // insertion code of the initial residue ResName endResName; // name of the turn's terminal residue ChainID endChainID; // chain ID for the chain containing the turn int endSeqNum; // sequence number of the terminal residue InsCode endICode; // insertion code of the terminal residue pstr comment; // comment about the helix Turn (); Turn ( cpstr S ); Turn ( io::RPStream Object ); ~Turn(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_Turn; } void Copy ( PContainerClass turn ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitTurn(); }; // ==================== HetCompounds ======================= DefineClass(HetCompounds); DefineStreamFunctions(HetCompounds); class HetCompounds : public io::Stream { public : int nHets; PPHetCompound hetCompound; HetCompounds (); HetCompounds ( io::RPStream Object ); ~HetCompounds(); void FreeMemory (); void PDBASCIIDump ( io::RFile f ); void ConvertHETNAM ( cpstr S ); void ConvertHETSYN ( cpstr S ); void ConvertFORMUL ( cpstr S ); void MakeCIF ( mmcif::PData CIF ); ERROR_CODE GetCIF ( mmcif::PData CIF ); void Copy ( PHetCompounds hetCompounds ); void write ( io::RFile f ); void read ( io::RFile f ); protected : bool Closed; void InitHetCompounds(); int AddHetName ( cpstr H ); }; // =================== LinkContainer ===================== DefineClass(LinkContainer); DefineStreamFunctions(LinkContainer); class LinkContainer : public ClassContainer { public : LinkContainer () : ClassContainer() {} LinkContainer ( io::RPStream Object ) : ClassContainer ( Object ) {} ~LinkContainer () {} PContainerClass MakeContainerClass ( int ClassID ); }; // ==================== Link ============================ DefineClass(Link); DefineStreamFunctions(Link); class Link : public ContainerClass { public : AtomName atName1; // name of 1st linked atom AltLoc aloc1; // alternative location of 1st linked atom ResName resName1; // residue name of 1st linked atom ChainID chainID1; // chain ID of 1st linked atom int seqNum1; // sequence number of 1st linked atom InsCode insCode1; // insertion code of 1st linked atom AtomName atName2; // name of 2nd linked atom AltLoc aloc2; // alternative location of 2nd linked atom ResName resName2; // residue name of 2nd linked atom ChainID chainID2; // chain ID of 2nd linked atom int seqNum2; // sequence number of 2nd linked atom InsCode insCode2; // insertion code of 2nd linked atom int s1,i1,j1,k1; // sym id of 1st atom int s2,i2,j2,k2; // sym id of 2nd atom realtype dist; // link distance Link (); Link ( cpstr S ); Link ( io::RPStream Object ); ~Link(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_Link; } void Copy ( PContainerClass link ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitLink(); }; // =================== LinkRContainer ==================== DefineClass(LinkRContainer); DefineStreamFunctions(LinkRContainer); class LinkRContainer : public ClassContainer { public : LinkRContainer () : ClassContainer() {} LinkRContainer ( io::RPStream Object ) : ClassContainer ( Object ) {} ~LinkRContainer () {} PContainerClass MakeContainerClass ( int ClassID ); }; // ==================== LinkR ============================ DefineClass(LinkR); DefineStreamFunctions(LinkR); /* Garib's LINK LYS A 27 PLP A 255 PLPLYS LINK MAN S 3 MAN S 4 BETA1-4 LINK C6 BBEN B 1 O1 BMAF S 2 BEN-MAF LINK OE2 AGLU A 320 C1 AMAF S 2 GLU-MAF LINK OE2 GLU A 67 1.895 ZN ZN R 5 GLU-ZN LINK NE2 HIS A 71 2.055 ZN ZN R 5 HIS-ZN LINK O ARG A 69 2.240 NA NA R 9 ARG-NA Coot's LINKR O VAL C 103 NA NA C 401 VAL-NA LINKR OD1 ASP D 58 NA NA D 401 ASP-NA LINKR O ALA D 97 NA NA D 401 ALA-NA LINKR OG1 THR D 99 NA NA D 401 THR-NA LINKR O SER D 101 NA NA D 401 SER-NA LINKR O VAL D 103 NA NA D 401 VAL-NA PDB's LINK O GLY A 49 NA NA A6001 1555 1555 2.98 LINK OG1 THR A 51 NA NA A6001 1555 1555 2.72 LINK OD2 ASP A 66 NA NA A6001 1555 1555 2.72 LINK NE ARG A 68 NA NA A6001 1555 1555 2.93 LINK NE ARG A 68 NA NA A6001 1555 1555 2.93 LINK C21 2EG A 7 C22 2EG B 19 1555 1555 1.56 */ class LinkR : public ContainerClass { public : LinkRID linkRID; // link name AtomName atName1; // name of 1st linked atom AltLoc aloc1; // alternative location of 1st linked atom ResName resName1; // residue name of 1st linked atom ChainID chainID1; // chain ID of 1st linked atom int seqNum1; // sequence number of 1st linked atom InsCode insCode1; // insertion code of 1st linked atom AtomName atName2; // name of 2nd linked atom AltLoc aloc2; // alternative location of 2nd linked atom ResName resName2; // residue name of 2nd linked atom ChainID chainID2; // chain ID of 2nd linked atom int seqNum2; // sequence number of 2nd linked atom InsCode insCode2; // insertion code of 2nd linked atom realtype dist; // link distance LinkR (); LinkR ( cpstr S ); LinkR ( io::RPStream Object ); ~LinkR(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_LinkR; } void Copy ( PContainerClass LinkR ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitLinkR(); }; // =================== CisPepContainer ===================== DefineClass(CisPepContainer); DefineStreamFunctions(CisPepContainer); class CisPepContainer : public ClassContainer { public : CisPepContainer () : ClassContainer() {} CisPepContainer ( io::RPStream Object ) : ClassContainer ( Object ) {} ~CisPepContainer () {} PContainerClass MakeContainerClass ( int ClassID ); }; // ===================== CisPep =========================== DefineClass(CisPep); DefineStreamFunctions(CisPep); class CisPep : public ContainerClass { public : int serNum; // record serial number ResName pep1; // residue name ChainID chainID1; // chain identifier 1 int seqNum1; // residue sequence number 1 InsCode icode1; // insertion code 1 ResName pep2; // residue name 2 ChainID chainID2; // chain identifier 2 int seqNum2; // residue sequence number 2 InsCode icode2; // insertion code 2 int modNum; // model number realtype measure; // measure of the angle in degrees. CisPep (); CisPep ( cpstr S ); CisPep ( io::RPStream Object ); ~CisPep(); void PDBASCIIDump ( pstr S, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); CLASS_ID GetClassID () { return ClassID_CisPep; } void Copy ( PContainerClass cisPep ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitCisPep(); }; // ==================== Model =============================== enum SSE_RC { SSERC_Ok = 0, SSERC_noResidues = 1, SSERC_noAminoacids = 2, SSERC_noSSE = 3 }; enum SORT_CHAIN_DIR { SORT_CHAIN_ChainID_Asc = 0, SORT_CHAIN_ChainID_Desc = 1 }; DefineFactoryFunctions(Model); class Model : public ProModel { friend class Manager; friend class BondManager; friend class SelManager; friend class CoorManager; friend class Root; friend class Chain; friend class Residue; friend class Atom; public : Model (); // SetMMDBFile() MUST be used after this constructor! Model ( PManager MMDBF, int serialNum ); Model ( io::RPStream Object ); ~Model(); void SetMMDBManager ( PManager MMDBM, int serialNum ); PManager GetCoordHierarchy() { return manager; } // GetChainCreate() returns pointer on chain, whose identifier // is given in chID. If such a chain is absent in the model, // it is created. If enforceUniqueChainID is true and chain with // the same first letter in chain ID already exists in the model, // then the new chain ID will be appended with a serial number // in order to keep it unique. The model will contain chains like // A, A0, A1, A2, ... in such cases. PChain GetChainCreate ( const ChainID chID, bool enforceUniqueChainID ); // CreateChain() creates a new chain with chain ID regardless // the presence of same-ID chains in the model. This function // was introduced only for compatibility with older CCP4 // applications and using it in any new developments should be // strictly discouraged. PChain CreateChain ( const ChainID chID ); cpstr GetEntryID (); void SetEntryID ( const IDCode idCode ); int GetSerNum (); // returns the model's serial number cpstr GetModelID ( pstr modelID ); // returns "/mdl" int GetNumberOfModels (); // returns TOTAL number of models int GetNumberOfAtoms ( bool countTers ); // returns number // of atoms in the model int GetNumberOfResidues(); // returns number of residues in // the model // ---------------- Extracting chains -------------------------- int GetNumberOfChains(); // returns number of chains in the model bool GetNewChainID ( ChainID chID, int length=1 ); // GetChain() returns pointer on chain, whose identifier // is given in chID. If such a chain is absent in the model, // returns NULL. PChain GetChain ( const ChainID chID ); PChain GetChain ( int chainNo ); // returns chainNo-th chain // in the model; // 0<=chainNoindex-1; atom[]->index // is assigned automatically. void MoveChain ( PChain & m_chain, PPAtom m_atom, PPAtom atom, int & atom_index, int chain_ext ); void GetAIndexRange ( int & i1, int & i2 ); void MaskAtoms ( PMask mask ); void MaskResidues ( PMask mask ); void MaskChains ( PMask mask ); void UnmaskAtoms ( PMask mask ); void UnmaskResidues ( PMask mask ); void UnmaskChains ( PMask mask ); // ---- Getting Secondary Structure Elements int GetNumberOfHelices (); int GetNumberOfSheets (); PHelix GetHelix ( int serialNum ); // 1<=serNum<=NofHelices void GetSheetID ( int serialNum, SheetID sheetID ); // '\0' for none PSheet GetSheet ( int serialNum ); //1<=serNum<=NofSheets PSheet GetSheet ( const SheetID sheetID ); // NULL for none int GetNumberOfStrands ( int sheetSerNum ); int GetNumberOfStrands ( const SheetID sheetID ); PStrand GetStrand ( int sheetSerNum, int strandSerNum ); PStrand GetStrand ( const SheetID sheetID, int strandSerNum ); inline PSSContainer GetHelices() { return &helices; } inline PSheets GetSheets () { return &sheets; } void RemoveSecStructure(); int CalcSecStructure ( bool flagBulge=true, int aminoSelHnd=-1 ); // int CalcSecStructure ( bool flagBulge=true ); PHetCompounds GetHetInfo() { return &hetCompounds; } void RemoveHetInfo (); // ---- Working Links int GetNumberOfLinks (); PLink GetLink ( int serialNum ); // 1<=serNum<=NofLinks PLinkContainer GetLinks() { return &links; } void RemoveLinks(); void AddLink ( PLink link ); // ---- Working Refmac Links int GetNumberOfLinkRs (); PLinkR GetLinkR ( int serialNum ); // 1<=serNum<=NofLinks PLinkRContainer GetLinkRs() { return &linkRs; } void RemoveLinkRs(); void AddLinkR ( PLinkR linkR ); // ---- Working CisPeps int GetNumberOfCisPeps(); PCisPep GetCisPep ( int CisPepNum ); PCisPepContainer GetCisPeps() { return &cisPeps; } void RemoveCisPeps(); void AddCisPep ( PCisPep cisPep ); void ApplyTransform ( mat44 & TMatrix ); // transforms all // coordinates by multiplying // with matrix TMatrix bool isInSelection ( int selHnd ); // ------- user-defined data handlers int PutUDData ( int UDDhandle, int iudd ); int PutUDData ( int UDDhandle, realtype rudd ); int PutUDData ( int UDDhandle, cpstr sudd ); int GetUDData ( int UDDhandle, int & iudd ); int GetUDData ( int UDDhandle, realtype & rudd ); int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); int GetUDData ( int UDDhandle, pstr & sudd ); void Copy ( PModel model ); void CopyHets ( PModel model ); void CopySecStructure ( PModel model ); void CopyLinks ( PModel model ); void CopyLinkRs ( PModel model ); void CopyCisPeps ( PModel model ); void write ( io::RFile f ); void read ( io::RFile f ); protected : int serNum; // the model serial number PManager manager; // pointer to mmdbmanager class HetCompounds hetCompounds; // information on heterocompounds SSContainer helices; // information on helices Sheets sheets; // information on sheets SSContainer turns; // information on turns LinkContainer links; // information on links LinkRContainer linkRs; // information on refmac links CisPepContainer cisPeps; // information on cispeps int nChains; // number of chains int nChainsAlloc; // actual length of Chain[] PPChain chain; // array of chains bool Exclude; // used internally void InitModel (); void FreeMemory (); void ExpandChainArray ( int nOfChains ); ERROR_CODE GetCIFPSClass ( mmcif::PData CIF, int ClassID ); // _ExcludeChain(..) excludes (but does not dispose!) a chain // from the model. Returns 1 if the chain gets empty and 0 // otherwise. int _ExcludeChain ( const ChainID chainID ); // _copy(PModel) does not copy atoms! -- not for use in // applications void _copy ( PModel Model ); // _copy(PModel,PPAtom,int&) does copy atoms into array 'atom' // starting from position atom_index. 'atom' should be able to // accept all new atoms - no checks on the length of 'atom' // is being made. This function should not be used in applications. void _copy ( PModel Model, PPAtom atom, int & atom_index ); void CheckInAtoms (); }; } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_math_graph.cpp0000644000175000017500000017532413271367640017277 0ustar maartenmaarten// $Id: mmdb_math_graph.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_math_graph // ~~~~~~~~~ // **** Namespace: mmdb::math:: // ~~~~~~~~~~ // **** Classes : Vertex ( graph vertex ) // ~~~~~~~~~ Edge ( graph edge ) // Graph ( structural graph ) // GMatch ( GMatch of structural graphs ) // GraphMatch ( CSIA algorithms for graphs GMatching ) // // (C) E. Krissinel 2000-2013 // // When used, please cite: // // Krissinel, E. and Henrick, K. (2004) // Common subgraph isomorphism detection by backtracking search. // Software - Practice and Experience, 34, 591-607. // // ================================================================= // #include #include #include "mmdb_math_graph.h" #include "mmdb_tables.h" namespace mmdb { namespace math { // ========================= Vertex ========================== Vertex::Vertex() : io::Stream() { InitVertex(); } Vertex::Vertex ( io::RPStream Object ) : io::Stream(Object) { InitVertex(); } Vertex::Vertex ( cpstr chem_elem ) : io::Stream() { InitVertex(); SetVertex ( chem_elem ); } Vertex::Vertex ( int vtype ) : io::Stream() { InitVertex(); SetVertex ( vtype ); } Vertex::Vertex ( int vtype, cpstr vname ) : io::Stream() { InitVertex(); SetVertex ( vtype,vname ); } Vertex::Vertex ( cpstr chem_elem, cpstr vname ) : io::Stream() { InitVertex (); SetVertex ( chem_elem ); CreateCopy ( name,vname ); } Vertex::~Vertex() { if (name) delete[] name; } void Vertex::InitVertex() { name = NULL; type = 0; type_ext = 0; property = 0; id = 0; user_id = 0; } void Vertex::SetVertex ( cpstr chem_elem ) { // This function generates vertex type according to a chemical // element name passed in chem_elem. // // The element type has the following meaning: // // 0xCHSSTTTT // // where // T - resreved for elemenmt type // S - resreved for symmetry relief // H - reserved for hydrogen bonds // C - resreved for chirality flags // // Note that when more than 2 symbols are used for chemical element // name (custom use), fields S may be reallocated for element type // and then symmetry relief becomes impossible. // CreateCopy ( name,chem_elem ); type = getElementNo ( chem_elem ); if (type==ELEMENT_UNKNOWN) { type = 0; if (name[0]) { type = (int)name[0]; if (name[1]) { type = type*256+(int)name[1]; if (name[2]) type = type*256+(int)name[2]; } } type += nElementNames; } } void Vertex::SetVertex ( int vtype ) { // This function sets vertex type. See comments above for // the general rule for vertex types implied by this code. char N[50]; int type0; type = vtype; type0 = vtype & TYPE_MASK; if ((type0>=1) && (type0<=nElementNames)) CreateCopy ( name,ElementName[type0-1] ); else { sprintf ( N,"%i",type ); CreateCopy ( name,N ); } } void Vertex::SetType ( int vtype ) { type = vtype; } void Vertex::SetTypeExt ( int typeExt ) { type_ext = typeExt; } void Vertex::SetVertex ( int vtype, cpstr vname ) { type = vtype; CreateCopy ( name,vname ); } void Vertex::SetName ( cpstr vname ) { CreateCopy ( name,vname ); } void Vertex::SetID ( int vid ) { id = vid; } void Vertex::SetProperty ( int vprop ) { property = vprop; } int Vertex::GetNBonds() { return ((type & HYDROGEN_BOND) >> 24); } void Vertex::AddBond() { int nb = GetNBonds()+1; type &= ~HYDROGEN_BOND; type |= nb << 24; } void Vertex::CopyNBonds ( PVertex V ) { int nb = V->GetNBonds(); type &= ~HYDROGEN_BOND; type |= nb << 24; } void Vertex::RemoveChirality() { type &= CHIRAL_MASK; } void Vertex::LeaveChirality ( int eltype ) { // leaves chirality only on specified elements int vtype; vtype = type & CHIRAL_MASK; if (vtype!=eltype) type = vtype; } void Vertex::SaveType() { user_id = type; } void Vertex::RestoreType() { type = user_id; } void Vertex::CopyType ( PVertex V ) { type = V->type; } void Vertex::Print ( int PKey ) { if (PKey!=0) printf ( " name type" ); else printf ( " %10s %5i",name,type ); } void Vertex::Copy ( PVertex V ) { CreateCopy ( name,V->name ); type = V->type; type_ext = V->type_ext; property = V->property; id = V->id; user_id = V->user_id; } void Vertex::write ( io::RFile f ) { int Version=2; f.WriteInt ( &Version ); f.CreateWrite ( name ); f.WriteInt ( &type ); f.WriteInt ( &property ); f.WriteInt ( &id ); f.WriteInt ( &user_id ); f.WriteInt ( &type_ext ); } void Vertex::read ( io::RFile f ) { int Version; f.ReadInt ( &Version ); f.CreateRead ( name ); f.ReadInt ( &type ); f.ReadInt ( &property ); f.ReadInt ( &id ); f.ReadInt ( &user_id ); if (Version>1) f.ReadInt ( &type_ext ); else type_ext = 0; } void Vertex::mem_write ( pstr S, int & l ) { byte Version=2; mmdb::mem_write_byte ( Version,S,l ); mmdb::mem_write ( name ,S,l ); mmdb::mem_write ( type ,S,l ); mmdb::mem_write ( property,S,l ); mmdb::mem_write ( id ,S,l ); mmdb::mem_write ( user_id ,S,l ); mmdb::mem_write ( type_ext,S,l ); } void Vertex::mem_read ( cpstr S, int & l ) { byte Version; mmdb::mem_read_byte ( Version,S,l ); mmdb::mem_read ( name ,S,l ); mmdb::mem_read ( type ,S,l ); mmdb::mem_read ( property,S,l ); mmdb::mem_read ( id ,S,l ); mmdb::mem_read ( user_id ,S,l ); mmdb::mem_read ( type_ext,S,l ); } MakeStreamFunctions(Vertex) // =========================== Edge ============================= Edge::Edge() : io::Stream() { InitEdge(); } Edge::Edge ( io::RPStream Object ) : io::Stream(Object) { InitEdge(); } Edge::Edge ( int vx1, int vx2, int btype ) { InitEdge(); SetEdge ( vx1,vx2,btype ); } Edge::~Edge() {} void Edge::InitEdge() { v1 = 0; v2 = 0; type = 0; property = 0; } #define NofBondTypes 4 static pstr BondType[NofBondTypes+1] = { pstr("SING"), pstr("DOUB"), pstr("AROM"), pstr("TRIP"), pstr("") // should be here for safety }; void Edge::SetEdge ( int vx1, int vx2, cpstr btype ) { v1 = vx1; v2 = vx2; type = 0; while (type=NofBondTypes) { type = 0; if (btype[0]) type = (int)btype[0]; if (btype[1]) type = type*16+(int)btype[1]; if (btype[2]) type = type*16+(int)btype[2]; type += NofBondTypes; } type++; } void Edge::SetEdge ( int vx1, int vx2, int btype ) { v1 = vx1; v2 = vx2; type = btype; } void Edge::SetType ( int btype ) { type = btype; } void Edge::SetProperty ( int eprop ) { property = eprop; } void Edge::SaveType() { property = type; } void Edge::RestoreType() { type = property; } void Edge::Print ( int PKey ) { if (PKey!=0) printf ( " v1 v2 type" ); else printf ( " %5i %5i %5i",v1,v2,type ); } void Edge::Copy ( PEdge G ) { v1 = G->v1; v2 = G->v2; type = G->type; property = G->property; } void Edge::write ( io::RFile f ) { int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &v1 ); f.WriteInt ( &v2 ); f.WriteInt ( &type ); f.WriteInt ( &property ); } void Edge::read ( io::RFile f ) { int Version; f.ReadInt ( &Version ); f.ReadInt ( &v1 ); f.ReadInt ( &v2 ); f.ReadInt ( &type ); f.ReadInt ( &property ); } void Edge::mem_write ( pstr S, int & l ) { byte Version=1; mmdb::mem_write_byte ( Version,S,l ); mmdb::mem_write ( v1 ,S,l ); mmdb::mem_write ( v2 ,S,l ); mmdb::mem_write ( type ,S,l ); mmdb::mem_write ( property,S,l ); } void Edge::mem_read ( cpstr S, int & l ) { byte Version; mmdb::mem_read_byte ( Version,S,l ); mmdb::mem_read ( v1 ,S,l ); mmdb::mem_read ( v2 ,S,l ); mmdb::mem_read ( type ,S,l ); mmdb::mem_read ( property,S,l ); } MakeStreamFunctions(Edge) // ========================== Graph ============================ Graph::Graph() : io::Stream() { InitGraph(); } Graph::Graph ( PResidue R, cpstr altLoc ) : io::Stream() { InitGraph(); MakeGraph ( R,altLoc ); } Graph::Graph ( io::RPStream Object ) : io::Stream(Object) { InitGraph(); } Graph::~Graph() { FreeMemory(); } void Graph::InitGraph() { nVAlloc = 0; nEAlloc = 0; nGAlloc = 0; nVertices = 0; nEdges = 0; nAllVertices = 0; nAllEdges = 0; vertex = NULL; edge = NULL; graph = NULL; name = NULL; CreateCopy ( name,pstr("UNNAMED") ); } void Graph::FreeMemory() { int i; if (vertex) { for (i=0;i=nVAlloc) { nVAlloc += AllocPortion; V1 = new PVertex[nVAlloc]; for (i=0;i0) FreeMemory(); vertex = V; nVertices = vlen; nAllVertices = vlen; nVAlloc = vlen; } int Graph::GetVertexID ( int vertexNo ) { if ((vertexNo>0) && (vertexNo<=nAllVertices)) return vertex[vertexNo-1]->GetID(); else return MinInt4; } int Graph::GetNBondedVertices ( int vertexNo ) { if ((vertexNo>0) && (vertexNo<=nAllVertices)) { if (vertex[vertexNo-1]) return vertex[vertexNo-1]->GetNBonds(); } return 0; } int Graph::GetBondedVertexID ( int vertexNo, int bond_vx_type, int bondNo ) { int i,k, v1,v2; if ((vertexNo>0) && (vertexNo<=nAllVertices)) { if (vertex[vertexNo-1]) { if (vertex[vertexNo-1]->GetNBonds()>=bondNo) { k = 0; for (i=0;(iv1; v2 = edge[i]->v2; if ((v1==vertexNo) && ((vertex[v2-1]->type & (int)TYPE_MASK) == bond_vx_type) && (vertex[v2-1]->GetNBonds()==bondNo)) k = v2; if ((v2==vertexNo) && ((vertex[v1-1]->type & (int)TYPE_MASK) == bond_vx_type) && (vertex[v2-1]->GetNBonds()==bondNo)) k = v1; } if (k) return vertex[k-1]->GetID(); } } } return MinInt4; } PVertex Graph::GetVertex ( int vertexNo ) { if ((vertexNo>0) && (vertexNo<=nAllVertices)) return vertex[vertexNo-1]; else return NULL; } int Graph::GetVertexNo ( cpstr vname ) { int i,k; k = 0; if (vname) for (i=0;(iname)) k = i+1; return k; } PEdge Graph::GetEdge ( int edgeNo ) { if ((edgeNo>0) && (edgeNo<=nAllEdges)) return edge[edgeNo-1]; else return NULL; } void Graph::AddEdge ( PEdge G ) { int i; PPEdge G1; if (nAllEdges>=nEAlloc) { nEAlloc += AllocPortion; G1 = new PEdge[nEAlloc]; for (i=0;i0) FreeMemory(); edge = G; nEdges = glen; nAllEdges = glen; nEAlloc = glen; } void Graph::GetVertices ( PPVertex & V, int & nV ) { V = vertex; nV = nVertices; } void Graph::GetEdges ( PPEdge & E, int & nE ) { E = edge; nE = nEdges; } int Graph::MakeGraph ( PResidue R, cpstr altLoc ) { int i,j, a1,a2,e1,e2, nAltLocs,alflag, rc; bool B; rvector occupancy; AltLoc aLoc; PAltLoc aL; realtype dx,dy,dz, sr; PEdge G; rc = MKGRAPH_Ok; // reset graph FreeMemory(); occupancy = NULL; aL = NULL; R->GetAltLocations ( nAltLocs,aL,occupancy,alflag ); if (nAltLocs<=0) return MKGRAPH_NoAtoms; if (altLoc) strcpy ( aLoc,altLoc ); else aLoc[0] = char(0); if (nAltLocs<=1) { // Only one alt code is there, check if it is what was ordered if (strcmp(aLoc,aL[0])) { rc = MKGRAPH_ChangedAltLoc; strcpy ( aLoc,aL[0] ); } } else if ((alflag & ALF_Mess) || ((alflag & ALF_NoEmptyAltLoc) && (!aLoc[0]))) { // There is a mess in the residue alt codes, or empty alt code // does not designate a conformation but ordered. In this // situation build graph for maximal-occupancy conformation // and store its altLoc in aLoc. rc = MKGRAPH_MaxOccupancy; dx = -2.0; for (i=0;idx)) { dx = occupancy[i]; strcpy ( aLoc,aL[i] ); } } SetName ( R->name ); nVAlloc = R->nAtoms; // upper estimate for vertices to allocate if (nVAlloc<=0) { if (aL) delete[] aL; FreeVectorMemory ( occupancy,0 ); return MKGRAPH_NoAtoms; } // allocate vertex array vertex = new PVertex[nVAlloc]; for (i=0;inAtoms;i++) if (R->atom[i]) { if (!R->atom[i]->Ter) { if (nAltLocs>1) { // This is a many-altcode residue. aLoc contains the altcode // that has to be included. Check on it: B = !strcmp(aLoc,R->atom[i]->altLoc); if ((!B) && (!R->atom[i]->altLoc[0])) { // We got a non-aLoc code that is an "empty-altcode". // Check if this atom has the altcode that we need. for (j=i+1;(jnAtoms) && (!B);j++) if (R->atom[j]) { if ((!R->atom[j]->Ter) && (!strcmp(R->atom[j]->name,R->atom[i]->name))) B = !strcmp(aLoc,R->atom[j]->altLoc); } // if altcode=aLoc is not there for the atom (B is set // false) then we take its "empty-code" location B = !B; } } else B = true; if (B) { vertex[nVertices] = new Vertex ( R->atom[i]->element, R->atom[i]->name ); vertex[nVertices]->id = nVertices; vertex[nVertices]->user_id = i; nVertices++; } } } if (nVertices<=0) { if (aL) delete[] aL; FreeVectorMemory ( occupancy,0 ); return MKGRAPH_NoAtoms; } // make edges nEAlloc = 3*nVertices; edge = new PEdge[nEAlloc]; for (i=0;iuser_id; e1 = vertex[i]->type; if (e1>nElementNames) e1 = 6; e1--; for (j=i+1;juser_id; e2 = vertex[j]->type; if (e2>nElementNames) e2 = 6; e2--; dx = R->atom[a2]->x - R->atom[a1]->x; dy = R->atom[a2]->y - R->atom[a1]->y; dz = R->atom[a2]->z - R->atom[a1]->z; // sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.15; sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.25; if (dx*dx+dy*dy+dz*dzid = i+1; } if (aL) delete[] aL; FreeVectorMemory ( occupancy,0 ); nAllVertices = nVertices; nAllEdges = nEdges; return rc; } int Graph::MakeGraph ( PPAtom atom, int nAtoms ) { PEdge G; char atomID[100]; realtype dx,dy,dz, sr; int i,j, a1,a2,e1,e2, rc; rc = MKGRAPH_Ok; // reset graph FreeMemory(); nVAlloc = nAtoms; // upper estimate for vertices to allocate if (nVAlloc<=0) return MKGRAPH_NoAtoms; // allocate vertex array vertex = new PVertex[nVAlloc]; for (i=0;iTer) { vertex[nVertices] = new Vertex ( atom[i]->element, atom[i]->GetAtomIDfmt(atomID) ); vertex[nVertices]->user_id = i; nVertices++; } } if (nVertices<=0) { FreeMemory(); return MKGRAPH_NoAtoms; } // make edges nEAlloc = 3*nVertices; // just an inital guess edge = new PEdge[nEAlloc]; for (i=0;iuser_id; e1 = vertex[i]->type; if (e1>nElementNames) e1 = 6; e1--; for (j=i+1;juser_id; e2 = vertex[j]->type; if (e2>nElementNames) e2 = 6; e2--; dx = atom[a2]->x - atom[a1]->x; dy = atom[a2]->y - atom[a1]->y; dz = atom[a2]->z - atom[a1]->z; sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.25; if (dx*dx+dy*dy+dz*dzid = i+1; } nAllVertices = nVertices; nAllEdges = nEdges; return rc; } void Graph::MakeVertexIDs() { int i; for (i=0;iid = i+1; } void Graph::HideType ( int bond_vx_type ) { // 1. Moves vertices bond_vx_type to the end of vertex array // 2. Moves edges to bond_vx_type vertices to the end of edge array // 3. Saves lengths of full vertex and edge arrays, and redefines // lengths to initial parts of the arrays not containing // bond_vx_type vertices. PPEdge Edge1; PPVertex Vertex1; int i,k,v1,v2, nEdges1,nVertices1; ivector iv; Edge1 = new PEdge[nEdges]; Vertex1 = new PVertex[nVertices]; GetVectorMemory ( iv,nVertices,1 ); for (i=0;iv1-1; v2 = edge[i]->v2-1; if (vertex[v1] && vertex[v2]) { if ((vertex[v1]->type & (int)TYPE_MASK)==bond_vx_type) { vertex[v2]->AddBond(); vertex[v1]->CopyNBonds ( vertex[v2] ); } if ((vertex[v2]->type & (int)TYPE_MASK)==bond_vx_type) { vertex[v1]->AddBond(); vertex[v2]->CopyNBonds ( vertex[v1] ); } } } nVertices1 = 0; for (i=0;itype & (int)TYPE_MASK)!=bond_vx_type) { Vertex1[nVertices1++] = vertex[i]; iv[i+1] = nVertices1; } } k = nVertices1; for (i=0;itype & (int)TYPE_MASK)==bond_vx_type) { Vertex1[k++] = vertex[i]; iv[i+1] = k; } } nEdges1 = 0; for (i=0;iv1 = iv[edge[i]->v1]; edge[i]->v2 = iv[edge[i]->v2]; if (((Vertex1[edge[i]->v1-1]->type & (int)TYPE_MASK) != bond_vx_type) && ((Vertex1[edge[i]->v2-1]->type & (int)TYPE_MASK) != bond_vx_type)) Edge1[nEdges1++] = edge[i]; } k = nEdges1; for (i=0;iv1-1]->type & (int)TYPE_MASK) == bond_vx_type) || ((Vertex1[edge[i]->v2-1]->type & (int)TYPE_MASK) == bond_vx_type)) Edge1[k++] = edge[i]; } nAllVertices = nVertices; nAllEdges = nEdges; nVAlloc = nVertices; nEAlloc = nEdges; nVertices = nVertices1; nEdges = nEdges1; if (vertex) delete[] vertex; if (edge) delete[] edge; FreeVectorMemory ( iv,1 ); vertex = Vertex1; edge = Edge1; } void Graph::ExcludeType ( int type ) { int i,k; ivector iv; GetVectorMemory ( iv,nAllVertices,1 ); k = 0; for (i=0;itype & (int)TYPE_MASK)!=type) { if (kv1]!=0) && (iv[edge[i]->v2]!=0)) { if (kv1 = iv[edge[k]->v1]; edge[k]->v2 = iv[edge[k]->v2]; k++; } else { delete edge[i]; edge[i] = NULL; } nAllEdges = k; nEdges = nAllEdges; FreeVectorMemory ( iv,1 ); } void Graph::RemoveChirality() { int i; for (i=0;iRemoveChirality(); } void Graph::LeaveChirality ( int eltype ) { // leaves chirality for specified atom types int i; for (i=0;iLeaveChirality ( eltype ); } void Graph::MakeSymmetryRelief ( bool noCO2 ) { // This function looks for groups of equivalent vertices // attached to a single vertice (e.g. chemical SO3 or // PO3 groups), and re-lables them by adding a unique // symmetry-relief number. This eliminates equivalent // GMatches (3! for each SO3/PO3 group), and increases // vertex diversity, which considerably speeds up GMatching. // The function is cheap and harmless even if such groups // of vertices are not found. // If noCO2 is true then CO2 symmetry is not releaved. ivector v,vc; int i,j,k,n,m,almask,vjtype, ctype,otype; bool noOxygens; otype = 0; ctype = 0; GetVectorMemory ( v ,nVertices,0 ); GetVectorMemory ( vc,nVertices,1 ); for (i=1;i<=nVertices;i++) vc[i] = 0; for (j=0;jv1>0) && (edge[j]->v1<=nVertices)) vc[edge[j]->v1]++; if ((edge[j]->v2>0) && (edge[j]->v2<=nVertices)) vc[edge[j]->v2]++; } almask = ~ATOM_LEAVING; if (noCO2) { ctype = getElementNo ( "C" ); otype = getElementNo ( "O" ); } noOxygens = false; for (i=1;i<=nVertices;i++) if (vc[i]>1) { // vertex at more than 1 edge // v[] will list connected vertices, k will be their number k = 0; for (j=0;jv1==i) && (vc[edge[j]->v2]==1) && (kv2-1; if ((edge[j]->v2==i) && (vc[edge[j]->v1]==1) && (kv1-1; } if (k>1) { if (noCO2) noOxygens = ((vertex[i-1]->type & almask)==ctype); // A group of vertices with single connection is // identified. Assign symmetry relief modifiers // to *equivalent* vertices in the group for (j=0;j=0) && (v[j]type & almask; if ((!noOxygens) || (vjtype!=otype)) { n = 1; // symmetry relief modifier for (m=j+1;m=0) && (v[m]type== (vertex[v[m]]->type & almask)) { vertex[v[m]]->type |= (n << 16); n++; v[m] = -1; } } } } } } FreeVectorMemory ( v ,0 ); FreeVectorMemory ( vc,1 ); } int Graph::Build ( bool bondOrder ) { int i,j, rc; if (nVertices<=0) return 2; if (nGAllocv1>=1) && (edge[i]->v1<=nVertices) && (edge[i]->v2>=1) && (edge[i]->v2<=nVertices)) { graph[edge[i]->v1][edge[i]->v2] = edge[i]->type; graph[edge[i]->v2][edge[i]->v1] = edge[i]->type; } else rc = 1; } else { for (i=0;iv1>=1) && (edge[i]->v1<=nVertices) && (edge[i]->v2>=1) && (edge[i]->v2<=nVertices)) { graph[edge[i]->v1][edge[i]->v2] = 1; graph[edge[i]->v2][edge[i]->v1] = 1; } else rc = 1; } return rc; } const int ring_mask[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080 }; void Graph::IdentifyRings() { GraphMatch GM; Graph ring; ivector F1,F2; AtomName aname; realtype p1,p2; int i,j,n,nrings,nv; Build ( false ); for (i=0;itype_ext = 0; GM.SetFlag ( GMF_UniqueMatch ); for (n=3;n<=10;n++) { ring.Reset(); for (i=1;i<=n;i++) { sprintf ( aname,"C%i",i ); ring.AddVertex ( new Vertex("C",aname) ); } ring.MakeVertexIDs(); for (i=1;i<=n;i++) { j = i+1; if (j>n) j = 1; ring.AddEdge ( new Edge(i,j,1) ); } ring.Build ( false ); GM.MatchGraphs ( this,&ring,n,false,EXTTYPE_Ignore ); nrings = GM.GetNofMatches(); for (i=0;itype_ext |= ring_mask[n]; } } } void Graph::markConnected ( int vno, int cno ) { int i; vertex[vno]->type_ext = cno; for (i=0;itype_ext)) markConnected ( i,cno ); } int Graph::IdentifyConnectedComponents() { // Returns the number of connected components and sets // vertex[]->type_ext equal to component number >=1. int nComponents,i; nComponents = 0; Build ( false ); for (i=0;itype_ext = 0; i = 0; while (itype_ext) i++; else break; if (i0) { printf ( " Vertices:\n"" ## " ); vertex[0]->Print(1); printf ( "\n" ); for (i=0;iPrint(0); printf ( "\n" ); } } if (nEdges>0) { printf ( " Edges:\n"" ## " ); edge[0]->Print(1); printf ( "\n" ); for (i=0;iPrint(0); printf ( "\n" ); } } } void Graph::Print1() { int i,j; for (i=0;iid,vertex[i]->type,vertex[i]->name ); for (j=0;jv1==i+1) printf ( " %4i(%i)",edge[j]->v2,edge[j]->type ); else if (edge[j]->v2==i+1) printf ( " %4i(%i)",edge[j]->v1,edge[j]->type ); printf ( "\n" ); } } void Graph::Copy ( PGraph G ) { int i; FreeMemory(); CreateCopy ( name,G->name ); nVertices = G->nVertices; nEdges = G->nEdges; nAllVertices = G->nAllVertices; nAllEdges = G->nAllEdges; if (nAllVertices>0) { nVAlloc = nAllVertices; vertex = new PVertex[nVAlloc]; for (i=0;iCopy ( G->vertex[i] ); } } if (nAllEdges>0) { nEAlloc = nAllEdges; edge = new PEdge[nEAlloc]; for (i=0;iCopy ( G->edge[i] ); } } } void Graph::write ( io::RFile f ) { int i; int Version=2; bool bondOrder=false; f.WriteInt ( &Version ); f.WriteBool ( &bondOrder ); f.CreateWrite ( name ); f.WriteInt ( &nVertices ); f.WriteInt ( &nEdges ); f.WriteInt ( &nAllVertices ); f.WriteInt ( &nAllEdges ); for (i=0;i1) { f.ReadInt ( &nAllVertices ); f.ReadInt ( &nAllEdges ); } else { nAllVertices = nVertices; nAllEdges = nEdges; } if (nAllVertices>0) { nVAlloc = nAllVertices; vertex = new PVertex[nVAlloc]; for (i=0;i0) { nEAlloc = nAllEdges; edge = new PEdge[nEAlloc]; for (i=0;imem_write ( S,l ); } else { k = 0; mmdb::mem_write ( k,S,l ); } for (i=0;imem_write ( S,l ); } else { k = 0; mmdb::mem_write ( k,S,l ); } } void Graph::mem_read ( cpstr S, int & l ) { int i,k; byte Version; bool bondOrder; FreeMemory(); mmdb::mem_read_byte ( Version,S,l ); mmdb::mem_read ( bondOrder ,S,l ); mmdb::mem_read ( name ,S,l ); mmdb::mem_read ( nVertices ,S,l ); mmdb::mem_read ( nEdges ,S,l ); mmdb::mem_read ( nAllVertices,S,l ); mmdb::mem_read ( nAllEdges ,S,l ); if (nAllVertices>0) { nVAlloc = nAllVertices; vertex = new PVertex[nVAlloc]; for (i=0;imem_read ( S,l ); } else vertex[i] = NULL; } } if (nAllEdges>0) { nEAlloc = nAllEdges; edge = new PEdge[nEAlloc]; for (i=0;imem_read ( S,l ); } else { edge[i] = NULL; } } } // Build ( bondOrder ); } MakeStreamFunctions(Graph) // ========================== GMatch ============================ GMatch::GMatch() : io::Stream() { InitGMatch(); } GMatch::GMatch ( io::RPStream Object ) : io::Stream ( Object ) { InitGMatch(); } GMatch::GMatch ( ivector FV1, ivector FV2, int nv, int n, int m ) { int i; if (FV1 && FV2) { n1 = n; n2 = m; nAlloc = n; GetVectorMemory ( F1,nAlloc,1 ); GetVectorMemory ( F2,nAlloc,1 ); mlength = nv; for (i=1;i<=mlength;i++) { F1[i] = FV1[i]; F2[i] = FV2[i]; } } else InitGMatch(); } void GMatch::InitGMatch() { mlength = 0; n1 = 0; n2 = 0; nAlloc = 0; F1 = NULL; F2 = NULL; } GMatch::~GMatch() { FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); } void GMatch::SetMatch ( ivector FV1, ivector FV2, int nv, int n, int m ) { int i; if (FV1 && FV2) { if (nv>nAlloc) { FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); nAlloc = n; GetVectorMemory ( F1,nAlloc,1 ); GetVectorMemory ( F2,nAlloc,1 ); } n1 = n; n2 = m; mlength = nv; for (i=1;i<=mlength;i++) { F1[i] = FV1[i]; F2[i] = FV2[i]; } } else { FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); mlength = 0; n1 = 0; n2 = 0; } } bool GMatch::isMatch ( ivector FV1, ivector FV2, int nv ) { int i,j; bool B; if (FV1 && FV2 && (nv<=mlength)) { B = true; for (i=1;(i<=nv) && B;i++) { B = false; for (j=1;(j<=mlength) && (!B);j++) B = (FV1[i]==F1[j]) && (FV2[i]==F2[j]); } return B; } return false; } bool GMatch::isCombination ( ivector FV1, ivector FV2, int nv ) { int i,j; bool B; if (FV1 && FV2 && (nv==mlength)) { B = true; for (i=1;(i<=nv) && B;i++) { B = false; for (j=1;(j<=mlength) && (!B);j++) B = (FV1[i]==F1[j]); if (B) { B = false; for (j=1;(j<=mlength) && (!B);j++) B = (FV2[i]==F2[j]); } } return B; } return false; } void GMatch::GetMatch ( ivector & FV1, ivector & FV2, int & nv, realtype & p1, realtype & p2 ) { FV1 = F1; FV2 = F2; nv = mlength; p1 = mlength; if (p1>0.0) p1 /= n1; p2 = mlength; if (p2>0.0) p2 /= n2; } void GMatch::write ( io::RFile f ) { int i; int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &mlength ); f.WriteInt ( &n1 ); f.WriteInt ( &n2 ); for (i=1;i<=mlength;i++) { f.WriteInt ( &(F1[i]) ); f.WriteInt ( &(F2[i]) ); } } void GMatch::read ( io::RFile f ) { int i,Version; FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); f.ReadInt ( &Version ); f.ReadInt ( &mlength ); f.ReadInt ( &n1 ); f.ReadInt ( &n2 ); if (mlength>0) { nAlloc = n1; GetVectorMemory ( F1,nAlloc,1 ); GetVectorMemory ( F2,nAlloc,1 ); for (i=1;i<=mlength;i++) { f.ReadInt ( &(F1[i]) ); f.ReadInt ( &(F2[i]) ); } } } void GMatch::mem_write ( pstr S, int & l ) { int i; mmdb::mem_write ( mlength,S,l ); mmdb::mem_write ( n1 ,S,l ); mmdb::mem_write ( n2 ,S,l ); for (i=1;i<=mlength;i++) { mmdb::mem_write ( F1[i],S,l ); mmdb::mem_write ( F2[i],S,l ); } } void GMatch::mem_read ( cpstr S, int & l ) { int i; FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); mmdb::mem_read ( mlength,S,l ); mmdb::mem_read ( n1 ,S,l ); mmdb::mem_read ( n2 ,S,l ); if (mlength>0) { nAlloc = n1; GetVectorMemory ( F1,nAlloc,1 ); GetVectorMemory ( F2,nAlloc,1 ); for (i=1;i<=mlength;i++) { mmdb::mem_read ( F1[i],S,l ); mmdb::mem_read ( F2[i],S,l ); } } } MakeStreamFunctions(GMatch) // ======================== GraphMatch ========================== GraphMatch::GraphMatch() : io::Stream() { InitGraphMatch(); } GraphMatch::GraphMatch ( io::RPStream Object ) : io::Stream ( Object ) { InitGraphMatch(); } GraphMatch::~GraphMatch() { FreeMemory(); } void GraphMatch::InitGraphMatch() { G1 = NULL; G2 = NULL; n = 0; m = 0; P = NULL; nAlloc = 0; mAlloc = 0; nMatches = 0; maxNMatches = -1; // unlimited Match = NULL; nMAlloc = 0; flags = 0; swap = false; wasFullMatch = false; maxMatch = 0; timeLimit = 0; // no time limit Stop = false; stopOnMaxNMathches = false; F1 = NULL; F2 = NULL; iF1 = NULL; ix = NULL; #ifndef _UseRecursion jj = NULL; #endif } void GraphMatch::SetFlag ( word flag ) { flags |= flag; } void GraphMatch::RemoveFlag ( word flag ) { flags &= ~flag; } void GraphMatch::SetMaxNofMatches ( int maxNofGMatches, bool stopOnMaxN ) { maxNMatches = maxNofGMatches; stopOnMaxNMathches = stopOnMaxN; } void GraphMatch::SetTimeLimit ( int maxTimeToRun ) { timeLimit = maxTimeToRun; } void GraphMatch::Reset() { FreeMemory(); } void GraphMatch::FreeMemory() { int i; if (P) { FreeMatrixMemory ( P[1],nAlloc,1,0 ); FreeRecHeap (); P = P + 1; delete[] P; P = NULL; } FreeMatrixMemory ( iF1,nAlloc,1,1 ); FreeVectorMemory ( F1 ,1 ); FreeVectorMemory ( F2 ,1 ); FreeVectorMemory ( ix ,1 ); nAlloc = 0; mAlloc = 0; if (Match) { for (i=0;inVertices<=Gh2->nVertices) { G1 = Gh1; G2 = Gh2; swap = false; } else { G1 = Gh2; G2 = Gh1; swap = true; } n = G1->nVertices; m = G2->nVertices; V1 = G1->vertex; V2 = G2->vertex; c1 = G1->graph; c2 = G2->graph; nMatches = 0; if (n<=0) return; if ((n>nAlloc) || (m>mAlloc)) GetMemory(); else FreeRecHeap(); n1 = Initialize ( vertexType,vertexExt ); if (n1<=0) return; GetRecHeap(); maxMatch = IMax(1,IMin(n,minMatch)); Stop = false; startTime = time(NULL); // Use of Backtrack(..) and Ullman() is completely // equivalent. One of them should be commented. if (minMatch=minMatch) Backtrack1 ( 1,n1 ); } else if (n1>=n) { #ifdef _UseRecursion Backtrack ( 1 ); #else Ullman(); #endif } } int GraphMatch::Initialize ( bool vertexType, int vertexExt ) { ivector jF1; int i,j,v1type,v1type_ext,v2type_ext,almask,iW,pl; wasFullMatch = false; jF1 = iF1[1]; for (i=1;i<=n;i++) jF1[i] = i; almask = ~ATOM_LEAVING; /* -- experiment for symmetry reliefs int v2type,v1type_sr,srmask; srmask = ~SYMREL_MASK; for (i=1;i<=n;i++) { if (vertexType) { ix[i] = 0; v1type = V1[i-1]->type & almask; v1type_sr = v1type & srmask; pl = 0; for (j=1;j<=m;j++) { v2type = V2[j-1]->type & almask; if ((v1type==v2type) || (v1type_sr==v2type) || (v1type==(v2type & srmask))) P[1][i][++pl] = j; } P[1][i][0] = pl; if (pl) ix[i] = i; } else { ix[i] = i; for (j=1;j<=m;j++) P[1][i][j] = j; P[1][i][0] = m; } F1[i] = 0; F2[i] = 0; } */ for (i=1;i<=n;i++) { ix[i] = 0; v1type = V1[i-1]->type & almask; v1type_ext = V1[i-1]->type_ext; pl = 0; for (j=1;j<=m;j++) if ((v1type==(V2[j-1]->type & almask)) || (!vertexType)) { if (vertexExt==EXTTYPE_Ignore) P[1][i][++pl] = j; else { v2type_ext = V2[j-1]->type_ext; if ((!v1type_ext) && (!v2type_ext)) P[1][i][++pl] = j; else switch (vertexExt) { default : case EXTTYPE_Ignore : P[1][i][++pl] = j; break; case EXTTYPE_Equal : if (v1type_ext==v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_AND : if (v1type_ext & v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_OR : if (v1type_ext | v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_XOR : if (v1type_ext ^ v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_NotEqual : if (v1type_ext!=v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_NotAND : if ((v1type_ext & v2type_ext) ==0) P[1][i][++pl] = j; break; case EXTTYPE_NotOR : if ((v1type_ext | v2type_ext) ==0) P[1][i][++pl] = j; } } } P[1][i][0] = pl; if (pl) ix[i] = i; F1[i] = 0; F2[i] = 0; } /* } else { for (i=1;i<=n;i++) { ix[i] = i; for (j=1;j<=m;j++) P[1][i][j] = j; P[1][i][0] = m; F1[i] = 0; F2[i] = 0; } } */ i = 1; j = n; while (i0) Stop = (difftime(time(NULL),startTime)>timeLimit); F1[i] = i; pli = P[i][i][0]; if (i>=n) { for (cntj=1;(cntj<=pli) && (!Stop);cntj++) { F2[n] = P[n][n][cntj]; CollectMatch ( n ); } } else { i1 = i+1; c1i = c1[i]; for (cntj=1;(cntj<=pli) && (!Stop);cntj++) { j = P[i][i][cntj]; F2[i] = j; // mapped F1[i]:F2[i], i.e. i:j // Forward checking c2j = c2[j]; pl2 = 1; for (k=i1;(k<=n) && (pl2>0);k++) { p1 = P[i][k]; p2 = P[i1][k]; c1ik = c1i[k]; pl1 = p1[0]; pl2 = 0; for (cntl=1;cntl<=pl1;cntl++) { l = p1[cntl]; if ((c1ik==c2j[l]) && // check that bonds are compatible (l!=j)) // and make sure jth vertex is excluded p2[++pl2] = l; } p2[0] = pl2; // new length of P-row } if (pl2>0) Backtrack ( i1 ); } } } #else void GraphMatch::Ullman() { // A non-recursive translation of Ullman's Backtrack. // It might give some gain in performance, although tests // on SGI machine show that the gain is negligible, (if // there is any at all) if compiler's optimization is // switched on. int i,pl,i1,pli,cntj,j,pl1,pl2,k,cntl,l,l1,cik; ivector ci,cj; ivector p1,p2; if (Stop) return; if (timeLimit>0) Stop = (difftime(time(NULL),startTime)>timeLimit); i = 1; jj[1] = 1; pl = P[1][1][0]; do { F1[i] = i; pli = P[i][i][0]; if (i>=n) { for (cntj=jj[n];(cntj<=pli) && (!Stop);cntj++) { jj[n]++; F2[n] = P[n][n][cntj]; CollectGMatch ( n ); } } else { i1 = i+1; ci = c1[i]; for (cntj=jj[i];(cntj<=pli) && (!Stop);cntj++) { jj[i]++; j = P[i][i][cntj]; F2[i] = j; // Forward checking cj = c2[j]; pl2 = 1; for (k=i1;(k<=n) && (pl2>0);k++) { p1 = P[i][k]; p2 = P[i1][k]; cik = ci[k]; pl1 = p1[0]; pl2 = 0; for (cntl=1;cntl<=pl1;cntl++) { l = p1[cntl]; if ((cik==cj[l]) && // check that bonds are compatible (l!=j)) // and make sure jth vertex is excluded p2[++pl2] = l; } p2[0] = pl2; // new length of P-row } if (pl2>0) { i++; jj[i] = 1; i++; // in order to compensate the following decrement break; } } } i--; } while ((!Stop) && ((jj[1]<=pl) || (i>1))); } #endif void GraphMatch::Backtrack1 ( int i, int k0 ) { // Recursive version of CSIA algorithm for partial // (substructure-to-substructure) GMatching int i1,pl0,cntj,j,k,pl1,pl2,cntl,l,c1ik,ii,iW,k1; ivector jF1,c1i,c2j; ivector p0,p1,p2; if (Stop) return; if (timeLimit>0) Stop = (difftime(time(NULL),startTime)>timeLimit); jF1 = iF1[i]; if (i>=k0) { F1[i] = jF1[i]; p0 = P[i][jF1[i]]; pl0 = p0[0]; // collect GMatches of k0-th (the upmost) level if (pl0>0) { maxMatch = k0; for (cntj=1;cntj<=pl0;cntj++) { F2[k0] = p0[cntj]; CollectMatch ( k0 ); } } } else { i1 = i+1; pl0 = P[i][jF1[i]][0]; j = i; for (k=i1;k<=k0;k++) if (P[i][jF1[k]][0]i) { iW = jF1[i]; jF1[i] = jF1[j]; jF1[j] = iW; } F1[i] = jF1[i]; p0 = P[i][jF1[i]]; pl0 = p0[0]; c1i = c1[jF1[i]]; // 1. Find all GMatches that include jF1[i]th vertex of graph G1 for (cntj=1;(cntj<=pl0) && (!Stop);cntj++) { j = p0[cntj]; F2[i] = j; // mapped F1[i]:F2[i], i.e. iF1[i][i]:j // Forward checking c2j = c2[j]; k1 = k0; // k1 is the limit for GMatch size for (k=i1;(k<=k0) && (k1>=maxMatch);k++) { ix[k] = 0; p1 = P[i] [jF1[k]]; p2 = P[i1][jF1[k]]; c1ik = c1i [jF1[k]]; pl1 = p1[0]; pl2 = 0; for (cntl=1;cntl<=pl1;cntl++) { l = p1[cntl]; if ((c1ik==c2j[l]) && // check that bonds are compatible (l!=j)) // and make sure jth vertex is excluded p2[++pl2] = l; } p2[0] = pl2; // new length of P-row if (pl2>0) { ix[k] = k; } else if (wasFullMatch) { k1 = maxMatch-1; // we are not interested in partial } else { // GMatch anymore k1--; } } if (k1>=maxMatch) { // shift unGMatching vertices to the end for (ii=1;ii<=n;ii++) iF1[i1][ii] = jF1[ii]; k = i1; l = k0; while (k=maxMatch) { CollectMatch ( i ); // collect GMatch of ith level maxMatch = i; } } } // 2. Find all GMatches that do not include jF1[i]th vertex // of graph G1 if (k0>maxMatch) { // Shift jF1[i]th vertex to the end iW = jF1[i]; jF1[i] = jF1[k0]; jF1[k0] = iW; Backtrack1 ( i,k0-1 ); } } } void GraphMatch::CollectMatch ( int nm ) { int i; bool B; PPGMatch M1; if (maxNMatches==0) return; // find out if this should be a new GMatch if (nMatches>0) { // a GMatch is already found; check with it if (nmmlength) return; if (nm>Match[0]->mlength) { nMatches = 0; } else if (flags & GMF_UniqueMatch) { // check if such a GMatch was already found B = false; for (i=0;(iisMatch(F1,F2,nm); if (B) return; // repeating GMatch -- just quit. } else if (flags & GMF_NoCombinations) { // check if such a GMatch was already found B = false; for (i=0;(iisCombination(F1,F2,nm); if (B) return; // repeating GMatch -- just quit. } } if (nMatches>=nMAlloc) { if ((nMAlloc0) nMAlloc = IMin(maxNMatches,nMAlloc+100); else nMAlloc += 100; M1 = new PGMatch[nMAlloc]; for (i=0;iSetMatch ( F1,F2,nm,n,m ); if (nm==n) wasFullMatch = true; if (nm>maxMatch) maxMatch = nm; nMatches++; if (stopOnMaxNMathches && (maxNMatches>0) && (nMatches>=maxNMatches)) Stop = true; } void GraphMatch::PrintMatches() { int i,j,k; if (nMatches<=0) printf ( "\n\n *** NO GMatchES FOUND\n\n" ); else { if (flags & GMF_UniqueMatch) printf ( "\n\n *** FOUND Unique GMatches\n\n" ); else printf ( "\n\n *** FOUND GMatches\n\n" ); printf ( " ## Vertices\n" ); for (i=0;imlength;j++) { if (swap) printf ( " (%i,%i)",Match[i]->F2[j],Match[i]->F1[j] ); else printf ( " (%i,%i)",Match[i]->F1[j],Match[i]->F2[j] ); k += 8; if (k>70) { printf ( "\n" ); k = 8; } } printf ( "\n" ); } } printf ( "\n **************************\n" ); } void GraphMatch::GetMatch ( int MatchNo, ivector & FV1, ivector & FV2, int & nv, realtype & p1, realtype & p2 ) { // do not allocate or dispose FV1 and FV2 in application! // FV1/p1 will always correspond to Gh1, and FV2/p2 - // to Gh2 as specified in GMatchGraphs(..) if ((MatchNo<0) || (MatchNo>=nMatches)) { FV1 = NULL; FV2 = NULL; nv = 0; p1 = 0.0; p2 = 0.0; } else if (swap) Match[MatchNo]->GetMatch ( FV2,FV1,nv,p2,p1 ); else Match[MatchNo]->GetMatch ( FV1,FV2,nv,p1,p2 ); } void GraphMatch::write ( io::RFile f ) { int i; int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &nMatches ); f.WriteWord ( &flags ); f.WriteBool ( &swap ); for (i=0;iwrite ( f ); } void GraphMatch::read ( io::RFile f ) { int i,Version; FreeMemory (); f.ReadInt ( &Version ); f.ReadInt ( &nMatches ); f.ReadWord ( &flags ); f.ReadBool ( &swap ); if (nMatches>0) { nMAlloc = nMatches; Match = new PGMatch[nMatches]; for (i=0;iread ( f ); } } } void GraphMatch::mem_write ( pstr S, int & l ) { int i; mmdb::mem_write ( nMatches,S,l ); mmdb::mem_write ( flags ,S,l ); mmdb::mem_write ( swap ,S,l ); for (i=0;imem_write ( S,l ); } void GraphMatch::mem_read ( cpstr S, int & l ) { int i; FreeMemory (); mmdb::mem_read ( nMatches,S,l ); mmdb::mem_read ( flags ,S,l ); mmdb::mem_read ( swap ,S,l ); if (nMatches>0) { nMAlloc = nMatches; Match = new PGMatch[nMatches]; for (i=0;imem_read ( S,l ); } } } MakeStreamFunctions(GraphMatch) } // namespace math } // namespace mmdb // ============================================================= /* static char Mol1[][3] = { "C", "C", "C", "C", "C", "C" }; static int Bond1[] = { 1, 2, 1, 6, 2, 3, 3, 4, 4, 5, 5, 6 }; static char Mol2[][3] = { "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C" }; static int Bond2[] = { 1, 2, 1, 6, 2, 3, 3, 4, 4, 5, 5, 6, 1, 7, 2, 8, 3, 9, 4, 10, 5, 11, 6, 12 }; static char Mol1[][3] = { "C", "C", "N", "C" }; static int Bond1[] = { 1, 2, 2, 3, 3, 4 }; static char Mol2[][3] = { "C", "C", "N", "C" }; static int Bond2[] = { 1, 2, 2, 3, 2, 4, 3, 4 }; void TestGraphMatch() { int i,k1,k2, nv1,nb1, nv2,nb2; PVertex V; PEdge G; Graph G1,G2; GraphMatch U; G1.Reset (); G1.SetName ( "#1" ); nv1 = sizeof(Mol1)/3; for (i=0;iSetVertex ( Mol1[i] ); G1.AddVertex ( V ); } nb1 = sizeof(Bond1)/(2*sizeof(int)); k1 = 0; k2 = 1; for (i=0;iSetEdge ( Bond1[k1],Bond1[k2],1 ); G1.AddEdge ( G ); k1 += 2; k2 += 2; } G2.Reset (); G2.SetName ( "#2" ); nv2 = sizeof(Mol2)/3; for (i=0;iSetVertex ( Mol2[i] ); G2.AddVertex ( V ); } nb2 = sizeof(Bond2)/(2*sizeof(int)); k1 = 0; k2 = 1; for (i=0;iSetEdge ( Bond2[k1],Bond2[k2],1 ); G2.AddEdge ( G ); k1 += 2; k2 += 2; } G1.Build(); G2.Build(); U.GMatchGraphs ( &G1,&G2,nv1 ); U.PrintGMatches(); } */ mmdb2-2.0.20/mmdb2/mmdb_math_graph.h0000644000175000017500000003660613271367640016743 0ustar maartenmaarten// $Id: mmdb_math_graph.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_math_graph // ~~~~~~~~~ // **** Namespace: mmdb::math:: // ~~~~~~~~~~ // **** Classes : Vertex ( graph vertex ) // ~~~~~~~~~ Edge ( graph edge ) // Graph ( structural graph ) // Match ( match of structural graphs ) // GraphMatch ( CSIA algorithms for graphs matching ) // // (C) E. Krissinel 2000-2013 // // When used, please cite: // // Krissinel, E. and Henrick, K. (2004) // Common subgraph isomorphism detection by backtracking search. // Software - Practice and Experience, 34, 591-607. // // ================================================================= // #ifndef __MMDB_MATH_Graph__ #define __MMDB_MATH_Graph__ #include #include "mmdb_atom.h" namespace mmdb { namespace math { // ========================= Vertex ========================== DefineClass(Vertex); enum GRAPH_FLAG { CHIRAL_RIGHT = 0x10000000, CHIRAL_LEFT = 0x20000000, ATOM_LEAVING = 0x40000000, HYDROGEN_BOND = 0x0F000000, SYMREL_MASK = 0x00FF0000, CHIRAL_MASK = 0xCFFFFFFF, TYPE_MASK = 0x00FFFFFF }; class Vertex : public io::Stream { friend class Graph; friend class GraphMatch; public: Vertex (); Vertex ( io::RPStream Object ); Vertex ( int vtype, cpstr vname ); Vertex ( int vtype ); Vertex ( cpstr chem_elem ); Vertex ( cpstr chem_elem, cpstr name ); ~Vertex(); void SetVertex ( cpstr chem_elem ); void SetVertex ( int vtype, cpstr vname ); void SetVertex ( int vtype ); void SetType ( int vtype ); void SetTypeExt ( int typeExt ); void RemoveChirality(); void LeaveChirality ( int eltype ); void SetName ( cpstr vname ); void SetProperty ( int vprop ); void SetID ( int vid ); void AddBond (); void CopyNBonds ( PVertex V ); inline void SetUserID ( int vid ) { user_id = vid; } inline int GetProperty () { return property; } inline int GetID () { return id; } inline int GetUserID () { return user_id; } inline cpstr GetName () { return name; } inline int GetType () { return type; } inline int GetTypeExt () { return type_ext; } int GetNBonds (); void SaveType (); // in userid void RestoreType (); // from userid void CopyType ( PVertex V ); virtual void Print ( int PKey ); virtual void Copy ( PVertex V ); void read ( io::RFile f ); void write ( io::RFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected: pstr name; // name may be general, "C", "Hg", "Cl" etc. int type; // type of vertex, see comments in // mmdb_math_graph.cpp int type_ext; // vertex type extention int property; // flagwise properties -- user-defined int id; // a graph-defined vertex id int user_id; // a user-defined vertex id void InitVertex(); }; DefineStreamFunctions(Vertex); // ========================== Edge =========================== enum GRAPH_BOND { BOND_SINGLE = 1, BOND_DOUBLE = 2, BOND_AROMATIC = 3, BOND_TRIPLE = 4 }; DefineClass(Edge); class Edge : public io::Stream { friend class Graph; friend class CGMatch; public: Edge (); Edge ( io::RPStream Object ); Edge ( int vx1, int vx2, int btype ); // vx1,vx2 are numbered // as 1,2,3 on and refer // to vertices in the order // as they were added to // the graph; btype>0 ~Edge(); void SetEdge ( int vx1, int vx2, cpstr btype ); void SetEdge ( int vx1, int vx2, int btype ); // btype>0 void SetType ( int btype ); void SetProperty ( int eprop ); void SaveType (); // in property void RestoreType (); // from property inline int GetVertex1 () { return v1; } inline int GetVertex2 () { return v2; } inline int GetType () { return type; } inline int GetProperty () { return property; } virtual void Print ( int PKey ); virtual void Copy ( PEdge G ); void read ( io::RFile f ); void write ( io::RFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected: int v1,v2; // >=1 int type; int property; void InitEdge(); }; DefineStreamFunctions(Edge); // ========================== Graph ============================ enum GRAPH_RC { MKGRAPH_Ok = 0, MKGRAPH_NoAtoms = -1, MKGRAPH_ChangedAltLoc = 1, MKGRAPH_MaxOccupancy = 2 }; DefineClass(Graph); class Graph : public io::Stream { friend class GraphMatch; friend class CSBase0; public : Graph (); Graph ( PResidue R, cpstr altLoc=NULL ); Graph ( io::RPStream Object ); ~Graph(); void Reset (); void SetName ( cpstr gname ); inline pstr GetName() { return name; } // AddVertex(..) and AddEdge(..) do not copy the objects, but // take them over. This means that application should forget // about pointers to V and G once they were given to Graph. // Vertices and edges must be allocated newly prior each call // to AddVertex(..) and AddEdge(..). void AddVertex ( PVertex V ); void AddEdge ( PEdge G ); void SetVertices ( PPVertex V, int vlen ); void SetEdges ( PPEdge G, int glen ); void RemoveChirality(); void LeaveChirality ( int eltype ); // MakeGraph(..) makes a graph corresponding to residue R. // The graphs vertices then correspond to the residue's atoms // (Vertex::userid points to atom R->atom[Vertex::userid]), // edges are calculated as chemical bonds between atoms basing // on the table of cut-off distances. // altCode specifies a particular conformation that should be // used for making the graph. If it is set to "" or NULL ("empty" // altcode) but the residue does not have conformation which // contains *only* ""-altcode atoms, a conformation corresponding // to maximal occupancy will be used. The same will happen if // altcode information in residue is not correct, whatever altCode // is specified. // After making the graph, Build(..) should be called as usual // before graph matching. // Non-negative return means that graph has been made. // MakeGraph(..) may return: // MKGRAPH_Ok everything is Ok // MKGRAPH_NoAtoms residue does not have atoms, graph // is not made // MKGRAPH_ChangedAltLoc a different altcode was used because // the residue has only one altcode and // that is different of // MKGRAPH_MaxOccupancy a maximal-occupancy conformation has // been chosen because of default // ""-altcode supplied or incorrect // altcode information in the residue int MakeGraph ( PResidue R, cpstr altLoc=NULL ); int MakeGraph ( PPAtom atom, int nAtoms ); void HideType ( int bond_vx_type ); void ExcludeType ( int type ); void MakeSymmetryRelief ( bool noCO2 ); void IdentifyRings (); int IdentifyConnectedComponents(); // returns their number >= 1 int Build ( bool bondOrder ); // returns 0 if Ok void MakeVertexIDs (); // simply numbers vertices as 1.. on int GetVertexID ( int vertexNo ); int GetVertexNo ( cpstr vname ); // GetBondedVertexID(..) works after MoveType(..) int GetNBondedVertices ( int vertexNo ); int GetBondedVertexID ( int vertexNo, int bond_vx_type, int bondNo ); PVertex GetVertex ( int vertexNo ); // 1<=vertexNo<=nVertices inline int GetNofVertices() { return nVertices; } PEdge GetEdge ( int edgeNo ); // 1<=edgeNo<=nEdges inline int GetNofEdges() { return nEdges; } void GetVertices ( PPVertex & V, int & nV ); void GetEdges ( PPEdge & E, int & nE ); virtual void Print(); void Print1(); virtual void Copy ( PGraph G ); void read ( io::RFile f ); void write ( io::RFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected : pstr name; int nVertices,nEdges, nAllVertices,nAllEdges; PPVertex vertex; PPEdge edge; imatrix graph; void InitGraph (); void FreeMemory(); void markConnected ( int vno, int cno ); private : int nVAlloc,nEAlloc,nGAlloc; }; DefineStreamFunctions(Graph); // ========================= GMatch ========================== DefineClass(GMatch); DefineStreamFunctions(GMatch); class GMatch : public io::Stream { friend class GraphMatch; public : GMatch (); GMatch ( io::RPStream Object ); GMatch ( ivector FV1, ivector FV2, int nv, int n, int m ); ~GMatch(); // FV1[] and FV2[] are copied into internal buffers void SetMatch ( ivector FV1, ivector FV2, int nv, int n, int m ); bool isMatch ( ivector FV1, ivector FV2, int nv ); bool isCombination ( ivector FV1, ivector FV2, int nv ); // do not allocate or dispose FV1 and FV2 in application! void GetMatch ( ivector & FV1, ivector & FV2, int & nv, realtype & p1, realtype & p2 ); void read ( io::RFile f ); void write ( io::RFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected : int n1,n2,mlength; ivector F1,F2; void InitGMatch(); private : int nAlloc; }; // ======================= GraphMatch ========================= #define _UseRecursion enum GRAPH_MATCH_FLAG { GMF_UniqueMatch = 0x00000001, GMF_NoCombinations = 0x00000002 }; enum VERTEX_EXT_TYPE { EXTTYPE_Ignore = 0, EXTTYPE_Equal = 1, EXTTYPE_AND = 2, EXTTYPE_OR = 3, EXTTYPE_XOR = 4, EXTTYPE_NotEqual = 5, EXTTYPE_NotAND = 6, EXTTYPE_NotOR = 7 }; DefineClass(GraphMatch); class GraphMatch : public io::Stream { public : GraphMatch (); GraphMatch ( io::RPStream Object ); ~GraphMatch(); void SetFlag ( word flag ); void RemoveFlag ( word flag ); void SetMaxNofMatches ( int maxNofMatches, bool stopOnMaxN ); void SetTimeLimit ( int maxTimeToRun=0 ); inline bool GetStopSignal() { return Stop; } void Reset(); // MatchGraphs looks for maximal common subgraphs of size // not less than minMatch. The number of found subgraphs // is returned by GetNofMatches(), the subgraph vertices // are returned by GetMatch(..). Control parameters: // vertexType true if vertex type should be taken // into account and False otherwise // vertexExt key to use extended vertex types (defined // as type_ext in Vertex). void MatchGraphs ( PGraph Gh1, PGraph Gh2, int minMatch, bool vertexType=true, VERTEX_EXT_TYPE vertexExt=EXTTYPE_Ignore ); void PrintMatches (); inline int GetNofMatches () { return nMatches; } inline int GetMaxMatchSize() { return maxMatch; } // do not allocate or dispose FV1 and FV2 in application! // FV1/p1 will always correspond to Gh1, and FV2/p2 - // to Gh2 as specified in MatchGraphs(..) void GetMatch ( int MatchNo, ivector & FV1, ivector & FV2, int & nv, realtype & p1, realtype & p2 ); void read ( io::RFile f ); void write ( io::RFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected : PGraph G1,G2; PPVertex V1; PPVertex V2; imatrix c1,c2; bool swap; #ifndef _UseRecursion ivector jj; #endif int n,m; imatrix3 P; imatrix iF1; ivector F1,F2,ix; int nMatches,maxNMatches; PPGMatch Match; bool wasFullMatch,Stop,stopOnMaxNMathches; word flags; int maxMatch,timeLimit; void InitGraphMatch(); void FreeMemory (); void FreeRecHeap (); void GetMemory (); void GetRecHeap (); int Initialize ( bool vertexType, int vertexExt ); #ifdef _UseRecursion void Backtrack ( int i ); // exact matching #else void Ullman (); #endif void Backtrack1 ( int i, int k0 ); // exact/partial matching void CollectMatch ( int nm ); private : int nAlloc,mAlloc,nMAlloc; time_t startTime; }; DefineStreamFunctions(GraphMatch); extern void SetGraphAllocPortion ( int alloc_portion ); /* extern void TestGraphMatch(); */ } // namespace math } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/hybrid_36.h0000644000175000017500000000300113271367640015402 0ustar maartenmaarten// $Id: hybrid_36.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // /* If you change the include guards, please be sure to also rename the functions below. Otherwise your project will clash with the original iotbx declarations and definitions. */ #ifndef IOTBX_PDB_HYBRID_36_C_H #define IOTBX_PDB_HYBRID_36_C_H #ifdef __cplusplus extern "C" { #endif const char* hy36encode(unsigned width, int value, char* result); const char* hy36decode(unsigned width, const char* s, unsigned s_size, int* result); #ifdef __cplusplus } #endif #endif /* IOTBX_PDB_HYBRID_36_C_H */ mmdb2-2.0.20/mmdb2/mmdb_tables.cpp0000644000175000017500000006052013271367640016426 0ustar maartenmaarten// $Id: mmdb_tables.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 24.07.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Tables // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Namespace : mmdb:: // // **** Functions : // ~~~~~~~~~~~ // // **** Constants : AName ( array of 2-character atom names ) // ~~~~~~~~~~~ HAName ( array of 2=character heteroatom names ) // RName ( 3-characters amino acid names ) // RName1 ( 1-characters amino acid names ) // // // (C) E. Krissinel 2000-2015 // // ================================================================= // #include #include "mmdb_tables.h" #include "mmdb_defs.h" namespace mmdb { // =============================================================== cpstr const ElementName[nElementNames] = { " H", "HE", "LI", "BE", " B", " C", " N", " O", " F", "NE", "NA", "MG", "AL", "SI", " P", " S", "CL", "AR", " K", "CA", "SC", "TI", " V", "CR", "MN", "FE", "CO", "NI", "CU", "ZN", "GA", "GE", "AS", "SE", "BR", "KR", "RB", "SR", " Y", "ZR", "NB", "MO", "TC", "RU", "RH", "PD", "AG", "CD", "IN", "SN", "SB", "TE", " I", "XE", "CS", "BA", "LA", "CE", "PR", "ND", "PM", "SM", "EU", "GD", "TB", "DY", "HO", "ER", "TM", "YB", "LU", "HF", "TA", " W", "RE", "OS", "IR", "PT", "AU", "HG", "TL", "PB", "BI", "PO", "AT", "RN", "FR", "RA", "AC", "TH", "PA", " U", "NP", "PU", "AM", "CM", "BK", "CF", "ES", "FM", "MD", "NO", "LR", "RF", "DB", "SG", "BH", "HS", "MT", "UN", "UU", "UB", "UQ", "UH", "UO", " D", "AN" }; realtype const MolecWeight[nElementNames] = { 1.0079, 4.0026, 6.9410, 9.0122, 10.811, 12.011, 14.007, 15.999, 18.998, 20.180, 22.990, 24.305, 26.982, 28.086, 30.974, 32.066, 35.453, 39.948, 39.098, 40.078, 44.956, 47.867, 50.942, 51.996, 54.938, 55.845, 58.993, 58.693, 63.546, 65.390, 69.723, 72.610, 74.922, 78.960, 79.904, 83.800, 85.468, 87.620, 88.906, 91.224, 92.906, 95.940, 97.907, 101.07, 102.91, 106.42, 107.87, 112.41, 114.82, 118.71, 121.76, 127.60, 126.90, 131.29, 132.91, 137.33, 138.91, 140.12, 140.91, 144.24, 144.91, 150.36, 151.96, 157.25, 158.93, 162.50, 164.93, 167.26, 168.93, 173.04, 174.97, 178.49, 180.95, 183.84, 186.21, 190.23, 192.22, 195.08, 196.97, 200.59, 204.38, 207.20, 208.98, 208.98, 209.99, 222.02, 232.02, 226.03, 227.03, 232.04, 231.04, 238.03, 237.05, 244.06, 243.06, 247.07, 247.07, 251.08, 252.08, 257.10, 258.10, 259.10, 262.11, 263.11, 262.11, 266.12, 264.12, 269.13, 268.14, 272.15, 272.15, 277.00, 289.00, 289.00, 293.00, 2.0200, 3.0300 }; realtype const CovalentRadius[nElementNames] = { 0.32, 0.93, 1.23, 0.90, 0.82, 0.77, 0.75, 0.73, 0.72, 0.71, 1.54, 1.36, 1.18, 1.11, 1.06, 1.02, 0.99, 0.98, 2.03, 1.91, 1.62, 1.45, 1.34, 1.18, 1.17, 1.17, 1.16, 1.15, 1.17, 1.25, 1.26, 1.22, 1.20, 1.16, 1.14, 1.12, 2.16, 1.91, 1.62, 1.45, 1.34, 1.30, 1.27, 1.25, 1.25, 1.28, 1.34, 1.48, 1.44, 1.41, 1.40, 1.36, 1.33, 1.31, 2.35, 1.98, 1.69, 1.44, 1.34, 1.30, 1.28, 1.26, 1.27, 1.30, 1.34, 1.49, 1.48, 1.47, 1.46, 1.46, 1.45, 1.43, 2.50, 2.40, 2.20, 1.65, 1.65, 1.64, 1.63, 1.62, 1.85, 1.61, 1.59, 1.59, 1.58, 1.57, 1.56, 1.74, 1.56, 1.65, 1.65, 1.42, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 0.32, 0.10, /**/ 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.32, 0.32 }; realtype const VdWaalsRadius[nElementNames] = { 1.20, 1.40, 1.82, 1.78, 1.74, 1.70, 1.55, 1.52, 1.47, 1.54, // ^^^^ ^^^^ <- only a guess 2.27, 1.73, 1.80, 2.10, 1.80, 1.80, 1.75, 1.88, // ^^^^ 2.75, 2.65, // ^^^^ 2.55, 2.45, 2.35, 2.20, 1.73, 1.90, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.75, 1.63, 1.40, 1.39, // ^^^^ 1.87, 1.86, 1.85, 1.90, 1.85, 2.02, // ^^^^ 2.75, 2.65, //^^^^ ^^^^ 2.55, 2.45, 2.35, 2.20, 2.05, 1.90, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.75, 1.63, 1.72, 1.58, // ^^^^ 1.93, 2.17, 2.10, 2.06, 1.98, 2.16, // ^^^^ 2.75, 2.75, //^^^^ ^^^^ 2.75, 2.75, 2.75, 2.75, 2.75, 2.75, 2.75, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 2.75, 2.75, 2.75, 2.75, 2.75, 2.65, 2.55, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 2.45, 2.35, 2.25, 2.15, 2.05, 1.95, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.85, 1.75, 1.66, 1.55, // ^^^^ 1.96, 2.02, 2.00, 2.00, 2.00, 2.00, // ^^^^ ^^^^ ^^^^ ^^^^ 2.75, 2.75, //^^^^ ^^^^ 2.50, 2.25, 1.95, 1.86, 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.80, 1.80, 1.80, 1.80, 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.80, 1.80, 1.80, 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.80, 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ ^^^^ 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ 1.30, 1.50 //^^^^ ^^^^ }; realtype const IonicRadius[nElementNames] = { 0.79, 0.49, 2.05, 1.40, 1.17, 0.91, 0.75, 0.65, 0.57, 0.51, 2.23, 1.72, 1.82, 1.46, 1.23, 1.09, 0.97, 0.88, 2.77, 2.23, 2.09, 2.00, 1.92, 1.85, 1.79, 1.72, 1.67, 1.62, 1.57, 1.53, 1.81, 1.52, 1.33, 1.22, 1.12, 1.03, 2.98, 2.45, 2.27, 2.16, 2.09, 2.01, 1.95, 1.89, 1.83, 1.79, 1.75, 1.71, 2.00, 1.72, 1.53, 1.42, 1.32, 1.24, 3.34, 2.78, 2.74, 2.16, 2.09, 2.02, 1.97, 1.92, 1.87, 1.83, 1.79, 1.76, 2.08, 1.81, 1.63, 1.53, 1.43, 1.34, 3.50, 3.00, 3.20, 2.70, 2.67, 2.64, 2.62, 2.59, 2.56, 2.54, 2.51, 2.49, 2.47, 2.45, 2.42, 2.40, 2.25, 3.16, 3.14, 3.11, 3.08, 3.05, 3.02, 2.99, 2.97, 2.95, 2.92, 2.90, 2.87, 2.85 }; cpstr const ElementMetal[nElementMetals] = { "LI", "BE", "NA", "MG", "AL", " K", "CA", "SC", "TI", " V", "MN", "FE", "CO", "NI", "CU", "ZN", "GA", "RB", "SR", " Y", "ZR", "NB", "MO", "TC", "RU", "RH", "PD", "AG", "CD", "IN", "SN", "SB", "CS", "BA", "LA", "CE", "PR", "ND", "PM", "SM", "EU", "GD", "TB", "DY", "HO", "ER", "TM", "YB", "LU", "HF", "TA", " W", "RE", "OS", "IR", "PT", "AU", "HG", "TL", "PB", "BI", "PO", "FR", "RA", "AC", "TH", "PA", " U", "NP", "PU", "AM", "CM", "BK", "CF", "ES", "FM", "MD", "NO", "LR", "RF", "DB", "SG", "BH", "HS", "MT", "UN", "UU", "UB", "UQ", "UH", "UO" }; cpstr const HydAtomName[nHydAtomNames] = { "0H", "1H", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "HH", "*H", "'H", """H" }; bool isMetal ( cpstr element ) { char name[3]; bool isThere; int i; if (!element[1]) { name[0] = ' '; name[1] = element[0]; } else strncpy ( name,element,2 ); name[2] = char(0); isThere = false; for (i=0;(i=nElementNames) return ELEMENT_UNKNOWN; return type+1; // so that hydrogen is 1 } realtype getMolecWeight ( cpstr element ) { int type=0; char El[3]; if ((!element[1]) || (element[1]==' ')) { El[0] = ' '; El[1] = element[0]; } else { El[0] = element[0]; El[1] = element[1]; } El[2] = char(0); UpperCase ( El ); while (type=nElementNames) return 1.0; return MolecWeight[type]; } realtype getCovalentRadius ( cpstr element ) { int type=0; char El[3]; if ((!element[1]) || (element[1]==' ')) { El[0] = ' '; El[1] = element[0]; } else { El[0] = element[0]; El[1] = element[1]; } El[2] = char(0); UpperCase ( El ); while (type=nElementNames) return 2.2*CovalentRadius[0]; return CovalentRadius[type]; } realtype getVdWaalsRadius ( cpstr element ) { int type=0; char El[3]; if ((!element[1]) || (element[1]==' ')) { El[0] = ' '; El[1] = element[0]; } else { El[0] = element[0]; El[1] = element[1]; } El[2] = char(0); UpperCase ( El ); while (type=nElementNames) return 1.8; return VdWaalsRadius[type]; } cpstr const ResidueName[nResNames] = { "ALA", "ARG", "ASN", "ASP", "CYS", "CYH", "GLN", "GLU", "GLY", "HIS", "ILE", "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", "HEM", "WAT", "SUL", "END", "DUM" }; int getResidueNo ( cpstr resName ) { int i,m; m = -1; for (i=0;(i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Namespace: mmdb:: // // CIF Definitions // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_CIFDefs__ #define __MMDB_CIFDefs__ #include "mmdb_mattype.h" namespace mmdb { // ------------------------------------------------------------------ // Mode IDs enum CIF_MODE { CIF_NDB = 0, CIF_PDBX = 1 }; // CIF IDs for mode-dependent CIF names enum CIF_ID { CAT_POLY_SEQ_SCHEME = 1, TAG_CHAIN_ID = 101, TAG_DB_ACCESSION = 102, TAG_DB_ALIGN_BEG = 103, TAG_DB_ALIGN_BEG_INS_CODE = 104, TAG_DB_ALIGN_END = 105, TAG_DB_ALIGN_END_INS_CODE = 106, TAG_ID_CODE = 107, TAG_SEQ_CHAIN_ID = 108, TAG_SEQ_ALIGN_BEG = 109, TAG_SEQ_ALIGN_BEG_INS_CODE = 110, TAG_SEQ_ALIGN_END = 111, TAG_SEQ_ALIGN_END_INS_CODE = 112 }; // CIFName(..) gives CIF name according to CIF Mode. extern cpstr CIFName ( int NameID, CIF_MODE Mode ); // ------------------------------------------------------------------ extern cpstr CIFCAT_ATOM_SITE ; extern cpstr CIFCAT_ATOM_SITE_ANISOTROP ; extern cpstr CIFCAT_ATOM_SITES ; extern cpstr CIFCAT_AUDIT_AUTHOR ; extern cpstr CIFCAT_CELL ; extern cpstr CIFCAT_CHEM_COMP ; extern cpstr CIFCAT_CITATION ; extern cpstr CIFCAT_DATABASE ; extern cpstr CIFCAT_DATABASE_PDB_CAVEAT ; extern cpstr CIFCAT_DATABASE_PDB_MATRIX ; extern cpstr CIFCAT_DATABASE_PDB_REV ; extern cpstr CIFCAT_DATABASE_PDB_TVECT ; extern cpstr CIFCAT_ENTITY ; extern cpstr CIFCAT_EXPTL ; extern cpstr CIFCAT_NDB_DATABASE_REMARK ; extern cpstr CIFCAT_NDB_NONSTANDARD_LIST ; extern cpstr CIFCAT_NDB_POLY_SEQ_SCHEME ; extern cpstr CIFCAT_PDBX_POLY_SEQ_SCHEME ; extern cpstr CIFCAT_REFINE ; extern cpstr CIFCAT_SPRSDE ; extern cpstr CIFCAT_STRUCT ; extern cpstr CIFCAT_STRUCT_ASYM ; extern cpstr CIFCAT_STRUCT_CONF ; extern cpstr CIFCAT_STRUCT_CONN ; extern cpstr CIFCAT_STRUCT_LINKR ; extern cpstr CIFCAT_STRUCT_KEYWORDS ; extern cpstr CIFCAT_STRUCT_NCS_OPER ; extern cpstr CIFCAT_STRUCT_REF ; extern cpstr CIFCAT_STRUCT_REF_SEQ ; extern cpstr CIFCAT_STRUCT_REF_SEQ_DIF ; extern cpstr CIFCAT_STRUCT_SHEET ; extern cpstr CIFCAT_STRUCT_SHEET_RANGE ; extern cpstr CIFCAT_STRUCT_SHEET_ORDER ; extern cpstr CIFCAT_STRUCT_SHEET_HBOND ; extern cpstr CIFCAT_SYMMETRY ; extern cpstr CIFCAT_OBSLTE ; extern cpstr CIFTAG_ANGLE_ALPHA ; extern cpstr CIFTAG_ANGLE_BETA ; extern cpstr CIFTAG_ANGLE_GAMMA ; extern cpstr CIFTAG_ASYM_ID ; extern cpstr CIFTAG_ATOM_TYPE_SYMBOL ; extern cpstr CIFTAG_AUTH_ASYM_ID ; extern cpstr CIFTAG_AUTH_ATOM_ID ; extern cpstr CIFTAG_AUTH_COMP_ID ; extern cpstr CIFTAG_AUTH_SEQ_ID ; extern cpstr CIFTAG_B_ISO_OR_EQUIV ; extern cpstr CIFTAG_B_ISO_OR_EQUIV_ESD ; extern cpstr CIFTAG_BEG_LABEL_ASYM_ID ; extern cpstr CIFTAG_BEG_LABEL_COMP_ID ; extern cpstr CIFTAG_BEG_LABEL_SEQ_ID ; extern cpstr CIFTAG_CARTN_X ; extern cpstr CIFTAG_CARTN_X_ESD ; extern cpstr CIFTAG_CARTN_Y ; extern cpstr CIFTAG_CARTN_Y_ESD ; extern cpstr CIFTAG_CARTN_Z ; extern cpstr CIFTAG_CARTN_Z_ESD ; extern cpstr CIFTAG_PDBX_FORMAL_CHARGE ; extern cpstr CIFTAG_CODE ; extern cpstr CIFTAG_CODE_NDB ; extern cpstr CIFTAG_CODE_PDB ; extern cpstr CIFTAG_CONF_TYPE_ID ; extern cpstr CIFTAG_CONN_TYPE_ID ; extern cpstr CIFTAG_DATE ; extern cpstr CIFTAG_DATE_ORIGINAL ; extern cpstr CIFTAG_DB_ALIGN_BEG ; extern cpstr CIFTAG_DB_ALIGN_END ; extern cpstr CIFTAG_DB_CODE ; extern cpstr CIFTAG_DB_MON_ID ; extern cpstr CIFTAG_DB_NAME ; extern cpstr CIFTAG_DETAILS ; extern cpstr CIFTAG_END_LABEL_ASYM_ID ; extern cpstr CIFTAG_END_LABEL_COMP_ID ; extern cpstr CIFTAG_END_LABEL_SEQ_ID ; extern cpstr CIFTAG_ENTITY_ID ; extern cpstr CIFTAG_ENTRY_ID ; extern cpstr CIFTAG_FORMULA ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX11 ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX12 ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX13 ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX21 ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX22 ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX23 ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX31 ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX32 ; extern cpstr CIFTAG_FRACT_TRANSF_MATRIX33 ; extern cpstr CIFTAG_FRACT_TRANSF_VECTOR1 ; extern cpstr CIFTAG_FRACT_TRANSF_VECTOR2 ; extern cpstr CIFTAG_FRACT_TRANSF_VECTOR3 ; extern cpstr CIFTAG_GROUP_PDB ; extern cpstr CIFTAG_ID ; extern cpstr CIFTAG_INS_CODE ; extern cpstr CIFTAG_LABEL_ALT_ID ; extern cpstr CIFTAG_LABEL_ATOM_ID ; extern cpstr CIFTAG_LABEL_ASYM_ID ; extern cpstr CIFTAG_LABEL_COMP_ID ; extern cpstr CIFTAG_LABEL_ENTITY_ID ; extern cpstr CIFTAG_LABEL_SEQ_ID ; extern cpstr CIFTAG_LENGTH_A ; extern cpstr CIFTAG_LENGTH_B ; extern cpstr CIFTAG_LENGTH_C ; extern cpstr CIFTAG_LS_D_RES_HIGH ; extern cpstr CIFTAG_MATRIX11 ; extern cpstr CIFTAG_MATRIX12 ; extern cpstr CIFTAG_MATRIX13 ; extern cpstr CIFTAG_MATRIX21 ; extern cpstr CIFTAG_MATRIX22 ; extern cpstr CIFTAG_MATRIX23 ; extern cpstr CIFTAG_MATRIX31 ; extern cpstr CIFTAG_MATRIX32 ; extern cpstr CIFTAG_MATRIX33 ; extern cpstr CIFTAG_METHOD ; extern cpstr CIFTAG_MOD_TYPE ; extern cpstr CIFTAG_MON_ID ; extern cpstr CIFTAG_NAME ; extern cpstr CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB ; extern cpstr CIFTAG_NDB_CHAIN_ID ; extern cpstr CIFTAG_NDB_COMPONENT_NO ; extern cpstr CIFTAG_NDB_DESCRIPTOR ; extern cpstr CIFTAG_NDB_DB_ACCESSION ; extern cpstr CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE ; extern cpstr CIFTAG_NDB_DB_ALIGN_END_INS_CODE ; extern cpstr CIFTAG_NDB_END_LABEL_INS_CODE_PDB ; extern cpstr CIFTAG_PDBX_PDB_INS_CODE ; extern cpstr CIFTAG_NDB_HELIX_CLASS_PDB ; extern cpstr CIFTAG_NDB_KEYWORDS ; extern cpstr CIFTAG_NDB_LABEL_ALT_ID ; extern cpstr CIFTAG_NDB_LABEL_ATOM_ID ; extern cpstr CIFTAG_NDB_LABEL_ASYM_ID ; extern cpstr CIFTAG_NDB_LABEL_COMP_ID ; extern cpstr CIFTAG_NDB_LABEL_INS_CODE ; extern cpstr CIFTAG_NDB_LABEL_SEQ_NUM ; extern cpstr CIFTAG_NDB_LENGTH ; extern cpstr CIFTAG_NDB_MODEL ; extern cpstr CIFTAG_NDB_PDB_CHAIN_ID ; extern cpstr CIFTAG_NDB_PDB_ID ; extern cpstr CIFTAG_NDB_PDB_ID_CODE ; extern cpstr CIFTAG_NDB_PDB_INS_CODE ; extern cpstr CIFTAG_NDB_PTNR1_LABEL_INS_CODE ; extern cpstr CIFTAG_NDB_PTNR1_STANDARD_COMP_ID ; extern cpstr CIFTAG_NDB_RANGE_1_BEG_LABEL_COMP_ID ; extern cpstr CIFTAG_NDB_RANGE_1_BEG_LABEL_ASYM_ID ; extern cpstr CIFTAG_NDB_RANGE_1_BEG_LABEL_INS_CODE; extern cpstr CIFTAG_NDB_RANGE_1_END_LABEL_COMP_ID ; extern cpstr CIFTAG_NDB_RANGE_1_END_LABEL_ASYM_ID ; extern cpstr CIFTAG_NDB_RANGE_1_END_LABEL_INS_CODE; extern cpstr CIFTAG_NDB_SEQ_ALIGN_BEG ; extern cpstr CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE ; extern cpstr CIFTAG_NDB_SEQ_ALIGN_END ; extern cpstr CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE ; extern cpstr CIFTAG_NDB_SEQ_DB_NAME ; extern cpstr CIFTAG_NDB_SEQ_DB_ACCESSION_CODE ; extern cpstr CIFTAG_NDB_SEQ_DB_SEQ_NUM ; extern cpstr CIFTAG_NDB_SYNONYMS ; extern cpstr CIFTAG_NUM ; extern cpstr CIFTAG_NUMBER_ATOMS_NH ; extern cpstr CIFTAG_NUMBER_STRANDS ; extern cpstr CIFTAG_OCCUPANCY ; extern cpstr CIFTAG_OCCUPANCY_ESD ; extern cpstr CIFTAG_ORIGX11 ; extern cpstr CIFTAG_ORIGX12 ; extern cpstr CIFTAG_ORIGX13 ; extern cpstr CIFTAG_ORIGX21 ; extern cpstr CIFTAG_ORIGX22 ; extern cpstr CIFTAG_ORIGX23 ; extern cpstr CIFTAG_ORIGX31 ; extern cpstr CIFTAG_ORIGX32 ; extern cpstr CIFTAG_ORIGX33 ; extern cpstr CIFTAG_ORIGX_VECTOR1 ; extern cpstr CIFTAG_ORIGX_VECTOR2 ; extern cpstr CIFTAG_ORIGX_VECTOR3 ; extern cpstr CIFTAG_PDB_ID ; extern cpstr CIFTAG_PDB_MON_ID ; extern cpstr CIFTAG_PDB_STRAND_ID ; extern cpstr CIFTAG_PDBX_DB_ACCESSION ; extern cpstr CIFTAG_PDBX_DB_ALIGN_BEG_INS_CODE ; extern cpstr CIFTAG_PDBX_DB_ALIGN_END_INS_CODE ; extern cpstr CIFTAG_PDBX_PDB_ID_CODE ; extern cpstr CIFTAG_PDBX_PDB_MODEL_NUM ; extern cpstr CIFTAG_PDBX_STRAND_ID ; extern cpstr CIFTAG_RANGE_1_BEG_LABEL_ATOM_ID ; extern cpstr CIFTAG_RANGE_1_BEG_LABEL_SEQ_ID ; extern cpstr CIFTAG_RANGE_1_END_LABEL_ATOM_ID ; extern cpstr CIFTAG_RANGE_1_END_LABEL_SEQ_ID ; extern cpstr CIFTAG_RANGE_ID_1 ; extern cpstr CIFTAG_RANGE_ID_2 ; extern cpstr CIFTAG_RCSB_RECORD_REVISED_1 ; extern cpstr CIFTAG_RCSB_RECORD_REVISED_2 ; extern cpstr CIFTAG_RCSB_RECORD_REVISED_3 ; extern cpstr CIFTAG_RCSB_RECORD_REVISED_4 ; extern cpstr CIFTAG_PDBX_SEQ_ALIGN_BEG_INS_CODE ; extern cpstr CIFTAG_PDBX_SEQ_ALIGN_END_INS_CODE ; extern cpstr CIFTAG_PTNR1_LABEL_ASYM_ID ; extern cpstr CIFTAG_PTNR1_LABEL_COMP_ID ; extern cpstr CIFTAG_PTNR1_LABEL_SEQ_ID ; extern cpstr CIFTAG_REF_ID ; extern cpstr CIFTAG_REPLACES ; extern cpstr CIFTAG_REPLACE_PDB_ID ; extern cpstr CIFTAG_SEGMENT_ID ; extern cpstr CIFTAG_SEQ_ALIGN_BEG ; extern cpstr CIFTAG_SEQ_ALIGN_END ; extern cpstr CIFTAG_SEQ_NUM ; extern cpstr CIFTAG_SENSE ; extern cpstr CIFTAG_SHEET_ID ; extern cpstr CIFTAG_SOURCE ; extern cpstr CIFTAG_SPACE_GROUP_NAME_H_M ; extern cpstr CIFTAG_TEXT ; extern cpstr CIFTAG_TITLE ; extern cpstr CIFTAG_TYPE ; extern cpstr CIFTAG_TYPE_SYMBOL ; extern cpstr CIFTAG_VECTOR1 ; extern cpstr CIFTAG_VECTOR2 ; extern cpstr CIFTAG_VECTOR3 ; extern cpstr CIFTAG_U11 ; extern cpstr CIFTAG_U11_ESD ; extern cpstr CIFTAG_U12 ; extern cpstr CIFTAG_U12_ESD ; extern cpstr CIFTAG_U13 ; extern cpstr CIFTAG_U13_ESD ; extern cpstr CIFTAG_U22 ; extern cpstr CIFTAG_U22_ESD ; extern cpstr CIFTAG_U23 ; extern cpstr CIFTAG_U23_ESD ; extern cpstr CIFTAG_U33 ; extern cpstr CIFTAG_U33_ESD ; extern cpstr CIFTAG_Z_PDB ; extern cpstr CIFTAG_CONN_PTNR1_AUTH_ATOM_ID ; extern cpstr CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID ; extern cpstr CIFTAG_CONN_PTNR1_AUTH_COMP_ID ; extern cpstr CIFTAG_CONN_PTNR1_AUTH_ASYM_ID ; extern cpstr CIFTAG_CONN_PTNR1_AUTH_SEQ_ID ; extern cpstr CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE ; extern cpstr CIFTAG_CONN_DIST ; extern cpstr CIFTAG_CONN_PTNR2_AUTH_ATOM_ID ; extern cpstr CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID ; extern cpstr CIFTAG_CONN_PTNR2_AUTH_COMP_ID ; extern cpstr CIFTAG_CONN_PTNR2_AUTH_ASYM_ID ; extern cpstr CIFTAG_CONN_PTNR2_AUTH_SEQ_ID ; extern cpstr CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE ; extern cpstr CIFTAG_CONN_PTNR1_SYMMETRY ; extern cpstr CIFTAG_CONN_PTNR2_SYMMETRY ; extern cpstr CIFTAG_CONN_NAME ; } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_title.h0000644000175000017500000004406713271367640015752 0ustar maartenmaarten// $Id: mmdb_title.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Title // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::TitleContainer (container of title classes) // ~~~~~~~~~ mmdb::ObsLine // mmdb::TitleLine // mmdb::Caveat // mmdb::Compound // mmdb::Source // mmdb::KeyWords // mmdb::ExpData // mmdb::MdlType // mmdb::Author // mmdb::RevData // mmdb::Supersede // mmdb::Journal // mmdb::Remark // mmdb::Biomolecule // mmdb::Title ( MMDB title section ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_Title__ #define __MMDB_Title__ #include "mmdb_io_stream.h" #include "mmdb_defs.h" #include "mmdb_utils.h" #include "mmdb_mmcif_.h" namespace mmdb { // ====================== TitleContainer ======================= DefineClass(TitleContainer); DefineStreamFunctions(TitleContainer); class TitleContainer : public ClassContainer { public : TitleContainer () : ClassContainer() {} TitleContainer ( io::RPStream Object ) : ClassContainer ( Object ) {} ~TitleContainer() {} PContainerClass MakeContainerClass ( int ClassID ); }; // ================== ObsLine ======================== DefineClass(ObsLine); DefineStreamFunctions(ObsLine); class ObsLine : public ContainerClass { public : Date repDate; // date of replacement IDCode idCode; // ID code of replaced entry IDCode rIdCode[8]; // ID codes of entries that replaced this one ObsLine (); ObsLine ( cpstr S ); ObsLine ( io::RPStream Object ); ~ObsLine(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_ObsLine; } void Copy ( PContainerClass ObsLine ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitObsLine(); }; // ==================== TitleLine ===================== DefineClass(TitleLine); DefineStreamFunctions(TitleLine); class TitleLine : public ContString { public : TitleLine (); TitleLine ( cpstr S ); TitleLine ( io::RPStream Object ); ~TitleLine(); ERROR_CODE ConvertPDBASCII ( cpstr S ); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile ) { return false; } CLASS_ID GetClassID () { return ClassID_TitleLine; } void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitTitleLine(); }; // ==================== Caveat ===================== DefineClass(Caveat); DefineStreamFunctions(Caveat); class Caveat : public ContString { public : IDCode idCode; // ID code of the entry Caveat (); Caveat ( cpstr S ); Caveat ( io::RPStream Object ); ~Caveat(); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile ) { return false; } void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); // virtual void GetCIF1 ( mmcif::PData CIF, ERROR_CODE & Signal, // int & pos ); CLASS_ID GetClassID () { return ClassID_CAVEAT; } void Copy ( PContainerClass Caveat ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitCaveat(); }; // ==================== Compound ===================== DefineClass(Compound); DefineStreamFunctions(Compound); class Compound : public ContString { public : Compound (); Compound ( cpstr S ); Compound ( io::RPStream Object ); ~Compound(); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile ) { return false; } ERROR_CODE ConvertPDBASCII ( cpstr S ); CLASS_ID GetClassID () { return ClassID_Compound; } void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitCompound(); }; // ==================== Source ===================== DefineClass(Source); DefineStreamFunctions(Source); class Source : public ContString { public : Source (); Source ( cpstr S ); Source ( io::RPStream Object ); ~Source(); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile ) { return false; } ERROR_CODE ConvertPDBASCII ( cpstr S ); CLASS_ID GetClassID () { return ClassID_Source; } void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitSource(); }; // ==================== KeyWords ===================== DefineClass(KeyWords); DefineStreamFunctions(KeyWords); class KeyWords : public io::Stream { public : int nKeyWords; // number of key words psvector KeyWord; // key word array KeyWords (); KeyWords ( cpstr S ); KeyWords ( io::RPStream Object ); ~KeyWords(); void Delete (); void PDBASCIIDump ( io::RFile f ); void MakeCIF ( mmcif::PData CIF ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( mmcif::PData CIF ); void Copy ( PKeyWords KeyWords ); void write ( io::RFile f ); void read ( io::RFile f ); protected : bool Cont; void Init(); }; // ==================== ExpData ===================== DefineClass(ExpData); DefineStreamFunctions(ExpData); class ExpData : public ContString { public : ExpData (); ExpData ( cpstr S ); ExpData ( io::RPStream Object ); ~ExpData(); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile ) { return false; } ERROR_CODE ConvertPDBASCII ( cpstr S ); CLASS_ID GetClassID () { return ClassID_ExpData; } void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitExpData(); }; // ==================== MdlType ===================== DefineClass(MdlType); DefineStreamFunctions(MdlType); class MdlType : public ContString { public : MdlType (); MdlType ( cpstr S ); MdlType ( io::RPStream Object ); ~MdlType(); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile ) { return false; } ERROR_CODE ConvertPDBASCII ( cpstr S ); CLASS_ID GetClassID () { return ClassID_MdlType; } void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitMdlType(); }; // ==================== Author ===================== DefineClass(Author); DefineStreamFunctions(Author); class Author : public ContString { public : Author (); Author ( cpstr S ); Author ( io::RPStream Object ); ~Author(); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile ) { return false; } ERROR_CODE ConvertPDBASCII ( cpstr S ); CLASS_ID GetClassID () { return ClassID_Author; } void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitAuthor(); }; // ==================== RevData ===================== DefineClass(RevData); DefineStreamFunctions(RevData); enum REVDAT_WARNING { REVDAT_WARN_MODNUM = 0x00000001, REVDAT_WARN_MODTYPE = 0x00000002 }; class RevData : public ContainerClass { public : int modNum; Date modDate; char modId[13]; int modType; RecName record[4]; word Warning; RevData (); RevData ( cpstr S ); RevData ( io::RPStream Object ); ~RevData(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_RevData; } void Copy ( PContainerClass RevData ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitRevData(); }; // ================== Supersede ======================== DefineClass(Supersede); DefineStreamFunctions(Supersede); class Supersede : public ContainerClass { public : Date sprsdeDate; // date of supersede IDCode idCode; // ID code of the entry IDCode sIdCode[8]; // ID codes of superseded entries Supersede (); Supersede ( cpstr S ); Supersede ( io::RPStream Object ); ~Supersede(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_Supersede; } void Copy ( PContainerClass Supersede ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitSupersede(); }; // ==================== Journal ===================== DefineClass(Journal); DefineStreamFunctions(Journal); class Journal : public ContString { public : Journal (); Journal ( cpstr S ); Journal ( io::RPStream Object ); ~Journal(); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile ) { return false; } ERROR_CODE ConvertPDBASCII ( cpstr S ); CLASS_ID GetClassID () { return ClassID_Journal; } void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitJournal(); }; // ==================== Remark ===================== DefineClass(Remark); DefineStreamFunctions(Remark); class Remark : public ContainerClass { public : int remarkNum; // remark id pstr remark; // remark line Remark (); Remark ( cpstr S ); Remark ( io::RPStream Object ); ~Remark(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_Remark; } void Copy ( PContainerClass RemarkClass ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitRemark(); }; // ================= Biomolecule ===================== DefineClass(BMApply); DefineStreamFunctions(BMApply); class BMApply : public io::Stream { public : PChainID chain; int nChains; pmat44 tm; int nMatrices; BMApply (); BMApply ( io::RPStream Object ); ~BMApply(); void FreeMemory(); int addChains ( int & i, RPRemark rem, RTitleContainer Remark ); int addMatrices ( int & i, RPRemark rem, RTitleContainer Remark ); void Copy ( PBMApply BMA ); // if BMA is NULL, then empties // the class void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitBMApply(); }; DefineClass(Biomolecule); DefineStreamFunctions(Biomolecule); class Biomolecule : public io::Stream { public : PPBMApply bmApply; int nBMAs; Biomolecule (); Biomolecule ( io::RPStream Object ); ~Biomolecule(); void FreeMemory(); PBMApply addBMApply(); int Size(); bool checkComposition ( PChainID chID, ivector occ, ivector wocc, int n ); void Copy ( PBiomolecule B ); // if B is NULL, then empties // the class void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitBiomolecule(); }; // ================= Title ======================= DefineClass(Title); DefineStreamFunctions(Title); class Title : public io::Stream { friend class Model; friend class Chain; friend class Root; public : Title (); Title ( io::RPStream Object ); ~Title(); void FreeMemory ( bool keepBiomolecules ); // Fills the PDB file header void SetHeader ( cpstr Classification, // any length is Ok cpstr DepDate, // DD-MMM-YYYY cpstr ID_Code ); // not more than 11 chars // Interprets the ASCII PDB line belonging to the title section // and fills the corresponding fields. // Returns zero if the line was converted, otherwise returns a // non-negative value of Error_XXXX. // PDBString must be not shorter than 81 characters. ERROR_CODE ConvertPDBString ( pstr PDBString ); // MakePDBString() makes the ASCII PDB HEADER line from the // class data. PDBString must be not shorter than 81 characters. void MakePDBHeaderString ( pstr PDBString ); // GetStructureTitle() returns the contents of TITLE record // unfolded into single line. If Title is missing, returns // contents of COMPND(:MOLECULE). If COMPND is missing, returns // HEADER. If Header is missing, returns PDB code. If no PDB // code is there, returns "Not available". pstr GetStructureTitle ( pstr & S ); PTitleContainer GetObsData () { return &obsData; } PTitleContainer GetCaveat () { return &caveat; } PTitleContainer GetCompound() { return &compound; } PTitleContainer GetSource () { return &source; } PKeyWords GetKeyWords() { return &keyWords; } PTitleContainer GetExpData () { return &expData; } PTitleContainer GetMdlType () { return &mdlType; } PTitleContainer GetRemarks () { return &remark; } PTitleContainer GetJournal () { return &journal; } realtype GetResolution(); // -1.0 mean no resolution record in file int ParseBiomolecules(); // returns the number of biomolecules, // -2 for general format error // -3 for errors in BIOMT records int GetNofBiomolecules(); void GetBiomolecules ( PPBiomolecule & BM, int & nBMs ); PBiomolecule GetBiomolecule ( int bmNo ); // bmno=0,1,.. // returns NULL if bmNo is incorrect void PDBASCIIDump ( io::RFile f ); void MakeCIF ( mmcif::PData CIF ); // GetCIF(..) returns the same code as ConvertPDBString(..) // save for Error_WrongSection ERROR_CODE GetCIF ( mmcif::PData CIF ); inline pstr GetIDCode() { return idCode; } inline bool GetCol73 () { return col73; } void TrimInput ( pstr PDBString ); void Copy ( PTitle TS ); // if TS is NULL, then empties // the class void write ( io::RFile f ); // writes header to PDB binary file void read ( io::RFile f ); // reads header from PDB binary file protected : // Header data pstr classification; // classification of the molecule Date depDate; // deposition date DD-MMM-YYYY IDCode idCode; // unique PDB identifier realtype resolution; // resolution bool col73; // True if columns 73-80 contain PDB ID TitleContainer obsData; // obsoletion data TitleContainer title; // title data TitleContainer caveat; // error data TitleContainer compound; // compound data TitleContainer source; // source KeyWords keyWords; // key words TitleContainer expData; // experimental data TitleContainer mdlType; // model descriptions TitleContainer author; // author data TitleContainer revData; // revision data TitleContainer supersede; // supersede records TitleContainer journal; // journal records TitleContainer remark; // remark records PPBiomolecule biomolecule; int nBiomolecules; void Init(); void FreeBiomolecules(); PBiomolecule addBiomolecule(); }; extern void TestHeader(); extern void TestTitle (); // reads PDB title from file 'in.title' // and rewrites it into 'out.title' and // 'abin.title' } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_bondmngr.h0000644000175000017500000000415113271367640016425 0ustar maartenmaarten// $Id: mmdb_bondmngr.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 15.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_bondmngr // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::BondManager ( MMDB bonds maker ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_BondMngr__ #define __MMDB_BondMngr__ #include "mmdb_selmngr.h" namespace mmdb { // ======================= BondManager ======================= DefineClass(BondManager); DefineStreamFunctions(BondManager); class BondManager : public SelManager { public : BondManager (); BondManager ( io::RPStream Object ); ~BondManager(); void MakeBonds ( bool calc_only ); void RemoveBonds(); protected : void write ( io::RFile f ); void read ( io::RFile f ); }; } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_uddata.cpp0000644000175000017500000003217513271367640016423 0ustar maartenmaarten// $Id: mmdb_uddata.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_UDData // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : mmdb::UDData ( user-defined data ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include "mmdb_uddata.h" namespace mmdb { // ======================== UDRegister ========================== #define nUDRTypes 5 UDRegister::UDRegister() : io::Stream() { InitUDRegister(); } UDRegister::UDRegister ( io::RPStream Object ) : io::Stream(Object) { InitUDRegister(); } UDRegister::~UDRegister() { FreeUDRegister(); } void UDRegister::InitUDRegister() { int i; for (i=0;i=0) && (udr_type=0) && (udr_type=0) && (udr_type=0) && (udr_type0) { IUDRegister[j] = new pstr[nIUDR[j]]; for (i=0;i0) { RUDRegister[j] = new pstr[nRUDR[j]]; for (i=0;i0) { SUDRegister[j] = new pstr[nSUDR[j]]; for (i=0;i> 8); SUData[0][1] = byte((newN & 0x00FF0000) >> 16); SUData[0][0] = byte((newN & 0xFF000000) >> 24); } int UDData::putUDData ( int UDDhandle, int iudd ) { ivector IUD; int i,l,udh; udh = UDDhandle & UDRF_MASK; if (udh<1) return UDDATA_WrongHandle; l = getNofIUData(); if (udh>l) { GetVectorMemory ( IUD,udh+1,0 ); IUD[0] = udh; for (i=1;i<=l;i++) IUD[i] = IUData[i]; for (i=l+1;il) { GetVectorMemory ( RUD,udh+1,0 ); RUD[0] = udh; for (i=1;i<=l;i++) RUD[i] = RUData[i]; for (i=l+1;il) { if (l>0) { GetVectorMemory ( SUD,udh+1,0 ); for (i=0;i<=l;i++) SUD[i] = SUData[i]; for (i=l+1;i<=udh;i++) SUD[i] = NULL; FreeVectorMemory ( SUData,0 ); SUData = SUD; } else { GetVectorMemory ( SUData,udh+1,0 ); SUData[0] = new char[4]; for (i=1;i<=udh;i++) SUData[i] = NULL; } setNofSUData ( udh ); } CreateCopy ( SUData[udh],sudd ); return UDDATA_Ok; } int UDData::getUDData ( int UDDhandle, int & iudd ) { int l,udh; iudd = 0; udh = UDDhandle & UDRF_MASK; if (udh<1) return UDDATA_WrongHandle; l = getNofIUData(); if (udh>l) return UDDATA_NoData; iudd = IUData[udh]; if (iudd==MinInt4) return UDDATA_NoData; return UDDATA_Ok; } int UDData::getUDData ( int UDDhandle, realtype & rudd ) { int l,udh; rudd = 0.0; udh = UDDhandle & UDRF_MASK; if (udh<1) return UDDATA_WrongHandle; l = getNofRUData(); if (udh>l) return UDDATA_NoData; rudd = RUData[udh]; if (rudd==-MaxReal) return UDDATA_NoData; return UDDATA_Ok; } int UDData::getUDData ( int UDDhandle, pstr sudd, int maxLen ) { int l,udh; sudd[0] = char(0); udh = UDDhandle & UDRF_MASK; if (udh<1) return UDDATA_WrongHandle; l = getNofSUData(); if (udh>l) return UDDATA_NoData; if (!SUData[udh]) return UDDATA_NoData; strcpy_n0 ( sudd,SUData[udh],maxLen-1 ); return UDDATA_Ok; } pstr UDData::getUDData ( int UDDhandle, int * retcode ) { int l,udh; udh = UDDhandle & UDRF_MASK; if (udh<1) { if (retcode) *retcode = UDDATA_WrongHandle; return NULL; } l = getNofSUData(); if (udh>l) { if (retcode) *retcode = UDDATA_NoData; return NULL; } if (!SUData[udh]) { if (retcode) *retcode = UDDATA_NoData; return NULL; } if (retcode) *retcode = UDDATA_Ok; return SUData[udh]; } int UDData::getUDData ( int UDDhandle, pstr & sudd ) { int l,udh; udh = UDDhandle & UDRF_MASK; if (udh<1) { if (sudd) { delete[] sudd; sudd = NULL; } return UDDATA_WrongHandle; } l = getNofSUData(); if (udh>l) { if (sudd) { delete[] sudd; sudd = NULL; } return UDDATA_NoData; } if (!SUData[udh]) { if (sudd) { delete[] sudd; sudd = NULL; } return UDDATA_NoData; } CreateCopy ( sudd,SUData[udh] ); return UDDATA_Ok; } void UDData::write ( io::RFile f ) { int i,l; byte Version=1; f.WriteByte ( &Version ); Mask::write ( f ); if (IUData) l = IUData[0]; else l = -1; f.WriteVector ( IUData,l+1,0 ); if (RUData) l = mround(RUData[0]); else l = -1; f.WriteVector ( RUData,l+1,0 ); l = getNofSUData(); f.WriteInt ( &l ); for (i=1;i<=l;i++) f.CreateWrite ( SUData[i] ); } void UDData::read ( io::RFile f ) { int i,l; byte Version; f.ReadByte ( &Version ); FreeUDDMemory(); Mask::read ( f ); f.CreateReadVector ( IUData,0 ); f.CreateReadVector ( RUData,0 ); f.ReadInt ( &l ); if (l>0) { SUData = new pstr[l+1]; SUData[0] = new char[4]; setNofSUData ( l ); for (i=1;i<=l;i++) { SUData[i] = NULL; f.CreateRead ( SUData[i] ); } } } MakeStreamFunctions(UDData) } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_manager.cpp0000644000175000017500000002517713271367640016577 0ustar maartenmaarten// $Id: mmdb_manager.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 15.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_manager // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Manager ( MMDB file manager ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include "mmdb_manager.h" namespace mmdb { // ===================== Manager ======================= Manager::Manager() : BondManager() { } Manager::Manager ( io::RPStream Object ) : BondManager(Object) { } Manager::~Manager() {} void Manager::Copy ( PManager MMDB, COPY_MASK CopyMask ) { PModel mdl; PPChain chain; PChain ch; ChainID chID; int i,j, nchains; if (CopyMask & MMDBFCM_Flags) Flags = MMDB->Flags; if (CopyMask & MMDBFCM_Title) title.Copy ( &(MMDB->title) ); if (CopyMask & MMDBFCM_Cryst) cryst.Copy ( &(MMDB->cryst) ); if (CopyMask & MMDBFCM_Coord) { FreeCoordMemory (); DeleteAllSelections(); nAtoms = MMDB->nAtoms; atmLen = nAtoms; if (nAtoms>0) { atom = new PAtom[atmLen]; for (i=0;iatom[i]) { atom[i] = newAtom(); atom[i]->Copy ( MMDB->atom[i] ); // the internal atom references are installed // by residue classes when they are read in // model->chain below atom[i]->SetAtomIndex ( i+1 ); } else atom[i] = NULL; } } nModels = MMDB->nModels; if (nModels>0) { model = new PModel[nModels]; for (i=0;imodel[i]) { model[i] = newModel(); model[i]->SetMMDBManager ( this,0 ); model[i]->_copy ( MMDB->model[i] ); } else model[i] = NULL; } } crModel = NULL; crChain = NULL; crRes = NULL; if (MMDB->crModel) { for (i=0;iserNum==MMDB->crModel->serNum) { crModel = model[i]; break; } } if (crModel && crModel->chain && MMDB->crChain) for (i=0;inChains;i++) if (crModel->chain[i]) { if (!strcmp(crModel->chain[i]->chainID, MMDB->crModel->chain[i]->chainID)) { crChain = crModel->chain[i]; break; } } if (crChain && crChain->residue && MMDB->crRes) for (i=0;inResidues;i++) if (crChain->residue[i]) { if ((!strcmp(crChain->residue[i]->name, MMDB->crRes->name)) && (crChain->residue[i]->seqNum==MMDB->crRes->seqNum) && (!strcmp(crChain->residue[i]->insCode, MMDB->crRes->insCode))) { crRes = crChain->residue[i]; break; } } } /* if ((MMDB->nSelections>0) && MMDB->Mask) { nSelections = MMDB->nSelections; if (nSelections>0) { Mask = new PCMask [nSelections]; SelAtom = new PPAtom[nSelections]; nSelAtoms = new int [nSelections]; for (i=0;iCopyMask ( MMDB->Mask[i] ); nSelAtoms[i] = MMDB->nSelAtoms[i]; if (nSelAtoms[i]>0) { SelAtom[i] = new PAtom[nSelAtoms[i]]; for (j=0;jSelAtom[i][j]->index]; } else SelAtom[i] = NULL; } } } */ } else if (CopyMask & (MMDBFCM_HetInfo | MMDBFCM_SecStruct | MMDBFCM_Links | MMDBFCM_CisPeps | MMDBFCM_ChainAnnot)) { for (i=0;inModels;i++) if (MMDB->model[i]) { mdl = GetModel ( i+1 ); if (!mdl) { mdl = new Model( NULL,i+1 ); AddModel ( mdl ); } if (CopyMask & MMDBFCM_HetInfo) mdl->CopyHets ( MMDB->model[i] ); if (CopyMask & MMDBFCM_SecStruct) mdl->CopySecStructure ( MMDB->model[i] ); if (CopyMask & MMDBFCM_Links) { mdl->CopyLinks ( MMDB->model[i] ); mdl->CopyLinkRs ( MMDB->model[i] ); } if (CopyMask & MMDBFCM_CisPeps) mdl->CopyCisPeps ( MMDB->model[i] ); if (CopyMask & MMDBFCM_ChainAnnot) { MMDB->GetChainTable ( i+1,chain,nchains ); for (j=0;jGetChainID ( chID ); ch = mdl->GetChain ( chID ); if (!ch) { ch = new Chain(); ch->SetChainID ( chID ); mdl->AddChain ( ch ); } ch->CopyAnnotations ( chain[j] ); } } } } if (CopyMask & MMDBFCM_SA) SA.Copy ( &(MMDB->SA) ); if (CopyMask & MMDBFCM_SB) SB.Copy ( &(MMDB->SB) ); if (CopyMask & MMDBFCM_SC) SC.Copy ( &(MMDB->SC) ); if (CopyMask & MMDBFCM_Footnotes) Footnote.Copy ( &(MMDB->Footnote) ); if (CopyMask & MMDBFCM_Buffer) { lcount = MMDB->lcount; strncpy ( S,MMDB->S,sizeof(S) ); } } void Manager::Delete ( word DelMask ) { PPModel model; PPChain chain; int i,j,nm, nchains; if (DelMask & MMDBFCM_Flags) Flags = 0; if (DelMask & MMDBFCM_Title) title.Copy ( NULL ); if (DelMask & MMDBFCM_TitleKeepBM) title.FreeMemory ( true ); if (DelMask & MMDBFCM_Cryst) cryst.Copy ( NULL ); if (DelMask & MMDBFCM_Coord) { FreeCoordMemory (); DeleteAllSelections(); } if (DelMask & MMDBFCM_SecStruct) { GetModelTable ( model,nm ); if (model) for (i=0;iRemoveSecStructure(); } if (DelMask & MMDBFCM_HetInfo) { GetModelTable ( model,nm ); if (model) for (i=0;iRemoveHetInfo(); } if (DelMask & MMDBFCM_Links) { GetModelTable ( model,nm ); if (model) for (i=0;iRemoveLinks (); model[i]->RemoveLinkRs(); } } if (DelMask & MMDBFCM_CisPeps) { GetModelTable ( model,nm ); if (model) for (i=0;iRemoveCisPeps(); } if (DelMask & MMDBFCM_ChainAnnot) { nm = GetNumberOfModels(); for (i=1;i<=nm;i++) { GetChainTable ( i,chain,nchains ); if (chain) for (j=0;jFreeAnnotations(); } } if (DelMask & MMDBFCM_SA) SA.FreeContainer(); if (DelMask & MMDBFCM_SB) SB.FreeContainer(); if (DelMask & MMDBFCM_SC) SC.FreeContainer(); if (DelMask & MMDBFCM_Footnotes) Footnote.FreeContainer(); if (DelMask & MMDBFCM_Buffer) { lcount = 0; S[0] = char(0); } } PTitleContainer Manager::GetRemarks() { return title.GetRemarks(); } PTitleContainer Manager::GetJournal() { return title.GetJournal(); } realtype Manager::GetResolution() { return title.GetResolution(); } int Manager::ParseBiomolecules() { return title.ParseBiomolecules(); } int Manager::GetNofBiomolecules() { return title.GetNofBiomolecules(); } void Manager::GetBiomolecules ( PPBiomolecule & BM, int & nBMs ) { title.GetBiomolecules ( BM,nBMs ); } PBiomolecule Manager::GetBiomolecule ( int bmNo ) { return title.GetBiomolecule ( bmNo ); } PManager Manager::MakeBiomolecule ( int bmNo, int modelNo ) { PManager M; PPChain ch; PChain chain; PModel model; PBiomolecule BM; int i,j,k,n,n0,nChains; BM = title.GetBiomolecule ( bmNo ); if (!BM) return NULL; GetChainTable ( modelNo,ch,nChains ); if ((!ch) || (nChains<=0)) return NULL; n0 = 0; model = new Model(); for (i=0;(inBMAs) && (n0>=0);i++) if (BM->bmApply[i]) { for (j=0;(jbmApply[i]->nMatrices) && (n0>=0);j++) for (k=0;(kbmApply[i]->nChains) && (n0>=0);k++) { n0 = -1; for (n=0;(nGetChainID(),BM->bmApply[i]->chain[k])) n0 = n; if (n0>=0) { chain = new Chain(); chain->Copy ( ch[n0] ); chain->ApplyTransform ( BM->bmApply[i]->tm[j] ); model->AddChain ( chain ); } } } if (n0>=0) { M = new Manager(); M->AddModel ( model ); M->PDBCleanup ( PDBCLEAN_SERIAL | PDBCLEAN_INDEX ); } else { delete model; M = NULL; } return M; } // ------------------- Stream functions ---------------------- void Manager::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); BondManager::write ( f ); } void Manager::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); BondManager::read ( f ); } MakeStreamFunctions(Manager) } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_model.cpp0000644000175000017500000045103613271367640016262 0ustar maartenmaarten// $Id: mmdb_model.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 11.09.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Model // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::HetCompound ( description of het compounds ) // ~~~~~~~~~ mmdb::HetCompounds (HETNAM, HETSYN, FORMULA records) // mmdb::SSContainer (container for helixes and turns) // mmdb::Helix ( helix info ) // mmdb::Strand ( strand info ) // mmdb::Sheet ( sheet info ) // mmdb::Sheets ( container for sheets ) // mmdb::Turn ( turn info ) // mmdb::LinkContainer ( container for link data ) // mmdb::Link ( link data ) // mmdb::LinkRContainer ( container for refmac link ) // mmdb::LinkR ( link data ) // mmdb::CisPepContainer ( container for CisPep data ) // mmdb::CisPep ( CisPep data ) // mmdb::Model ( PDB model ) // // Copyright (C) E. Krissinel 2000-2015 // // ================================================================= // #include #include #include "mmdb_model.h" #include "mmdb_manager.h" #include "mmdb_cifdefs.h" namespace mmdb { // =================== HetCompound ========================= HetCompound::HetCompound ( cpstr HetName ) : io::Stream() { InitHetCompound ( HetName ); } HetCompound::HetCompound ( io::RPStream Object ) : io::Stream(Object) { InitHetCompound ( pstr("---") ); } HetCompound::~HetCompound() { FreeMemory(); } void HetCompound::InitHetCompound ( cpstr HetName ) { strcpy_n0 ( hetID,HetName,sizeof(ResName) ); comment = NULL; nSynonyms = 0; hetSynonym = NULL; compNum = MinInt4; wc = ' '; Formula = NULL; } void HetCompound::FreeMemory() { int i; if (comment) { delete[] comment; comment = NULL; } if (hetSynonym) { for (i=0;i53) { i = 0; while (p1[i] && (i<53) && (p1[i]!=' ')) i++; p2 = &(p1[i]); c = *p2; *p2 = char(0); } if (*p1) { strcat ( S,p1 ); PadSpaces ( S,80 ); f.WriteLine ( S ); } else N--; if (p2) { *p2 = c; if (c) p1 = p2+1; else p2 = NULL; } } while (p2); } void HetCompound::HETSYN_PDBDump ( io::RFile f ) { char S[100]; pstr p; char c; int N,k,i,l; if (!hetSynonym) return; N = 0; k = 0; p = &(hetSynonym[0][0]); do { N++; if (N==1) sprintf ( S,"HETSYN %3s " ,hetID ); else sprintf ( S,"HETSYN %2i %3s ",N,hetID ); i = 0; do { l = strlen(p)+2; if (i+l<54) { strcat ( S,p ); if (k51) { i--; while ((i>0) && (p[i]!=' ')) i--; } if (i<2) i = 51; // no spaces! c = p[i]; p[i] = char(0); strcat ( S,p ); p[i] = c; p = &(p[i]); while (*p==' ') p++; } i = 60; // break loop } } while (i<54); PadSpaces ( S,80 ); f.WriteLine ( S ); } while (kMinInt4) { if (N==1) sprintf ( S,"FORMUL %2i %3s " ,compNum,hetID ); else sprintf ( S,"FORMUL %2i %3s %2i ",compNum,hetID,N ); } else { if (N==1) sprintf ( S,"FORMUL %3s " ,hetID ); else sprintf ( S,"FORMUL %3s %2i ",hetID,N ); } S[18] = wc; p2 = FirstOccurence(p1,'\n'); if (p2) { c = *p2; *p2 = char(0); } else if (strlen(p1)>50) { while (*p1==' ') p1++; i = 0; while (p1[i] && (i<50) && (p1[i]!=' ')) i++; p2 = &(p1[i]); c = *p2; *p2 = char(0); } strcat ( S,p1 ); if (p2) { *p2 = c; p1 = p2+1; } PadSpaces ( S,80 ); f.WriteLine ( S ); } while (p2); } void HetCompound::FormComString ( pstr & F ) { pstr p; int i; if (F) { delete[] F; F = NULL; } if (comment) { CreateCopy ( F,comment ); i = 0; p = comment; while (*p) { p++; if (*p=='\n') i = 0; else i++; if (i>68) { F[i] = char(0); CreateConcat ( F,pstr("\n"),p ); i = 0; } } } } void HetCompound::FormSynString ( pstr & F ) { pstr p; char c; int i,k,l; if (F) { delete[] F; F = NULL; } if (hetSynonym) { CreateCopy ( F,pstr(" ") ); k = 0; p = &(hetSynonym[0][0]); do { l = strlen(p)+2; if (l<=60) { if (k60) { i--; while ((i>0) && (p[i]!=' ')) i--; } if (i<2) i = 60; // no spaces! c = p[i]; p[i] = char(0); CreateConcat ( F,p,pstr("\n ") ); p[i] = c; p = &(p[i]); while (*p==' ') p++; } } while (k68) { F[i] = char(0); CreateConcat ( F,pstr("\n"),p ); i = 0; } } } } void HetCompound::Copy ( PHetCompound hetCompound ) { int i; FreeMemory (); strcpy ( hetID ,hetCompound->hetID ); CreateCopy ( comment,hetCompound->comment ); nSynonyms = hetCompound->nSynonyms; if (nSynonyms>0) { hetSynonym = new pstr[nSynonyms]; for (i=0;ihetSynonym[i] ); } } compNum = hetCompound->compNum; wc = hetCompound->wc; CreateCopy ( Formula,hetCompound->Formula ); } void HetCompound::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( hetID,false ); f.CreateWrite ( comment ); f.WriteInt ( &nSynonyms ); for (i=0;i0) { hetSynonym = new pstr[nSynonyms]; for (i=0;i12) { strcpy_n0 ( hetID,&(S[11]),3 ); i = AddHetName ( hetID ); if (l>15) { if (hetCompound[i]->comment) strcpy ( L,"\n" ); else L[0] = char(0); strcat ( L,&(S[15]) ); CutSpaces ( L,SCUTKEY_END ); CreateConcat ( hetCompound[i]->comment,L ); } } } void HetCompounds::ConvertHETSYN ( cpstr S ) { ResName hetID; char L[100]; int l,i,j,k; l = strlen(S); if (l>12) { strcpy_n0 ( hetID,&(S[11]),3 ); i = AddHetName ( hetID ); if (l>15) { j = 15; do { while (S[j]==' ') j++; k = 0; if (S[j]) { while (S[j] && (S[j]!=';')) L[k++] = S[j++]; L[k--] = char(0); while ((k>0) && (L[k]==' ')) L[k--] = char(0); if (L[0]) { hetCompound[i]->AddKeyWord ( L,Closed ); Closed = (S[j]==';'); } if (S[j]) j++; } } while (S[j]); /* p1 = &(S[15]); do { p2 = FirstOccurence ( p1,';' ); if (p2) { c = *p2; *p2 = char(0); } strcpy_css ( L,p1 ); if (L[0]) hetCompound[i]->AddKeyWord ( L,Closed ); if (p2) { if (L[0]) Closed = true; *p2 = c; p1 = p2+1; } else if (L[0]) Closed = false; } while (p2); */ } } } void HetCompounds::ConvertFORMUL ( cpstr S ) { ResName hetID; char L[100]; int l,i; l = strlen(S); if (l>13) { strcpy_n0 ( hetID,&(S[12]),3 ); i = AddHetName ( hetID ); if (l>18) { GetInteger ( hetCompound[i]->compNum,&(S[9]),2 ); hetCompound[i]->wc = S[18]; if (strlen(S)>19) { if (hetCompound[i]->Formula) strcpy ( L,"\n" ); else L[0] = char(0); strcat ( L,&(S[19]) ); CutSpaces ( L,SCUTKEY_END ); CreateConcat ( hetCompound[i]->Formula,L ); } } } } int HetCompounds::AddHetName ( cpstr H ) { PPHetCompound HC1; int i; i = 0; while (ihetID,H)) break; } i++; } if (i>=nHets) { HC1 = new PHetCompound[nHets+1]; for (i=0;iHETNAM_PDBDump ( f ); for (i=0;iHETSYN_PDBDump ( f ); for (i=0;iFORMUL_PDBDump ( f ); } void HetCompounds::MakeCIF ( mmcif::PData CIF ) { mmcif::PLoop Loop; pstr F; int RC; int i; if (!hetCompound) return; RC = CIF->AddLoop ( CIFCAT_CHEM_COMP,Loop ); if (RC!=mmcif::CIFRC_Ok) { Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_NAME ); Loop->AddLoopTag ( CIFTAG_NDB_SYNONYMS ); Loop->AddLoopTag ( CIFTAG_NDB_COMPONENT_NO ); Loop->AddLoopTag ( CIFTAG_FORMULA ); } F = NULL; for (i=0;iAddString ( hetCompound[i]->hetID ); hetCompound[i]->FormComString ( F ); Loop->AddString ( F ); hetCompound[i]->FormSynString ( F ); Loop->AddString ( F ); if (hetCompound[i]->compNum>MinInt4) Loop->AddInteger ( hetCompound[i]->compNum ); else Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); hetCompound[i]->FormForString ( F ); Loop->AddString ( F ); } if (F) delete[] F; } ERROR_CODE HetCompounds::GetCIF ( mmcif::PData CIF ) { mmcif::PLoop Loop; char L[100]; ResName hetID; pstr F,p1,p2; char c; int RC,i,l,k; FreeMemory(); c = char(0); // only to supress compiler warnings Loop = CIF->GetLoop ( CIFCAT_CHEM_COMP ); if (!Loop) return Error_NoError; l = Loop->GetLoopLength(); F = NULL; for (i=0;iGetString ( hetCompound[k]->comment,CIFTAG_NAME,i,true ); RC = Loop->GetInteger ( hetCompound[k]->compNum, CIFTAG_NDB_COMPONENT_NO,i,true ); if (RC) hetCompound[i]->compNum = MinInt4; Loop->GetString ( hetCompound[k]->Formula,CIFTAG_FORMULA,i,true ); RC = Loop->GetString ( F,CIFTAG_NDB_SYNONYMS,i,true ); if ((!RC) && F ) { p1 = &(F[0]); while (*p1) { if (*p1=='\n') *p1 = ' '; p1++; } p1 = &(F[0]); do { p2 = FirstOccurence ( p1,';' ); if (p2) { c = *p2; *p2 = char(0); } strcpy_css ( L,p1 ); hetCompound[i]->AddKeyWord ( L,true ); if (p2) { *p2 = c; p1 = p2+1; } } while (p2); } hetCompound[i]->wc = ' '; } // CIF->DeleteLoop ( CIFCAT_CHEM_COMP ); if (F) delete[] F; return Error_NoError; } void HetCompounds::Copy ( PHetCompounds HetCompounds ) { int i; FreeMemory(); nHets = HetCompounds->nHets; if (nHets>0) { hetCompound = new PHetCompound[nHets]; for (i=0;iCopy ( HetCompounds->hetCompound[i] ); } } } void HetCompounds::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &nHets ); for (i=0;iwrite ( f ); } void HetCompounds::read ( io::RFile f ) { int i; byte Version; FreeMemory(); f.ReadByte ( &Version ); f.ReadInt ( &nHets ); if (nHets>0) { hetCompound = new PHetCompound[nHets]; for (i=0;iread ( f ); } } } MakeStreamFunctions(HetCompounds) // ==================== SSContainer ========================= PContainerClass SSContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return ClassContainer::MakeContainerClass(ClassID); case ClassID_Helix : return new Helix(); case ClassID_Turn : return new Turn (); } } MakeStreamFunctions(SSContainer) // ================ Helix =================== Helix::Helix() : ContainerClass() { InitHelix(); } Helix::Helix ( cpstr S ) : ContainerClass() { InitHelix(); ConvertPDBASCII ( S ); } Helix::Helix ( io::RPStream Object ) : ContainerClass(Object) { InitHelix(); } Helix::~Helix() { if (comment) delete[] comment; } void Helix::InitHelix() { serNum = 0; // serial number strcpy ( helixID ,"---" ); // helix ID strcpy ( initResName,"---" ); // name of the helix's initial residue strcpy ( initChainID,"" ); // chain ID for the chain // containing the helix initSeqNum = 0; // sequence number of the initial // residue strcpy ( initICode ,"" ); // insertion code of the initial // residue strcpy ( endResName ,"---" ); // name of the helix's terminal residue strcpy ( endChainID ,"" ); // chain ID for the chain // containing the helix endSeqNum = 0; // sequence number of the terminal // residue strcpy ( endICode ,"" ); // insertion code of the terminal // residue helixClass = 0; // helix class comment = NULL; // comment about the helix length = 0; // length of the helix } void Helix::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB OBSLTE line number N // from the class' data strcpy ( S,"HELIX" ); PadSpaces ( S,80 ); PutInteger ( &(S[7]) ,serNum ,3 ); strcpy_n1 ( &(S[11]),helixID ,3 ); strcpy_n1 ( &(S[15]),initResName,3 ); if (initChainID[0]) S[19] = initChainID[0]; PutIntIns ( &(S[21]),initSeqNum ,4,initICode ); strcpy_n1 ( &(S[27]),endResName ,3 ); if (endChainID[0]) S[31] = endChainID[0]; PutIntIns ( &(S[33]),endSeqNum ,4,endICode ); PutInteger ( &(S[38]),helixClass ,2 ); if (comment) strcpy_n ( &(S[40]),comment ,30 ); PutInteger ( &(S[71]),length ,5 ); } void AddStructConfTags ( mmcif::PLoop Loop ) { Loop->AddLoopTag ( CIFTAG_CONF_TYPE_ID ); Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_PDB_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB ); Loop->AddLoopTag ( CIFTAG_END_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_END_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_END_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_END_LABEL_INS_CODE_PDB ); Loop->AddLoopTag ( CIFTAG_NDB_HELIX_CLASS_PDB ); Loop->AddLoopTag ( CIFTAG_DETAILS ); Loop->AddLoopTag ( CIFTAG_NDB_LENGTH ); } #define HelixTypeID "HELX_P" void Helix::MakeCIF ( mmcif::PData CIF, int N ) { UNUSED_ARGUMENT(N); mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_CONF,Loop ); if (RC!=mmcif::CIFRC_Ok) // the category was (re)created, provide tags AddStructConfTags ( Loop ); Loop->AddString ( pstr(HelixTypeID) ); Loop->AddInteger ( serNum ); Loop->AddString ( helixID ); Loop->AddString ( initResName ); Loop->AddString ( initChainID ); Loop->AddInteger ( initSeqNum ); Loop->AddString ( initICode,true ); Loop->AddString ( endResName ); Loop->AddString ( endChainID ); Loop->AddInteger ( endSeqNum ); Loop->AddString ( endICode ,true ); Loop->AddInteger ( helixClass ); Loop->AddString ( comment ); Loop->AddInteger ( length ); } ERROR_CODE Helix::ConvertPDBASCII ( cpstr S ) { char L[100]; GetInteger ( serNum ,&(S[7]) ,3 ); strcpy_ncss ( helixID ,&(S[11]),3 ); strcpy_ncss ( initResName,&(S[15]),3 ); strcpy_ncss ( initChainID,&(S[19]),1 ); GetIntIns ( initSeqNum,initICode,&(S[21]),4 ); strcpy_ncss ( endResName ,&(S[27]),3 ); strcpy_ncss ( endChainID ,&(S[31]),1 ); GetIntIns ( endSeqNum ,endICode ,&(S[33]),4 ); GetInteger ( helixClass ,&(S[38]),2 ); strcpy_ncss ( L ,&(S[40]),30 ); CreateCopy ( comment ,L ); GetInteger ( length ,&(S[71]),5 ); return Error_NoError; } ERROR_CODE Helix::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; int RC,l; pstr F; bool Done; ERROR_CODE rc; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONF ); if (!Loop) { n = -1; // signal to finish processing of this structure return Error_EmptyCIF; } l = Loop->GetLoopLength(); Done = n>=l; while (!Done) { F = Loop->GetString ( CIFTAG_CONF_TYPE_ID,n,RC ); if ((!RC) && F) Done = (strcmp(F,HelixTypeID)==0); else Done = false; if (!Done) { n++; Done = n>=l; } } if (n>=l) { n = -1; // finish processing of Helix return Error_EmptyCIF; } Loop->DeleteField ( CIFTAG_CONF_TYPE_ID,n ); rc = CIFGetInteger ( serNum,Loop,CIFTAG_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( helixID ,Loop,CIFTAG_PDB_ID, n,sizeof(helixID),pstr(" ") ); CIFGetString ( initResName,Loop,CIFTAG_BEG_LABEL_COMP_ID, n,sizeof(initResName),pstr(" ") ); CIFGetString ( initChainID,Loop,CIFTAG_BEG_LABEL_ASYM_ID, n,sizeof(initChainID),pstr("") ); CIFGetString ( initICode ,Loop,CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB, n,sizeof(initICode),pstr("") ); if (CIFGetInteger(initSeqNum,Loop,CIFTAG_BEG_LABEL_SEQ_ID,n)) if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( endResName,Loop,CIFTAG_END_LABEL_COMP_ID, n,sizeof(endResName),pstr(" ") ); CIFGetString ( endChainID,Loop,CIFTAG_END_LABEL_ASYM_ID, n,sizeof(endChainID),pstr("") ); CIFGetString ( endICode ,Loop,CIFTAG_NDB_END_LABEL_INS_CODE_PDB, n,sizeof(endICode),pstr("") ); rc = CIFGetInteger(endSeqNum,Loop,CIFTAG_END_LABEL_SEQ_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; rc = CIFGetInteger(helixClass,Loop,CIFTAG_NDB_HELIX_CLASS_PDB,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CreateCopy ( comment,Loop->GetString(CIFTAG_DETAILS,n,RC)); Loop->DeleteField ( CIFTAG_DETAILS,n ); rc = CIFGetInteger ( length,Loop,CIFTAG_NDB_LENGTH,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; n++; return Error_NoError; } void Helix::Copy ( PContainerClass Helix ) { serNum = PHelix(Helix)->serNum; initSeqNum = PHelix(Helix)->initSeqNum; endSeqNum = PHelix(Helix)->endSeqNum; helixClass = PHelix(Helix)->helixClass; length = PHelix(Helix)->length; strcpy ( helixID ,PHelix(Helix)->helixID ); strcpy ( initResName,PHelix(Helix)->initResName ); strcpy ( initChainID,PHelix(Helix)->initChainID ); strcpy ( initICode ,PHelix(Helix)->initICode ); strcpy ( endResName ,PHelix(Helix)->endResName ); strcpy ( endChainID ,PHelix(Helix)->endChainID ); strcpy ( endICode ,PHelix(Helix)->endICode ); CreateCopy ( comment,PHelix(Helix)->comment ); } void Helix::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); f.WriteInt ( &initSeqNum ); f.WriteInt ( &endSeqNum ); f.WriteInt ( &helixClass ); f.WriteInt ( &length ); f.WriteTerLine ( helixID ,false ); f.WriteTerLine ( initResName,false ); f.WriteTerLine ( initChainID,false ); f.WriteTerLine ( initICode ,false ); f.WriteTerLine ( endResName ,false ); f.WriteTerLine ( endChainID ,false ); f.WriteTerLine ( endICode ,false ); f.CreateWrite ( comment ); } void Helix::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); f.ReadInt ( &initSeqNum ); f.ReadInt ( &endSeqNum ); f.ReadInt ( &helixClass ); f.ReadInt ( &length ); f.ReadTerLine ( helixID ,false ); f.ReadTerLine ( initResName,false ); f.ReadTerLine ( initChainID,false ); f.ReadTerLine ( initICode ,false ); f.ReadTerLine ( endResName ,false ); f.ReadTerLine ( endChainID ,false ); f.ReadTerLine ( endICode ,false ); f.CreateRead ( comment ); } MakeStreamFunctions(Helix) // ================ Strand ===================== Strand::Strand () : io::Stream() { InitStrand(); } Strand::Strand ( io::RPStream Object ) : io::Stream(Object) { InitStrand(); } Strand::~Strand() { } void Strand::InitStrand() { initSeqNum = MinInt4; endSeqNum = MinInt4; sense = 0; curResSeq = MinInt4; prevResSeq = MinInt4; strandNo = 0; strcpy ( sheetID ,"sheet_0" ); strcpy ( initResName," " ); strcpy ( initChainID,"" ); strcpy ( initICode ,"" ); strcpy ( endResName ," " ); strcpy ( endChainID ,"" ); strcpy ( endICode ,"" ); strcpy ( curAtom ," " ); strcpy ( curResName ," " ); strcpy ( curChainID ,"" ); strcpy ( curICode ,"" ); strcpy ( prevAtom ," " ); strcpy ( prevResName," " ); strcpy ( prevChainID,"" ); strcpy ( prevICode ,"" ); } void Strand::PDBASCIIDump ( pstr S ) { // Finishes making the ASCII PDB SHEET line number N // from the class' data. Making is initiated by Sheet. strcpy_n1 ( &(S[17]),initResName,3 ); if (initChainID[0]) S[21] = initChainID[0]; PutIntIns ( &(S[22]),initSeqNum ,4,initICode ); strcpy_n1 ( &(S[28]),endResName ,3 ); if (endChainID[0]) S[32] = endChainID[0]; PutIntIns ( &(S[33]),endSeqNum ,4,endICode ); PutInteger ( &(S[38]),sense ,2 ); strcpy_n1 ( &(S[41]),curAtom ,4 ); strcpy_n1 ( &(S[45]),curResName ,3 ); if (curChainID[0]) S[49] = curChainID[0]; PutIntIns ( &(S[50]),curResSeq ,4,curICode ); strcpy_n1 ( &(S[56]),prevAtom ,4 ); strcpy_n1 ( &(S[60]),prevResName,3 ); if (prevChainID[0]) S[64] = prevChainID[0]; PutIntIns ( &(S[65]),prevResSeq ,4,prevICode ); } void Strand::MakeCIF ( mmcif::PData CIF ) { mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_SHEET_RANGE,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_SHEET_ID ); Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB ); Loop->AddLoopTag ( CIFTAG_END_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_END_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_END_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_END_LABEL_INS_CODE_PDB ); } Loop->AddString ( sheetID ); Loop->AddInteger ( strandNo ); Loop->AddString ( initResName ); Loop->AddString ( initChainID ); Loop->AddInteger ( initSeqNum ); Loop->AddString ( initICode,true ); Loop->AddString ( endResName ); Loop->AddString ( endChainID ); Loop->AddInteger ( endSeqNum ); Loop->AddString ( endICode ,true ); } ERROR_CODE Strand::ConvertPDBASCII ( cpstr S ) { GetInteger ( strandNo ,&(S[7]) ,3 ); strcpy_ncss ( sheetID ,&(S[11]) ,3 ); strcpy_ncss ( initResName,&(S[17]) ,3 ); strcpy_ncss ( initChainID,&(S[21]) ,1 ); GetIntIns ( initSeqNum ,initICode,&(S[22]),4 ); strcpy_ncss ( endResName ,&(S[28]) ,3 ); strcpy_ncss ( endChainID ,&(S[32]) ,1 ); GetIntIns ( endSeqNum ,endICode ,&(S[33]),4 ); GetInteger ( sense ,&(S[38]) ,2 ); GetString ( curAtom ,&(S[41]) ,4 ); strcpy_ncss ( curResName ,&(S[45]) ,3 ); strcpy_ncss ( curChainID ,&(S[49]) ,1 ); GetIntIns ( curResSeq ,curICode ,&(S[50]),4 ); GetString ( prevAtom ,&(S[56]) ,4 ); strcpy_ncss ( prevResName,&(S[60]) ,3 ); strcpy_ncss ( prevChainID,&(S[64]) ,1 ); GetIntIns ( prevResSeq ,prevICode,&(S[65]),4 ); return Error_NoError; } int Strand::GetCIF ( mmcif::PData CIF, cpstr sheet_id ) { mmcif::PLoop Loop; int RC,l,i,sNo; pstr F; Loop = CIF->GetLoop ( CIFCAT_STRUCT_SHEET_RANGE ); if (Loop) { l = Loop->GetLoopLength(); i = 0; while (iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheet_id)) { strcpy ( sheetID,sheet_id ); if (CIFGetInteger(sNo,Loop,CIFTAG_ID,i)) return i; if (sNo==strandNo) { CIFGetString ( initResName,Loop,CIFTAG_BEG_LABEL_COMP_ID, i,sizeof(initResName),pstr(" ") ); CIFGetString ( initChainID,Loop,CIFTAG_BEG_LABEL_ASYM_ID, i,sizeof(initChainID),pstr("") ); CIFGetString ( initICode,Loop, CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB, i,sizeof(initICode),pstr("") ); if (CIFGetInteger(initSeqNum,Loop, CIFTAG_BEG_LABEL_SEQ_ID,i)) return i; CIFGetString ( endResName,Loop,CIFTAG_END_LABEL_COMP_ID, i,sizeof(endResName),pstr(" ") ); CIFGetString ( endChainID,Loop,CIFTAG_END_LABEL_ASYM_ID, i,sizeof(endChainID),pstr("") ); CIFGetString ( endICode ,Loop, CIFTAG_NDB_END_LABEL_INS_CODE_PDB, i,sizeof(endICode),pstr("") ); if (CIFGetInteger(endSeqNum,Loop, CIFTAG_END_LABEL_SEQ_ID,i)) return i; Loop->DeleteRow ( i ); i = l+100; // break the loop } } } i++; } } return 0; } void Strand::Copy ( PStrand Strand ) { initSeqNum = Strand->initSeqNum; endSeqNum = Strand->endSeqNum; sense = Strand->sense; curResSeq = Strand->curResSeq; prevResSeq = Strand->prevResSeq; strcpy ( initResName,Strand->initResName ); strcpy ( initChainID,Strand->initChainID ); strcpy ( initICode ,Strand->initICode ); strcpy ( endResName ,Strand->endResName ); strcpy ( endChainID ,Strand->endChainID ); strcpy ( endICode ,Strand->endICode ); strcpy ( curAtom ,Strand->curAtom ); strcpy ( curResName ,Strand->curResName ); strcpy ( curChainID ,Strand->curChainID ); strcpy ( curICode ,Strand->curICode ); strcpy ( prevAtom ,Strand->prevAtom ); strcpy ( prevResName,Strand->prevResName ); strcpy ( prevChainID,Strand->prevChainID ); strcpy ( prevICode ,Strand->prevICode ); } void Strand::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &initSeqNum ); f.WriteInt ( &endSeqNum ); f.WriteInt ( &sense ); f.WriteInt ( &curResSeq ); f.WriteInt ( &prevResSeq ); f.WriteTerLine ( initResName,false ); f.WriteTerLine ( initChainID,false ); f.WriteTerLine ( initICode ,false ); f.WriteTerLine ( endResName ,false ); f.WriteTerLine ( endChainID ,false ); f.WriteTerLine ( endICode ,false ); f.WriteTerLine ( curAtom ,false ); f.WriteTerLine ( curResName ,false ); f.WriteTerLine ( curChainID ,false ); f.WriteTerLine ( curICode ,false ); f.WriteTerLine ( prevAtom ,false ); f.WriteTerLine ( prevResName,false ); f.WriteTerLine ( prevChainID,false ); f.WriteTerLine ( prevICode ,false ); } void Strand::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &initSeqNum ); f.ReadInt ( &endSeqNum ); f.ReadInt ( &sense ); f.ReadInt ( &curResSeq ); f.ReadInt ( &prevResSeq ); f.ReadTerLine ( initResName,false ); f.ReadTerLine ( initChainID,false ); f.ReadTerLine ( initICode ,false ); f.ReadTerLine ( endResName ,false ); f.ReadTerLine ( endChainID ,false ); f.ReadTerLine ( endICode ,false ); f.ReadTerLine ( curAtom ,false ); f.ReadTerLine ( curResName ,false ); f.ReadTerLine ( curChainID ,false ); f.ReadTerLine ( curICode ,false ); f.ReadTerLine ( prevAtom ,false ); f.ReadTerLine ( prevResName,false ); f.ReadTerLine ( prevChainID,false ); f.ReadTerLine ( prevICode ,false ); } MakeStreamFunctions(Strand) // ================ Sheet =================== Sheet::Sheet() : io::Stream() { InitSheet(); } Sheet::Sheet ( io::RPStream Object ) : io::Stream(Object) { InitSheet(); } Sheet::~Sheet() { FreeMemory(); } void Sheet::InitSheet() { nStrands = 0; sheetID[0] = char(0); strand = NULL; } void Sheet::FreeMemory() { int i; if (strand) { for (i=0;iPDBASCIIDump ( S ); f.WriteLine ( S ); } } void Sheet::OrderSheet() { int i,k; PPStrand strand1; k = 0; for (i=0;iAddLoop ( CIFCAT_STRUCT_SHEET,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_SHEET_ID ); Loop->AddLoopTag ( CIFTAG_NUMBER_STRANDS ); } Loop->AddString ( sheetID ); Loop->AddInteger ( nStrands ); for (i=0;iMakeCIF ( CIF ); if (strand[i]->sense!=0) isSense = true; } if (nStrands>1) { if (isSense) { RC = CIF->AddLoop ( CIFCAT_STRUCT_SHEET_ORDER,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_SHEET_ID ); Loop->AddLoopTag ( CIFTAG_RANGE_ID_1 ); Loop->AddLoopTag ( CIFTAG_RANGE_ID_2 ); Loop->AddLoopTag ( CIFTAG_SENSE ); } for (i=1;iAddString ( sheetID ); Loop->AddInteger ( strand[i-1]->strandNo ); Loop->AddInteger ( strand[i] ->strandNo ); if (strand[i]->sense>0) Loop->AddString ( pstr("parallel") ); else Loop->AddString ( pstr("anti-parallel") ); } } RC = CIF->AddLoop ( CIFCAT_STRUCT_SHEET_HBOND,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_SHEET_ID ); Loop->AddLoopTag ( CIFTAG_RANGE_ID_1 ); Loop->AddLoopTag ( CIFTAG_RANGE_ID_2 ); Loop->AddLoopTag ( CIFTAG_RANGE_1_BEG_LABEL_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_BEG_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_BEG_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_RANGE_1_BEG_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_BEG_LABEL_INS_CODE ); Loop->AddLoopTag ( CIFTAG_RANGE_1_END_LABEL_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_END_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_END_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_RANGE_1_END_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_END_LABEL_INS_CODE ); } for (i=1;iAddString ( sheetID ); Loop->AddInteger ( strand[i-1]->strandNo ); Loop->AddInteger ( strand[i]->strandNo ); Loop->AddString ( strand[i]->curAtom ); Loop->AddString ( strand[i]->curResName ); Loop->AddString ( strand[i]->curChainID ); Loop->AddInteger ( strand[i]->curResSeq ); Loop->AddString ( strand[i]->curICode ,true ); Loop->AddString ( strand[i]->prevAtom ); Loop->AddString ( strand[i]->prevResName ); Loop->AddString ( strand[i]->prevChainID ); Loop->AddInteger ( strand[i]->prevResSeq ); Loop->AddString ( strand[i]->prevICode,true ); } } } ERROR_CODE Sheet::ConvertPDBASCII ( cpstr S ) { int i,k,ns; SheetID SID; PPStrand strand1; GetInteger ( k ,&(S[7]) ,3 ); strcpy_ncss ( SID,&(S[11]),3 ); GetInteger ( ns ,&(S[14]),2 ); // if (!SID[0]) return Error_NoSheetID; if (!sheetID[0]) strcpy ( sheetID,SID ); else if (strcmp(sheetID,SID)) return Error_WrongSheetID; if (k<=0) return Error_WrongStrandNo; ns = IMax(k,ns); if (!strand) { strand = new PStrand[ns]; for (i=0;inStrands) { strand1 = new PStrand[ns]; for (i=0;iConvertPDBASCII ( S ); } void Sheet::TryStrand ( int strand_no ) { int i,k; PPStrand strand1; k = -1; for (i=0;(istrandNo==strand_no) k = i; if (k<0) { strand1 = new PStrand[nStrands+1]; for (i=0;istrandNo = strand_no; nStrands++; } } void Sheet::CIFFindStrands ( mmcif::PData CIF, cpstr Category ) { // just look for all strands mentioned for the sheet mmcif::PLoop Loop; pstr F; int RC,i,l,sNo; Loop = CIF->GetLoop ( Category ); if (Loop) { l = Loop->GetLoopLength(); for (i=0;iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheetID)) { if (!Loop->GetInteger(sNo,CIFTAG_ID,i)) TryStrand ( sNo ); if (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_1,i)) TryStrand ( sNo ); if (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_2,i)) TryStrand ( sNo ); } } } } } int Sheet::GetStrand ( int strand_no ) { int i; for (i=0;istrandNo==strand_no) return i; } return -1; } int Sheet::GetCIF ( mmcif::PData CIF ) { mmcif::PLoop Loop; int i,ns,l,k,k2,RC,sNo; pstr F; ivector pair; bool Ok; pair = NULL; // First find all strands and create // the corresponding classes. The CIF fields // are not removed at this stage. CIFFindStrands ( CIF,CIFCAT_STRUCT_SHEET_ORDER ); CIFFindStrands ( CIF,CIFCAT_STRUCT_SHEET_RANGE ); CIFFindStrands ( CIF,CIFCAT_STRUCT_SHEET_HBOND ); // Check number of strands Loop = CIF->GetLoop ( CIFCAT_STRUCT_SHEET ); if (Loop) { l = Loop->GetLoopLength(); i = 0; while (iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheetID)) { RC = CIFGetInteger1 ( ns,Loop,CIFTAG_NUMBER_STRANDS,i ); if ((!RC) && (ns!=nStrands)) return Error_WrongNumberOfStrands; Loop->DeleteRow ( i ); i = l+100; // break loop } } i++; } } // Read each strand RC = 0; for (i=0;(iGetCIF ( CIF,sheetID ); if (RC) return RC; if (nStrands>1) { GetVectorMemory ( pair,nStrands,0 ); for (i=0;iGetLoop ( CIFCAT_STRUCT_SHEET_ORDER ); if (Loop) { Ok = true; l = Loop->GetLoopLength(); for (i=0;(iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheetID)) { if (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_1,i)) { k = GetStrand ( sNo ); if ((k>=0) && (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_2,i))) { pair[k] = GetStrand ( sNo ); if (pair[k]>=0) { F = Loop->GetString ( CIFTAG_SENSE,i,RC ); if (F && (!RC)) { if (!strcasecmp(F,"anti-parallel")) strand[pair[k]]->sense = -1; else if (!strcasecmp(F,"parallel")) strand[pair[k]]->sense = 1; } Loop->DeleteRow ( i ); } else Ok = false; } else Ok = false; } else Ok = false; } } } if (!Ok) { FreeVectorMemory ( pair,0 ); return Error_WrongSheetOrder; } } Loop = CIF->GetLoop ( CIFCAT_STRUCT_SHEET_HBOND ); if (Loop) { Ok = true; l = Loop->GetLoopLength(); for (i=0;(iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheetID)) { if (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_1,i)) { k = GetStrand ( sNo ); if ((k>=0) && (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_1,i))) { k2 = GetStrand ( sNo ); if (k2>=0) { if (pair[k]==k2) { CIFGetString ( strand[k2]->curAtom,Loop, CIFTAG_RANGE_1_BEG_LABEL_ATOM_ID, i,sizeof(strand[k2]->curAtom), pstr(" ") ); CIFGetString ( strand[k2]->curResName,Loop, CIFTAG_NDB_RANGE_1_BEG_LABEL_COMP_ID, i,sizeof(strand[k2]->curResName), pstr(" ") ); CIFGetString ( strand[k2]->curChainID,Loop, CIFTAG_NDB_RANGE_1_BEG_LABEL_ASYM_ID, i,sizeof(strand[k2]->curChainID), pstr(" ") ); if (CIFGetInteger(strand[k2]->curResSeq,Loop, CIFTAG_RANGE_1_BEG_LABEL_SEQ_ID,i)) { FreeVectorMemory ( pair,0 ); return i; } CIFGetString ( strand[k2]->curICode,Loop, CIFTAG_NDB_RANGE_1_BEG_LABEL_INS_CODE, i,sizeof(strand[k2]->curICode), pstr(" ") ); CIFGetString ( strand[k2]->prevAtom,Loop, CIFTAG_RANGE_1_END_LABEL_ATOM_ID, i,sizeof(strand[k2]->prevAtom), pstr(" ") ); CIFGetString ( strand[k2]->prevResName,Loop, CIFTAG_NDB_RANGE_1_END_LABEL_COMP_ID, i,sizeof(strand[k2]->prevResName), pstr(" ") ); CIFGetString ( strand[k2]->prevChainID,Loop, CIFTAG_NDB_RANGE_1_END_LABEL_ASYM_ID, i,sizeof(strand[k2]->prevChainID), pstr(" ") ); if (CIFGetInteger(strand[k2]->prevResSeq,Loop, CIFTAG_RANGE_1_END_LABEL_SEQ_ID,i)) { FreeVectorMemory ( pair,0 ); return i; } CIFGetString ( strand[k2]->prevICode,Loop, CIFTAG_NDB_RANGE_1_END_LABEL_INS_CODE, i,sizeof(strand[k2]->prevICode), pstr(" ") ); Loop->DeleteRow ( i ); } else Ok = false; } else Ok = false; } else Ok = false; } else Ok = false; } } } if (!Ok) { FreeVectorMemory ( pair,0 ); return Error_HBondInconsistency; } } } FreeVectorMemory ( pair,0 ); return 0; } void Sheet::Copy ( PSheet Sheet ) { int i; FreeMemory(); nStrands = Sheet->nStrands; if (nStrands>0) { strand = new PStrand[nStrands]; for (i=0;istrand[i]) { strand[i] = new Strand(); strand[i]->Copy ( Sheet->strand[i] ); } else strand[i] = NULL; } strcpy ( sheetID,Sheet->sheetID ); } void Sheet::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &nStrands ); for (i=0;i0) { strand = new PStrand[nStrands]; for (i=0;iPDBASCIIDump ( f ); } void Sheets::MakeCIF ( mmcif::PData CIF ) { int i; if (sheet) for (i=0;iMakeCIF ( CIF ); } ERROR_CODE Sheets::ConvertPDBASCII ( cpstr S ) { PPSheet sheet1; SheetID sheetID; int i,k; strcpy_ncss ( sheetID,&(S[11]),3 ); // if (!sheetID[0]) return Error_NoSheetID; k = -1; for (i=0;isheetID)) { k = i; break; } } if (k<0) { sheet1 = new PSheet[nSheets+1]; for (i=0;iConvertPDBASCII ( S ); } void Sheets::CIFFindSheets ( mmcif::PData CIF, cpstr Category ) { mmcif::PLoop Loop; int RC,i,j,k,l; pstr F; PPSheet sheet1; Loop = CIF->GetLoop ( Category ); if (Loop) { l = Loop->GetLoopLength(); for (i=0;iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { k = -1; j = 0; while ((jsheetID)) k = j; } j++; } if (k<0) { sheet1 = new PSheet[nSheets+1]; for (i=0;isheetID,F ); nSheets++; } } } } } int Sheets::GetCIF ( mmcif::PData CIF ) { int i,RC; FreeMemory(); // First find all sheet names and create // the corresponding classes. The CIF fields // are not removed at this stage. CIFFindSheets ( CIF,CIFCAT_STRUCT_SHEET ); CIFFindSheets ( CIF,CIFCAT_STRUCT_SHEET_ORDER ); CIFFindSheets ( CIF,CIFCAT_STRUCT_SHEET_RANGE ); CIFFindSheets ( CIF,CIFCAT_STRUCT_SHEET_HBOND ); // Read each sheet i = 0; RC = 0; while ((iGetCIF ( CIF ); i++; } return RC; } void Sheets::Copy ( PSheets Sheets ) { int i; FreeMemory(); if (Sheets->nSheets>0) { nSheets = Sheets->nSheets; sheet = new PSheet[nSheets]; for (i=0;isheet[i]) { sheet[i] = new Sheet(); sheet[i]->Copy ( Sheets->sheet[i] ); } else sheet[i] = NULL; } } void Sheets::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &nSheets ); for (i=0;i0) { sheet = new PSheet[nSheets]; for (i=0;iAddLoop ( CIFCAT_STRUCT_CONF,Loop ); if (RC!=mmcif::CIFRC_Ok) // the category was (re)created, provide tags AddStructConfTags ( Loop ); Loop->AddString ( pstr(TurnTypeID) ); Loop->AddInteger ( serNum ); Loop->AddString ( turnID ); Loop->AddString ( initResName ); Loop->AddString ( initChainID ); Loop->AddInteger ( initSeqNum ); Loop->AddString ( initICode,true ); Loop->AddString ( endResName ); Loop->AddString ( endChainID ); Loop->AddInteger ( endSeqNum ); Loop->AddString ( endICode ,true ); Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); Loop->AddString ( comment ); Loop->AddNoData ( mmcif::CIF_NODATA_QUESTION ); } ERROR_CODE Turn::ConvertPDBASCII ( cpstr S ) { char L[100]; GetInteger ( serNum ,&(S[7]) ,3 ); strcpy_ncss ( turnID ,&(S[11]),3 ); strcpy_ncss ( initResName,&(S[15]),3 ); strcpy_ncss ( initChainID,&(S[19]),1 ); GetIntIns ( initSeqNum,initICode,&(S[20]),4 ); strcpy_ncss ( endResName ,&(S[26]),3 ); strcpy_ncss ( endChainID ,&(S[30]),1 ); GetIntIns ( endSeqNum ,endICode ,&(S[31]),4 ); strcpy_ncss ( L ,&(S[40]),30 ); CreateCopy ( comment ,L ); return Error_NoError; } ERROR_CODE Turn::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; int RC,l; pstr F; bool Done; ERROR_CODE rc; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONF ); if (!Loop) { n = -1; // signal to finish processing of this structure return Error_EmptyCIF; } l = Loop->GetLoopLength(); Done = n>=l; while (!Done) { F = Loop->GetString ( CIFTAG_CONF_TYPE_ID,n,RC ); if ((!RC) && F) Done = (strcmp(F,TurnTypeID)==0); else Done = false; if (!Done) { n++; Done = n>=l; } } if (n>=l) { n = -1; // finish processing of Turn return Error_EmptyCIF; } Loop->DeleteField ( CIFTAG_CONF_TYPE_ID,n ); rc = CIFGetInteger ( serNum,Loop,CIFTAG_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( turnID,Loop,CIFTAG_PDB_ID,n, sizeof(turnID),pstr(" ") ); CIFGetString ( initResName,Loop,CIFTAG_BEG_LABEL_COMP_ID, n,sizeof(initResName),pstr(" ") ); CIFGetString ( initChainID,Loop,CIFTAG_BEG_LABEL_ASYM_ID, n,sizeof(initChainID),pstr(" ") ); CIFGetString ( initICode ,Loop,CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB, n,sizeof(initICode),pstr(" ") ); rc = CIFGetInteger ( initSeqNum,Loop,CIFTAG_BEG_LABEL_SEQ_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( endResName,Loop,CIFTAG_END_LABEL_COMP_ID, n,sizeof(endResName),pstr(" ") ); CIFGetString ( endChainID,Loop,CIFTAG_END_LABEL_ASYM_ID, n,sizeof(endChainID),pstr(" ") ); CIFGetString ( endICode ,Loop,CIFTAG_NDB_END_LABEL_INS_CODE_PDB, n,sizeof(endICode),pstr(" ") ); rc = CIFGetInteger ( endSeqNum,Loop,CIFTAG_END_LABEL_SEQ_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CreateCopy ( comment,Loop->GetString(CIFTAG_DETAILS,n,RC)); Loop->DeleteField ( CIFTAG_DETAILS,n ); n++; return Error_NoError; } void Turn::Copy ( PContainerClass Turn ) { serNum = PTurn(Turn)->serNum; initSeqNum = PTurn(Turn)->initSeqNum; endSeqNum = PTurn(Turn)->endSeqNum; strcpy ( turnID ,PTurn(Turn)->turnID ); strcpy ( initResName,PTurn(Turn)->initResName ); strcpy ( initChainID,PTurn(Turn)->initChainID ); strcpy ( initICode ,PTurn(Turn)->initICode ); strcpy ( endResName ,PTurn(Turn)->endResName ); strcpy ( endChainID ,PTurn(Turn)->endChainID ); strcpy ( endICode ,PTurn(Turn)->endICode ); CreateCopy ( comment,PTurn(Turn)->comment ); } void Turn::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); f.WriteInt ( &initSeqNum ); f.WriteInt ( &endSeqNum ); f.WriteTerLine ( turnID ,false ); f.WriteTerLine ( initResName,false ); f.WriteTerLine ( initChainID,false ); f.WriteTerLine ( initICode ,false ); f.WriteTerLine ( endResName ,false ); f.WriteTerLine ( endChainID ,false ); f.WriteTerLine ( endICode ,false ); f.CreateWrite ( comment ); } void Turn::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); f.ReadInt ( &initSeqNum ); f.ReadInt ( &endSeqNum ); f.ReadTerLine ( turnID ,false ); f.ReadTerLine ( initResName,false ); f.ReadTerLine ( initChainID,false ); f.ReadTerLine ( initICode ,false ); f.ReadTerLine ( endResName ,false ); f.ReadTerLine ( endChainID ,false ); f.ReadTerLine ( endICode ,false ); f.CreateRead ( comment ); } MakeStreamFunctions(Turn) // =================== LinkContainer ======================== PContainerClass LinkContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return ClassContainer::MakeContainerClass(ClassID); case ClassID_Link : return new Link(); } } MakeStreamFunctions(LinkContainer) // ======================== Link =========================== Link::Link() : ContainerClass() { InitLink(); } Link::Link ( cpstr S ) : ContainerClass() { InitLink(); ConvertPDBASCII ( S ); } Link::Link ( io::RPStream Object ) : ContainerClass(Object) { InitLink(); } Link::~Link() {} void Link::InitLink() { strcpy ( atName1 ,"----" ); // name of 1st linked atom strcpy ( aloc1 ," " ); // alternative location of 1st atom strcpy ( resName1,"---" ); // residue name of 1st linked atom strcpy ( chainID1," " ); // chain ID of 1st linked atom seqNum1 = 0; // sequence number of 1st linked atom strcpy ( insCode1," " ); // insertion code of 1st linked atom strcpy ( atName2 ,"----" ); // name of 2nd linked atom strcpy ( aloc2 ," " ); // alternative location of 2nd atom strcpy ( resName2,"---" ); // residue name of 2nd linked atom strcpy ( chainID2," " ); // chain ID of 2nd linked atom seqNum2 = 0; // sequence number of 2nd linked atom strcpy ( insCode2," " ); // insertion code of 2nd linked atom s1 = 1; // sym id of 1st atom i1 = 5; j1 = 5; k1 = 5; s2 = 1; // sym id of 2nd atom i2 = 5; j2 = 5; k2 = 5; dist = -1.0; // no distance } void Link::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB OBSLTE line number N // from the class' data strcpy ( S,"LINK" ); PadSpaces ( S,80 ); strcpy_n1 ( &(S[12]),atName1 ,4 ); strcpy_n1 ( &(S[16]),aloc1 ,1 ); strcpy_n1 ( &(S[17]),resName1,3 ); strcpy_n1 ( &(S[21]),chainID1,1 ); PutIntIns ( &(S[22]),seqNum1 ,4,insCode1 ); strcpy_n1 ( &(S[42]),atName2 ,4 ); strcpy_n1 ( &(S[46]),aloc2 ,1 ); strcpy_n1 ( &(S[47]),resName2,3 ); strcpy_n1 ( &(S[51]),chainID2,1 ); PutIntIns ( &(S[52]),seqNum2 ,4,insCode2 ); PutInteger ( &(S[59]),s1,3 ); PutInteger ( &(S[62]),i1,1 ); PutInteger ( &(S[63]),j1,1 ); PutInteger ( &(S[64]),k1,1 ); PutInteger ( &(S[66]),s2,3 ); PutInteger ( &(S[69]),i2,1 ); PutInteger ( &(S[70]),j2,1 ); PutInteger ( &(S[71]),k2,1 ); if (dist>0.0) PutRealF ( &(S[73]),dist,5,3 ); } #define LinkTypeID "LINK" void AddStructConnTags ( mmcif::PLoop Loop ) { Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_CONN_TYPE_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_COMP_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_COMP_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_SYMMETRY ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_SYMMETRY ); Loop->AddLoopTag ( CIFTAG_CONN_DIST ); } void Link::MakeCIF ( mmcif::PData CIF, int N ) { UNUSED_ARGUMENT(N); mmcif::PLoop Loop; char S[100]; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_CONN,Loop ); if (RC!=mmcif::CIFRC_Ok) // the category was (re)created, provide tags AddStructConnTags ( Loop ); Loop->AddString ( "1" ); // should be a counter Loop->AddString ( pstr(LinkTypeID) ); Loop->AddString ( atName1 ); Loop->AddString ( aloc1 ); Loop->AddString ( resName1 ); Loop->AddString ( chainID1 ); Loop->AddInteger ( seqNum1 ); Loop->AddString ( insCode1 ); Loop->AddString ( atName2 ); Loop->AddString ( aloc2 ); Loop->AddString ( resName2 ); Loop->AddString ( chainID2 ); Loop->AddInteger ( seqNum2 ); Loop->AddString ( insCode2 ); sprintf ( S,"%i%i%i%i",s1,i1,j1,k1 ); Loop->AddString ( S ); sprintf ( S,"%i%i%i%i",s2,i2,j2,k2 ); Loop->AddString ( S ); Loop->AddReal ( dist ); } ERROR_CODE Link::ConvertPDBASCII ( cpstr S ) { GetString ( atName1 ,&(S[12]),4 ); strcpy_ncss ( aloc1 ,&(S[16]),1 ); strcpy_ncss ( resName1,&(S[17]),3 ); strcpy_ncss ( chainID1,&(S[21]),1 ); GetIntIns ( seqNum1,insCode1,&(S[22]),4 ); GetString ( atName2 ,&(S[42]),4 ); strcpy_ncss ( aloc2 ,&(S[46]),1 ); strcpy_ncss ( resName2,&(S[47]),3 ); strcpy_ncss ( chainID2,&(S[51]),1 ); GetIntIns ( seqNum2,insCode2,&(S[52]),4 ); GetInteger ( s1,&(S[59]),3 ); GetInteger ( i1,&(S[62]),1 ); GetInteger ( j1,&(S[63]),1 ); GetInteger ( k1,&(S[64]),1 ); GetInteger ( s2,&(S[66]),3 ); GetInteger ( i2,&(S[69]),1 ); GetInteger ( j2,&(S[70]),1 ); GetInteger ( k2,&(S[71]),1 ); if (!GetReal(dist,&(S[73]),5)) dist = -1.0; return Error_NoError; } ERROR_CODE Link::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; pstr F; char S[100]; int RC,l; bool Done; ERROR_CODE rc; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONN ); if (!Loop) { n = -1; // signal to finish processing of this structure return Error_EmptyCIF; } l = Loop->GetLoopLength(); Done = (n>=l); while (!Done) { F = Loop->GetString ( CIFTAG_CONN_TYPE_ID,n,RC ); if ((!RC) && F) Done = (strcmp(F,LinkTypeID)==0); else Done = false; if (!Done) { n++; Done = (n>=l); } } if (n>=l) { n = -1; // finish processing of Turn return Error_EmptyCIF; } Loop->DeleteField ( CIFTAG_CONN_TYPE_ID,n ); // CIFGetInteger ( l,Loop,CIFTAG_ID,n ); CIFGetString ( atName1,Loop,CIFTAG_CONN_PTNR1_AUTH_ATOM_ID,n, sizeof(atName1),pstr(" ") ); CIFGetString ( aloc1,Loop,CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID,n, sizeof(aloc1),pstr(" ") ); CIFGetString ( resName1,Loop,CIFTAG_CONN_PTNR1_AUTH_COMP_ID,n, sizeof(resName1),pstr(" ") ); CIFGetString ( chainID1,Loop,CIFTAG_CONN_PTNR1_AUTH_ASYM_ID,n, sizeof(chainID1),pstr(" ") ); rc = CIFGetInteger ( seqNum1,Loop,CIFTAG_CONN_PTNR1_AUTH_SEQ_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( insCode1,Loop,CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE, n,sizeof(insCode1),pstr(" ") ); CIFGetString ( atName2,Loop,CIFTAG_CONN_PTNR2_AUTH_ATOM_ID,n, sizeof(atName2),pstr(" ") ); CIFGetString ( aloc2,Loop,CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID,n, sizeof(aloc2),pstr(" ") ); CIFGetString ( resName2,Loop,CIFTAG_CONN_PTNR2_AUTH_COMP_ID,n, sizeof(resName2),pstr(" ") ); CIFGetString ( chainID2,Loop,CIFTAG_CONN_PTNR2_AUTH_ASYM_ID,n, sizeof(chainID2),pstr(" ") ); rc = CIFGetInteger ( seqNum2,Loop,CIFTAG_CONN_PTNR2_AUTH_SEQ_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( insCode2,Loop,CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE, n,sizeof(insCode2),pstr(" ") ); CIFGetString ( S,Loop,CIFTAG_CONN_PTNR1_SYMMETRY,n, sizeof(S),pstr("") ); if (S[0]) { l = strlen(S)-1; k1 = int(S[l--]) - int('0'); j1 = int(S[l--]) - int('0'); i1 = int(S[l--]) - int('0'); S[l] = char(0); s1 = atoi(S); } CIFGetString ( S,Loop,CIFTAG_CONN_PTNR2_SYMMETRY,n, sizeof(S),pstr("") ); if (S[0]) { l = strlen(S)-1; k2 = int(S[l--]) - int('0'); j2 = int(S[l--]) - int('0'); i2 = int(S[l--]) - int('0'); S[l] = char(0); s2 = atoi(S); } rc = CIFGetReal ( dist,Loop,CIFTAG_CONN_DIST,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; n++; return Error_NoError; } void Link::Copy ( PContainerClass Link ) { strcpy ( atName1 ,PLink(Link)->atName1 ); strcpy ( aloc1 ,PLink(Link)->aloc1 ); strcpy ( resName1,PLink(Link)->resName1 ); strcpy ( chainID1,PLink(Link)->chainID1 ); seqNum1 = PLink(Link)->seqNum1; strcpy ( insCode1,PLink(Link)->insCode1 ); strcpy ( atName2 ,PLink(Link)->atName2 ); strcpy ( aloc2 ,PLink(Link)->aloc2 ); strcpy ( resName2,PLink(Link)->resName2 ); strcpy ( chainID2,PLink(Link)->chainID2 ); seqNum2 = PLink(Link)->seqNum2; strcpy ( insCode2,PLink(Link)->insCode2 ); s1 = PLink(Link)->s1; i1 = PLink(Link)->i1; j1 = PLink(Link)->j1; k1 = PLink(Link)->k1; s2 = PLink(Link)->s2; i2 = PLink(Link)->i2; j2 = PLink(Link)->j2; k2 = PLink(Link)->k2; dist = PLink(Link)->dist; } void Link::write ( io::RFile f ) { byte Version=2; f.WriteByte ( &Version ); f.WriteTerLine ( atName1 ,false ); f.WriteTerLine ( aloc1 ,false ); f.WriteTerLine ( resName1,false ); f.WriteTerLine ( chainID1,false ); f.WriteInt ( &seqNum1 ); f.WriteTerLine ( insCode1,false ); f.WriteTerLine ( atName2 ,false ); f.WriteTerLine ( aloc2 ,false ); f.WriteTerLine ( resName2,false ); f.WriteTerLine ( chainID2,false ); f.WriteInt ( &seqNum2 ); f.WriteTerLine ( insCode2,false ); f.WriteInt ( &s1 ); f.WriteInt ( &i1 ); f.WriteInt ( &j1 ); f.WriteInt ( &k1 ); f.WriteInt ( &s2 ); f.WriteInt ( &i2 ); f.WriteInt ( &j2 ); f.WriteInt ( &k2 ); f.WriteReal ( &dist ); } void Link::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( atName1 ,false ); f.ReadTerLine ( aloc1 ,false ); f.ReadTerLine ( resName1,false ); f.ReadTerLine ( chainID1,false ); f.ReadInt ( &seqNum1 ); f.ReadTerLine ( insCode1,false ); f.ReadTerLine ( atName2 ,false ); f.ReadTerLine ( aloc2 ,false ); f.ReadTerLine ( resName2,false ); f.ReadTerLine ( chainID2,false ); f.ReadInt ( &seqNum2 ); f.ReadTerLine ( insCode2,false ); f.ReadInt ( &s1 ); f.ReadInt ( &i1 ); f.ReadInt ( &j1 ); f.ReadInt ( &k1 ); f.ReadInt ( &s2 ); f.ReadInt ( &i2 ); f.ReadInt ( &j2 ); f.ReadInt ( &k2 ); if (Version>1) f.ReadReal ( &dist ); } MakeStreamFunctions(Link) // =================== LinkRContainer ======================= PContainerClass LinkRContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return ClassContainer::MakeContainerClass(ClassID); case ClassID_LinkR : return new LinkR(); } } MakeStreamFunctions(LinkRContainer) // ======================== LinkR =========================== LinkR::LinkR() : ContainerClass() { InitLinkR(); } LinkR::LinkR ( cpstr S ) : ContainerClass() { InitLinkR(); ConvertPDBASCII ( S ); } LinkR::LinkR ( io::RPStream Object ) : ContainerClass(Object) { InitLinkR(); } LinkR::~LinkR() {} void LinkR::InitLinkR() { strcpy ( linkRID ,"----" ); // link name strcpy ( atName1 ,"----" ); // name of 1st linked atom strcpy ( aloc1 ," " ); // alternative location of 1st atom strcpy ( resName1,"---" ); // residue name of 1st linked atom strcpy ( chainID1," " ); // chain ID of 1st linked atom seqNum1 = 0; // sequence number of 1st linked atom strcpy ( insCode1," " ); // insertion code of 1st linked atom strcpy ( atName2 ,"----" ); // name of 2nd linked atom strcpy ( aloc2 ," " ); // alternative location of 2nd atom strcpy ( resName2,"---" ); // residue name of 2nd linked atom strcpy ( chainID2," " ); // chain ID of 2nd linked atom seqNum2 = 0; // sequence number of 2nd linked atom strcpy ( insCode2," " ); // insertion code of 2nd linked atom dist = 0.0; // link distance } /* LINK LYS A 27 PLP A 255 PLPLYS LINK MAN S 3 MAN S 4 BETA1-4 LINK C6 BBEN B 1 O1 BMAF S 2 BEN-MAF LINK OE2 AGLU A 320 C1 AMAF S 2 GLU-MAF LINK OE2 GLU A 67 1.895 ZN ZN R 5 GLU-ZN LINK NE2 HIS A 71 2.055 ZN ZN R 5 HIS-ZN LINK O ARG A 69 2.240 NA NA R 9 ARG-NA 012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 */ void LinkR::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB OBSLTE line number N // from the class' data strcpy ( S,"LINKR" ); PadSpaces ( S,80 ); strcpy_n1 ( &(S[12]),atName1 ,4 ); strcpy_n1 ( &(S[16]),aloc1 ,1 ); strcpy_n1 ( &(S[17]),resName1,3 ); strcpy_n1 ( &(S[21]),chainID1,1 ); PutIntIns ( &(S[22]),seqNum1 ,4,insCode1 ); if (dist>0.0) PutRealF ( &(S[32]),dist,7,3 ); strcpy_n1 ( &(S[42]),atName2 ,4 ); strcpy_n1 ( &(S[46]),aloc2 ,1 ); strcpy_n1 ( &(S[47]),resName2,3 ); strcpy_n1 ( &(S[51]),chainID2,1 ); PutIntIns ( &(S[52]),seqNum2 ,4,insCode2 ); strcpy_ns ( &(S[72]),linkRID,8 ); } #define LinkRTypeID "LINKR" void AddStructConnLinkRTags ( mmcif::PLoop Loop ) { Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_CONN_TYPE_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_COMP_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_CONN_DIST ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_COMP_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_CONN_NAME ); } void LinkR::MakeCIF ( mmcif::PData CIF, int N ) { UNUSED_ARGUMENT(N); mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_LINKR,Loop ); if (RC!=mmcif::CIFRC_Ok) // the category was (re)created, provide tags AddStructConnLinkRTags ( Loop ); Loop->AddString ( "1" ); // should be a counter Loop->AddString ( pstr(LinkTypeID) ); Loop->AddString ( atName1 ); Loop->AddString ( aloc1 ); Loop->AddString ( resName1 ); Loop->AddString ( chainID1 ); Loop->AddInteger ( seqNum1 ); Loop->AddString ( insCode1 ); Loop->AddReal ( dist ); Loop->AddString ( atName2 ); Loop->AddString ( aloc2 ); Loop->AddString ( resName2 ); Loop->AddString ( chainID2 ); Loop->AddInteger ( seqNum2 ); Loop->AddString ( insCode2 ); Loop->AddString ( linkRID ); } ERROR_CODE LinkR::ConvertPDBASCII ( cpstr S ) { GetString ( atName1 ,&(S[12]),4 ); strcpy_ncss ( aloc1 ,&(S[16]),1 ); strcpy_ncss ( resName1,&(S[17]),3 ); strcpy_ncss ( chainID1,&(S[21]),1 ); GetIntIns ( seqNum1,insCode1,&(S[22]),4 ); if (!GetReal(dist,&(S[32]),7)) dist = 0.0; GetString ( atName2 ,&(S[42]),4 ); strcpy_ncss ( aloc2 ,&(S[46]),1 ); strcpy_ncss ( resName2,&(S[47]),3 ); strcpy_ncss ( chainID2,&(S[51]),1 ); GetIntIns ( seqNum2,insCode2,&(S[52]),4 ); strcpy_ncss ( linkRID,&(S[72]),8 ); return Error_NoError ; } ERROR_CODE LinkR::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; pstr F; int RC,l; bool Done; ERROR_CODE rc; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONN ); if (!Loop) { n = -1; // signal to finish processing of this structure return Error_EmptyCIF; } l = Loop->GetLoopLength(); Done = (n>=l); while (!Done) { F = Loop->GetString ( CIFTAG_CONN_TYPE_ID,n,RC ); if ((!RC) && F) Done = (strcmp(F,LinkTypeID)==0); else Done = false; if (!Done) { n++; Done = (n>=l); } } if (n>=l) { n = -1; // finish processing of Turn return Error_EmptyCIF; } Loop->DeleteField ( CIFTAG_CONN_TYPE_ID,n ); // CIFGetInteger ( l,Loop,CIFTAG_ID,n ); CIFGetString ( atName1,Loop,CIFTAG_CONN_PTNR1_AUTH_ATOM_ID,n, sizeof(atName1),pstr(" ") ); CIFGetString ( aloc1,Loop,CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID,n, sizeof(aloc1),pstr(" ") ); CIFGetString ( resName1,Loop,CIFTAG_CONN_PTNR1_AUTH_COMP_ID,n, sizeof(resName1),pstr(" ") ); CIFGetString ( chainID1,Loop,CIFTAG_CONN_PTNR1_AUTH_ASYM_ID,n, sizeof(chainID1),pstr(" ") ); rc = CIFGetInteger ( seqNum1,Loop,CIFTAG_CONN_PTNR1_AUTH_SEQ_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( insCode1,Loop,CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE, n,sizeof(insCode1),pstr(" ") ); rc = CIFGetReal ( dist,Loop,CIFTAG_CONN_DIST,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( atName2,Loop,CIFTAG_CONN_PTNR2_AUTH_ATOM_ID,n, sizeof(atName2),pstr(" ") ); CIFGetString ( aloc2,Loop,CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID,n, sizeof(aloc2),pstr(" ") ); CIFGetString ( resName2,Loop,CIFTAG_CONN_PTNR2_AUTH_COMP_ID,n, sizeof(resName2),pstr(" ") ); CIFGetString ( chainID2,Loop,CIFTAG_CONN_PTNR2_AUTH_ASYM_ID,n, sizeof(chainID2),pstr(" ") ); rc = CIFGetInteger ( seqNum2,Loop,CIFTAG_CONN_PTNR2_AUTH_SEQ_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( insCode2,Loop,CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE, n,sizeof(insCode2),pstr(" ") ); CIFGetString ( linkRID,Loop,CIFTAG_CONN_NAME,n, sizeof(linkRID),pstr(" ") ); n++; return Error_NoError; } void LinkR::Copy ( PContainerClass LinkR ) { strcpy ( atName1 ,PLinkR(LinkR)->atName1 ); strcpy ( aloc1 ,PLinkR(LinkR)->aloc1 ); strcpy ( resName1,PLinkR(LinkR)->resName1 ); strcpy ( chainID1,PLinkR(LinkR)->chainID1 ); seqNum1 = PLinkR(LinkR)->seqNum1; strcpy ( insCode1,PLinkR(LinkR)->insCode1 ); dist = PLinkR(LinkR)->dist; strcpy ( atName2 ,PLinkR(LinkR)->atName2 ); strcpy ( aloc2 ,PLinkR(LinkR)->aloc2 ); strcpy ( resName2,PLinkR(LinkR)->resName2 ); strcpy ( chainID2,PLinkR(LinkR)->chainID2 ); seqNum2 = PLinkR(LinkR)->seqNum2; strcpy ( insCode2,PLinkR(LinkR)->insCode2 ); strcpy ( linkRID,PLinkR(LinkR)->linkRID ); } void LinkR::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( atName1 ,false ); f.WriteTerLine ( aloc1 ,false ); f.WriteTerLine ( resName1,false ); f.WriteTerLine ( chainID1,false ); f.WriteInt ( &seqNum1 ); f.WriteTerLine ( insCode1,false ); f.WriteReal ( &dist ); f.WriteTerLine ( atName2 ,false ); f.WriteTerLine ( aloc2 ,false ); f.WriteTerLine ( resName2,false ); f.WriteTerLine ( chainID2,false ); f.WriteInt ( &seqNum2 ); f.WriteTerLine ( insCode2,false ); f.WriteTerLine ( linkRID,false ); } void LinkR::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( atName1 ,false ); f.ReadTerLine ( aloc1 ,false ); f.ReadTerLine ( resName1,false ); f.ReadTerLine ( chainID1,false ); f.ReadInt ( &seqNum1 ); f.ReadTerLine ( insCode1,false ); f.ReadReal ( &dist ); f.ReadTerLine ( atName2 ,false ); f.ReadTerLine ( aloc2 ,false ); f.ReadTerLine ( resName2,false ); f.ReadTerLine ( chainID2,false ); f.ReadInt ( &seqNum2 ); f.ReadTerLine ( insCode2,false ); f.ReadTerLine ( linkRID,false ); } MakeStreamFunctions(LinkR) // =================== CisPepContainer ====================== PContainerClass CisPepContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return ClassContainer::MakeContainerClass(ClassID); case ClassID_CisPep : return new CisPep(); } } MakeStreamFunctions(CisPepContainer) // ======================== CisPep ========================== CisPep::CisPep() : ContainerClass() { InitCisPep(); } CisPep::CisPep ( cpstr S ) : ContainerClass() { InitCisPep(); ConvertPDBASCII ( S ); } CisPep::CisPep ( io::RPStream Object ) : ContainerClass(Object) { InitCisPep(); } CisPep::~CisPep() {} void CisPep::InitCisPep() { serNum = 1; // record serial number strcpy ( pep1 ,"---" ); // residue name strcpy ( chainID1," " ); // chain identifier 1 seqNum1 = 0; // residue sequence number 1 strcpy ( icode1 ," " ); // insertion code 1 strcpy ( pep2 ,"---" ); // residue name 2 strcpy ( chainID2," " ); // chain identifier 2 seqNum2 = 0; // residue sequence number 2 strcpy ( icode2 ," " ); // insertion code 2 modNum = 0; // model number measure = 0.0; // measure of the angle in degrees. } void CisPep::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); strcpy ( S,"CISPEP" ); PadSpaces ( S,80 ); PutInteger ( &(S[7]),serNum,3 ); strcpy_n1 ( &(S[11]),pep1 ,3 ); strcpy_n1 ( &(S[15]),chainID1,1 ); PutIntIns ( &(S[17]),seqNum1 ,4,icode1 ); strcpy_n1 ( &(S[25]),pep2 ,3 ); strcpy_n1 ( &(S[29]),chainID2,1 ); PutIntIns ( &(S[31]),seqNum2 ,4,icode1 ); PutInteger ( &(S[43]),modNum,3 ); PutRealF ( &(S[53]),measure,6,2 ); } ERROR_CODE CisPep::ConvertPDBASCII ( cpstr S ) { GetInteger ( serNum ,&(S[7]) ,3 ); strcpy_ncss ( pep1 ,&(S[11]),3 ); strcpy_ncss ( chainID1,&(S[15]),1 ); GetIntIns ( seqNum1,icode1,&(S[17]),4 ); strcpy_ncss ( pep2 ,&(S[25]),3 ); strcpy_ncss ( chainID2,&(S[29]),1 ); GetIntIns ( seqNum2,icode2,&(S[31]),4 ); GetInteger ( modNum ,&(S[43]),3 ); GetReal ( measure ,&(S[53]),6 ); return Error_NoError; } void CisPep::Copy ( PContainerClass CisPep ) { serNum = PCisPep(CisPep)->serNum; strcpy ( pep1 ,PCisPep(CisPep)->pep1 ); strcpy ( chainID1,PCisPep(CisPep)->chainID1 ); seqNum1 = PCisPep(CisPep)->seqNum1; strcpy ( icode1 ,PCisPep(CisPep)->icode1 ); strcpy ( pep2 ,PCisPep(CisPep)->pep2 ); strcpy ( chainID2,PCisPep(CisPep)->chainID2 ); seqNum2 = PCisPep(CisPep)->seqNum2; strcpy ( icode2 ,PCisPep(CisPep)->icode2 ); modNum = PCisPep(CisPep)->modNum; measure = PCisPep(CisPep)->measure; } void CisPep::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); f.WriteTerLine ( pep1 ,false ); f.WriteTerLine ( chainID1,false ); f.WriteInt ( &seqNum1 ); f.WriteTerLine ( icode1 ,false ); f.WriteTerLine ( pep2 ,false ); f.WriteTerLine ( chainID2,false ); f.WriteInt ( &seqNum2 ); f.WriteTerLine ( icode2 ,false ); f.WriteInt ( &modNum ); f.WriteReal ( &measure ); } void CisPep::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); f.ReadTerLine ( pep1 ,false ); f.ReadTerLine ( chainID1,false ); f.ReadInt ( &seqNum1 ); f.ReadTerLine ( icode1 ,false ); f.ReadTerLine ( pep2 ,false ); f.ReadTerLine ( chainID2,false ); f.ReadInt ( &seqNum2 ); f.ReadTerLine ( icode2 ,false ); f.ReadInt ( &modNum ); f.ReadReal ( &measure ); } MakeStreamFunctions(CisPep) // ===================== Model ======================= Model::Model() : ProModel() { InitModel(); } Model::Model ( PManager MMDBM, int serialNum ) : ProModel() { InitModel(); manager = MMDBM; serNum = serialNum; } Model::Model ( io::RPStream Object ) : ProModel(Object) { InitModel(); } void Model::InitModel() { serNum = 0; nChains = 0; nChainsAlloc = 0; chain = NULL; manager = NULL; Exclude = true; } Model::~Model() { FreeMemory(); if (manager) manager->_ExcludeModel ( serNum ); } void Model::FreeMemory() { DeleteAllChains(); if (chain) delete[] chain; chain = NULL; nChains = 0; nChainsAlloc = 0; RemoveSecStructure(); RemoveHetInfo (); RemoveLinks (); RemoveLinkRs (); RemoveCisPeps (); } void Model::SetMMDBManager ( PManager MMDBM, int serialNum ) { manager = MMDBM; serNum = serialNum; } void Model::CheckInAtoms() { int i; if (manager) for (i=0;iCheckInAtoms(); } int Model::GetNumberOfAtoms ( bool countTers ) { // returns number of atoms in the model int i,na; na = 0; for (i=0;iGetNumberOfAtoms ( countTers ); return na; } int Model::GetNumberOfResidues() { // returns number of residues in the model PChain chn; int ic,ir,nr; nr = 0; for (ic=0;icnResidues;ir++) if (chn->residue[ir]) nr++; } return nr; } // ---------------- Extracting chains -------------------------- int Model::GetNumberOfChains() { return nChains; } PChain Model::GetChain ( int chainNo ) { if ((0<=chainNo) && (chainNo=nChainsAlloc) { nChainsAlloc = nOfChains+10; chain1 = new PChain[nChainsAlloc]; for (i=0;ichainID[0]) { chn = chain[i]; if (chn->GetNumberOfResidues()>0) k++; } } if (k) sprintf ( chainID,"%s%i",chID,k-1 ); else if (!chn) strcpy ( chainID,chID ); // chain is absent else return chn; // the only empty chain } else { if (chID[0]) { for (i=0;(ichainID)) chn = chain[i]; // it is there; just return the pointer } } else { for (i=0;(ichainID[0]) chn = chain[i]; // it is there; just return the pointer } } if (chn) return chn; strcpy ( chainID,chID ); } ExpandChainArray ( nChains ); // create new chain chain[nChains] = newChain(); chain[nChains]->SetChain ( chainID ); chain[nChains]->SetModel ( this ); nChains++; return chain[nChains-1]; } PChain Model::CreateChain ( const ChainID chID ) { // CreateChain() creates a new chain with chain ID regardless // the presence of same-ID chains in the model. This function // was introduced only for compatibility with older CCP4 // applications and using it in any new developments should be // strictly discouraged. ExpandChainArray ( nChains ); // create new chain chain[nChains] = newChain(); chain[nChains]->SetChain ( chID ); chain[nChains]->SetModel ( this ); nChains++; return chain[nChains-1]; } void Model::GetChainTable ( PPChain & chainTable, int & NumberOfChains ) { chainTable = chain; NumberOfChains = nChains; } bool Model::GetNewChainID ( ChainID chID, int length ) { int i,k; bool found; memset ( chID,0,sizeof(ChainID) ); chID[0] = 'A'; do { found = false; for (i=0;(ichainID)); if (found) { k = 0; while (kchainID)) return chain[i]; // it is there; just return the pointer } } else { for (i=0;ichainID[0]) return chain[i]; // it is there; just return the pointer } } return NULL; } // ------------------ Deleting chains -------------------------- int Model::DeleteChain ( int chainNo ) { if ((0<=chainNo) && (chainNochainID)) { Exclude = false; delete chain[i]; chain[i] = NULL; Exclude = true; return 1; } } } else { for (i=0;ichainID[0]) { Exclude = false; delete chain[i]; chain[i] = NULL; Exclude = true; return 1; } } } return 0; } int Model::DeleteAllChains() { int i,k; Exclude = false; k = 0; for (i=0;iisSolventChain()) { delete chain[i]; chain[i] = NULL; k++; } } Exclude = true; return k; } void Model::TrimChainTable() { int i,j; Exclude = false; j = 0; for (i=0;inResidues>0) { if (jnResidues; return 0; } int Model::GetNumberOfResidues ( int chainNo ) { if ((0<=chainNo) && (chainNonResidues; } return 0; } PResidue Model::GetResidue ( const ChainID chainID, int seqNo, const InsCode insCode ) { PChain chn; chn = GetChain ( chainID ); if (chn) return chn->GetResidue ( seqNo,insCode ); return NULL; } PResidue Model::GetResidue ( const ChainID chainID, int resNo ) { PChain chn; chn = GetChain ( chainID ); if (chn) { if ((0<=resNo) && (resNonResidues)) return chn->residue[resNo]; } return NULL; } PResidue Model::GetResidue ( int chainNo, int seqNo, const InsCode insCode ) { if ((0<=chainNo) && (chainNoGetResidue ( seqNo,insCode ); } return NULL; } PResidue Model::GetResidue ( int chainNo, int resNo ) { if ((0<=chainNo) && (chainNonResidues)) return chain[chainNo]->residue[resNo]; } } return NULL; } int Model::GetResidueNo ( const ChainID chainID, int seqNo, const InsCode insCode ) { PChain chn; chn = GetChain ( chainID ); if (chn) return chn->GetResidueNo ( seqNo,insCode ); return -2; } int Model::GetResidueNo ( int chainNo, int seqNo, const InsCode insCode ) { if ((0<=chainNo) && (chainNoGetResidueNo ( seqNo,insCode ); } return -2; } void Model::GetResidueTable ( PPResidue & resTable, int & NumberOfResidues ) { // resTable has to be NULL or it will be reallocated. The application // is responsible for deallocating the resTable (but not of its // residues!). This does not apply to other GetResidueTable // functions. PPChain chn; PPResidue res; int i,j,k,nChns,nResidues; if (resTable) { delete[] resTable; resTable = NULL; } NumberOfResidues = 0; GetChainTable ( chn,nChns ); for (i=0;iGetResidueTable ( res,nResidues ); NumberOfResidues += nResidues; } if (NumberOfResidues>0) { resTable = new PResidue[NumberOfResidues]; k = 0; GetChainTable ( chn,nChns ); for (i=0;iGetResidueTable ( res,nResidues ); for (j=0;jresidue; NumberOfResidues = chn->nResidues; } } void Model::GetResidueTable ( int chainNo, PPResidue & resTable, int & NumberOfResidues ) { resTable = NULL; NumberOfResidues = 0; if ((0<=chainNo) && (chainNoresidue; NumberOfResidues = chain[chainNo]->nResidues; } } } int Model::DeleteResidue ( const ChainID chainID, int seqNo, const InsCode insCode ) { PChain chn; chn = GetChain ( chainID ); if (chn) return chn->DeleteResidue ( seqNo,insCode ); return 0; } int Model::DeleteResidue ( const ChainID chainID, int resNo ) { PChain chn; chn = GetChain ( chainID ); if (chn) return chn->DeleteResidue ( resNo ); return 0; } int Model::DeleteResidue ( int chainNo, int seqNo, const InsCode insCode ) { if ((0<=chainNo) && (chainNoDeleteResidue ( seqNo,insCode ); } return 0; } int Model::DeleteResidue ( int chainNo, int resNo ) { if ((0<=chainNo) && (chainNoDeleteResidue ( resNo ); } return 0; } int Model::DeleteAllResidues ( const ChainID chainID ) { PChain chn; chn = GetChain ( chainID ); if (chn) return chn->DeleteAllResidues(); return 0; } int Model::DeleteAllResidues ( int chainNo ) { if ((0<=chainNo) && (chainNoDeleteAllResidues(); } return 0; } int Model::DeleteAllResidues() { int i,k; k = 0; for (i=0;iDeleteAllResidues(); return k; } int Model::DeleteSolvent() { int i,k; Exclude = false; k = 0; for (i=0;iDeleteSolvent(); chain[i]->TrimResidueTable(); if (chain[i]->nResidues<=0) { delete chain[i]; chain[i] = NULL; } } Exclude = true; return k; } int Model::AddResidue ( const ChainID chainID, PResidue res ) { PChain chn; chn = GetChain ( chainID ); if (chn) return chn->AddResidue ( res ); return 0; } int Model::AddResidue ( int chainNo, PResidue res ) { if ((0<=chainNo) && (chainNoAddResidue ( res ); } return 0; } int Model::_ExcludeChain ( const ChainID chainID ) { // _ExcludeChain(..) excludes (but does not dispose!) a chain // from the model. Returns 1 if the model gets empty and 0 otherwise. int i,k; if (!Exclude) return 0; // find the chain k = -1; for (i=0;(ichainID)) k = i; if (k>=0) { for (i=k+1;iGetChainID(), (PPChain(data))[j]->GetChainID() ); if (diff>0) diff = 1; if (diff<0) diff = -1; if (sKey==SORT_CHAIN_ChainID_Desc) return -diff; return diff; } void QSortChains::Swap ( int i, int j ) { PChain chn; chn = ((PPChain)data)[i]; ((PPChain)data)[i] = ((PPChain)data)[j]; ((PPChain)data)[j] = chn; } void QSortChains::Sort ( PPChain chain, int nChains, int sortKey ) { sKey = sortKey; QuickSort::Sort ( &(chain[0]),nChains ); } void Model::SortChains ( int sortKey ) { QSortChains SC; TrimChainTable(); SC.Sort ( chain,nChains,sortKey ); } // -------------------- Extracting atoms ----------------------- int Model::GetNumberOfAtoms ( const ChainID chainID, int seqNo, const InsCode insCode ) { PChain chn; PResidue res; chn = GetChain ( chainID ); if (chn) { res = chn->GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; } return 0; } int Model::GetNumberOfAtoms ( int chainNo, int seqNo, const InsCode insCode ) { PChain chn; PResidue res; chn = GetChain ( chainNo ); if (chn) { res = chn->GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; } return 0; } int Model::GetNumberOfAtoms ( const ChainID chainID, int resNo ) { PChain chn; PResidue res; chn = GetChain ( chainID ); if (chn) { if ((0<=resNo) && (resNonResidues)) { res = chn->residue[resNo]; if (res) return res->nAtoms; } } return 0; } int Model::GetNumberOfAtoms ( int chainNo, int resNo ) { PChain chn; PResidue res; if ((0<=chainNo) && (chainNonResidues)) { res = chn->residue[resNo]; if (res) return res->nAtoms; } } } return 0; } PAtom Model::GetAtom ( const ChainID chID, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PChain chn; PResidue res; chn = GetChain ( chID ); if (chn) { res = chn->GetResidue ( seqNo,insCode ); if (res) return res->GetAtom ( aname,elmnt,aloc ); } return NULL; } PAtom Model::GetAtom ( const ChainID chID, int seqNo, const InsCode insCode, int atomNo ) { PChain chn; PResidue res; chn = GetChain ( chID ); if (chn) { res = chn->GetResidue ( seqNo,insCode ); if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } } return NULL; } PAtom Model::GetAtom ( const ChainID chID, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PChain chn; PResidue res; chn = GetChain ( chID ); if (chn) { if ((0<=resNo) && (resNonResidues)) { res = chn->residue[resNo]; if (res) return res->GetAtom ( aname,elmnt,aloc ); } } return NULL; } PAtom Model::GetAtom ( const ChainID chID, int resNo, int atomNo ) { PChain chn; PResidue res; chn = GetChain ( chID ); if (chn) { if ((0<=resNo) && (resNonResidues)) { res = chn->residue[resNo]; if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } } } return NULL; } PAtom Model::GetAtom ( int chNo, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PResidue res; if ((0<=chNo) && (chNoGetResidue ( seqNo,insCode ); if (res) return res->GetAtom ( aname,elmnt,aloc ); } } return NULL; } PAtom Model::GetAtom ( int chNo, int seqNo, const InsCode insCode, int atomNo ) { PResidue res; if ((0<=chNo) && (chNoGetResidue ( seqNo,insCode ); if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } } } return NULL; } PAtom Model::GetAtom ( int chNo, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PResidue res; if ((0<=chNo) && (chNonResidues)) { res = chain[chNo]->residue[resNo]; if (res) return res->GetAtom ( aname,elmnt,aloc ); } } } return NULL; } PAtom Model::GetAtom ( int chNo, int resNo, int atomNo ) { PResidue res; if ((0<=chNo) && (chNonResidues)) { res = chain[chNo]->residue[resNo]; if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } } } } return NULL; } void Model::GetAtomTable ( const ChainID chainID, int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( chainID,seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void Model::GetAtomTable ( int chainNo, int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( chainNo,seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void Model::GetAtomTable ( const ChainID chainID, int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( chainID,resNo ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void Model::GetAtomTable ( int chainNo, int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( chainNo,resNo ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void Model::GetAtomTable1 ( const ChainID chainID, int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = GetResidue ( chainID,seqNo,insCode ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void Model::GetAtomTable1 ( int chainNo, int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = GetResidue ( chainNo,seqNo,insCode ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void Model::GetAtomTable1 ( const ChainID chainID, int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = GetResidue ( chainID,resNo ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void Model::GetAtomTable1 ( int chainNo, int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = GetResidue ( chainNo,resNo ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } int Model::DeleteAtom ( const ChainID chID, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAtom ( seqNo,insCode,aname,elmnt,aloc ); return 0; } int Model::DeleteAtom ( const ChainID chID, int seqNo, const InsCode insCode, int atomNo ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAtom ( seqNo,insCode,atomNo ); return 0; } int Model::DeleteAtom ( const ChainID chID, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAtom ( resNo,aname,elmnt,aloc ); return 0; } int Model::DeleteAtom ( const ChainID chID, int resNo, int atomNo ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAtom ( resNo,atomNo ); return 0; } int Model::DeleteAtom ( int chNo, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((0<=chNo) && (chNoDeleteAtom ( seqNo,insCode,aname, elmnt,aloc ); } return 0; } int Model::DeleteAtom ( int chNo, int seqNo, const InsCode insCode, int atomNo ) { if ((0<=chNo) && (chNoDeleteAtom ( seqNo,insCode,atomNo ); } return 0; } int Model::DeleteAtom ( int chNo, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((0<=chNo) && (chNoDeleteAtom ( resNo,aname,elmnt,aloc ); } return 0; } int Model::DeleteAtom ( int chNo, int resNo, int atomNo ) { if ((0<=chNo) && (chNoDeleteAtom ( resNo,atomNo ); } return 0; } int Model::DeleteAllAtoms ( const ChainID chID, int seqNo, const InsCode insCode ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAllAtoms ( seqNo,insCode ); return 0; } int Model::DeleteAllAtoms ( const ChainID chID, int resNo ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAllAtoms ( resNo ); return 0; } int Model::DeleteAllAtoms ( const ChainID chID ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAllAtoms(); return 0; } int Model::DeleteAllAtoms ( int chNo, int seqNo, const InsCode insCode ) { if ((0<=chNo) && (chNoDeleteAllAtoms ( seqNo,insCode ); } return 0; } int Model::DeleteAllAtoms ( int chNo, int resNo ) { if ((0<=chNo) && (chNoDeleteAllAtoms ( resNo ); } return 0; } int Model::DeleteAllAtoms ( int chNo ) { if ((0<=chNo) && (chNoDeleteAllAtoms(); } return 0; } int Model::DeleteAllAtoms() { int i,k; k = 0; for (i=0;iDeleteAllAtoms(); return k; } int Model::DeleteAltLocs() { // This function leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted. All tables remain // untrimmed, so that explicit trimming or calling FinishStructEdit() // is required. int i,n; n = 0; for (i=0;iDeleteAltLocs(); return n; } int Model::AddAtom ( const ChainID chID, int seqNo, const InsCode insCode, PAtom atom ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->AddAtom ( seqNo,insCode,atom ); return 0; } int Model::AddAtom ( const ChainID chID, int resNo, PAtom atom ) { PChain chn; chn = GetChain ( chID ); if (chn) return chn->AddAtom ( resNo,atom ); return 0; } int Model::AddAtom ( int chNo, int seqNo, const InsCode insCode, PAtom atom ) { if ((0<=chNo) && (chNoAddAtom ( seqNo,insCode,atom ); } return 0; } int Model::AddAtom ( int chNo, int resNo, PAtom atom ) { if ((0<=chNo) && (chNoAddAtom ( resNo,atom ); } return 0; } void Model::GetAtomStatistics ( RAtomStat AS ) { AS.Init(); CalAtomStatistics ( AS ); AS.Finish(); } void Model::CalAtomStatistics ( RAtomStat AS ) { int i; for (i=0;iCalAtomStatistics ( AS ); } ERROR_CODE Model::ConvertPDBString ( pstr PDBString ) { // Interprets PDB records DBREF, SEQADV, SEQRES, MODRES. // Returns zero if the line was converted, otherwise returns a // non-negative value of Error_XXXX. // PDBString must be not shorter than 81 characters. ChainID chainID; PChain chn; PHelix helix; PTurn turn; PLink link; PLinkR linkR; PCisPep cispep; ERROR_CODE RC; // pad input line with spaces, if necessary PadSpaces ( PDBString,80 ); chainID[0] = char(0); chainID[1] = char(0); if (!strncmp(PDBString,"DBREF ",6)) { if (PDBString[12]!=' ') chainID[0] = PDBString[12]; chn = GetChainCreate ( chainID,false ); return chn->ConvertDBREF ( PDBString ); } else if (!strncmp(PDBString,"SEQADV",6)) { if (PDBString[16]!=' ') chainID[0] = PDBString[16]; chn = GetChainCreate ( chainID,false ); return chn->ConvertSEQADV ( PDBString ); } else if (!strncmp(PDBString,"SEQRES",6)) { if (PDBString[11]!=' ') chainID[0] = PDBString[11]; chn = GetChainCreate ( chainID,false ); return chn->ConvertSEQRES ( PDBString ); } else if (!strncmp(PDBString,"MODRES",6)) { if (PDBString[16]!=' ') chainID[0] = PDBString[16]; chn = GetChainCreate ( chainID,false ); return chn->ConvertMODRES ( PDBString ); } else if (!strncmp(PDBString,"HET ",6)) { if (PDBString[12]!=' ') chainID[0] = PDBString[12]; chn = GetChainCreate ( chainID,false ); return chn->ConvertHET ( PDBString ); } else if (!strncmp(PDBString,"HETNAM",6)) { hetCompounds.ConvertHETNAM ( PDBString ); return Error_NoError; } else if (!strncmp(PDBString,"HETSYN",6)) { hetCompounds.ConvertHETSYN ( PDBString ); return Error_NoError; } else if (!strncmp(PDBString,"FORMUL",6)) { hetCompounds.ConvertFORMUL ( PDBString ); return Error_NoError; } else if (!strncmp(PDBString,"HELIX ",6)) { helix = new Helix(); RC = helix->ConvertPDBASCII(PDBString); if (RC==0) helices.AddData ( helix ); else delete helix; return RC; } else if (!strncmp(PDBString,"SHEET ",6)) { return sheets.ConvertPDBASCII ( PDBString ); } else if (!strncmp(PDBString,"TURN ",6)) { turn = new Turn(); RC = turn->ConvertPDBASCII(PDBString); if (RC==0) turns.AddData ( turn ); else delete turn; return RC; } else if (!strncmp(PDBString,"LINK ",6)) { link = new Link(); RC = link->ConvertPDBASCII(PDBString); if (RC==0) links.AddData ( link ); else delete link; return RC; } else if (!strncmp(PDBString,"LINKR ",6)) { linkR = new LinkR(); RC = linkR->ConvertPDBASCII(PDBString); if (RC==0) linkRs.AddData ( linkR ); else delete linkR; return RC; } else if (!strncmp(PDBString,"CISPEP",6)) { cispep = new CisPep(); RC = cispep->ConvertPDBASCII(PDBString); if (RC==0) cisPeps.AddData ( cispep ); else delete cispep; return RC; } else return Error_WrongSection; } void Model::PDBASCIIDumpPS ( io::RFile f ) { int i; for (i=0;iDBRef.PDBASCIIDump ( f ); for (i=0;iseqAdv.PDBASCIIDump ( f ); for (i=0;iseqRes.PDBASCIIDump ( f ); for (i=0;imodRes.PDBASCIIDump ( f ); for (i=0;iHet.PDBASCIIDump ( f ); hetCompounds.PDBASCIIDump ( f ); helices .PDBASCIIDump ( f ); sheets .PDBASCIIDump ( f ); turns .PDBASCIIDump ( f ); links .PDBASCIIDump ( f ); linkRs .PDBASCIIDump ( f ); } void Model::PDBASCIIDumpCP ( io::RFile f ) { cisPeps.PDBASCIIDump ( f ); } void Model::PDBASCIIDump ( io::RFile f ) { char S[100]; int i; bool singleModel = true; if (manager) singleModel = (manager->nModels<=1); if (!singleModel) { strcpy ( S,"MODEL " ); PadSpaces ( S,80 ); PutInteger ( &(S[10]),serNum,4 ); f.WriteLine ( S ); } for (i=0;iPDBASCIIAtomDump ( f ); if (!singleModel) { strcpy ( S,"ENDMDL" ); PadSpaces ( S,80 ); f.WriteLine ( S ); } } void Model::MakeAtomCIF ( mmcif::PData CIF ) { int i; for (i=0;iMakeAtomCIF ( CIF ); } void Model::MakePSCIF ( mmcif::PData CIF ) { int i; for (i=0;iDBRef.MakeCIF ( CIF ); for (i=0;iseqAdv.MakeCIF ( CIF ); for (i=0;iseqRes.MakeCIF ( CIF ); for (i=0;imodRes.MakeCIF ( CIF ); for (i=0;iHet.MakeCIF ( CIF ); hetCompounds.MakeCIF ( CIF ); helices .MakeCIF ( CIF ); sheets .MakeCIF ( CIF ); turns .MakeCIF ( CIF ); links .MakeCIF ( CIF ); linkRs .MakeCIF ( CIF ); } ERROR_CODE Model::GetCIFPSClass ( mmcif::PData CIF, int ClassID ) { ChainContainer PSClass; PChainContainer Dest; ERROR_CODE RC; cpstr chainID; PChain chn; PSClass.SetChain ( NULL ); RC = PSClass.GetCIF ( CIF,ClassID ); if (RC!=Error_NoError) return RC; chainID = PSClass.Get1stChainID(); while (chainID) { chn = GetChainCreate ( chainID,false ); switch (ClassID) { case ClassID_DBReference : Dest = &(chn->DBRef); break; case ClassID_SeqAdv : Dest = &(chn->seqAdv); break; case ClassID_ModRes : Dest = &(chn->modRes); break; case ClassID_Het : Dest = &(chn->Het); break; default : Dest = NULL; } if (Dest) { PSClass.MoveByChainID ( chainID,Dest ); Dest->SetChain ( chn ); } else printf ( " **** PROGRAM ERROR: wrong call to" " Model::GetCIFPSClass(..)\n" ); chainID = PSClass.Get1stChainID(); } return Error_NoError; } ERROR_CODE Model::GetCIF ( mmcif::PData CIF ) { SeqRes seqRes; ERROR_CODE RC; PChain chn; RC = GetCIFPSClass ( CIF,ClassID_DBReference ); if (RC!=Error_NoError) return RC; RC = GetCIFPSClass ( CIF,ClassID_SeqAdv ); if (RC!=Error_NoError) return RC; RC = seqRes.GetCIF ( CIF ); while (RC==Error_NoError) { chn = GetChainCreate ( seqRes.chainID,false ); chn->seqRes.Copy ( &seqRes ); RC = seqRes.GetCIF ( CIF ); } RC = GetCIFPSClass ( CIF,ClassID_ModRes ); if (RC!=Error_NoError) return RC; RC = GetCIFPSClass ( CIF,ClassID_Het ); if (RC!=Error_NoError) return RC; hetCompounds.GetCIF ( CIF ); helices .GetCIF ( CIF,ClassID_Helix ); sheets .GetCIF ( CIF ); turns .GetCIF ( CIF,ClassID_Turn ); links .GetCIF ( CIF,ClassID_Link ); linkRs .GetCIF ( CIF,ClassID_LinkR ); return RC; } cpstr Model::GetEntryID() { if (manager) return manager->title.idCode; else return pstr(""); } void Model::SetEntryID ( const IDCode idCode ) { if (manager) manager->SetEntryID ( idCode ); } int Model::GetNumberOfAllAtoms() { if (manager) return manager->nAtoms; else return 0; } int Model::GetSerNum() { return serNum; } PAtom * Model::GetAllAtoms() { if (manager) return manager->atom; else return NULL; } cpstr Model::GetModelID ( pstr modelID ) { modelID[0] = char(0); sprintf ( modelID,"/%i",serNum ); return modelID; } int Model::GetNumberOfModels() { if (manager) return manager->nModels; else return 0; } void Model::Copy ( PModel model ) { // modify both Model::_copy and Model::Copy methods simultaneously! int i; FreeMemory(); if (model) { serNum = model->serNum; nChains = model->nChains; nChainsAlloc = nChains; if (nChains>0) { chain = new PChain[nChainsAlloc]; for (i=0;ichain[i]) { chain[i] = newChain(); chain[i]->SetModel ( this ); chain[i]->Copy ( model->chain[i] ); } else chain[i] = NULL; } } hetCompounds.Copy ( &(model->hetCompounds) ); helices .Copy ( &(model->helices) ); sheets .Copy ( &(model->sheets) ); turns .Copy ( &(model->turns) ); links .Copy ( &(model->links) ); linkRs .Copy ( &(model->linkRs) ); cisPeps .Copy ( &(model->cisPeps) ); } } void Model::CopyHets ( PModel model ) { if (model) hetCompounds.Copy ( &(model->hetCompounds) ); } void Model::CopySecStructure ( PModel model ) { if (model) { helices.Copy ( &(model->helices) ); sheets .Copy ( &(model->sheets) ); turns .Copy ( &(model->turns) ); } } void Model::CopyLinks ( PModel model ) { if (model)links.Copy ( &(model->links) ); } void Model::CopyLinkRs ( PModel model ) { if (model) linkRs.Copy ( &(model->linkRs) ); } void Model::CopyCisPeps ( PModel model ) { if (model) cisPeps.Copy ( &(model->cisPeps) ); } void Model::_copy ( PModel model ) { // modify both Model::_copy and Model::Copy methods simultaneously! int i; FreeMemory(); if (model) { serNum = model->serNum; nChains = model->nChains; nChainsAlloc = nChains; if (nChains>0) { chain = new PChain[nChainsAlloc]; for (i=0;ichain[i]) { chain[i] = newChain(); chain[i]->SetModel ( this ); chain[i]->_copy ( model->chain[i] ); } else chain[i] = NULL; } } hetCompounds.Copy ( &(model->hetCompounds) ); helices .Copy ( &(model->helices) ); sheets .Copy ( &(model->sheets) ); turns .Copy ( &(model->turns) ); links .Copy ( &(model->links) ); linkRs .Copy ( &(model->linkRs) ); cisPeps .Copy ( &(model->cisPeps) ); } } void Model::_copy ( PModel model, PPAtom atom, int & atom_index ) { // modify both Model::_copy and Model::Copy methods simultaneously! // // _copy(PModel,PPAtom,int&) does copy atoms into array 'atom' // starting from position atom_index. 'atom' should be able to // accept all new atoms - no checks on the length of 'atom' // is being made. This function should not be used in applications. int i; FreeMemory(); if (model) { serNum = model->serNum; nChains = model->nChains; nChainsAlloc = nChains; if (nChains>0) { chain = new PChain[nChainsAlloc]; for (i=0;ichain[i]) { chain[i] = newChain(); chain[i]->SetModel ( this ); chain[i]->_copy ( model->chain[i],atom,atom_index ); } else chain[i] = NULL; } } hetCompounds.Copy ( &(model->hetCompounds) ); helices .Copy ( &(model->helices) ); sheets .Copy ( &(model->sheets) ); turns .Copy ( &(model->turns) ); links .Copy ( &(model->links) ); linkRs .Copy ( &(model->linkRs) ); } } int Model::AddChain ( PChain chn ) { // modify both Model::Copy methods simultaneously! // // Copy(PModel,PPAtom,int&) copies atoms into array 'atom' // starting from position atom_index. 'atom' should be able to // accept all new atoms - no checks on the length of 'atom' // is being made. This function should not be used in applications. PModel model1; int i; for (i=0;iGetCoordHierarchy()) { // The chain is associated with a coordinate hierarchy. It should // remain there, therefore we physically copy all its residues // and atoms. chain[nChains] = newChain(); chain[nChains]->SetModel ( this ); if (manager) { // get space for new atoms manager->AddAtomArray ( chn->GetNumberOfAtoms(true) ); chain[nChains]->_copy ( chn,manager->atom,manager->nAtoms ); } else { for (i=0;inResidues;i++) chain[nChains]->AddResidue ( chn->residue[i] ); } } else { // The chain is not associated with a coordinate hierarchy. Such // unregistered objects are simply taken over, i.e. moved into // the new destination (model). chain[nChains] = chn; // remove chain from its model: model1 = chn->GetModel(); if (model1) for (i=0;inChains;i++) if (model1->chain[i]==chn) { model1->chain[i] = NULL; break; } chain[nChains]->SetModel ( this ); if (manager) chain[nChains]->CheckInAtoms(); } nChains++; } return nChains; } void Model::MoveChain ( PChain & m_chain, PPAtom m_atom, PPAtom atom, int & atom_index, int chain_ext ) { // MoveChain(..) adds chain m_chain on the top Chain array. // The pointer on chain is then set to NULL (m_chain=NULL). // If chain_ext is greater than 0, the moved chain will be // forcefully renamed; the new name is composed as the previous // one + underscore + chain_ext (e.g. A_1). If thus generated // name duplicates any of existing chain IDs, or if chain_ext // was set to 0 and there is a duplication of chain IDs, the // name is again modified as above, with the extension number // generated automatically (this may result in IDs like // A_1_10). // m_atom must give pointer to the Atom array, from which // the atoms belonging to m_chain, are moved to Atom array // given by 'atom', starting from poisition 'atom_index'. // 'atom_index' is then automatically updated to the next // free position in 'atom'. // Note1: the moved atoms will occupy a continuous range // in 'atom' array; no checks on whether the corresponding // cells are occupied or not, are performed. // Note2: the 'atom_index' is numbered from 0 on, i.e. // it is equal to atom[atom_index]->index-1; atom[]->index // is assigned automatically. ChainID chainID; int i,j,k,Ok; PPChain chain1; PResidue crRes; if (!m_chain) return; // modify chain ID with the extension given if (chain_ext>0) sprintf ( chainID,"%s_%i",m_chain->chainID,chain_ext ); else strcpy ( chainID,m_chain->chainID ); // Choose the chain ID. If a chain with such ID is // already present in the model, it will be assigned // a new ID 'ID_n', where 'ID' stands for the original // chain ID and 'n' is the minimum (integer) number // chosen such that 'name_n' represents a new chain ID // (in the model). k = 0; do { Ok = true; for (i=0;(ichainID)) Ok = false; if (!Ok) { k++; if (chain_ext>0) sprintf ( chainID,"%s_%i_%i",m_chain->chainID, chain_ext,k ); else sprintf ( chainID,"%s_%i",m_chain->chainID,k ); } } while (!Ok); // add chain on the top of Chain array. strcpy ( m_chain->chainID,chainID ); if (nChains>=nChainsAlloc) { nChainsAlloc = nChains+10; chain1 = new PChain[nChainsAlloc]; k = 0; for (i=0;iSetModel ( this ); nChains++; // Move all atoms of the chain. While residues belong // atoms belong to the chain's manager class. Therefore // they should be moved from one manager to another. for (i=0;inResidues;i++) { crRes = m_chain->residue[i]; if (crRes) for (j=0;jnAtoms;j++) if (crRes->atom[j]) { k = crRes->atom[j]->index-1; atom[atom_index] = m_atom[k]; atom[atom_index]->index = atom_index+1; atom_index++; m_atom[k] = NULL; // moved! } } m_chain = NULL; // moved! } void Model::GetAIndexRange ( int & i1, int & i2 ) { PChain chn; PResidue res; int ic,ir,ia; i1 = MaxInt4; i2 = MinInt4; for (ic=0;icnResidues;ir++) { res = chn->residue[ir]; if (res) { for (ia=0;ianAtoms;ia++) if (res->atom[ia]) { if (res->atom[ia]->indexatom[ia]->index; if (res->atom[ia]->index>i2) i2 = res->atom[ia]->index; } } } } } } void Model::MaskAtoms ( PMask Mask ) { int i; for (i=0;iMaskAtoms ( Mask ); } void Model::MaskResidues ( PMask Mask ) { int i; for (i=0;iMaskResidues ( Mask ); } void Model::MaskChains ( PMask Mask ) { int i; for (i=0;iSetMask ( Mask ); } void Model::UnmaskAtoms ( PMask Mask ) { int i; for (i=0;iUnmaskAtoms ( Mask ); } void Model::UnmaskResidues ( PMask Mask ) { int i; for (i=0;iUnmaskResidues ( Mask ); } void Model::UnmaskChains ( PMask Mask ) { int i; for (i=0;iRemoveMask ( Mask ); } // ------ Getting Secondary Structure Elements int Model::GetNumberOfHelices() { return helices.Length(); } int Model::GetNumberOfSheets() { return sheets.nSheets; } PHelix Model::GetHelix ( int serialNum ) { return (PHelix)helices.GetContainerClass ( serialNum-1 ); } void Model::GetSheetID ( int serialNum, SheetID sheetID ) { if ((1<=serialNum) && (serialNum<=sheets.nSheets)) { if (sheets.sheet[serialNum-1]) { strcpy ( sheetID,sheets.sheet[serialNum-1]->sheetID ); return; } } sheetID[0] = char(0); } PSheet Model::GetSheet ( int serialNum ) { if ((1<=serialNum) && (serialNum<=sheets.nSheets)) return sheets.sheet[serialNum-1]; else return NULL; } PSheet Model::GetSheet ( const SheetID sheetID ) { int i; for (i=0;isheetID,sheetID)) return sheets.sheet[i]; } return NULL; } int Model::GetNumberOfStrands ( int sheetSerNum ) { if ((1<=sheetSerNum) && (sheetSerNum<=sheets.nSheets)) { if (sheets.sheet[sheetSerNum-1]) return sheets.sheet[sheetSerNum-1]->nStrands; } return 0; } int Model::GetNumberOfStrands ( const SheetID sheetID ) { int i; for (i=0;isheetID,sheetID)) return sheets.sheet[i]->nStrands; } return 0; } PStrand Model::GetStrand ( int sheetSerNum, int strandSerNum ) { PSheet sheet; if ((1<=sheetSerNum) && (sheetSerNum<=sheets.nSheets)) { sheet = sheets.sheet[sheetSerNum-1]; if (sheet) { if ((1<=strandSerNum) && (strandSerNum<=sheet->nStrands)) return sheet->strand[strandSerNum-1]; } } return NULL; } PStrand Model::GetStrand ( const SheetID sheetID, int strandSerNum ) { int i; PSheet sheet; for (i=0;isheetID,sheetID)) { sheet = sheets.sheet[i]; if (sheet) { if ((1<=strandSerNum) && (strandSerNum<=sheet->nStrands)) return sheet->strand[strandSerNum-1]; } } } return NULL; } void Model::RemoveSecStructure() { helices.FreeContainer(); sheets .FreeMemory (); turns .FreeContainer(); } void Model::RemoveHetInfo() { hetCompounds.FreeMemory(); } int Model::GetNumberOfLinks() { return links.Length(); } PLink Model::GetLink ( int serialNum ) { return (PLink)links.GetContainerClass ( serialNum-1 ); } void Model::RemoveLinks() { links.FreeContainer(); } void Model::AddLink ( PLink link ) { links.AddData ( link ); } int Model::GetNumberOfLinkRs() { return linkRs.Length(); } PLinkR Model::GetLinkR ( int serialNum ) { return (PLinkR)linkRs.GetContainerClass ( serialNum-1 ); } void Model::RemoveLinkRs() { linkRs.FreeContainer(); } void Model::AddLinkR ( PLinkR linkR ) { linkRs.AddData ( linkR ); } int Model::GetNumberOfCisPeps() { return cisPeps.Length(); } PCisPep Model::GetCisPep ( int CisPepNum ) { return (PCisPep)cisPeps.GetContainerClass ( CisPepNum-1 ); } void Model::RemoveCisPeps() { cisPeps.FreeContainer(); } void Model::AddCisPep ( PCisPep cisPep ) { cisPeps.AddData ( cisPep ); } void Model::ApplyTransform ( mat44 & TMatrix ) { // transforms all coordinates by multiplying with matrix TMatrix int i; for (i=0;iApplyTransform ( TMatrix ); } bool Model::isInSelection ( int selHnd ) { PMask mask; if (manager) { mask = PRoot(manager)->GetSelMask ( selHnd ); if (mask) return CheckMask ( mask ); } return false; } // ------- user-defined data handlers int Model::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_MODEL) return UDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Model::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_MODEL) return UDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Model::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_MODEL) return UDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int Model::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_MODEL) return UDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Model::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_MODEL) return UDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Model::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_MODEL) return UDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int Model::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_MODEL) return UDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } // ------- calculation of Secondary Structure int Model::CalcSecStructure ( bool flagBulge, int aminoSelHnd ) { // This function is contributed by Liz Potterton, University of York //------------------------------------------------------------------ // Define a secondary structure type of each amino acid residue in the // structure. // Procedure: // Find all amino acids // Find all pairs of amino acids which have inter-Ca distance < 10.0A // Test for hydrogen bonds between the main chain N and O of the close // residues and store the information in the hbonds matrix // Analyse the info in hbonds matrix to assign secondary structure to // secstr vector PPResidue Res; PPAtom Ca; PChain chn; PContact contact; imatrix hbonds; PPAtom * hbond_atoms; int nres, ncontacts; int ir1,ir2, irdif; int i,j,k,l; // 1a. Get protein residues from selection handle if (aminoSelHnd>=0) { manager->GetSelIndex(aminoSelHnd,Res,nres); if (nres<=0) return SSERC_noResidues; } else { // 1b. Get all protein residues nres = 0; for (i=0;inResidues; if (nres<=0) return SSERC_noResidues; Res = new PResidue[nres]; nres = 0; for (i=0;inResidues; for (j=0;jresidue[j]; } } if (nres<=0) { delete[] Res; return SSERC_noResidues; } } // 2. Get C-alphas of all aminoacids Ca = new PAtom[nres]; k = 0; for (i=0;i=0 || Res[i]->isAminoacid()) { Ca[i] = Res[i]->GetAtom("CA", " C", "*"); k++; } else Ca[i] = NULL; Res[i]->SSE = SSE_None; } else Ca[i] = NULL; if (k<=0) { delete[] Res; delete[] Ca; return SSERC_noAminoacids; } // 3. Find all close Calphas - i.e. find the contacts between // the two equivalent sets of Ca atoms contact = NULL; ncontacts = 0; manager->SeekContacts ( Ca,nres, Ca,nres, 2.0,10.0, 2, contact,ncontacts,0 ); manager->RemoveBricks(); if (ncontacts<=0) { delete[] Res; delete[] Ca; if (contact) delete[] contact; return SSERC_noSSE; } // 4. Get and initialize memory for analysing the SSE GetMatrixMemory ( hbonds,nres,3,0,0 ); hbond_atoms = new PPAtom[nres]; for (i=0;i2) { // test if there is donor Hbond from residue ir1 if (Res[ir1]->isMainchainHBond(Res[ir2])) { k = 0; while ((hbonds[ir1][k]!=0) && (k<2)) k++; hbonds [ir1][k] = -irdif; hbond_atoms[ir1][k] = Res[ir1]->GetAtom ( "N" ); hbond_atoms[ir1][k+3] = Res[ir2]->GetAtom ( "O" ); } // test if there is donor Hbond from residue ir2 if (Res[ir2]->isMainchainHBond(Res[ir1])) { k = 0; while ((hbonds[ir2][k]!=0) && (k<2)) k++; hbonds [ir2][k] = irdif; hbond_atoms[ir2][k] = Res[ir2]->GetAtom ( "N" ); hbond_atoms[ir2][k+3] = Res[ir1]->GetAtom ( "O" ); } } } // 6. Assign the turns - if there is bifurcated bond then the 4-turn // takes precedence - read the paper to make sense of this for (i=0;iSSE = SSE_5Turn; Res[i-2]->SSE = SSE_5Turn; Res[i-3]->SSE = SSE_5Turn; Res[i-4]->SSE = SSE_5Turn; } if (hbonds[i][k]==-3) { Res[i-1]->SSE = SSE_3Turn; Res[i-2]->SSE = SSE_3Turn; } k++; } } for (i=0;iSSE = SSE_4Turn; Res[i-2]->SSE = SSE_4Turn; Res[i-3]->SSE = SSE_4Turn; } k++; } } // 7. Look for consecutive 4-turns which make alpha helix for (i=1;iSSE==SSE_Helix) || (Res[i ]->SSE==SSE_4Turn)) && ((Res[i+1]->SSE==SSE_Helix) || (Res[i+1]->SSE==SSE_4Turn)) && ((Res[i+2]->SSE==SSE_Helix) || (Res[i+2]->SSE==SSE_4Turn)) && ((Res[i+3]->SSE==SSE_Helix) || (Res[i+3]->SSE==SSE_4Turn))) for (j=i;j<=i+3;j++) Res[j]->SSE = SSE_Helix; } for (i=0;iSSE = SSE_Strand; Res[j]->SSE = SSE_Strand; } // Parallel strand if (hbonds[j][l]==-irdif-2) { Res[i-1]->SSE = SSE_Strand; Res[j ]->SSE = SSE_Strand; } // Parallel beta bulge if (hbonds[j][l]==-irdif-3) { if (flagBulge) { if (Res[i-1]->SSE==SSE_None) Res[i-1]->SSE = SSE_Bulge; if (Res[i-2]->SSE==SSE_None) Res[i-2]->SSE = SSE_Bulge; if (Res[j ]->SSE==SSE_None) Res[j ]->SSE = SSE_Bulge; } else { if (Res[i-1]->SSE==SSE_None) Res[i-1]->SSE = SSE_Strand; if (Res[i-2]->SSE==SSE_None) Res[i-2]->SSE = SSE_Strand; if (Res[j ]->SSE==SSE_None) Res[j ]->SSE = SSE_Strand; } } l++; } // Test for 'wide' hbond j = i + hbonds[i][k] + 2; if (jSSE = SSE_Strand; Res[j-1]->SSE = SSE_Strand; } // Parallel strands if (hbonds[j][l]==-irdif-2) { Res[i ]->SSE = SSE_Strand; Res[j-1]->SSE = SSE_Strand; } l++; } } // test for anti-parallel B-bulge between 'close' hbonds j = i + hbonds[i][k] - 1; if (j>=0) { l = 0; while ((l<=2) && (hbonds[j][l]!=0)) { if (hbonds[j][l]==-irdif+1) { if (flagBulge) { if (Res[i ]->SSE==SSE_None) Res[i ]->SSE = SSE_Bulge; if (Res[j+1]->SSE==SSE_None) Res[j+1]->SSE = SSE_Bulge; if (Res[j ]->SSE==SSE_None) Res[j ]->SSE = SSE_Bulge; } else { if (Res[i ]->SSE==SSE_None) Res[i ]->SSE = SSE_Strand; if (Res[j+1]->SSE==SSE_None) Res[j+1]->SSE = SSE_Strand; if (Res[j ]->SSE==SSE_None) Res[j ]->SSE = SSE_Strand; } } l++; } } // test for anti-parallel B-bulge between 'wide' hbonds j = i + hbonds[i][k] + 3; if (j0)) { if (flagBulge) { if (Res[i-1]->SSE==SSE_None) Res[i-1]->SSE = SSE_Bulge; if (Res[j-1]->SSE==SSE_None) Res[j-1]->SSE = SSE_Bulge; if (Res[j-2]->SSE==SSE_None) Res[j-2]->SSE = SSE_Bulge; } else { if (Res[i-1]->SSE==SSE_None) Res[i-1]->SSE = SSE_Strand; if (Res[j-1]->SSE==SSE_None) Res[j-1]->SSE = SSE_Strand; if (Res[j-2]->SSE==SSE_None) Res[j-2]->SSE = SSE_Strand; } } else if (hbonds[j][l]==-irdif-3) { // and bulge in parallel strand if (flagBulge) { if (Res[i ]->SSE==SSE_None) Res[i ]->SSE = SSE_Bulge; if (Res[j-1]->SSE==SSE_None) Res[j-1]->SSE = SSE_Bulge; if (Res[j-2]->SSE==SSE_None) Res[j-2]->SSE = SSE_Bulge; } else { if (Res[i ]->SSE==SSE_None) Res[i ]->SSE = SSE_Strand; if (Res[j-1]->SSE==SSE_None) Res[j-1]->SSE = SSE_Strand; if (Res[j-2]->SSE==SSE_None) Res[j-2]->SSE = SSE_Strand; } } l++; } } k++; } // Finish looping over Hbonds for residue (k loop) } // Finish looping over residues ( i loop) // 8. Free memory if (hbond_atoms) { for (i=0;iisCompactBinary(); f.WriteByte ( &Version ); f.WriteBool ( &compactBinary ); f.WriteInt ( &serNum ); f.WriteInt ( &nChains ); for (i=0;iwrite ( f ); } if (!compactBinary) { ProModel::write ( f ); hetCompounds.write ( f ); helices .write ( f ); sheets .write ( f ); turns .write ( f ); links .write ( f ); linkRs .write ( f ); } } void Model::read ( io::RFile f ) { int i,k; byte Version; bool compactBinary; FreeMemory(); f.ReadByte ( &Version ); f.ReadBool ( &compactBinary ); f.ReadInt ( &serNum ); f.ReadInt ( &nChains ); nChainsAlloc = nChains; if (nChains>0) { chain = new PChain[nChainsAlloc]; for (i=0;iSetModel ( this ); chain[i]->read ( f ); } } } if (!compactBinary) { ProModel::read ( f ); hetCompounds.read ( f ); helices .read ( f ); sheets .read ( f ); turns .read ( f ); links .read ( f ); linkRs .read ( f ); } } MakeFactoryFunctions(Model) } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_seqsuperpose.cpp0000744000175000017500000002345513271367640017721 0ustar maartenmaarten// $Id: mmdb_seqsuperpose.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 19.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : SeqSuperpose // ~~~~~~~~~ // **** Classes : mmdb::SeqSuperpose // ~~~~~~~~~ // // (C) E.Krissinel 2005-2013 // // ================================================================= // #include #include #include "mmdb_tables.h" #include "mmdb_seqsuperpose.h" namespace mmdb { // ================================================================= SeqSuperpose::SeqSuperpose() { SeqSuperposeInit(); } SeqSuperpose::~SeqSuperpose() { FreeMemory(); } void SeqSuperpose::SeqSuperposeInit() { Align = NULL; Mat4Init ( TMatrix ); // superposes Ca1 over Ca2: |T*Ca1 - Ca2|->min Q = -0.5; // Q-score rmsd = MaxReal; // rmsd seqId = MaxReal; // sequence identity _seqId = 0.0; // sequence identity in sequence alignment Nalign = 0; // alignment length c1 = NULL; // sup-n vector: Ca1[i]->Ca2[c1[i]] if c1[i]>=0 c2 = NULL; // sup-n vector: Ca2[i]->Ca1[c2[i]] if c2[i]>=0 cn1 = NULL; // temporary contact array #1 cn2 = NULL; // temporary contact array #2 Rmsd0 = 3.0; // quality optimization parameter maxContact = 15.0; // maximal Calpha-pair contact parameter contact = NULL; ncontacts = 0; } void SeqSuperpose::FreeMemory() { if (Align) { delete Align; Align = NULL; } FreeVectorMemory ( c1 ,0 ); FreeVectorMemory ( c2 ,0 ); FreeVectorMemory ( cn1,0 ); FreeVectorMemory ( cn2,0 ); if (contact) { delete[] contact; contact = NULL; } ncontacts = 0; } void makeAAString ( pstr & S, PPAtom C, int nat ) { pstr rname; ResName r1; int i,j; S = new char[nat+1]; j = 0; for (i=0;iGetResName(); if (rname) { Get1LetterCode ( rname,r1 ); S[j++] = r1[0]; } } S[j] = char(0); } realtype SeqSuperpose::MatchQuality ( int Nalign, realtype Rmsd, int nres1, int nres2 ) { if (Nalign==0) return 0.0; return MatchQuality2 ( Nalign,Rmsd*Rmsd*Nalign,nres1,nres2 ); } realtype SeqSuperpose::MatchQuality2 ( int Nalign, realtype dist2, int nres1, int nres2 ) { realtype NormN,Na2,NormR; NormN = nres1*nres2; if (NormN<=0.0) return 0.0; Na2 = Nalign*Nalign; NormR = dist2/(Nalign*Rmsd0*Rmsd0); return Na2/((1.0+NormR)*NormN); } void SeqSuperpose::MakeContacts ( mat44 & TM, realtype cont_est ) { // Find the closest contacts atoms and makes the correspondence // vectors cn1 and cn2 int i,j,i1,i2; // 1. Find all contacts in the range of 0.0 - cont_est if (contact) { delete[] contact; contact = NULL; } ncontacts = 0; M->SeekContacts ( Ca2,nCa2,Ca1,nCa1,0.0,cont_est,0, contact,ncontacts,0,&TM,0, BRICK_ON_1 | BRICK_READY ); // 2. Leave only unique shortest contacts, that is, if Ca1[i]-Ca2[j] // is the shortest contact for atom Ca1[i], it has also to be // the shortest contact for atom Ca2[j]. if (ncontacts>0) { SortContacts ( contact,ncontacts,CNSORT_DINC ); for (i=0;iGetAlignedS(); T = Align->GetAlignedT(); GetVectorMemory ( cn1,nCa1,0 ); GetVectorMemory ( c1 ,nCa1,0 ); for (i=0;iGetSpace(); while (S[i] && (i1areBricks())) M->MakeBricks ( Ca2,nCa2,1.25*maxContact ); Q = -1.0; Q0 = -1.0; iter = 0; iter1 = 0; do { Q = RMax ( Q,Q0 ); iter++; rc = SuperposeAtoms ( TM,Ca1,nCa1,Ca2,cn1 ); if (rc==SPOSEAT_Ok) { MakeContacts ( TM,maxContact ); dist2 = 0.0; for (i=0;i0) { i = ncontacts; while (i>3) { i--; dist2 -= contact[i].dist; if (dist2<=i*maxRMSD2) { // rmsd must be within the limits Q1 = MatchQuality2 ( i,dist2,nCa1,nCa2 ); if (Q1>Q0) { Q0 = Q1; nal = i; dist20 = dist2; } } } for (i=nal+1;iQ) { for (i=0;i100)) rc = SEQSP_IterLimit; } while ((rc==SPOSEAT_Ok) && ((Q=2))); if (Nalign>0) { SuperposeAtoms ( TMatrix,Ca1,nCa1,Ca2,c1 ); rmsd = sqrt(rmsd/Nalign); // rmsd seqId = 0.0; for (i=0;i=0) { if (!strcasecmp(Ca1[i]->GetResName(),Ca2[c1[i]]->GetResName())) seqId += 1.0; } seqId = seqId/Nalign; } else { rmsd = MaxReal; seqId = 0.0; } FreeVectorMemory ( cn1,0 ); FreeVectorMemory ( cn2,0 ); if (!keepBricks) M->RemoveBricks(); return rc; } int SeqSuperpose::Superpose ( PManager MMDB, PPAtom Calpha1, int nCalpha1, PPAtom Calpha2, int nCalpha2, realtype seqThreshold, bool keepBricks ) { pstr S,T; Mat4Init ( TMatrix ); // superposes Ca1 over Ca2: |T*Ca1 - Ca2|->min Q = 0.0; // Q-score rmsd = MaxReal; // rmsd seqId = MaxReal; // sequence identity in structure alignment Nalign = 0; // alignment length in structure alignment FreeVectorMemory ( c1,0 ); FreeVectorMemory ( c2,0 ); _seqId = IMin(nCalpha1,nCalpha2); _seqId /= IMax(nCalpha1,nCalpha2); if (_seqIdAlign ( S,T,math::ALIGN_FREEENDS ); if (S) delete[] S; if (T) delete[] T; return makeStructAlignment ( seqThreshold,keepBricks ); } } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_coormngr.h0000644000175000017500000012632313271367640016453 0ustar maartenmaarten// $Id: mmdb_coormngr.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 23.10.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_coormngr // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Brick ( space brick ) // ~~~~~~~~~ mmdb::CoorManager ( MMDB atom coordinate manager ) // // (C) E. Krissinel 2000-2015 // // ================================================================= // #ifndef __MMDB_CoorMngr__ #define __MMDB_CoorMngr__ #include "mmdb_root.h" namespace mmdb { // =========================== Brick ============================== // bricking control enum BRICK_STATE { BRICK_ON_1 = 0x00000001, BRICK_ON_2 = 0x00000002, BRICK_READY = 0x00000004 }; DefineClass(Brick); typedef PPBrick * PPPBrick; class Brick { public : int nAtoms; // number of atoms hit into brick PPAtom atom; // pointers to atoms ivector id; // atom ids (in present realization, these are // indices of atoms from the bricked array) Brick (); ~Brick(); void Clear (); void AddAtom ( PAtom A, int atomid ); protected : int nAllocAtoms; void InitBrick(); }; // =========================== MBrick ============================= // Bricking multiple structures DefineClass(MBrick); typedef PPMBrick * PPPMBrick; class MBrick { public : ivector nAtoms; // number of atoms in the brick PPAtom *atom; // pointers to atoms imatrix id; // atom ids (in present realization, these are // indices of atoms from the bricked array) MBrick ( int nStructures ); ~MBrick(); void Clear (); void AddAtom ( PAtom A, int structNo, int atomid ); protected : ivector nAlloAtoms; int nStruct; void InitMBrick ( int nStructures ); }; // ==================== GenSym ======================== DefineClass(GenSym); DefineStreamFunctions(GenSym); class GenSym : public SymOps { friend class CoorManager; public : GenSym (); GenSym ( io::RPStream Object ); ~GenSym(); void FreeMemory(); int AddSymOp ( cpstr XYZOperation ); // the number of just added operation may be obtained as // Nop = GenSym::GetNofSymOps()-1 . int AddRenChain ( int Nop, const ChainID ch1, const ChainID ch2 ); void Copy ( PSymOps genSym ); void write ( io::RFile f ); void read ( io::RFile f ); protected : PChainID * chID1; // pairs of chains to rename from chID1[n][i] PChainID * chID2; // to chID2[n][i] for each operation n1, all atoms belonging // to residues closer than // +/-(seqDist-1) around that of // atom AIndex[atomNum], are // neglected. If chain is broken // (has a gap) on section // [-(seqDist-1)..seqDist-1], the // section of neglection is // shortened to that gap. RPContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // is set to atomNum and // contact[i].id2 is set to the // index of 2nd contacting atom // in vector AIndex int & ncontacts, // number of contacts found. If // ncontacts>0 on input, it is // assumed that new contacts that // newly found contacts should be // appended to those already // existing int maxlen=0, // if <=0, then vector contact is // allocated dynamically. If // contact!=NULL, then it is // appended with new contacts. // The application is responsible // for deallocation of contact // after use. // If maxlen>0 then vector contact // is prohibited of dynamical // allocation/deallocation. In this // case, not more than maxlen // contacts will be returned. long group=0 // a contact group ID, which will be // simply stored in contact[i].group // fields. This ID may be useful // if contacts are obtained in // multiple calls of the function ); void SeekContacts ( PAtom A, // 1st atom in contact PPAtom AIndex, // index of atoms [0..ilen-1] to // check for contact with 1st atom int ilen, // length of index realtype dist1, // minimal contact distance realtype dist2, // maximal contact distance int seqDist, // the sequence distance to neglect. // If seqDist==0, all atoms are // checked for contact. If // seqDist==1, the atoms belonging // to the same residue as atom // A, are neglected. If seqDist>1, // all atoms belonging to residues // closer than +/-(seqDist-1) around // that of atom A, are neglected. If // chain is broken (has a gap) on // section // [-(seqDist-1)..seqDist-1], the // section of neglection is // shortened to that gap. RPContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // is set to -1, and contact[i].id2 // is set to the index of 2nd // contacting atom in vector AIndex int & ncontacts, // number of contacts found. If // ncontacts>0 on input, it is // assumed that new contacts that // newly found contacts should be // appended those already existing int maxlen=0, // if <=0, then vector contact is // allocated dynamically. If // contact!=NULL, then it is // appended with new contacts. // The application is responsible // for deallocation of contact // after use. // If maxlen>0 then vector contact // is prohibited of dynamical // allocation/deallocation. In this // case, not more than maxlen // contacts will be returned. long group=0 // a contact group ID, which will be // simply stored in contact[i].group // fields. This ID may be useful // if contacts are obtained in // multiple calls of the function ); void SeekContacts ( PPAtom AIndex1, // 1st atom index [0..ilen1-1] int ilen1, // length of 1st index PPAtom AIndex2, // 2nd atom index [0..ilen2-1] to // check for contact with 1st index int ilen2, // length of 2nd index realtype dist1, // minimal contact distance realtype dist2, // maximal contact distance int seqDist, // the sequence distance to // neglect. // If seqDist==0, all atoms are // checked for contact. // If seqDist==1, the atoms // belonging to the same residue // are neglected. // If seqDist>1, all atoms // belonging to residues closer than // +/-(seqDist-1) to each other, // are neglected. If chain is broken // (has a gap) on section // [-(seqDist-1)..seqDist-1], the // section of neglection is // shortened to that gap. RPContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // contains number of atom from 1st // index, and contact[i].id2 // contains number of atom from 2nd // index, contacting with the former // one int & ncontacts, // number of contacts found. If // ncontacts>0 on input, it is // assumed that newly found // contacts should be appended to // those already existing int maxlen=0, // if <=0, then vector contact is // allocated dynamically. If // contact!=NULL, then it is // appended with new contacts. // The application is responsible // for deallocation of contact // after use. // If maxlen>0 then vector contact // is prohibited of dynamical // allocation/deallocation. In this // case, not more than maxlen // contacts will be returned. mat44 * TMatrix=NULL, // transformation matrix for 2nd // set of atoms (AIndex2) long group=0, // a contact group ID, which will // be stored in contact[i].group // fields. This ID may be useful // if contacts are obtained in // multiple calls of the function int bricking=0, // bricking control; may be a // combination of BRICK_ON_1 or // BRICK_ON_2 with BRICK_READY bool doSqrt=true // if False, then Contact contains // square distances ); // Simplified optimized for speed version: // - no NULL pointers and Ters in AIndex1 and AIndex2 // - no checks for identity atoms in AIndex1 and AIndex2 // - contact must be pre-allocated with at least ilen1*ilen2 // elements // - contact returns square distances // - ncontacts is always reset void SeekContacts ( PPAtom AIndex1, // 1st atom index [0..ilen1-1] int ilen1, // length of 1st index PPAtom AIndex2, // 2nd atom index [0..ilen2-1] to // check for contact with 1st index int ilen2, // length of 2nd index realtype contDist, // maximal contact distance PContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // contains number of atom from 1st // index, and contact[i].id2 // contains number of atom from 2nd // index, contacting with the former // one. Must be pre-allocated int & ncontacts, // number of contacts found int bricking=0 // bricking control; may be a // combination of BRICK_ON_1 or // BRICK_ON_2 with BRICK_READY ); // Simplified optimized for speed and convenience version: // - bricking is pre-done // - contacting set of atoms is given as a bare vect3 (xyz) // coordinate vector // - no checks for identity atoms // - contact must be pre-allocated with at least ilen1*ilen2 // elements // - contact returns square distances // - ncontacts is always reset void SeekContacts ( vect3 * xyz, // 2nd atom index [0..ilen2-1] to // check for contact with 1st index // which was used for bricking int nxyz, // length of 2nd index realtype contDist, // maximal contact distance PContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // contains number of atom from 1st // index, and contact[i].id2 // contains number of atom from 2nd // index, contacting with the former // one. Must be pre-allocated int & ncontacts // number of contacts found ); void SeekContacts ( PPAtom AIndex1, // 1st atom index [0..ilen1-1] int ilen1, // length of 1st index PPAtom * AIndex2, // indexes of atoms to be checked // for contact with each atom from // Aindex1; dimension // [0..nStructures-1][0..ilen2[i]-1] ivector ilen2, // lengths of indexes AIndex2 int nStructures, // number of indexes AIndex2 realtype dist1, // minimal contact distance realtype dist2, // maximal contact distance PPMContact & contact, // resulting contacts, one structure // per each position in AIndex1. If // AIndex1[i] is NULL, contact[i] is // also NULL. "contact" is always // allocated, no re-use or // re-allocation is attempted. int bricking=0 // bricking control; may be // BRICK_READY if AIndex2 does not // change ); protected : // bricks realtype brick_size, xbrick_0,ybrick_0,zbrick_0; int nbrick_x,nbrick_y,nbrick_z; PPPBrick * brick; realtype mbrick_size, xmbrick_0,ymbrick_0,zmbrick_0; int nmbrick_x,nmbrick_y,nmbrick_z; PPPMBrick * mbrick; // --------------- Stream I/O ----------------------------- void write ( io::RFile f ); void read ( io::RFile f ); void InitMMDBCoorManager(); void ApplySymTransform ( int SymMatrixNo, PGenSym genSym=NULL ); void ResetManager (); void FindSeqSection ( PAtom atom, int seqDist, int & seq1, int & seq2 ); bool iContact ( PAtom a1, PAtom a2, int seq1, int seq2, realtype dd, realtype d12, realtype d22, realtype & d2 ); bool iContact ( realtype x, realtype y, realtype z, PAtom a2, realtype dd, realtype d12, realtype d22, realtype & d2 ); }; // =================================================================== // GetEulerRotMatrix(..) calculates the Euler rotation matrix // for rotation: // 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma extern void GetEulerRotMatrix ( mat33 & erm, realtype alpha, realtype beta, realtype gamma ); // GetEulerTMatrix(..) calculates the Euler rotation-translation // matrix for rotation: // 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma // Point (x0,y0,z0) is the center of rotation. extern void GetEulerTMatrix ( mat44 & erm, realtype alpha, realtype beta, realtype gamma, realtype x0, realtype y0, realtype z0 ); // Euler rotation: 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma // Point (x0,y0,z0) is the center of rotation. extern void EulerRotation ( PPAtom A, int nA, realtype alpha, realtype beta, realtype gamma, realtype x0, realtype y0, realtype z0 ); // GetVecRotMatrix(..) calculates the rotation matrix for // rotation by angle alpha about arbitrary vector directed // as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). extern void GetVecRotMatrix ( mat33 & vrm, realtype alpha, realtype vx, realtype vy, realtype vz ); // Given the rotation matrix vrm, GetRotParameters(..) // returns the rotation angle alpha and the normalized // rotation axis vector (vx,vy,vz). // The rotation angle and vector are determined up to // their sign (however correlated, so that being substituted // into GetVecRotMatrix(..) they yield the same rotation // matrix). // The function does not check for vrm to be a valid // rotation matrix. extern void GetRotParameters ( mat33 & vrm, realtype & alpha, realtype & vx, realtype & vy, realtype & vz ); // GetVecTMatrix(..) calculates the rotation-translation matrix // for rotation by angle alpha about arbitrary vector directed as // (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). Point (x0,y0,z0) is // the center of rotation -- actually a point belonging to the // rotation axis. extern void GetVecTMatrix ( mat44 & vrm, realtype alpha, realtype vx, realtype vy, realtype vz, realtype x0, realtype y0, realtype z0 ); // Vector rotation is rotation by angle alpha about arbitrary // vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). // Point (x0,y0,z0) is the center of rotation -- actually // a point belonging to the rotation axis. extern void VectorRotation ( PPAtom A, int nA, realtype alpha, realtype vx, realtype vy, realtype vz, realtype x0, realtype y0, realtype z0 ); extern void GetMassCenter ( PPAtom A, int nA, realtype & xmc, realtype & ymc, realtype & zmc ); enum SPOSEAT_RC { SPOSEAT_Ok = 0, SPOSEAT_NoAtoms = 1, SPOSEAT_SVD_Fail = 2 }; // Given two sets of atoms, A1 and A2, SuperposeAtoms(...) calculates // the rotational-translational matrix T such that |T*A1 - A2| is // minimal in least-square terms. // If vector C is not given (default), all nA atoms of set A1 are // considered as corresponding to nA first atoms of set A2, // A1[i] <-> A2[i], 0<=i A2[C[i]] only for those i that C[i]>=0. // The default option (C==NULL) is thus identical to C[i]==i, 0<=i // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::BondManager ( MMDB bonds maker ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include "mmdb_bondmngr.h" #include "mmdb_math_graph.h" namespace mmdb { // ===================== BondManager ===================== BondManager::BondManager() : SelManager() { } BondManager::BondManager ( io::RPStream Object ) : SelManager(Object) { } BondManager::~BondManager() {} void BondManager::MakeBonds ( bool calc_only ) { UNUSED_ARGUMENT(calc_only); PModel mdl; PChain chain; PResidue res; math::Graph graph; math::PPVertex V; math::PPEdge E; int i, im,ic,ir, nV,nE, k1,k2; RemoveBonds(); for (im=0;imnChains;ic++) { chain = mdl->chain[ic]; if (chain) for (ir=0;irnResidues;ir++) { res = chain->residue[ir]; if (res) { graph.MakeGraph ( res,NULL ); graph.GetVertices ( V,nV ); graph.GetEdges ( E,nE ); for (i=0;iGetVertex1()-1]->GetUserID(); k2 = V[E[i]->GetVertex2()-1]->GetUserID(); res->atom[k1]->AddBond ( res->atom[k2],E[i]->GetType() ); res->atom[k2]->AddBond ( res->atom[k1],E[i]->GetType() ); } } } } } } void BondManager::RemoveBonds() { int i; for (i=0;iFreeBonds(); } // ------------------- Stream functions ---------------------- void BondManager::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); SelManager::write ( f ); } void BondManager::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); SelManager::read ( f ); } MakeStreamFunctions(BondManager) } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_io_stream.cpp0000644000175000017500000000741413271367640017141 0ustar maartenmaarten// $Id: mmdb_io_stream.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 11.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Stream_ // ~~~~~~~~~ // **** Classes : mmdb::io::Stream ( Basic Stream Class ) // ~~~~~~~~~ // // (C) E. Krissinel 1995-2013 // // ================================================================= // #include "mmdb_io_stream.h" namespace mmdb { namespace io { // ========================== CStream =========================== // Each streamable class should be derived from Stream // and have constructor Class(PStream & Object), which should // initialize all memory of the class, and virtual functions // read(..) and write(..) (see below). Constructor Class(PStream&) // must not touch the Object variable. This constructor is used // only once just before read(..) function. It is assumed that // read/write functions of Class provide storage/reading of // all vital data. Function read(..) must read data in exactly // the same way as function write(..) stores it. // For using Class in streams, three following functions should // be supplied: // // 1. // void StreamWrite ( RFile f, RPClass Object ) { // StreamWrite ( f,(PStream)PClass ); // } // // 2. // PCStream ClassInit ( RPStream Object ) { // return (PStream)(new Class(Object)); // } // // 3. // void StreamRead ( RFile f, RPClass Object ) { // StreamRead_ ( f,(PStream)Object,ClassInit ); // } // // All these functions are automatically generated by macros // DefineStreamFunctions(CClass) -- in the header -- and // MakeStreamFunctions(CClass) -- in the implementation body. // Then CClass may be streamed in/out using functions #1 and #3. // StreamRead will return NULL for Object if it was not // in the stream. If Object existed before StreamRead(..) but // was not found in the stream, it will be disposed. void StreamRead_ ( RFile f, RPStream Object, InitStreamObject Init ) { int i; f.ReadInt ( &i ); if (i) { if (!Object) Object = Init(Object); //Object = new CStream ( Object ); Object->read ( f ); } else { if (Object) delete Object; Object = NULL; } } void StreamWrite_ ( RFile f, RPStream Object ) { int i; if (Object) { i = 1; f.WriteInt ( &i ); Object->write ( f ); } else { i = 0; f.WriteInt ( &i ); } } MakeStreamFunctions(Stream) } } mmdb2-2.0.20/mmdb2/mmdb_selmngr.h0000644000175000017500000007071113271367640016273 0ustar maartenmaarten// $Id: mmdb_selmngr.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 15.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_selmngr // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Manager ( MMDB atom selection manager ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_SelMngr__ #define __MMDB_SelMngr__ #include "mmdb_coormngr.h" #include "mmdb_mask.h" namespace mmdb { // ======================= SelManager ========================== // Selection keys. These specify how the requested selection // operation applies to the existing selection for the given mask: // SKEY_NEW previous selection is wiped out // SKEY_OR new selection is added to the already selected set; // if no selection preexists, SKEY_NEW and SKEY_OR // are equivalent. This key is the default one in // all selection functions. // SKEY_AND new selection is made on the already selected set; // this corresponds to logical 'and' of former and // current selections. If no selection preexists, // no selection will be made. // SKEY_XOR only those atoms will be left which are found // in either former or newly selected sets, but not // in both of them; this corresponds to logical // 'exclusive or' of previous and current selections. // If no selection preexists, it is equivalent to // SKEY_OR. enum SELECTION_KEY { SKEY_NEW = 0, SKEY_OR = 1, SKEY_AND = 2, SKEY_XOR = 3, SKEY_CLR = 4, SKEY_XAND = 100 // used internally }; // Selection types enum SELECTION_TYPE { STYPE_INVALID = -1, STYPE_UNDEFINED = 0, STYPE_ATOM = 1, STYPE_RESIDUE = 2, STYPE_CHAIN = 3, STYPE_MODEL = 4 }; // Residue properties for SelectProperties() enum SELECTION_PROPERTY { SELPROP_Solvent = 0, SELPROP_Aminoacid = 1, SELPROP_Nucleotide = 2, SELPROP_Sugar = 3, SELPROP_ModRes = 4 }; // comparison rules for SelectUDD function enum UDD_CMP_RULE { UDSCR_LT = 1, UDSCR_LE = 2, UDSCR_EQ = 3, UDSCR_NE = 4, UDSCR_GE = 5, UDSCR_GT = 6, UDSCR_LTcase = 7, UDSCR_LEcase = 8, UDSCR_EQcase = 9, UDSCR_NEcase = 10, UDSCR_GEcase = 11, UDSCR_GTcase = 12, UDSCR_LTn = 13, UDSCR_LEn = 14, UDSCR_EQn = 15, UDSCR_NEn = 16, UDSCR_GEn = 17, UDSCR_GTn = 18, UDSCR_LTncase = 19, UDSCR_LEncase = 20, UDSCR_EQncase = 21, UDSCR_NEncase = 22, UDSCR_GEncase = 23, UDSCR_GTncase = 24, UDSCR_Substr = 25, UDSCR_NoSubstr = 26, UDSCR_Substr1 = 27, UDSCR_NoSubstr1 = 28 }; DefineClass(SelManager); DefineStreamFunctions(SelManager); class SelManager : public CoorManager { public : SelManager (); SelManager ( io::RPStream Object ); ~SelManager(); // ==================== Selecting atoms ======================= // NewSelection() creates a new selection mask and returns its // handle. A handle is always a positive (non-zero) integer. // Calling NewSelection() is the only way to create a new // selection mask. Notice however that masks will be automatically // copied from another MMDB (see Copy(..) in CMMDBManager) if // coordinates are copied; if this is the case, the mask handles // will be inherited from the source MMDB as well. The masks will // also be automatically deleted (see Delete(..) in CMMDBManager()) // if coordinates are deleted. int NewSelection (); int GetSelType ( int selHnd ); // returns STYPE_XXXX // DeleteSelection(..) deletes the specified selection mask // and removes the corresponding selection attributes from // all atoms, which were selected with this mask. If an atom // was selected also with other mask(s), the other selection(s) // will remain, provided that the corresponding masks are valid. // After DeleteSelection() returns, the corresponding mask // becomes invalid. void DeleteSelection ( int selHnd ); // DeleteAllSelections() deletes all selection masks and // unselects all atoms in the file. All mask handles become // invalid. void DeleteAllSelections(); // SelectAtoms(..) selects atoms in the serial number range // of iSer1 to iSer2 by adding them to the set of atoms // marked by the given mask. If iSer1=iSer2=0 then all atoms // are selected. Each atom may be selected by a number of masks // simultaneously. void SelectAtoms ( int selHnd, int iSer1, int iSer2, SELECTION_KEY selKey=SKEY_OR // selection key ); // SelectAtoms(..) selects atoms with serial numbers given in // vector asn[0..nsn-1]. void SelectAtoms ( int selHnd, ivector asn, int nsn, SELECTION_KEY selKey=SKEY_OR // selection key ); // UnselectAtoms(..) clears the specified mask for atoms in // the serial number range of iSer1 to iSer2. If iSer1=iSer2=0 // then all atoms are cleared of the specified mask. If selHnd // is set to 0, then the atoms are cleared of any mask. void UnselectAtoms ( int selHnd, int iSer1, int iSer2 ); // SelectAtom(..) selects a single atom according to the value // of selection key. If makeIndex is false, then the routine // does not update the selection index. This saves time, but // prevents GetSelIndex(..) from accessing all selected atoms. // In order to update the index after all single-atom selections // are done, use MakeSelIndex(selHnd) found next. void SelectAtom ( int selHnd, PAtom A, SELECTION_KEY selKey=SKEY_OR, bool makeIndex=true ); // SelectResidue(..), SelectChain(..) and SelectModel(..) // select a single residue, chain or model, or all their // hierarchical descendants depending on the value of sType // (i.e. atoms, residues (in chain and model) and chains // (in model only). Ascending hierarchical objects should be // selected explicitely, e.g. atom->GetResidue()->SelectResidue(..) void SelectResidue ( int selHnd, PResidue Res, SELECTION_TYPE sType, SELECTION_KEY sKey, bool makeIndex ); void SelectChain ( int selHnd, PChain chain, SELECTION_TYPE sType, SELECTION_KEY sKey, bool makeIndex ); void SelectModel ( int selHnd, PModel mdl, SELECTION_TYPE sType, SELECTION_KEY sKey, bool makeIndex ); // MakeSelIndex(.) calculates selection index for selection // adressed by selHnd. All selection functions except the // SelectAtom(..) above, update selection index automatically. // This function is for use after a series of calls to // SelectAtom(..) with makeIndex parameter set false. This // combination of SelectAtom - MakeSelIndex considerably saves CPU // at extensive selections. // MakeSelIndex(.) returns the number of selected objects. int MakeSelIndex ( int selHnd ); void MakeAllSelIndexes(); // Selecting by atom ID, space condition (a sphere) and some // other bits. void SelectAtoms ( int selHnd, // must be obtained from NewSelection() int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; "*" // means 'any chain' (in selected // model(s)) int ResNo1, // starting residue sequence number cpstr Ins1, // starting residue insertion code; "*" // means 'any code' int ResNo2, // ending residue sequence number. cpstr Ins2, // ending residue insertion code; "*" // means 'any code'. Combination of // ResNo1=ResNo2=ANY_RES and // Ins1=Ins2="*" means 'any residue' // (in selected chain(s)) cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means 'any // residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in selected // residue(s)) cpstr Elements, // may be several element types // 'H,C,O,CU'; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means // 'any alternative location' cpstr Segments, // may be several segment IDs // like "S1,S2,A234"; "*" means // 'any segment' cpstr Charges, // may be several charges like // "+1,-2, "; "*" means 'any charge' realtype occ1, // lowest occupancy realtype occ2, // highest occupancy; occ1=occ2<0.0 // means "any occupancy" realtype x0, // reference x-point realtype y0, // reference y-point realtype z0, // reference z-point realtype d0, // selection distance from the // reference point; d0<=0.0 // means "any distance" and values // of x0, y0 and z0 are ignored SELECTION_KEY selKey=SKEY_OR // selection key ); // Selecting by just atom ID, no other conditions void SelectAtoms ( int selHnd, // must be obtained from NewSelection() int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; "*" // means 'any chain' (in selected // model(s)) int ResNo1, // starting residue sequence number cpstr Ins1, // starting residue insertion code; "*" // means 'any code' int ResNo2, // ending residue sequence number. cpstr Ins2, // ending residue insertion code; "*" // means 'any code'. Combination of // ResNo1=ResNo2=ANY_RES and // Ins1=Ins2="*" means 'any residue // number' (in selected chain(s)) cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means 'any // residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in selected // residue(s)) cpstr Elements, // may be several element types // "H,C,O,CU"; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means // 'any alternative location' SELECTION_KEY selKey=SKEY_OR // selection key ); // Selecting by integer User-Defined Data void SelectUDD ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle int selMin, // lower selection boundary int selMax, // upper selection boundary SELECTION_KEY sKey // selection key ); void SelectUDD ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle realtype selMin, // lower selection boundary realtype selMax, // upper selection boundary SELECTION_KEY sKey // selection key ); void SelectUDD ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle cpstr selStr, // selection string int cmpRule, // comparison rule SELECTION_KEY sKey // selection key ); // Selecting a sphere void SelectSphere ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX realtype x, // x-coordinate of the sphere's center realtype y, // y-coordinate of the sphere's center realtype z, // z-coordinate of the sphere's center realtype r, // radius of the sphere SELECTION_KEY sKey=SKEY_OR // selection key ); // Selecting a cylinder void SelectCylinder ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX realtype x1, // x-coordinate of the cylinder axis' 1st end realtype y1, // y-coordinate of the cylinder axis' 1st end realtype z1, // z-coordinate of the cylinder axis' 1st end realtype x2, // x-coordinate of the cylinder axis' 2nd end realtype y2, // y-coordinate of the cylinder axis' 2nd end realtype z2, // z-coordinate of the cylinder axis' 2nd end realtype r, // radius of the cylinder SELECTION_KEY sKey=SKEY_OR // selection key ); // Selecting all atoms on a given distance from a plane void SelectSlab ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX realtype a, // a-parameter of the plane ax+by+cz=d realtype b, // b-parameter of the plane ax+by+cz=d realtype c, // c-parameter of the plane ax+by+cz=d realtype d, // d-parameter of the plane ax+by+cz=d realtype r, // distance to the plane SELECTION_KEY sKey=SKEY_OR // selection key ); // Selecting all atoms on a given distance from already selected void SelectNeighbours ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX PPAtom sA, // array of already selected atoms int alen, // length of A realtype d1, // minimal distance to already selected atoms realtype d2, // maximal distance to already selected atoms SELECTION_KEY sKey=SKEY_OR // selection key ); int GetSelLength ( int selHnd ); // Getting an array of atoms selected for a certain mask void GetSelIndex ( int selHnd, // selection mask PPAtom & SelAtom, // continuous index of selected // atoms; application must not // dispose either index or atoms int & nSelAtoms // length of index // [0..nSelectedAtoms-1] ); // Getting an array of residues selected for a certain mask void GetSelIndex ( int selHnd, // selection mask PPResidue & SelResidues, // continuous index of selected // residues; application must // not dispose either index or // residues int & nSelResidues // length of index // [0..nSelResidues-1] ); // Getting an array of chains selected for a certain mask void GetSelIndex ( int selHnd, // selection mask PPChain & SelChains, // continuous index of selected // chains; application must not // dispose either index or chains int & nSelChains // length of index // [0..nSelChains-1] ); // Getting an array of models selected for a certain mask void GetSelIndex ( int selHnd, // selection mask PPModel & SelModels, // continuous index of selected // models; application must not // dispose either index or models int & nSelModels // length of index // [0..nSelModels-1] ); void GetAtomStatistics ( int selHnd, RAtomStat AS ); // =============== General selection functions ================ // Selecting by atom ID, space condition (a sphere) and some // other bits. void Select ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; "*" // means 'any chain' (in selected // model(s)) int ResNo1, // starting residue sequence number cpstr Ins1, // starting residue insertion code; "*" // means 'any code' int ResNo2, // ending residue sequence number. cpstr Ins2, // ending residue insertion code; "*" // means 'any code'. Combination of // ResNo1=ResNo2=ANY_RES and // Ins1=Ins2="*" means 'any residue' // (in selected chain(s)) cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means // 'any residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in selected // residue(s)) cpstr Elements, // may be several element types // 'H,C,O,CU'; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means // 'any alternative location' cpstr Segments, // may be several segment IDs like // "S1,S2,A234"; "*" means // 'any segment' cpstr Charges, // may be several charges like // "+1,-2, "; "*" means 'any charge' realtype occ1, // lowest occupancy realtype occ2, // highest occupancy; occ1=occ2<0.0 // means "any occupancy" realtype x0, // reference x-point realtype y0, // reference y-point realtype z0, // reference z-point realtype d0, // selection distance from the // reference point; d0<=0.0 // means "any distance" and values // of x0, y0 and z0 are ignored SELECTION_KEY sKey=SKEY_OR // selection key ); // Selecting by just atom ID, no other conditions void Select ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; "*" // means 'any chain' (in selected // model(s)) int ResNo1, // starting residue sequence number cpstr Ins1, // starting residue insertion code; "*" // means 'any code' int ResNo2, // ending residue sequence number. cpstr Ins2, // ending residue insertion code; "*" // means 'any code'. Combination of // ResNo1=ResNo2=ANY_RES and // Ins1=Ins2="*" means 'any residue // number' (in selected chain(s)) cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means // 'any residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in selected // residue(s)) cpstr Elements, // may be several element types // "H,C,O,CU"; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means // 'any alternative location' SELECTION_KEY sKey=SKEY_OR // selection key ); // Selecting by coordinate ID. // Examples: // // 1. /mdl/chn/s1.i1-s2.i2/at[el]:aloc // 2. /mdl/chn/*(res).ic /at[el]:aloc // 3. chn/*(res).ic /at[el]:aloc // 4. s1.i1-s2.i2/at[el]:aloc // 5. s1.i1 /at[el]:aloc // 6. /mdl // 7. chn // 8. s1.i1-s2.i2 // 9. (res) // 10. at[el]:aloc // 11. chn//[el] // // mdl - the model's serial number or 0 or '*' for any model // (default). // chn - the chain ID or list of chains 'A,B,C' or '*' for // any chain (default). // s1,s2 - the starting and ending residue sequence numbers // or '*' for any sequence number (default). // i1,i2 - the residues insertion codes or '*' for any // insertion code. If the sequence number other than // '*' is specified, then insertion code defaults to "" // (no insertion code), otherwise the default is '*'. // at - atom name or list of atom names 'CA,N1,O' or '*' // for any atom name (default) // el - chemical element name or list of chemical element // names 'C,N,O' or '*' for any chemical element name // (default) // aloc - the alternative location indicator or '*' for any // alternate location. If the atom name and chemical // element name is specified (both may be '*'), then // the alternative location indicator defaults to "" // (no alternate location), otherwise the default is // '*'. // // All spaces are ignored. // // Returns -1 if numerical format of model is wrong, -2 if // numerical format for sequence number is wrong, and 0 // otherwise. int Select ( int selHnd, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX cpstr CID, // coordinate ID SELECTION_KEY sKey // selection key ); // Propagating the selection up and down coordinate hierarchy void Select ( int selHnd1, // must be obtained from NewSelection() SELECTION_TYPE sType, // selection type STYPE_XXXXX int selHnd2, // must be obtained from NewSelection() // and have been used for selection SELECTION_KEY sKey=SKEY_OR // selection key ); void SelectProperty ( int selHnd, // must be obtained from NewSelection() SELECTION_PROPERTY propKey, // property key SELPROP_XXXXXXX SELECTION_TYPE sType, // selection type STYPE_XXXXX SELECTION_KEY sKey // selection key ); // In SelectDomain, domainRange is of the following format: // "*", "(all)" - take all file // "-" - take chain without chain ID // "a:Ni-Mj,b:Kp-Lq,..." - take chain a residue number N // insertion code i to residue numberM // insertion code j plus chain b // residue number K insertion code p to // residue number L insertion code q // and so on. // "a:,b:..." - take whole chains a and b and so on // "a:,b:Kp-Lq,..." - any combination of the above. int SelectDomain ( int selHnd, cpstr domainRange, SELECTION_TYPE sType, SELECTION_KEY sKey, int modelNo=1 ); void DeleteSelObjects ( int selHnd ); protected : // --- SELECTION DATA NOT FOR PUBLIC ACCESS int nSelections; // number of selections PPMask mask; // vector of selections SELECTION_TYPE *selType; // vector of selection types ivector nSelItems; // numbers of selected items PPMask * selection; // vector of selected items // --------------- Stream I/O ----------------------------- void write ( io::RFile f ); void read ( io::RFile f ); void InitSelManager(); void SelectAtom ( PAtom atm, int maskNo, SELECTION_KEY sKey, int & nsel ); void SelectObject ( SELECTION_TYPE sType, PAtom atm, int maskNo, SELECTION_KEY sKey, int & nsel ); void SelectObject ( PMask object, int maskNo, SELECTION_KEY sKey, int & nsel ); void MakeSelIndex ( int selHnd, SELECTION_TYPE sType, int nsel ); void ResetManager(); PMask GetSelMask ( int selHnd ); }; } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_math_.cpp0000644000175000017500000001165713271367640016253 0ustar maartenmaarten// $Id: mmdb_math.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 11.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Math // ~~~~~~~~~ // **** Functions : mmdb::math::GetTorsion // ~~~~~~~~~~~ mmdb::math::GetAngle // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include "mmdb_math_.h" namespace mmdb { namespace math { // -------------------------------------------------------------- realtype GetTorsion ( rvector U, rvector W, rvector V ) { // U W V // o<----o----->o----->o // realtype A[3],B[3],C[3],Wmag,S,T; A[0] = U[1]*W[2] - W[1]*U[2]; A[1] = U[2]*W[0] - W[2]*U[0]; A[2] = U[0]*W[1] - W[0]*U[1]; B[0] = V[1]*W[2] - W[1]*V[2]; B[1] = V[2]*W[0] - W[2]*V[0]; B[2] = V[0]*W[1] - W[0]*V[1]; C[0] = A[1]*B[2] - B[1]*A[2]; C[1] = A[2]*B[0] - B[2]*A[0]; C[2] = A[0]*B[1] - B[0]*A[1]; Wmag = sqrt(W[0]*W[0]+W[1]*W[1]+W[2]*W[2]); S = C[0]*W[0] + C[1]*W[1] + C[2]*W[2]; T = A[0]*B[0] + A[1]*B[1] + A[2]*B[2]; T *= Wmag; if ((S==0.0) && (T==0.0)) return NO_TORSION; else return atan2(S,T); } realtype GetAngle ( rvector v1, rvector v2 ) { realtype l1,l2; l1 = v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]; if (l1==0.0) l1 = 1.0; l2 = v2[0]*v2[0] + v2[1]*v2[1] + v2[2]*v2[2]; if (l2==0.0) l2 = 1.0; return acos((v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])/sqrt(l1*l2)); } #define nCombMax 500 realtype Combinations ( int n, int m ) { // 0<=n<=nCombMax, 0<=m<=n realtype P[nCombMax+1]; int i,j; if ((m<0) || (m>n)) return 0.0; if ((m==0) || (m==n)) return 1.0; if ((m==1) || (m==n-1)) return realtype(n); P[0] = 1.0; P[1] = 3.0; P[2] = 3.0; P[3] = 1.0; for (i=4;i<=n;i++) { P[i] = 1.0; for (j=i-1;j>0;j--) P[j] += P[j-1]; } return P[m]; } realtype log1mx ( realtype x ) { // Calculates precisely log(1-x) for x<1, including // very small x realtype z,z1,z2,n; if (x>=1.0-10.0*MachEps) z = -MaxReal; else if (fabs(x)>1.0e-8) z = log(1.0-x); else { z1 = x; z = 0.0; n = 1.0; do { z2 = z; z -= z1/n; z1 *= x; n += 1.0; } while (z!=z2); } return z; } realtype expc ( realtype x ) { // Calculates precisely 1 - exp(x) for any x including // very small values realtype z,z1,z2,n; if (x>LnMaxReal) z = -MaxReal; else if (x<-LnMaxReal) z = 1.0; else if (fabs(x)>1.0e-8) z = 1.0 - Exp(x); else { z1 = x; z = x; n = 1.0; do { z2 = z; n += 1.0; z1 *= x/n; z += z1; } while (z!=z2); z = -z; } return z; } realtype expc1mx ( realtype x, realtype y ) { // Calculates precisely 1-(1-x)**y including very small x and // very large y realtype z,z1,z2,n,s; // Calculate (1-x)**y as exp(y*log(1-x)). Get log(1-x) first: if (x>1.0e-8) z = log(1.0-x); else { z1 = x; z = 0.0; n = 1.0; do { z2 = z; z -= z1/n; z1 *= x; n += 1.0; } while (z!=z2); } // Now calculate 1 - exp(y*log(1-x)) : z *= y; if (fabs(z)>1.0e-8) s = 1.0 - exp(z); else { z1 = z; s = z; n = 1.0; do { z2 = s; n += 1.0; z1 *= z/n; s += z1; } while (s!=z2); s = -s; } return s; } } } mmdb2-2.0.20/mmdb2/mmdb_mask.h0000644000175000017500000000547413271367640015563 0ustar maartenmaarten// $Id: mmdb_mask.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_Mask // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : mmdb::Mask ( atom selection mask ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_Mask__ #define __MMDB_Mask__ #include "mmdb_io_stream.h" namespace mmdb { // ========================== Mask ============================= DefineClass(Mask); DefineStreamFunctions(Mask); class Mask : public io::Stream { public : Mask (); Mask ( io::RPStream Object ); ~Mask(); void SetMaskBit ( int BitNo ); void NewMask ( PPMask Mask, int nMasks ); void CopyMask ( PMask Mask ); // this = Mask void SetMask ( PMask Mask ); // this = this | Mask void RemoveMask ( PMask Mask ); // this = this & (~Mask) void SelMask ( PMask Mask ); // this = this & Mask void XadMask ( PMask Mask ); // this = this ^ Mask void ClearMask (); // this = NULL void NegMask (); // this = ~this bool CheckMask ( PMask Mask ); // true if the bit is on bool isMask (); // true if any mask bit is on inline int getLength() { return mlen; } pstr Print ( pstr S ); // returns binary string void write ( io::RFile f ); void read ( io::RFile f ); protected : int mlen; wvector m; void InitMask(); void Expand ( int n ); }; } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_math_rand.cpp0000644000175000017500000001344313271367640017113 0ustar maartenmaarten// $Id: mmdb_math_rand.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Rand // ~~~~~~~~~ // **** Classes : RandomNumber ( random number generator ) // ~~~~~~~~~ // // (C) E. Krissinel 1997-2013 // // ================================================================= // #include #include "mmdb_math_rand.h" namespace mmdb { namespace math { // =================== RandomNumber ========================== RandomNumber::RandomNumber ( long IJ, long KL ) { Init ( IJ,KL ); } void RandomNumber::Init ( long IJ, long KL ) { long i,j,k,l,m, ii,jj; realtype s,t; iset = 0; gset = 0.0; if ((IJ<0) || (IJ>_RN_MAX_IJ) || (KL<0) || (KL>_RN_MAX_KL)) return; i = mod(IJ/177,177) + 2; j = mod(IJ,177) + 2; k = mod(KL/169,178) + 1; l = mod(KL,169); for (ii=0;ii<97;ii++) { s = 0.0; t = 0.5; for (jj=1;jj<=24;jj++) { m = mod(mod(i*j,179)*k,179); i = j; j = k; k = m; l = mod(53*l+1,169); if (mod(l*m,64)>=32) s += t; t *= 0.5; } U[ii] = s; } C = 362436.0 / 16777216.0; CD = 7654321.0 / 16777216.0; CM = 16777213.0 / 16777216.0; I97 = 96; J97 = 32; } // uniform [0..1] random number generator realtype RandomNumber::random() { realtype uni; uni = U[I97] - U[J97]; if (uni<0.0) uni += 1.0; U[I97] = uni; I97--; if (I97<0) I97 = 96; J97--; if (J97<0) J97 = 96; C -= CD; if (C<0.0) C += CM; uni -= C; if (uni<0.0) uni += 1.0; return uni; } // uniform [-1..1] random number generator realtype RandomNumber::srandom() { realtype uni; uni = U[I97] - U[J97]; if (uni<0.0) uni += 1.0; U[I97] = uni; I97--; if (I97<0) I97 = 96; J97--; if (J97<0) J97 = 96; C -= CD; if (C<0.0) C += CM; uni -= C; if (uni<0.0) uni += 1.0; return 2.0*uni - 1.0; } // gaussian random numbers realtype RandomNumber::gauss_rnd() { realtype v1,v2,r,fac; if (iset==0) { do { v1 = srandom(); v2 = srandom(); r = v1*v1 + v2*v2; } while ((r>=1.0) || (r==0.0)); fac = sqrt(-2.0*log(r)/r); gset = v1*fac; iset = 1; return v2*fac; } else { iset = 0; return gset; } } void RandomNumber::write ( io::RFile f ) { int Version=1; f.WriteFile ( &Version,sizeof(Version) ); f.WriteFile ( &I97 ,sizeof(I97) ); f.WriteFile ( &J97 ,sizeof(J97) ); f.WriteFile ( U ,sizeof(U) ); f.WriteFile ( &C ,sizeof(C) ); f.WriteFile ( &CD ,sizeof(CD) ); f.WriteFile ( &CM ,sizeof(CM) ); f.WriteFile ( &gset ,sizeof(gset) ); f.WriteFile ( &iset ,sizeof(iset) ); } void RandomNumber::read ( io::RFile f ) { int Version; f.ReadFile ( &Version,sizeof(Version) ); f.ReadFile ( &I97 ,sizeof(I97) ); f.ReadFile ( &J97 ,sizeof(J97) ); f.ReadFile ( U ,sizeof(U) ); f.ReadFile ( &C ,sizeof(C) ); f.ReadFile ( &CD ,sizeof(CD) ); f.ReadFile ( &CM ,sizeof(CM) ); f.ReadFile ( &gset ,sizeof(gset) ); f.ReadFile ( &iset ,sizeof(iset) ); } } // namespace math } // namespace mmdb /* static int m1 = 259200; static int ia1 = 7141; static int ic1 = 54773; static realtype rm1 = 1.0/259200.0; static int m2 = 134456; static int ia2 = 8121; static int ic2 = 28411; static realtype rm2 = 1.0/134456.0; static int m3 = 243000; static int ia3 = 4561; static int ic3 = 51349; static int ix1 = 0; static int ix2 = 0; static int ix3 = 0; static realtype R[97]; void randomize ( int iseed ) { int j; RndInit = True; ix1 = mod(ic1-iseed,m1); ix1 = mod(ia1*ix1+ic1,m1); ix2 = mod(ix1,m2); ix1 = mod(ia1*ix1+ic1,m1); ix3 = mod(ix1,m3); for (j=0;j<97;j++) { ix1 = mod(ia1*ix1+ic1,m1); ix2 = mod(ia2*ix2+ic2,m2); R[j] = (ix1+ix2*rm2)*rm1; } } realtype rand() { int j; realtype rnd; if (!RndInit) randomize(); ix1 = mod(ia1*ix1+ic1,m1); ix2 = mod(ia2*ix2+ic2,m2); ix3 = mod(ia3*ix3+ic3,m3); j = 1 + (97*ix3)/m3; j = IMax(j,1); j = IMin(j,97); rnd = R[j-1]; R[j] = (ix1+ix2*rm2)*rm1; return rnd; } */ // =========================================================== // End of Random_N mmdb2-2.0.20/mmdb2/mmdb_atom.h0000644000175000017500000007271413271367640015571 0ustar maartenmaarten// $Id: mmdb_atom.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2015. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 09.03.16 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Atom // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Atom ( atom class ) // ~~~~~~~~~ mmdb::Residue ( residue class ) // **** Functions: mmdb::BondAngle // ~~~~~~~~~~ // // Copyright (C) E. Krissinel 2000-2016 // // ================================================================= // #ifndef __MMDB_Atom__ #define __MMDB_Atom__ #include "mmdb_io_stream.h" #include "mmdb_uddata.h" #include "mmdb_utils.h" #include "mmdb_defs.h" namespace mmdb { // ====================== Atom ========================== // constants for the WhatIsSet field enum ASET_FLAG { ASET_Coordinates = 0x00000001, ASET_Occupancy = 0x00000002, ASET_tempFactor = 0x00000004, ASET_CoordSigma = 0x00000010, ASET_OccSigma = 0x00000020, ASET_tFacSigma = 0x00000040, ASET_Anis_tFac = 0x00000100, ASET_Anis_tFSigma = 0x00001000, ASET_Charge = 0x00000080, ASET_All = 0x000FFFFF }; const int ATOM_NoSeqNum = MinInt4; extern bool ignoreSegID; extern bool ignoreElement; extern bool ignoreCharge; extern bool ignoreNonCoorPDBErrors; extern bool ignoreUnmatch; DefineStructure(AtomStat); struct AtomStat { public : int nAtoms; // number of atoms in statistics realtype xmin,ymin,zmin; // minimums of coordinates realtype xmax,ymax,zmax; // maximums of coordinates realtype xm ,ym ,zm; // mediums of coordinates realtype xm2 ,ym2 ,zm2; // square mediums of coordinates realtype occ_min,occ_max; // minimum/maximum occupancy realtype occ_m ,occ_m2; // medium and square medium occupancy realtype tFmin,tFmax; // minimum/maximum temperature factor realtype tFm ,tFm2; // medium and sq. med. temp. factor realtype u11_min,u11_max; // minimums and realtype u22_min,u22_max; // maximums of realtype u33_min,u33_max; // anisotropic realtype u12_min,u12_max; // temperature realtype u13_min,u13_max; // factors realtype u23_min,u23_max; realtype u11_m,u11_m2; // mediums and realtype u22_m,u22_m2; // square mediums of realtype u33_m,u33_m2; // anisotropic realtype u12_m,u12_m2; // temperature realtype u13_m,u13_m2; // factors realtype u23_m,u23_m2; word WhatIsSet; // mask field void Init (); void Finish(); realtype GetMaxSize(); private : bool finished; }; DefineStructure(AtomBondI); struct AtomBondI { int index; //!< bonded atom index byte order; //!< bond order }; DefineStructure(AtomBond); struct AtomBond { PAtom atom; //!< bonded atom pointer byte order; //!< bond order }; DefineFactoryFunctions(Atom); class Atom : public UDData { friend class Residue; friend class Model; friend class Root; friend class CoorManager; friend class SelManager; public : int serNum; //!< serial number AtomName name; //!< atom name (ALIGNED) AtomName label_atom_id; //!< assigned atom name (not aligned) AltLoc altLoc; //!< alternative location indicator ("" for none) SegID segID; //!< segment identifier Element element; //!< element symbol (ALIGNED TO RIGHT) EnergyType energyType; //!< energy type (without spaces) PResidue residue; //!< reference to residue realtype x,y,z; //!< orthogonal coordinates in angstroms realtype occupancy; //!< occupancy realtype tempFactor; //!< temperature factor realtype charge; //!< charge on the atom realtype sigX,sigY,sigZ; //!< standard deviations of the coords realtype sigOcc; //!< standard deviation of occupancy realtype sigTemp; //!< standard deviation of temp. factor realtype u11,u22,u33; //!< anisotropic temperature realtype u12,u13,u23; /// factors realtype su11,su22,su33; //!< standard deviations of realtype su12,su13,su23; /// anisotropic temperature factors bool Het; //!< indicator of het atom bool Ter; //!< chain terminator word WhatIsSet; //!< mask field /// 0x0001 atomic coordinates /// 0x0002 occupancy /// 0x0004 temperature factor /// 0x0010 coordinate standard deviations /// 0x0020 deviation of occupancy /// 0x0040 deviation of temperature factor /// 0x0100 anisotropic temperature factors /// 0x1000 anis. temp. fact-s st-d deviations Atom (); Atom ( PResidue res ); Atom ( io::RPStream Object ); ~Atom(); void SetResidue ( PResidue res ); void PDBASCIIDump ( io::RFile f ); void MakeCIF ( mmcif::PData CIF ); // AddBond(...) adds a bond to the atom, that is a pointer // to the bonded atom and the bond order. nAdd_bonds allows // one to minimize the memory reallocations, if number of // bonds is known apriori: Atom adds space for nAdd_bonds // if currently allocated space is exchausted. // Return: <=0 - error: bond_atom is already "bonded" // >0 - Ok, returns current number of bonds int AddBond ( PAtom bond_atom, int bond_order, int nAdd_bonds=1 ); int GetNBonds(); // This GetBonds(..) returns pointer to the Atom's // internal Bond structure, IT MUST NOT BE DISPOSED. void GetBonds ( RPAtomBond atomBond, int & nAtomBonds ); void FreeBonds(); // This GetBonds(..) disposes AtomBondI, if it was not set // to NULL, allocates AtomBondI[nAtomBonds] and returns its // pointer. AtomBondI MUST BE DISPOSED BY APPLICATION. void GetBonds ( RPAtomBondI atomBondI, int & nAtomBonds ); // This GetBonds(..) does not dispose or allocate AtomBondI. // It is assumed that length of AtomBondI is sufficient to // accomodate all bonded atoms. void GetBonds ( PAtomBondI atomBondI, int & nAtomBonds, int maxlength ); // ConvertPDBxxxxxx() gets data from the PDB ASCII xxxxxx // record (xxxxxx stands for ATOM, SIGATM, ANISOU, SIGUIJ, // TER or HETATM). // These functions DO NOT check the xxxxxx keyword and // do not decode the chain and residue parameters! These // must be treated by the calling process, see // CMMDBFile::ReadPDBAtom(). // The atom reference is updated in the corresponding // residue. ERROR_CODE ConvertPDBATOM ( int ix, cpstr S ); ERROR_CODE ConvertPDBSIGATM ( int ix, cpstr S ); ERROR_CODE ConvertPDBANISOU ( int ix, cpstr S ); ERROR_CODE ConvertPDBSIGUIJ ( int ix, cpstr S ); ERROR_CODE ConvertPDBTER ( int ix, cpstr S ); ERROR_CODE ConvertPDBHETATM ( int ix, cpstr S ); ERROR_CODE GetCIF ( int ix, mmcif::PLoop Loop, mmcif::PLoop LoopAnis ); bool RestoreElementName(); bool MakePDBAtomName(); void SetAtomName ( int ix, // index int sN, // serial number const AtomName aName, // atom name const AltLoc aLoc, // alternative location const SegID sID, // segment ID const Element eName ); // element name // This only renames the atom void SetAtomName ( const AtomName atomName ); void SetElementName ( const Element elName ); void SetCharge ( cpstr chrg ); void SetCharge ( realtype chrg ); void SetAtomIndex ( int ix ); // don't use in your applications! void MakeTer(); // converts atom into 'ter' void SetCoordinates ( realtype xx, realtype yy, realtype zz, realtype occ, realtype tFac ); int GetModelNum (); pstr GetChainID (); pstr GetLabelAsymID (); pstr GetResName (); pstr GetLabelCompID (); int GetAASimilarity ( const ResName resName ); int GetAASimilarity ( PAtom A ); realtype GetAAHydropathy(); realtype GetOccupancy (); int GetSeqNum (); int GetLabelSeqID (); int GetLabelEntityID (); pstr GetInsCode (); int GetSSEType (); // works only after SSE calculations pstr GetAtomName () { return name; } pstr GetElementName () { return element; } pstr GetAtomCharge ( pstr chrg ); // GetChainCalphas(...) is a specialized function for quick // access to C-alphas of chain which includes given atom. // This function works faster than an equivalent implementation // through MMDB's selection procedures. // Parameters: // Calphas - array to accept pointers on C-alpha atoms // If Calphas!=NULL, then the function will // delete and re-allocate it. When the array // is no longer needed, the application MUST // delete it: delete[] Calphas; Deleting // Calphas does not delete atoms from MMDB. // nCalphas - integer to accept number of C-alpha atoms // and the length of Calphas array. // altLoc - alternative location indicator. By default // (""), maximum-occupancy locations are taken. void GetChainCalphas ( PPAtom & Calphas, int & nCalphas, cpstr altLoc = "" ); bool isTer () { return Ter; } bool isMetal (); bool isSolvent (); // works only for atom in a residue! bool isInSelection ( int selHnd ); bool isNTerminus (); bool isCTerminus (); void CalAtomStatistics ( RAtomStat AS ); realtype GetDist2 ( PAtom a ); realtype GetDist2 ( PAtom a, mat44 & tm ); // tm applies to 'a' realtype GetDist2 ( PAtom a, mat33 & r, vect3 & t );// tm applies to A realtype GetDist2 ( realtype ax, realtype ay, realtype az ); realtype GetDist2 ( mat44 & tm, // applies to 'this' realtype ax, realtype ay, realtype az ); realtype GetDist2 ( vect3 & xyz ); // GetCosine(a1,a2) calculates cosine of angle a1-this-a2, // i.e. that between vectors [a1,this] and [this,a2]. realtype GetCosine ( PAtom a1, PAtom a2 ); PResidue GetResidue (); PChain GetChain (); PModel GetModel (); int GetResidueNo(); void * GetCoordHierarchy(); // PRoot // GetAtomID(..) generates atom ID in the form // /m/c/r(rn).i/n[e]:a // where m - model number // c - chain ID // r - residue sequence number // rn - residue name // i - insertion code // n - atom name // e - chemical element specification // a - alternate location indicator // If any of the fields is undefined, it is replaced by // hyphen '-'. // No checks on the sufficiency of string buffer AtomID // is made. // GetAtomID returns AtomID. pstr GetAtomID ( pstr AtomID ); pstr GetAtomIDfmt ( pstr AtomID ); // ------- checking atom ID // CheckID(..) returns 1 if atom is identified, and 0 otherwise. // Parameters: // aname - atom name. It may or may not be aligned (as in // a PDB file), only first word of the name will // be taken ("CA", " CA" and " CA B" are all // considered as "CA"). aname may be set to NULL // or '*', then this parameter is ignored. // elname - element code. It will work only if element code // is supplied (which might not be the case if // the atom was created in a tricky way). elname // should be used to distinguih between, e.g. // "Ca" and "C_alpha"). elname may be set to NULL, // or '*', then this parameter is ignored. // aloc - the alternate location code. aloc may be set to // NULL or '*', then this parameter is ignored. // IMPORTANT: comparison is case-sensitive. // The atom is considered as identified, if all non-NULL // parameters do match. If all parameters are set NULL, any atom // is identified. // DEFAULT values correspond to 'any element' and // 'no alternate location code' // NOTE that " " is not an empty item. int CheckID ( const AtomName aname, const Element elname=NULL, const AltLoc aloc=pstr("") ); // CheckIDS(..) works exactly like CheckID(..), but it takes // the only parameter, the atom ID, which is of the form: // {name} {[element]} {:altcode} // Here {} means that the item may be omitted. Any item may be // represented by a wildcard '*', which means 'any value'. Just // absence of an item means 'empty', which makes sense only for // alternate location code. Missing name or element therefore // mean 'any name' or 'any element', correspondingly (same as a // wildcard). There should be no spaces in ID except for leading // spaces; any following space will terminate parsing. // The followings are perfectly valid IDs: // CA[C]:A (carbon C_alpha in location A) // CA[*]:A (either C_alpha or Ca in location A) // CA:A (same as above) // CA (either C_alpha or Ca with no location indicator) // CA[] (same as above) // CA[C]: (C_alpha with no location indicator) // [C] (any carbon with no location indicator) // [C]:* (any carbon with any location indicator) // *[C]:* (same as above) // :A (any atom in location A) // *[*]:A (same as above) // *[*]:* (any atom) // * (any atom with no alternate location indicator) int CheckIDS ( cpstr ID ); // ------- transform coordinates: x := m*x + v void Transform ( const mat33 & tm, vect3 & v ); void Transform ( const mat44 & tm ); void TransformCopy ( const mat44 & tm, realtype & xx, realtype & yy, realtype & zz ); void TransformCopy ( const mat44 & tm, vect3 & xyz ); void TransformSet ( const mat44 & tm, realtype xx, realtype yy, realtype zz ); // ------- user-defined data handlers int PutUDData ( int UDDhandle, int iudd ); int PutUDData ( int UDDhandle, realtype rudd ); int PutUDData ( int UDDhandle, cpstr sudd ); int GetUDData ( int UDDhandle, int & iudd ); int GetUDData ( int UDDhandle, realtype & rudd ); int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); int GetUDData ( int UDDhandle, pstr & sudd ); int GetIndex() { return index; } virtual void Copy ( PAtom atom ); // without references in // residues void SetCompactBinary(); // leaves only coordinates in binary files void write ( io::RFile f ); void read ( io::RFile f ); protected : int index; // index in the file int nBonds; // number of bonds in the lowest byte (!) PAtomBond Bond; // atom bonds void InitAtom (); void FreeMemory (); void StandardPDBOut ( cpstr Record, pstr S ); void GetData ( cpstr S ); ERROR_CODE CheckData ( cpstr S ); void GetStat ( realtype v, realtype & v_min, realtype & v_max, realtype & v_m, realtype & v_m2 ); void _setBonds ( PPAtom A ); // used only in Residue }; // ====================== Residue ========================== enum ALTLOC_FLAG { ALF_NoAltCodes = 0x00000000, ALF_EmptyAltLoc = 0x00000001, ALF_NoEmptyAltLoc = 0x00000002, ALF_Mess = 0x00000004, ALF_Occupancy = 0x00000008 }; enum SSE_FLAG { SSE_None = 0, SSE_Strand = 1, SSE_Bulge = 2, SSE_3Turn = 3, SSE_4Turn = 4, SSE_5Turn = 5, SSE_Helix = 6 }; DefineFactoryFunctions(Residue); class Residue : public UDData { friend class Atom; friend class Chain; friend class Root; public : ResName name; //!< residue name - all spaces cut ResName label_comp_id; //!< assigned residue name ChainID label_asym_id; //!< assigned chain Id InsCode insCode; //!< residue insertion code PChain chain; //!< reference to chain PPAtom atom; //!< array of atoms int seqNum; //!< residue sequence number int label_seq_id; //!< assigned residue sequence number int label_entity_id; //!< assigned entity id int index; //!< index in the chain int nAtoms; //!< number of atoms in the residue byte SSE; //!< SSE type Residue (); Residue ( PChain Chain_Owner ); Residue ( PChain Chain_Owner, const ResName resName, int sqNum, const InsCode ins ); Residue ( io::RPStream Object ); ~Residue(); void SetChain ( PChain Chain_Owner ); void SetResID ( const ResName resName, int sqNum, const InsCode ins ); void SetChainID ( const ChainID chID ); void PDBASCIIAtomDump ( io::RFile f ); void MakeAtomCIF ( mmcif::PData CIF ); PChain GetChain(); PModel GetModel(); int GetModelNum (); pstr GetChainID (); pstr GetLabelAsymID(); pstr GetResName (); // inline pstr GetResName() { return name; } pstr GetLabelCompID(); int GetAASimilarity ( const ResName resName ); int GetAASimilarity ( PResidue res ); realtype GetAAHydropathy(); void SetResName ( const ResName resName ); int GetSeqNum (); int GetLabelSeqID (); int GetLabelEntityID(); pstr GetInsCode (); int GetResidueNo (); int GetCenter ( realtype & x, realtype & y, realtype & z ); void * GetCoordHierarchy(); // PCMMDBFile void GetAtomStatistics ( RAtomStat AS ); void CalAtomStatistics ( RAtomStat AS ); pstr GetResidueID ( pstr ResidueID ); // GetAltLocations(..) returns the number of different // alternative locations in nAltLocs, the locations themselves // - in aLoc and the corresponding occupancies - in occupancy. // aLoc and occupancy are allocated dynamically; it is // responsibility of the application to deallocate aLoc prior // calling GetAltLocations(..) if they were previously allocated. // Either, the application is responsible for deallocating aLoc and // occupancy after use. // occupancy[i] may return -1.0 if occupancies were not read // from coordinate file. // alflag returns ALF_NoAltCodes if no alt codes was found, // otherwise the output is decoded according to bits: // ALF_EmptyAltLoc alternative locations include the // "no alt loc indicator" ("" for // Atom::altLoc). // This means that each atom that has alt locs // different of "", also includes one marked as // "". // ALF_NoEmptyAltLoc alternative locations do not include the // "no alt loc indicator" ("" for // Atom::altLoc). // This means that each atom has either "" // alt loc or at least two alt locs different // of "". // ALF_Mess incorrect residue: it mixes both // ""-including and not-""-including schemes // ALF_Occupancy warning that sum of occupancies for alt // located atoms differ from 1.0 by more // than 0.01. void GetAltLocations ( int & nAltLocs, PAltLoc & aLoc, rvector & occupancy, int & alflag ); int GetNofAltLocations(); bool isAminoacid (); bool isNucleotide (); int isDNARNA (); // 0(neither),1(DNA),2(RNA) bool isSugar (); bool isSolvent (); bool isModRes (); bool isInSelection ( int selHnd ); bool isNTerminus (); bool isCTerminus (); // ------- checking residue ID // CheckID(..) returns 1 if residue is identified, and 0 otherwise. // Parameters: // sname - pointer to sequence number; if NULL then ignored. // inscode - insertion code; if NULL or '*' then ignored. // resname - residue name; if NULL or '*' then ignored. // IMPORTANT: comparison is case-sensitive. // The residue is considered as identified, if all non-NULL // parameters do match. If all parameters are set NULL, any // residue is identified. // DEFAULT values correspond to 'any residue name' and // 'no insertion code' // NOTE that " " is not an empty item. int CheckID ( int * snum, const InsCode inscode=pstr(""), const ResName resname=NULL ); // CheckIDS(..) works exactly like CheckID(..), but it takes // the only parameter, the residue ID, which is of the form: // {seqnum} {(name)} {.inscode} // Here {} means that the item may be omitted. Any item may be // represented by a wildcard '*', which means 'any value'. Just // absence of a value means 'empty', which is meaningful only for // the insertion code. Missing sequence number or residue name // therefore mean 'any sequence number' or 'any residue name', // correspondingly (same as a wildcard). There should be no // spaces in ID except for leading spaces; any following space will // terminate parsing. The followings are perfectly valid IDs: // 27(ALA).A (residue 27A ALA) // 27().A (residue 27A) // 27(*).A (same as above) // 27.A (same as above) // 27 (residue 27) // 27(). (same as above) // (ALA) (any ALA without insertion code) // (ALA). (same as above) // (ALA).* (any ALA) // *(ALA).* (any ALA) // .A (any residue with insertion code A) // *(*).A (same as above) // *(*).* (any residue) // * (any residue with no insertion code) int CheckIDS ( cpstr ID ); // -------------------- Extracting atoms ---------------------- int GetNumberOfAtoms (); int GetNumberOfAtoms ( bool countTers ); PAtom GetAtom ( const AtomName aname, const Element elname=NULL, const AltLoc aloc=cpstr("") ); PAtom GetAtom ( int atomNo ); void GetAtomTable ( PPAtom & atomTable, int & NumberOfAtoms ); // GetAtomTable1(..) returns atom table without TER atoms and // without NULL atom pointers. NumberOfAtoms returns the actual // number of atom pointers in atomTable. // atomTable is allocated withing the function. If it was // not set to NULL before calling the function, the latter will // attempt to deallocate it first. // The application is responsible for deleting atomTable, // however it must not touch atom pointers, i.e. use simply // "delete[] atomTable;". Never pass atomTable from GetAtomTable() // into this function, unless you set it to NULL before doing that. void GetAtomTable1 ( PPAtom & atomTable, int & NumberOfAtoms ); // --------------------- Deleting atoms ----------------------- int DeleteAtom ( const AtomName aname, const Element elname=NULL, const AltLoc aloc=cpstr("") ); int DeleteAtom ( int atomNo ); int DeleteAllAtoms(); // DeleteAltLocs() leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted atoms. The atom // table remains untrimmed, so that nAtoms are wrong until that // is done. Tables are trimmed by FinishStructEdit() or // explicitely. int DeleteAltLocs (); void TrimAtomTable (); // ---------------------- Adding atoms ------------------------ // AddAtom(..) adds atom to the residue. If residue is associated // with a coordinate hierarchy, and atom 'atm' is not, the latter // is checked in automatically. If atom 'atm' belongs to any // coordinate hierarchy (even though that of the residue), it is // *copied* rather than simply taken over, and is checked in. // If residue is not associated with a coordinate hierarchy, all // added atoms will be checked in automatically once the residue // is checked in. int AddAtom ( PAtom atm ); // InsertAtom(..) inserts atom into the specified position of // the residue. If residue is associated with a coordinate // hierarchy, and atom 'atm' is not, the latter is checked in // automatically. If atom 'atm' belongs to any coordinate // hierarchy (even though that of the residue), it is *copied* // rather than simply taken over, and is checked in. // If residue is not associated with a coordinate hierarchy, all // added atoms will be checked in automatically once the residue // is checked in. int InsertAtom ( PAtom atm, int position ); // This version inserts before the atom with given name. If such // name is not found, the atom is appended to the end. int InsertAtom ( PAtom atm, const AtomName aname ); // -------------------------------------------------------------- void ApplyTransform ( const mat44 & TMatrix ); // transforms all // coordinates by // multiplying with // matrix TMatrix void MaskAtoms ( PMask Mask ); void UnmaskAtoms ( PMask Mask ); // ------- user-defined data handlers int PutUDData ( int UDDhandle, int iudd ); int PutUDData ( int UDDhandle, realtype rudd ); int PutUDData ( int UDDhandle, cpstr sudd ); int GetUDData ( int UDDhandle, int & iudd ); int GetUDData ( int UDDhandle, realtype & rudd ); int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); int GetUDData ( int UDDhandle, pstr & sudd ); bool isMainchainHBond ( PResidue res ); void Copy ( PResidue res ); void write ( io::RFile f ); void read ( io::RFile f ); protected : int AtmLen; // length of atom array bool Exclude; // used internally void InitResidue (); void FreeMemory (); int _AddAtom ( PAtom atm ); int _ExcludeAtom ( int kndex ); // 1: residue gets empty, // 0 otherwise void _copy ( PResidue res ); void _copy ( PResidue res, PPAtom atm, int & atom_index ); void ExpandAtomArray ( int nAdd ); void CheckInAtoms (); }; extern realtype BondAngle ( PAtom A, PAtom B, PAtom C ); } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_chain.cpp0000644000175000017500000021720313271367640016240 0ustar maartenmaarten// $Id: mmdb_chain.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 23.12.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Chain // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::ProModel ( a virtue of Model ) // ~~~~~~~~~ mmdb::DBReference ( DBREF records ) // mmdb::ChainContainer ( container of in-chain classes ) // mmdb::ContainerChain ( chain containered class template) // mmdb::SeqAdv ( SEQADV records ) // mmdb::SeqRes ( SEQRES records ) // mmdb::ModRes ( MODRES records ) // mmdb::HetRec ( HET records ) // mmdb::Chain ( chain class ) // // Copyright (C) E. Krissinel 2000-2015 // // ================================================================= // #include #include #include "mmdb_chain.h" #include "mmdb_model.h" #include "mmdb_manager.h" #include "mmdb_cifdefs.h" #include "mmdb_tables.h" namespace mmdb { // ================== ProModel ====================== MakeStreamFunctions(ProModel) // ============== ChainContainer ==================== PContainerClass ChainContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return ClassContainer::MakeContainerClass(ClassID); case ClassID_DBReference : return new DBReference ( chain ); case ClassID_SeqAdv : return new SeqAdv ( chain ); case ClassID_ModRes : return new ModRes ( chain ); case ClassID_Het : return new HetRec ( chain ); } } void ChainContainer::SetChain ( PChain Chain_Owner ) { int i; chain = Chain_Owner; for (i=0;iSetChain ( chain ); } cpstr ChainContainer::Get1stChainID() { int i; i = 0; if (Container) { while ((ichainID; else return NULL; } else return NULL; } void ChainContainer::MoveByChainID ( const ChainID chainID, PChainContainer ChainContainer ) { int i; for (i=0;ichainID,chainID)) { ChainContainer->AddData ( Container[i] ); Container[i] = NULL; } } } MakeStreamFunctions(ChainContainer) // ================ ContainerChain =================== ContainerChain::ContainerChain() : ContainerClass() { chain = NULL; chainID[0] = char(0); } ContainerChain::ContainerChain ( PChain Chain_Owner) : ContainerClass() { chain = Chain_Owner; if (chain) strcpy ( chainID,chain->GetChainID() ); else chainID[0] = char(0); } void ContainerChain::SetChain ( PChain Chain_Owner ) { chain = Chain_Owner; if (chain) strcpy ( chainID,chain->GetChainID() ); else strcpy ( chainID,"" ); } MakeStreamFunctions(ContainerChain) // ================ DBReference =================== DBReference::DBReference() : ContainerChain() { InitDBReference(); } DBReference::DBReference( PChain Chain_Owner ) : ContainerChain(Chain_Owner) { InitDBReference(); } DBReference::DBReference ( PChain Chain_Owner, cpstr S ) : ContainerChain(Chain_Owner) { InitDBReference(); ConvertPDBASCII ( S ); } DBReference::DBReference ( io::RPStream Object ) : ContainerChain(Object) { InitDBReference(); } DBReference::~DBReference() {} void DBReference::InitDBReference() { seqBeg = 0; strcpy ( insBeg ,"-" ); seqEnd = 0; strcpy ( insEnd ,"-" ); strcpy ( database ,"------" ); strcpy ( dbAccession,"--------" ); strcpy ( dbIdCode ,"------------" ); dbseqBeg = 0; strcpy ( dbinsBeg,"-" ); dbseqEnd = 0; strcpy ( dbinsEnd,"-" ); } void DBReference::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB DBREF line number N // from the class' data strcpy ( S,"DBREF" ); PadSpaces ( S,80 ); strcpy_n ( &(S[7]),chain->GetEntryID(),4 ); if (chain->chainID[0]) S[12] = chain->chainID[0]; PutIntIns ( &(S[14]),seqBeg,4,insBeg ); PutIntIns ( &(S[20]),seqEnd,4,insEnd ); strcpy_n ( &(S[26]),database ,6 ); strcpy_n ( &(S[33]),dbAccession,8 ); strcpy_n ( &(S[42]),dbIdCode ,12 ); PutIntIns ( &(S[55]),dbseqBeg,5,dbinsBeg ); PutIntIns ( &(S[62]),dbseqEnd,5,dbinsEnd ); } void DBReference::MakeCIF ( mmcif::PData CIF, int N ) { UNUSED_ARGUMENT(N); mmcif::PLoop Loop1,Loop2; int RC1,RC2; RC1 = CIF->AddLoop ( CIFCAT_STRUCT_REF_SEQ,Loop1 ); RC2 = CIF->AddLoop ( CIFCAT_STRUCT_REF ,Loop2 ); if ((RC1!=mmcif::CIFRC_Ok) || (RC2!=mmcif::CIFRC_Ok)) { // the category was (re)created, provide tags Loop1->AddLoopTag ( CIFTAG_NDB_PDB_ID_CODE ); Loop1->AddLoopTag ( CIFTAG_NDB_CHAIN_ID ); Loop1->AddLoopTag ( CIFTAG_SEQ_ALIGN_BEG ); Loop1->AddLoopTag ( CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE ); Loop1->AddLoopTag ( CIFTAG_SEQ_ALIGN_END ); Loop1->AddLoopTag ( CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE ); Loop1->AddLoopTag ( CIFTAG_NDB_DB_ACCESSION ); Loop1->AddLoopTag ( CIFTAG_DB_ALIGN_BEG ); Loop1->AddLoopTag ( CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE ); Loop1->AddLoopTag ( CIFTAG_DB_ALIGN_END ); Loop1->AddLoopTag ( CIFTAG_NDB_DB_ALIGN_END_INS_CODE ); Loop2->AddLoopTag ( CIFTAG_DB_NAME ); Loop2->AddLoopTag ( CIFTAG_DB_CODE ); } Loop1->AddString ( chain->GetEntryID(),true ); Loop1->AddString ( chain->chainID ,true ); Loop1->AddInteger ( seqBeg ); Loop1->AddString ( insBeg ,true ); Loop1->AddInteger ( seqEnd ); Loop1->AddString ( insEnd ,true ); Loop1->AddString ( dbAccession ,true ); Loop1->AddInteger ( dbseqBeg ); Loop1->AddString ( dbinsBeg ,true ); Loop1->AddInteger ( dbseqEnd ); Loop1->AddString ( dbinsEnd ,true ); Loop2->AddString ( database,true ); Loop2->AddString ( dbIdCode,true ); } ERROR_CODE DBReference::GetCIF ( mmcif::PData CIF, int & n ) { // GetCIF(..) must be always run without reference to Chain, // see CModel::GetCIF(..). mmcif::PLoop Loop1,Loop2; mmcif::PStruct Struct2; pstr F; int RC,ref_id1,ref_id2; CIF_MODE CIFMode; ERROR_CODE rc; Loop1 = CIF->GetLoop ( CIFCAT_STRUCT_REF_SEQ ); if (!Loop1) { n = -1; return Error_EmptyCIF; } if (n>=Loop1->GetLoopLength()) { n = -1; return Error_EmptyCIF; } // Determine the ChainID first and store it locally. It will // be used by CModel for generating chains and placing the // primary structure data BEFORE reading the coordinate section. CIFMode = CIF_NDB; F = Loop1->GetString ( CIFName(TAG_CHAIN_ID,CIFMode),n,RC ); if ((RC) || (!F)) { CIFMode = CIF_PDBX; F = Loop1->GetString ( CIFName(TAG_CHAIN_ID,CIFMode),n,RC ); } if ((!RC) && F) { strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); Loop1->DeleteField ( CIFName(TAG_CHAIN_ID,CIFMode),n ); } else strcpy ( chainID,"" ); rc = CIFGetInteger(seqBeg,Loop1,CIFName(TAG_SEQ_ALIGN_BEG,CIFMode),n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( insBeg,Loop1,CIFName(TAG_SEQ_ALIGN_BEG_INS_CODE,CIFMode), n,sizeof(InsCode),pstr(" ") ); rc = CIFGetInteger(seqEnd,Loop1,CIFName(TAG_SEQ_ALIGN_END,CIFMode),n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( insEnd,Loop1,CIFName(TAG_SEQ_ALIGN_END_INS_CODE,CIFMode), n,sizeof(InsCode),pstr(" ") ); CIFGetString ( dbAccession,Loop1,CIFName(TAG_DB_ACCESSION,CIFMode), n,sizeof(DBAcCode),pstr(" ") ); rc = CIFGetInteger(dbseqBeg,Loop1,CIFName(TAG_DB_ALIGN_BEG,CIFMode),n); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( dbinsBeg,Loop1,CIFName(TAG_DB_ALIGN_BEG_INS_CODE,CIFMode), n,sizeof(InsCode),pstr(" ") ); rc = CIFGetInteger(dbseqEnd,Loop1,CIFName(TAG_DB_ALIGN_END,CIFMode),n); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( dbinsEnd,Loop1,CIFName(TAG_DB_ALIGN_END_INS_CODE,CIFMode), n,sizeof(InsCode),pstr(" ") ); Loop2 = CIF->GetLoop ( CIFCAT_STRUCT_REF ); if (Loop2) { CIFGetString ( database,Loop2,CIFTAG_DB_NAME,n, sizeof(DBName) ,pstr(" ") ); CIFGetString ( dbIdCode,Loop2,CIFTAG_DB_CODE,n, sizeof(DBIdCode),pstr(" ") ); } else if (CIFMode==CIF_PDBX) { Struct2 = CIF->GetStructure ( CIFCAT_STRUCT_REF ); if (Struct2 && (!CIFGetInteger(ref_id1,Loop1,CIFTAG_REF_ID,n)) && (!CIFGetInteger(ref_id2,Struct2,CIFTAG_ID,false))) { if (ref_id1==ref_id2) { CIFGetString ( database,Struct2,CIFTAG_DB_NAME, sizeof(DBName) ,pstr(" ") ,false ); CIFGetString ( dbIdCode,Struct2,CIFTAG_DB_CODE, sizeof(DBIdCode),pstr(" "),false ); } } } n++; return Error_NoError; } ERROR_CODE DBReference::ConvertPDBASCII ( cpstr S ) { IDCode idCode; if (chain->chainID[0]) { if (S[12]!=chain->chainID[0]) return Error_WrongChainID; } else if (S[12]!=' ') { chain->chainID[0] = S[12]; chain->chainID[1] = char(0); } else chain->chainID[0] = char(0); strcpy ( idCode,chain->GetEntryID() ); if (idCode[0]) { if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) return Error_WrongEntryID; } else { GetString ( idCode,&(S[7]),4 ); chain->SetEntryID ( idCode ); } GetIntIns ( seqBeg,insBeg,&(S[14]),4 ); GetIntIns ( seqEnd,insEnd,&(S[20]),4 ); strcpy_ncs ( database ,&(S[26]),6 ); strcpy_ncs ( dbAccession ,&(S[33]),8 ); strcpy_ncs ( dbIdCode ,&(S[42]),12 ); GetIntIns ( dbseqBeg,dbinsBeg,&(S[55]),5 ); GetIntIns ( dbseqEnd,dbinsEnd,&(S[62]),5 ); return Error_NoError; } void DBReference::Copy ( PContainerClass DBRef ) { ContainerChain::Copy ( DBRef ); seqBeg = PDBReference(DBRef)->seqBeg; seqEnd = PDBReference(DBRef)->seqEnd; dbseqBeg = PDBReference(DBRef)->dbseqBeg; dbseqEnd = PDBReference(DBRef)->dbseqEnd; strcpy ( insBeg ,PDBReference(DBRef)->insBeg ); strcpy ( insEnd ,PDBReference(DBRef)->insEnd ); strcpy ( database ,PDBReference(DBRef)->database ); strcpy ( dbAccession,PDBReference(DBRef)->dbAccession ); strcpy ( dbIdCode ,PDBReference(DBRef)->dbIdCode ); strcpy ( dbinsBeg ,PDBReference(DBRef)->dbinsBeg ); strcpy ( dbinsEnd ,PDBReference(DBRef)->dbinsEnd ); } void DBReference::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &seqBeg ); f.WriteInt ( &seqEnd ); f.WriteInt ( &dbseqBeg ); f.WriteInt ( &dbseqEnd ); f.WriteTerLine ( insBeg ,false ); f.WriteTerLine ( insEnd ,false ); f.WriteTerLine ( database ,false ); f.WriteTerLine ( dbAccession,false ); f.WriteTerLine ( dbIdCode ,false ); f.WriteTerLine ( dbinsBeg ,false ); f.WriteTerLine ( dbinsEnd ,false ); } void DBReference::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &seqBeg ); f.ReadInt ( &seqEnd ); f.ReadInt ( &dbseqBeg ); f.ReadInt ( &dbseqEnd ); f.ReadTerLine ( insBeg ,false ); f.ReadTerLine ( insEnd ,false ); f.ReadTerLine ( database ,false ); f.ReadTerLine ( dbAccession,false ); f.ReadTerLine ( dbIdCode ,false ); f.ReadTerLine ( dbinsBeg ,false ); f.ReadTerLine ( dbinsEnd ,false ); } MakeStreamFunctions(DBReference) // ================ SeqAdv =================== SeqAdv::SeqAdv() : ContainerChain() { InitSeqAdv(); } SeqAdv::SeqAdv ( PChain Chain_Owner ) : ContainerChain(Chain_Owner) { InitSeqAdv(); } SeqAdv::SeqAdv ( PChain Chain_Owner, cpstr S ) : ContainerChain(Chain_Owner) { InitSeqAdv(); ConvertPDBASCII ( S ); } SeqAdv::SeqAdv ( io::RPStream Object ) : ContainerChain(Object) { InitSeqAdv(); } SeqAdv::~SeqAdv() { if (conflict) delete[] conflict; } void SeqAdv::InitSeqAdv() { strcpy ( resName ,"---" ); seqNum = 0; strcpy ( insCode ,"-" ); strcpy ( database ,"------" ); strcpy ( dbAccession,"---------" ); strcpy ( dbRes ,"---" ); dbSeq = 0; conflict = NULL; CreateCopy ( conflict,pstr(" ") ); } void SeqAdv::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB SEQADV line number N // from the class' data strcpy ( S,"SEQADV" ); PadSpaces ( S,80 ); strcpy_n ( &(S[7]) ,chain->GetEntryID(),4 ); strcpy_n ( &(S[12]),resName ,3 ); if (chain->chainID[0]) S[16] = chain->chainID[0]; PutIntIns ( &(S[18]),seqNum,4,insCode ); strcpy_n ( &(S[24]),database ,4 ); strcpy_n ( &(S[29]),dbAccession,9 ); strcpy_n ( &(S[39]),dbRes ,3 ); PutInteger ( &(S[43]),dbSeq ,5 ); strcpy_n ( &(S[49]),conflict,IMin(strlen(conflict),21) ); } ERROR_CODE SeqAdv::ConvertPDBASCII ( cpstr S ) { IDCode idCode; if (chain->chainID[0]) { if (S[16]!=chain->chainID[0]) return Error_WrongChainID; } else if (S[16]!=' ') { chain->chainID[0] = S[16]; chain->chainID[1] = char(0); } else chain->chainID[0] = char(0); strcpy ( idCode,chain->GetEntryID() ); if (idCode[0]) { if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) return Error_WrongEntryID; } else { GetString ( idCode,&(S[7]),4 ); chain->SetEntryID ( idCode ); } strcpy_ncs ( resName ,&(S[12]),3 ); GetIntIns ( seqNum,insCode,&(S[18]),4 ); strcpy_ncs ( database ,&(S[24]),4 ); strcpy_ncs ( dbAccession ,&(S[29]),9 ); strcpy_ncs ( dbRes ,&(S[39]),3 ); GetInteger ( dbSeq,&(S[43]),5 ); CreateCopy ( conflict,&(S[49]) ); CutSpaces ( conflict,SCUTKEY_END ); return Error_NoError; } void SeqAdv::MakeCIF ( mmcif::PData CIF, int N ) { UNUSED_ARGUMENT(N); mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_REF_SEQ_DIF,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_NDB_PDB_ID_CODE ); Loop->AddLoopTag ( CIFTAG_MON_ID ); Loop->AddLoopTag ( CIFTAG_NDB_PDB_CHAIN_ID ); Loop->AddLoopTag ( CIFTAG_SEQ_NUM ); Loop->AddLoopTag ( CIFTAG_NDB_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_NAME ); Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_ACCESSION_CODE ); Loop->AddLoopTag ( CIFTAG_DB_MON_ID ); Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_SEQ_NUM ); Loop->AddLoopTag ( CIFTAG_DETAILS ); } Loop->AddString ( chain->GetEntryID(),true ); Loop->AddString ( resName ,true ); Loop->AddString ( chain->chainID ,true ); Loop->AddInteger ( seqNum ); Loop->AddString ( insCode ,true ); Loop->AddString ( database ,true ); Loop->AddString ( dbAccession ,true ); Loop->AddString ( dbRes ,true ); Loop->AddInteger ( dbSeq ); Loop->AddString ( conflict ,true ); } ERROR_CODE SeqAdv::GetCIF ( mmcif::PData CIF, int & n ) { // GetCIF(..) must be always run without reference to Chain, // see CModel::GetCIF(..). mmcif::PLoop Loop; pstr F; int RC; Loop = CIF->GetLoop ( CIFCAT_STRUCT_REF_SEQ_DIF ); if (!Loop) { n = -1; return Error_EmptyCIF; } if (n>=Loop->GetLoopLength()) { n = -1; return Error_EmptyCIF; } // Determine the ChainID first and store it locally. It will // be used by CModel for generating chains and placing the // primary structure data BEFORE reading the coordinate section. F = Loop->GetString ( CIFTAG_NDB_PDB_CHAIN_ID,n,RC ); if ((!RC) && F) { strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); Loop->DeleteField ( CIFTAG_NDB_PDB_CHAIN_ID,n ); } else strcpy ( chainID,"" ); CIFGetString ( resName,Loop,CIFTAG_MON_ID,n,sizeof(ResName), pstr("UNK") ); CIFGetIntegerD ( seqNum,Loop,CIFTAG_SEQ_NUM ); CIFGetString ( insCode,Loop,CIFTAG_NDB_PDB_INS_CODE, n,sizeof(InsCode),pstr(" ") ); CIFGetString ( database,Loop,CIFTAG_NDB_SEQ_DB_NAME,n, sizeof(DBName),pstr(" ") ); CIFGetString ( dbAccession,Loop,CIFTAG_NDB_SEQ_DB_ACCESSION_CODE, n,sizeof(DBAcCode),pstr(" ") ); CIFGetString ( dbRes,Loop,CIFTAG_DB_MON_ID,n,sizeof(ResName), pstr(" ") ); CIFGetIntegerD ( dbSeq,Loop,CIFTAG_NDB_SEQ_DB_SEQ_NUM ); // if (CIFGetInteger1(dbSeq,Loop,CIFTAG_NDB_SEQ_DB_SEQ_NUM,n)) // dbSeq = MinInt4; F = Loop->GetString ( CIFTAG_DETAILS,n,RC ); if ((!RC) && F) { CreateCopy ( conflict,F ); Loop->DeleteField ( CIFTAG_DETAILS,n ); } else CreateCopy ( conflict,pstr(" ") ); n++; return Error_NoError; } void SeqAdv::Copy ( PContainerClass SeqAdv ) { ContainerClass::Copy ( SeqAdv ); seqNum = PSeqAdv(SeqAdv)->seqNum; dbSeq = PSeqAdv(SeqAdv)->dbSeq; strcpy ( resName ,PSeqAdv(SeqAdv)->resName ); strcpy ( insCode ,PSeqAdv(SeqAdv)->insCode ); strcpy ( database ,PSeqAdv(SeqAdv)->database ); strcpy ( dbAccession,PSeqAdv(SeqAdv)->dbAccession ); strcpy ( dbRes ,PSeqAdv(SeqAdv)->dbRes ); CreateCopy ( conflict,PSeqAdv(SeqAdv)->conflict ); } void SeqAdv::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &seqNum ); f.WriteInt ( &dbSeq ); f.WriteTerLine ( resName ,false ); f.WriteTerLine ( insCode ,false ); f.WriteTerLine ( database ,false ); f.WriteTerLine ( dbAccession,false ); f.WriteTerLine ( dbRes ,false ); f.CreateWrite ( conflict ); } void SeqAdv::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &seqNum ); f.ReadInt ( &dbSeq ); f.ReadTerLine ( resName ,false ); f.ReadTerLine ( insCode ,false ); f.ReadTerLine ( database ,false ); f.ReadTerLine ( dbAccession,false ); f.ReadTerLine ( dbRes ,false ); f.CreateRead ( conflict ); } MakeStreamFunctions(SeqAdv) // ================ SeqRes =================== SeqRes::SeqRes() : io::Stream() { InitSeqRes(); } SeqRes::SeqRes ( io::RPStream Object ) : io::Stream(Object) { InitSeqRes(); } SeqRes::~SeqRes() { FreeMemory(); } void SeqRes::SetChain ( PChain Chain_Owner ) { chain = Chain_Owner; if (chain) strcpy ( chainID,chain->chainID ); else strcpy ( chainID,"" ); } void SeqRes::InitSeqRes() { chain = NULL; numRes = -1; resName = NULL; serNum = 0; strcpy ( chainID,"" ); } void SeqRes::FreeMemory() { if (resName) delete[] resName; resName = NULL; numRes = -1; serNum = 0; } void SeqRes::PDBASCIIDump ( io::RFile f ) { // writes the ASCII PDB SEQRES lines into file f char S[100]; int i,k,sN; if (numRes<0) return; strcpy ( S,"SEQRES" ); PadSpaces ( S,80 ); if (chain->chainID[0]) S[11] = chain->chainID[0]; PutInteger ( &(S[13]),numRes,4 ); if (resName) { i = 0; sN = 1; while (ichainID[0]) { if (S[11]!=chain->chainID[0]) return Error_WrongChainID; } else if (S[11]!=' ') { chain->chainID[0] = S[11]; chain->chainID[1] = char(0); } else chain->chainID[0] = char(0); GetInteger ( sN,&(S[8]) ,3 ); GetInteger ( nR,&(S[13]),4 ); if (sN==0) { FreeMemory(); numRes = nR; } else { serNum++; if (sN!=serNum) return Error_SEQRES_serNum; if (sN==1) { FreeMemory(); resName = new ResName[nR]; for (i=0;i=nR) return Error_SEQRES_extraRes; k = 19; while ((iAddLoop ( CIFCAT_NDB_POLY_SEQ_SCHEME,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_MON_ID ); } if (resName) for (i=0;iAddString ( chain->chainID,true ); Loop->AddString ( resName[i] ,true ); } else for (i=0;iAddString ( chain->GetEntryID(),true ); Loop->AddString ( pstr("UNK") ,true ); } } ERROR_CODE SeqRes::GetCIF ( mmcif::PData CIF ) { // Tries to get sequence from the CIF structure. A sequence // for first met chain is extracted and then removed from // the CIF structure, so that sequential calls will extract // all sequencies. Chain ID is stored locally in chainID; // reference to parent chain is neither used nor checked. // Returns 0 if sequence was extracted and 1 otherwise. mmcif::PLoop Loop; ResName * rN; ChainID chID; pstr F; cpstr CHAIN_ID; int RC,i,l; CIF_MODE CIFMode; bool isMon; FreeMemory(); CIFMode = CIF_NDB; Loop = CIF->GetLoop ( CIFName(CAT_POLY_SEQ_SCHEME,CIFMode) ); if (!Loop) { CIFMode = CIF_PDBX; Loop = CIF->GetLoop ( CIFName(CAT_POLY_SEQ_SCHEME,CIFMode) ); if (!Loop) return Error_NoLoop; } l = Loop->GetLoopLength(); if (l<=0) return Error_NoLoop; rN = new ResName[l]; chainID[0] = char(1); numRes = 0; isMon = false; CHAIN_ID = CIFName(TAG_SEQ_CHAIN_ID,CIFMode); for (i=0;iGetString ( CHAIN_ID,i,RC ); if (!RC) { if (F) strcpy ( chID,F ); else chID[0] = char(0); if (chainID[0]==char(1)) strcpy ( chainID,chID ); if (!strcmp(chainID,chID)) { CIFGetString ( rN[numRes],Loop,CIFTAG_MON_ID,i, sizeof(ResName),pstr("UNK") ); Loop->DeleteField ( CHAIN_ID,i ); if (strcmp(rN[numRes],"UNK")) isMon = true; numRes++; } } } if (numRes==0) { numRes = -1; delete[] rN; return Error_EmptyCIFLoop; } if (isMon) { resName = new ResName[numRes]; for (i=0;inumRes; serNum = SeqRes->serNum; if (SeqRes->resName) { resName = new ResName[numRes]; for (i=0;iresName[i] ); } } void SeqRes::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &numRes ); f.WriteInt ( &serNum ); if (resName) i = 1; else i = 0; f.WriteInt ( &i ); if (resName) for (i=0;iGetEntryID(),4 ); strcpy_n ( &(S[12]),resName ,3 ); if (chain->chainID[0]) S[16] = chain->chainID[0]; PutIntIns ( &(S[18]),seqNum,4,insCode ); strcpy_n ( &(S[24]),stdRes ,3 ); strcpy_n ( &(S[29]),comment,IMin(strlen(comment),41) ); } ERROR_CODE ModRes::ConvertPDBASCII ( cpstr S ) { IDCode idCode; if (chain->chainID[0]) { if (S[16]!=chain->chainID[0]) return Error_WrongChainID; } else if (S[16]!=' ') { chain->chainID[0] = S[16]; chain->chainID[1] = char(0); } else chain->chainID[0] = char(0); strcpy ( idCode,chain->GetEntryID() ); if (idCode[0]) { if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) return Error_WrongEntryID; } else { GetString ( idCode,&(S[7]),4 ); chain->SetEntryID ( idCode ); } GetString ( resName ,&(S[12]),3 ); GetIntIns ( seqNum,insCode,&(S[18]),4 ); GetString ( stdRes ,&(S[24]),3 ); CreateCopy ( comment ,&(S[29]) ); CutSpaces ( comment,SCUTKEY_END ); return Error_NoError; } void ModRes::MakeCIF ( mmcif::PData CIF, int N ) { UNUSED_ARGUMENT(CIF); UNUSED_ARGUMENT(N); /* -- apparently wrong use of _struct_conn, to be revised mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_CONN,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_CONN_TYPE_ID ); Loop->AddLoopTag ( CIFTAG_NDB_PDB_ID ); Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_PTNR1_LABEL_INS_CODE ); Loop->AddLoopTag ( CIFTAG_NDB_PTNR1_STANDARD_COMP_ID ); Loop->AddLoopTag ( CIFTAG_DETAILS ); } Loop->AddString ( pstr("MODRES") ); Loop->AddString ( chain->GetEntryID(),true ); Loop->AddString ( resName ,true ); Loop->AddString ( chain->chainID ,true ); Loop->AddInteger ( seqNum ); Loop->AddString ( insCode ,true ); Loop->AddString ( stdRes ,true ); Loop->AddString ( comment ,true ); */ } ERROR_CODE ModRes::GetCIF ( mmcif::PData CIF, int & n ) { UNUSED_ARGUMENT(CIF); // GetCIF(..) must be always run without reference to Chain, // see CModel::GetCIF(..). /* -- apparently wrong use of _struct_conn, to be revised mmcif::PLoop Loop; pstr F; int l,RC; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONN ); if (!Loop) { n = -1; return; } l = Loop->GetLoopLength(); while (nGetString ( CIFTAG_CONN_TYPE_ID,n,RC ); if ((!RC) && F) { if (!strcmp(F,"MODRES")) break; } n++; } if (n>=l) { n = -1; return; } Loop->DeleteField ( CIFTAG_CONN_TYPE_ID,n ); // Determine the ChainID first and store it locally. It will // be used by CModel for generating chains and placing the // primary structure data BEFORE reading the coordinate section. F = Loop->GetString ( CIFTAG_PTNR1_LABEL_ASYM_ID,n,RC ); if ((!RC) && F) { strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); Loop->DeleteField ( CIFTAG_PTNR1_LABEL_ASYM_ID,n ); } else strcpy ( chainID,"" ); CIFGetString ( resName,Loop,CIFTAG_PTNR1_LABEL_COMP_ID,n, sizeof(ResName),pstr("UNK") ); if (CIFGetInteger(seqNum,Loop,CIFTAG_PTNR1_LABEL_SEQ_ID,n)) return; CIFGetString ( insCode,Loop,CIFTAG_NDB_PTNR1_LABEL_INS_CODE, n,sizeof(InsCode),pstr(" ") ); CIFGetString ( stdRes,Loop,CIFTAG_NDB_PTNR1_STANDARD_COMP_ID,n, sizeof(ResName),pstr("UNK") ); F = Loop->GetString ( CIFTAG_DETAILS,n,RC ); if ((!RC) && F) { CreateCopy ( comment,F ); Loop->DeleteField ( CIFTAG_DETAILS,n ); } else CreateCopy ( comment,pstr(" ") ); n++; */ n = -1; return Error_EmptyCIF; } void ModRes::Copy ( PContainerClass ModRes ) { seqNum = PModRes(ModRes)->seqNum; strcpy ( resName,PModRes(ModRes)->resName ); strcpy ( insCode,PModRes(ModRes)->insCode ); strcpy ( stdRes ,PModRes(ModRes)->stdRes ); CreateCopy ( comment,PModRes(ModRes)->comment ); } void ModRes::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &seqNum ); f.WriteTerLine ( resName,false ); f.WriteTerLine ( insCode,false ); f.WriteTerLine ( stdRes ,false ); f.CreateWrite ( comment ); } void ModRes::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &seqNum ); f.ReadTerLine ( resName,false ); f.ReadTerLine ( insCode,false ); f.ReadTerLine ( stdRes ,false ); f.CreateRead ( comment ); } MakeStreamFunctions(ModRes) // ================ HetRec ====================== HetRec::HetRec() : ContainerChain() { InitHetRec(); } HetRec::HetRec ( PChain Chain_Owner ) : ContainerChain(Chain_Owner) { InitHetRec(); } HetRec::HetRec ( PChain Chain_Owner, cpstr S ) : ContainerChain(Chain_Owner) { InitHetRec(); ConvertPDBASCII ( S ); } HetRec::HetRec ( io::RPStream Object ) : ContainerChain(Object) { InitHetRec(); } HetRec::~HetRec() { if (comment) delete[] comment; } void HetRec::InitHetRec() { strcpy ( hetID ,"---" ); strcpy ( insCode,"-" ); seqNum = 0; numHetAtoms = 0; comment = NULL; CreateCopy ( comment,pstr(" ") ); } void HetRec::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB MODRES line number N // from the class' data strcpy ( S,"HET" ); PadSpaces ( S,80 ); strcpy_n ( &(S[7]) ,hetID,3 ); if (chain->chainID[0]) S[12] = chain->chainID[0]; PutIntIns ( &(S[13]),seqNum,4,insCode ); PutInteger ( &(S[20]),numHetAtoms,5 ); strcpy_n ( &(S[30]),comment,IMin(strlen(comment),40) ); } ERROR_CODE HetRec::ConvertPDBASCII ( cpstr S ) { if (chain->chainID[0]) { if (S[12]!=chain->chainID[0]) return Error_WrongChainID; } else if (S[12]!=' ') { chain->chainID[0] = S[12]; chain->chainID[1] = char(0); } else chain->chainID[0] = char(0); GetString ( hetID ,&(S[7]) ,3 ); GetIntIns ( seqNum,insCode,&(S[13]),4 ); GetInteger ( numHetAtoms ,&(S[20]),5 ); CreateCopy ( comment ,&(S[30]) ); CutSpaces ( comment,SCUTKEY_END ); return Error_NoError; } void HetRec::MakeCIF ( mmcif::PData CIF, int N ) { UNUSED_ARGUMENT(N); mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_NDB_NONSTANDARD_LIST,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_INS_CODE ); Loop->AddLoopTag ( CIFTAG_NUMBER_ATOMS_NH ); Loop->AddLoopTag ( CIFTAG_DETAILS ); } Loop->AddString ( hetID ,true ); Loop->AddString ( chain->chainID,true ); Loop->AddInteger ( seqNum ); Loop->AddString ( insCode ,true ); Loop->AddInteger ( numHetAtoms ); Loop->AddString ( comment ,true ); } ERROR_CODE HetRec::GetCIF ( mmcif::PData CIF, int & n ) { // GetCIF(..) must be always run without reference to Chain, // see CModel::GetCIF(..). mmcif::PLoop Loop; pstr F; int RC; ERROR_CODE rc; Loop = CIF->GetLoop ( CIFCAT_NDB_NONSTANDARD_LIST ); if (!Loop) { n = -1; return Error_EmptyCIF; } if (n>=Loop->GetLoopLength()) { n = -1; return Error_EmptyCIF; } // Determine the ChainID first and store it locally. It will // be used by CModel for generating chains and placing the // primary structure data BEFORE reading the coordinate section. F = Loop->GetString ( CIFTAG_AUTH_ASYM_ID,n,RC ); if ((!RC) && F) { strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); Loop->DeleteField ( CIFTAG_AUTH_ASYM_ID,n ); } else strcpy ( chainID,"" ); CIFGetString ( hetID,Loop,CIFTAG_ID,n,sizeof(ResName), pstr("UNK") ); rc = CIFGetInteger ( seqNum,Loop,CIFTAG_AUTH_SEQ_ID,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; CIFGetString ( insCode,Loop,CIFTAG_INS_CODE,n,sizeof(InsCode), pstr(" ") ); rc = CIFGetInteger ( numHetAtoms,Loop,CIFTAG_NUMBER_ATOMS_NH,n ); if (rc==Error_NoData) return Error_EmptyCIF; if (rc!=Error_NoError) return rc; F = Loop->GetString ( CIFTAG_DETAILS,n,RC ); if ((!RC) && F) { CreateCopy ( comment,F ); Loop->DeleteField ( CIFTAG_DETAILS,n ); } else CreateCopy ( comment,pstr(" ") ); n++; return Error_NoError; } void HetRec::Copy ( PContainerClass Het ) { seqNum = PHetRec(Het)->seqNum; numHetAtoms = PHetRec(Het)->numHetAtoms; strcpy ( hetID ,PHetRec(Het)->hetID ); strcpy ( insCode,PHetRec(Het)->insCode ); CreateCopy ( comment,PHetRec(Het)->comment ); } void HetRec::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &seqNum ); f.WriteInt ( &numHetAtoms ); f.WriteTerLine ( hetID ,false ); f.WriteTerLine ( insCode,false ); f.CreateWrite ( comment ); } void HetRec::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &seqNum ); f.ReadInt ( &numHetAtoms ); f.ReadTerLine ( hetID ,false ); f.ReadTerLine ( insCode,false ); f.CreateRead ( comment ); } MakeStreamFunctions(HetRec) // ===================== Chain ======================= Chain::Chain() : UDData() { InitChain(); SetChain ( pstr("") ); } Chain::Chain ( PProModel Model, const ChainID chID ) : UDData() { InitChain(); SetChain ( chID ); if (Model) Model->AddChain ( this ); } Chain::Chain ( io::RPStream Object ) : UDData(Object) { InitChain(); SetChain ( pstr("") ); } void Chain::InitChain() { nResidues = 0; resLen = 0; residue = NULL; model = NULL; chainID[0] = char(0); prevChainID[0] = char(0); nWeights = 0; Weight = 0.0; Exclude = true; } void Chain::SetChain ( const ChainID chID ) { strcpy ( chainID,chID ); if (chID[0]==' ') chainID[0] = char(0); DBRef .SetChain ( this ); seqAdv.SetChain ( this ); seqRes.SetChain ( this ); modRes.SetChain ( this ); Het .SetChain ( this ); } void Chain::SetChainID ( const ChainID chID ) { strcpy ( chainID,chID ); if (chID[0]==' ') chainID[0] = char(0); } Chain::~Chain() { FreeMemory(); if (model) model->_ExcludeChain ( chainID ); } void Chain::FreeMemory() { DeleteAllResidues(); if (residue) delete[] residue; resLen = 0; nResidues = 0; residue = NULL; FreeAnnotations(); } void Chain::FreeAnnotations() { DBRef .FreeContainer(); seqAdv.FreeContainer(); seqRes.FreeMemory (); modRes.FreeContainer(); Het .FreeContainer(); } void Chain::SetModel ( PProModel Model ) { model = Model; } PManager Chain::GetCoordHierarchy() { if (model) return model->GetCoordHierarchy(); return NULL; } void Chain::CheckInAtoms() { int i; if (GetCoordHierarchy()) for (i=0;iCheckInAtoms(); } ERROR_CODE Chain::ConvertDBREF ( cpstr PDBString ) { PContainerChain ContainerChain; ERROR_CODE RC; ContainerChain = new DBReference(this); RC = ContainerChain->ConvertPDBASCII ( PDBString ); if (RC) { delete ContainerChain; return RC; } DBRef.AddData ( ContainerChain ); return Error_NoError; } ERROR_CODE Chain::ConvertSEQADV ( cpstr PDBString ) { PContainerChain ContainerChain; ERROR_CODE RC; ContainerChain = new SeqAdv(this); RC = ContainerChain->ConvertPDBASCII ( PDBString ); if (RC) { delete ContainerChain; return RC; } seqAdv.AddData ( ContainerChain ); return Error_NoError; } ERROR_CODE Chain::ConvertSEQRES ( cpstr PDBString ) { return seqRes.ConvertPDBASCII ( PDBString ); } ERROR_CODE Chain::ConvertMODRES ( cpstr PDBString ) { PContainerChain ContainerChain; ERROR_CODE RC; ContainerChain = new ModRes(this); RC = ContainerChain->ConvertPDBASCII ( PDBString ); if (RC) { delete ContainerChain; return RC; } modRes.AddData ( ContainerChain ); return Error_NoError; } ERROR_CODE Chain::ConvertHET ( cpstr PDBString ) { PContainerChain ContainerChain; ERROR_CODE RC; ContainerChain = new HetRec(this); RC = ContainerChain->ConvertPDBASCII ( PDBString ); if (RC) { delete ContainerChain; return RC; } Het.AddData ( ContainerChain ); return Error_NoError; } void Chain::PDBASCIIDump ( io::RFile f ) { // this function was for test purposes and is not used // for normal function of MMDB DBRef .PDBASCIIDump ( f ); seqAdv.PDBASCIIDump ( f ); seqRes.PDBASCIIDump ( f ); modRes.PDBASCIIDump ( f ); Het .PDBASCIIDump ( f ); } void Chain::PDBASCIIAtomDump ( io::RFile f ) { int i; for (i=0;iPDBASCIIAtomDump ( f ); } void Chain::MakeAtomCIF ( mmcif::PData CIF ) { int i; for (i=0;iMakeAtomCIF ( CIF ); } int Chain::GetNumberOfResidues() { return nResidues; } PResidue Chain::GetResidue ( int resNo ) { if ((0<=resNo) && (resNoseqNum) && (!strcmp(insCode,residue[i]->insCode))) { if (!strcmp(resName,residue[i]->name)) return residue[i]; // it is there; just return the pointer else if (!Enforce) { // printf ( "1. sno=%i:%i, ic=[%s]:[%s] name=[%s]:[%s]\n", // seqNum,residue[i]->seqNum, // insCode,residue[i]->insCode, // resName,residue[i]->name ); return NULL; // duplicate seqNum and insCode! } } } } else { for (i=0;iseqNum) && (!residue[i]->insCode[0])) { if (!strcmp(resName,residue[i]->name)) return residue[i]; // it is there; just return the pointer else if (!Enforce) { // printf ( "2. sno=%i:%i, ic=[%s]:[%s] name=[%s]:[%s]\n", // seqNum,residue[i]->seqNum, // insCode,residue[i]->insCode, // resName,residue[i]->name ); return NULL; // duplicate seqNum and insCode! } } } } // expand the residue array, if necessary if (nResidues>=resLen) ExpandResidueArray ( 100 ); // create new residue residue[nResidues] = newResidue(); residue[nResidues]->SetChain ( this ); residue[nResidues]->SetResID ( resName,seqNum,insCode ); residue[nResidues]->index = nResidues; nResidues++; return residue[nResidues-1]; } void Chain::ExpandResidueArray ( int inc ) { PPResidue Residue1; int i; resLen += inc; Residue1 = new PResidue[resLen]; for (i=0;iseqNum) && (!strcmp(insCode,residue[i]->insCode))) return residue[i]; } } else { for (i=0;iseqNum) && (!residue[i]->insCode[0])) return residue[i]; } } return NULL; } int Chain::GetResidueNo ( int seqNum, const InsCode insCode ) { // GetResidueNo(..) returns the residue number in the chain's // residues table. Residues are numbered as 0..nres-1 as they appear // in the coordinate file. // If residue is not found, the function returns -1. int i; bool isInsCode; if (insCode) isInsCode = insCode[0]!=char(0); else isInsCode = false; if (isInsCode) { for (i=0;iseqNum) && (!strcmp(insCode,residue[i]->insCode))) return i; } } else { for (i=0;iseqNum) && (!residue[i]->insCode[0])) return i; } } return -1; } void Chain::GetResidueTable ( PPResidue & resTable, int & NumberOfResidues ) { resTable = residue; NumberOfResidues = nResidues; } int Chain::_ExcludeResidue ( const ResName resName, int seqNum, const InsCode insCode ) { // ExcludeResidue(..) excludes (but does not dispose!) a residue // from the chain. Returns 1 if the chain gets empty and 0 otherwise. int i,k; if (!Exclude) return 0; // find the residue k = -1; for (i=0;(iseqNum) && (!strcmp(insCode,residue[i]->insCode)) && (!strcmp(resName,residue[i]->name))) k = i; if (k>=0) { for (i=k+1;iindex = i-1; } nResidues--; residue[nResidues] = NULL; } if (nResidues<=0) return 1; else return 0; } void Chain::GetCoordSequence ( pstr & seq ) { // GetCoorSequence(...) returns sequence inferred from list // of residues (which may differ from one in the file header). // The sequence is returned as a null-terminated string 'seq'. // On input, 'seq' should be either NULL or allocated (in which // case the original allocation will be released). int i,j; if (seq) delete[] seq; seq = new char[nResidues+1]; j = 0; for (i=0;iGetResName(),seq[j++] ); seq[j] = char(0); } // ------------------ Deleting residues -------------------------- int Chain::DeleteResidue ( int resNo ) { if ((0<=resNo) && (resNoseqNum) && (!strcmp(insCode,residue[i]->insCode))) { Exclude = false; delete residue[i]; residue[i] = NULL; Exclude = true; return 1; } } } else { for (i=0;iseqNum) && (!residue[i]->insCode[0])) { Exclude = false; delete residue[i]; residue[i] = NULL; Exclude = true; return 1; } } } return 0; } int Chain::DeleteAllResidues() { int i,k; Exclude = false; k = 0; for (i=0;iisSolvent()) { delete residue[i]; residue[i] = NULL; k++; } } Exclude = true; return k; } void Chain::TrimResidueTable() { int i,j; Exclude = false; j = 0; for (i=0;inAtoms>0) { if (jindex = j; residue[i] = NULL; } j++; } else { delete residue[i]; residue[i] = NULL; } } nResidues = j; Exclude = true; } int Chain::AddResidue ( PResidue res ) { // modify both CModel::Copy methods simultaneously! // // Copy(PCModel,PPAtom,int&) copies atoms into array 'atom' // starting from position atom_index. 'atom' should be able to // accept all new atoms - no checks on the length of 'atom' // is being made. This function should not be used in applications. return InsResidue ( res,nResidues ); } /* PCmmdbRoot mmdbRoot; PChain chain1; int i; for (i=0;i=resLen) ExpandResidueArray ( 100 ); if (res->GetCoordHierarchy()) { residue[nResidues] = newResidue(); residue[nResidues]->SetChain ( this ); residue[nResidues]->SetResID ( res->name,res->seqNum,res->insCode ); if (mmdbRoot) { // get space for new atoms mmdbRoot->AddAtomArray ( res->GetNumberOfAtoms(true) ); residue[nResidues]->Copy ( res,mmdbRoot->Atom,mmdbRoot->nAtoms ); } else { for (i=0;inAtoms;i++) residue[nResidues]->AddAtom ( res->atom[i] ); } } else { residue[nResidues] = res; chain1 = res->GetChain(); if (chain1) for (i=0;inResidues;i++) if (chain1->residue[i]==res) { chain1->residue[i] = NULL; break; } residue[nResidues]->SetChain ( this ); if (mmdbRoot) residue[nResidues]->CheckInAtoms(); } nResidues++; } return nResidues; } */ int Chain::InsResidue ( PResidue res, int seqNum, const InsCode insCode ) { return InsResidue ( res,GetResidueNo(seqNum,insCode) ); } int Chain::InsResidue ( PResidue res, int pos ) { // Inserts residue res onto position pos of the chain, // pos=0..nResidues-1 . Residues pos..nResidues-1 are // shifted up the chain. // The function places new atoms on the top of atom // index. It is advisable to call // CmmdbRoot::PDBCleanup ( PDBCLEAN_INDEX ) after all // insertions are done. PRoot mmdbRoot; PChain chain1; int i,pp; pp = IMax ( 0,IMin(nResidues,pos) ); for (i=0;i=resLen) ExpandResidueArray ( 100 ); // shift residues to the end of the chain as necessary for (i=nResidues;i>pp;i--) residue[i] = residue[i-1]; // insert the new residue if (res->GetCoordHierarchy()) { residue[pp] = newResidue(); residue[pp]->SetChain ( this ); residue[pp]->SetResID ( res->name,res->seqNum,res->insCode ); if (mmdbRoot) { // get space for new atoms mmdbRoot->AddAtomArray ( res->GetNumberOfAtoms(true) ); residue[pp]->_copy ( res,mmdbRoot->atom,mmdbRoot->nAtoms ); } else { for (i=0;inAtoms;i++) residue[pp]->AddAtom ( res->atom[i] ); } } else { residue[pp] = res; chain1 = res->GetChain(); if (chain1) for (i=0;inResidues;i++) if (chain1->residue[i]==res) { chain1->residue[i] = NULL; break; } residue[pp]->SetChain ( this ); if (mmdbRoot) residue[pp]->CheckInAtoms(); } nResidues++; } return nResidues; } // -------------------- Extracting atoms ----------------------- int Chain::GetNumberOfAtoms ( bool countTers ) { int i,na; na = 0; for (i=0;iGetNumberOfAtoms ( countTers ); return na; } int Chain::GetNumberOfAtoms ( int seqNo, const InsCode insCode ) { PResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; return 0; } int Chain::GetNumberOfAtoms ( int resNo ) { if ((0<=resNo) && (resNonAtoms; } return 0; } PAtom Chain::GetAtom ( int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->GetAtom ( aname,elmnt,aloc ); return NULL; } PAtom Chain::GetAtom ( int seqNo, const InsCode insCode, int atomNo ) { PResidue res; res = GetResidue ( seqNo,insCode ); if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } return NULL; } PAtom Chain::GetAtom ( int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((0<=resNo) && (resNoGetAtom ( aname,elmnt,aloc ); } return NULL; } PAtom Chain::GetAtom ( int resNo, int atomNo ) { PResidue res; if ((0<=resNo) && (resNonAtoms)) return res->atom[atomNo]; } } return NULL; } void Chain::GetAtomTable ( int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void Chain::GetAtomTable ( int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0<=resNo) && (resNoatom; NumberOfAtoms = res->nAtoms; } } } void Chain::GetAtomTable1 ( int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = GetResidue ( seqNo,insCode ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void Chain::GetAtomTable1 ( int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; if ((0<=resNo) && (resNoGetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } int Chain::DeleteAtom ( int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->DeleteAtom ( aname,elmnt,aloc ); return 0; } int Chain::DeleteAtom ( int seqNo, const InsCode insCode, int atomNo ) { PResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->DeleteAtom ( atomNo ); return 0; } int Chain::DeleteAtom ( int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((0<=resNo) && (resNoDeleteAtom ( aname,elmnt,aloc ); } return 0; } int Chain::DeleteAtom ( int resNo, int atomNo ) { if ((0<=resNo) && (resNoDeleteAtom ( atomNo ); } return 0; } int Chain::DeleteAllAtoms ( int seqNo, const InsCode insCode ) { PResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->DeleteAllAtoms(); return 0; } int Chain::DeleteAllAtoms ( int resNo ) { if ((0<=resNo) && (resNoDeleteAllAtoms(); } return 0; } int Chain::DeleteAllAtoms() { int i,k; k = 0; for (i=0;iDeleteAllAtoms(); return k; } int Chain::DeleteAltLocs() { // This function leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted. All tables remain // untrimmed, so that explicit trimming or calling FinishStructEdit() // is required. int i,n; n = 0; for (i=0;iDeleteAltLocs(); return n; } int Chain::AddAtom ( int seqNo, const InsCode insCode, PAtom atom ) { PResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->AddAtom ( atom ); return 0; } int Chain::AddAtom ( int resNo, PAtom atom ) { if ((0<=resNo) && (resNoAddAtom ( atom ); } return 0; } void Chain::Copy ( PChain chain ) { // modify both Chain::_copy and Chain::Copy methods simultaneously! int i; FreeMemory(); if (chain) { CopyAnnotations ( chain ); nResidues = chain->nResidues; resLen = nResidues; if (nResidues>0) { residue = new PResidue[nResidues]; for (i=0;iSetChain ( this ); residue[i]->Copy ( chain->residue[i] ); } } } } void Chain::CopyAnnotations ( PChain chain ) { if (chain) { strcpy ( chainID ,chain->chainID ); strcpy ( prevChainID,chain->prevChainID ); DBRef .Copy ( &(chain->DBRef) ); seqAdv.Copy ( &(chain->seqAdv) ); // SEQADV records seqRes.Copy ( &(chain->seqRes) ); // SEQRES data modRes.Copy ( &(chain->modRes) ); // MODRES records Het .Copy ( &(chain->Het) ); // HET records } } void Chain::_copy ( PChain chain ) { // modify both Chain::_copy and Chain::Copy methods simultaneously! int i; FreeMemory(); strcpy ( chainID ,chain->chainID ); strcpy ( prevChainID,chain->prevChainID ); DBRef .Copy ( &(chain->DBRef) ); seqAdv.Copy ( &(chain->seqAdv) ); // SEQADV records seqRes.Copy ( &(chain->seqRes) ); // SEQRES data modRes.Copy ( &(chain->modRes) ); // MODRES records Het .Copy ( &(chain->Het) ); // HET records nResidues = chain->nResidues; resLen = nResidues; if (nResidues>0) { residue = new PResidue[nResidues]; for (i=0;iSetChain ( this ); residue[i]->_copy ( chain->residue[i] ); } } } void Chain::_copy ( PChain chain, PPAtom atom, int & atom_index ) { // modify both Chain::_copy and Chain::Copy methods simultaneously! int i; FreeMemory(); strcpy ( chainID ,chain->chainID ); strcpy ( prevChainID,chain->prevChainID ); DBRef .Copy ( &(chain->DBRef) ); seqAdv.Copy ( &(chain->seqAdv) ); // SEQADV records seqRes.Copy ( &(chain->seqRes) ); // SEQRES data modRes.Copy ( &(chain->modRes) ); // MODRES records Het .Copy ( &(chain->Het) ); // HET records nResidues = chain->nResidues; resLen = nResidues; if (nResidues>0) { residue = new PResidue[nResidues]; for (i=0;iresidue[i]) { residue[i] = newResidue(); residue[i]->SetChain ( this ); residue[i]->_copy ( chain->residue[i],atom,atom_index ); } else residue[i] = NULL; } } /* void Chain::Duplicate ( PChain Chain ) { int i; FreeMemory(); strcpy ( chainID ,chain->chainID ); strcpy ( prevChainID,chain->prevChainID ); DBReference.Copy ( &(chain->DBReference) ); SeqAdv .Copy ( &(chain->SeqAdv) ); // SEQADV records SeqRes .Copy ( &(chain->SeqRes) ); // SEQRES data ModRes .Copy ( &(chain->ModRes) ); // MODRES records Het .Copy ( &(chain->Het) ); // HET records nResidues = chain->nResidues; resLen = nResidues; if (nResidues>0) { Residue = new PResidue[nResidues]; for (i=0;iSetChain ( this ); residue[i]->Duplicate ( chain->residue[i] ); } } } */ cpstr Chain::GetEntryID() { if (model) return model->GetEntryID(); else return pstr(""); } void Chain::SetEntryID ( const IDCode idCode ) { if (model) model->SetEntryID ( idCode ); } int Chain::GetModelNum() { if (model) return model->GetSerNum(); return 0; } cpstr Chain::GetChainID ( pstr ChID ) { ChID[0] = char(0); if (model) sprintf ( ChID,"/%i/",model->GetSerNum() ); else strcpy ( ChID,"/-/" ); strcat ( ChID,chainID ); return ChID; } void Chain::GetAtomStatistics ( RAtomStat AS ) { AS.Init(); CalAtomStatistics ( AS ); AS.Finish(); } void Chain::CalAtomStatistics ( RAtomStat AS ) { int i; for (i=0;iCalAtomStatistics ( AS ); } void Chain::ApplyTransform ( mat44 & TMatrix ) { // transforms all coordinates by multiplying with matrix TMatrix int i; for (i=0;iApplyTransform ( TMatrix ); } bool Chain::isSolventChain() { // returns true if chain contains only solvent molecules bool B,P; int i; B = true; P = false; for (i=0;(iisSolvent(); } return (B && P); } bool Chain::isInSelection ( int selHnd ) { PRoot mmdbRoot = (PRoot)GetCoordHierarchy(); PMask mask; if (mmdbRoot) { mask = mmdbRoot->GetSelMask ( selHnd ); if (mask) return CheckMask ( mask ); } return false; } bool Chain::isAminoacidChain() { // returns true if chain contains at least one aminoacid residue bool B,P; int i; B = false; P = false; for (i=0;(iisAminoacid(); } return (B && P); } bool Chain::isNucleotideChain() { // returns true if chain contains at least one nucleotide residue bool B,P; int i; B = false; P = false; for (i=0;(iisNucleotide(); } return (B && P); } int Chain::CheckID ( const ChainID chID ) { if (chID) { if (!strcmp(chID,chainID)) return 1; } return 0; } int Chain::CheckIDS ( cpstr CID ) { ChainID chn; InsCode inscode; ResName resname; AtomName atm; Element elm; AltLoc aloc; int mdl,sn,rc; rc = ParseAtomPath ( CID,mdl,chn,sn,inscode,resname, atm,elm,aloc,NULL ); if (rc>=0) { if (!strcmp(chn,chainID)) return 1; } return 0; } int Chain::GetNumberOfDBRefs() { return DBRef.Length(); } PDBReference Chain::GetDBRef ( int dbRefNo ) { return (PDBReference)DBRef.GetContainerClass ( dbRefNo ); } void Chain::MaskAtoms ( PMask mask ) { int i; for (i=0;iMaskAtoms ( mask ); } void Chain::MaskResidues ( PMask mask ) { int i; for (i=0;iSetMask ( mask ); } void Chain::UnmaskAtoms ( PMask mask ) { int i; for (i=0;iUnmaskAtoms ( mask ); } void Chain::UnmaskResidues ( PMask mask ) { int i; for (i=0;iRemoveMask ( mask ); } // ------- user-defined data handlers int Chain::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_CHAIN) return UDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Chain::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_CHAIN) return UDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Chain::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_CHAIN) return UDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int Chain::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_CHAIN) return UDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int Chain::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_CHAIN) return UDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int Chain::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_CHAIN) return UDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int Chain::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_CHAIN) return UDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } // ------------------------------------------------------------------- DefineClass(SortResidues) class QSortResidues : public QuickSort { public : QSortResidues() : QuickSort() {} int Compare ( int i, int j ); void Swap ( int i, int j ); void Sort ( PPResidue res, int nresidues ); }; int QSortResidues::Compare ( int i, int j ) { int diff; diff = ((PPResidue)data)[i]->seqNum - ((PPResidue)data)[j]->seqNum; if (diff==0) diff = strcmp( (PPResidue(data))[i]->insCode, (PPResidue(data))[j]->insCode ); if (diff>0) return 1; if (diff<0) return -1; return 0; } void QSortResidues::Swap ( int i, int j ) { PResidue res; res = ((PPResidue)data)[i]; ((PPResidue)data)[i] = ((PPResidue)data)[j]; ((PPResidue)data)[j] = res; } void QSortResidues::Sort ( PPResidue res, int nresidues ) { QuickSort::Sort ( &(res[0]),nresidues ); } void Chain::SortResidues() { QSortResidues SR; TrimResidueTable(); SR.Sort ( residue,nResidues ); } int Chain::GetNofModResidues() { return modRes.Length(); } PModRes Chain::GetModResidue ( int modResNo ) { return PModRes(modRes.GetContainerClass(modResNo)); } void Chain::write ( io::RFile f ) { int i; byte Version=2; bool compactBinary = false; PManager M = GetCoordHierarchy(); if (M) compactBinary = M->isCompactBinary(); f.WriteByte ( &Version ); f.WriteBool ( &compactBinary ); f.WriteTerLine ( chainID,false ); f.WriteInt ( &nResidues ); for (i=0;iwrite ( f ); if (!compactBinary) { UDData::write ( f ); f.WriteTerLine ( prevChainID,false ); DBRef .write ( f ); // Database reference seqAdv.write ( f ); // SEQADV records seqRes.write ( f ); // SEQRES data modRes.write ( f ); // MODRES records Het .write ( f ); // HET records } } void Chain::read ( io::RFile f ) { // The Atom array in CmmdbRoot must be already read // prior to calling this function! int i; byte Version; bool compactBinary; FreeMemory(); f.ReadByte ( &Version ); f.ReadBool ( &compactBinary ); f.ReadTerLine ( chainID,false ); SetChain ( chainID ); f.ReadInt ( &nResidues ); resLen = nResidues; if (nResidues>0) { residue = new PResidue[nResidues]; for (i=0;iSetChain ( this ); residue[i]->read ( f ); } } if (!compactBinary) { UDData::read ( f ); f.ReadTerLine ( prevChainID,false ); DBRef .read ( f ); // Database reference seqAdv.read ( f ); // SEQADV records seqRes.read ( f ); // SEQRES data modRes.read ( f ); // MODRES records Het .read ( f ); // HET records } } MakeFactoryFunctions(Chain) } // namespace mmdb // =================================================================== /* void TestChain() { // reads from 'in.chain', writes into // 'out.chain' and 'abin.chain' CFile f; char S[81]; PChain Chain; Chain = newChain(); f.assign ( "in.chain",true ); if (f.reset()) { while (!f.FileEnd()) { f.ReadLine ( S,sizeof(S) ); chain->ConvertPDBString ( S ); } f.shut(); } else { printf ( " Can't open input file 'in.chain' \n" ); delete Chain; return; } f.assign ( "out.chain",true ); if (f.rewrite()) { chain->PDBASCIIDump ( f ); f.shut(); } else { printf ( " Can't open output file 'out.chain' \n" ); delete Chain; return; } f.assign ( "mmdb.chain.bin",false ); if (f.rewrite()) { chain->write ( f ); f.shut(); } else { printf ( " Can't open binary chain file for writing.\n" ); delete Chain; return; } delete Chain; printf ( " Chain deleted.\n" ); Chain = newChain(); if (f.reset()) { chain->read ( f ); f.shut(); } else { printf ( " Can't open binary chain file for reading.\n" ); delete Chain; return; } f.assign ( "abin.chain",true ); if (f.rewrite()) { chain->PDBASCIIDump ( f ); f.shut(); } else printf ( " Can't open output file 'abin.chain' \n" ); delete Chain; } */ mmdb2-2.0.20/mmdb2/mmdb_math_bfgsmin.h0000644000175000017500000002436313271367640017264 0ustar maartenmaarten// $Id: mmdb_math_bfgsmin.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : BFGSMin // ~~~~~~~~~ // **** Classes : mmdb::math::BFGSMin ( minimization driver ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_MATH_BFGSMin__ #define __MMDB_MATH_BFGSMin__ #include #include "mmdb_mattype.h" #include "mmdb_math_linalg.h" namespace mmdb { namespace math { // ============================================================== enum BFGS_RC { BFGS_TooFewDigits = -2, BFGS_WrongSpaceDim = -1, BFGS_NoTermination = 0, BFGS_SmallGradient = 1, BFGS_SmallStep = 2, BFGS_LineSearchComplete = 3, BFGS_IterationLimit = 4, BFGS_LargeSteps = 5, BFGS_Stopped = 6 }; typedef void BFGSMinFunc ( void * UserData, int N, rvector X, realtype & F ); typedef BFGSMinFunc * PBFGSMinFunc; typedef void BFGSPrintFunc ( void * UserData, int N, int Itn, rvector X, rvector G, realtype F ); typedef BFGSPrintFunc * PBFGSPrintFunc; DefineClass(BFGSMin); class BFGSMin { public : BFGSMin (); virtual ~BFGSMin(); virtual void MinFunc ( rvector X, realtype & F ); virtual void Print ( int Itn, rvector X, rvector G, realtype F ); void SetMinFunction ( void * UserData, PBFGSMinFunc Fnc ); void SetPrintFunction ( void * UserData, PBFGSPrintFunc Fnc ); // ====================================================== // // .--------------------------------------------. // | | // | UNCONSTRAINED MINIMIZATION DRIVER | // | | // `--------------------------------------------' // // Finds a minimum of function F(X), X is vector [1..N], // defined by virtual MinFunc. Virtual Print provides // information on every iteration step. // // // Input parameters : // ----------------------- // // N is the dimension the minimization space // // x0 [1..N] is the initial point for minimization // // TypX [1..N] is the array of the typical ranges of // X - components, which are used for the scaling. // If TypX<=0.0 then 1.0 will be substituted // // Digits is the number of valid decimal digits in // the calculated value of minimizing function ( F ). // If Digits<=0 then the Driver will consider // that the F is computed with usual machine's // noise // // ItnLmt is the maximum available number of iterations. // If ItnLmt=0 then 100 will be substituted // // TypF is the expected absolute value of F in the // minimum, which is used in the stop criterion. // If TypF<=0.0 then 1.0 will be substituted // // GrdTol is the desired absolute value of the gradient // vector in the minimum of F . If GrdTol<=0.0 // then the some value correlated with machine's // noise will be substituted // // StpTol is the minimum available step for the minimi- // zation. The execution stops if the distance // between two consequential approximation will be // less then StpTol . If StpTol<=0.0 then the // some value correlated with machine's noise // will be substituted // // MaxStp is the maximum available step for then minimi- // zation. This parameter only prevents the appea- // rance of the too large steps, but the execution // stops if more than 5 steps with length of MaxStep // will consequently appear. // // // // Outpute parameters : // -------------------------- // // x0 will be the point at which the minimisation // had stopped // // Func will be the function's value at x0 // // TermCode will be the reason of stopping : // // 1 <=> the norm of gradient vector at x0 is // less than GrdTol ; the x0 is probable // point of the minimum // 2 <=> the distance between two last approxima- // tions was less than StpTol ; the x0 // may be the point of minimum // 3 <=> the gradient length is greater than // GrdTol , but future minimization fails ; // it may be the consequence of the errors // at the computing of gradient, but also // x0 could be the point of minimum // 4 <=> the iteration limit had been exchausted // 5 <=> more than 5 steps with length of // MaxStp had been made // 6 <=> the termination key ( Esc or End ) // had been pressed. // // // ======================================================== void BFGS_Driver ( int MinN, rvector x0, rvector TypX, realtype & FuncValue, int & TerminationCode, int Digits = 0, int ItnLmt = 0, realtype TypF = 0.0, realtype GrdTol = 0.0, realtype StpTol = 0.0, realtype MaxStp = MaxReal, bool Hess = false, rvector LowLimit = NULL, rvector TopLimit = NULL ); void Stop(); // generates stop signal to stop optimization protected : PBFGSMinFunc MFunc; void * MFuncData; PBFGSPrintFunc PFunc; void * PFuncData; int N,NAlloc; rmatrix Hsn; rvector TL,LL,XOpt,XPlus,Sx,SN,HDiag,GradX,GPlus; rvector StepSize,FNeighbor; rvector us,uy,ut; bvector Freese; realtype Func,FPlus,FOpt; realtype TakenLambda; bool ForDiff; // if True then forward differences are // used for the 1st estimation of the // Hessian (which is less expensive), // otherwise central differences will // be employed (which is more expensive). bool CalcHess; realtype Etha,SqrtEtha,CubertEtha,TpF,GrdEps,StpEps,MxStep; realtype SqrtEps; int CnsMax,MaxItn,TermCode; bool ModF; void MinFunc1 ( rvector X, realtype & F ); void UMInCk ( rvector x0, rvector TypX, int Digits, realtype TypF, realtype GrdTol, realtype StpTol, realtype MaxStp, int ItnLmt ); void UMStop0 ( rvector x0, rvector Grad ); void UMStop ( rvector x0, rvector Grad, int RetCode, int ItnCnt, bool MaxTkn ); virtual void Gradient ( rvector X, rvector G, realtype Fc ); virtual void FDHessF ( realtype Fc, rvector X ); void FDGrad ( rvector X, rvector G, realtype Fc ); void CDGrad ( rvector X, rvector G ); void MdHess ( rmatrix H, rvector HDg ); void InitHessUnFac ( realtype F, rmatrix H ); void BFGSUnFac ( rvector Xc, rvector Xp, rvector Gc, rvector Gp, bool AnalGrad, rvector HDg, rmatrix H ); void Choose_Lambda ( rvector X, rvector S, realtype & Lambda0 ); void LineSearch ( rvector px0, rvector G, rvector P, realtype pFunc, int & RetCode, bool & MaxTkn ); void GetMemory (); void FreeMemory (); void Relax (); void CopyPlus ( rvector x0 ); }; } } #endif mmdb2-2.0.20/mmdb2/mmdb_io_file.h0000644000175000017500000003062513524560235016226 0ustar maartenmaarten// $Id: mmdb_io_file.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 15.03.19 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : file_ // ~~~~~~~~~ // **** Classes : mmdb::io::File - file I/O Support. // ~~~~~~~~~ // // (C) E. Krissinel 2000-2019 // // ================================================================= // #ifndef __MMDB_IO_File__ #define __MMDB_IO_File__ #include #include "mmdb_mattype.h" namespace mmdb { namespace io { // ======================== File Class ======================== enum GZ_MODE { GZM_NONE = 0, GZM_CHECK = 1, GZM_ENFORCE = 2, GZM_ENFORCE_GZIP = 2, GZM_ENFORCE_COMPRESS = 3 }; enum FILE_ERROR { FileError_NoMemory = 110, FileError_ShortData = 111, FileError_NoDataFound = 112, FileError_NoColumn = 113, FileError_BadData = 114, FileError_WrongMemoryAllocation = 115 }; enum SYSKEY { syskey_unix = 1, syskey_win = 2, syskey_all = 3 }; extern const char _dir_sep_c; extern cpstr _dir_sep; // =================== Auxilary Functions ======================== extern cpstr GetFPath ( pstr FilePath, SYSKEY syskey=syskey_all ); extern cpstr GetFName ( cpstr FilePath, SYSKEY syskey=syskey_all ); extern cpstr GetFExt ( cpstr FilePath ); extern cpstr ForceUnixSep ( pstr FilePath ); extern cpstr ChangeExt ( pstr FilePath, cpstr newExt, SYSKEY syskey=syskey_all ); extern cpstr FileError ( int ErrCode ); extern void RemoveDelimiters ( pstr S, int SLen ); extern void PickOutNumber ( cpstr S, pstr SV, int SLen, int & j ); // ========================== File =============================== DefineClass(File); class File { public : File ( word BufSize=4096 ); virtual ~File(); // ---- control functions // FileName allows for "stdin", "stdout" and "stderr" as // for standard UNIX streams. void assign ( cpstr FileName, bool Text=false, bool UniB=false, GZ_MODE gzMode=GZM_NONE ); // assign for memory IO void assign ( word poolSize, word sizeInc, pstr filePool ); void takeFilePool ( pstr & filePool, word & fileSize ); inline void GetFilePool ( pstr & filePool, word & fileSize ) { takeFilePool ( filePool,fileSize ); } inline cpstr FileName() { return FName; } void truncate ( long size ); // call before reset/append bool reset ( bool ReadOnly=false, int retry=0 ); // = true if opened, each retry 1 sec sleep bool erase (); // = true if erased bool exists (); // = true if exists bool parse ( cpstr FileName ); // true if filled bool rename ( cpstr NewFileName ); // true if renamed bool rewrite (); // = true if opened bool append (); // = true if opened bool isOpen (); long Position (); inline long FileLength() { return FLength; } bool seek ( long Position ); bool FileEnd (); inline bool Success () { return IOSuccess; } inline void SetSuccess() { IOSuccess = true; } void flush (); void shut (); // ---- binary I/O word ReadFile ( void * Buffer, word Count ); word CreateRead ( pstr & Line ); word ReadTerLine ( pstr Line, bool longLine=false ); bool WriteFile ( const void * Buffer, word Count ); bool CreateWrite ( cpstr Line ); bool WriteTerLine ( cpstr Line, bool longLine=false ); // machine-independent binary I/O bool WriteReal ( realtype * V ); bool WriteFloat ( realtype * V ); bool WriteInt ( int * I ); bool WriteShort ( short * S ); bool WriteLong ( long * L ); bool WriteBool ( bool * B ); bool WriteByte ( byte * B ); bool WriteWord ( word * W ); bool ReadReal ( realtype * V ); bool ReadFloat ( realtype * V ); bool ReadInt ( int * I ); bool ReadShort ( short * S ); bool ReadLong ( long * L ); bool ReadBool ( bool * B ); bool ReadByte ( byte * B ); bool ReadWord ( word * B ); bool AddReal ( realtype * V ); bool AddFloat ( realtype * V ); bool AddInt ( int * I ); bool AddShort ( short * S ); bool AddLong ( long * L ); bool AddByte ( byte * B ); bool AddWord ( word * B ); // complex data binary I/O bool WriteVector ( rvector V, int len, int Shift ); bool WriteVector ( ivector iV, int len, int Shift ); bool WriteVector ( lvector lV, int len, int Shift ); bool WriteVector ( bvector B, int len, int Shift ); bool ReadVector ( rvector V, int maxlen, int Shift ); bool ReadVector ( ivector iV, int maxlen, int Shift ); bool ReadVector ( lvector lV, int maxlen, int Shift ); bool ReadVector ( bvector B, int maxlen, int Shift ); bool CreateReadVector ( rvector & V, int & len, int Shift ); bool CreateReadVector ( ivector & iV, int & len, int Shift ); bool CreateReadVector ( lvector & lV, int & len, int Shift ); bool CreateReadVector ( bvector & B, int & len, int Shift ); bool CreateReadVector ( rvector & V, int Shift ); bool CreateReadVector ( ivector & iV, int Shift ); bool CreateReadVector ( lvector & lV, int Shift ); bool CreateReadVector ( bvector & B, int Shift ); bool WriteMatrix ( rmatrix & A, int N, int M, int ShiftN, int ShiftM ); bool CreateReadMatrix ( rmatrix & A, int ShiftN, int ShiftM ); bool CreateReadMatrix ( rmatrix & A, int & N, int & M, int ShiftN, int ShiftM ); /// ---- text I/O bool Write ( cpstr Line ); //!< writes without LF bool Write ( realtype V, int length=10 ); //!< w/o LF bool Write ( int iV, int length=5 ); //!< w/o LF bool WriteLine ( cpstr Line ); //!< writes and adds LF bool LF (); //!< just adds LF word ReadLine ( pstr Line, word MaxLen=255 ); word ReadNonBlankLine ( pstr S, word MaxLen=255 ); /// complex data text I/O // writes with spaces and adds LF bool WriteDataLine ( realtype X, realtype Y, int length=10 ); bool WriteParameter ( cpstr S, realtype X, // writes parameter int ParColumn=40, // name S and value X int length=10 ); // at column ParColumn // and adds LF. bool WriteParameters ( cpstr S, int n_X, // writes parameter rvector X, // name S and n_X values int ParColumn=40, // X[0..n_X-1] at col int length=10 ); // ParColumn, ads LF. bool ReadParameter ( pstr S, realtype & X, // reads parameter int ParColumn=40 ); // name S and val X bool ReadParameter ( pstr S, int & X, int ParColumn=40 ); bool ReadParameters ( pstr S, int & n_X, // reads parameter rvector X, // name S, counts the int MaxLen=255, // of values n_X and int ParColumn=40 ); // reads X[0..n_X-1]. // MaxLen gives sizeof(S) // WriteColumns writes data stored in X, Y and Z in the form // of columns, adding a blank line in the end. If Z (or Z and Y) // are set to NULL, then only X and Y (or only X) are written. // Shift corresponds to the begining of arrays' enumeration // X[Shift..Shift+len-1]. bool WriteColumns ( rvector X, rvector Y, rvector Z, int len, int Shift, int MLength ); bool WriteColumns ( rvector X, rvector Y, int len, int Shift, int MLength ); // ReadColumns reads data stored by WriteColumns. X, Y, and Z // must be allocated prior to call. // xCol, yCol and zCol specify the order number of columns // (starting from 0) to be read into X, Y and Z, correspondingly. // If zCol (or zCol and yCol) < 0 then Z (or Z and Y) are not read. // Shift corresponds to the begining of arrays' enumeration // X[Shift..Shift+len-1]. // Returns number of lines read. int ReadColumns ( int maxlen, rvector X, rvector Y, rvector Z, int xCol, int yCol, int zCol, int Shift ); int ReadColumns ( int maxlen, rvector X, rvector Y, int xCol, int yCol, int Shift ); // CreateReadColumns reads data stored by WriteColumns. X, Y, // and Z must be set to NULL prior to call. They will be allocated // within the procedure. // xCol, yCol and zCol specify the order number of columns // (starting from 0) to be read into X, Y and Z, correspondingly. // If zCol (or zCol and yCol) < 0 then Z (or Z and Y) are not read. // Shift corresponds to the begining of arrays' enumeration // X[Shift..Shift+len-1]. // Returns number of lines read, errors are reported by // ErrorCode(). int CreateReadColumns ( rvector & X, rvector & Y, rvector & Z, int xCol, int yCol, int zCol, int Shift ); int CreateReadColumns ( rvector & X, rvector & Y, int xCol, int yCol, int Shift ); // ---- miscellaneous realtype GetNumber ( cpstr S ); FILE * GetHandle () { return hFile; } protected : word Buf_Size; bool TextMode,UniBin; GZ_MODE gzipMode; pstr IOBuf; word BufCnt,BufLen,BufInc; FILE * hFile; bool EofFile; pstr FName; long FLength; bool IOSuccess; int ErrCode; void FreeBuffer (); void _ReadColumns ( int & DLen, pstr S, int SLen, rvector X, rvector Y, rvector Z, int xCol, int yCol, int zCol, int Shift ); private : int gzipIO; bool StdIO,memIO,ownBuf; }; extern void SetGZIPPath ( pstr gzipPath, pstr ungzipPath ); extern void SetCompressPath ( pstr compressPath, pstr uncompressPath ); extern bool FileExists ( cpstr FileName, PFile f=NULL ); } } #endif mmdb2-2.0.20/mmdb2/hybrid_36.cpp0000644000175000017500000002052413271367640015746 0ustar maartenmaarten// $Id: hybrid_36.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // /*! C port of the hy36encode() and hy36decode() functions in the hybrid_36.py Python prototype/reference implementation. See the Python script for more information. This file has no external dependencies, NOT even standard C headers. Optionally, use hybrid_36_c.h, or simply copy the declarations into your code. This file is unrestricted Open Source (cctbx.sf.net). Please send corrections and enhancements to cctbx@cci.lbl.gov . See also: http://cci.lbl.gov/hybrid_36/ Ralf W. Grosse-Kunstleve, Feb 2007. */ /* The following #include may be commented out. It is here only to enforce consistency of the declarations and the definitions. */ #ifndef IOTBX_PDB_HYBRID_36_C_H #include "hybrid_36.h" #endif /* All static functions below are implementation details (and not accessible from other translation units). */ static const char* digits_upper() { return "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; } static const char* digits_lower() { return "0123456789abcdefghijklmnopqrstuvwxyz"; } static const char* value_out_of_range() { return "value out of range."; } static const char* invalid_number_literal() { return "invalid number literal."; } static const char* unsupported_width() { return "unsupported width."; } static void fill_with_stars(unsigned width, char* result) { while (width) { *result++ = '*'; width--; } *result = '\0'; } static void encode_pure( const char* digits, unsigned digits_size, unsigned width, int value, char* result) { char buf[16]; int rest; unsigned i, j; i = 0; j = 0; if (value < 0) { j = 1; value = -value; } while (1) { rest = value / digits_size; buf[i++] = digits[value - rest * digits_size]; if (rest == 0) break; value = rest; } if (j) buf[i++] = '-'; for(j=i;j 127) { *result = 0; return invalid_number_literal(); } if (si == ' ') { if (!have_non_blank) continue; value *= digits_size; } else if (si == '-') { if (have_non_blank) { *result = 0; return invalid_number_literal(); } have_non_blank = 1; have_minus = 1; continue; } else { have_non_blank = 1; dv = digits_values[si]; if (dv < 0 || dv >= (int)digits_size) { *result = 0; return invalid_number_literal(); } value *= digits_size; value += dv; } } if (have_minus) value = -value; *result = value; return 0; } /*! hybrid-36 encoder: converts integer value to string result width: must be 4 (e.g. for residue sequence numbers) or 5 (e.g. for atom serial numbers) value: integer value to be converted result: pointer to char array of size width+1 or greater on return result is null-terminated return value: pointer to error message, if any, or 0 on success Example usage (from C++): char result[4+1]; const char* errmsg = hy36encode(4, 12345, result); if (errmsg) throw std::runtime_error(errmsg); */ const char* hy36encode(unsigned width, int value, char* result) { int i = value; if (width == 4U) { if (i >= -999) { if (i < 10000) { encode_pure(digits_upper(), 10U, 4U, i, result); return 0; } i -= 10000; if (i < 1213056 /* 26*36**3 */) { i += 466560 /* 10*36**3 */; encode_pure(digits_upper(), 36U, 0U, i, result); return 0; } i -= 1213056; if (i < 1213056) { i += 466560; encode_pure(digits_lower(), 36U, 0U, i, result); return 0; } } } else if (width == 5U) { if (i >= -9999) { if (i < 100000) { encode_pure(digits_upper(), 10U, 5U, i, result); return 0; } i -= 100000; if (i < 43670016 /* 26*36**4 */) { i += 16796160 /* 10*36**4 */; encode_pure(digits_upper(), 36U, 0U, i, result); return 0; } i -= 43670016; if (i < 43670016) { i += 16796160; encode_pure(digits_lower(), 36U, 0U, i, result); return 0; } } } else { fill_with_stars(width, result); return unsupported_width(); } fill_with_stars(width, result); return value_out_of_range(); } /*! hybrid-36 decoder: converts string s to integer result width: must be 4 (e.g. for residue sequence numbers) or 5 (e.g. for atom serial numbers) s: string to be converted does not have to be null-terminated s_size: size of s must be equal to width, or an error message is returned otherwise result: integer holding the conversion result return value: pointer to error message, if any, or 0 on success Example usage (from C++): int result; const char* errmsg = hy36decode(width, "A1T5", 4, &result); if (errmsg) throw std::runtime_error(errmsg); */ const char* hy36decode(unsigned width, const char* s, unsigned s_size, int* result) { static int first_call = 1; static int digits_values_upper[128U]; static int digits_values_lower[128U]; static const char* ie_range = "internal error hy36decode: integer value out of range."; unsigned i; int di; const char* errmsg; if (first_call) { first_call = 0; for(i=0;i<128U;i++) digits_values_upper[i] = -1; for(i=0;i<128U;i++) digits_values_lower[i] = -1; for(i=0;i<36U;i++) { di = digits_upper()[i]; if (di < 0 || di > 127) { *result = 0; return ie_range; } digits_values_upper[di] = i; } for(i=0;i<36U;i++) { di = digits_lower()[i]; if (di < 0 || di > 127) { *result = 0; return ie_range; } digits_values_lower[di] = i; } } if (s_size == width) { di = s[0]; if (di >= 0 && di <= 127) { if (digits_values_upper[di] >= 10) { errmsg = decode_pure(digits_values_upper, 36U, s, s_size, result); if (errmsg == 0) { /* result - 10*36**(width-1) + 10**width */ if (width == 4U) (*result) -= 456560; else if (width == 5U) (*result) -= 16696160; else { *result = 0; return unsupported_width(); } return 0; } } else if (digits_values_lower[di] >= 10) { errmsg = decode_pure(digits_values_lower, 36U, s, s_size, result); if (errmsg == 0) { /* result + 16*36**(width-1) + 10**width */ if (width == 4U) (*result) += 756496; else if (width == 5U) (*result) += 26973856; else { *result = 0; return unsupported_width(); } return 0; } } else { errmsg = decode_pure(digits_values_upper, 10U, s, s_size, result); if (errmsg) return errmsg; if (!(width == 4U || width == 5U)) { *result = 0; return unsupported_width(); } return 0; } } } *result = 0; return invalid_number_literal(); } mmdb2-2.0.20/mmdb2/mmdb_symop.h0000644000175000017500000001146313271367640015772 0ustar maartenmaarten// $Id: mmdb_symop.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_SymOp // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : mmdb::SymOp ( symmetry operators ) // ~~~~~~~~~ mmdb::SymOps ( container of symmetry operators ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_SymOp__ #define __MMDB_SymOp__ #include "mmdb_io_stream.h" #include "mmdb_defs.h" namespace mmdb { // ==================== SymOp ======================== DefineClass(SymOp); DefineStreamFunctions(SymOp); class SymOp : public io::Stream { public : SymOp (); SymOp ( io::RPStream Object ); ~SymOp(); int SetSymOp ( cpstr XYZOperation ); pstr GetSymOp (); void Transform ( realtype & x, realtype & y, realtype & z ); void GetTMatrix ( mat44 & TMatrix ); // copies T to TMatrix void SetTMatrix ( mat44 & TMatrix ); // copies TMatrix to T bool CompileOpTitle ( pstr S ); // makes XYZOp from matrix T bool CompileOpTitle ( pstr S, mat44 symMat, bool compare ); void Print (); // prints operation and matrix void Copy ( PSymOp symOp ); void write ( io::RFile f ); void read ( io::RFile f ); protected : pstr XYZOp; mat44 T; void InitSymOp (); void FreeMemory (); int GetOperation ( int n ); }; // ==================== SymOps ======================== enum SYMOP_RC { SYMOP_Ok = 0, SYMOP_NoLibFile = -1, SYMOP_UnknownSpaceGroup = -2, SYMOP_NoSymOps = -3, SYMOP_WrongSyntax = -4, SYMOP_NotAnOperation = -5, SYMOP_ZeroDenominator = -6 }; DefineClass(SymOps); DefineStreamFunctions(SymOps); class SymOps : public io::Stream { public : SymOps (); SymOps ( io::RPStream Object ); ~SymOps(); virtual void FreeMemory(); int SetGroupSymopLib ( cpstr SpaceGroup, cpstr symop_lib=NULL ); // Space Group is taken from symop.lib. Return Code: // SYMOP_Ok <=> success int SetGroup ( cpstr SpaceGroup, cpstr syminfo_lib=NULL ); // Space Group is taken from syminfo.lib. Return Code: // SYMOP_Ok <=> success void Reset (); // removes all symmetry operations virtual int AddSymOp ( cpstr XYZOperation ); // adds symmetry // operation void PutGroupName ( cpstr SpGroupName ); // GetNofSymOps() returns Nops -- the number of sym. operations int GetNofSymOps (); pstr GetSymOp ( int Nop ); // Transform(..) transforms the coordinates according to the // symmetry operation Nop. The return code is non-zero if // Nop is a wrong operation number (must range from 0 to Nops-1). int Transform ( realtype & x, realtype & y, realtype & z, int Nop ); // GetTMatrix(..) returns the coordinate transformation matrix // for the symmetry operation Nop. The return code is non-zero if // Nop is a wrong operation number (must range from 0 to Nops-1). int GetTMatrix ( mat44 & TMatrix, int Nop ); void Print (); virtual void Copy ( PSymOps symOps ); void write ( io::RFile f ); void read ( io::RFile f ); protected : pstr SpGroup; int Nops; PPSymOp symOp; void InitSymOps(); }; } // namespace mmdb // extern void TestSymOps(); #endif mmdb2-2.0.20/mmdb2/mmdb_symop.cpp0000644000175000017500000006005613271367640016327 0ustar maartenmaarten// $Id: mmdb_symop.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_SymOp // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : mmdb::SymOp ( symmetry operators ) // ~~~~~~~~~ mmdb::SymOps ( container of symmetry operators ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include #include #include "mmdb_symop.h" namespace mmdb { // ==================== SymOp ======================== SymOp::SymOp() : io::Stream() { InitSymOp(); } SymOp::SymOp ( io::RPStream Object ) : io::Stream(Object) { InitSymOp(); } SymOp::~SymOp() { FreeMemory(); } void SymOp::InitSymOp() { int i,j; XYZOp = NULL; for (i=0;i<4;i++) { for (j=0;j<4;j++) T[i][j] = 0.0; T[i][i] = 1.0; } } void SymOp::FreeMemory() { if (XYZOp) delete[] XYZOp; XYZOp = NULL; } int SymOp::SetSymOp ( cpstr XYZOperation ) { int i,j; CreateCopy ( XYZOp,XYZOperation ); DelSpaces ( XYZOp ); for (i=0;i<4;i++) for (j=0;j<4;j++) T[i][j] = 0.0; i = GetOperation ( 0 ); if (!i) i = GetOperation ( 1 ); if (!i) i = GetOperation ( 2 ); T[3][3] = 1.0; return i; } pstr SymOp::GetSymOp() { if (XYZOp) return XYZOp; else return pstr(""); } int SymOp::GetOperation ( int n ) { char L[100]; pstr p1,p2; int len; realtype V; p1 = XYZOp; p2 = FirstOccurence ( p1,',' ); if (!p2) return SYMOP_WrongSyntax; if (n>0) { p1 = p2+1; p2 = FirstOccurence ( p1,',' ); if (!p2) return SYMOP_WrongSyntax; } if (n>1) { p1 = p2+1; p2 = NULL; } if (p2) *p2 = char(0); strcpy ( L,p1 ); if (p2) *p2 = ','; DelSpaces ( L ); if (!L[0]) return SYMOP_WrongSyntax; UpperCase ( L ); len = strlen ( L ); T[n][0] = 0.0; if (L[0]=='X') { T[n][0] += 1.0; L[0] = ' '; } do { p1 = strstr ( L,"+X" ); if (p1) { T[n][0] += 1.0; strncpy ( p1," ",2 ); } } while (p1); do { p1 = strstr ( L,"-X" ); if (p1) { T[n][0] -= 1.0; strncpy ( p1," ",2 ); } } while (p1); T[n][1] = 0.0; if (L[0]=='Y') { T[n][1] += 1.0; L[0] = ' '; } do { p1 = strstr ( L,"+Y" ); if (p1) { T[n][1] += 1.0; strncpy ( p1," ",2 ); } } while (p1); do { p1 = strstr ( L,"-Y" ); if (p1) { T[n][1] -= 1.0; strncpy ( p1," ",2 ); } } while (p1); T[n][2] = 0.0; if (L[0]=='Z') { T[n][2] += 1.0; L[0] = ' '; } do { p1 = strstr ( L,"+Z" ); if (p1) { T[n][2] += 1.0; strncpy ( p1," ",2 ); } } while (p1); do { p1 = strstr ( L,"-Z" ); if (p1) { T[n][2] -= 1.0; strncpy ( p1," ",2 ); } } while (p1); DelSpaces ( L ); if ((int)strlen(L)>=len) return SYMOP_NotAnOperation; // translational part p1 = L; T[n][3] = strtod ( p1,&p2 ); if (*p2=='/') { p1 = p2+1; V = strtod ( p1,&p2 ); if (V==0.0) return SYMOP_ZeroDenominator; T[n][3] /= V; } return SYMOP_Ok; } void MakeSign ( pstr S, realtype V, realtype & AV ) { int l; if (V>0.0) { l = strlen ( S ); if (l>0) { if (S[l-1]!=',') { strcat ( S,"+" ); } } AV = V; } else if (V<0.0) { strcat ( S,"-" ); AV = -V; } else { AV = V; return; } } #define __eps 1.0e-5 void GenTranslation ( pstr S, realtype V ) { realtype AV,nAV; char N[50]; int n,d; if (fabs(V)<=__eps) return; MakeSign ( S,V,AV ); d = 0; n = -1; while ((d<=20) && (n<0)) { d++; nAV = AV*d; n = mround(nAV); if (fabs(nAV-n)>__eps) n = -1; } if (d<=1) sprintf ( N,"%i" ,n ); else if (n>=0) sprintf ( N,"%i/%i" ,n,d ); else sprintf ( N,"%-.10g",AV ); strcat ( S,N ); } void GenTransformation ( pstr S, realtype V, pstr Axis ) { realtype AV,nAV; char N[50]; int n,d; if (fabs(V)<=__eps) return; MakeSign ( S,V,AV ); if (fabs(AV-1.0)>__eps) { d = 0; n = -1; while ((d<=20) && (n<0)) { d++; nAV = AV*d; n = mround(nAV); if (fabs(nAV-n)>__eps) n = -1; } if (n>=0) sprintf ( N,"%i/%i*",n,d ); else sprintf ( N,"%-.10g*",AV ); strcat ( S,N ); } strcat ( S,Axis ); } /* void GenTranslation ( pstr S, realtype V ) { realtype AV,fAV; int n,d; char N[50]; if (V==0.0) return; MakeSign ( S,V,AV ); n = mround(floor(AV+0.00000001)); fAV = AV-n; if (fabs(fAV-0.5)<=__eps) { n += 1; d = 2; } else if (fabs(fAV-0.25)<=__eps) { n += 1; d = 4; } else if (fabs(fAV-0.75)<=__eps) { n += 3; d = 4; } else if (fabs(fAV-0.33333333333)<=__eps) { n += 1; d = 3; } else if (fabs(fAV-0.66666666666)<=__eps) { n += 2; d = 3; } else if (fabs(fAV-0.16666666666)<=__eps) { n += 1; d = 6; } else if (fabs(fAV-0.83333333333)<=__eps) { n += 5; d = 6; } else d = 1; N[0] = char(0); if (d>1) sprintf ( N,"%i/%i",n,d ); else if (n>0) sprintf ( N,"%i",n ); else ParamStr ( N,pstr(""),AV ); strcat ( S,N ); } void GenTransformation ( pstr S, realtype V, pstr Axis ) { realtype AV; if (V==0.0) return; MakeSign ( S,V,AV ); if (fabs(AV-0.5)<=__eps) strcat ( S,"1/2*" ); else if (fabs(AV-0.25)<=__eps) strcat ( S,"1/4*" ); else if (fabs(AV-0.75)<=__eps) strcat ( S,"3/4*" ); else if (fabs(AV-0.33333333333)<=__eps) strcat ( S,"1/3*" ); else if (fabs(AV-0.66666666666)<=__eps) strcat ( S,"2/3*" ); else if (fabs(AV-0.16666666666)<=__eps) strcat ( S,"1/6*" ); else if (fabs(AV-0.83333333333)<=__eps) strcat ( S,"5/6*" ); else if (fabs(AV-1.0)>__eps) ParamStr ( S,pstr(""),AV, 10,pstr("*") ); strcat ( S,Axis ); } */ bool SymOp::CompileOpTitle ( pstr S ) { return CompileOpTitle ( S,T,true ); } bool SymOp::CompileOpTitle ( pstr S, mat44 symMat, bool compare ) { S[0] = char(0); GenTransformation ( S,symMat[0][0],pstr("X") ); GenTransformation ( S,symMat[0][1],pstr("Y") ); GenTransformation ( S,symMat[0][2],pstr("Z") ); GenTranslation ( S,symMat[0][3] ); strcat ( S,"," ); GenTransformation ( S,symMat[1][0],pstr("X") ); GenTransformation ( S,symMat[1][1],pstr("Y") ); GenTransformation ( S,symMat[1][2],pstr("Z") ); GenTranslation ( S,symMat[1][3] ); strcat ( S,"," ); GenTransformation ( S,symMat[2][0],pstr("X") ); GenTransformation ( S,symMat[2][1],pstr("Y") ); GenTransformation ( S,symMat[2][2],pstr("Z") ); GenTranslation ( S,symMat[2][3] ); DelSpaces ( S ); if ((!compare) || (!strcmp(S,XYZOp))) return true; else { S[0] = char(0); GenTranslation ( S,symMat[0][3] ); GenTransformation ( S,symMat[0][0],pstr("X") ); GenTransformation ( S,symMat[0][1],pstr("Y") ); GenTransformation ( S,symMat[0][2],pstr("Z") ); strcat ( S,"," ); GenTranslation ( S,symMat[1][3] ); GenTransformation ( S,symMat[1][0],pstr("X") ); GenTransformation ( S,symMat[1][1],pstr("Y") ); GenTransformation ( S,symMat[1][2],pstr("Z") ); strcat ( S,"," ); GenTranslation ( S,symMat[2][3] ); GenTransformation ( S,symMat[2][0],pstr("X") ); GenTransformation ( S,symMat[2][1],pstr("Y") ); GenTransformation ( S,symMat[2][2],pstr("Z") ); DelSpaces ( S ); if (!strcmp(S,XYZOp)) return true; } return false; } void SymOp::Transform ( realtype & x, realtype & y, realtype & z ) { realtype x1,y1,z1; x1 = T[0][0]*x + T[0][1]*y + T[0][2]*z + T[0][3]; y1 = T[1][0]*x + T[1][1]*y + T[1][2]*z + T[1][3]; z1 = T[2][0]*x + T[2][1]*y + T[2][2]*z + T[2][3]; x = x1; y = y1; z = z1; } void SymOp::GetTMatrix ( mat44 & TMatrix ) { // copies T to TMatrix int i,j; for (i=0;i<4;i++) for (j=0;j<4;j++) TMatrix[i][j] = T[i][j]; } void SymOp::SetTMatrix ( mat44 & TMatrix ) { // copies TMatrix to T int i,j; for (i=0;i<4;i++) for (j=0;j<4;j++) T[i][j] = TMatrix[i][j]; } void SymOp::Print() { int i; printf ( " operation '%s'\n",XYZOp ); for (i=0;i<4;i++) printf ( " %10.3g %10.3g %10.3g %10.3g\n", T[i][0],T[i][1],T[i][2],T[i][3] ); } void SymOp::Copy ( PSymOp SymOp ) { int i,j; CreateCopy ( XYZOp,SymOp->XYZOp ); for (i=0;i<4;i++) for (j=0;j<4;j++) T[i][j] = SymOp->T[i][j]; } void SymOp::write ( io::RFile f ) { int i,j; byte Version=1; f.WriteByte ( &Version ); f.CreateWrite ( XYZOp ); for (i=0;i<4;i++) for (j=0;j<4;j++) f.WriteReal ( &(T[i][j]) ); } void SymOp::read ( io::RFile f ) { int i,j; byte Version; f.ReadByte ( &Version ); f.CreateRead ( XYZOp ); for (i=0;i<4;i++) for (j=0;j<4;j++) f.ReadReal ( &(T[i][j]) ); } MakeStreamFunctions(SymOp) // ==================== SymOps ======================== SymOps::SymOps() : io::Stream() { InitSymOps(); } SymOps::SymOps ( io::RPStream Object ) : io::Stream(Object) { InitSymOps(); } SymOps::~SymOps() { FreeMemory(); } void SymOps::InitSymOps() { SpGroup = NULL; Nops = 0; symOp = NULL; } void SymOps::FreeMemory() { int i; if (SpGroup) delete[] SpGroup; SpGroup = NULL; if (symOp) { for (i=0;iSetSymOp ( S ); } f.shut(); return RC; } #define syminfo_file cpstr("syminfo.lib") int SymOps::SetGroup ( cpstr SpaceGroup, cpstr syminfo_lib ) { io::File f; pstr p; psvector lines,lines1; char S[500]; char G[100]; char O[100]; mat44 T1,T2,T3; int i,j,k,l,m,n,RC; int nlines,npops,ncops; FreeMemory(); npops = 0; ncops = 0; CreateCopy ( SpGroup,SpaceGroup ); if (!syminfo_lib) p = pstr(syminfo_file); else if (!syminfo_lib[0]) p = pstr(syminfo_file); else p = pstr(syminfo_lib); f.assign ( p,true ); if (!f.reset(true)) { p = getenv ( "SYMINFO" ); if (p) strcpy ( S,p ); else { p = getenv ( "CLIBD" ); if (p) { strcpy ( S,p ); if (S[strlen(S)-1]!='/') strcat ( S,"/" ); strcat ( S,"syminfo.lib" ); } else strcpy ( S,"syminfo.lib" ); } f.assign ( S,true ); if (!f.reset(true)) return SYMOP_NoLibFile; } if (strncasecmp(SpGroup,"Hall:",5)) { // normal space group symbol on input strcpy ( G," '" ); strcat ( G,SpGroup ); strcat ( G,"'" ); S[0] = char(0); while (!f.FileEnd() && !(strstr(S,G) && (strstr(S,"symbol xHM") || strstr(S,"symbol old")))) f.ReadLine ( S,sizeof(S) ); } else { // hall descriptor on input strcpy ( G," ' " ); p = &(SpGroup[5]); while (*p==' ') p++; strcat ( G,p ); strcat ( G,"'" ); S[0] = char(0); while (!f.FileEnd() && !(strstr(S,G) && strstr(S,"symbol Hall"))) f.ReadLine ( S,sizeof(S) ); } if (f.FileEnd()) { f.shut(); return SYMOP_UnknownSpaceGroup; } // found spacegroup, move to symop lines while (!f.FileEnd() && (!strstr(S,"symop"))) f.ReadLine ( S,sizeof(S) ); nlines = 256; GetVectorMemory ( lines,nlines,0 ); for (i=0;i=nlines) { nlines += + 256; GetVectorMemory ( lines1,nlines,0 ); for (i=0;i=nlines) { nlines += + 256; GetVectorMemory ( lines1,nlines,0 ); for (i=0;iSetSymOp ( lines[n++]+6 ); } // loop over non-trivial centering operators, and for each loop // over primtive operators for (i=1;(iSetSymOp ( lines[n]+6 ); symOp[i*npops+j]->GetTMatrix(T1); symOp[j]->GetTMatrix(T2); for (k=0;k<4;k++) for (l=0;l<4;l++) { T3[k][l] = 0.0; for (m=0;m<4;m++) T3[k][l] += T1[k][m]*T2[m][l]; } for (k=0;k<3;k++) // kdc fix T3[k][3] -= floor ( T3[k][3] ); // kdc fix symOp[i*npops+j]->CompileOpTitle ( O,T3,false ); symOp[i*npops+j]->SetSymOp ( O ); } } f.shut(); for (i=0;iSetSymOp ( S+6 ); } // skip identity centering operator f.ReadLine ( S,sizeof(S) ); // loop over non-trivial centering operators, and for each loop // over primtive operators for (i=1;(iSetSymOp ( S+6 ); SymOp[i*npops+j]->GetTMatrix(T1); SymOp[j]->GetTMatrix(T2); for (k=0;k<4;k++) for (l=0;l<4;l++) { T3[k][l] = 0.0; for (m=0;m<4;m++) T3[k][l] += T1[k][m]*T2[m][l]; } for (k=0;k<3;k++) // kdc fix T3[k][3] -= floor ( T3[k][3] ); // kdc fix SymOp[i*npops+j]->CompileOpTitle(O,T3,false); SymOp[i*npops+j]->SetSymOp (O); } } f.shut(); return RC; } */ void SymOps::Reset() { // removes all symmetry operations FreeMemory(); } int SymOps::AddSymOp ( cpstr XYZOperation ) { // adds a symmetry operation PPSymOp symOp1; int i; symOp1 = new PSymOp[Nops+1]; for (i=0;iSetSymOp ( XYZOperation ); } void SymOps::PutGroupName ( cpstr SpGroupName ) { CreateCopy ( SpGroup,SpGroupName ); } int SymOps::GetNofSymOps() { // GetNofSymOps() returns Nops -- the number of symmetry operations return Nops; } pstr SymOps::GetSymOp ( int Nop ) { if ((0<=Nop) && (NopGetSymOp(); else return pstr(""); } int SymOps::Transform ( realtype & x, realtype & y, realtype & z, int Nop ) { // Transform(..) transforms the coordinates according to the // symmetry operation Nop. The return code is non-zero if // Nop is a wrong operation number (must range from 0 to Nops-1). if ((Nop<0) || (Nop>=Nops)) return 1; if (symOp[Nop]) { symOp[Nop]->Transform ( x,y,z ); return 0; } else return 2; } int SymOps::GetTMatrix ( mat44 & TMatrix, int Nop ) { // GetTMatrix(..) returns the coordinate transformation matrix // for the symmetry operation Nop. The return code is non-zero if // Nop is a wrong operation number (must range from 0 to Nops-1). if ((Nop<0) || (Nop>=Nops)) return 1; if (symOp[Nop]) { symOp[Nop]->GetTMatrix ( TMatrix ); return 0; } else return 2; } void SymOps::Print() { int i; char S[200]; printf ( " SPACE GROUP '%s'\n",SpGroup ); for (i=0;iPrint(); if (symOp[i]->CompileOpTitle(S)) printf ( " CHECK STATUS: Ok\n" ); else printf ( " CHECK STATUS: Generated '%s'\n",S ); } } void SymOps::Copy ( PSymOps SymOps ) { int i; FreeMemory(); CreateCopy ( SpGroup,SymOps->SpGroup ); Nops = SymOps->Nops; if (Nops>0) { symOp = new PSymOp[Nops]; for (i=0;iCopy ( SymOps->symOp[i] ); } } } void SymOps::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.CreateWrite ( SpGroup ); f.WriteInt ( &Nops ); for (i=0;i0) { symOp = new PSymOp[Nops]; for (i=0;i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB), "new rwbrook" // ~~~~~~~~~ // **** Functions : mmdb_f_init_ ( initializer ) // ~~~~~~~~~~~ mmdb_f_quit_ ( disposer ) // autoserials_ ( switch to the autoserials regime ) // setreadcoords_ ( switch for reading coordinates ) // simrwbrook_ ( simulates old RWBROOK printout ) // mmdb_f_openl_ ( associates a unit with a file ) // mmdb_f_open_ ( associates a unit with a file ) // mmdb_f_copy_ ( copies contents of units ) // mmdb_f_delete_ ( deletes part of a unit ) // mmdb_f_settype_ ( changes type of file and r/w mode ) // mmdb_f_setname_ ( changes file name ) // mmdb_f_write_ ( writes a data structure into file ) // mmdb_f_close_ ( closes and disposes a data str-re ) // mmdb_f_advance_ ( advances the internal pointer ) // mmdb_f_rewd_ ( sets internal pointer on the top ) // mmdb_f_bksp_ ( shifts int-l pointer 1 atom back ) // mmdb_f_atom_ ( reads/writes atom properties ) // mmdb_f_coord_ ( reads/writes atom coordinates ) // mmdb_f_setcell_ ( sets the crystal cell parameters ) // mmdb_f_wbspgrp_ ( sets the space group ) // mmdb_f_rbspgrp_ ( gets the space group ) // mmdb_f_wbcell_ ( sets the crystal cell parameters ) // mmdb_f_rbcell_ ( gets the crystal cell parameters ) // mmdb_f_rbcelln_ ( gets the crystal cell parameters ) // mmdb_f_rbrcel_ ( gets the recipricol cell ) // mmdb_f_rborf_ ( returns or fill transf. matrices ) // mmdb_f_orthmat_ ( calc. standard othogonalisations ) // mmdb_f_cvanisou_ ( converts between cryst-c units ) // mmdb_f_wremark_ ( writes a remark statement ) // mmdb_f_setter // mmdb_f_sethet // mmdb_f_getnofncsmates_ // rberrstop_ ( error messenger ) // rbcheckerr_ ( a simple error messenger ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_RWBrook__ #define __MMDB_RWBrook__ #include "mmdb_mattype.h" #include "mmdb_machine_.h" // ****** mmdb_rwbrook error codes enum RWB_ERROR { RWBERR_Ok = 0, RWBERR_NoChannel = -1, RWBERR_NoFile = -2, RWBERR_NoLogicalName = -3, RWBERR_CantOpenFile = -4, RWBERR_WrongInteger = -5, RWBERR_WrongModelNo = -6, RWBERR_DuplicatedModel = -7, RWBERR_ForeignFile = -8, RWBERR_WrongEdition = -9, RWBERR_ATOM_Unrecognd = -10, RWBERR_ATOM_AlreadySet = -11, RWBERR_ATOM_NoResidue = -12, RWBERR_ATOM_Unmatch = -13, RWBERR_NoAdvance = -14, RWBERR_EmptyPointer = -15, RWBERR_NoMatrices = -16, RWBERR_NoCoordinates = -17, RWBERR_Disagreement = -18, RWBERR_NoOrthCode = -19, RWBERR_NoCheck = -20, RWBERR_NoCellParams = -21, RWBERR_NotACIFFile = -22, RWBERR_NoData = -23, RWBERR_UnrecognCIFItems = -24, RWBERR_MissingCIFField = -25, RWBERR_EmptyCIFLoop = -26, RWBERR_UnexpEndOfCIF = -27, RWBERR_MissgCIFLoopField = -28, RWBERR_NotACIFStructure = -29, RWBERR_NotACIFLoop = -30, RWBERR_WrongReal = -31, RWBERR_WrongChainID = -32, RWBERR_WrongEntryID = -33, RWBERR_SEQRES_serNum = -34, RWBERR_SEQRES_numRes = -35, RWBERR_SEQRES_exraRes = -36, RWBERR_NCSM_Unrecogn = -37, RWBERR_NCSM_AlreadySet = -38, RWBERR_NCSM_WrongSerial = -39, RWBERR_NCSM_UnmatchIG = -40, RWBERR_NoModel = -41, RWBERR_NoSheetID = -42, RWBERR_WrongSheetID = -43, RWBERR_WrongStrandNo = -44, RWBERR_WrongNofStrands = -45, RWBERR_WrongSheetOrder = -46, RWBERR_HBondInconsis = -47, RWBERR_EmptyResidueName = -48, RWBERR_DuplicateSeqNum = -49, RWBERR_GeneralError1 = -50, RWBERR_Error1 = -101, RWBERR_Error2 = -102, RWBERR_Error3 = -103 }; // ***** mmdb_rwbrook warning flags // 0x00004000 means "it's a warning" enum RWB_WARNING { RWBWAR_Warning = 0x00004000, RWBWAR_RewOutput = 0x00004010, RWBWAR_FileTop = 0x00004020, RWBWAR_WrongSerial = 0x00004040, RWBWAR_UnkFormFactor = 0x00004080, RWBWAR_AmbFormFactor = 0x00004100, RWBWAR_NoOccupancy = 0x00004200, RWBWAR_NoTempFactor = 0x00004400 }; // ------------------------------------------------------------------ // mmdb_f_init_() makes a general initialization of the file system. // It must be called ONLY ONCE from the top of an application. // FORTRAN equivalent: subroutine MMDB_F_Init // ~~~~~~~~~~~~~~~~~~~ FORTRAN_SUBR ( MMDB_F_INIT, mmdb_f_init, (),(),() ); // ------------------------------------------------------------------ // mmdb_f_quit_() disposes the file system. A correct use assumes that // it will be called before an application quits. // FORTRAN equivalent: subroutine MMDB_F_Quit // ~~~~~~~~~~~~~~~~~~~ FORTRAN_SUBR ( MMDB_F_QUIT, mmdb_f_quit, (),(),() ); // ------------------------------------------------------------------ // autoserials_(..) switches On/Off the regime of automatical // generation of atom serial numbers at reading from PDB ASCII file. // The autoserials regime is On if iOnOff parameter is set to // non-zero, and the regime is turned Off otherwise. The setting // will last until next call to autoserials_(..) // // When this regime is Off (default state), all atom serial // numbers are expected to be in strictly incremental order and // any deviation from this rule will cause end of reading and // MMDB_F_Open_(..) will issue the RWBERR_AlreadySet error code. If // this code is then passed to error messengers (rberrstop_(..) or // rbcheckerr_(..)) the application will stop. It is Ok, however, // for serial numbers to increment by 2 or more. // // When the autoserials regime is On, MMDB_F_Open_(..) does not pay // attention to the serial numbers and generates them for each // atom in strict incremental-by-one. This will work correctly only // if all atom records ("ATOM"/"HETATM", "SIGATM", "ANISOU" and // "SIGUIJ") are grouped, for every atom, as they should (precisely, // "ATOM" or "HETATM" opens the group, then "SIGATM", "ANISOU" and // "SIGUIJ" should follow until next "ATOM"/"HETATM" is met). // FORTRAN equivalent: subroutine AutoSerials ( iOnOff ) // ~~~~~~~~~~~~~~~~~~~ integer iOnOff FORTRAN_SUBR ( AUTOSERIALS,autoserials, ( int * iOnOff ), ( int * iOnOff ), ( int * iOnOff ) ); // ------------------------------------------------------------------ // setreadcoords_(..) switches On/Off the reading of atomic // coordinates when mmdb_f_open_ is called for input. The coordinates // will be read if iOnOff parameter is set to non-zero, otherwise // the reading will stop on the coordinate section of PDB file. // The setting will last until the next call to setreadcoords_(..). // // By default, the coordinates are read. // // FORTRAN equivalent: subroutine SetReadCoords ( iOnOff ) // ~~~~~~~~~~~~~~~~~~~ integer iOnOff FORTRAN_SUBR ( SETREADCOORDS,setreadcoords, ( int * iOnOff ), ( int * iOnOff ), ( int * iOnOff ) ); // ------------------------------------------------------------------ // simrwbrook_(..) switches On/Off the regime of exact following // the old fortran RWBROOK's way of issuing messages and warnings. // // By default, this regime is switched off, which supresses all // messages from mmdb_rwbrook unless directly ordered or catastrophic. // Switching this regime on will make the printout of converted // programs significantly closer to that resulting from the use of // old fortran RWBROOK package. The setting will last until the // next call to simrwbrook_(..). // // FORTRAN equivalent: subroutine SimRWBROOK ( iOnOff ) // ~~~~~~~~~~~~~~~~~~~ integer iOnOff FORTRAN_SUBR ( SIMRWBROOK,simrwbrook, ( int * iOnOff ), ( int * iOnOff ), ( int * iOnOff ) ); // ------------------------------------------------------------------ // mmdb_f_open_(..) associates a coordinate file with channel number // given in iUnit. If iUnit was previously associated with another // or the same file, the file gets complete logical reinitialization // which means that all previous modifications to the file are lost // unless stored on disk with mmdb_f_write_(..) or mmdb_f_close_(..). // // If the file is to be opened for input (RWStat is set to // "INPUT"), all contents of the file is read into memory. It may be // then modified and written back into a file (same or different). // // If the file is to be opened for output (RWStat is set to // "OUTPUT"), no file is physically opened, and only empty data // structure is created in the memory. It may then be added with the // data and stored in a disk file. // // If FType is set to "PDB" or " ", the physical file is assumed // to be read or written in the PDB format. "CIF" option is reserved // for mmCIF files and is not realized at present. "BIN" means // binary format. Note that both file name and file type may be // changed before writting the file (see mmdb_f_setname_(..) and // mmdb_f_settype_(..)). // // mmdb_f_open(..) sets an internal pointer to "before the first" // atom in the file (therefore it should be advanced to get access // to the first atom, see mmdb_f_advance1_(..)). This pointer is used // for getting atomic coordinates and other atomic characteristics // from the file structure or for storing them into the structure. // The pointer may be advanced, backspaced or set to a specific // position in the file structure (see below). // // iRet returns the error code (defined above). Extended // information on the error may be then obtained through the // geterror_(..) function immediately after return from // mmdb_f_open_(..). // FORTRAN equivalent: subroutine MMDB_F_Open ( LName,RWStat,FType, // ~~~~~~~~~~~~~~~~~~~ iUnit,iRet ) // character*(*) LName,RWStat,FType // integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_OPEN, mmdb_f_open, ( // lengths-at-end list mmdb::machine::fpstr LName, // logical name mmdb::machine::fpstr RWStat, // "INPUT" or "OUTPUT" mmdb::machine::fpstr FType, // "PDB", "CIF", "BIN" or " " int * iUnit, // channel number int * iRet, // returns error code int LName_len, // fortran-hidden length of LName int RWStat_len, // fortran-hidden length of RWStat int FType_len // fortran-hidden length of FType ), ( // lengths-in-structure list mmdb::machine::fpstr LName, mmdb::machine::fpstr RWStat, mmdb::machine::fpstr FType, int * iUnit, int * iRet ), ( // lengths-follow list mmdb::machine::fpstr LName, int LName_len, mmdb::machine::fpstr RWStat, int RWStat_len, mmdb::machine::fpstr FType, int FType_len, int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_open1_(..) is equivalent to mmdb_f_open_(..) but takes directly // the file name (FName) instead of logical name (LName). // // FORTRAN equivalent: subroutine MMDB_F_Open1 ( FName,RWStat,FType, // ~~~~~~~~~~~~~~~~~~~ iUnit,iRet ) // character*(*) FName,RWStat,FType // integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_OPEN1, mmdb_f_open1, ( // lengths-at-end list mmdb::machine::fpstr FName, // file name mmdb::machine::fpstr RWStat, // "INPUT" or "OUTPUT" mmdb::machine::fpstr FType, // "PDB", "CIF", "BIN" or " " int * iUnit, // channel number int * iRet, // returns error code int FName_len, // fortran-hidden length of FName int RWStat_len, // fortran-hidden length of RWStat int FType_len // fortran-hidden length of FType ), ( // lengths-in-structure list mmdb::machine::fpstr FName, mmdb::machine::fpstr RWStat, mmdb::machine::fpstr FType, int * iUnit, int * iRet ), ( // lengths-follow list mmdb::machine::fpstr FName, int FName_len, mmdb::machine::fpstr RWStat, int RWStat_len, mmdb::machine::fpstr FType, int FType_len, int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_copy_(..) copies the specified part(s) of iUnit2 into iUnit1. // All data which contained in the corresponding part(s) of iUnit1 // before the copying, is destroyed. // // FORTRAN equivalent: subroutine MMDB_F_Copy ( iUnit1,iUnit2, // ~~~~~~~~~~~~~~~~~~~ copyKey,iRet ) // integer iUnit1,iUnit2,copyKey,iRet FORTRAN_SUBR ( MMDB_F_COPY, mmdb_f_copy, ( // lengths-at-end list int * iUnit1, // destination unit int * iUnit2, // source unit int * copyKey, // copy key: // = 1 copy all // = 2 copy all except coordinates // = 3 copy title section only // = 4 copy crystallographic // section only // = 5 copy coordinate section only // any other value does not do anything int * iRet // return code: // =0 if success // =RWBERR_NoChannel if a unit // does not exist // =RWBERR_NoFile if a unit // was not opened ), ( // lengths-in-structure list int * iUnit1, int * iUnit2, int * copyKey, int * iRet ), ( // lengths-follow list int * iUnit1, int * iUnit2, int * copyKey, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_delete_(..) deletes the specified parts of iUnit-th unit. // The delete keys are exactly the same as copy keys in mmdb_f_copy_(..). // // FORTRAN equivalent: subroutine MMDB_F_Delete ( iUnit1,iUnit2, // ~~~~~~~~~~~~~~~~~~~ CopyAtoms,iRet ) // integer iUnit1,iUnit2,CopyAtoms,iRet FORTRAN_SUBR ( MMDB_F_DELETE, mmdb_f_delete, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" int * delKey, // delete key: // = 1 delete all // = 2 delete all except coordinates // = 3 delete title section only // = 4 delete crystallographic // section only // = 5 delete coordinate section only // any other value does not do anything int * iRet // return code: // =0 if success // =RWBERR_NoChannel if a unit // does not exist // =RWBERR_NoFile if a unit // was not opened ), ( // lengths-in-structure list int * iUnit, int * delKey, int * iRet ), ( // lengths-follow list int * iUnit, int * delKey, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_settype_(..) changes the type and/or the read/write mode of // a unit iUnit, previously initialized with mmdb_f_open_(..). The file // is not read from or purged onto disk, no data change occurs. // // iRet returns either RWBERR_NoChannel if the unit was not // previously initialized by mmdb_f_open_(..), or RWBERR_Ok in the case // of success. // FORTRAN equivalent: subroutine MMDB_F_SetType ( iUnit,FType, // ~~~~~~~~~~~~~~~~~~~ RWState,iRet ) // character*(*) FType,RWState // integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_SETTYPE, mmdb_f_settype, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::fpstr FType, // "PDB", "CIF", "BIN" or " " mmdb::machine::fpstr RWStat, // "INPUT" or "OUTPUT" int * iRet, // returns -1 if unit not found, // otherwise 0 int FType_len, // fortran-hidden length of FType int RWStat_len // fortran-hidden length of RWStat ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr FType, mmdb::machine::fpstr RWStat, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr FType, int FType_len, mmdb::machine::fpstr RWStat, int RWStat_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_setname_(..) changes the file name for a unit iUnit, // previously initialized with mmdb_f_open_(..). The file is not // read from or purged onto disk, no data change occurs. // // iRet returns either RWBERR_NoChannel if the unit was not // previously initialized by mmdb_f_open_(..), or RWBERR_Ok in the case // of success. // FORTRAN equivalent: subroutine MMDB_F_SetName ( iUnit,FName, // ~~~~~~~~~~~~~~~~~~~ iRet ) // character*(*) FName // integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_SETNAME, mmdb_f_setname, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::fpstr FName, // file name int * iRet, // returns -1 if unit not found, // otherwise 0 int FName_len // fortran-hidden length of FName ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr FName, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr FName, int FName_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_write_(..) writes content of unit iUnit into a disk file. // iRet will be set to -1 if the unit was not previously opened with // mmdb_f_open_(..). If writting was successful, iRet is set to 0, // otherwise geterror(..) will return an information about the // error occured. // // Note that you may write even units associated with input in // call to mmdb_f_open(..). The file type does not change unless // explicitely changed with mmdb_f_settype_(..). // FORTRAN equivalent: subroutine MMDB_F_Write ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_WRITE, mmdb_f_write, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_close_(..) acts as mmdb_f_write_(..) if unit iUnit has been // associated with output in mmdb_f_open_(..) or in the call to // mmdb_f_settype(..). After writing the file, the unit iUnit is // completely disposed. // If unit iUnit is associated with input, mmdb_f_close_(..) merely // disposes it and all the information contained will be lost. // FORTRAN equivalent: subroutine MMDB_F_Close ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_CLOSE, mmdb_f_close, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // If unit iUnit is associated with input, mmdb_f_advance_(..) sets // the internal pointer on the next atom in the file. The atom // properties may then be retrieved using mmdb_f_atom_(..) and // mmdb_f_coord_(..). If iTer is set to 0, then 'ter' cards are // completely ignored. If iTer is set to 1, then 'ter' card will // cause return with iRet=1 with internal pointer left on this 'ter' // card. iRet=2 mean end of file, and iRet=0 means that the pointer // was successfully advanced to the next atom. // // If unit iUnit is associated with output, mmdb_f_advance_(..) // merely advances the pointer. No actual change in the data // structure or on disk occurs. The new position will be filled with // atom data after execution of mmdb_f_atom_(..) and/or mmdb_f_coord_(..). // The pointer WILL NOT be advanced if none of these functions were // called since last advancement, in which case iRet will return // RWBERR_NoAdvance. After successfull advancement, iRet will // return 0. // FORTRAN equivalent: subroutine MMDB_F_Advance ( iUnit,iOut,iTer,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iOut,iTer,iRet // Relation to the former XYZAdvance fortran subroutione: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // subroutine XYZAdvance ( iUnit,iOut,iTer,*,* ) // integer iRet // character*80 ErrLin // call MMDB_F_Advance ( iUnit,iOut,iTer,iRet ) // if (iRet.eq.1) return 1 // if (iRet.eq.2) return 2 // if (iRet.eq.RWBERR_NoChannel) then // ErrLin = ' ERROR: in MMDB_F_ADVANCE file has not been opened' // call CCPErr ( 1,ErrLin ) // endif // return // end // // where parameter iOut IS NOT USED. FORTRAN_SUBR ( MMDB_F_ADVANCE, mmdb_f_advance, ( // lengths-at-end list int * iUnit, // unit number int * iOut, // output echo file int * iTer, // FLAG =1, return iRet=1 if 'ter' card found // =0, do not return on 'ter' card int * iRet // =0 if normal return // =1 if return on 'ter' card (iTer=1) // =2 if return on end of file // =3 if return on 'hetatm' card // =RWBERR_NoChannel if unit does not exist // =RWBERR_NoAdvance if pointer was not // advanced ), ( // lengths-in-structure list int * iUnit, int * iOut, int * iTer, int * iRet ), ( // lengths-follow list int * iUnit, int * iOut, int * iTer, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rewd_(..) sets the internal pointer to the "begining" of // the data structure associated with unit *iUnit. This means that // one should the "advance" it with mmdb_f_advance_(..) in order // to get access to the first atom. // iRet returns RWBERR_NoChannel if iUnit-th unit was not // initialized, RWBWAR_RewOutput if the unit was associated with // output, and 0 otherwise. // FORTRAN equivalent: subroutine MMDB_F_Rewd ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_REWD, mmdb_f_rewd, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_bksp_(..) shifts the internal pointer for one atom back in // the data structure associated with unit *iUnit. This means that // the combination of mmdb_f_advance1_(..) and mmdb_f_bksp_(..) leaves the // pointer unchanged. // iRet returns RWBERR_NoChannel if iUnit-th unit was not // initialized, and sets bit RWBWAR_RewOutput if the unit was // associated with output, RWBWAR_FileTop if the pointer is already // on the top of the structure, and 0 otherwise. // FORTRAN equivalent: subroutine MMDB_F_Bksp ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_BKSP, mmdb_f_bksp, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_seek_(..) sets the internal pointer to the specified // position. If fPos==0, *iRet will return bit RWBWAR_FileTop. // If unit iUnit is associated with input, iRet will return 2 if // fPos is given a value outside the file range, 1 if a 'ter' card // is met and 3 if a 'hetatm' card is met. // iRet returns RWBERR_NoChannel if iUnit-th unit was not // initialized, and RWBERR_EmptyPointer if fPos-th position in the // input file is not occupied. // FORTRAN equivalent: subroutine MMDB_F_Seek ( iUnit,fPos,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,fPos,iRet FORTRAN_SUBR ( MMDB_F_SEEK, mmdb_f_seek, ( // lengths-at-end list int * iUnit, // unit number int * fPos, // position to set int * iRet // return code: // 0 Ok // 1 'ter' card met // 2 end of file // 3 'hetatm' card met // <0 error: // RWBERR_NoChannel // iUnit was not // initialized // RWBERR_EmptyPointer // fPos-th position ), ( // lengths-in-structure list int * iUnit, int * fPos, int * iRet ), ( // lengths-follow list int * iUnit, int * fPos, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_atom_(..) reads or writes the atom name, residue name, // chain name and other parameters listed from/into the // data structure associated with the unit number iUnit (cf. // mmdb_f_open_(..)). The position in the structure is adjusted // with the help of mmdb_f_advance_(..), mmdb_f_rewd_(..) or // mmdb_f_bksp_(..). // FORTRAN equivalent: subroutine MMDB_F_Atom ( iUnit,iSer,AtNam, // ~~~~~~~~~~~~~~~~~~~ ResNam,ChnNam,iResN,ResNo, // InsCod,AltCod,SegID,IZ,ID, // iRet ) // integer iUnit,iSer,iResN,IZ,iRet // character*(*) AtNam,ResNam,ChnNam,ResNo // character*(*) InsCod,AltCod,SegID,ID FORTRAN_SUBR ( MMDB_F_ATOM, mmdb_f_atom, ( // lengths-at-end list int * iUnit, // unit number int * iSer, // atom serial number mmdb::machine::fpstr AtNam, // atom name (left justified) mmdb::machine::fpstr ResNam, // residue name mmdb::machine::fpstr ChnNam, // chain name int * iResN, // residue number as an integer mmdb::machine::fpstr ResNo, // residue number as character (input only) mmdb::machine::fpstr InsCod, // the insertion code mmdb::machine::fpstr AltCod, // the alternate conformation code mmdb::machine::fpstr segID, // segment ID int * IZ, // atomic number (input only, returned as // 7 from ambiguous atoms) mmdb::machine::fpstr ID, // atomic ID related to atomic number // (element symbol right justified), plus // the ionic state +2, +3 etc.. // int * iRet, // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // RWBERR_Error1 internal error #1 // RWBERR_Error2 internal error #2 // RWBERR_Error3 internal error #3 // // >=0 : success, warning flags: // RWBWAR_WrongSerial if serial number // differs from the position // number in the file // RWBWAR_UnkFormFactor unknown formfactor // RWBWAR_AmbFormFactor ambiguous formfactor // int AtNam_len, // fortran-hidden length of AtNam int ResNam_len, // fortran-hidden length of ResNam int ChnNam_len, // fortran-hidden length of ChnNam int ResNo_len, // fortran-hidden length of ResNo int InsCod_len, // fortran-hidden length of InsCod int AltCod_len, // fortran-hidden length of AltCod int segID_len, // fortran-hidden length of SegID int ID_len // fortran-hidden length of ID ), ( // lengths-in-structure list int * iUnit, int * iSer, mmdb::machine::fpstr AtNam, mmdb::machine::fpstr ResNam, mmdb::machine::fpstr ChnNam, int * iResN, mmdb::machine::fpstr ResNo, mmdb::machine::fpstr InsCod, mmdb::machine::fpstr AltCod, mmdb::machine::fpstr segID, int * IZ, mmdb::machine::fpstr ID, int * iRet ), ( // lengths-follow list int * iUnit, int * iSer, mmdb::machine::fpstr AtNam, int AtNam_len, mmdb::machine::fpstr ResNam, int ResNam_len, mmdb::machine::fpstr ChnNam, int ChnNam_len, int * iResN, mmdb::machine::fpstr ResNo, int ResNo_len, mmdb::machine::fpstr InsCod, int InsCod_len, mmdb::machine::fpstr AltCod, int AltCod_len, mmdb::machine::fpstr segID, int segID_len, int * IZ, mmdb::machine::fpstr ID, int ID_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_copyatom_(..) copies atom from current position in // channel iUnit1 to current position in channel iUnit2. // FORTRAN equivalent: subroutine MMDB_F_CopyAtom ( iUnit1, // ~~~~~~~~~~~~~~~~~~~ iUnit2,iRet ) // integer iUnit1,iUnit2,iRet FORTRAN_SUBR ( MMDB_F_COPYATOM, mmdb_f_copyatom, ( // length-at-end list int * iUnit1, // source channel number int * iUnit2, // destination channel number int * iRet // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // >=0 : success ), ( // length-in-structure list int * iUnit1, int * iUnit2, int * iRet ), ( // length-follow list int * iUnit1, int * iUnit2, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_coord_(..) reads or writes the atom coordinates, occupancy // and temperature factor from/into the data structure associated // with the unit number iUnit (cf. mmdb_f_open_(..)). The position in // the structure is adjusted with the help of mmdb_f_advance_(..), // mmdb_f_rewd_(..) or mmdb_f_bksp_(..). // It is important that mmdb_f_coord_(..) was called AFTER // mmdb_f_atom_(..) if channel iUnit is associated with output // (otherwise iRet will return RWBERR_EmptyPointer). // FORTRAN equivalent: subroutine MMDB_F_Coord ( iUnit,XFlag,BFlag, // ~~~~~~~~~~~~~~~~~~~ x,y,z,occ,BIso,U,iRet ) // integer iUnit,iRet // character*(*) XFlag,BFlag // real x,y,z,occ,BIso,U(6) // Be sure that real-type parameters of mmdb_f_coord_(..) match those // of FORTRAN call. The real type is set with typedef apireal // statement in the begining of this file. FORTRAN_SUBR ( MMDB_F_COORD, mmdb_f_coord, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::fpstr XFlag, // "F" or "O" flag for the fractional // or orthogonal coordinates x,y,z // for output files XFlag may also be // set to "HF" or "HO", where "F" and // "O" have the same meaning as before // and "H" indicates that the atom // should be marked as heteroatom mmdb::machine::fpstr BFlag , // "F" or "O" flag for temperature // factor in fractional or orthogonal // Us mmdb::machine::apireal * x, // x-coordinate mmdb::machine::apireal * y, // y-coordinate mmdb::machine::apireal * z, // z-coordinate mmdb::machine::apireal * occ, // occupancy mmdb::machine::apireal * BIso, // isotropic temperature factor mmdb::machine::apireal * U, // array(6) of the anisotr. t-factor int * iRet, // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // RWBERR_NoMatrices if transformation // matrices are // undefined // RWBERR_NoCoordinates if coordinates were // not set in the atom // // >=0 : success, warning flags: // RWBERR_NoOccupancy if occupancy was // not set in the atom // RWBERR_NoTempFactor if temp. factor was // not set in the atom // int XFlag_len, // fortran-hidden length of XFlag int BFlag_len // fortran-hidden length of BFlag ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr XFlag, mmdb::machine::fpstr BFlag, mmdb::machine::apireal * x, mmdb::machine::apireal * y, mmdb::machine::apireal * z, mmdb::machine::apireal * occ, mmdb::machine::apireal * BIso, mmdb::machine::apireal * U, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr XFlag, int XFlag_len, mmdb::machine::fpstr BFlag, int BFlag_len, mmdb::machine::apireal * x, mmdb::machine::apireal * y, mmdb::machine::apireal * z, mmdb::machine::apireal * occ, mmdb::machine::apireal * BIso, mmdb::machine::apireal * U, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_setter_(..) sets the termination flag, so that the current // atom will be converted into terminator of a chain and appear as // 'ter' card in the output. The atom should be set by mmdb_f_atom_ // first, but the coordinates (mmdb_f_coord_(..)) do not have to be // specified. // FORTRAN equivalent: subroutine MMDB_F_SetTer ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_SETTER, mmdb_f_setter, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_sethet_(..) sets the heteroatom flag, so that the current // atom will appear as 'hetatm' card in the output. The atom should // be set by mmdb_f_atom_ first and then mmdb_f_coord_(..) and // mmdb_f_sethet_(..) should be called to specify its coordinates and // heteroatom status. // FORTRAN equivalent: subroutine MMDB_F_SetHet ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_SETHET, mmdb_f_sethet, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_getnofncsmates_(..) returns the number of NCS mates not // given in the file (iGiven=0). // // Negative returns N<0 mean an error. // // FORTRAN equivalent: subroutine MMDB_F_GetNofNCSMates ( iUnit,N ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,N FORTRAN_SUBR ( MMDB_F_GETNOFNCSMATES, mmdb_f_getnofncsmates, ( int * iUnit, int * N ), ( int * iUnit, int * N ), ( int * iUnit, int * N ) ); // ------------------------------------------------------------------ // mmdb_f_setcell_(..) sets the crystal cell properties and calculates // the orthogonal-fractional transformation matrices for unit iUnit. // FORTRAN equivalent: subroutine MMDB_F_SetCell ( iUnit,a,b,c, // ~~~~~~~~~~~~~~~~~~~ alpha,beta,gamma, // ArgNCode,iRet ) // integer iUnit,ArgNCode,iRet // real a,b,c,alpha,beta,gamma // Relation to the former RBFRAC2 FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBFRAC2 ( a,b,c,alpha,beta,gamma,ArgNCode ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_SETCELL, mmdb_f_setcell, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * a, // cell parameter a, angstroms mmdb::machine::apireal * b, // cell parameter b, angstroms mmdb::machine::apireal * c, // cell parameter c, angstroms mmdb::machine::apireal * alpha, // cell parameter alpha, degrees mmdb::machine::apireal * beta, // cell parameter beta, degrees mmdb::machine::apireal * gamma, // cell parameter gamma, degrees int * ArgNCode, // orthogonalization code, 1-6 int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Disagreement if a // disagreement in // cell parameters // was found // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * a, mmdb::machine::apireal * b, mmdb::machine::apireal * c, mmdb::machine::apireal * alpha, mmdb::machine::apireal * beta, mmdb::machine::apireal * gamma, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * a, mmdb::machine::apireal * b, mmdb::machine::apireal * c, mmdb::machine::apireal * alpha, mmdb::machine::apireal * beta, mmdb::machine::apireal * gamma, int * ArgNCode, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_wbspgrp_(..) sets the space group // FORTRAN equivalent: subroutine MMDB_F_WBSpGrp ( iUnit,spGroup,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet // character*(*) spGroup // Relation to the former WBSpGrp FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine WBSpGrp ( spGroup ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_WBSPGRP, mmdb_f_wbspgrp, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::fpstr spGroup, // space group int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed int spGroup_len // fortran-hidden length of spGroup ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr spGroup, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr spGroup, int spGroup_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rbspgrp_(..) retrieves the space group // FORTRAN equivalent: subroutine MMDB_F_RBSpGrp ( iUnit,spGroup,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet // character*(*) spGroup // Relation to the former RBSpGrp FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBSpGrp ( spGroup ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_RBSPGRP, mmdb_f_rbspgrp, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::fpstr spGroup, // space group int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed int spGroup_len // fortran-hidden length of spGroup ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr spGroup, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr spGroup, int spGroup_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_wbcell_(..) sets the crystal cell properties into the // channel iUnit. // FORTRAN equivalent: subroutine MMDB_F_WBCell ( iUnit,ArgCell, // ~~~~~~~~~~~~~~~~~~~ ArgNCode,iRet ) // integer iUnit,ArgNCode,iRet // real ArgCell(6) // // Relation to the former WBCELL FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine WBCELL ( iUnit,ArgCell,ArgNCode ) // // ** the buffer for the return code iRet has to be supplied FORTRAN_SUBR ( MMDB_F_WBCELL, mmdb_f_wbcell, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * ArgCell, // array to accept the cell parameters // if ArgCell(1) is set to 0, then // the cell does not change int * ArgNCode, // orthogonalisation code // if ArgNCode is set to 0, then // the orthogonalisation matrices // do not change int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * ArgCell, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * ArgCell, int * ArgNCode, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rbcell_(..) retrieves the crystal cell properties from the // channel iUnit. // FORTRAN equivalent: subroutine MMDB_F_RBCell ( iUnit,celld,cvol,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet // real celld(6),cvol // character*(*) spGroup // Relation to the former RBCELL FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBCELL ( celld,cvol ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_RBCELL, mmdb_f_rbcell, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * celld, // array to accept the cell parameters mmdb::machine::apireal * cvol, // returns the cell volume int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * celld, mmdb::machine::apireal * cvol, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * celld, mmdb::machine::apireal * cvol, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rbcelln_(..) retrieves the crystal cell properties from the // channel iUnit. // FORTRAN equivalent: subroutine MMDB_F_RBCellN ( iUnit,celld,cvol, // ~~~~~~~~~~~~~~~~~~~ ArgNCode,iRet ) // integer iUnit,ArgNCode,iRet // real celld(6),cvol // Relation to the former RBCELL FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBCELL ( celld,cvol ) // // ** the unit number iUnit, buffer for orthogonalization code // ArgNCode and for the return code iRet have to be supplied. FORTRAN_SUBR ( MMDB_F_RBCELLN, mmdb_f_rbcelln, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * celld, // array to accept the cell parameters mmdb::machine::apireal * cvol, // returns the cell volume int * ArgNCode, // returns the orthogonalization code, 1-6 int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * celld, mmdb::machine::apireal * cvol, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * celld, mmdb::machine::apireal * cvol, int * ArgNCode, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rbrcel_(..) retrieves the reciprocal cell dimensions and // reciprocal cell volume from the channel iUnit. // FORTRAN equivalent: subroutine MMDB_F_RBRCel ( iUnit,rcell,rvol, // ~~~~~~~~~~~~~~~~~~~ iRet ) // integer iUnit,iRet // real rcell(6),rvol // Relation to the former RBRCEL FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBRCEL ( rcell,rvol ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_RBRCEL, mmdb_f_rbrcel, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::apireal * rcell, // array to accept the reciprocal // cell parameters mmdb::machine::apireal * rvol, // returns the reciprocal cell volume int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * rcell, mmdb::machine::apireal * rvol, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * rcell, mmdb::machine::apireal * rvol, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rborf_(..) fills or retrieves the fractionalising (RF) and // orthogonalising (RO) 4x4 matrices, as well as the orthogonalisation // code (LCode) in/from unit iUnit. // If RO[1][1] (fortran notations, or RO[0] in C/C++) is set to 0.0 // then the matrices are retrieved and returned in RF and RO; // otherwise RF and RO are stored in the unit. // FORTRAN equivalent: subroutine MMDB_F_RBORF ( iUnit,RO,RF, // ~~~~~~~~~~~~~~~~~~~ LCode,iRet ) // integer iUnit,LCode,iRet // real RO(4,4),RF(4,4) // Relation to the former RBRORF2 FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBRORF2 ( RO,RF,LCode ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_RBORF, mmdb_f_rborf, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * RO, // array for orthogonalising matrix mmdb::machine::apireal * RF, // array for fractionalising matrix int * LCode, // buffer for orthogonalisation code int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * RO, mmdb::machine::apireal * RF, int * LCode, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * RO, mmdb::machine::apireal * RF, int * LCode, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_orthmat_(..) calculates matrices for standard orthogonalisations // and cell volume. // If Cell(1) is greater then zero, the existing cell parameters // will be substituted. If new cell parameters differ substantially // from the old ones, the returned value of Vol will be negative. // FORTRAN equivalent: subroutine MMDB_F_OrthMat ( iUnit,Cell,Vol, // ~~~~~~~~~~~~~~~~~~~ RRR,iRet // integer iUnit,iRet // real Cell(6),Vol,RRR(3,3,6) // Relation to the former RBFRO1 FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBFRO1 ( Cell,Vol,RRR ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_ORTHMAT, mmdb_f_orthmat, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * Cell, // array of cell parameters: // Cell(1) - a Cell(4) - alpha // Cell(2) - b Cell(5) - beta // Cell(3) - c Cell(6) - gamma mmdb::machine::apireal * Vol, // returns cell volume mmdb::machine::apireal * RRR, // array (3,3,6), returns // orthogonalisation matrices int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * Cell, mmdb::machine::apireal * Vol, mmdb::machine::apireal * RRR, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * Cell, mmdb::machine::apireal * Vol, mmdb::machine::apireal * RRR, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_cvanisou_(..) converts between crystallographic bs and // orthogonal Us or the other way round. // FORTRAN equivalent: subroutine MMDB_F_CVAnisou ( iUnit,U,iFlag,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iFlag,iRet // real U(6) // Relation to the former CVANISOU FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine CVANISOU ( U,iFlag ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_CVANISOU, mmdb_f_cvanisou, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * U, // array of coordinates to convert int * iFlag, // =0: convert from fract. to orthog. // =1: convert from orthog. to fract. int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * U, int * iFlag, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * U, int * iFlag, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_wremark_(..) writes a remark line into data structure. // Generally, it puts the line on its place according to a PDB // keyword which should start the line. The line will be always the // last one in its group (last remark with given number or without // it, last JRNL record, last ATOM etc.). If the keyword is not // recognized, the line is appended after the coordinate section. // iRet will return same codes as those in mmdb_f_open1_(..) plus // additional ones specified below. // FORTRAN equivalent: subroutine MMDB_F_WRemark ( iUnit,Line,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet // character*(*) Line // Relation to the former WRemark FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine WRemark ( iUnit,Line ) // // ** the buffer for return code iRet has to be supplied FORTRAN_SUBR ( MMDB_F_WREMARK, mmdb_f_wremark, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::fpstr Line, // line to be added int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // other return codea are those // returned by mmdb_f_open1_(..) int Line_len // fortran-hidden length of Line ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr Line, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr Line, int Line_len, int *iRet ) ); /* // ------------------------------------------------------------------ // rbrinv_(..) takes 4x4 real matrix A and returns its inverse in // matrix AI. // FORTRAN equivalent: subroutine RBRInv ( A,AI ) // ~~~~~~~~~~~~~~~~~~~ real A(4,4),AI(4,4) FORTRAN_SUBR ( RBRINV, rbrinv, ( mmdb::machine::apireal * A, mmdb::machine::apireal * AI ), ( mmdb::machine::apireal * A, mmdb::machine::apireal * AI ), ( mmdb::machine::apireal * A, mmdb::machine::apireal * AI ) ); */ /* // ------------------------------------------------------------------ // res3to1_(..) returns the 3-character or 1-character residue // codes. One of them should be supplied (with the other one set // blank), the routine returns the other one. // FORTRAN equivalent: subroutine Res3to1 ( ResNm3,resNm1 ) // ~~~~~~~~~~~~~~~~~~~ character*4 ResNm3 // cgaracter*1 ResNm1 FORTRAN_SUBR ( RES3TO1, res3to1, ( // lengths-at-end list mmdb::machine::fpstr ResNm3, // 3-char name, 4th char // will be set blank mmdb::machine::fpstr ResNm1, // 1-char name int ResNm3_len, // fortran-hidden length of ResNm3 int ResNm1_len // fortran-hidden length of ResNm3 ), ( // lengths-in-structure list mmdb::machine::fpstr ResNm3, mmdb::machine::fpstr ResNm1 ), ( // lengths-follow list mmdb::machine::fpstr ResNm3, int ResNm3_len, mmdb::machine::fpstr ResNm1, int ResNm1_len ) ); */ // ------------------------------------------------------------------ // rberrstop_(..) checks the return code got from one of the above // functions, and if it indicates an error, it issues the following // type of message (example) // // *** RWBROOK error: point code unit function // *** 12 -3 3 MMDB_F_Open // *** file : input.pdb // *** reason : cannot open a file // *** Execution stopped. // // if iStop is set to 0, and one of the following type // // *** RWBROOK error: point code unit function // *** 12 -3 3 MMDB_F_Open // *** file : input.pdb // *** reason : cannot open a file // *** continue running, may crash ... // // if iStop is not null. // // iPlace (12 in the above samples) should be given a number which // is unique through an application; it serves to the identifying // the particular call which caused the problem. The return code // (-3 in the above samples) is that what is back in the iRet // parameter to the above functions. If iRet is set to RWBERR_Ok, // rberrstop_(..) makes no action. If rberrstop_(..) is called // immediately after a call to an RWBROOK function, e.g. // // call MMDB_F_Open ( FName,RWStat,FType,iUnit,iRet ) // call RBErrStop ( 12,iRet,iUnit,0 ) // // then the name of the misfunctioned call (MMDB_F_Open in the above // samples) will be identified automatically and correctly. // FORTRAN equivalent: subroutine RBErrStop ( iPlace,iRet, // ~~~~~~~~~~~~~~~~~~~ iUnit ,iStop ) // integer iUnit,iPlace,iRet,iStop FORTRAN_SUBR ( RBERRSTOP, rberrstop, ( // lengths-at-end list int * iPlace, // (unique) identificator inside an application int * iRet, // return code to check int * iUnit, // unit number int * iStop // if 0 then stop if error ), ( // lengths-in-structure list int * iPlace, int * iRet, int * iUnit, int * iStop ), ( // lengths-follow list int * iPlace, int * iRet, int * iUnit, int * iStop ) ); // ------------------------------------------------------------------ // rbcheckerr_(..) represents a simplified call to rberrstop_(..). // It will work properly only if rbcheckerr_(..) is called // immediately after an API function to be checked: // // call MMDB_F_Open ( FName,RWStat,FType,iUnit,iRet ) // call RBCheckErr ( 12,0 ) // // FORTRAN equivalent: subroutine RBCheckErr ( iPlace,iStop ) // ~~~~~~~~~~~~~~~~~~~ integer iPlace,iStop FORTRAN_SUBR ( RBCHECKERR, rbcheckerr, ( // lengths-at-end list int * iPlace, // (unique) identificator inside an application int * iStop // if 0 then stop if error ), ( // lengths-in-structure list int * iPlace, int * iStop ), ( // lengths-follow list int * iPlace, int * iStop ) ); #endif mmdb2-2.0.20/mmdb2/mmdb_cryst.h0000644000175000017500000004043613271367640015771 0ustar maartenmaarten// $Id: mmdb_cryst.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Cryst // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::CrystContainer ( container for cryst. data ) // ~~~~~~~~~ mmdb::NCSMatrix ( non-cryst. symm. matrix class ) // mmdb::TVect ( translation vector class ) // mmdb::Cryst ( MMDB cryst. section class ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_Cryst__ #define __MMDB_Cryst__ #include "mmdb_io_stream.h" #include "mmdb_symop.h" #include "mmdb_defs.h" #include "mmdb_utils.h" namespace mmdb { // ==================== CrystContainer ====================== DefineClass(CrystContainer); DefineStreamFunctions(CrystContainer); class CrystContainer : public ClassContainer { public : CrystContainer () : ClassContainer() {} CrystContainer ( io::RPStream Object ) : ClassContainer ( Object ) {} ~CrystContainer() {} PContainerClass MakeContainerClass ( int ClassID ); ERROR_CODE AddMTRIXLine ( cpstr S ); }; // ================== NCSMatrix ======================== enum NCSM_SET { NCSMSET_Matrix1 = 0x00000001, NCSMSET_Matrix2 = 0x00000002, NCSMSET_Matrix3 = 0x00000004, NCSMSET_All = 0x00000007 }; DefineClass(NCSMatrix); DefineStreamFunctions(NCSMatrix); class NCSMatrix : public ContainerClass { friend class Cryst; public : int serNum; // serial number mat33 m; // non-crystallographic symmetry matrix vect3 v; // translational part of ncs matrix int iGiven; // iGiven flag (see PDB format) NCSMatrix (); NCSMatrix ( cpstr S ); NCSMatrix ( io::RPStream Object ); ~NCSMatrix(); bool PDBASCIIDump1 ( io::RFile f ); ERROR_CODE ConvertPDBASCII ( cpstr S ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_NCSMatrix; } void SetNCSMatrix ( int serialNum, mat33 & ncs_m, vect3 & ncs_v, int i_Given ); void Copy ( PContainerClass NCSMatrix ); void write ( io::RFile f ); void read ( io::RFile f ); protected : word WhatIsSet; // mask field // 0x0001 MTRIX1 was converted // 0x0002 MTRIX2 was converted // 0x0004 MTRIX3 was converted void Init(); }; // ================== TVect ======================== DefineClass(TVect); DefineStreamFunctions(TVect); class TVect : public ContainerClass { public : int serNum; // serial number vect3 t; // translation vector pstr comment; // comment TVect (); TVect ( cpstr S ); TVect ( io::RPStream Object ); ~TVect(); void PDBASCIIDump ( pstr S, int N ); ERROR_CODE ConvertPDBASCII ( cpstr S ); void MakeCIF ( mmcif::PData CIF, int N ); ERROR_CODE GetCIF ( mmcif::PData CIF, int & n ); CLASS_ID GetClassID () { return ClassID_TVect; } void Copy ( PContainerClass TVect ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void Init(); }; // ================= Cryst ======================= DefineClass(Cryst); DefineStreamFunctions(Cryst); // constants for the CellCheck field enum CELL_CHECK { CCHK_Ok = 0x00000000, CCHK_NoCell = 0x00000001, CCHK_Error = 0x00000002, CCHK_Disagreement = 0x00000004, CCHK_NoOrthCode = 0x00000008, CCHK_Translations = 0x00000010, CCHK_Unchecked = 0x00001000 }; // constants for the WhatIsSet field enum CELL_SET { CSET_CellParams1 = 0x00000001, CSET_CellParams2 = 0x00000002, CSET_CellParams = 0x00000003, CSET_SpaceGroup = 0x00000004, CSET_ZValue = 0x00000008, CSET_CrystCard = 0x0000000F, CSET_OrigMatrix1 = 0x00000010, CSET_OrigMatrix2 = 0x00000020, CSET_OrigMatrix3 = 0x00000040, CSET_OrigMatrix = 0x00000070, CSET_ScaleMatrix1 = 0x00000080, CSET_ScaleMatrix2 = 0x00000100, CSET_ScaleMatrix3 = 0x00000200, CSET_ScaleMatrix = 0x00000380, CSET_Transforms = 0x00000400, CSET_DummyCell = 0x00001000 }; extern cpstr OrthCode[6]; class Cryst : public io::Stream { friend class Channel; public : realtype a,b,c; // cell parameters realtype alpha,beta,gamma; // cell parameters mat44 RO,RF; // orthogonal-fractional recalculation // matrices mat44 ROU,RFU; // ort-frac recalc matrices for // anisotr. t-fac mat633 RR; // standard orthogonalizations realtype Vol; // cell volume int NCode; // code of orthogonalization matrix SymGroup spaceGroup; // group of space symmetry as read // from file SymGroup spaceGroupFix; // actually used space group int Z; // Z-value mat33 o; // orthogonal transformation matrix vect3 t; // translation orthogonal vector mat33 s; // scale matrix vect3 u; // translation part of the scale matrix word CellCheck; // 0x0000 - Ok // 0x0001 - no cell stored // 0x0002 - some error in cell volume // 0x0004 - disagreement between // cell and PDB // 0x0008 - no orth code derived // 0x0010 - translations also specified // 0x1000 - the check was not done word WhatIsSet; // indicator of the fields set bool ignoreScalei; // flag to ignore SCALEi cards bool processSG; // flag to process space group at file // read bool fixSpaceGroup; // flag to fix space group at file read Cryst (); Cryst ( io::RPStream Object ); ~Cryst(); void FreeMemory(); void Reset (); // ConvertPDBString(..) interprets an ASCII PDB line and fills // the corresponding data fields. It returns zero if the line was // successfully converted, otherwise returns a non-negative value // of Error_XXXX. // PDBString must be not shorter than 81 characters. ERROR_CODE ConvertPDBString ( pstr PDBString ); // RWBROOKReadPrintout() may be invoked after reading PDB file // for simulating the old RWBROOK messages and warnings void RWBROOKReadPrintout(); void SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ); void PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ); void GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & vol ); void GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & vols ); void SetSyminfoLib ( cpstr syminfoLib ); pstr GetSyminfoLib (); int SetSpaceGroup ( cpstr spGroup ); pstr GetSpaceGroup (); pstr GetSpaceGroupFix(); // CalcCoordTransforms() should be called once after all data // relevant to the crystallographic information, are read and // converted. Field CellCheck will then have bits set if there // are errors, e.g. bit CCHK_NoCell means that the coordinate // transformations cannot be performed. void CalcCoordTransforms(); // A PDB ASCII dump void PDBASCIIDump ( io::RFile f ); ERROR_CODE GetCIF ( mmcif::PData CIF ); void MakeCIF ( mmcif::PData CIF ); bool areMatrices(); // returns True if the orthogonal-to- // fractional and fractional-to-orthogonal // matrices are defined // Frac2Orth(..) and Orth2Frac(..) transform between fractional // and orthogonal coordinates, if areMatrices() returns True. // If the transformation matrices were not set, the functions just // copy the coordinates. Returns True if the transformation was // done; False return means that transformation matrices were not // calculated bool Frac2Orth ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ); bool Orth2Frac ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ); // Below, F and T are transformation matrices in fractional and // orthogonal coordinates, respectively. bool Frac2Orth ( mat44 & F, mat44 & T ); bool Orth2Frac ( mat44 & T, mat44 & F ); // Cryst2Orth(..) and Orth2Cryst(..) transform between fractional // and orthogonal anisotropic temperature factors, if areMatrices() // returns True. If the transformation matrices were not set, the // functions leave the factors unchanged. // Vector U is composed as follows: // U[0]=u11 U[1]=u22 U[2]=u33 // U[3]=u12 U[4]=u13 U[5]=u23 // Returns True if the transformation was done; False retuen // means that transformation matrices were not calculated bool Cryst2Orth ( rvector U ); bool Orth2Cryst ( rvector U ); void CalcOrthMatrices(); // calculates RR, AC, cella's and Vol bool isNCSMatrix (); bool isScaleMatrix (); bool isCellParameters(); int GetNumberOfSymOps(); pstr GetSymOp ( int Nop ); int GetNumberOfNCSMatrices(); int GetNumberOfNCSMates (); // Returns the number of // NCS mates not given in // the file (iGiven==0) bool GetNCSMatrix ( int NCSMatrixNo, mat33 & ncs_m, vect3 & ncs_v ); bool GetNCSMatrix ( int NCSMatrixNo, mat44 & ncs_m, int & iGiven ); // no=0..N-1 int AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ); // GetTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation number Nop and places // them into unit cell shifted by cellshift_a a's, cellshift_b // b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetTMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c, PSymOps symOpers=NULL ); // GetUCTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation Nop. Translation part // of the matrix is being chosen such that point (x,y,z) has // least distance to the center of primary (333) unit cell, // and then it is shifted by cellshift_a a's, cellshift_b b's // and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // int GetUCTMatrix ( mat44 & TMatrix, int Nop, realtype x, realtype y, realtype z, int cellshift_a, int cellshift_b, int cellshift_c, PSymOps symOpers=NULL ); // GetFractMatrix(..) calculates and returns the coordinate // transformation matrix, which converts fractional coordinates // according to the symmetry operation number Nop and places them // into unit cell shifted by cellshift_a a's, cellshift_b b's and // cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetFractMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c, PSymOps symOpers=NULL ); // GetSymOpMatrix(..) returns the transformation matrix for // Nop-th symmetry operator in the space group // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // int GetSymOpMatrix ( mat44 & TMatrix, int Nop ); void Copy ( PCryst Cryst ); void write ( io::RFile f ); // writes header to PDB binary file void read ( io::RFile f ); // reads header from PDB binary file protected : CrystContainer ncsMatrix; // non-cryst. symm. matrices CrystContainer tVect; // translation vectors realtype as,bs,cs; // calculated 'cell parameters' realtype alphas,betas,gammas; // calculated 'cell parameters' realtype AC[6]; realtype VolChk,VolErr; pstr syminfo_lib; // path to syminfo.lib SymOps symOps; // symmetry operations void Init ( bool fullInit ); int FixSpaceGroup(); }; extern cpstr getOrthCodeName ( int NCode ); } // namespace mmdb /* extern void TestCryst(); // reads from 'in.cryst', writes into // 'out.cryst' and 'abin.cryst' */ #endif mmdb2-2.0.20/mmdb2/mmdb_utils.cpp0000644000175000017500000015655113271367640016326 0ustar maartenmaarten// $Id: mmdb_utils.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 27.02.17 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_Utils // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : mmdb::ContainerClass ( containered class template ) // ~~~~~~~~~ mmdb::ContString ( containered string ) // mmdb::ClassContainer ( container of classes ) // mmdb::AtomPath ( atom path ID ) // mmdb::QuickSort ( quick sort of integers ) // // **** Functions : Date9to11 ( DD-MMM-YY -> DD-MMM-YYYY ) // ~~~~~~~~~~~ Date11to9 ( DD-MMM-YYYY -> DD-MMM-YY ) // Date9toCIF ( DD-MMM-YY -> YYYY-MM-DD ) // Date11toCIF( DD-MMM-YYYY -> YYYY-MM-DD ) // DateCIFto9 ( YYYY-MM-DD -> DD-MMM-YY ) // DateCIFto11( YYYY-MM-DD -> DD-MMM-YYYY ) // GetInteger ( reads integer from a string ) // GetReal ( reads real from a string ) // GetIntIns ( reads integer and insert code ) // PutInteger ( writes integer into a string ) // PutRealF ( writes real in F-form into a string ) // PutIntIns ( writes integer and insert code ) // CIFGetInteger ( reads and deletes int from CIF ) // CIFGetReal ( reads and deletes real from CIF ) // CIFGetString ( reads and deletes string from CIF) // CIFGetInteger1 (reads and del-s int from CIF loop) // CIFGetReal1 (reads and del-s int from CIF loop) // Mat4Inverse ( inversion of 4x4 matrices ) // GetErrorDescription (ascii line to an Error_XXXXX) // ParseAtomID ( parses atom ID line ) // ParseResID ( parses residue ID line ) // ParseAtomPath ( parses full atom path ) // // (C) E. Krissinel 2000-2017 // // ================================================================= // #include #include #include #include "mmdb_utils.h" #include "hybrid_36.h" namespace mmdb { // ====================== Date functions ======================= static cpstr Month[12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; static cpstr nMonth[12] = { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" }; void Date9to11 ( cpstr Date9, pstr Date11 ) { // converts DD-MMM-YY to DD-MMM-YYYY int i; i = 0; while ((i<12) && (strncmp(Month[i],&(Date9[3]),3))) i++; if (i<12) { // DD-MMM-YY -> DD-MMM-YYYY strncpy ( Date11,Date9,7 ); if (Date9[7]!='0') strncpy ( &(Date11[7]),"19",2 ); else strncpy ( &(Date11[7]),"20",2 ); strncpy ( &(Date11[9]),&(Date9[7]),2 ); Date11[2] = '-'; Date11[6] = '-'; Date11[11] = char(0); } else { // DD-MM-YY -> DD-MMM-YYYY strncpy ( Date11,Date9,3 ); i = 0; while ((i<12) && (strncmp(nMonth[i],&(Date9[3]),2))) i++; if (i<12) { strncpy ( &(Date11[3]),Month[i],3 ); if (Date9[6]!='0') strncpy ( &(Date11[7]),"19",2 ); else strncpy ( &(Date11[7]),"20",2 ); strncpy ( &(Date11[9]),&(Date9[6]),2 ); Date11[2] = '-'; Date11[6] = '-'; Date11[11] = char(0); } else strcpy ( Date11," " ); } } void Date11to9 ( cpstr Date11, pstr Date9 ) { // converts DD-MMM-YYYY to DD-MMM-YY int i; i = 0; while ((i<12) && (strncmp(Month[i],&(Date11[3]),3))) i++; if (i<12) { // DD-MMM-YYYY -> DD-MMM-YY strncpy ( Date9,Date11,7 ); strncpy ( &(Date9[7]),&(Date11[9]),2 ); Date9[2] = '-'; Date9[6] = '-'; } else { // DD-MM-YYYY -> DD-MMM-YY strncpy ( Date9,Date11,3 ); i = 0; while ((i<12) && (strncmp(nMonth[i],&(Date11[3]),2))) i++; if (i<12) { strncpy ( &(Date9[3]),Month[i],3 ); strncpy ( &(Date9[7]),&(Date11[8]),2 ); Date9[2] = '-'; Date9[6] = '-'; } else strcpy ( Date9," " ); } } void Date9toCIF ( cpstr Date9, pstr DateCIF ) { // DD-MMM-YY -> YYYY-MM-DD ) int i; i = 0; while ((i<12) && (strncmp(Month[i],&(Date9[3]),3))) i++; if (i<12) { // DD-MMM-YY -> YYYY-MM-DD if (Date9[7]!='0') strcpy ( DateCIF,"19" ); else strcpy ( DateCIF,"20" ); strncpy ( &(DateCIF[2]),&(Date9[7]),2 ); strncpy ( &(DateCIF[5]),nMonth[i],2 ); } else { // DD-MM-YY -> YYYY-MM-DD if (Date9[6]!='0') strcpy ( DateCIF,"19" ); else strcpy ( DateCIF,"20" ); strncpy ( &(DateCIF[2]),&(Date9[6]),2 ); strncpy ( &(DateCIF[5]),&(Date9[3]),2 ); } DateCIF[4] = '-'; DateCIF[7] = '-'; strncpy ( &(DateCIF[8]),Date9,2 ); DateCIF[10] = char(0); } void Date11toCIF ( cpstr Date11, pstr DateCIF ) { // DD-MMM-YYYY -> YYYY-MM-DD int i; i = 0; while ((i<12) && (strncmp(Month[i],&(Date11[3]),3))) i++; if (i<12) { strncpy ( DateCIF,&(Date11[7]),4 ); strncpy ( &(DateCIF[5]),nMonth[i],2 ); } else { strncpy ( DateCIF,&(Date11[6]),4 ); strncpy ( &(DateCIF[5]),&(Date11[3]),2 ); } DateCIF[4] = '-'; DateCIF[7] = '-'; strncpy ( &(DateCIF[8]),Date11,2 ); DateCIF[10] = char(0); } void DateCIFto9 ( cpstr DateCIF, pstr Date9 ) { // YYYY-MM-DD -> DD-MMM-YY int i; strncpy ( Date9,&(DateCIF[8]),2 ); Date9[2] = '-'; i = 0; while ((i<12) && (strncmp(nMonth[i],&(DateCIF[5]),2))) i++; if (i<12) strncpy ( &(Date9[3]),Month[i],3 ); else { strncpy ( &(Date9[3]),&(DateCIF[5]),2 ); Date9[5] = 'X'; } Date9[6] = '-'; strncpy ( &(Date9[7]),&(DateCIF[2]),2 ); // DateCIF[9] = char(0); } void DateCIFto11 ( cpstr DateCIF, pstr Date11 ) { // YYYY-MM-DD -> DD-MMM-YYYY int i; strncpy ( Date11,&(DateCIF[8]),2 ); Date11[2] = '-'; i = 0; while ((i<12) && (strncmp(nMonth[i],&(DateCIF[5]),2))) i++; if (i<12) strncpy ( &(Date11[3]),Month[i],3 ); else { strncpy ( &(Date11[3]),&(DateCIF[5]),2 ); Date11[5] = 'X'; } Date11[6] = '-'; strncpy ( &(Date11[7]),DateCIF,4 ); // DateCIF[11] = char(0); } // =============== Format functions =================== bool GetInteger ( int & N, cpstr S, int M ) { // Returns true if S contains an integer number in its // first M characters. This number is returned in N. // The return is false if no integer number may be // recognized. In this case, N is assigned MinInt4 value. pstr endptr; char L[50]; strncpy ( L,S,M ); L[M] = char(0); N = mround(strtod(L,&endptr)); if ((N==0) && (endptr==L)) { N = MinInt4; // no number return false; } else return true; } bool GetReal ( realtype & R, cpstr S, int M ) { // Returns true if S contains a real number in its // first M characters. This number is returned in R. // The return is false if no real number may be // recognized. In this case, R is assigned -MaxReal value. pstr endptr; char L[50]; strncpy ( L,S,M ); L[M] = char(0); R = strtod(L,&endptr); if ((R==0.0) && (endptr==L)) { R = -MaxReal; // no number return false; } else return true; } bool GetIntIns ( int & N, pstr ins, cpstr S, int M ) { // Returns true if S contains an integer number in its // first M characters. This number is returned in N. In addition // to that, GetIntIns() retrieves the insertion code which may // follow the integer and returns it in "ins" (1 character + // terminating 0). // The return is false if no integer number may be // recognized. In this case, N is assigned MinInt4 value, // "ins" just returns (M+1)th symbol of S (+terminating 0). pstr endptr; char L[50]; if (S[M]!=' ') { ins[0] = S[M]; ins[1] = char(0); } else ins[0] = char(0); strncpy ( L,S,M ); L[M] = char(0); if ((M==4) && ((S[0]>='A') || ((S[0]=='-') && (S[1]>='A')))) hy36decode ( M,L,M,&N); else { endptr = NULL; N = mround(strtod(L,&endptr)); if ((N==0) && (endptr==L)) { N = MinInt4; // no number return false; } } return true; } void PutInteger ( pstr S, int N, int M ) { // Integer N is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. // If N is set to MinInt4, then first M characters of // string S are set to the space character. char L[50]; int i; if (N==MinInt4) for (i=0;iGetInteger ( I,Tag,Signal,true ); if (RC==mmcif::CIFRC_WrongFormat) { F = Loop->GetString ( Tag,Signal,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,Signal,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,Signal ); Signal = -Error_UnrecognizedInteger-1; return Error_UnrecognizedInteger; } if (RC==mmcif::CIFRC_WrongIndex) { Signal = -1; return Error_NoData; } if (RC) { F = Loop->GetString ( Tag,Signal,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,Signal,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,Signal ); Signal = -Error_NoData-1; return Error_NoData; } return Error_NoError; } ERROR_CODE CIFGetInteger1 ( int & I, mmcif::PLoop Loop, cpstr Tag, int nrow ) { pstr F; int RC; RC = Loop->GetInteger ( I,Tag,nrow,true ); if (RC==mmcif::CIFRC_WrongFormat) { F = Loop->GetString ( Tag,nrow,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,nrow,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,nrow ); return Error_UnrecognizedInteger; } if (RC==mmcif::CIFRC_WrongIndex) return Error_NoData; if (RC) { F = Loop->GetString ( Tag,nrow,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,nrow,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,nrow ); return Error_NoData; } return Error_NoError; } ERROR_CODE CIFGetReal ( realtype & R, mmcif::PLoop Loop, cpstr Tag, int & Signal ) { pstr F; int RC; RC = Loop->GetReal ( R,Tag,Signal,true ); if (RC==mmcif::CIFRC_WrongFormat) { F = Loop->GetString ( Tag,Signal,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,Signal,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,Signal ); Signal = -Error_UnrecognizedReal-1; return Error_UnrecognizedReal; } if (RC==mmcif::CIFRC_WrongIndex) { Signal = -1; return Error_NoData; } if (RC) { F = Loop->GetString ( Tag,Signal,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,Signal,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,Signal ); Signal = -Error_NoData-1; return Error_NoData; } return Error_NoError; } ERROR_CODE CIFGetReal1 ( realtype & R, mmcif::PLoop Loop, cpstr Tag, int nrow ) { pstr F; int RC; RC = Loop->GetReal ( R,Tag,nrow,true ); if (RC==mmcif::CIFRC_WrongFormat) { F = Loop->GetString ( Tag,nrow,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,nrow,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,nrow ); return Error_UnrecognizedReal; } if (RC==mmcif::CIFRC_WrongIndex) return Error_NoData; if (RC) { F = Loop->GetString ( Tag,nrow,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,nrow,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,nrow ); return Error_NoData; } return Error_NoError; } ERROR_CODE CIFGetString ( pstr S, mmcif::PLoop Loop, cpstr Tag, int row, int SLen, cpstr DefS ) { pstr F; int RC; F = Loop->GetString ( Tag,row,RC ); if ((!RC) && F) { strncpy ( S,F,SLen-1 ); Loop->DeleteField ( Tag,row ); return Error_NoError; } else { strcpy ( S,DefS ); return Error_EmptyCIFLoop; } } ERROR_CODE CIFGetInteger ( int & I, mmcif::PStruct Struct, cpstr Tag, bool Remove ) { pstr F; int RC; RC = Struct->GetInteger ( I,Tag,Remove ); if (RC==mmcif::CIFRC_WrongFormat) { F = Struct->GetString ( Tag,RC ); if (F) sprintf ( CIFErrorLocation,"structure %s.%s data %s", Struct->GetCategoryName(),Tag,F ); else sprintf ( CIFErrorLocation,"structure %s.%s data [NULL]", Struct->GetCategoryName(),Tag ); return Error_UnrecognizedInteger; } if (RC) { F = Struct->GetString ( Tag,RC ); if (F) sprintf ( CIFErrorLocation,"structure %s.%s data %s", Struct->GetCategoryName(),Tag,F ); else sprintf ( CIFErrorLocation,"structure %s.%s data [NULL]", Struct->GetCategoryName(),Tag ); return Error_NoData; } return Error_NoError; } ERROR_CODE CIFGetReal ( realtype & R, mmcif::PStruct Struct, cpstr Tag, bool Remove ) { pstr F; int RC; RC = Struct->GetReal ( R,Tag,Remove ); if (RC==mmcif::CIFRC_WrongFormat) { F = Struct->GetString ( Tag,RC ); if (F) sprintf ( CIFErrorLocation,"structure %s.%s data %s", Struct->GetCategoryName(),Tag,F ); else sprintf ( CIFErrorLocation,"structure %s.%s data [NULL]", Struct->GetCategoryName(),Tag ); return Error_UnrecognizedReal; } if (RC) { F = Struct->GetString ( Tag,RC ); if (F) sprintf ( CIFErrorLocation,"structure %s.%s data %s", Struct->GetCategoryName(),Tag,F ); else sprintf ( CIFErrorLocation,"structure %s.%s data [NULL]", Struct->GetCategoryName(),Tag ); return Error_NoData; } return Error_NoError; } ERROR_CODE CIFGetString ( pstr S, mmcif::PStruct Struct, cpstr Tag, int SLen, cpstr DefS, bool Remove ) { pstr F; int RC; F = Struct->GetString ( Tag,RC ); if ((!RC) && F) { strcpy_n0 ( S,F,SLen-1 ); if (Remove) Struct->DeleteField ( Tag ); return Error_NoError; } else { strcpy ( S,DefS ); return Error_EmptyCIFStruct; } } void PutIntIns ( pstr S, int N, int M, cpstr ins ) { // Integer N is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. The insert code ins is put // immediately after the integer. // If N is set to MinInt4, then first M+1 characters of // string S are set to space, and no insert code are // appended. char L[50]; int i; if (N==MinInt4) { for (i=0;i<=M;i++) S[i] = ' '; } else { if ((M!=4) || ((N>=-999) && (N<=9999))) sprintf ( L,"%*i",M,N ); else hy36encode ( M,N,L ); strcpy_n1 ( S,L,M ); if (ins[0]) S[M] = ins[0]; } } void Mat4Inverse ( const mat44 & A, mat44 & AI ) { // *** FORMER RBRINV(A,AI) *** // Function to invert 4*4 matrices (AI=A^{-1}) mat44 c; mat33 x; realtype s,s1; int ii,jj,i,i1,j,j1; // ---- Get cofactors of 'a' in array 'c' s1 = 1.0; for (ii=0;ii<4;ii++) { s = s1; for (jj=0;jj<4;jj++) { i = -1; for (i1=0;i1<4;i1++) if (i1!=ii) { i++; j = -1; for (j1=0;j1<4;j1++) if (j1!=jj) { j++; x[i][j] = A[i1][j1]; } } c[ii][jj] = s*(x[0][0]*(x[1][1]*x[2][2]-x[1][2]*x[2][1]) + x[0][1]*(x[1][2]*x[2][0]-x[1][0]*x[2][2]) + x[0][2]*(x[1][0]*x[2][1]-x[1][1]*x[2][0])); s = -s; } s1 = -s1; } // ---- Calculate determinant s = 0.0; for (i=0;i<4;i++) s += A[i][0]*c[i][0]; // ---- Get inverse matrix if (s!=0.0) for (i=0;i<4;i++) for (j=0;j<4;j++) AI[i][j] = c[j][i]/s; } realtype Mat3Inverse ( const mat33 & A, mat33 & AI ) { mat33 c,x; realtype s; int ii,jj,i,i1,j,j1; // Get cofactors of 'a' in array 'c' s = 1.0; for (ii=0;ii<3;ii++) for (jj=0;jj<3;jj++) { i = -1; for (i1=0;i1<3;i1++) if (i1!=ii) { i++; j = -1; for (j1=0;j1<3;j1++) if (j1!=jj) { j++; x[i][j] = A[i1][j1]; } } c[ii][jj] = s*(x[0][0]*x[1][1]-x[0][1]*x[1][0]); s = -s; } // Calculate determinant s = 0.0; for (i=0;i<3;i++) s += A[i][0]*c[i][0]; // Get inverse matrix if (s!=0.0) for (i=0;i<3;i++) for (j=0;j<3;j++) AI[i][j] = c[j][i]/s; return s; } void Mat4Mult ( mat44 & A, const mat44 & B, const mat44 & C ) { // Calculates A=B*C int i,j,k; for (i=0;i<4;i++) for (j=0;j<4;j++) { A[i][j] = 0.0; for (k=0;k<4;k++) A[i][j] += B[i][k]*C[k][j]; } } void Mat4Div1 ( mat44 & A, const mat44 & B, const mat44 & C ) { // Calculates A=B^{-1}*C mat44 B1; int i,j,k; B1[0][0] = 1.0; // in order to supress warnings from some // stupid compilers Mat4Inverse ( B,B1 ); for (i=0;i<4;i++) for (j=0;j<4;j++) { A[i][j] = 0.0; for (k=0;k<4;k++) A[i][j] += B1[i][k]*C[k][j]; } } void Mat4Div2 ( mat44 & A, const mat44 & B, const mat44 & C ) { // Calculates A=B*C^{-1} mat44 C1; int i,j,k; C1[0][0] = 1.0; // in order to supress warnings from some // stupid compilers Mat4Inverse ( C,C1 ); for (i=0;i<4;i++) for (j=0;j<4;j++) { A[i][j] = 0.0; for (k=0;k<4;k++) A[i][j] += B[i][k]*C1[k][j]; } } void Mat4Init ( mat44 & A ) { int i,j; for (i=0;i<4;i++) { for (j=0;j<4;j++) A[i][j] = 0.0; A[i][i] = 1.0; } } realtype Mat4RotDet ( const mat44 & T ) { // returns determinant of the rotation part return T[0][0]*T[1][1]*T[2][2] + T[0][1]*T[1][2]*T[2][0] + T[1][0]*T[2][1]*T[0][2] - T[0][2]*T[1][1]*T[2][0] - T[0][0]*T[1][2]*T[2][1] - T[2][2]*T[0][1]*T[1][0]; } bool isMat4Unit ( const mat44 & A, realtype eps, bool rotOnly ) { // returns true if A is a unit 4x4 matrix int i,j,k; bool B; if (rotOnly) k = 3; else k = 4; B = true; for (i=0;(iContinuationNo>1); } // =================== ContString ===================== ContString::ContString() : ContainerClass() { InitString(); } ContString::ContString ( cpstr S ) : ContainerClass() { InitString(); ConvertPDBASCII ( S ); } ContString::ContString ( io::RPStream Object ) : ContainerClass(Object) { InitString(); } ContString::~ContString() { if (Line) delete[] Line; if (CIFCategory) delete[] CIFCategory; if (CIFTag) delete[] CIFTag; } void ContString::InitString() { Line = NULL; CIFCategory = NULL; CIFTag = NULL; } ERROR_CODE ContString::ConvertPDBASCII ( cpstr S ) { CreateCopy ( Line,S ); return Error_NoError; } void ContString::PDBASCIIDump ( pstr S, int ) { if (Line) strcpy ( S,Line ); else strcpy ( S,"" ); } bool ContString::PDBASCIIDump1 ( io::RFile f ) { if (Line) f.WriteLine ( Line ); else f.LF(); return true; } /* void ContString::GetCIF1 ( mmcif::PData CIF, ERROR_CODE & Signal, int & pos ) { pstr F; int i,RC; char c; if ((!CIFCategory) || (!CIFTag)) { Signal = Error_EmptyCIF; return; } F = CIF->GetString ( CIFCategory,CIFTag,RC ); if (RC || (!F)) { Signal = Error_EmptyCIF; return; } if (Signal>=(int)strlen(F)) { CIF->DeleteField ( CIFCategory,CIFTag ); Signal = Error_EmptyCIF; return; } // i = Signal; // while (F[i] && (F[i]!='\n') && (F[i]!='\r')) i++; // if ((Signal==0) && (i==0)) { // i++; // if (((F[Signal]=='\n') && (F[i]=='\r')) || // ((F[Signal]=='\r') && (F[i]=='\n'))) i++; // Signal = i; // while (F[i] && (F[i]!='\n') && (F[i]!='\r')) i++; // } // c = F[i]; // F[i] = char(0); // CreateCopy ( Line,&(F[Signal]) ); // if (c) { // F[i] = c; // Signal = i+1; // if (((c=='\n') && (F[Signal]=='\r')) || // ((c=='\r') && (F[Signal]=='\n'))) Signal++; // } else // CIF->DeleteField ( CIFCategory,CIFTag ); i = pos; while (F[i] && (F[i]!='\n') && (F[i]!='\r')) i++; if ((pos==0) && (i==0)) { i++; if (((F[pos]=='\n') && (F[i]=='\r')) || ((F[pos]=='\r') && (F[i]=='\n'))) i++; pos = i; while (F[i] && (F[i]!='\n') && (F[i]!='\r')) i++; } c = F[i]; F[i] = char(0); CreateCopy ( Line,&(F[pos]) ); if (c) { F[i] = c; pos = i+1; if (((c=='\n') && (F[pos]=='\r')) || ((c=='\r') && (F[pos]=='\n'))) pos++; } else CIF->DeleteField ( CIFCategory,CIFTag ); } */ void ContString::MakeCIF ( mmcif::PData CIF, int N ) { pstr S; if ((!CIFCategory) || (!CIFTag)) return; S = new char[strlen(Line)+5]; strcpy ( S,"\n" ); strcat ( S,Line ); CIF->PutString ( S,CIFCategory,CIFTag,(N!=0) ); delete[] S; } bool ContString::Append ( PContainerClass CC ) { if (ContainerClass::Append(CC)) { if (!Line) { Line = PContString(CC)->Line; PContString(CC)->Line = NULL; } else CreateConcat ( Line,pstr("\n"),PContString(CC)->Line ); return true; } return false; } void ContString::Copy ( PContainerClass CString ) { CreateCopy ( Line,PContString(CString)->Line ); } void ContString::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.CreateWrite ( Line ); f.CreateWrite ( CIFCategory ); f.CreateWrite ( CIFTag ); } void ContString::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.CreateRead ( Line ); f.CreateRead ( CIFCategory ); f.CreateRead ( CIFTag ); } MakeStreamFunctions(ContString) // ============== ClassContainer ==================== MakeStreamFunctions(ContainerClass) ClassContainer::ClassContainer() : io::Stream() { Init(); } ClassContainer::ClassContainer ( io::RPStream Object ) : io::Stream(Object) { Init(); } void ClassContainer::Init() { length = 0; Container = NULL; } ClassContainer::~ClassContainer() { FreeContainer(); } void ClassContainer::FreeContainer() { int i; if (Container) { for (i=0;i0) { i = length-1; while (i>=0) { if (!Container[i]) i--; else if (Container[i]->GetClassID()!=Data->GetClassID()) i--; else break; } if (i>=0) { if (Container[i]->Append(Data)) { delete Data; return; } } } C1 = new PContainerClass[length+1]; for (i=0;iPDBASCIIDump1(f)) { Container[i]->PDBASCIIDump ( S,i ); j = strlen(S); while (j<80) S[j++] = ' '; S[80] = char(0); f.WriteLine ( S ); } } } ERROR_CODE ClassContainer::GetCIF ( mmcif::PData CIF, int ClassID ) { PContainerClass ContainerClass; int n; ERROR_CODE rc; n = -1; do { ContainerClass = MakeContainerClass ( ClassID ); rc = ContainerClass->GetCIF ( CIF,n ); if (rc==Error_NoError) AddData ( ContainerClass ); } while (rc==Error_NoError); delete ContainerClass; if (rc==Error_EmptyCIF) rc = Error_NoError; return rc; } void ClassContainer::MakeCIF ( mmcif::PData CIF ) { int i; for (i=0;iMakeCIF ( CIF,i ); } void ClassContainer::write ( io::RFile f ) { int i,ClassID; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &length ); for (i=0;iGetClassID(); f.WriteInt ( &ClassID ); Container[i]->write ( f ); } else { ClassID = -1; f.WriteInt ( &ClassID ); } } PContainerClass ClassContainer::MakeContainerClass ( int ClassID ) { if (ClassID==ClassID_String) return new ContString(); return new ContainerClass(); } PContainerClass ClassContainer::GetContainerClass (int ContClassNo) { if ((ContClassNo<0) || (ContClassNo>=length)) return NULL; return Container[ContClassNo]; } void ClassContainer::Copy ( PClassContainer CContainer ) { int i; FreeContainer(); if (CContainer) { length = CContainer->length; if (length>0) { Container = new PContainerClass[length]; for (i=0;iContainer[i]) { Container[i] = MakeContainerClass ( CContainer->Container[i]->GetClassID() ); Container[i]->Copy ( CContainer->Container[i] ); } else Container[i] = NULL; } } } void ClassContainer::read ( io::RFile f ) { int i,ClassID; byte Version; FreeContainer(); f.ReadByte ( &Version ); f.ReadInt ( &length ); if (length>0) { Container = new PContainerClass[length]; for (i=0;i=0) { Container[i] = MakeContainerClass ( ClassID ); Container[i]->read ( f ); } else Container[i] = NULL; } } } MakeStreamFunctions(ClassContainer) // ====================== ID parsers ========================== AtomPath::AtomPath() : io::Stream() { InitAtomPath(); } AtomPath::AtomPath ( cpstr ID ) : io::Stream() { InitAtomPath(); SetPath ( ID ); } AtomPath::AtomPath ( io::RPStream Object ) : io::Stream(Object) { InitAtomPath(); } AtomPath::~AtomPath() {} void AtomPath::InitAtomPath() { modelNo = 0; chainID [0] = char(0); seqNum = MinInt4; insCode [0] = char(0); resName [0] = char(0); atomName[0] = char(0); element [0] = char(0); altLoc [0] = char(0); isSet = 0; } int AtomPath::SetPath ( cpstr ID ) { // 1. If ID starts with '/': // /mdl/chn/seq(res).i/atm[elm]:a // // 2. If ID starts with a letter: // chn/seq(res).i/atm[elm]:a // // 3. If ID starts with a number: // seq(res).i/atm[elm]:a // // 4. If ID contains colon ':' then // it may be just // atm[elm]:a // // All spaces are ignored. isSet // sets bit for each element present. // Any element may be a wildcard '*'. // Wildcard for model will set modelNo=0, // for sequence number will set // seqNum=MinInt4. // // Returns: // 0 <-> Ok // -1 <-> wrong numerical format for model // -2 <-> wrong numerical format for sequence number // char N[100]; pstr p,p1; int i,k; isSet = 0; // clear all bits. p = pstr(ID); while (*p==' ') p++; if (!(*p)) return 0; if (*p=='/') { // model number p++; i = 0; while ((*p) && (*p!='/')) { if (*p!=' ') N[i++] = *p; p++; } N[i] = char(0); if ((!N[0]) || (N[0]=='*')) modelNo = 0; else { modelNo = mround(strtod(N,&p1)); if ((modelNo==0) && (p1==N)) return -1; } isSet |= APATH_ModelNo; if (*p!='/') return 0; p++; while (*p==' ') p++; } if ((*p<'0') || (*p>'9')) { // chain ID i = 0; k = sizeof(ChainID)-1; while ((*p) && (*p!='/')) { if ((*p!=' ') && (i='0') && (*p<='9')) || (*p=='-') || (*p=='(') || (*p=='.')) { // sequence number, residue name and insertion code i = 0; while ((*p) && (*p!='/')) { if (*p!=' ') N[i++] = *p; p++; } N[i] = char(0); i = ParseResID ( N,seqNum,insCode,resName ); if (i==2) return -2; isSet |= APATH_SeqNum | APATH_InsCode | APATH_ResName; if (*p!='/') return 0; p++; while (*p==' ') p++; } if (FirstOccurence(p,':') || FirstOccurence(p,'[')) { // atom name, chemical element and alternative location i = 0; while (*p) { if (*p!=' ') N[i++] = *p; p++; } N[i] = char(0); ParseAtomID ( N,atomName,element,altLoc ); isSet |= APATH_AtomName | APATH_Element | APATH_AltLoc; } return 0; } void AtomPath::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); io::Stream::write ( f ); f.WriteInt ( &modelNo ); f.WriteInt ( &seqNum ); f.WriteInt ( &isSet ); f.WriteTerLine ( chainID ,false ); f.WriteTerLine ( insCode ,false ); f.WriteTerLine ( resName ,false ); f.WriteTerLine ( atomName,false ); f.WriteTerLine ( element ,false ); f.WriteTerLine ( altLoc ,false ); } void AtomPath::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); io::Stream::read ( f ); f.ReadInt ( &modelNo ); f.ReadInt ( &seqNum ); f.ReadInt ( &isSet ); f.ReadTerLine ( chainID ,false ); f.ReadTerLine ( insCode ,false ); f.ReadTerLine ( resName ,false ); f.ReadTerLine ( atomName,false ); f.ReadTerLine ( element ,false ); f.ReadTerLine ( altLoc ,false ); } MakeStreamFunctions(AtomPath) // -------------------------------------------------------- QuickSort::QuickSort() : io::Stream() { selSortLimit = 15; data = NULL; dlen = 0; } QuickSort::QuickSort ( io::RPStream Object ) : io::Stream(Object) { selSortLimit = 15; data = NULL; dlen = 0; } int QuickSort::Compare ( int i, int j ) { // sort by increasing data[i] if (((ivector)data)[i]<((ivector)data)[j]) return -1; if (((ivector)data)[i]>((ivector)data)[j]) return 1; return 0; } void QuickSort::Swap ( int i, int j ) { int b; b = ((ivector)data)[i]; ((ivector)data)[i] = ((ivector)data)[j]; ((ivector)data)[j] = b; } void QuickSort::SelectionSort ( int left, int right ) { int i,j,imin; for (i=left;i0) && (Compare(rm,lv)>0)); do lm++; while ((lm=l) i = l-1; wrd[i] = char(0); p = p1; } void ParseAtomID ( cpstr ID, AtomName aname, Element elname, AltLoc aloc ) { pstr p; p = pstr(ID); while (*p==' ') p++; strcpy ( aname ,"*" ); strcpy ( elname,"*" ); if (*p) aloc[0] = char(0); else strcpy ( aloc,"*" ); takeWord ( p,aname,pstr("[: "),sizeof(AtomName) ); if (*p=='[') { p++; takeWord ( p,elname,pstr("]: "),sizeof(Element) ); if (*p==']') p++; } if (*p==':') { p++; takeWord ( p,aloc,pstr(" "),sizeof(AltLoc) ); } } int ParseResID ( cpstr ID, int & sn, InsCode inscode, ResName resname ) { int RC; pstr p,p1; char N[100]; RC = 0; p = pstr(ID); while (*p==' ') p++; sn = ANY_RES; strcpy ( inscode,"*" ); strcpy ( resname,"*" ); N[0] = char(0); takeWord ( p,N,pstr("(./ "),sizeof(N) ); if ((!N[0]) || (N[0]=='*')) { sn = ANY_RES; RC = 1; } if (!RC) { sn = mround(strtod(N,&p1)); if (p1==N) RC = 2; else inscode[0] = char(0); } if (*p=='(') { p++; takeWord ( p,resname,pstr(")./ "),sizeof(ResName) ); if (*p==')') p++; } if (*p=='.') { p++; takeWord ( p,inscode,pstr("/ "),sizeof(InsCode) ); } return RC; } int ParseAtomPath ( cpstr ID, int & mdl, ChainID chn, int & sn, InsCode ic, ResName res, AtomName atm, Element elm, AltLoc aloc, PAtomPath DefPath ) { // /mdl/chn/seq(res).i/atm[elm]:a, may be partial char N[100]; pstr p,p1; int i,RC; bool wasRes; wasRes = false; RC = 0; p = pstr(ID); while (*p==' ') p++; mdl = 0; if (*p=='/') { p++; N[0] = char(0); takeWord ( p,N,pstr("/"),sizeof(N) ); if ((!N[0]) || (N[0]=='*')) mdl = 0; else { mdl = mround(strtod(N,&p1)); if ((mdl==0) && (p1==N)) return -1; } } else if (DefPath) { if (DefPath->isSet & APATH_ModelNo) mdl = DefPath->modelNo; } strcpy ( chn,"*" ); if ((*p<'0') || (*p>'9') || (*p=='/')) { if (*p=='/') p++; p1 = p; chn[0] = char(0); takeWord ( p,chn,pstr("/"),sizeof(ChainID) ); if (strpbrk(chn,"(.[:-")) { // this was not a chain ID! if (DefPath) { if (DefPath->isSet & APATH_ChainID) strcpy ( chn,DefPath->chainID ); } else strcpy ( chn,"*" ); p = p1; } } else if (DefPath) { if (DefPath->isSet & APATH_ChainID) strcpy ( chn,DefPath->chainID ); } if (*p=='/') p++; sn = ANY_RES; strcpy ( ic ,"*" ); strcpy ( res,"*" ); if (((*p>='0') && (*p<='9')) || (*p=='-') || (*p=='(') || (*p=='.')) { wasRes = true; N[0] = char(0); takeWord ( p,N,pstr("/"),sizeof(N) ); i = ParseResID ( N,sn,ic,res ); if (i==2) return -2; } else if (DefPath) { wasRes = (*p=='/'); if (DefPath->isSet & APATH_SeqNum) sn = DefPath->seqNum; if (DefPath->isSet & APATH_InsCode) strcpy ( ic,DefPath->insCode ); if (DefPath->isSet & APATH_ResName) strcpy ( res,DefPath->resName ); } if (*p=='/') p++; strcpy ( atm ,"*" ); strcpy ( elm ,"*" ); strcpy ( aloc,"*" ); if (wasRes || FirstOccurence(p,':') || FirstOccurence(p,'[')) { ParseAtomID ( p,atm,elm,aloc ); } else if (DefPath) { if (DefPath->isSet & APATH_AtomName) strcpy ( atm,DefPath->atomName ); if (DefPath->isSet & APATH_Element) strcpy ( elm,DefPath->element ); if (DefPath->isSet & APATH_ResName) strcpy ( aloc,DefPath->altLoc ); } if (mdl<=0) RC |= APATH_WC_ModelNo; if (chn[0]=='*') RC |= APATH_WC_ChainID; if (sn==ANY_RES) RC |= APATH_WC_SeqNum; if (ic[0]=='*') RC |= APATH_WC_InsCode; if (res[0]=='*') RC |= APATH_WC_ResName; if (atm[0]=='*') RC |= APATH_WC_AtomName; if (elm[0]=='*') RC |= APATH_WC_Element; if (aloc[0]=='*') RC |= APATH_WC_AltLoc; if (RC & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode | APATH_WC_AtomName | APATH_WC_AltLoc)) RC |= APATH_Incomplete; return RC; } int ParseSelectionPath ( cpstr CID, int & iModel, pstr Chains, int & sNum1, InsCode ic1, int & sNum2, InsCode ic2, pstr RNames, pstr ANames, pstr Elements, pstr altLocs ) { int l,j; pstr p,p1; pstr N; int seqNum [2]; InsCode insCode[2]; pstr ID; bool wasModel,wasChain,wasRes,haveNeg; l = IMax(10,strlen(CID))+1; ID = new char[l]; N = new char[l]; p = pstr(CID); p1 = ID; while (*p) { if (*p!=' ') { *p1 = *p; p1++; } p++; } *p1 = char(0); p = ID; iModel = 0; strcpy ( Chains,"*" ); seqNum[0] = ANY_RES; seqNum[1] = ANY_RES; strcpy ( insCode[0],"*" ); strcpy ( insCode[1],"*" ); strcpy ( RNames ,"*" ); strcpy ( ANames ,"*" ); strcpy ( Elements ,"*" ); strcpy ( altLocs ,"*" ); wasModel = false; wasChain = false; wasRes = false; if (*p=='/') { // CID starts with the slash -- take model number first p++; N[0] = char(0); takeWord ( p,N,pstr("/"),l ); if ((!N[0]) || (N[0]=='*')) iModel = 0; else { iModel = mround(strtod(N,&p1)); if ((iModel==0) && (p1==N)) return -1; } if (*p=='/') p++; wasModel = true; } if ((*p) && (wasModel || (*p<'0') || (*p>'9'))) { p1 = p; Chains[0] = char(0); takeWord ( p,Chains,pstr("/"),l ); if (strpbrk(Chains,"(.[:-")) { // this was not a chain ID! strcpy ( Chains,"*" ); p = p1; } else wasChain = true; if (*p=='/') p++; } if ((*p) && (wasChain || ((*p>='0') && (*p<='9')) || (*p=='-') || (*p=='(') || (*p=='.') || (*p=='*'))) { j = 0; do { // take the sequence number haveNeg = false; if (*p=='-') { haveNeg = true; p++; } N[0] = char(0); takeWord ( p,N,pstr("(.-/"),l ); if ((!N[0]) || (N[0]=='*')) seqNum[j] = ANY_RES; else { seqNum[j] = mround(strtod(N,&p1)); if (p1==N) return -2; if (haveNeg) seqNum[j] = - seqNum[j]; } // take the residue list if (*p=='(') { p++; takeWord ( p,RNames,pstr(").-/"),l ); if (*p==')') p++; } // take the insertion code if (seqNum[j]!=ANY_RES) insCode[j][0] = char(0); if (*p=='.') { p++; takeWord ( p,insCode[j],pstr("-/"),sizeof(InsCode) ); } if (*p=='-') { p++; j++; } else { if (j==0) { seqNum[1] = seqNum[0]; strcpy ( insCode[1],insCode[0] ); } j = 10; } } while (j<2); wasRes = true; } else wasRes = (*p=='/'); if (*p=='/') p++; if ((*p) && (wasRes || FirstOccurence(p,':') || FirstOccurence(p,'['))) { if (*p) altLocs[0] = char(0); takeWord ( p,ANames,pstr("[:"),l ); if (!ANames[0]) strcpy ( ANames,"*" ); if (*p=='[') { p++; takeWord ( p,Elements,pstr("]:"),l ); if (*p==']') p++; } if (*p==':') { p++; takeWord ( p,altLocs,pstr(" "),l ); } } /* printf ( " iModel = %i\n" " Chains = '%s'\n" " seqNum1 = %i\n" " insCode1 = '%s'\n" " seqNum2 = %i\n" " insCode2 = '%s'\n" " RNames = '%s'\n" " ANames = '%s'\n" " Elements = '%s'\n" " altLocs = '%s'\n", iModel,Chains,seqNum[0],insCode[0], seqNum[1],insCode[1],RNames,ANames, Elements,altLocs ); */ sNum1 = seqNum[0]; sNum2 = seqNum[1]; strcpy ( ic1,insCode[0] ); strcpy ( ic2,insCode[1] ); delete[] ID; delete[] N; return 0; } void MakeSelectionPath ( pstr CID, int iModel, cpstr Chains, int sNum1, const InsCode ic1, int sNum2, const InsCode ic2, cpstr RNames, cpstr ANames, cpstr Elements, cpstr altLocs ) { char S[100]; int k; if (iModel>0) { sprintf ( CID,"/%i",iModel ); k = 1; } else { CID[0] = char(0); k = 0; } if (Chains[0]!='*') { if (k>0) strcat ( CID,"/" ); strcat ( CID,Chains ); k = 2; } if ((sNum1!=-MaxInt4) || (ic1[0]!='*')) { if (k>0) { if (k<2) strcat ( CID,"/*" ); strcat ( CID,"/" ); } if (sNum1>-MaxInt4) sprintf ( S,"%i",sNum1 ); else strcpy ( S,"*" ); if (ic1[0]!='*') { strcat ( S,"." ); strcat ( S,ic1 ); } strcat ( CID,S ); if ((sNum2!=-MaxInt4) || (ic2[0]!='*')) { strcat ( CID,"-" ); if (sNum1>-MaxInt4) sprintf ( S,"%i",sNum2 ); else strcpy ( S,"*" ); if (ic2[0]!='*') { strcat ( S,"." ); strcat ( S,ic2 ); } strcat ( CID,S ); } k = 3; } if (RNames[0]!='*') { if (k<1) strcat ( CID,"(" ); else if (k<2) strcat ( CID,"*/*(" ); else if (k<3) strcat ( CID,"/*(" ); strcat ( CID,RNames ); strcat ( CID,")" ); k = 4; } if (ANames[0]!='*') { if (k<1) strcat ( CID,"/*/*/*/" ); // full path else if (k<2) strcat ( CID,"/*/*/" ); // /mdl + /*/*/ else if (k<3) strcat ( CID,"/*/" ); // /mdl/chn + /*/ else if (k<4) strcat ( CID,"/" ); // /mdl/chn/res + / strcat ( CID,ANames ); strcat ( CID,")" ); k = 5; } if (Elements[0]!='*') { if (k<1) strcat ( CID,"[" ); else if (k<2) strcat ( CID,"/*/*/*[" ); else if (k<3) strcat ( CID,"/*/*[" ); else if (k<4) strcat ( CID,"/*[" ); else if (k<5) strcat ( CID,"[" ); strcat ( CID,Elements ); strcat ( CID,"]" ); k = 6; } if (altLocs[0]!='*') { if (k<1) strcat ( CID,":" ); else if (k<2) strcat ( CID,"/*/*/*:" ); else if (k<3) strcat ( CID,"/*/*:" ); else if (k<4) strcat ( CID,"/*:" ); else if (k<6) strcat ( CID,":" ); strcat ( CID,altLocs ); } } } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_math_.h0000644000175000017500000000465713271367640015722 0ustar maartenmaarten// $Id: mmdb_math.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 11.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Math // ~~~~~~~~~ // **** Functions : mmdb::math::GetTorsion // ~~~~~~~~~~~ mmdb::math::GetAngle // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_Math__ #define __MMDB_Math__ #include "mmdb_mattype.h" namespace mmdb { namespace math { // ------------------------------------------------------------------ const realtype NO_TORSION = -MaxReal; // U[0,1,2] = x,y,z extern realtype GetTorsion ( rvector U, rvector W, rvector V ); extern realtype GetAngle ( rvector U, rvector V ); // Calculates the binomial coefficient n choose m, 0<=n<=500, 0<=m<=n extern realtype Combinations ( int n, int m ); // Calculates precisely log(1-x) for x<1, including very small x extern realtype log1mx ( realtype x ); // Calculates precisely 1 - exp(x) for any x including very small values extern realtype expc ( realtype x ); inline double exp10 ( double x ) { return exp(x*ln10); } // Calculates precisely 1-(1-x)**y including very small x and very large y extern realtype expc1mx ( realtype x, realtype y ); } } #endif mmdb2-2.0.20/mmdb2/mmdb_tables.h0000644000175000017500000001044213271367640016071 0ustar maartenmaarten// $Id: mmdb_tables.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 24.07.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Tables // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Namespace : mmdb:: // // **** Functions : // ~~~~~~~~~~~ // // **** Constants : AName ( array of 2-character atom names ) // ~~~~~~~~~~~ HAName ( array of 2=character heteroatom names ) // RName ( 3-characters amino acid names ) // RName1 ( 1-characters amino acid names ) // // // (C) E. Krissinel 2000-2015 // // ================================================================= // #ifndef __MMDB_Tables__ #define __MMDB_Tables__ #include "mmdb_mattype.h" namespace mmdb { // ================================================================= const int nElementNames = 117; const int nElementMetals = 91; const int nHydAtomNames = 14; extern cpstr const ElementName [nElementNames]; extern cpstr const ElementMetal [nElementMetals]; extern cpstr const HydAtomName [nHydAtomNames]; extern realtype const MolecWeight [nElementNames]; extern realtype const CovalentRadius[nElementNames]; extern realtype const VdWaalsRadius [nElementNames]; extern realtype const IonicRadius [nElementNames]; extern bool isMetal ( cpstr element ); const int ELEMENT_UNKNOWN = -1; extern int getElementNo ( cpstr element ); extern realtype getMolecWeight ( cpstr element ); extern realtype getCovalentRadius ( cpstr element ); extern realtype getVdWaalsRadius ( cpstr element ); const int nResNames = 26; extern cpstr const ResidueName [nResNames]; extern char const ResidueName1[nResNames]; extern int getResidueNo ( cpstr resName ); const realtype NAvogadro = 6.02214129e23; const int nSolventNames = 12; const int nAminoacidNames = 23; const int nNucleotideNames = 24; DefineStructure(AAProperty); struct AAProperty { char name[4]; realtype hydropathy; realtype charge; realtype relSolvEnergy; }; extern AAProperty const AAProperties[nAminoacidNames]; extern int const AASimilarity[nAminoacidNames][nAminoacidNames]; extern int GetAAPIndex ( cpstr resName ); // 0..nAminoacidNames-1 extern realtype GetAAHydropathy ( cpstr resName ); // -4.5...+4.5 extern realtype GetAACharge ( cpstr resName ); extern realtype GetAASolvationEnergy ( cpstr resName ); extern int GetAASimilarity ( cpstr resName1, cpstr resName2 ); // 0..5 extern cpstr const StdSolventName[nSolventNames]; extern cpstr const NucleotideName[nNucleotideNames]; extern bool isSolvent ( cpstr resName ); extern bool isAminoacid ( cpstr resName ); extern bool isNucleotide ( cpstr resName ); extern int isDNARNA ( cpstr resName ); // 0,1(DNA),2(RNA) extern bool isSugar ( cpstr resName ); extern void Get1LetterCode ( cpstr res3name, pstr res1code ); extern void Get1LetterCode ( cpstr res3name, char & res1code ); extern void Get3LetterCode ( cpstr res1name, pstr res3code ); } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_mattype.h0000644000175000017500000006435213271367640016313 0ustar maartenmaarten// $Id: mmdb_mattype.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 10.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MatType_ // ~~~~~~~~~ // **** Functions : // ~~~~~~~~~~~ // GetString ( reads substring from a string ) // GetStrTer ( reads substring and put term-ing null ) // strcpy_n ( copies not more than n characters ) // strcpy_ns ( like strcpy_ns and pads with spaces ) // strcpy_n0 ( like strcpy_n and adds terminating 0 ) // PadSpaces ( pads a string with spaces ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_MatType__ #define __MMDB_MatType__ #include #define UseDoubleFloat #ifndef __ClassMacros # define __ClassMacros // A Class definition macros # define DefineClass(ClassName) \ class ClassName; \ typedef ClassName * P##ClassName; \ typedef ClassName & R##ClassName; \ typedef P##ClassName * PP##ClassName; \ typedef P##ClassName & RP##ClassName; // A Structure definition macros # define DefineStructure(StructureName) \ struct StructureName; \ typedef StructureName * P##StructureName; \ typedef StructureName & R##StructureName; \ typedef P##StructureName * PP##StructureName; \ typedef P##StructureName & RP##StructureName; #endif #define UNUSED_ARGUMENT(x) (void)x // ----------------------------------------------------- namespace mmdb { #ifdef UseDoubleFloat typedef double realtype; const realtype MinReal = 2.2250e-307; const realtype MaxReal = 1.7976e+308; const realtype fMinReal = 2.2250e-307; const realtype fMaxReal = 1.7976e+308; #else typedef float realtype; const realtype MinReal = 1.1755e-38; const realtype MaxReal = 3.4020e+38; const realtype fMinReal = 1.1755e-38; const realtype fMaxReal = 3.4020e+38; #endif typedef float shortreal; const shortreal MinShortReal = 1.1755e-38; const shortreal MaxShortReal = 3.4020e+38; /* #define strrchr LastOccurence #define fstrrchr LastOccurence #define strchr FirstOccurence #define fstrchr FirstOccurence */ typedef char * pstr; typedef const char * cpstr; typedef unsigned int word; typedef unsigned char byte; typedef signed char short_int; // typedef byte Boolean; typedef unsigned int word2; typedef byte * byteptr; typedef unsigned long lword; typedef byte intUniBin [4]; typedef byte shortUniBin [2]; typedef byte longUniBin [4]; typedef byte wordUniBin [4]; typedef byte realUniBin [10]; typedef byte floatUniBin [5]; typedef byte shortrealUniBin[5]; #ifdef _WIN32 pstr strcasestr ( pstr s1, cpstr s2 ); #endif #ifdef _MSC_VER #define strncasecmp _strnicmp #define strcasecmp _stricmp #endif const int MaxInt = 32767; const int MinInt = -32768; const word MaxWord = 65535L; const long int MaxInt4 = 2147483647L; // MinInt4 would have to be defined as -2147483648, // however some compilers do not like that. To be on safe, // we define it as -2147483647: const long int MinInt4 = -2147483647; const lword MaxWord4 = 4294967295UL; const realtype Pi = 3.141592653589793238462643; const realtype Eu = 2.718281828459045235360287; const realtype ln10 = 2.3025850929940456840179915; // *** vectors X[1..N] : typedef realtype * rvector; typedef int * ivector; typedef word * wvector; typedef byte * bvector; typedef bool * ovector; typedef long * lvector; typedef lword * lwvector; typedef pstr * psvector; // *** matrices X[1..N][1..M] : typedef rvector * rmatrix; typedef ivector * imatrix; typedef wvector * wmatrix; typedef bvector * bmatrix; typedef ovector * omatrix; typedef lvector * lmatrix; typedef lwvector * lwmatrix; typedef psvector * psmatrix; // *** matrices X[1..N][1..M][1..K] : typedef rmatrix * rmatrix3; typedef imatrix * imatrix3; typedef wmatrix * wmatrix3; typedef bmatrix * bmatrix3; typedef omatrix * omatrix3; typedef lmatrix * lmatrix3; typedef lwmatrix * lwmatrix3; typedef psmatrix * psmatrix3; // ------------------------------------------------------------ // Initialization. Some C++ enviroments do not do call // InitMatType() automatically, therefore it is always // advisable to call InitMatType() explicitely from the top of // main(). It is completely harmless and cheap (although // unnecessary) to call InitMatType() multiple times. extern bool InitMatType(); // ------------------------------------------------------------ inline int mround ( realtype X ) { return (int)floor(X+0.5); } inline int ifloor ( realtype X ) { return (int)floor(X); } inline int Abs ( int x ) { return ( x >= 0 ? x : -x ); } inline void ISwap ( int & x, int & y ) { int b = x; x = y; y = b; } inline void WSwap ( word & x, word & y ) { word b = x; x = y; y = b; } inline void BSwap ( byte & x, byte & y ) { byte b = x; x = y; y = b; } inline void OSwap ( bool & x, bool & y ) { bool b = x; x = y; y = b; } inline void LSwap ( long & x, long & y ) { long b = x; x = y; y = b; } inline void RSwap ( realtype & x, realtype & y ) { realtype b = x; x = y; y = b; } inline realtype RMax ( const realtype x1, const realtype x2 ) { return ( x1 > x2 ? x1 : x2 ); } inline long LMax ( const long x1, const long x2 ) { return ( x1 > x2 ? x1 : x2 ); } inline word WMax ( const word x1, const word x2 ) { return ( x1 > x2 ? x1 : x2 ); } inline int IMax ( const int x1, const int x2 ) { return ( x1 > x2 ? x1 : x2 ); } inline realtype RMin ( const realtype x1, const realtype x2 ) { return ( x1 < x2 ? x1 : x2 ); } inline long LMin ( const long x1, const long x2 ) { return ( x1 < x2 ? x1 : x2 ); } inline word WMin ( const word x1, const word x2 ) { return ( x1 < x2 ? x1 : x2 ); } inline int IMin ( const int x1, const int x2 ) { return ( x1 < x2 ? x1 : x2 ); } inline realtype fsign ( const realtype x1, const realtype x2 ) { realtype ax; if (x1>=0.0) ax = x1; else ax = -x1; return ( x2 >= 0.0 ? ax : -ax ); } // ------------------------------------------------------------ // Allocated vectors are enumerated as [Shift..Shift+N-1] // rather than [0..N-1] ! // Get-functions return if memory was allocated; // if allocation attemt fails, vector is assigned with NULL extern bool GetVectorMemory ( rvector & V, word N, word Shift=1 ); extern bool GetVectorMemory ( ivector & I, word N, word Shift=1 ); extern bool GetVectorMemory ( wvector & W, word N, word Shift=1 ); extern bool GetVectorMemory ( bvector & B, word N, word Shift=1 ); extern bool GetVectorMemory ( ovector & O, word N, word Shift=1 ); extern bool GetVectorMemory ( lvector & L, word N, word Shift=1 ); extern bool GetVectorMemory ( lwvector & L, word N, word Shift=1 ); extern bool GetVectorMemory ( psvector & P, word N, word Shift=1 ); // Shift at deallocation MUST be the same as that at allocation ! // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Free-functions do nothing if vector has value NULL (e.g. // after unsuccessful allocation). extern void FreeVectorMemory ( rvector & V, word Shift=1 ); extern void FreeVectorMemory ( ivector & I, word Shift=1 ); extern void FreeVectorMemory ( wvector & W, word Shift=1 ); extern void FreeVectorMemory ( bvector & B, word Shift=1 ); extern void FreeVectorMemory ( ovector & O, word Shift=1 ); extern void FreeVectorMemory ( lvector & L, word Shift=1 ); extern void FreeVectorMemory ( lwvector & L, word Shift=1 ); extern void FreeVectorMemory ( psvector & P, word Shift=1 ); // ------------------------------------------------------------- // Allocated matrices are enumerated as // [ShiftN..ShiftN+N-1, ShiftM..ShiftM+M-1] // rather than [0..N-1,0..M-1] ! // Get-functions return if memory was allocated; // if allocation attemt fails, matrix is assigned with NULL // Free-functions do nothing if matrix has value NULL (e.g. // after unsuccessful allocation). extern bool GetMatrixMemory ( rmatrix & A, word N, word M, word ShiftN=1, word ShiftM=1 ); extern bool GetMatrixMemory ( imatrix & A, word N, word M, word ShiftN=1, word ShiftM=1 ); extern bool GetMatrixMemory ( wmatrix & W, word N, word M, word ShiftN=1, word ShiftM=1 ); extern bool GetMatrixMemory ( bmatrix & B, word N, word M, word ShiftN=1, word ShiftM=1 ); extern bool GetMatrixMemory ( omatrix & O, word N, word M, word ShiftN=1, word ShiftM=1 ); extern bool GetMatrixMemory ( lmatrix & L, word N, word M, word ShiftN=1, word ShiftM=1 ); extern bool GetMatrixMemory ( lwmatrix & L, word N, word M, word ShiftN=1, word ShiftM=1 ); extern bool GetMatrixMemory ( psmatrix & P, word N, word M, word ShiftN=1, word ShiftM=1 ); // ShiftN and ShiftM at deallocation MUST be the same as those at // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // allocation ! // ~~~~~~~~~~~~~ extern void FreeMatrixMemory ( rmatrix & A, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( imatrix & A, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( wmatrix & W, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( bmatrix & B, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( omatrix & O, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( lmatrix & L, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( lwmatrix & L, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( psmatrix & P, word N, word ShiftN=1, word ShiftM=1 ); // ------------------------------------------------------------- // 3D matrices extern bool GetMatrix3Memory ( rmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern bool GetMatrix3Memory ( imatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern bool GetMatrix3Memory ( wmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern bool GetMatrix3Memory ( bmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern bool GetMatrix3Memory ( omatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern bool GetMatrix3Memory ( lmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern bool GetMatrix3Memory ( lwmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern bool GetMatrix3Memory ( psmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); // // ShiftN, ShiftM and ShiftK at deallocation MUST be // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // the same as those at allocation ! // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ extern void FreeMatrix3Memory ( rmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( imatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( wmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( bmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( omatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( lmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( lwmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( psmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); // ------------------------------------------------------------- extern realtype MachEps; extern realtype floatMachEps; extern realtype LnMaxReal; extern realtype LnMinReal; extern realtype MachinEps (); extern realtype floatMachinEps(); extern realtype frac ( realtype R ); extern long mod ( long x, long y ); extern realtype Pow ( realtype X, int y ); extern realtype Pow1 ( realtype X, realtype Y ); extern realtype Exp ( realtype X ); // use to avoid catastrophies extern bool Odd ( int i ); extern long HexValL ( cpstr S ); extern long OctValL ( cpstr S ); extern long BinValL ( cpstr S ); extern pstr BinValS ( long L, pstr S ); // S[sizeof(long)+1] at least extern pstr ParamStr ( pstr D, cpstr S, realtype V, int M=5, cpstr S1=(pstr)"" ); extern pstr ParamStr ( pstr D, cpstr S, realtype V, int M, cpstr S1, realtype V2, int M2=5, cpstr S2=(pstr)"" ); // ---------- Strings // CreateCopy(..) allocates Dest string and copies the contents of // Source into it. If Dest is not NULL prior calling the function, // it is attempted to deallocate first. extern pstr CreateCopy ( pstr & Dest, cpstr Source ); extern pstr CreateCopy_n ( pstr & Dest, cpstr Source, int n ); extern pstr CreateConcat ( pstr & Dest, cpstr Source ); extern pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2 ); extern pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3 ); extern pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4 ); extern pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4, cpstr Source5 ); extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4, cpstr Source5 ); extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4 ); extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3 ); extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2 ); extern pstr LastOccurence ( cpstr S , char c ); extern pstr FirstOccurence ( cpstr S , char c ); extern int indexOf ( cpstr S , char c ); extern pstr FirstOccurence ( cpstr S, int Slen, cpstr Q, int Qlen ); extern int indexOf ( cpstr S, int Slen, cpstr Q, int Qlen ); extern pstr LowerCase ( pstr s ); extern pstr UpperCase ( pstr s ); // GetString(..) copies first M characters of string S into string // L, appending the terminating null. If S contains less then M // characters, L will be padded with spaces. extern void GetString ( pstr L, cpstr S, int M ); // GetStrTer(..) copies at least n (or LMax if LMax5 // (terminating null appended). // The function returns d. extern pstr strcpy_ncs ( pstr d, cpstr s, int n ); // strcpy_css(..) copies string s to string d cutting all // spaces at the begining and at the end. Thus, " ab c de " // will be copied like "ab c de" (terminating null appended). // The function returns d. extern pstr strcpy_css ( pstr d, cpstr s ); // strcpy_ncss(..) copies at most n characters from string s // to string d cutting all spaces at the begining and at the end. // Thus, " ab c de " will be copied like "ab" at n=3 (terminating // null appended). // The function returns d. extern pstr strcpy_ncss ( pstr d, cpstr s, int n ); // strcpy_n0(..) copies at most n symbols from string s to d, // but no more than strlen(s) (s must contain a terminating // null). The terminating null IS appended to d. // The function returns d. extern pstr strcpy_n0 ( pstr d, cpstr s, int n ); // strlen_des returns the length of a string as if all extra // spaces from the latter have been deleted. Extra spaces // include all leading and tracing spaces and any sequential // spaces when more than one. The string does not change. extern int strlen_des ( cpstr s ); // strcpy_des copies string s into string d removing all extra // spaces from the latter. Extra spaces include all leading and // tracing spaces and any sequential spaces when more than one. extern pstr strcpy_des ( pstr d, cpstr s ); // strcat_des appends string s to string d removing all extra // spaces from the latter. Extra spaces include all leading and // tracing spaces and any sequential spaces when more than one. extern pstr strcat_des ( pstr d, cpstr s ); // PadSpaces(..) pads string S with spaces making its length // equal to len. The terminating zero is added, so that S should // reserve space of a minimum len+1 characters. extern void PadSpaces ( pstr S, int len ); enum SCUTKEY { SCUTKEY_BEGIN = 0x00000001, SCUTKEY_END = 0x00000002, SCUTKEY_BEGEND = 0x00000003 }; // CutSpaces(..) cuts spaces at the begining or end of // string S according to the value of CutKey. The function // returns S. extern pstr CutSpaces ( pstr S, int CutKey ); // DelSpaces(..) removes all spaces (or other symbols as // specified by 'c') from the string. The string is then // shrinked by the number of removed characters. Thus, // " as ttt " becomes "asttt". extern pstr DelSpaces ( pstr S, char c=' ' ); // EnforceSpaces(..) replaces all unprintable characters, // except , , and some others, for spaces extern pstr EnforceSpaces ( pstr S ); // ------------------------------------------------------------- /// This call will produce correct floats in universal binaries but /// make them incompatible with old files. Without this call, float /// read/write will result in error after 6th digit. /// UniBin read/write of other types (realtype, shortreal, int etc) /// is not affected by this call, and to the best of knowledge is /// correct (no loss of precision). extern void set_new_float_unibin(); extern bool is_new_float_unibin(); extern void set_old_float_unibin(); extern void __modify4(); extern void int2UniBin ( int I, intUniBin iUB ); extern void short2UniBin ( short S, shortUniBin sUB ); extern void long2UniBin ( long L, longUniBin lUB ); extern void word2UniBin ( word W, wordUniBin wUB ); extern void real2UniBin ( realtype R, realUniBin rUB ); extern void float2UniBin ( realtype R, floatUniBin fUB ); extern void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ); extern void UniBin2int ( intUniBin iUB, int & I ); extern void UniBin2short ( shortUniBin sUB, short & S ); extern void UniBin2long ( longUniBin lUB, long & L ); extern void UniBin2word ( wordUniBin wUB, word & W ); extern void UniBin2real ( realUniBin rUB, realtype & R ); extern void UniBin2shortreal ( shortrealUniBin srUB, shortreal & R ); extern void UniBin2float ( floatUniBin fUB, realtype & R ); extern void mem_write ( int I, pstr S, int & l ); extern void mem_write ( short I, pstr S, int & l ); extern void mem_write ( long I, pstr S, int & l ); extern void mem_write ( word W, pstr S, int & l ); extern void mem_write ( realtype R, pstr S, int & l ); extern void mem_write ( shortreal R, pstr S, int & l ); extern void mem_write ( pstr L, int len, pstr S, int & l ); extern void mem_write ( pstr L, pstr S, int & l ); extern void mem_write ( bool B, pstr S, int & l ); extern void mem_write_byte ( byte B, pstr S, int & l ); extern void mem_read ( int & I, cpstr S, int & l ); extern void mem_read ( short & I, cpstr S, int & l ); extern void mem_read ( long & I, cpstr S, int & l ); extern void mem_read ( word & W, cpstr S, int & l ); extern void mem_read ( realtype & R, cpstr S, int & l ); extern void mem_read ( shortreal & R, cpstr S, int & l ); extern void mem_read ( pstr L, int len, cpstr S, int & l ); extern void mem_read ( pstr & L, cpstr S, int & l ); extern void mem_read ( bool & B, cpstr S, int & l ); extern void mem_read_byte ( byte & B, cpstr S, int & l ); } #endif /* =================================================== */ mmdb2-2.0.20/mmdb2/mmdb_ficif.cpp0000644000175000017500000004521213271367640016235 0ustar maartenmaarten// $Id: mmdb_ficif.cpp,v 1.19 2012/01/26 17:52:20 ekr Exp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 24.04.03 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_FICIF // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #include "mmdb_mmcif_.h" #include "mmdb_ficif.h" // ================================================================== mmcif::PData mmCIFData = NULL; FORTRAN_SUBR ( MMDB_FCIF_INIT, mmdb_fcif_init,(),(),() ) { InitMatType(); mmCIFData = NULL; } void MMDB_CCIF_Init() { InitMatType(); mmCIFData = NULL; } FORTRAN_SUBR ( MMDB_FCIF_QUIT, mmdb_fcif_quit,(),(),() ) { if (mmCIFData) delete mmCIFData; mmCIFData = NULL; } void MMDB_CCIF_Quit() { if (mmCIFData) delete mmCIFData; mmCIFData = NULL; } pstr makeString ( pstr S, int SLen, pstr FS, int FSLen ) { GetStrTer ( S,FS,FSLen,SLen,FSLen ); CutSpaces ( S,SCUTKEY_END ); return S; } FORTRAN_SUBR ( MMDB_FCIF_CREATE, mmdb_fcif_create, ( // lengths-at-end list fpstr DataName, // file name int DataName_len // fortran-hidden length of DataName ), ( // lengths-in-structure list fpstr DataName ), ( // lengths-follow list fpstr DataName, int DataName_len ) ) { char S[500]; if (mmCIFData) delete mmCIFData; mmCIFData = new mmcif::Data ( makeString(S,sizeof(S), FTN_STR(DataName),FTN_LEN(DataName)) ); } void MMDB_CCIF_Create ( pstr DataName ) { if (mmCIFData) delete mmCIFData; mmCIFData = new mmcif::Data ( DataName ); } FORTRAN_SUBR ( MMDB_FCIF_WRITE, mmdb_fcif_write, ( // lengths-at-end list fpstr FileName, // file name int * iRet, // return code int FileName_len // fortran-hidden length of FileName ), ( // lengths-in-structure list fpstr FileName, int *iRet ), ( // lengths-follow list fpstr FileName, int FileName_len, int * iRet ) ) { pstr S; if (!mmCIFData) *iRet = -1000; else { S = new char[FTN_LEN(FileName)+10]; if (mmCIFData->WriteMMCIFData(makeString(S,FTN_LEN(FileName)+5, FTN_STR(FileName),FTN_LEN(FileName)))) *iRet = 0; else *iRet = 1; delete[] S; } } int MMDB_CCIF_Write ( pstr FileName ) { if (!mmCIFData) return -1000; else if (mmCIFData->WriteMMCIFData(FileName)) return 0; else return 1; } FORTRAN_SUBR ( MMDB_FCIF_PUTDATE, mmdb_fcif_putdate, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutDate ( makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutDate ( pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutDate ( CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTDOT, mmdb_fcif_putdot, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutNoData ( mmcif::CIF_NODATA_DOT, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutDot ( pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutNoData ( mmcif::CIF_NODATA_DOT, CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTQUESTION, mmdb_fcif_putquestion, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutNoData ( mmcif::CIF_NODATA_QUESTION, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutQuestion ( pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutNoData ( mmcif::CIF_NODATA_QUESTION, CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTSTRING, mmdb_fcif_putstring, ( // lengths-at-end list fpstr Data, // data string to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int Data_len, // fortran-hidden length of Data int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr Data, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr Data, int Data_len, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; pstr S; if (!mmCIFData) *iRet = -1000; else { S = new char[FTN_LEN(Data)+10]; *iRet = mmCIFData->PutString ( makeString(S,FTN_LEN(Data)+5, FTN_STR(Data),FTN_LEN(Data)), makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); delete[] S; } } int MMDB_CCIF_PutString ( pstr Data, pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutString ( Data,CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTREAL, mmdb_fcif_putreal, ( // lengths-at-end list apireal * V, // real value to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list apireal * V, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list apireal * V, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutReal ( *V, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutReal ( realtype V, pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutReal ( V,CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTINTEGER, mmdb_fcif_putinteger, ( // lengths-at-end list int * I, // integer value to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list int * I, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list int * I, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutInteger ( *I, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutInteger ( int I, pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutInteger ( I,CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPDOT, mmdb_fcif_putloopdot, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutLoopNoData ( mmcif::CIF_NODATA_DOT, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); } int MMDB_CCIF_PutLoopDot ( pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopNoData ( mmcif::CIF_NODATA_DOT, CatName,Tag,nrow ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPQUESTION, mmdb_fcif_putloopquestion, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutLoopNoData ( mmcif::CIF_NODATA_QUESTION, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); } int MMDB_CCIF_PutLoopQuestion ( pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopNoData ( mmcif::CIF_NODATA_QUESTION, CatName,Tag,nrow ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPSTRING, mmdb_fcif_putloopstring, ( // lengths-at-end list fpstr Data, // data string to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int Data_len, // fortran-hidden length of Data int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr Data, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr Data, int Data_len, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; pstr S; if (!mmCIFData) *iRet = -1000; else { S = new char[FTN_LEN(Data)+10]; *iRet = mmCIFData->PutLoopString ( makeString(S,FTN_LEN(Data)+5, FTN_STR(Data),FTN_LEN(Data)), makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); delete[] S; } } int MMDB_CCIF_PutLoopString ( pstr Data, pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopString ( Data,CatName,Tag,nrow ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPREAL, mmdb_fcif_putloopreal, ( // lengths-at-end list apireal * V, // real value to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list apireal * V, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list apireal * V, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutLoopReal ( *V, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); } int MMDB_CCIF_PutLoopReal ( realtype V, pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopReal ( V,CatName,Tag,nrow ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPINTEGER, mmdb_fcif_putloopinteger, ( // lengths-at-end list int * I, // integer value to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list int * I, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list int * I, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutLoopInteger ( *I, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); } int MMDB_CCIF_PutLoopInteger ( int I, pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopInteger ( I,CatName,Tag,nrow ); } mmdb2-2.0.20/mmdb2/mmdb_io_file.cpp0000644000175000017500000014311213524560235016555 0ustar maartenmaarten// $Id: file_.cpp,v 1.29 2012/01/26 17:52:19 ekr Exp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 15.03.19 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_io_file // ~~~~~~~~~ // **** Classes : mmdb::io::File - file I/O Support. // ~~~~~~~~~ // // (C) E. Krissinel 2000-2019 // // ================================================================= // #include #include #include #ifdef _WIN32 # include #ifndef sleep # define sleep Sleep #endif #endif #if !defined _WIN32 || defined __MINGW32__ # ifndef __UNISTD_H # include # endif #endif #include "mmdb_io_file.h" // _WIN32_NEWLINE should be raised when compilinig on Windows in // order to enforce Windows' line endings when writing text in // files opened for *binary* output. Otherwise, writing text lines // in binary files will results in UNIX line endings. Line endings // in files, opened for output in text mode, will be always // platform-specific. #ifdef _WIN32_NEWLINE // for DOS/WINDOWS machines: #define NEWLINE "\r\n" #else // for UNIX machines: #define NEWLINE "\n" #endif namespace mmdb { namespace io { #ifdef _WIN32 const char _dir_sep_c = '\\'; cpstr _dir_sep = "\\"; #else const char _dir_sep_c = '/'; cpstr _dir_sep = "/"; #endif // =================== Auxilary Functions ========================= cpstr GetFPath ( pstr FilePath, SYSKEY syskey ) { pstr P; if (syskey==syskey_unix) P = LastOccurence(FilePath,'/'); else if (syskey==syskey_win) P = LastOccurence(FilePath,'\\'); else if (syskey==syskey_all) { P = LastOccurence(FilePath,'/'); if (!P) P = LastOccurence(FilePath,'\\'); } else P = NULL; if (P) { P = P + 1; *P = char(0); } else FilePath[0] = char(0); return FilePath; } cpstr GetFName ( cpstr FilePath, SYSKEY syskey ) { pstr P; if (syskey==syskey_unix) P = LastOccurence(FilePath,'/'); else if (syskey==syskey_win) P = LastOccurence(FilePath,'\\'); else if (syskey==syskey_all) { P = LastOccurence(FilePath,'/'); if (!P) P = LastOccurence(FilePath,'\\'); } else P = NULL; if (!P) return FilePath; else return P + 1; } cpstr GetFExt ( cpstr FilePath ) { pstr P; P = FirstOccurence ( GetFName(FilePath),'.'); if (!P) return &(FilePath[strlen(FilePath)]); else return P; } cpstr ChangeExt ( pstr FilePath, cpstr newExt, SYSKEY syskey ) { int i; i = strlen(FilePath)-1; if (syskey==syskey_unix) while ((i>0) && (FilePath[i]!='.') && (FilePath[i]!='/')) i--; else if (syskey==syskey_win) while ((i>0) && (FilePath[i]!='.') && (FilePath[i]!='\\')) i--; else if (syskey==syskey_all) while ((i>0) && (FilePath[i]!='.') && (FilePath[i]!='/') && (FilePath[i]!='\\')) i--; if (FilePath[i]=='.') { FilePath[i+1] = char(0); strcat ( FilePath,newExt ); } else { strcat ( FilePath,"." ); strcat ( FilePath,newExt ); } return FilePath; } cpstr ForceUnixSep ( pstr FilePath ) { pstr p = FilePath; while (*p) { if (*p=='\\') *p = '/'; p++; } return FilePath; } bool FileExists ( cpstr FileName, PFile f ) { PFile g; bool B; if (FileName) { if (!f) g = new File(); else g = f; g->assign ( FileName ); B = g->exists(); if (!f) delete g; return B; } else return false; } // ======================== File Class ======================== #define ARCH_NONE 0 #define ARCH_GZIP 1 #define ARCH_COMPRESS 2 #define ARCH_ENFORCE 3 File::File ( word BufSize ) { Buf_Size = BufSize; BufLen = 0; BufInc = 1; EofFile = false; hFile = NULL; FName = NULL; BufCnt = 0; IOBuf = NULL; IOSuccess = true; TextMode = false; UniBin = false; StdIO = false; gzipIO = ARCH_NONE; memIO = false; ownBuf = true; } File::~File() { shut (); FreeBuffer(); } void File::FreeBuffer () { if (IOBuf) { if (ownBuf) delete[] IOBuf; IOBuf = NULL; } if (FName) { delete[] FName; FName = NULL; } } void File::assign ( cpstr FileName, bool Text, bool UniB, GZ_MODE gzMode ) { pstr p; shut(); FreeBuffer(); ownBuf = true; CreateCopy ( FName,FileName ); StdIO = (!strcmp(FName,"stdin" )) || (!strcmp(FName,"stdout")) || (!strcmp(FName,"stderr")); if (StdIO) TextMode = true; else TextMode = Text; UniBin = UniB; gzipMode = gzMode; gzipIO = ARCH_NONE; if ((gzipMode==GZM_ENFORCE) || (gzipMode==GZM_ENFORCE_GZIP)) gzipIO = ARCH_GZIP; else if (gzipMode==GZM_ENFORCE_COMPRESS) gzipIO = ARCH_COMPRESS; else if (gzipMode==GZM_CHECK) { p = LastOccurence ( FName,'.' ); if (p) { if (!strcmp(p,".gz")) gzipIO = ARCH_GZIP; else if (!strcmp(p,".Z")) gzipIO = ARCH_COMPRESS; } } memIO = false; } void File::assign ( word poolSize, word sizeInc, pstr filePool ) { shut(); IOBuf = (pstr)filePool; BufLen = poolSize; FLength = poolSize; BufInc = sizeInc; BufCnt = 0; memIO = true; ownBuf = (IOBuf==NULL); gzipMode = GZM_NONE; gzipIO = ARCH_NONE; } void File::truncate ( long size ) { // call before reset/append #ifndef _WIN32 ::truncate ( FName,size ); #else (void)size; #endif } void File::takeFilePool ( pstr & filePool, word & fileSize ) { if (memIO) { filePool = IOBuf; fileSize = FLength; IOBuf = NULL; BufLen = 0; BufCnt = 0; FLength = 0; ownBuf = false; } else { filePool = NULL; fileSize = 0; } } static pstr gzip_path = pstr("gzip "); static pstr ungzip_path = pstr("gzip -dc "); static pstr compress_path = pstr("compress "); static pstr uncompress_path = pstr("uncompress -c "); void SetGZIPPath ( pstr gzipPath, pstr ungzipPath ) { if (!gzipPath) gzip_path = pstr("gzip "); else gzip_path = gzipPath; if (!ungzipPath) ungzip_path = pstr("gzip -d "); else ungzip_path = ungzipPath; } void SetCompressPath ( pstr compressPath, pstr uncompressPath ) { if (!compressPath) compress_path = pstr("compress "); else compress_path = compressPath; if (!uncompressPath) uncompress_path = pstr("uncompress -c "); else uncompress_path = uncompressPath; } bool File::reset ( bool ReadOnly, int retry ) { #ifndef _MSC_VER pstr p; int i; #endif if (memIO) { if (!IOBuf) return false; BufCnt = 0; IOSuccess = true; } else { if (!FName) return false; shut(); BufLen = 0; BufCnt = 0; if (!strcmp(FName,"stdin")) { hFile = stdin; StdIO = true; TextMode = true; FLength = 1; EofFile = false; IOSuccess = true; } else { StdIO = false; if (gzipIO==ARCH_GZIP) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,ungzip_path,FName ); for (i=0;(i<=retry) && (!hFile);i++) { if (i>0) sleep ( 1 ); hFile = popen ( p,"r" ); } if (p) delete[] p; #endif } else if (gzipIO==ARCH_COMPRESS) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,uncompress_path,FName ); for (i=0;(i<=retry) && (!hFile);i++) { if (i>0) sleep ( 1 ); hFile = popen ( p,"r" ); } if (p) delete[] p; #endif } else { #ifndef _MSC_VER for (i=0;(i<=retry) && (!hFile);i++) { if (i>0) sleep ( 1 ); if (TextMode) { if (ReadOnly) hFile = fopen ( FName,"rt" ); else hFile = fopen ( FName,"r+t" ); } else { if (ReadOnly) hFile = fopen ( FName,"rb" ); else hFile = fopen ( FName,"r+b" ); } } #endif } if (hFile) { if (gzipIO==ARCH_NONE) { fseek ( hFile,0L,SEEK_END ); FLength = ftell ( hFile ); fseek ( hFile,0L,SEEK_SET ); EofFile = (FLength<=0); } else { FLength = 1; EofFile = false; } IOSuccess = true; } else { EofFile = true; IOSuccess = false; } } } return IOSuccess; } bool File::rewrite() { #ifndef _MSC_VER pstr p; #endif if (memIO) { shut(); if (IOBuf) delete[] IOBuf; IOBuf = new char[BufLen]; BufCnt = 0; FLength = 0; IOSuccess = true; ownBuf = true; } else { if (!FName) return false; shut(); BufLen = 0; BufCnt = 0; if (gzipIO==ARCH_GZIP) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,gzip_path,pstr(" > "),FName ); hFile = popen ( p,"w" ); if (p) delete[] p; #else hFile = NULL; #endif StdIO = false; } else if (gzipIO==ARCH_COMPRESS) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,compress_path,pstr(" > "),FName ); hFile = popen ( p,"w" ); if (p) delete[] p; #else hFile = NULL; #endif StdIO = false; } else if (!TextMode) { hFile = fopen ( FName,"w+b" ); StdIO = false; } else if (!strcmp(FName,"stdout")) { hFile = stdout; StdIO = true; } else if (!strcmp(FName,"stderr")) { hFile = stderr; StdIO = true; } else { hFile = fopen ( FName,"w+t" ); StdIO = false; } FLength = 0; IOSuccess = (hFile!=NULL); } return IOSuccess; } bool File::append() { #ifndef _MSC_VER pstr p; #endif if (memIO) { if (!IOBuf) { IOBuf = new char[BufLen]; BufCnt = 0; ownBuf = true; } FLength = BufCnt; IOSuccess = true; } else { if (!FName) return false; shut(); BufLen = 0; BufCnt = 0; if (gzipIO==ARCH_GZIP) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,gzip_path,pstr(" >> "),FName ); hFile = popen ( p,"w" ); if (p) delete[] p; #else hFile = NULL; #endif StdIO = false; } else if (gzipIO==ARCH_COMPRESS) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,compress_path,pstr(" >> "),FName ); hFile = popen ( p,"w" ); if (p) delete[] p; #else hFile = NULL; #endif StdIO = false; } else if (!TextMode) { hFile = fopen ( FName,"ab" ); StdIO = false; } else if (!strcmp(FName,"stdout")) { hFile = stdout; StdIO = true; } else if (!strcmp(FName,"stderr")) { hFile = stderr; StdIO = true; } else { hFile = fopen ( FName,"at" ); StdIO = false; } FLength = 0; IOSuccess = hFile!=NULL; } return IOSuccess; } bool File::erase() { if (!FName) return false; shut(); if (!StdIO) { BufLen = 0; BufCnt = 0; if (FName) IOSuccess = (remove(FName)==0); FLength = 0; } else IOSuccess = true; return IOSuccess; } bool File::exists() { if (memIO) { IOSuccess = (IOBuf!=NULL); } else { if (!FName) return false; shut(); if (!StdIO) { hFile = fopen ( FName,"r" ); IOSuccess = (hFile!=NULL); BufLen = 0; BufCnt = 0; FLength = 0; if (hFile) fclose ( hFile ); } else IOSuccess = true; hFile = NULL; } return IOSuccess; } bool File::parse ( cpstr FileName ) { UNUSED_ARGUMENT(FileName); return true; } bool File::rename ( cpstr NewFileName ) { if (!FName) return false; shut(); if (!StdIO) IOSuccess = (::rename(FName,NewFileName)==0); if (IOSuccess) assign ( NewFileName,TextMode,UniBin,gzipMode ); return IOSuccess; } long File::Position() { // do not use on text files if (memIO) return BufCnt; if (hFile==NULL) return 0L; return ftell ( hFile ); } bool File::seek ( long Position ) { // do not use on text files if (memIO) { if (Position<=(long)BufLen) { BufCnt = Position; IOSuccess = true; } else IOSuccess = false; return IOSuccess; } else if (hFile==NULL) return false; else if (!StdIO) { IOSuccess = fseek(hFile,Position,SEEK_SET)==0; return IOSuccess; } else return true; } bool File::FileEnd() { if (memIO) return ((long)BufCnt>=FLength); if (TextMode) { if (EofFile || ((!hFile) && (!StdIO))) return true; if (feof(hFile)==0) return false; return true; } return EofFile && (BufLen==0); } void File::flush () { if (hFile!=NULL) { if (!StdIO) { #ifndef _MSC_VER if (gzipIO==ARCH_NONE) fflush ( hFile ); #else fflush ( hFile ); #endif } } } void File::shut () { if (memIO) FreeBuffer(); else if (hFile!=NULL) { if (!StdIO) { #ifndef _MSC_VER if (gzipIO!=ARCH_NONE) pclose ( hFile ); else fclose ( hFile ); #else fclose ( hFile ); #endif } hFile = NULL; } } bool File::isOpen() { if (memIO) return (IOBuf!=NULL); return (hFile!=NULL); } word File::ReadLine ( pstr Line, word MaxLen ) { word LCnt; int Done; bool HSuccess = IOSuccess; if (memIO) { LCnt = 0; while (((long)BufCnt0) { if ((Line[LCnt-1]!='\n') && (Line[LCnt-1]!='\r')) break; Line[LCnt-1] = char(0); LCnt--; } } else LCnt = 0; return LCnt; } else { if (IOBuf==NULL) { IOBuf = new char[Buf_Size]; BufLen = ReadFile ( IOBuf,Buf_Size ); IOSuccess = HSuccess; BufCnt = 0; ownBuf = true; } LCnt = 0; do { while ((BufCnt=BufLen) { HSuccess = IOSuccess; BufLen = ReadFile ( IOBuf,Buf_Size ); IOSuccess = HSuccess; BufCnt = 0; } if (IOBuf[BufCnt]=='\r') Done = 1; else if (IOBuf[BufCnt]=='\n') Done = 2; else Done = 0; if (Done) BufCnt++; if (BufCnt>=BufLen) { HSuccess = IOSuccess; BufLen = ReadFile ( IOBuf,Buf_Size ); IOSuccess = HSuccess; BufCnt = 0; } if (BufLen>0) { if (((Done==2) && (IOBuf[BufCnt]=='\r')) || ((Done==1) && (IOBuf[BufCnt]=='\n'))) BufCnt++; } } while ((!Done) && (LCnt0)); Line[LCnt] = char(0); return LCnt; } } } word File::ReadNonBlankLine ( pstr S, word MaxLen ) { word i,j; do { j = ReadLine ( S,MaxLen ); i = 0; while ((i=j) && (!FileEnd())); if (i>=j) { S[0] = char(0); j = 0; } return j; } bool File::WriteLine ( cpstr Line ) { if ((!memIO) && TextMode) { if (hFile==NULL) return false; fputs ( Line,hFile ); // return (fputs(NEWLINE,hFile)>=0); return (fputs("\n",hFile)>=0); } else { if (WriteFile(Line,strlen(Line))) return WriteFile ( (void *)NEWLINE,strlen(NEWLINE) ); else return false; } } bool File::Write ( cpstr Line ) { if ((!memIO) && TextMode) { if (hFile==NULL) return false; return (fputs(Line,hFile)>=0); } else return WriteFile(Line,strlen(Line)); } bool File::Write ( realtype V, int length ) { char N[50]; sprintf ( N,"%-.*g",length,V ); if ((!memIO) && TextMode) { if (hFile==NULL) return false; return (fputs(N,hFile)>=0); } else return WriteFile(N,strlen(N)); } bool File::Write ( int iV, int length ) { char N[50]; sprintf ( N,"%*i",length,iV ); if ((!memIO) && TextMode) { if (hFile==NULL) return false; return (fputs(N,hFile)>=0); } else return WriteFile(N,strlen(N)); } bool File::LF() { if ((!memIO) && TextMode) { if (hFile==NULL) return false; // return (fputs(NEWLINE,hFile)>=0); return (fputs("\n",hFile)>=0); } else return WriteFile ( (void *)NEWLINE,strlen(NEWLINE) ); } bool File::WriteDataLine ( realtype X, realtype Y, int length ) { Write ( pstr(" ") ); Write ( X,length ); Write ( pstr(" ") ); Write ( Y,length ); return LF(); } bool File::WriteParameter ( cpstr S, realtype X, int ParColumn, int length ) { int l=strlen(S); if ((!memIO) && TextMode) { fputs ( S,hFile ); while (lParColumn) { // X = atof ( &(S[ParColumn]) ); X = GetNumber ( &(S[ParColumn]) ); return true; } else { X = 0.0; return false; } } bool File::ReadParameters ( pstr S, int & n_X, rvector X, int MaxLen, int ParColumn ) { pstr S1,S2; ReadLine ( S,MaxLen ); if ((int)strlen(S)>ParColumn) { n_X = 0; S2 = &(S[ParColumn]); S1 = S2; while (*S1!=char(0)) { if (*S1==',') *S1 = ' '; S1++; } while (*S2!=char(0)) { S1 = S2; X[n_X] = strtod ( S1,&S2 ); n_X++; while ((*S2!=char(0)) && (*S2==' ')) S2++; } return true; } else { n_X = 0; X[0] = 0.0; return false; } } bool File::ReadParameter ( pstr S, int & X, int ParColumn ) { realtype V; if (ReadParameter(S,V,ParColumn)) { X = mround(V); return true; } else { X = 0; return false; } } bool File::CreateWrite ( cpstr Line ) { wordUniBin wUB; word i; if (UniBin) { if (Line) { i = strlen(Line)+1; word2UniBin ( i,wUB ); if (WriteFile(wUB,sizeof(wordUniBin))) return WriteFile ( Line,i ); else return false; } else { i = 0; word2UniBin ( i,wUB ); return WriteFile ( wUB,sizeof(wordUniBin) ); } } else { if (Line) { i = strlen(Line)+1; if (WriteFile(&i,sizeof(i))) return WriteFile ( Line,i ); else return false; } else { i = 0; return WriteFile ( &i,sizeof(i) ); } } } #define _max_dyn_string_len 1073741824 word File::CreateRead ( pstr & Line ) { wordUniBin wUB; word i; //unsigned short int i; if (Line) { delete[] Line; Line = NULL; } if (UniBin) { ReadFile ( wUB,sizeof(wordUniBin) ); UniBin2word ( wUB,i ); } else ReadFile ( &i,sizeof(i) ); if ((i>0) && (i<_max_dyn_string_len)) { Line = new char[i]; ReadFile ( Line,i ); } return i; } bool File::WriteTerLine ( cpstr Line, bool longLine ) { wordUniBin wUB; word ll; byte sl; bool B; if (Line) ll = strlen(Line); else ll = 0; if (!longLine) { sl = byte(ll); B = WriteFile ( &sl,sizeof(sl) ); } else if (UniBin) { word2UniBin ( ll,wUB ); B = WriteFile ( wUB,sizeof(wordUniBin) ); } else B = WriteFile ( &ll,sizeof(ll) ); if (B && (ll>0)) B = WriteFile ( Line,ll ); return B; } word File::ReadTerLine ( pstr Line, bool longLine ) { wordUniBin wUB; word ll; byte sl; if (!longLine) { ReadFile ( &sl,sizeof(sl) ); ll = sl; } else if (UniBin) { ReadFile ( wUB,sizeof(wordUniBin) ); UniBin2word ( wUB,ll ); } else ReadFile ( &ll,sizeof(ll) ); if (ll>0) ReadFile ( Line,ll ); Line[ll] = char(0); return ll+1; } word File::ReadFile ( void * Buffer, word Count ) { word Cnt; if (memIO) { Cnt = WMin(Count,FLength-BufCnt); if (Cnt>0) { memcpy ( Buffer,&(IOBuf[BufCnt]),Cnt ); BufCnt += Cnt; } IOSuccess = (Cnt==Count); EofFile = ((Cnt=FLength)); return Cnt; } else if (hFile) { Cnt = (word)fread ( Buffer,1,Count,hFile ); EofFile = (CntBufLen) { Cnt += BufInc; IOB = new char[Cnt]; if (IOBuf) { memcpy ( IOB,IOBuf,BufCnt ); delete[] IOBuf; } IOBuf = IOB; BufLen = Cnt; ownBuf = true; } memcpy ( &(IOBuf[BufCnt]),Buffer,Count ); BufCnt += Count; FLength = BufCnt; IOSuccess = true; } else { if (hFile==NULL) return false; Cnt = (word)fwrite ( Buffer,1,Count,hFile ); Pos = Position(); if (Pos>FLength) FLength = Pos; IOSuccess = Cnt==Count; } return IOSuccess; } bool File::WriteReal ( realtype * V ) { realUniBin rUB; if (UniBin) { real2UniBin ( *V,rUB ); return WriteFile ( rUB,sizeof(realUniBin) ); } else return WriteFile ( V,sizeof(realtype) ); } bool File::WriteFloat ( realtype * V ) { floatUniBin fUB; float fV; if (UniBin) { float2UniBin ( *V,fUB ); return WriteFile ( fUB,sizeof(floatUniBin) ); } else { fV = (float)*V; return WriteFile ( &fV,sizeof(float) ); } } bool File::WriteInt ( int * I ) { intUniBin iUB; if (UniBin) { int2UniBin ( *I,iUB ); return WriteFile ( iUB,sizeof(intUniBin) ); } else return WriteFile ( I,sizeof(int) ); } bool File::WriteShort ( short * S ) { shortUniBin sUB; if (UniBin) { short2UniBin ( *S,sUB ); return WriteFile ( sUB,sizeof(shortUniBin) ); } else return WriteFile ( S,sizeof(short) ); } bool File::WriteLong ( long * L ) { longUniBin lUB; if (UniBin) { long2UniBin ( *L,lUB ); return WriteFile ( lUB,sizeof(longUniBin) ); } else return WriteFile ( L,sizeof(long) ); } bool File::WriteBool ( bool * B ) { intUniBin iUB; int k; if (UniBin) { if (*B) k = 1; else k = 0; int2UniBin ( k,iUB ); return WriteFile ( iUB,sizeof(intUniBin) ); } else return WriteFile ( B,sizeof(bool) ); } bool File::WriteByte ( byte * B ) { return WriteFile ( B,sizeof(byte) ); } bool File::WriteWord ( word * W ) { wordUniBin wUB; if (UniBin) { word2UniBin ( *W,wUB ); return WriteFile ( wUB,sizeof(wordUniBin) ); } else return WriteFile ( W,sizeof(word) ); } bool File::ReadReal ( realtype * V ) { realUniBin rUB; if (UniBin) { if (ReadFile(rUB,sizeof(realUniBin))==sizeof(realUniBin)) { UniBin2real ( rUB,*V ); return true; } else return false; } else return ( ReadFile(V,sizeof(realtype))==sizeof(realtype) ); } bool File::ReadFloat ( realtype * V ) { floatUniBin fUB; float fV; if (UniBin) { if (ReadFile(fUB,sizeof(floatUniBin))==sizeof(floatUniBin)) { UniBin2float ( fUB,*V ); return true; } } else if (ReadFile(&fV,sizeof(float))==sizeof(float)) { *V = fV; return true; } return false; } bool File::ReadInt ( int * I ) { intUniBin iUB; if (UniBin) { if (ReadFile(iUB,sizeof(intUniBin))==sizeof(intUniBin)) { UniBin2int ( iUB,*I ); return true; } else return false; } else return ( ReadFile(I,sizeof(int))==sizeof(int) ); } bool File::ReadShort ( short * S ) { shortUniBin sUB; if (UniBin) { if (ReadFile(sUB,sizeof(shortUniBin))==sizeof(shortUniBin)) { UniBin2short ( sUB,*S ); return true; } else return false; } else return ( ReadFile(S,sizeof(short))==sizeof(short) ); } bool File::ReadLong ( long * L ) { longUniBin lUB; if (UniBin) { if (ReadFile(lUB,sizeof(longUniBin))==sizeof(longUniBin)) { UniBin2long ( lUB,*L ); return true; } else return false; } else return ( ReadFile(L,sizeof(long))==sizeof(long) ); } bool File::ReadBool ( bool * B ) { intUniBin iUB; int k; if (UniBin) { if (ReadFile(iUB,sizeof(intUniBin))==sizeof(intUniBin)) { UniBin2int ( iUB,k ); *B = (k!=0); return true; } else return false; } else return ( ReadFile(B,sizeof(bool))==sizeof(bool) ); } bool File::ReadByte ( byte * B ) { return ( ReadFile(B,sizeof(byte))==sizeof(byte) ); } bool File::ReadWord ( word * W ) { wordUniBin wUB; if (UniBin) { if (ReadFile(wUB,sizeof(wordUniBin))==sizeof(wordUniBin)) { UniBin2word ( wUB,*W ); return true; } else return false; } else return ( ReadFile(W,sizeof(word))==sizeof(word) ); } bool File::AddReal ( realtype * V ) { realtype x; if (ReadReal(&x)) { *V += x; return true; } return false; } bool File::AddFloat ( realtype * V ) { realtype x; if (ReadFloat(&x)) { *V += x; return true; } return false; } bool File::AddInt ( int * I ) { int k; if (ReadInt(&k)) { *I += k; return true; } return false; } bool File::AddShort ( short * S ) { short k; if (ReadShort(&k)) { *S += k; return true; } return false; } bool File::AddLong ( long * L ) { long k; if (ReadLong(&k)) { *L += k; return true; } return false; } bool File::AddByte ( byte * B ) { byte k; if (ReadByte(&k)) { *B += k; return true; } return false; } bool File::AddWord ( word * W ) { word k; if (ReadWord(&k)) { *W += k; return true; } return false; } bool File::WriteVector ( rvector V, int len, int Shift ) { intUniBin iUB; realUniBin rUB; int i; int l = len; if (V==NULL) l = 0; if (UniBin) { int2UniBin ( l,iUB ); WriteFile ( iUB,sizeof(intUniBin) ); for (i=0;i0) WriteFile ( &(V[Shift]),sizeof(realtype)*l ); } return IOSuccess; } bool File::WriteVector ( ivector iV, int len, int Shift ) { intUniBin iUB; int i; int l = len; if (iV==NULL) l = 0; if (UniBin) { int2UniBin ( l,iUB ); WriteFile ( iUB,sizeof(intUniBin) ); for (i=0;i0) WriteFile ( &(iV[Shift]),sizeof(int)*l ); } return IOSuccess; } bool File::WriteVector ( lvector lV, int len, int Shift ) { intUniBin iUB; longUniBin lUB; int i; int l = len; if (lV==NULL) l = 0; if (UniBin) { int2UniBin ( l,iUB ); WriteFile ( iUB,sizeof(intUniBin) ); for (i=0;i0) WriteFile ( &(lV[Shift]),sizeof(long)*l ); } return IOSuccess; } bool File::WriteVector ( bvector B, int len, int Shift ) { intUniBin iUB; int l = len; if (B==NULL) l = 0; if (UniBin) { int2UniBin ( l,iUB ); WriteFile ( iUB,sizeof(intUniBin) ); } else WriteFile ( &l,sizeof(l) ); if (l>0) WriteFile ( &(B[Shift]),sizeof(byte)*l ); return IOSuccess; } bool File::ReadVector ( rvector V, int maxlen, int Shift ) { intUniBin iUB; realUniBin rUB; int i,l,ll; realtype B; if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,l ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (V) for (i=0;i<=ll;i++) { ReadFile ( rUB,sizeof(realUniBin) ); UniBin2real ( rUB,V[Shift+i] ); } for (i=ll+1;i<=l;i++) ReadFile ( rUB,sizeof(realUniBin) ); } } else { ReadFile ( &l,sizeof(l) ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (V) ReadFile ( &(V[Shift]),sizeof(realtype)*ll ); for (i=ll+1;i<=l;i++) ReadFile ( &B,sizeof(B) ); } } return IOSuccess; } bool File::ReadVector ( ivector iV, int maxlen, int Shift ) { intUniBin iUB; int i,l,ll,iB; if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,l ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (iV) for (i=0;i<=ll;i++) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,iV[Shift+i] ); } for (i=ll+1;i<=l;i++) ReadFile ( iUB,sizeof(intUniBin) ); } } else { ReadFile ( &l,sizeof(l) ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (iV) ReadFile ( &(iV[Shift]),sizeof(int)*ll ); for (i=ll+1;i<=l;i++) ReadFile ( &iB,sizeof(iB) ); } } return IOSuccess; } bool File::ReadVector ( lvector lV, int maxlen, int Shift ) { intUniBin iUB; longUniBin lUB; int i,l,ll; long lB; if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,l ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (lV) for (i=0;i<=ll;i++) { ReadFile ( lUB,sizeof(longUniBin) ); UniBin2long ( lUB,lV[Shift+i] ); } for (i=ll+1;i<=l;i++) ReadFile ( lUB,sizeof(longUniBin) ); } } else { ReadFile ( &l,sizeof(l) ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (lV) ReadFile ( &(lV[Shift]),sizeof(long)*ll ); for (i=ll+1;i<=l;i++) ReadFile ( &lB,sizeof(lB) ); } } return IOSuccess; } bool File::ReadVector ( bvector B, int maxlen, int Shift ) { intUniBin iUB; int i,l,ll; byte t; if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,l ); } else ReadFile ( &l,sizeof(l) ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (B) ReadFile ( &(B[Shift]),sizeof(byte)*ll ); for (i=ll+1;i<=l;i++) ReadFile ( &t,sizeof(t) ); } return IOSuccess; } bool File::CreateReadVector ( rvector & V, int & len, int Shift ) { intUniBin iUB; realUniBin rUB; int i; realtype B; FreeVectorMemory ( V,Shift ); if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,len ); if (IOSuccess && (len>0)) { GetVectorMemory ( V,len,Shift ); if (V) for (i=0;i0)) { GetVectorMemory ( V,len,Shift ); if (V) ReadFile ( &(V[Shift]),sizeof(realtype)*len ); else for (i=0;i0)) { GetVectorMemory ( iV,len,Shift ); if (iV) for (i=0;i0)) { GetVectorMemory ( iV,len,Shift ); if (iV) ReadFile ( &(iV[Shift]),sizeof(int)*len ); else for (i=0;i0)) { GetVectorMemory ( lV,len,Shift ); if (lV) for (i=0;i0)) { GetVectorMemory ( lV,len,Shift ); if (lV) ReadFile ( &(lV[Shift]),sizeof(long)*len ); else for (i=0;i0)) { GetVectorMemory ( B,len,Shift ); if (B) ReadFile ( &(B[Shift]),sizeof(byte)*len ); else for (i=0;i0)) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,M ); if (IOSuccess && (M>0)) { GetMatrixMemory ( A,N,M,ShiftN,ShiftM ); for (i=0;i0) { ReadFile ( &M,sizeof(M) ); if (M>0) { GetMatrixMemory ( A,N,M,ShiftN,ShiftM ); for (i=0;i=j) DataLen--; if (DataLen>0) { Ok = GetVectorMemory(X,DataLen,Shift); if (Ok && (yCol>=0)) Ok = Ok && GetVectorMemory(Y,DataLen,Shift); if (Ok && (zCol>=0)) Ok = Ok && GetVectorMemory(Z,DataLen,Shift); if (Ok) { reset(); _ReadColumns ( DataLen,S,sizeof(S),X,Y,Z,xCol,yCol, zCol,Shift ); } else ErrCode = FileError_NoMemory; } else ErrCode = FileError_NoDataFound; } else ErrCode = FileError_NoDataFound; return DataLen; } int File::CreateReadColumns ( rvector & X, rvector & Y, int xCol, int yCol, int Shift ) { return CreateReadColumns ( X,Y,X,xCol,yCol,-1,Shift ); } void File::_ReadColumns ( int & DLen, pstr S, int SLen, rvector X, rvector Y, rvector Z, int xCol, int yCol, int zCol, int Shift ) { int i,is,j,k,m,n,cmax; char SV[256]; realtype Res; ErrCode = 0; i = 0; cmax = IMax(zCol,IMax(xCol,yCol)); while ((i=k)) { DLen = i; return; } m++; } while ((m!=xCol) && (m!=yCol) && (m!=zCol)); if (SV[0]==char(0)) { if (n>0) ErrCode = FileError_NoColumn; else ErrCode = FileError_ShortData; } else { Res = GetNumber ( SV ); if (ErrCode==0) { is = i+Shift; if (m==xCol) X[is] = Res; else if (m==yCol) Y[is] = Res; else Z[is] = Res; n++; } } } if ((ErrCode==0) && (n<2)) ErrCode = FileError_NoColumn; i++; } if ((ErrCode==FileError_ShortData) && (i>1)) { ErrCode = 0; DLen = i-1; } if (ErrCode!=0) ErrCode = FileError_BadData; } void RemoveDelimiters ( pstr S, int SLen ) { int j; for (j=0;j // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : mmdb::Mask ( atom selection mask ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include #include "mmdb_mask.h" namespace mmdb { // ==================== Mask ======================== Mask::Mask() : io::Stream() { InitMask(); } Mask::Mask ( io::RPStream Object ) : io::Stream(Object) { InitMask(); } Mask::~Mask() { ClearMask(); } void Mask::InitMask() { mlen = 0; m = NULL; } void Mask::SetMaskBit ( int BitNo ) { int n,i; n = BitNo/(8*sizeof(word)); Expand ( n+1 ); i = BitNo - n*(8*sizeof(word)); m[n] |= ((word)1 << i); } void Mask::Expand ( int n ) { wvector m1; int i; if (mlen0)) { nlen = 0; w = 0; while (w==0) { for (i=0;imlen) w |= Mask[i]->m[nlen]; } nlen++; w = ~w; } Expand ( nlen ); i = nlen-1; m[i] = 1; while (!(m[i] & w)) m[i] <<= 1; } else { Expand ( 1 ); m[0] = 1; } } void Mask::CopyMask ( PMask Mask ) { int i; if (mlen!=Mask->mlen) ClearMask(); if (Mask) { mlen = Mask->mlen; if (mlen>0) { m = new word[mlen]; for (i=0;im[i]; } } } void Mask::SetMask ( PMask Mask ) { int i; if (Mask) { Expand ( Mask->mlen ); for (i=0;imlen;i++) m[i] |= Mask->m[i]; } } void Mask::RemoveMask ( PMask Mask ) { int i,l; if (Mask) { l = IMin(mlen,Mask->mlen); for (i=0;im[i]; } } void Mask::SelMask ( PMask Mask ) { int i,l; if (Mask) { l = IMin(mlen,Mask->mlen); for (i=0;im[i]; for (i=l;imlen ); for (i=0;imlen;i++) m[i] ^= Mask->m[i]; } } void Mask::ClearMask() { if (m) delete[] m; m = NULL; mlen = 0; } void Mask::NegMask() { int i; for (i=0;imlen); while ((im[i]))) i++; return (i0) { m = new word[mlen]; for (i=0;i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : mmdb::ContainerClass ( containered class template ) // ~~~~~~~~~ mmdb::ContString ( containered string ) // mmdb::ClassContainer ( container of classes ) // mmdb::AtomPath ( atom path ID ) // mmdb::QuickSort ( quick sort of integers ) // // **** Functions : Date9to11 ( DD-MMM-YY -> DD-MMM-YYYY ) // ~~~~~~~~~~~ Date11to9 ( DD-MMM-YYYY -> DD-MMM-YY ) // Date9toCIF ( DD-MMM-YY -> YYYY-MM-DD ) // Date11toCIF( DD-MMM-YYYY -> YYYY-MM-DD ) // DateCIFto9 ( YYYY-MM-DD -> DD-MMM-YY ) // DateCIFto11( YYYY-MM-DD -> DD-MMM-YYYY ) // GetInteger ( reads integer from a string ) // GetReal ( reads real from a string ) // GetIntIns ( reads integer and insert code ) // PutInteger ( writes integer into a string ) // PutRealF ( writes real in F-form into a string ) // PutIntIns ( writes integer and insert code ) // CIFGetInteger ( reads and deletes int from CIF ) // CIFGetReal ( reads and deletes real from CIF ) // CIFGetString ( reads and deletes string from CIF) // CIFGetInteger1 (reads and del-s int from CIF loop) // CIFGetReal1 (reads and del-s int from CIF loop) // Mat4Inverse ( inversion of 4x4 matrices ) // GetErrorDescription (ascii line to an Error_XXXXX) // ParseAtomID ( parses atom ID line ) // ParseResID ( parses residue ID line ) // ParseAtomPath ( parses full atom path ) // // (C) E. Krissinel 2000-2015 // // ================================================================= // #ifndef __MMDB_Utils__ #define __MMDB_Utils__ #include "mmdb_io_stream.h" #include "mmdb_mmcif_.h" #include "mmdb_defs.h" namespace mmdb { // ================== Date functions =================== // converts DD-MMM-YY to DD-MMM-YYYY; appends terminating zero extern void Date9to11 ( cpstr Date9, pstr Date11 ); // converts DD-MMM-YYYY to DD-MMM-YY; does not append terminating zero extern void Date11to9 ( cpstr Date11, pstr Date9 ); // converts DD-MMM-YY to YYYY-MM-DD; appends terminating zero extern void Date9toCIF ( cpstr Date9, pstr DateCIF ); // converts DD-MMM-YYYY to YYYY-MM-DD; appends terminating zero extern void Date11toCIF ( cpstr Date11, pstr DateCIF ); // converts YYYY-MM-DD to DD-MMM-YY; appends terminating zero extern void DateCIFto9 ( cpstr DateCIF, pstr Date9 ); // converts YYYY-MM-DD to DD-MMM-YYYY; appends terminating zero extern void DateCIFto11 ( cpstr DateCIF, pstr Date11 ); // ================= Format functions ================== // Returns true if S contains an integer number in its // first M characters. This number is returned in N. // The return is false if no integer number may be // recognized. In this case, N is assigned MinInt4 value. extern bool GetInteger ( int & N, cpstr S, int M ); // Returns true if S contains a real number in its // first M characters. This number is returned in R. // The return is false if no real number may be // recognized. In this case, R is assigned -MaxReal value. extern bool GetReal ( realtype & R, cpstr S, int M ); // Returns true if S contains an integer number in its // first M characters. This number is returned in N. In addition // to that, GetIntIns() retrieves the insertion code which may // follow the integer and returns it in "ins" (1 character + // terminating 0). // The return is false if no integer number may be // recognized. In this case, N is assigned MinInt4 value, // "ins" just returns (M+1)th symbol of S (+terminating 0). extern bool GetIntIns ( int & N, pstr ins, cpstr S, int M ); // Integer N is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. // If N is set to MinInt4, then first M characters of // string S are set to space. extern void PutInteger ( pstr S, int N, int M ); // Real R is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. The conversion is done // according to fixed format FM.L // If R is set to -MaxReal, then first M characters of // string S are set to the space character. extern void PutRealF ( pstr S, realtype R, int M, int L ); // Integer N is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. The insert code ins is put // immediately after the integer. // If N is set to MinInt4, then first M+1 characters of // string S are set to space, and no insert code are // appended. extern void PutIntIns ( pstr S, int N, int M, cpstr ins ); // CIFInteger(..), CIFReal(..) and CIFGetString(..) automate // extraction and analysis of data from CIF file. If the data // is erroneous or absent, they store an error message in // CIFErrorLocation string (below) and return non-zero. extern ERROR_CODE CIFGetInteger ( int & I, mmcif::PStruct Struct, cpstr Tag, bool Remove=true ); extern ERROR_CODE CIFGetReal ( realtype & R, mmcif::PStruct Struct, cpstr Tag, bool Remove=true ); extern ERROR_CODE CIFGetString ( pstr S, mmcif::PStruct Struct, cpstr Tag, int SLen, cpstr DefS, bool Remove=true ); extern ERROR_CODE CIFGetInteger ( int & I, mmcif::PLoop Loop, cpstr Tag, int & Signal ); extern ERROR_CODE CIFGetIntegerD ( int & I, mmcif::PLoop Loop, cpstr Tag, int defValue=MinInt4 ); extern ERROR_CODE CIFGetInteger1 ( int & I, mmcif::PLoop Loop, cpstr Tag, int nrow ); extern ERROR_CODE CIFGetReal ( realtype & R, mmcif::PLoop Loop, cpstr Tag, int & Signal ); extern ERROR_CODE CIFGetReal1 ( realtype & R, mmcif::PLoop Loop, cpstr Tag, int nrow ); extern ERROR_CODE CIFGetString ( pstr S, mmcif::PLoop Loop, cpstr Tag, int row, int SLen, cpstr DefS ); // Calculates AI=A^{-1} extern void Mat4Inverse ( const mat44 & A, mat44 & AI ); // Calculates A=B*C extern void Mat4Mult ( mat44 & A, const mat44 & B, const mat44 & C ); // Calculates A=B^{-1}*C extern void Mat4Div1 ( mat44 & A, const mat44 & B, const mat44 & C ); // Calculates A=B*C^{-1} extern void Mat4Div2 ( mat44 & A, const mat44 & B, const mat44 & C ); // Calculates determinant of the rotation part extern realtype Mat4RotDet ( mat44 & T ); // Sets up a unit matrix extern void Mat4Init ( mat44 & A ); extern void Mat3Init ( mat33 & A ); // Calculates AI=A^{-1}, returns determinant extern realtype Mat3Inverse ( const mat33 & A, mat33 & AI ); extern bool isMat4Unit ( const mat44 & A, realtype eps, bool rotOnly ); // Copies A into AC extern void Mat4Copy ( const mat44 & A, mat44 & ACopy ); extern void Mat3Copy ( const mat33 & A, mat33 & ACopy ); extern bool isMat4Eq ( const mat44 & A, const mat44 & B, realtype eps, bool rotOnly ); extern void TransformXYZ ( const mat44 & T, realtype & X, realtype & Y, realtype & Z ); extern realtype TransformX ( const mat44 & T, realtype X, realtype Y, realtype Z ); extern realtype TransformY ( const mat44 & T, realtype X, realtype Y, realtype Z ); extern realtype TransformZ ( const mat44 & T, realtype X, realtype Y, realtype Z ); extern char CIFErrorLocation[200]; // Returns ASCII string explaining the nature of // Error_xxxx error code. extern cpstr GetErrorDescription ( ERROR_CODE ErrorCode ); // ================ ContainerClass ==================== DefineClass(ContainerClass); DefineStreamFunctions(ContainerClass); class ContainerClass : public io::Stream { friend class ClassContainer; public : ContainerClass (); ContainerClass ( io::RPStream Object ); ~ContainerClass() {} // ConvertPDBASCII(..) will return one of the Error_XXXXX // constants, see virtual ERROR_CODE ConvertPDBASCII ( cpstr ) { return Error_NoError; } virtual void PDBASCIIDump ( pstr, int ) {} virtual bool PDBASCIIDump1 ( io::RFile ) { return false; } virtual void MakeCIF ( mmcif::PData, int ) {} // Append(..) should return true if CC is appended to this class. // If this is not the case, CC is merely put on the top of // container. // Note: Append(..) detects the necessity to append CC and // performs all the necessary actions for that. The rest of CC // will be disposed by Class Container. // Note: Class Container checks every new class, which is // being added to it (see CClassContainer::AddData(..)), only // against the top of container. virtual bool Append ( PContainerClass CC ); // GetCIF(..) extracts any necessary information from CIF and // returns in Signal: // Error_noError : the information was successfully extracted, // this instance of container class should be // stored, and unchanged value of Signal should // be passed to the next (newly created) instance // of this container class. // Error_EmptyCIF : there is no information for this type of // containers to extract. This instance of // container class should be deleted and input // for this type of container class terminated. // Other : the corresponding error. This instance of // container class should be deleted and the // whole input stopped. virtual ERROR_CODE GetCIF ( mmcif::PData, int & n ) { n = -1; return Error_EmptyCIF; } virtual CLASS_ID GetClassID () { return ClassID_Template; } virtual void Copy ( PContainerClass ) {} void write ( io::RFile ) {} void read ( io::RFile ) {} protected : int ContinuationNo; }; // ======================== ContString ========================= DefineClass(ContString); DefineStreamFunctions(ContString); class ContString : public ContainerClass { public : pstr Line; // a string ContString (); ContString ( cpstr S ); ContString ( io::RPStream Object ); ~ContString(); ERROR_CODE ConvertPDBASCII ( cpstr S ); void PDBASCIIDump ( pstr S, int N ); bool PDBASCIIDump1 ( io::RFile f ); void MakeCIF ( mmcif::PData CIF, int N ); // void GetCIF1 ( mmcif::PData CIF, ERROR_CODE & Signal, // int & pos ); bool Append ( PContainerClass ContString ); CLASS_ID GetClassID () { return ClassID_String; } void Copy ( PContainerClass CString ); void write ( io::RFile f ); void read ( io::RFile f ); protected : pstr CIFCategory,CIFTag; void InitString(); }; // ============== ClassContainer ==================== DefineClass(ClassContainer); DefineStreamFunctions(ClassContainer); class ClassContainer : public io::Stream { public : ClassContainer (); ClassContainer ( io::RPStream Object ); ~ClassContainer (); void FreeContainer (); void AddData ( PContainerClass Data ); virtual void PDBASCIIDump ( io::RFile f ); virtual void MakeCIF ( mmcif::PData CIF ); // GetCIF(..) will return one of the Error_XXXXX constants, // see virtual ERROR_CODE GetCIF ( mmcif::PData CIF, int ClassID ); virtual PContainerClass MakeContainerClass ( int ClassID ); // Copy will empty the class if parameter is set to NULL virtual void Copy ( PClassContainer CContainer ); inline int Length() { return length; } PContainerClass GetContainerClass ( int ContClassNo ); void write ( io::RFile f ); void read ( io::RFile f ); protected : int length; PPContainerClass Container; void Init(); }; // ====================== ID parsers ========================== DefineClass(AtomPath); DefineStreamFunctions(AtomPath); enum APATH_FLAG { APATH_ModelNo = 0x00000001, APATH_ChainID = 0x00000002, APATH_SeqNum = 0x00000004, APATH_InsCode = 0x00000008, APATH_ResName = 0x00000010, APATH_AtomName = 0x00000020, APATH_Element = 0x00000040, APATH_AltLoc = 0x00000080, APATH_Incomplete = 0x00000100, APATH_WC_ModelNo = 0x00001000, APATH_WC_ChainID = 0x00002000, APATH_WC_SeqNum = 0x00004000, APATH_WC_InsCode = 0x00008000, APATH_WC_ResName = 0x00010000, APATH_WC_AtomName = 0x00020000, APATH_WC_Element = 0x00040000, APATH_WC_AltLoc = 0x00080000 }; class AtomPath : public io::Stream { public : int modelNo; ChainID chainID; int seqNum; InsCode insCode; ResName resName; AtomName atomName; Element element; AltLoc altLoc; int isSet; AtomPath (); AtomPath ( cpstr ID ); AtomPath ( io::RPStream Object ); ~AtomPath (); // SetPath(..) parses the Atom Path ID string, which // may be incomplete. Below {..} means blocks that // may be omitted; any elements within such blocks // may be omitted as well. // // 1. If ID starts with '/' then the ID must be of // the following form: // /mdl{/chn{/seq(res).i{/atm[elm]:a}}} // // 2. If ID starts with a letter: // chn{/seq(res).i{/atm[elm]:a}} // // 3. If ID starts with a number or '(': // seq(res).i{/atm[elm]:a} // // 4. If ID contains colon ':' or '[' then // it may be just // atm[elm]:a // // The following are valid samples of IDs: // // /1 model number 1 // /1/A/23(GLU).A/CA[C]:A model number 1, chain A, // residue 23 GLU insertion code A, C-alpha // atom in alternative location A // A/23 residue 23 of chain A // CA[C]: atom C-alpha // [C] a carbon // *[C]:* same as above // :A an atom with insertion code A // 5 residue number 5 // (GLU) residue GLU // // All spaces are ignored. SetPath(..) sets bit of isSet // for each element present. Any element may be a wildcard // '*'. Wildcard for model will set modelNo=0, for sequence // number will set seqNum=MinInt4. // // Returns: // 0 <-> Ok // -1 <-> wrong numerical format for model // -2 <-> wrong numerical format for sequence number int SetPath ( cpstr ID ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitAtomPath(); }; // -------------------------------------------------------------- DefineClass(QuickSort); class QuickSort : public io::Stream { public : QuickSort (); QuickSort ( io::RPStream Object ); ~QuickSort() {} virtual int Compare ( int i, int j ); virtual void Swap ( int i, int j ); void Sort ( void * sortdata, int data_len ); protected : int selSortLimit,dlen; void * data; void SelectionSort ( int left, int right ); int Partition ( int left, int right ); void Quicksort ( int left, int right ); }; // -------------------------------------------------------------- extern void takeWord ( pstr & p, pstr wrd, cpstr ter, int l ); // ParseAtomID(..) reads the atom ID of the following form: // {name} {[element]} {:altcode} // (here {} means that the item may be omitted; any field may have // value of wildcard '*'), and returns the atom name in aname, // element name - in elname, and alternate location code - in aloc. // Except for the alternate location code, missing items are // replaced by wildcards. Missing alternate location code is // returned as empty string "". // Leading spaces are allowed; any other space will terminate // the parsing. // The followings are perfectly valid atom IDs: // CA[C]:A (carbon C_alpha in location A) // CA[*]:A (either C_alpha or Ca in location A) // CA:A (same as above) // CA (either C_alpha or Ca with no location indicator) // CA[] (same as above) // CA[C]: (C_alpha with no location indicator) // [C] (any carbon with no location indicator) // [C]:* (any carbon with any location indicator) // *[C]:* (same as above) // :A (any atom in location A) // *[*]:A (same as above) // *[*]:* (any atom) // * (any atom with no alternate location indicator) extern void ParseAtomID ( cpstr ID, AtomName aname, Element elname, AltLoc aloc ); // ParseResID(..) reads the residue ID of the following form: // {seqnum} {(name)} {.inscode} // (here {} means that the item may be omitted; any field may have // value of wildcard '*'), and returns the sequence number in sn, // insertion code - in inscode, and residue name - in resname. // If a wildcard was specified for the sequence number, then // ParseResID(..) returns 1. Missing residue name is replaced by // the wildcard '*', and misisng insertion code is returned as empty // string "". // Leading spaces are allowed; any other space will terminate // the parsing. // Return 0 means Ok, 1 - wildcard for the sequence number, // 2 - an error in numerical format of the sequence number // (other items are parsed). // The followings are perfectly valid residue IDs: // 27(ALA).A (residue 27A ALA) // 27().A (residue 27A) // 27(*).A (same as above) // 27.A (same as above) // 27 (residue 27) // 27(). (same as above) // (ALA) (any ALA without insertion code) // (ALA). (same as above) // (ALA).* (any ALA) // *(ALA).* (any ALA) // .A (any residue with insertion code A) // *(*).A (same as above) // *(*).* (any residue) // * (any residue with no insertion code) extern int ParseResID ( cpstr ID, int & sn, InsCode inscode, ResName resname ); // ParseAtomPath(..) parses an atom path string of the following // structure: // /mdl/chn/seq(res).i/atm[elm]:a // where all items may be represented by a wildcard '*' and // mdl - model number (mandatory); at least model #1 is always // present; returned in mdl; on a wildcard mdl is set to 0 // chn - chain identifier ( mandatory); returned in chn; on a // wildcard chn is set to '*' // seq - residue sequence number (mandatory); returned in sn; // on a wild card ParseAtomPath(..) returns 1 // (res) - residue name in round brackets (may be omitted); // returnded in res; on a wildcard res is set to '*' // .i - insert code after a dot; if '.i' or 'i' is missing // then a residue without an insertion code is looked for; // returned in ic; on a wildcard (any insertion code would // do) ic is set to '*' // atm - atom name (mandatory); returned in atm; on a wildcard // atm is set to '*' // [elm] - chemical element code in square brackets; it may // be omitted but could be helpful for e.g. // distinguishing C_alpha and CA; returned in elm; // in a wildcard elm is set to '*' // :a - alternate location indicator after colon; if // ':a' or 'a' is missing then an atom without // alternate location indicator is looked for; returned // in aloc; on a wildcard (any alternate code would do) // aloc is set to '*'. // All spaces are ignored, all identifiers should be in capital // letters (comparisons are case-sensitive). // The atom path string may be incomplete. If DefPath is supplied, // the function will try to get missing elements from there. If // missing items may not be found in DefPath, they are replaced by // wildcards. // ParseAtomPath(..) returns the following bits: // 0 - Ok // APATH_Incomplete - if path contains wildcards. Wildcards for // residue name and chemical element will be // ignored here if sequence number and // atom name, correspondingly, are provided. // APATH_WC_XXXXX - wildcard for different elements // -1 - wrong numerical format for model (fatal) // -2 - wrong numerical format for seqNum (fatal) extern int ParseAtomPath ( cpstr ID, int & mdl, ChainID chn, int & sn, InsCode ic, ResName res, AtomName atm, Element elm, AltLoc aloc, PAtomPath DefPath=NULL ); extern int ParseSelectionPath ( cpstr CID, int & iModel, pstr Chains, int & sNum1, InsCode ic1, int & sNum2, InsCode ic2, pstr RNames, pstr ANames, pstr Elements, pstr altLocs ); extern void MakeSelectionPath ( pstr CID, int iModel, cpstr Chains, int sNum1, const InsCode ic1, int sNum2, const InsCode ic2, cpstr RNames, cpstr ANames, cpstr Elements, cpstr altLocs ); } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_mattype.cpp0000644000175000017500000014623013271367640016642 0ustar maartenmaarten// $Id: mmdb_mattype.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 10.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MatType_ // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include #include #include #include #include #include "mmdb_mattype.h" namespace mmdb { // ------------------------------------------------------- realtype MachEps; realtype floatMachEps; realtype LnMaxReal; realtype LnMinReal; static realtype LnMaxRealExp; static realtype LnMinRealExp; // Initialization. Some C++ enviroments do not do the // following statements automatically, therefore it is // always advisable to call InitMatType() explicitely // from the top of main(). See body of InitMatType() // in the very end of this file. It is completely // harmless and cheap to call InitMatType() multiple // times. static bool MatTypeInit = InitMatType(); // ------------------------------------------------------- #ifdef _WIN32 pstr strcasestr ( pstr s1, cpstr s2 ) { pstr l1,l2,l; l1 = NULL; l2 = NULL; CreateCopy ( l1,s1 ); CreateCopy ( l2,s2 ); LowerCase ( l1 ); LowerCase ( l2 ); l = strstr ( l1,l2 ); if (l) l = s1 + (l-l1); delete[] l1; delete[] l2; return l; } #endif // ------------------------------------------------------- bool GetVectorMemory ( rvector & V, word N, word Shift ) { V = new realtype[N]; if (V!=NULL) V = V - Shift; // shift for abovementioned enumeration return (V!=NULL); } bool GetVectorMemory ( ivector & I, word N, word Shift ) { I = new int[N]; if (I!=NULL) I = I - Shift; // shift for abovementioned enumeration return (I!=NULL); } bool GetVectorMemory ( wvector & W, word N, word Shift ) { W = new word[N]; if (W!=NULL) W = W - Shift; // shift for abovementioned enumeration return (W!=NULL); } bool GetVectorMemory ( bvector & B, word N, word Shift ) { B = new byte[N]; if (B!=NULL) B = B - Shift; // shift for abovementioned enumeration return (B!=NULL); } bool GetVectorMemory ( ovector & O, word N, word Shift ) { O = new bool[N]; if (O!=NULL) O = O - Shift; // shift for abovementioned enumeration return (O!=NULL); } bool GetVectorMemory ( lvector & L, word N, word Shift ) { L = new long[N]; if (L!=NULL) L = L - Shift; // shift for abovementioned enumeration return (L!=NULL); } bool GetVectorMemory ( lwvector & L, word N, word Shift ) { L = new lword[N]; if (L!=NULL) L = L - Shift; // shift for abovementioned enumeration return (L!=NULL); } bool GetVectorMemory ( psvector & P, word N, word Shift ) { P = new pstr[N]; if (P!=NULL) P = P - Shift; // shift for abovementioned enumeration return (P!=NULL); } void FreeVectorMemory ( rvector & V, word Shift ) { if (V!=NULL) { V = V + Shift; // back shift for the work of heap system delete[] V; V = NULL; } } void FreeVectorMemory ( ivector & I, word Shift ) { if (I!=NULL) { I = I + Shift; // back shift for the work of heap system delete[] I; I = NULL; } } void FreeVectorMemory ( wvector & W, word Shift ) { if (W!=NULL) { W = W + Shift; // back shift for the work of heap system delete[] W; W = NULL; } } void FreeVectorMemory ( bvector & B, word Shift ) { if (B!=NULL) { B = B + Shift; // back shift for the work of heap system delete[] B; B = NULL; } } void FreeVectorMemory ( ovector & O, word Shift ) { if (O!=NULL) { O = O + Shift; // back shift for the work of heap system delete[] O; O = NULL; } } void FreeVectorMemory ( lvector & L, word Shift ) { if (L!=NULL) { L = L + Shift; // back shift for the work of heap system delete[] L; L = NULL; } } void FreeVectorMemory ( lwvector & L, word Shift ) { if (L!=NULL) { L = L + Shift; // back shift for the work of heap system delete[] L; L = NULL; } } void FreeVectorMemory ( psvector & P, word Shift ) { if (P!=NULL) { P = P + Shift; // back shift for the work of heap system delete[] P; P = NULL; } } bool GetMatrixMemory ( rmatrix & A, word N, word M, word ShiftN, word ShiftM ) { A = new rvector[N]; if (A!=NULL) { for (word i=0;i::epsilon(); } realtype floatMachinEps() { // A1.3.1 : Calculation of the machine's epsilon /* float fMachEps = 1.0; do fMachEps /= 2.0; while (float(1.0+fMachEps)!=1.0); return 2.0*fMachEps; */ return std::numeric_limits::epsilon(); } realtype frac ( realtype R ) { realtype i; return modf ( R,&i ); } long mod ( long x, long y ) { long k=x/y; long f=x-k*y; while (f<0) f += y; return f; } realtype Pow ( realtype X, int y ) { int m,l; realtype B; if (y==0) return 1.0; else if (X!=0.0) { B = X; m = 1; if (y>=0) l = y; else l = -y; while (m++=0) return B; else return 1.0/B; } else return 0.0; } realtype Pow1 ( realtype X, realtype Y ) { int k = mround(Y); if (fabs(k-Y)<=100.0*MachEps) return Pow(X,k); if (X==0.0) return 0.0; else return pow(X,Y); } realtype Exp ( realtype X ) { //realtype X1 = X; //realtype B = 1.0; if (X>=LnMaxRealExp) return MaxReal; else if (X<=LnMinRealExp) return 0.0; else { return exp(X); /* while (X1>LnMaxReal) { X1 -= LnMaxReal; B *= MaxExponent; } while (X1<-LnMaxReal) { X1 += LnMaxReal; B /= MaxExponent; } return B*exp(X1); */ } } bool Odd ( int i ) { return (i & 1); } // ---------------------------------------------------- long HexValL ( cpstr S ) { char C; int i; long z=0; for (i=0;S[i];i++) { z <<= 4; C = (char)toupper(S[i]); if (isdigit(C)) z += S[i]-'0'; else z += C-'A'+10; } return z; } // ---------------------------------------------------- long OctValL ( cpstr S ) { int i; long z=0; for (i=0;S[i];i++) { z <<= 3; z += S[i]-'0'; } return z; } // ---------------------------------------------------- long BinValL ( cpstr S ) { int i; long z=0; for (i=0;S[i];i++) { z <<= 1; z += S[i]-'0'; } return z; } pstr BinValS ( long L, pstr S ) { int i; long z; z = long(1) << (8*sizeof(long)-1); for (i=0;i<8*(int)sizeof(long);i++) { if (L & z) S[i] = '1'; else S[i] = '0'; z >>= 1; } S[8*sizeof(long)] = char(0); return S; } // ---------------------------------------------------- pstr ParamStr ( pstr D, cpstr S, realtype V, int M, cpstr S1 ) { char VS[30]; strcat ( D,S ); sprintf ( VS,"%-.*g",M,V ); strcat ( D,VS ); return strcat(D,S1); } pstr ParamStr ( pstr D, cpstr S, realtype V, int M, cpstr S1, realtype V2, int M2, cpstr S2 ) { char VS[30]; ParamStr ( D,S,V,M,S1 ); sprintf ( VS,"%-.*g",M2,V2 ); strcat ( D,VS ); return strcat(D,S2); } pstr CreateCopy ( pstr & Dest, cpstr Source ) { if (Dest!=Source) { if (Dest) delete[] Dest; if (Source) { Dest = new char[strlen(Source)+1]; strcpy ( Dest,Source ); } else Dest = NULL; } return Dest; } pstr CreateCopy_n ( pstr & Dest, cpstr Source, int n ) { int l; if (Dest) delete[] Dest; if (Source) { l = IMin ( strlen(Source),n ); Dest = new char[l+1]; strncpy ( Dest,Source,l ); Dest[l] = char(0); } else Dest = NULL; return Dest; } pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4, cpstr Source5 ) { if (Dest) { delete[] Dest; Dest = NULL; } return CreateConcat ( Dest,Source1,Source2,Source3,Source4,Source5 ); } pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4 ) { if (Dest) { delete[] Dest; Dest = NULL; } return CreateConcat ( Dest,Source1,Source2,Source3,Source4 ); } pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3 ) { if (Dest) { delete[] Dest; Dest = NULL; } return CreateConcat ( Dest,Source1,Source2,Source3 ); } pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2 ) { if (Dest) { delete[] Dest; Dest = NULL; } return CreateConcat ( Dest,Source1,Source2 ); } pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4, cpstr Source5 ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; ls = 0; if (Source1) ls += strlen(Source1); if (Source2) ls += strlen(Source2); if (Source3) ls += strlen(Source3); if (Source4) ls += strlen(Source4); if (Source5) ls += strlen(Source5); if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); if (Source1) strcat ( S,Source1 ); if (Source2) strcat ( S,Source2 ); if (Source3) strcat ( S,Source3 ); if (Source4) strcat ( S,Source4 ); if (Source5) strcat ( S,Source5 ); Dest = S; } return Dest; } pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4 ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; ls = 0; if (Source1) ls += strlen(Source1); if (Source2) ls += strlen(Source2); if (Source3) ls += strlen(Source3); if (Source4) ls += strlen(Source4); if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); if (Source1) strcat ( S,Source1 ); if (Source2) strcat ( S,Source2 ); if (Source3) strcat ( S,Source3 ); if (Source4) strcat ( S,Source4 ); Dest = S; } return Dest; } pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3 ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; ls = 0; if (Source1) ls += strlen(Source1); if (Source2) ls += strlen(Source2); if (Source3) ls += strlen(Source3); if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); if (Source1) strcat ( S,Source1 ); if (Source2) strcat ( S,Source2 ); if (Source3) strcat ( S,Source3 ); Dest = S; } return Dest; } pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2 ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; ls = 0; if (Source1) ls += strlen(Source1); if (Source2) ls += strlen(Source2); if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); if (Source1) strcat ( S,Source1 ); if (Source2) strcat ( S,Source2 ); Dest = S; } return Dest; } pstr CreateConcat ( pstr & Dest, cpstr Source ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; if (Source) ls = strlen(Source); else ls = 0; if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); strcat ( S,Source ); Dest = S; } return Dest; } pstr LastOccurence ( cpstr S, char c ) { pstr P=(pstr)S; pstr R=NULL; while (*P) { if (*P==c) R = P; P++; } return R; } pstr FirstOccurence ( cpstr S, char c ) { pstr P=(pstr)S; while (*P) { if (*P==c) return P; P++; } return NULL; } int indexOf ( cpstr S, char c ) { int i=0; while (S[i]) { if (S[i]==c) return i; i++; } return -1; } pstr FirstOccurence ( cpstr S, int Slen, cpstr Q, int Qlen ) { int i,j,k,l; l = Slen-Qlen; for (i=0;i<=l;i++) { j = 0; k = i; while (j=Qlen) return pstr(&(S[i])); } return NULL; } int indexOf ( cpstr S, int Slen, cpstr Q, int Qlen ) { int i,j,k,l; l = Slen-Qlen; for (i=0;i<=l;i++) { j = 0; k = i; while (j=Qlen) return i; } return -1; } pstr LowerCase ( pstr s ) { pstr p=s; while (*p) { *p = char(tolower(int(*p))); p++; } return s; } pstr UpperCase ( pstr s ) { pstr p=s; while (*p) { *p = char(toupper(int(*p))); p++; } return s; } void GetString ( pstr L, cpstr S, int M ) { // Copies first M characters of string S into string L, // appending the terminating null. If S contains less // then M characters, L will be padded with spaces. int i,j; i = 0; j = 0; while (S[i] && (i=SMax) || (!S[k])) { lm1 = IMin(n,lm1); while (k=SMax)) { lm1 = IMin(n,lm1); while (k=0) && (k>=0)) d[i--] = s[k--]; while (i>=0) d[i--] = ' '; } void strcpy_nr ( pstr d, cpstr s, int n ) { // Copies at most n symbols from string s to d, but // no more than strlen(s) (s must contain a terminating null). // The string in d is aligned to the right and added with // spaces at the left, if necessary. The terminating null // IS NEITHER appended NOR copied to d. int i,k; i = n-1; k = IMin(i,strlen(s)-1); while ((i>=0) && (k>=0)) d[i--] = s[k--]; while (i>=0) d[i--] = ' '; } void strcpy_ns ( pstr d, cpstr s, int n ) { // Copies at most n symbols from string s to d, but // no more than strlen(s) (s must contain a terminating // null). The terminating null IS NEITHER appended NOR // copied to d; rather, d is padded with spaces if // strlen(s)0) && (d[i]==' ')) i--; if (d[i]==' ') d[i] = char(0); else d[i+1] = char(0); return d; } pstr strcpy_ncs ( pstr d, cpstr s, int n ) { // Copies at most n characters from string s to string d // cutting all spaces at at the end. Thus, " abcde " will // be copied like " abc" at n=4 and like " abcde" at n>5 // (terminating null appended). // The function returns d. int i; i = 0; while (s[i] && (i0) && (d[i]==' ')) i--; if (d[i]==' ') d[i] = char(0); else d[i+1] = char(0); return d; } pstr strcpy_css ( pstr d, cpstr s ) { // Copies string s to string d cutting all spaces at // at the begining and at the end. Thus, " ab c de " // will be copied like "ab c de" (terminating null // appended). // The function returns d. int i,k; i = 0; while (s[i]==' ') i++; k = 0; while (s[i]) d[k++] = s[i++]; if (k>0) { k--; while ((k>0) && (d[k]==' ')) k--; if (d[k]==' ') d[k] = char(0); else d[k+1] = char(0); } else d[k] = char(0); return d; } pstr strcpy_ncss ( pstr d, cpstr s, int n ) { // Copies at most n characters from string s to string d cutting // all spaces at the begining and at the end. Thus, " ab c de " // will be copied like "ab" at n=3 (terminating null appended). // The function returns d. int i,k; i = 0; while ((s[i]==' ') && (i0) { k--; while ((k>0) && (d[k]==' ')) k--; if (d[k]==' ') d[k] = char(0); else d[k+1] = char(0); } else d[k] = char(0); return d; } pstr strcpy_n0 ( pstr d, cpstr s, int n ) { // Copies at most n symbols from string s to d, but // no more than strlen(s) (s must contain a terminating // null). The terminating null IS appended to d. // The function returns d. int i; i = 0; while ((i0)) { k--; while ((k>0) && (S[k]==' ')) k--; if (S[k]!=' ') k++; } S[k] = char(0); return S; } pstr DelSpaces ( pstr S, char c ) { // Removes all spaces (or other symbols as specified by 'c') // from the string. The string is then shrinked by the number // of removed characters. Thus, " as ttt " becomes "asttt". int i,j; j = 0; for (i=0;S[i];i++) if (S[i]!=c) { if (j>= 8; } } void short2UniBin ( short S, shortUniBin sUB ) { int j,sh; short n; sh = 8*(sizeof(shortUniBin)-1); for (j=sizeof(shortUniBin)-1;j>=0;j--) { n = (S >> sh) & 0xFF; sUB[j] = byte(n); sh -= 8; } } void long2UniBin ( long L, longUniBin lUB ) { int j,sh; long n; sh = 8*(sizeof(longUniBin)-1); for (j=sizeof(longUniBin)-1;j>=0;j--) { n = (L >> sh) & 0xFF; lUB[j] = byte(n); sh -= 8; } } void word2UniBin ( word W, wordUniBin wUB ) { int j,sh; word n; sh = 8*(sizeof(wordUniBin)-1); for (j=sizeof(wordUniBin)-1;j>=0;j--) { n = (W >> sh) & 0xFF; wUB[j] = byte(n); sh -= 8; } } void real2UniBin ( realtype R, realUniBin rUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower8; rUB[0] = byte(k2); for (k=sizeof(realUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); rUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) rUB[1] |= _fsign; } void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower4; srUB[0] = byte(k2); for (k=sizeof(shortrealUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); srUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) srUB[1] |= _fsign; } /* #undef _new_float_unibin #ifdef _new_float_unibin void float2UniBin ( realtype R, floatUniBin fUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower4; fUB[0] = byte(k2); for (k=sizeof(floatUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); fUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) fUB[1] |= _fsign; } #else void float2UniBin ( realtype R, floatUniBin fUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower8; fUB[0] = byte(k2); for (k=sizeof(realUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); if (k<=sizeof(floatUniBin)) fUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) fUB[1] |= _fsign; } #endif */ void float2UniBin ( realtype R, floatUniBin fUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; fUB[0] = byte(k2); if (_old_float_unibin) { // this is wrong but compatible with already existing files :( // in the result, it gives errors in 6th digit at back conversion Q = (Q/_fpower[k2])*_fpower8; for (k=sizeof(realUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); if (k<=(int)sizeof(floatUniBin)) fUB[k] = byte(int(Q-L*_rfbase)); Q = L; } } else { // this is correct Q = (Q/_fpower[k2])*_fpower4; for (k=sizeof(floatUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); fUB[k] = byte(int(Q-L*_rfbase)); Q = L; } } //if (fUB[1] & _fsign) printf ( " error!\n" ); if (R<0) fUB[1] |= _fsign; } void UniBin2float ( floatUniBin fUB, realtype & R ) { int j,s; if (fUB[1] & _fsign) { s = 1; fUB[1] &= _fsign1; } else s = 0; R = int(fUB[1]); if (_old_float_unibin) { // this is wrong and gives a conversion error in 6th digit :( // we have to keep this for compatibility with already existing // files for (j=2;j<(int)sizeof(floatUniBin);j++) R = R*_rfbase + int(fUB[j]); for (j=sizeof(floatUniBin);j<(int)sizeof(realUniBin);j++) R *= _rfbase; R = (R/_fpower8)*_fpower[int(fUB[0])]; } else { // this is correct for (j=2;j<(int)sizeof(floatUniBin);j++) R = R*_rfbase + int(fUB[j]); R = (R/_fpower4)*_fpower[int(fUB[0])]; } if (s) R = -R; } /* ------------------------------------------------------- This piece of code shows that float2Unibin - Unbin2float pair does same-quality job as the native float - double conversion: InitMatType(); set_new_float_unibin(); floatUniBin fUB; realUniBin rUB; realtype maxsh = MaxShortReal/2.0; // max manageable /2! float maxshf = maxsh; realtype maxshr = maxshf; realtype maxsh1; float2UniBin ( maxsh,fUB ); UniBin2float ( fUB,maxsh1 ); printf ( " float\n %10.3f\n %10.3f\n %10.3f\n %10.3f\n", maxsh,maxsh1,maxshf,maxshr ); maxsh = MaxShortReal; real2UniBin ( maxsh,rUB ); UniBin2real ( rUB,maxsh1 ); printf ( " real\n %10.3f\n %10.3f\n",maxsh,maxsh1 ); ---- RESULTS: float 170099999999999990938343446679146987520.000 170099999948540854500627141228603899904.000 170100000027769017014891478822147850240.000 170100000027769017014891478822147850240.000 real 340199999999999981876686893358293975040.000 340199999999999981876686893358293975040.000 -------------------------------------------------------------- */ /* void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower8; srUB[0] = byte(k2); for (k=sizeof(realUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); if (k<=(int)sizeof(shortrealUniBin)) srUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) srUB[1] |= _fsign; } void float2UniBin ( realtype R, floatUniBin fUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower8; fUB[0] = byte(k2); for (k=sizeof(realUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); if (k<=(int)sizeof(floatUniBin)) fUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) fUB[1] |= _fsign; } */ /* void UniBin2int ( intUniBin iUB, int & I ) { int j,n,sh; sh = 8*sizeof(intUniBin); I = 0x00; for (j=sizeof(intUniBin)-1;j>=0;j--) { sh -= 8; n = byte(iUB[j]); I = I | (n << sh); } } */ void UniBin2int ( intUniBin iUB, int & I ) { int j; I = 0x00; for (j=sizeof(intUniBin)-1;j>=0;j--) { I <<= 8; I |= int(iUB[j]); } } void UniBin2short ( shortUniBin sUB, short & S ) { int j,sh; short n; sh = 8*sizeof(shortUniBin); S = 0x00; for (j=sizeof(shortUniBin)-1;j>=0;j--) { sh -= 8; n = byte(sUB[j]); S = S | (n << sh); } } void UniBin2long ( longUniBin lUB, long & L ) { int j,sh; long n; sh = 8*sizeof(longUniBin); L = 0x00; for (j=sizeof(longUniBin)-1;j>=0;j--) { sh -= 8; n = byte(lUB[j]); L = L | (n << sh); } } void UniBin2word ( wordUniBin wUB, word & W ) { int j,sh; word n; sh = 8*sizeof(wordUniBin); W = 0x00; for (j=sizeof(wordUniBin)-1;j>=0;j--) { sh -= 8; n = byte(wUB[j]); W = W | (n << sh); } } void UniBin2real ( realUniBin rUB, realtype & R ) { int j,s; if (rUB[1] & _fsign) { s = 1; rUB[1] &= _fsign1; } else s = 0; R = int(rUB[1]); for (j=2;j<(int)sizeof(realUniBin);j++) R = R*_rfbase + int(rUB[j]); R = (R/_fpower8)*_fpower[int(rUB[0])]; if (s) R = -R; } void UniBin2shortreal ( shortrealUniBin srUB, shortreal & R ) { int j,s; if (srUB[1] & _fsign) { s = 1; srUB[1] &= _fsign1; } else s = 0; R = int(srUB[1]); for (j=2;j<(int)sizeof(shortrealUniBin);j++) R = R*_rfbase + int(srUB[j]); R = (R/_fpower4)*_fpower[int(srUB[0])]; if (s) R = -R; } /* #ifdef _new_float_unibin void UniBin2float ( floatUniBin fUB, realtype & R ) { int j,s; if (fUB[1] & _fsign) { s = 1; fUB[1] &= _fsign1; } else s = 0; R = int(fUB[1]); for (j=2;j<(int)sizeof(floatUniBin);j++) R = R*_rfbase + int(fUB[j]); R = (R/_fpower4)*_fpower[int(fUB[0])]; if (s) R = -R; } #else void UniBin2float ( floatUniBin fUB, realtype & R ) { int j,s; if (fUB[1] & _fsign) { s = 1; fUB[1] &= _fsign1; } else s = 0; R = int(fUB[1]); for (j=2;j0) { memcpy ( &(S[l]),L,len ); l += len; S[l] = char(0); } } void mem_write ( bool B, pstr S, int & l ) { if (B) S[l++] = 'Y'; else S[l++] = 'N'; S[l] = char(0); } void mem_write_byte ( byte B, pstr S, int & l ) { S[l++] = char(B); S[l] = char(0); } void mem_read ( int & I, cpstr S, int & l ) { intUniBin iUB; memcpy ( iUB,&(S[l]),sizeof(intUniBin) ); l += sizeof(intUniBin); UniBin2int ( iUB,I ); } void mem_read ( short & I, cpstr S, int & l ) { shortUniBin sUB; memcpy ( sUB,&(S[l]),sizeof(shortUniBin) ); l += sizeof(shortUniBin); UniBin2short ( sUB,I ); } void mem_read ( long & I, cpstr S, int & l ) { longUniBin lUB; memcpy ( lUB,&(S[l]),sizeof(longUniBin) ); l += sizeof(longUniBin); UniBin2long ( lUB,I ); } void mem_read ( word & W, cpstr S, int & l ) { wordUniBin wUB; memcpy ( wUB,&(S[l]),sizeof(wordUniBin) ); l += sizeof(wordUniBin); UniBin2word ( wUB,W ); } void mem_read ( realtype & R, cpstr S, int & l ) { realUniBin rUB; memcpy ( rUB,&(S[l]),sizeof(realUniBin) ); l += sizeof(realUniBin); UniBin2real ( rUB,R ); } void mem_read ( shortreal & R, cpstr S, int & l ) { shortrealUniBin srUB; memcpy ( srUB,&(S[l]),sizeof(shortrealUniBin) ); l += sizeof(shortrealUniBin); UniBin2shortreal ( srUB,R ); } void mem_read ( pstr L, int len, cpstr S, int & l ) { memcpy ( L,&(S[l]),len ); l += len; } void mem_read ( pstr & L, cpstr S, int & l ) { int len; if (L) { delete[] L; L = NULL; } mem_read ( len,S,l ); if (len>0) { L = new char[len+1]; memcpy ( L,&(S[l]),len ); L[len] = char(0); l += len; } } void mem_read ( bool & B, cpstr S, int & l ) { B = (S[l++]=='Y'); } void mem_read_byte ( byte & B, cpstr S, int & l ) { B = byte(S[l++]); } // ------------------------------------------------------- bool InitMatType() { MachEps = MachinEps(); floatMachEps = floatMachinEps(); LnMaxReal = log(fMaxReal); LnMinReal = log(fMinReal); LnMaxRealExp = LnMaxReal; LnMinRealExp = LnMinReal; InitFPowers(); return true; } } /* =================================================== */ // *** end of mmdb2-2.0.20/mmdb2/mmdb_coormngr.cpp0000644000175000017500000037100213271367640017002 0ustar maartenmaarten// $Id: mmdb_coormngr.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 23.10.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_coormngr // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Brick ( space brick ) // ~~~~~~~~~ mmdb::CoorManager ( MMDB atom coordinate manager ) // // (C) E. Krissinel 2000-2015 // // ================================================================= // #include #include #include "mmdb_coormngr.h" #include "mmdb_math_linalg.h" #include "mmdb_tables.h" namespace mmdb { // ========================== Brick ============================= Brick::Brick() { InitBrick(); } Brick::~Brick() { Clear(); } void Brick::InitBrick() { atom = NULL; id = NULL; nAtoms = 0; nAllocAtoms = 0; } void Brick::Clear() { if (atom) delete[] atom; FreeVectorMemory ( id,0 ); atom = NULL; nAtoms = 0; nAllocAtoms = 0; } void Brick::AddAtom ( PAtom A, int atomid ) { int i; PPAtom atom1; ivector id1; if (nAtoms>=nAllocAtoms) { nAllocAtoms = nAtoms+10; atom1 = new PAtom[nAllocAtoms]; GetVectorMemory ( id1,nAllocAtoms,0 ); for (i=0;i=nalloc) { nalloc = natoms+10; atom1 = new PAtom[nalloc]; GetVectorMemory ( id1,nalloc,0 ); for (i=0;inOpAlloc) { ch1ID = new PChainID[Nops]; ch2ID = new PChainID[Nops]; GetVectorMemory ( nChains1,Nops,0 ); for (i=0;i0) { nOpAlloc = Nops; chID1 = new PChainID[Nops]; chID2 = new PChainID[Nops]; GetVectorMemory ( nChains,Nops,0 ); for (i=0;inChains[i]; if (nChains[i]<=0) { chID1[i] = NULL; chID2[i] = NULL; } else { chID1[i] = new ChainID[nChains[i]]; chID2[i] = new ChainID[nChains[i]]; for (j=0;jchID1[i][j] ); strcpy ( chID2[i][j],PGenSym(GenSym)->chID2[i][j] ); } } } } } void GenSym::write ( io::RFile f ) { int i,j; byte Version=1; f.WriteByte ( &Version ); SymOps::write ( f ); f.WriteInt ( &nOpAlloc ); for (i=0;i0) { chID1 = new PChainID[nOpAlloc]; chID2 = new PChainID[nOpAlloc]; GetVectorMemory ( nChains,nOpAlloc,0 ); for (i=0;i0) { chID1[i] = new ChainID[nChains[i]]; chID2[i] = new ChainID[nChains[i]]; for (j=0;j0) { if (n_contacts=alloc_index) { alloc_index = n_contacts+IMax(alloc_index/4+10,10); if ((alloc_max>0) && (alloc_index>alloc_max)) alloc_index = alloc_max; cont1 = new Contact[alloc_index]; for (i=0;i0) { atom = new PPAtom[nStruct]; id = new ivector[nStruct]; GetVectorMemory ( nAtoms,nStruct,0 ); GetVectorMemory ( nAlloc,nStruct,0 ); for (i=0;i=nal) { nal = nat+10; A2 = new PAtom[nal]; GetVectorMemory ( id2,nal,0 ); for (i=0;iGetSerNum(); return 1; } PModel CoorManager::GetModel ( int modelNo ) { if ((modelNo>=1) && (modelNo<=nModels)) return model[modelNo-1]; else return NULL; } PModel CoorManager::GetModel ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_WC_ModelNo)) { CoorIDCode = CID_WrongPath; return NULL; } if ((modno>=1) && (modno<=nModels)) return model[modno-1]; else return NULL; } void CoorManager::GetModelTable ( PPModel & modelTable, int & NumberOfModels ) { NumberOfModels = nModels; modelTable = model; } int CoorManager::DeleteModel ( int modelNo ) { if ((modelNo>=1) && (modelNo<=nModels)) { if (model[modelNo-1]) { Exclude = false; delete model[modelNo-1]; model[modelNo-1] = NULL; Exclude = true; return 1; } } return 0; } int CoorManager::DeleteModel ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_WC_ModelNo)) { CoorIDCode = CID_WrongPath; return 0; } if ((modno>=1) && (modno<=nModels)) { if (model[modno-1]) { Exclude = false; delete model[modno-1]; model[modno-1] = NULL; Exclude = true; return 1; } } return 0; } int CoorManager::DeleteSolvent() { int i,k; Exclude = false; k = 0; for (i=0;iDeleteSolvent(); model[i]->TrimChainTable(); if (model[i]->nChains<=0) { delete model[i]; model[i] = NULL; } } Exclude = true; return k; } // ---------------- Adding/Inserting models --------------- int CoorManager::AddModel ( PModel mdl ) { PPModel model1; int i,nnat,nat1; if (!mdl) return nModels; for (i=0;iGetNumberOfAtoms ( true ); AddAtomArray ( nnat ); // get space for new atoms if (mdl->GetCoordHierarchy()) { SwitchModel ( nModels+1 ); // get one more model at the end nat1 = nAtoms; model[nModels-1]->_copy ( mdl,atom,nat1 ); model[nModels-1]->serNum = nModels; nAtoms = nat1; } else { model1 = new PModel[nModels+1]; for (i=0;iSetMMDBManager ( PManager(this),nModels+1 ); model[nModels]->CheckInAtoms(); nModels++; } return nModels; } int CoorManager::InsModel ( PModel mdl, int modelNo ) { AddModel ( mdl ); RotateModels ( modelNo,nModels,1 ); return nModels; } void CoorManager::RotateModels ( int modelNo1, int modelNo2, int rotdir ) { PModel mdl; PPAtom A; int m1,m2,i11,i12,i21,i22,nat,i,k; m1 = IMax ( 0,modelNo1-1 ); m2 = IMin ( nModels,modelNo2) - 1; if (m1>m2) ISwap ( m1,m2 ); if (m1!=m2) { if (model[m1] && model[m2]) { model[m1]->GetAIndexRange ( i11,i12 ); model[m2]->GetAIndexRange ( i21,i22 ); if ((i11index = k+1; k++; } for (i=0;iindex = k+1; k++; } } else { // rotate anticlockwise nat = i22-i21+1; A = new PAtom[nat]; k = 0; for (i=i21;i<=i22;i++) A[k++] = atom[i]; k = i22; for (i=i21-1;i>=i11;i--) { atom[k] = atom[i]; if (atom[k]) atom[k]->index = k+1; k--; } for (i=nat-1;i>=0;i--) { atom[k] = A[i]; if (atom[k]) atom[k]->index = k+1; k--; } } delete[] A; } } if (rotdir<0) { // rotate anticlockwise mdl = model[m1]; for (i=m1;iserNum = i+1; } model[m2] = mdl; model[m2]->serNum = m2+1; } else { // rotate clockwise mdl = model[m2]; for (i=m2;i>m1;i--) { model[i] = model[i-1]; model[i]->serNum = i+1; } model[m1] = mdl; model[m1]->serNum = m1+1; } } } void CoorManager::SwapModels ( int modelNo1, int modelNo2 ) { PModel mdl; PPAtom A; int m1,m2,i11,i12,i21,i22,i,k,n; n = 0; // tp depress "uninitialized" warning m1 = IMax ( 0,modelNo1-1 ); m2 = IMin ( nModels,modelNo2) - 1; if (m1>m2) ISwap ( m1,m2 ); if (m1!=m2) { if (model[m1]) model[m1]->GetAIndexRange ( i11,i12 ); else { n = m1; while ((!model[n]) && (nGetAIndexRange ( i11,i12 ); i12 = i11-1; } else n = -1; } if (n>=0) { if (model[m2]) model[m2]->GetAIndexRange ( i21,i22 ); else { n = m2; while ((!model[n]) && (m1GetAIndexRange ( i21,i22 ); i22 = i21-1; } else n = -1; } } if (n>=0) { i11--; i12--; i21--; i22--; A = new PAtom[atmLen]; k = 0; for (i=0 ;iindex = i+1; for (i=nAtoms;iserNum = m1+1; model[m2]->serNum = m2+1; } } PChain CoorManager::GetChain ( int modelNo, const ChainID chainID ) { if ((0GetChain ( chainID ); } return NULL; } PChain CoorManager::GetChain ( int modelNo, int chainNo ) { if ((0GetChain ( chainNo ); } return NULL; } PChain CoorManager::GetChain ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { CoorIDCode = CID_WrongPath; return NULL; } return GetChain ( modno,chname ); } void CoorManager::GetChainTable ( int modelNo, PPChain & chainTable, int & NumberOfChains ) { chainTable = NULL; NumberOfChains = 0; if ((0chain; NumberOfChains = model[modelNo-1]->nChains; } } } void CoorManager::GetChainTable ( cpstr CID, PPChain & chainTable, int & NumberOfChains ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; chainTable = NULL; NumberOfChains = 0; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_WC_ModelNo)) { CoorIDCode = CID_WrongPath; return; } if ((0chain; NumberOfChains = model[modno-1]->nChains; } } } int CoorManager::DeleteChain ( int modelNo, const ChainID chID ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteChain ( chID ); } return 0; } int CoorManager::DeleteChain ( int modelNo, int chainNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteChain ( chainNo ); } return 0; } int CoorManager::DeleteAllChains ( int modelNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllChains(); } return 0; } int CoorManager::DeleteAllChains() { int i,k; k = 0; for (i=0;iDeleteAllChains(); return k; } int CoorManager::AddChain ( int modelNo, PChain chain ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->AddChain ( chain ); } return 0; } PResidue CoorManager::GetResidue ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode ) { if ((0GetResidue ( chainID,seqNo,insCode ); } return NULL; } PResidue CoorManager::GetResidue ( int modelNo, int chainNo, int seqNo, const InsCode insCode ) { if ((0GetResidue ( chainNo,seqNo,insCode ); } return NULL; } PResidue CoorManager::GetResidue ( int modelNo, const ChainID chainID, int resNo ) { if ((0GetResidue ( chainID,resNo ); } return NULL; } PResidue CoorManager::GetResidue ( int modelNo, int chainNo, int resNo ) { if ((0GetResidue ( chainNo,resNo ); } return NULL; } PResidue CoorManager::GetResidue ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode))) { CoorIDCode = CID_WrongPath; return NULL; } return GetResidue ( modno,chname,sn,ic ); } int CoorManager::GetResidueNo ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode ) { if ((0GetResidueNo ( chainID,seqNo,insCode ); } return -3; } int CoorManager::GetResidueNo ( int modelNo, int chainNo, int seqNo, const InsCode insCode ) { if ((0GetResidueNo ( chainNo,seqNo,insCode ); } return -3; } void CoorManager::GetResidueTable ( PPResidue & resTable, int & NumberOfResidues ) { // resTable has to be NULL or it will be reallocated. The // application is responsible for deallocating the resTable (but not // of its residues!). This does not apply to other GetResidueTable // functions. PPChain chain; PPResidue res; int i,j,k,n,nChains,nResidues; if (resTable) { delete[] resTable; resTable = NULL; } NumberOfResidues = 0; for (i=0;iGetChainTable ( chain,nChains ); for (j=0;jnChains;j++) if (chain[j]) { chain[j]->GetResidueTable ( res,nResidues ); NumberOfResidues += nResidues; } } if (NumberOfResidues>0) { resTable = new PResidue[NumberOfResidues]; k = 0; for (i=0;iGetChainTable ( chain,nChains ); for (j=0;jnChains;j++) if (chain[j]) { chain[j]->GetResidueTable ( res,nResidues ); for (n=0;nGetChain ( chainID ); if (chain) { resTable = chain->residue; NumberOfResidues = chain->nResidues; } } } } void CoorManager::GetResidueTable ( int modelNo, int chainNo, PPResidue & resTable, int & NumberOfResidues ) { PChain chain; resTable = NULL; NumberOfResidues = 0; if ((0GetChain ( chainNo ); if (chain) { resTable = chain->residue; NumberOfResidues = chain->nResidues; } } } } void CoorManager::GetResidueTable ( cpstr CID, PPResidue & resTable, int & NumberOfResidues ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PChain chain; resTable = NULL; NumberOfResidues = 0; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { CoorIDCode = CID_WrongPath; return; } if ((0GetChain ( chname ); if (chain) { resTable = chain->residue; NumberOfResidues = chain->nResidues; } } } } int CoorManager::DeleteResidue ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteResidue ( chainID,seqNo,insCode ); } return 0; } int CoorManager::DeleteResidue ( int modelNo, const ChainID chainID, int resNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteResidue ( chainID,resNo ); } return 0; } int CoorManager::DeleteResidue ( int modelNo, int chainNo, int seqNo, const InsCode insCode ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteResidue ( chainNo,seqNo,insCode ); } return 0; } int CoorManager::DeleteResidue ( int modelNo, int chainNo, int resNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteResidue ( chainNo,resNo ); } return 0; } int CoorManager::DeleteAllResidues ( int modelNo, const ChainID chainID ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllResidues ( chainID ); } return 0; } int CoorManager::DeleteAllResidues ( int modelNo, int chainNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllResidues ( chainNo ); } return 0; } int CoorManager::DeleteAllResidues ( int modelNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllResidues(); } return 0; } int CoorManager::DeleteAllResidues() { int i,k; k = 0; for (i=0;iDeleteAllResidues(); return k; } int CoorManager::AddResidue ( int modelNo, const ChainID chainID, PResidue res ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->AddResidue ( chainID,res ); } return 0; } int CoorManager::AddResidue ( int modelNo, int chainNo, PResidue res ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->AddResidue ( chainNo,res ); } return 0; } int CoorManager::GetNumberOfChains ( int modelNo ) { if ((0nChains; } return 0; } int CoorManager::GetNumberOfChains ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_WC_ModelNo)) { CoorIDCode = CID_WrongPath; return 0; } if ((0nChains; } return 0; } int CoorManager::GetNumberOfResidues ( int modelNo, const ChainID chainID ) { PChain chain; if ((0GetChain ( chainID ); if (chain) return chain->nResidues; } } return 0; } int CoorManager::GetNumberOfResidues ( int modelNo, int chainNo ) { PChain chain; if ((0nChains)) { chain = model[modelNo-1]->chain[chainNo]; if (chain) return chain->nResidues; } } } return 0; } int CoorManager::GetNumberOfResidues ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PChain chain; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { CoorIDCode = CID_WrongPath; return 0; } if ((0GetChain ( chname ); if (chain) return chain->nResidues; } } return 0; } int CoorManager::GetNumberOfAtoms ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode ) { PChain chain; PResidue res; if ((0GetChain ( chainID ); if (chain) { res = chain->GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; } } } return 0; } int CoorManager::GetNumberOfAtoms ( int modelNo, int chainNo, int seqNo, const InsCode insCode ) { PChain chain; PResidue res; if ((0nChains)) { chain = model[modelNo-1]->chain[chainNo]; if (chain) { res = chain->GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; } } } } return 0; } int CoorManager::GetNumberOfAtoms ( int modelNo, const ChainID chainID, int resNo ) { PChain chain; PResidue res; if ((0GetChain ( chainID ); if (chain) { if ((0<=resNo) && (resNonResidues)) { res = chain->residue[resNo]; if (res) return res->nAtoms; } } } } return 0; } int CoorManager::GetNumberOfAtoms ( int modelNo, int chainNo, int resNo ) { PChain chain; PResidue res; if ((0nChains)) { chain = model[modelNo-1]->chain[chainNo]; if (chain) { if ((0<=resNo) && (resNonResidues)) { res = chain->residue[resNo]; if (res) return res->nAtoms; } } } } } return 0; } int CoorManager::GetNumberOfAtoms ( cpstr CID ) { // returns number of atoms in residues identified by CID int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PChain chain; PResidue res; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode))) { CoorIDCode = CID_WrongPath; return 0; } if ((0GetChain ( chname ); if (chain) { res = chain->GetResidue ( sn,ic ); if (res) return res->nAtoms; } } } return 0; } // -------------------- Extracting atoms ----------------------- PAtom CoorManager::GetAtom ( int modelNo, // model serial number 1... const ChainID chID, // chain ID int seqNo, // residue sequence number const InsCode insCode, // residue insertion code const AtomName aname, // atom name const Element elmnt, // chemical element code or '*' const AltLoc aloc // alternate location indicator ) { PModel mdl; PChain chn; PResidue res; PAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } chn = mdl->GetChain ( chID ); if (!chn) { CoorIDCode = CID_NoChain; return NULL; } res = chn->GetResidue ( seqNo,insCode ); if (!res) { CoorIDCode = CID_NoResidue; return NULL; } atm = res->GetAtom ( aname,elmnt,aloc ); if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PAtom CoorManager::GetAtom ( int modelNo, // model serial number 1... const ChainID chID, // chain ID int seqNo, // residue sequence number const InsCode insCode, // residue insertion code int atomNo // atom number 0.. ) { PModel mdl; PChain chn; PResidue res; PAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } chn = mdl->GetChain ( chID ); if (!chn) { CoorIDCode = CID_NoChain; return NULL; } res = chn->GetResidue ( seqNo,insCode ); if (!res) { CoorIDCode = CID_NoResidue; return NULL; } if ((0<=atomNo) && (atomNonAtoms)) atm = res->atom[atomNo]; else atm = NULL; if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PAtom CoorManager::GetAtom ( int modelNo, // model serial number 1... const ChainID chID, // chain ID int resNo, // residue number 0.. const AtomName aname, // atom name const Element elmnt, // chemical element code or '*' const AltLoc aloc // alternate location indicator ) { PModel mdl; PChain chn; PResidue res; PAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } chn = mdl->GetChain ( chID ); if (!chn) { CoorIDCode = CID_NoChain; return NULL; } if ((0<=resNo) && (resNonResidues)) res = chn->residue[resNo]; else res = NULL; if (!res) { CoorIDCode = CID_NoResidue; return NULL; } atm = res->GetAtom ( aname,elmnt,aloc ); if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PAtom CoorManager::GetAtom ( int modelNo, // model serial number 1... const ChainID chID, // chain ID int resNo, // residue number 0.. int atomNo // atom number 0.. ) { PModel mdl; PChain chn; PResidue res; PAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } chn = mdl->GetChain ( chID ); if (!chn) { CoorIDCode = CID_NoChain; return NULL; } if ((0<=resNo) && (resNonResidues)) res = chn->residue[resNo]; else res = NULL; if (!res) { CoorIDCode = CID_NoResidue; return NULL; } if ((0<=atomNo) && (atomNonAtoms)) atm = res->atom[atomNo]; else atm = NULL; if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PAtom CoorManager::GetAtom ( int modelNo, // model serial number 1... int chNo, // chain number 0.. int seqNo, // residue sequence number const InsCode insCode, // residue insertion code const AtomName aname, // atom name const Element elmnt, // chemical element code or '*' const AltLoc aloc // alternate location indicator ) { PModel mdl; PChain chn; PResidue res; PAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } if ((0<=chNo) && (chNonChains)) chn = mdl->chain[chNo]; else chn = NULL; if (!chn) { CoorIDCode = CID_NoChain; return NULL; } res = chn->GetResidue ( seqNo,insCode ); if (!res) { CoorIDCode = CID_NoResidue; return NULL; } atm = res->GetAtom ( aname,elmnt,aloc ); if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PAtom CoorManager::GetAtom ( int modelNo, // model serial number 1... int chNo, // chain number 0... int seqNo, // residue sequence number const InsCode insCode, // residue insertion code int atomNo // atom number 0... ) { PModel mdl; PChain chn; PResidue res; PAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } if ((0<=chNo) && (chNonChains)) chn = mdl->chain[chNo]; else chn = NULL; if (!chn) { CoorIDCode = CID_NoChain; return NULL; } res = chn->GetResidue ( seqNo,insCode ); if (!res) { CoorIDCode = CID_NoResidue; return NULL; } if ((0<=atomNo) && (atomNonAtoms)) atm = res->atom[atomNo]; else atm = NULL; if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PAtom CoorManager::GetAtom ( int modelNo, // model serial number 1... int chNo, // chain number 0... int resNo, // residue number 0... const AtomName aname, // atom name const Element elmnt, // chemical element code or '*' const AltLoc aloc // alternate location indicator ) { PModel mdl; PChain chn; PResidue res; PAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } if ((0<=chNo) && (chNonChains)) chn = mdl->chain[chNo]; else chn = NULL; if (!chn) { CoorIDCode = CID_NoChain; return NULL; } if ((0<=resNo) && (resNonResidues)) res = chn->residue[resNo]; else res = NULL; if (!res) { CoorIDCode = CID_NoResidue; return NULL; } atm = res->GetAtom ( aname,elmnt,aloc ); if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PAtom CoorManager::GetAtom ( int modelNo, // model serial number 1... int chNo, // chain number 0... int resNo, // residue number 0... int atomNo // atom number 0... ) { PModel mdl; PChain chn; PResidue res; PAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } if ((0<=chNo) && (chNonChains)) chn = mdl->chain[chNo]; else chn = NULL; if (!chn) { CoorIDCode = CID_NoChain; return NULL; } if ((0<=resNo) && (resNonResidues)) res = chn->residue[resNo]; else res = NULL; if (!res) { CoorIDCode = CID_NoResidue; return NULL; } if ((0<=atomNo) && (atomNonAtoms)) atm = res->atom[atomNo]; else atm = NULL; if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PAtom CoorManager::GetAtom ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_Incomplete)) { CoorIDCode = CID_WrongPath; return NULL; } return GetAtom ( modno,chname,sn,ic,aname,elname,aloc ); } void CoorManager::GetAtomTable ( PPAtom & atomTable, int & NumberOfAtoms ) { atomTable = atom; NumberOfAtoms = nAtoms; } void CoorManager::GetAtomTable ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0GetResidue ( chainID,seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } } } void CoorManager::GetAtomTable ( int modelNo, int chainNo, int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0GetResidue ( chainNo,seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } } } void CoorManager::GetAtomTable ( int modelNo, const ChainID chainID, int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0GetResidue ( chainID,resNo ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } } } void CoorManager::GetAtomTable ( int modelNo, int chainNo, int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0GetResidue ( chainNo,resNo ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } } } void CoorManager::GetAtomTable ( cpstr CID, PPAtom & atomTable, int & NumberOfAtoms ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PResidue res; atomTable = NULL; NumberOfAtoms = 0; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode))) { CoorIDCode = CID_WrongPath; return; } res = GetResidue ( modno,chname,sn,ic ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void CoorManager::GetAtomTable1 ( PPAtom & atomTable, int & NumberOfAtoms ) { int i,j; if (atomTable) delete[] atomTable; if (nAtoms>0) { atomTable = new PAtom[nAtoms]; j = 0; for (i=0;iTer) atomTable[j++] = atom[i]; } NumberOfAtoms = j; } else { atomTable = NULL; NumberOfAtoms = 0; } } void CoorManager::GetAtomTable1 ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = NULL; if ((0GetResidue ( chainID,seqNo,insCode ); } if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CoorManager::GetAtomTable1 ( int modelNo, int chainNo, int seqNo, const InsCode insCode, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = NULL; if ((0GetResidue ( chainNo,seqNo,insCode ); } if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CoorManager::GetAtomTable1 ( int modelNo, const ChainID chainID, int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = NULL; if ((0GetResidue ( chainID,resNo ); } if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CoorManager::GetAtomTable1 ( int modelNo, int chainNo, int resNo, PPAtom & atomTable, int & NumberOfAtoms ) { PResidue res; res = NULL; if ((0GetResidue ( chainNo,resNo ); } if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CoorManager::GetAtomTable1 ( cpstr CID, PPAtom & atomTable, int & NumberOfAtoms ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PResidue res; atomTable = NULL; NumberOfAtoms = 0; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode))) { CoorIDCode = CID_WrongPath; return; } res = GetResidue ( modno,chname,sn,ic ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } int CoorManager::DeleteAtom ( int modelNo, const ChainID chID, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAtom ( chID,seqNo,insCode, aname,elmnt,aloc ); } return 0; } int CoorManager::DeleteAtom ( int modelNo, const ChainID chID, int seqNo, const InsCode insCode, int atomNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAtom ( chID,seqNo,insCode,atomNo ); } return 0; } int CoorManager::DeleteAtom ( int modelNo, const ChainID chID, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAtom ( chID,resNo, aname,elmnt,aloc ); } return 0; } int CoorManager::DeleteAtom ( int modelNo, const ChainID chID, int resNo, int atomNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAtom ( chID,resNo,atomNo ); } return 0; } int CoorManager::DeleteAtom ( int modelNo, int chNo, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAtom ( chNo,seqNo,insCode, aname,elmnt,aloc ); } return 0; } int CoorManager::DeleteAtom ( int modelNo, int chNo, int seqNo, const InsCode insCode, int atomNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAtom ( chNo,seqNo,insCode,atomNo ); } return 0; } int CoorManager::DeleteAtom ( int modelNo, int chNo, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAtom ( chNo,resNo, aname,elmnt,aloc ); } return 0; } int CoorManager::DeleteAtom ( int modelNo, int chNo, int resNo, int atomNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAtom ( chNo,resNo,atomNo ); } return 0; } int CoorManager::DeleteAllAtoms ( int modelNo, const ChainID chID, int seqNo, const InsCode insCode ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllAtoms ( chID,seqNo,insCode ); } return 0; } int CoorManager::DeleteAllAtoms ( int modelNo, const ChainID chID, int resNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllAtoms ( chID,resNo ); } return 0; } int CoorManager::DeleteAllAtoms ( int modelNo, const ChainID chID ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllAtoms ( chID ); } return 0; } int CoorManager::DeleteAllAtoms ( int modelNo, int chNo, int seqNo, const InsCode insCode ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllAtoms ( chNo,seqNo,insCode ); } return 0; } int CoorManager::DeleteAllAtoms ( int modelNo, int chNo, int resNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllAtoms ( chNo,resNo ); } return 0; } int CoorManager::DeleteAllAtoms ( int modelNo, int chNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllAtoms ( chNo ); } return 0; } int CoorManager::DeleteAllAtoms ( int modelNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->DeleteAllAtoms(); } return 0; } int CoorManager::DeleteAllAtoms() { int i,k; k = 0; for (i=0;iDeleteAllAtoms(); return k; } /* int CoorManager::DeleteAltLocs() { // This function leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted atoms and optimizes // the atom index. ChainID chID; ResName rName; InsCode iCode; AtomName aname; AltLoc aLoc,aL; realtype occupancy,occ; int seqNum; int i,j,k,i1,i2,n; k = 0; n = 0; i = 0; while (iGetSeqNum (); occupancy = atom[i]->GetOccupancy(); strcpy ( chID ,atom[i]->GetChainID() ); strcpy ( rName,atom[i]->GetResName() ); strcpy ( iCode,atom[i]->GetInsCode() ); strcpy ( aname,atom[i]->name ); strcpy ( aLoc ,atom[i]->altLoc ); j = i+1; i1 = -1; i2 = i; while (jGetSeqNum()==seqNum) && (!strcmp(atom[j]->name,aname)) && (!strcmp(atom[j]->GetInsCode(),iCode)) && (!strcmp(atom[j]->GetResName(),rName)) && (!strcmp(atom[j]->GetChainID(),chID ))) { occ = atom[j]->GetOccupancy(); if (occ>occupancy) { occupancy = occ; i1 = j; } if (aLoc[0]) { strcpy ( aL,atom[j]->altLoc ); if (!aL[0]) { aLoc[0] = char(0); i2 = j; } else if (strcmp(aL,aLoc)<0) { strcpy ( aLoc,aL ); i2 = j; } } j++; } else break; } else j++; if (i1<0) { if (atom[i]->WhatIsSet & ASET_Occupancy) i1 = i; else i1 = i2; } while (iindex = k+1; } k++; } } i++; } } else i++; } nAtoms = k; return n; } */ int CoorManager::DeleteAltLocs() { // This function leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted atoms. All tables // remain untrimmed, so that explicit trimming or calling // FinishStructEdit() at some point is required. int i,n; n = 0; for (i=0;iDeleteAltLocs(); return n; } int CoorManager::AddAtom ( int modelNo, const ChainID chID, int seqNo, const InsCode insCode, PAtom atom ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->AddAtom ( chID,seqNo,insCode,atom ); } return 0; } int CoorManager::AddAtom ( int modelNo, const ChainID chID, int resNo, PAtom atom ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->AddAtom ( chID,resNo,atom ); } return 0; } int CoorManager::AddAtom ( int modelNo, int chNo, int seqNo, const InsCode insCode, PAtom atom ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->AddAtom ( chNo,seqNo,insCode,atom ); } return 0; } int CoorManager::AddAtom ( int modelNo, int chNo, int resNo, PAtom atom ) { if ((modelNo>0) && (modelNo<=nModels)) { if (model[modelNo-1]) return model[modelNo-1]->AddAtom ( chNo,resNo,atom ); } return 0; } void CoorManager::RemoveBricks() { int i,j,k; if (brick) { for (i=0;ix-xbrick_0)/brick_size); ny = (int)floor((A->y-ybrick_0)/brick_size); nz = (int)floor((A->z-zbrick_0)/brick_size); if ((ny<0) || (nz<0) || (nx>=nbrick_x) || (ny>=nbrick_y) || (nz>=nbrick_z)) nx = -1; } void CoorManager::GetBrickCoor ( realtype x, realtype y, realtype z, int & nx, int & ny, int & nz ) { nx = (int)floor((x-xbrick_0)/brick_size); ny = (int)floor((y-ybrick_0)/brick_size); nz = (int)floor((z-zbrick_0)/brick_size); if ((ny<0) || (nz<0) || (nx>=nbrick_x) || (ny>=nbrick_y) || (nz>=nbrick_z)) nx = -1; } void CoorManager::GetBrickCoor ( vect3 & xyz, int & nx, int & ny, int & nz ) { nx = (int)floor((xyz[0]-xbrick_0)/brick_size); ny = (int)floor((xyz[1]-ybrick_0)/brick_size); nz = (int)floor((xyz[2]-zbrick_0)/brick_size); if ((ny<0) || (nz<0) || (nx>=nbrick_x) || (ny>=nbrick_y) || (nz>=nbrick_z)) nx = -1; } void CoorManager::GetBrickDimension ( int & nxmax, int & nymax, int & nzmax ) { if (!brick) { nxmax = 0; nymax = 0; nzmax = 0; } else { nxmax = nbrick_x; nymax = nbrick_y; nzmax = nbrick_z; } } PBrick CoorManager::GetBrick ( int nx, int ny, int nz ) { if (!brick) return NULL; if ((nx>=0) && (nx=0) && (ny=0) && (nz0) { // find the range of coordinates x1 = MaxReal; x2 = -x1; y1 = MaxReal; y2 = -y1; z1 = MaxReal; z2 = -z1; for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { if (A[i]->xx; if (A[i]->x>x2) x2 = A[i]->x; if (A[i]->yy; if (A[i]->y>y2) y2 = A[i]->y; if (A[i]->zz; if (A[i]->z>z2) z2 = A[i]->z; } } if (x1Ter) && (A[i]->WhatIsSet & ASET_Coordinates)) { GetBrickCoor ( A[i],nx,ny,nz ); if (nx>=0) { if (!brick) { brick = new PPPBrick[nbrick_x]; for (j=0;jAddAtom ( A[i],i ); } else printf ( " error in " "CoorManager::MakeBricks!!!\n" ); } } } } } void CoorManager::RemoveMBricks() { int i,j,k; if (mbrick) { for (i=0;ix-xmbrick_0)/mbrick_size); ny = (int)floor((A->y-ymbrick_0)/mbrick_size); nz = (int)floor((A->z-zmbrick_0)/mbrick_size); if ((ny<0) || (nz<0) || (nx>=nmbrick_x) || (ny>=nmbrick_y) || (nz>=nmbrick_z)) nx = -nx-1; } void CoorManager::GetMBrickCoor ( realtype x, realtype y, realtype z, int & nx, int & ny, int & nz ) { nx = (int)floor((x-xmbrick_0)/mbrick_size); ny = (int)floor((y-ymbrick_0)/mbrick_size); nz = (int)floor((z-zmbrick_0)/mbrick_size); if ((ny<0) || (nz<0) || (nx>=nmbrick_x) || (ny>=nmbrick_y) || (nz>=nmbrick_z)) nx = -nx-1; } void CoorManager::GetMBrickDimension ( int & nxmax, int & nymax, int & nzmax ) { if (!brick) { nxmax = 0; nymax = 0; nzmax = 0; } else { nxmax = nmbrick_x; nymax = nmbrick_y; nzmax = nmbrick_z; } } PMBrick CoorManager::GetMBrick ( int nx, int ny, int nz ) { if (!mbrick) return NULL; if ((nx>=0) && (nx=0) && (ny=0) && (nzTer) && (A->WhatIsSet & ASET_Coordinates)) { if (A->xx; if (A->x>x2) x2 = A->x; if (A->yy; if (A->y>y2) y2 = A->y; if (A->zz; if (A->z>z2) z2 = A->z; } } } if (x1Ter) && (A->WhatIsSet & ASET_Coordinates)) { GetMBrickCoor ( A,nx,ny,nz ); if (nx>=0) { if (!mbrick) { mbrick = new PPPMBrick[nmbrick_x]; for (k=0;kAddAtom ( A,i,j ); } else printf ( " error in " "CoorManager::MakeMBricks!!!\n" ); } } } } } int CoorManager::GenerateSymMates ( PGenSym genSym ) { // // The function generates symmetry mates according to symmetry // operations found in GenSym. Results of first symmetry operation // (number 0) always replaces the existing set of atoms, others // are added as additional sets. // If GenSym is set to NULL, the function generates all // symmetry mates for the unit cell taking the symmetry information // from cryst.SymOps. // The newly generated chains are added to each model. These // chains have many-character chain names, composed as 'x_n', // where 'x' is the original name and 'n' is a unique number, which // coincides with the symmetry operation (order) number; number '_0' // (for the very first symmetry operatyion) is missing. Another // side effect is the disorder in atoms' serial numbers. // The hierarchy should therefore be cleaned after // generating the symmetry mates. An appropriate way to do // that is to issue the following call: // // PDBCleanup ( PDBCLEAN_TER | PDBCLEAN_ALTCODE_STRONG | // PDBCLEAN_CHAIN_STRONG | PDBCLEAN_SERIAL ); // PPCoorManager Mate; int i,j,k,n,nMates,nMates1,nAtoms1; PPAtom Atom1; PPModel Model1; if (genSym) nMates = genSym->GetNofSymOps(); else nMates = cryst.GetNumberOfSymOps(); if (nMates<=0) return GSM_NoSymOps; if (!cryst.areMatrices()) return GSM_NoTransfMatrices; if (!cryst.isCellParameters()) return GSM_NoCell; nMates1 = nMates-1; if (nMates1>0) { // Generate symmetry mates in parallel hierarchies Mate = new PCoorManager[nMates1]; for (i=0;iCopy ( this ); Mate[i]->ApplySymTransform ( i+1,genSym ); } // apply 1st symmetry operation: if (genSym) ApplySymTransform ( 0,genSym ); // Gather all symmetry mates in 'this' hierarchy nAtoms1 = nMates*nAtoms; // new number of atoms Atom1 = new PAtom[nAtoms1]; // new array of atoms if (nModels>0) Model1 = new PModel[nModels]; // new array of else Model1 = NULL; // models k = 0; // index of collected atoms for (i=0;iSetMMDBManager ( PManager(this),i+1 ); for (j=0;jnChains;j++) Model1[i]->MoveChain ( model[i]->chain[j],atom,Atom1,k,0 ); for (n=0;nnChains;j++) Model1[i]->MoveChain ( Mate[n]->model[i]->chain[j], Mate[n]->atom,Atom1,k,n+1 ); } else Model1[i] = NULL; if (model) delete[] model; model = Model1; for (i=0;iTer) atom[i]->Transform ( TMatrix ); } } void CoorManager::ApplySymTransform ( int SymOpNo, PGenSym genSym ) { // This procedure applies the symmetry operation number SymOpNo // (starting from 0 on) and renames chains as specified in // GenSym. // The chains don't have to be renamed. The number of chains // to be renamed is obtained as GenSym->nChains[SymOpNo], their // old names - as GenSym->chID1[SymOpNo][j], and their new names // - as GenSym->chID2[SymOpNo][j], 0<=jnChains[SymOpNo]. mat44 tmat; int i,j,k,nChn; PPChain chain; if (cryst.GetTMatrix(tmat,SymOpNo,0,0,0,PSymOps(genSym)) ==SYMOP_Ok) { for (i=0;iTer) atom[i]->Transform ( tmat ); } if (genSym) for (i=0;iGetChainTable ( chain,nChn ); for (j=0;jnChains[SymOpNo];j++) for (k=0;kchainID,genSym->chID1[SymOpNo][j])) chain[k]->SetChainID ( genSym->chID2[SymOpNo][j] ); } } } void GetEulerRotMatrix ( mat33 & erm, realtype alpha, realtype beta, realtype gamma ) { // Calculates the Euler rotation matrix for rotation: // 1) about z-axis by angle alpha (0..2*Pi) // 2) about new y-axis by angle beta (0..Pi) // 3) about new z-axis by angle gamma (0..2*Pi) realtype ca,cb,cg, sa,sb,sg; ca = cos(alpha); sa = sin(alpha); cb = cos(beta); sb = sin(beta); cg = cos(gamma); sg = sin(gamma); erm[0][0] = ca*cb*cg - sa*sg; erm[0][1] = cb*cg*sa + ca*sg; erm[0][2] = -cg*sb; erm[1][0] = -cg*sa - ca*cb*sg; erm[1][1] = ca*cg - cb*sa*sg; erm[1][2] = sb*sg; erm[2][0] = ca*sb; erm[2][1] = sa*sb; erm[2][2] = cb; } void GetEulerTMatrix ( mat44 & erm, realtype alpha, realtype beta, realtype gamma, realtype x0, realtype y0, realtype z0 ) { // Calculates the Euler rotation-translation matrix for rotation: // 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma // Point (x0,y0,z0) is the center of rotation. mat33 m; m[0][0] = 1.0; GetEulerRotMatrix ( m,alpha,beta,gamma ); erm[0][0] = m[0][0]; erm[0][1] = m[0][1]; erm[0][2] = m[0][2]; erm[1][0] = m[1][0]; erm[1][1] = m[1][1]; erm[1][2] = m[1][2]; erm[2][0] = m[2][0]; erm[2][1] = m[2][1]; erm[2][2] = m[2][2]; erm[3][0] = 0.0; erm[3][1] = 0.0; erm[3][2] = 0.0; erm[3][3] = 1.0; erm[0][3] = x0 - m[0][0]*x0 - m[0][1]*y0 - m[0][2]*z0; erm[1][3] = y0 - m[1][0]*x0 - m[1][1]*y0 - m[1][2]*z0; erm[2][3] = z0 - m[2][0]*x0 - m[2][1]*y0 - m[2][2]*z0; } void EulerRotation ( PPAtom A, int nA, realtype alpha, realtype beta, realtype gamma, realtype x0, realtype y0, realtype z0 ) { // Euler rotation: 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma // Point (x0,y0,z0) is the center of rotation. mat33 m; realtype x,y,z; int i; m[0][0] = 1.0; GetEulerRotMatrix ( m,alpha,beta,gamma ); for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { x = A[i]->x - x0; y = A[i]->y - y0; z = A[i]->z - z0; A[i]->x = m[0][0]*x + m[0][1]*y + m[0][2]*z + x0; A[i]->y = m[1][0]*x + m[1][1]*y + m[1][2]*z + y0; A[i]->z = m[2][0]*x + m[2][1]*y + m[2][2]*z + z0; } } } void GetVecRotMatrix ( mat33 & vrm, realtype alpha, realtype vx, realtype vy, realtype vz ) { // Calculates the rotation matrix for rotation by angle alpha about // arbitrary vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). realtype ca,sa, rx,ry,rz, vl; ca = cos(alpha); sa = sin(alpha); vl = sqrt ( vx*vx + vy*vy + vz*vz ); if (vl<=0.0) return; rx = vx/vl; ry = vy/vl; rz = vz/vl; vrm[0][0] = rx*rx*(1.0-ca) + ca; vrm[0][1] = rx*ry*(1.0-ca) - rz*sa; vrm[0][2] = rx*rz*(1.0-ca) + ry*sa; vrm[1][0] = ry*rx*(1.0-ca) + rz*sa; vrm[1][1] = ry*ry*(1.0-ca) + ca; vrm[1][2] = ry*rz*(1.0-ca) - rx*sa; vrm[2][0] = rz*rx*(1.0-ca) - ry*sa; vrm[2][1] = rz*ry*(1.0-ca) + rx*sa; vrm[2][2] = rz*rz*(1.0-ca) + ca; } void GetRotParameters ( mat33 & vrm, realtype & alpha, realtype & vx, realtype & vy, realtype & vz ) { // Given the rotation matrix vrm, GetRotParameters(..) // returns the rotation angle alpha and the normalized // rotation axis vector (vx,vy,vz). // The rotation angle and vector are determined up to // their sign (however correlated, so that being substituted // into GetVecRotMatrix(..) they yield the same rotation // matrix). // The function does not check for vrm to be a valid // rotation matrix. realtype ca,sa,vl; ca = (vrm[0][0]+vrm[1][1]+vrm[2][2]-1.0)/2.0; if (ca<-1.0) ca = -1.0; // does not work if rotation if (ca>1.0) ca = 1.0; // matrix is correct sa = sqrt(1.0-ca*ca); if (sa>0.0) { alpha = acos(ca); // coefficient of 2 is corrected by normalization below vx = (vrm[2][1]-vrm[1][2])/sa; vy = (vrm[0][2]-vrm[2][0])/sa; vz = (vrm[1][0]-vrm[0][1])/sa; // the following code is formally redundant if rotation // matrix is correct, however it eliminates the round-offs vl = sqrt(vx*vx+vy*vy+vz*vz); vx /= vl; vy /= vl; vz /= vl; } else { // zero rotation, arbitrary axis would do alpha = 0.0; vx = 1.0; vy = 0.0; vz = 0.0; } } void GetVecTMatrix ( mat44 & vrm, realtype alpha, realtype vx, realtype vy, realtype vz, realtype x0, realtype y0, realtype z0 ) { // Calculates the rotation-translation matrix for rotation by angle // alpha about arbitrary vector directed as (vx,vy,vz) = // (vx2-vx1,vy2-vy1,vz2-vz1). Point (x0,y0,z0) is the center of // rotation -- actually a point belonging to the rotation axis. mat33 m; GetVecRotMatrix ( m,alpha,vx,vy,vz ); vrm[0][0] = m[0][0]; vrm[0][1] = m[0][1]; vrm[0][2] = m[0][2]; vrm[1][0] = m[1][0]; vrm[1][1] = m[1][1]; vrm[1][2] = m[1][2]; vrm[2][0] = m[2][0]; vrm[2][1] = m[2][1]; vrm[2][2] = m[2][2]; vrm[3][0] = 0.0; vrm[3][1] = 0.0; vrm[3][2] = 0.0; vrm[3][3] = 1.0; vrm[0][3] = x0 - m[0][0]*x0 - m[0][1]*y0 - m[0][2]*z0; vrm[1][3] = y0 - m[1][0]*x0 - m[1][1]*y0 - m[1][2]*z0; vrm[2][3] = z0 - m[2][0]*x0 - m[2][1]*y0 - m[2][2]*z0; } void VectorRotation ( PPAtom A, int nA, realtype alpha, realtype vx, realtype vy, realtype vz, realtype x0, realtype y0, realtype z0 ) { // Vector rotation is rotation by angle alpha about arbitrary // vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). // Point (x0,y0,z0) is the center of rotation -- actually // a point belonging to the rotation axis. mat33 m; realtype x,y,z; int i; GetVecRotMatrix ( m, alpha,vx,vy,vz ); for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { x = A[i]->x - x0; y = A[i]->y - y0; z = A[i]->z - z0; A[i]->x = m[0][0]*x + m[0][1]*y + m[0][2]*z + x0; A[i]->y = m[1][0]*x + m[1][1]*y + m[1][2]*z + y0; A[i]->z = m[2][0]*x + m[2][1]*y + m[2][2]*z + z0; } } } void GetMassCenter ( PPAtom A, int nA, realtype & xmc, realtype & ymc, realtype & zmc ) { realtype w,mass; int i,k; xmc = 0.0; ymc = 0.0; zmc = 0.0; mass = 0.0; for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { k = getElementNo ( A[i]->element ); if (k>=0) w = MolecWeight[k]; else w = 1.0; xmc += w*A[i]->x; ymc += w*A[i]->y; zmc += w*A[i]->z; mass += w; } } if (mass>0.0) { xmc /= mass; ymc /= mass; zmc /= mass; } } int CoorManager::BringToUnitCell() { // brings all chains into 0th unit cell PChain chain; PPAtom atom; realtype x0,y0,z0, x,y,z, xf,yf,zf, sx,sy,sz; realtype dx,dy,dz, d,d0; int nAtoms; int i,j,k,n,m,nt, ic,jc,kc, is,js,ks; if (!cryst.areMatrices()) return -1; is = 0; // this is only js = 0; // to depress ks = 0; // "uninitialized" worning cryst.Frac2Orth ( 0.5,0.5,0.5, x0,y0,z0 ); nt = 0; for (i=0;inChains;j++) { chain = model[i]->chain[j]; if (chain) { x = 0.0; y = 0.0; z = 0.0; m = 0; for (k=0;knResidues;k++) if (chain->residue[k]) { chain->residue[k]->GetAtomTable ( atom,nAtoms ); for (n=0;nTer) { x += atom[n]->x; y += atom[n]->y; z += atom[n]->z; m++; } } } x /= m; y /= m; z /= m; cryst.Orth2Frac ( x,y,z, xf,yf,zf ); sx = frac ( xf ); sy = frac ( yf ); sz = frac ( zf ); d0 = MaxReal; for (ic=-3;ic<3;ic++) for (jc=-3;jc<3;jc++) for (kc=-3;kc<3;kc++) { cryst.Frac2Orth ( sx+ic,sy+jc,sz+kc, dx,dy,dz ); dx -= x0; dy -= y0; dz -= z0; d = dx*dx + dy*dy + dz*dz; if (d1.0e-10) || (fabs(sy)>1.0e-10) || (fabs(sz)>1.0e-10)) { nt++; for (k=0;knResidues;k++) if (chain->residue[k]) { chain->residue[k]->GetAtomTable ( atom,nAtoms ); for (n=0;nTer) { cryst.Orth2Frac ( atom[n]->x,atom[n]->y, atom[n]->z, xf,yf,zf ); cryst.Frac2Orth ( xf-sx,yf-sy,zf-sz, atom[n]->x,atom[n]->y, atom[n]->z ); } } } } } } } return nt; // number of converted chains } bool CoorManager::Frac2Orth ( realtype xfrac, realtype yfrac, realtype zfrac, realtype & xorth, realtype & yorth, realtype & zorth ) { return cryst.Frac2Orth ( xfrac,yfrac,zfrac, xorth,yorth,zorth ); } bool CoorManager::Orth2Frac ( realtype xorth, realtype yorth, realtype zorth, realtype & xfrac, realtype & yfrac, realtype & zfrac ) { return cryst.Orth2Frac ( xorth,yorth,zorth, xfrac,yfrac,zfrac ); } bool CoorManager::Frac2Orth ( mat44 & F, mat44 & T ) { return cryst.Frac2Orth ( F,T ); } bool CoorManager::Orth2Frac ( mat44 & T, mat44 & F ) { return cryst.Orth2Frac ( T,F ); } // ------------------------ Contacts ------------------------------- #define CA_CA_Dist2 16.0 void CoorManager::FindSeqSection ( PAtom atom, int seqDist, int & seq1, int & seq2 ) { PAtom a; PResidue res; PChain chain; realtype x0,y0,z0, x,y,z, dx,dy,dz, d2; int i1; bool B0,B; x = 0.0; y = 0.0; z = 0.0; x0 = 0.0; y0 = 0.0; z0 = 0.0; res = atom->residue; if ((!res) || (seqDist<=0)) { seq1 = MaxInt4; seq2 = MinInt4; return; } chain = res->chain; if (!chain) { seq1 = MaxInt4; seq2 = MinInt4; return; } if (seqDist==1) { seq1 = res->index; seq2 = seq1; return; } a = res->GetAtom ( pstr("CA"),pstr("C"),NULL ); if (a) { x0 = a->x; y0 = a->y; z0 = a->z; B0 = true; } else B0 = false; if (B0) { x = x0; y = y0; z = z0; } B = B0; seq2 = res->index; i1 = IMin(chain->nResidues,seq2+seqDist)-1; while (seq2residue[seq2]) { a = chain->residue[seq2]->GetAtom ( pstr("CA"),pstr("C"),NULL ); if (a && B) { dx = x-a->x; dy = y-a->y; dz = z-a->z; d2 = dx*dx + dy*dy + dz*dz; if (d2>CA_CA_Dist2) { seq2--; break; } } if (a) { x = a->x; y = a->y; z = a->z; B = true; } else B = false; } } if (B0) { x = x0; y = y0; z = z0; } B = B0; seq1 = res->index; i1 = IMax(0,seq1-seqDist+1); while (seq1>i1) { seq1--; if (chain->residue[seq1]) { a = chain->residue[seq1]->GetAtom ( pstr("CA"),pstr("C"),NULL ); if (a && B) { dx = x-a->x; dy = y-a->y; dz = z-a->z; d2 = dx*dx + dy*dy + dz*dz; if (d2>CA_CA_Dist2) { seq1++; break; } } if (a) { x = a->x; y = a->y; z = a->z; B = true; } else B = false; } } } bool CoorManager::iContact ( PAtom a1, PAtom a2, int seq1, int seq2, realtype dd, realtype d12, realtype d22, realtype & d2 ) { // seq1..seq2 is forbidden region for residue sequence numbers PResidue res1,res2; PChain chain1,chain2; realtype dx,dy,dz; if (a2->Ter) return false; dx = fabs(a2->x-a1->x); if (dx<=dd) { dy = fabs(a2->y-a1->y); if (dy<=dd) { dz = fabs(a2->z-a1->z); if (dz<=dd) { d2 = dx*dx + dy*dy + dz*dz; if ((d12<=d2) && (d2<=d22)) { if (seq1<=seq2) { res1 = a1->residue; res2 = a2->residue; if (res1 && res2) { chain1 = res1->chain; chain2 = res2->chain; if (chain1 && chain2) { if (!strcmp(chain1->chainID,chain2->chainID)) { if ((seq1<=res2->index) && (res2->index<=seq2)) return false; } } } } return true; } } } } return false; } bool CoorManager::iContact ( realtype x, realtype y, realtype z, PAtom a2, realtype dd, realtype d12, realtype d22, realtype & d2 ) { realtype dx,dy,dz; if (a2->Ter) return false; dx = fabs(a2->x-x); if (dx<=dd) { dy = fabs(a2->y-y); if (dy<=dd) { dz = fabs(a2->z-z); if (dz<=dd) { d2 = dx*dx + dy*dy + dz*dz; if ((d12<=d2) && (d2<=d22)) return true; } } } return false; } void CoorManager::SeekContacts ( PPAtom AIndex, int ilen, int atomNum, realtype dist1, realtype dist2, int seqDist, RPContact contact, int & ncontacts, int maxlen, long group ) { PContactIndex contactIndex; realtype d12,d22,d2; int i,seq1,seq2; if (!AIndex) return; if (dist2Ter) return; contactIndex = new ContactIndex ( contact,maxlen,ncontacts,ilen ); FindSeqSection ( AIndex[atomNum],seqDist,seq1,seq2 ); d12 = dist1*dist1; d22 = dist2*dist2; for (i=0;iAddContact ( atomNum,i,sqrt(d2),group ); } contactIndex->GetIndex ( contact,ncontacts ); delete contactIndex; } void CoorManager::SeekContacts ( PAtom A, PPAtom AIndex, int ilen, realtype dist1, realtype dist2, int seqDist, RPContact contact, int & ncontacts, int maxlen, long group ) { PContactIndex contactIndex; realtype d12,d22,d2; int i,seq1,seq2; if (!AIndex) return; if (dist2Ter) return; contactIndex = new ContactIndex ( contact,maxlen,ncontacts,ilen ); FindSeqSection ( A,seqDist,seq1,seq2 ); d12 = dist1*dist1; d22 = dist2*dist2; for (i=0;iAddContact ( -1,i,sqrt(d2),group ); } contactIndex->GetIndex ( contact,ncontacts ); delete contactIndex; } void CoorManager::SeekContacts ( PPAtom AIndex1, int ilen1, PPAtom AIndex2, int ilen2, realtype dist1, realtype dist2, int seqDist, RPContact contact, int & ncontacts, int maxlen, mat44 * TMatrix, long group, int bricking, bool doSqrt ) { // It is Ok to have NULL pointers in AIndex1 and AIndex2 PContactIndex contactIndex; PPAtom A1,A2; rvector sx0,sy0,sz0; rvector dx0,dy0,dz0; realtype d12,d22,d2, eps; int l1,l2, i,j, nx,ny,nz, dn; int ix1,ix2, iy1,iy2, iz1,iz2, ix,iy,iz; int seq1,seq2; PBrick B; bool swap,UnitT; if ((dist2x; sy0[i] = AIndex1[i]->y; sz0[i] = AIndex1[i]->z; } // Save original AIndex2 coordinates and modify the index GetVectorMemory ( dx0,ilen2,0 ); GetVectorMemory ( dy0,ilen2,0 ); GetVectorMemory ( dz0,ilen2,0 ); for (i=0;ix; dy0[i] = AIndex2[i]->y; dz0[i] = AIndex2[i]->z; AIndex2[i]->Transform ( *TMatrix ); } } } // choose A2 as the largest atom set convenient for // bricking (bricking on larger set is more efficient) if (bricking & BRICK_ON_1) { A1 = AIndex2; A2 = AIndex1; l1 = ilen2; l2 = ilen1; swap = true; } else if (bricking & BRICK_ON_2) { A1 = AIndex1; A2 = AIndex2; l1 = ilen1; l2 = ilen2; swap = false; } else if (ilen1<=ilen2) { A1 = AIndex1; A2 = AIndex2; l1 = ilen1; l2 = ilen2; swap = false; } else { A1 = AIndex2; A2 = AIndex1; l1 = ilen2; l2 = ilen1; swap = true; } d12 = dist1*dist1; d22 = dist2*dist2; if (((bricking & BRICK_READY)==0) || (!brick)) MakeBricks ( A2,l2,dist2*1.5 ); dn = mround(dist2/brick_size)+1; if (brick) for (i=0;iTer) { if (UnitT) { // No transformation -- AIndex1 and AIndex2 are unmodified. // Calculate the forbidden sequence region FindSeqSection ( A1[i],seqDist,seq1,seq2 ); // And the brick location GetBrickCoor ( A1[i],nx,ny,nz ); } else { // AIndex2 and AIndex1 are modified, but the sequence // distance does not apply to physically different chains // (meaning that transformation of A2 effectively makes // a different chain). Use unmodified atom coordinates // of 1st set for calculating the brick location. if (swap) GetBrickCoor ( A1[i],nx,ny,nz ); // A1 is AIndex2 else GetBrickCoor ( sx0[i],sy0[i],sz0[i],nx,ny,nz ); } if (nx>=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); if (UnitT) { // AIndex1 unmodified, use it for (ix=ix1;ixnAtoms;j++) if (B->atom[j]!=A1[i]) { if (iContact(A1[i],B->atom[j],seq1,seq2, dist2,d12,d22,d2)) { if (doSqrt) d2 = sqrt(d2); if (swap) contactIndex->AddContact ( B->id[j],i,d2,group ); else contactIndex->AddContact ( i,B->id[j],d2,group ); } } } } else if (swap) { // A1 stands for AIndex2, it is modified and we need to use // the modified coordinates for (ix=ix1;ixnAtoms;j++) if (iContact(A1[i]->x,A1[i]->y,A1[i]->z, B->atom[j], dist2,d12,d22,d2)) { if (doSqrt) d2 = sqrt(d2); contactIndex->AddContact ( B->id[j],i,d2,group ); } } } else { // A1 stands for AIndex1, it may be modified (if AIndex1 // and AIndex2 overlap) -- use its unmodified coordinates // instead. for (ix=ix1;ixnAtoms;j++) if (iContact(sx0[i],sy0[i],sz0[i], B->atom[j],dist2,d12,d22,d2)) { if (doSqrt) d2 = sqrt(d2); contactIndex->AddContact ( i,B->id[j],d2,group ); } } } } } } if (!UnitT) { // restore original coordinates for (i=0;ix = sx0[i]; AIndex1[i]->y = sy0[i]; AIndex1[i]->z = sz0[i]; } for (i=0;ix = dx0[i]; AIndex2[i]->y = dy0[i]; AIndex2[i]->z = dz0[i]; } FreeVectorMemory ( sx0,0 ); FreeVectorMemory ( sy0,0 ); FreeVectorMemory ( sz0,0 ); FreeVectorMemory ( dx0,0 ); FreeVectorMemory ( dy0,0 ); FreeVectorMemory ( dz0,0 ); } contactIndex->GetIndex ( contact,ncontacts ); delete contactIndex; } void CoorManager::SeekContacts ( PPAtom AIndex1, int ilen1, PPAtom AIndex2, int ilen2, realtype contDist, PContact contact, int & ncontacts, int bricking ) { // Simplified optimized for speed version: // - no NULL pointers and Ters in AIndex1 and AIndex2 // - no checks for identity atoms in AIndex1 and AIndex2 // - contact must be pre-allocated with at least ilen1*ilen2 elements // - contact returns square distances // - ncontacts is always reset PPAtom A1,A2; realtype contDist2, dx,dy,dz, d2; int l1,l2, i,j, nx,ny,nz, dn; int ix1,ix2, iy1,iy2, iz1,iz2, ix,iy,iz; PBrick B; bool swap; // choose A2 as the largest atom set convenient for // bricking (bricking on larger set is more efficient) if (bricking & BRICK_ON_1) { A1 = AIndex2; A2 = AIndex1; l1 = ilen2; l2 = ilen1; swap = true; } else if (bricking & BRICK_ON_2) { A1 = AIndex1; A2 = AIndex2; l1 = ilen1; l2 = ilen2; swap = false; } else if (ilen1<=ilen2) { A1 = AIndex1; A2 = AIndex2; l1 = ilen1; l2 = ilen2; swap = false; } else { A1 = AIndex2; A2 = AIndex1; l1 = ilen2; l2 = ilen1; swap = true; } contDist2 = contDist*contDist; if (((bricking & BRICK_READY)==0) || (!brick)) MakeBricks ( A2,l2,contDist*1.5 ); ncontacts = 0; if (!brick) return; dn = (int)floor(contDist/brick_size)+1; if (swap) { for (i=0;i=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); for (ix=ix1;ixnAtoms;j++) { dx = A1[i]->x - B->atom[j]->x; dy = A1[i]->y - B->atom[j]->y; dz = A1[i]->z - B->atom[j]->z; d2 = dx*dx + dy*dy + dz*dz; if (d2<=contDist2) { contact[ncontacts].id1 = B->id[j]; contact[ncontacts].id2 = i; contact[ncontacts].dist = d2; ncontacts++; } } } } } } else { for (i=0;i=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); for (ix=ix1;ixnAtoms;j++) { dx = A1[i]->x - B->atom[j]->x; dy = A1[i]->y - B->atom[j]->y; dz = A1[i]->z - B->atom[j]->z; d2 = dx*dx + dy*dy + dz*dz; if (d2<=contDist2) { contact[ncontacts].id1 = i; contact[ncontacts].id2 = B->id[j]; contact[ncontacts].dist = d2; ncontacts++; } } } } } } } void CoorManager::SeekContacts ( vect3 * xyz, int nxyz, realtype contDist, PContact contact, int & ncontacts ) { // Simplified optimized for speed and convenience version: // - bricking is pre-done // - contacting set of atoms is given as a bare vect3 (xyz) // coordinate vector // - no checks for identity atoms // - contact must be pre-allocated with at least ilen1*ilen2 // elements // - contact returns square distances // - ncontacts is always reset realtype contDist2, dx,dy,dz, d2; int i,j, nx,ny,nz, dn; int ix1,ix2, iy1,iy2, iz1,iz2, ix,iy,iz; PBrick B; contDist2 = contDist*contDist; ncontacts = 0; if (!brick) return; dn = (int)floor(contDist/brick_size)+1; for (i=0;i=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); for (ix=ix1;ixnAtoms;j++) { dx = xyz[i][0] - B->atom[j]->x; dy = xyz[i][1] - B->atom[j]->y; dz = xyz[i][2] - B->atom[j]->z; d2 = dx*dx + dy*dy + dz*dz; if (d2<=contDist2) { contact[ncontacts].id1 = B->id[j]; contact[ncontacts].id2 = i; contact[ncontacts].dist = d2; ncontacts++; } } } } } } void CoorManager::SeekContacts ( PPAtom AIndex1, int ilen1, PPAtom * AIndex2, ivector ilen2, int nStructures, realtype dist1, realtype dist2, PPMContact & contact, int bricking ) { // It is Ok to have NULL pointers in AIndex1 and AIndex2 PMBrick B; PAtom A; realtype d12,d22,d2; int dn, i,j,k, nx,ny,nz, ix1,iy1,iz1, ix2,iy2,iz2; int ix,iy,iz; if (dist2Ter) { contact[i] = new MContact(nStructures); contact[i]->contactID = i; // Calculate the brick location GetMBrickCoor ( A,nx,ny,nz ); if (nx>=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nmbrick_x,nx+dn+1 ); iy2 = IMin ( nmbrick_y,ny+dn+1 ); iz2 = IMin ( nmbrick_z,nz+dn+1 ); for (ix=ix1;ixnAtoms[j];k++) if (B->atom[j][k]!=A) { if (iContact(A,B->atom[j][k], MaxInt4,MinInt4, dist2,d12,d22,d2)) contact[i]->AddContact ( B->atom[j][k],j,B->id[j][k] ); } } } } } } else for (i=0;i ((PContact)data)[j].id1); lt = (((PContact)data)[i].id1 < ((PContact)data)[j].id1); break; case CNSORT_1DEC : gt = (((PContact)data)[j].id1 > ((PContact)data)[i].id1); lt = (((PContact)data)[j].id1 < ((PContact)data)[i].id1); break; case CNSORT_2INC : gt = (((PContact)data)[i].id2 > ((PContact)data)[j].id2); lt = (((PContact)data)[i].id2 < ((PContact)data)[j].id2); break; case CNSORT_2DEC : gt = (((PContact)data)[j].id2 > ((PContact)data)[i].id2); lt = (((PContact)data)[j].id2 < ((PContact)data)[i].id2); break; case CNSORT_DINC : gt = (((PContact)data)[i].dist > ((PContact)data)[j].dist); lt = (((PContact)data)[i].dist < ((PContact)data)[j].dist); break; case CNSORT_DDEC : gt = (((PContact)data)[j].dist > ((PContact)data)[i].dist); lt = (((PContact)data)[j].dist < ((PContact)data)[i].dist); break; } if (gt) return 1; if (lt) return -1; return 0; } void QSortContacts::Swap ( int i, int j ) { ((PContact)data)[i].Swap ( ((PContact)data)[j] ); } void QSortContacts::Sort ( PContact contact, int ncontacts, int sortmode ) { mode = sortmode; if (mode!=CNSORT_OFF) QuickSort::Sort ( &(contact[0]),ncontacts ); } void SortContacts ( PContact contact, int ncontacts, CNSORT_DIR sortmode ) { QSortContacts SC; if (sortmode!=CNSORT_OFF) SC.Sort ( contact,ncontacts,sortmode ); } // ------------------- Stream functions ---------------------- void CoorManager::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); Root::write ( f ); if (!isCompactBinary()) { f.WriteInt ( &CoorIDCode ); f.WriteReal ( &brick_size ); f.WriteReal ( &xbrick_0 ); f.WriteReal ( &ybrick_0 ); f.WriteReal ( &zbrick_0 ); f.WriteInt ( &nbrick_x ); f.WriteInt ( &nbrick_y ); f.WriteInt ( &nbrick_z ); } } void CoorManager::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); Root::read ( f ); if (!isCompactBinary()) { f.ReadInt ( &CoorIDCode ); f.ReadReal ( &brick_size ); f.ReadReal ( &xbrick_0 ); f.ReadReal ( &ybrick_0 ); f.ReadReal ( &zbrick_0 ); f.ReadInt ( &nbrick_x ); f.ReadInt ( &nbrick_y ); f.ReadInt ( &nbrick_z ); } } MakeStreamFunctions(CoorManager); // =================================================================== int SuperposeAtoms ( mat44 & T, PPAtom A1, int nA, PPAtom A2, ivector C ) { realtype xc1,yc1,zc1, xc2,yc2,zc2, det,B; rmatrix A,U,V; rvector W,RV1; vect3 vc1,vc2; int i,j,k,i1,i2,nat; // 1. Set unit matrix as "default" return for (i=0;i<4;i++) { for (j=0;j<4;j++) T[i][j] = 0.0; T[i][i] = 1.0; } // 2. Calculate mass centers xc1 = 0.0; yc1 = 0.0; zc1 = 0.0; xc2 = 0.0; yc2 = 0.0; zc2 = 0.0; nat = 0; if (C) { for (i1=0;i1Ter) { i2 = C[i1]; if (i2>=0) { xc1 += A1[i1]->x; yc1 += A1[i1]->y; zc1 += A1[i1]->z; xc2 += A2[i2]->x; yc2 += A2[i2]->y; zc2 += A2[i2]->z; nat++; } } } else { for (i=0;iTer) && (!A2[i]->Ter)) { xc1 += A1[i]->x; yc1 += A1[i]->y; zc1 += A1[i]->z; xc2 += A2[i]->x; yc2 += A2[i]->y; zc2 += A2[i]->z; nat++; } } if (nat>1) { xc1 /= nat; yc1 /= nat; zc1 /= nat; xc2 /= nat; yc2 /= nat; zc2 /= nat; } else if (nat>0) { T[0][3] = xc2 - xc1; T[1][3] = yc2 - yc1; T[2][3] = zc2 - zc1; return SPOSEAT_Ok; } else return SPOSEAT_NoAtoms; // 3. Calculate the correlation matrix GetMatrixMemory ( A,3,3,1,1 ); for (i=1;i<=3;i++) for (j=1;j<=3;j++) A[i][j] = 0.0; if (C) { for (i1=0;i1Ter) { i2 = C[i1]; if (i2>=0) { vc1[0] = A1[i1]->x - xc1; vc1[1] = A1[i1]->y - yc1; vc1[2] = A1[i1]->z - zc1; vc2[0] = A2[i2]->x - xc2; vc2[1] = A2[i2]->y - yc2; vc2[2] = A2[i2]->z - zc2; for (i=1;i<=3;i++) for (j=1;j<=3;j++) A[i][j] += vc1[j-1]*vc2[i-1]; } } } else { for (k=0;kTer) && (!A2[k]->Ter)) { vc1[0] = A1[k]->x - xc1; vc1[1] = A1[k]->y - yc1; vc1[2] = A1[k]->z - zc1; vc2[0] = A2[k]->x - xc2; vc2[1] = A2[k]->y - yc2; vc2[2] = A2[k]->z - zc2; for (i=1;i<=3;i++) for (j=1;j<=3;j++) A[i][j] += vc1[j-1]*vc2[i-1]; } } // 4. Calculate transformation matrix (to be applied to A1) det = A[1][1]*A[2][2]*A[3][3] + A[1][2]*A[2][3]*A[3][1] + A[2][1]*A[3][2]*A[1][3] - A[1][3]*A[2][2]*A[3][1] - A[1][1]*A[2][3]*A[3][2] - A[3][3]*A[1][2]*A[2][1]; // 4.1 SV-decompose the correlation matrix GetMatrixMemory ( U ,3,3,1,1 ); GetMatrixMemory ( V ,3,3,1,1 ); GetVectorMemory ( W ,3,1 ); GetVectorMemory ( RV1,3,1 ); math::SVD ( 3,3,3,A,U,V,W,RV1,true,true,i ); if (i!=0) { FreeVectorMemory ( RV1,1 ); FreeVectorMemory ( W ,1 ); FreeMatrixMemory ( V ,3,1,1 ); FreeMatrixMemory ( U ,3,1,1 ); FreeMatrixMemory ( A ,3,1,1 ); return SPOSEAT_SVD_Fail; } // 4.2 Check for parasite inversion and fix it if found if (det<=0.0) { k = 0; B = MaxReal; for (j=1;j<=3;j++) if (W[j]x - A[1]->x; U[1] = A[0]->y - A[1]->y; U[2] = A[0]->z - A[1]->z; W[0] = A[2]->x - A[1]->x; W[1] = A[2]->y - A[1]->y; W[2] = A[2]->z - A[1]->z; V[0] = A[3]->x - A[2]->x; V[1] = A[3]->y - A[2]->y; V[2] = A[3]->z - A[2]->z; a[0] = U[1]*W[2] - W[1]*U[2]; a[1] = U[2]*W[0] - W[2]*U[0]; a[2] = U[0]*W[1] - W[0]*U[1]; b[0] = V[1]*W[2] - W[1]*V[2]; b[1] = V[2]*W[0] - W[2]*V[0]; b[2] = V[0]*W[1] - W[0]*V[1]; c[0] = a[1]*b[2] - b[1]*a[2]; c[1] = a[2]*b[0] - b[2]*a[0]; c[2] = a[0]*b[1] - b[0]*a[1]; Wmag = sqrt(W[0]*W[0]+W[1]*W[1]+W[2]*W[2]); S = c[0]*W[0] + c[1]*W[1] + c[2]*W[2]; T = a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; T *= Wmag; if ((S==0.0) && (T==0.0)) return NO_TORSION; else return atan2(S,T); } realtype getPsi ( PPAtom A ) { vect3 v1,v2; realtype l1,l2; v1[0] = A[0]->x - A[1]->x; v1[1] = A[0]->y - A[1]->y; v1[2] = A[0]->z - A[1]->z; v2[0] = A[2]->x - A[1]->x; v2[1] = A[2]->y - A[1]->y; v2[2] = A[2]->z - A[1]->z; l1 = v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]; if (l1==0.0) l1 = 1.0; l2 = v2[0]*v2[0] + v2[1]*v2[1] + v2[2]*v2[2]; if (l2==0.0) l2 = 1.0; return acos((v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])/sqrt(l1*l2)); } const realtype NO_TORSION = -MaxReal; } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_manager.h0000644000175000017500000001005613271367640016232 0ustar maartenmaarten// $Id: mmdb_manager.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 15.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_manager // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Manager ( MMDB file manager ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_Manager__ #define __MMDB_Manager__ #include "mmdb_bondmngr.h" namespace mmdb { // ======================= Manager =========================== // copy masks enum COPY_MASK { MMDBFCM_None = 0x00000000, MMDBFCM_All = 0xFFFFFFFF, MMDBFCM_Title = 0x00000001, MMDBFCM_TitleKeepBM = 0x00000002, MMDBFCM_Cryst = 0x00000004, MMDBFCM_Coord = 0x00000008, MMDBFCM_SecStruct = 0x00000010, MMDBFCM_HetInfo = 0x00000020, MMDBFCM_Links = 0x00000040, MMDBFCM_CisPeps = 0x00000080, MMDBFCM_SA = 0x00000100, MMDBFCM_SB = 0x00000200, MMDBFCM_SC = 0x00000400, MMDBFCM_Footnotes = 0x00000800, MMDBFCM_ChainAnnot = 0x00001000, MMDBFCM_Flags = 0x00002000, MMDBFCM_Buffer = 0x80000000, MMDBFCM_Top = 0xFFFFFFF7 }; DefineStreamFunctions(Manager); class Manager : public BondManager { public : Manager (); Manager ( io::RPStream Object ); ~Manager(); // --------------- Copying/Deleting ----------------------- // Copy(..) will transfer different sort of information // between two MMDB's according to the copy mask given // (cf. MMDBFCM_XXXXX values). Note that the copying content // replaces the corresponding information (e.g. copying // coordinates will replace existing coordinates rather than // add to them). void Copy ( PManager MMDB, COPY_MASK CopyMask ); // Delete(..) deletes different sort of information from // the MMDB according to the delete mask given. void Delete ( word DelMask ); // DelMask is the same as CopyMask PTitleContainer GetRemarks(); PTitleContainer GetJournal(); realtype GetResolution(); // -1.0 means no resolution record in file int ParseBiomolecules(); // returns the number of biomolecules, // -2 for general format error // -3 for errors in BIOMT records int GetNofBiomolecules(); void GetBiomolecules ( PPBiomolecule & BM, int & nBMs ); PBiomolecule GetBiomolecule ( int bmNo ); // bmno=0,1,.. // returns NULL if bmNo is incorrect PManager MakeBiomolecule ( int bmNo, int modelNo=1 ); protected : // --------------- Stream I/O ----------------------------- void write ( io::RFile f ); void read ( io::RFile f ); }; } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_math_linalg.h0000644000175000017500000002123113271367640017074 0ustar maartenmaarten// $Id: mmdb_math_linalg.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : LinAlg // ~~~~~~~~~ // **** Project : MMDB ( MacroMolecular Data Base ) // ~~~~~~~~~ // // (C) E.Krissinel 2000-2013 // // ================================================================= // // #ifndef __MMDB_MATH_LinAlg__ #define __MMDB_MATH_LinAlg__ #include "mmdb_mattype.h" namespace mmdb { namespace math { // ========================== Jacobi ============================= /// Diagonalization of symmetric matrices A[1..N][1..N] /// by the method of Jacobi. extern void Jacobi ( int N, //!< dimension of the matrix rmatrix A, //!< matrix to diagonalize; the /// lower triangle, except the /// diagonal, will remain unchanged rmatrix T, //!< eigenvectors placed as columns rvector Eigen, //!< vector of eigenvalues, orderd /// by increasing rvector Aik, //!< working array int & Signal //!< 0 <=> Ok, ItMax <=> iteration /// limit exchausted. ); // A5.5.2 : Perturbed Cholesky Decomposition extern void PbCholDecomp ( int N, rvector HDiag, realtype MaxOff, realtype MachEps, rmatrix L, realtype & MaxAdd ); // A3.2.3a : Cholesky's L - Solution of // L*Y = B ( given B ) extern void LSolve ( int N, rmatrix L, rvector B, rvector Y ); // A3.2.3b : Cholesky's LT - Solution of // LT*X = Y ( given Y ) extern void LTSolve ( int N, rmatrix L, rvector Y, rvector X ); // A3.2.3 : Solution of the equation L*LT*S = G // by the Cholesky's method extern void ChSolve ( int N, rmatrix L, rvector G, rvector S ); // ---------------------------------------------------- extern void FastInverse ( int N, rmatrix A, ivector J0, //#D realtype & Det, int & Signal ); // // 13.09.90 <-- Last Modification Date // ------------------------ // // ================================================ // // Fast Inversion of the matrix A // by the method of GAUSS - JORDAN . // // ------------------------------------------------ // // Input parameters are : // // N - dimension of the matrix // A - the matrix [1..N][1..N] to be inverted. // ------------------------------------------------ // // J0 - integer vector [1..N] for temporal storage // // ------------------------------------------------ // // Output parameters are : // // A - the inverted matrix // Signal - the error key : // = 0 <=> O'K // else // degeneration was found, and // the rang of matrix is Signal-1. // // Variable Det may return the determinant // of matrix A. To obtain it, remove all comments // of form //#D. // // ================================================ // ---------------------------------------------------- extern void SVD ( int NA, int M, int N, rmatrix A, rmatrix U, rmatrix V, rvector W, rvector RV1, bool MatU, bool MatV, int & RetCode ); // // 13.12.01 <-- Last Modification Date // ------------------------ // // ================================================ // // The Singular Value Decomposition // of the matrix A by the algorithm from // G.Forsait, M.Malkolm, K.Mouler. Numerical // methods of mathematical calculations // // M., Mir, 1980. // // Matrix A is represented as // // A = U * W * VT // // ------------------------------------------------ // // All dimensions are indexed from 1 on. // // ------------------------------------------------ // // Input parameters: // // NA - number of lines in A. NA may be // equal to M or N only. If NA=M // then usual SVD will be made. If MA=N // then matrix A is transposed before // the decomposition, and the meaning of // output parameters U and V is // swapped (U accepts VT and VT accepts U). // In other words, matrix A has physical // dimension of M x N , same as U and V; // however the logical dimension of it // remains that of N x M . // M - number of lines in U // N - number of columns in U,V and length // of W,RV1 . Always provide M >= N ! // A - matrix [1..M][1..N] or [1..N][1..M] // to be decomposed. The matrix does not // change, and it may coincide with U or // V, if NA=M (in which case A does change) // MatU - compute U , if set True // MatV - compute V , if set True // RV1 - temporary array [1..N]. // U - should be always supplied as an array of // [1..M][1..N], M>=N . // V - should be suuplied as an array of // [1..N][1..N] if MatV is True . // // ------------------------------------------------ // // Output parameters are : // // W - N non-ordered singular values, // if RetCode=0. If RetCode<>0, the // RetCode+1 ... N -th values are still // valid // U - matrix of right singular vectors // (arranged in columns), corresponding // to the singular values in W, if // RetCode=0 and MatU is True. If MatU // is False, U is still used as a // temporary array. If RetCode<>0 then // the RetCode+1 ... N -th vectors // are valid // V - matrix of left singular vectors // (arranged in columns), corresponding // to the singular values in W, if // RetCode=0 and MatV is True. If MatV // is False, V is not used and may be set // to NULL. If RetCode<>0 then the // RetCode+1 ... N -th vectors are valid // RetCode - the error key : // = 0 <=> O'K // else // = k, if the k-th singular value // was not computed after 30 iterations. // // ------------------------------------------------ // // Key Variables are : // // ItnLimit - the limit for iterations // // This routine does not use any machine-dependent // constants. // // ================================================ // // extern void OrderSVD ( int M, int N, rmatrix U, rmatrix V, rvector W, bool MatU, bool MatV ); } } #endif mmdb2-2.0.20/mmdb2/mmdb_root.h0000644000175000017500000006364513271367640015617 0ustar maartenmaarten// $Id: mmdb_root.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 24.07.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Root // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::Root // ~~~~~~~~~ // // (C) E. Krissinel 2000-2015 // // ================================================================= // #ifndef __MMDB_Root__ #define __MMDB_Root__ #include "mmdb_io_file.h" #include "mmdb_uddata.h" #include "mmdb_title.h" #include "mmdb_cryst.h" #include "mmdb_chain.h" #include "mmdb_model.h" #include "mmdb_defs.h" namespace mmdb { // ======================= Root =========================== // special effect flags enum MMDB_READ_FLAG { MMDBF_AutoSerials = 0x00000001, MMDBF_NoCoordRead = 0x00000002, MMDBF_SimRWBROOK = 0x00000004, MMDBF_PrintCIFWarnings = 0x00000008, MMDBF_EnforceSpaces = 0x00000010, MMDBF_IgnoreDuplSeqNum = 0x00000020, MMDBF_IgnoreSegID = 0x00000040, MMDBF_IgnoreElement = 0x00000080, MMDBF_IgnoreCharge = 0x00000100, MMDBF_IgnoreNonCoorPDBErrors = 0x00000200, MMDBF_IgnoreUnmatch = 0x00000400, MMDBF_IgnoreBlankLines = 0x00000800, MMDBF_IgnoreHash = 0x00001000, MMDBF_IgnoreRemarks = 0x00002000, MMDBF_AllowDuplChainID = 0x00004000, MMDBF_FixSpaceGroup = 0x00008000, MMDBF_EnforceAtomNames = 0x00010000, MMDBF_EnforceUniqueChainID = 0x00020000, MMDBF_DoNotProcessSpaceGroup = 0x00040000, MMDBF_MakeCompactBinary = 0x00080000 }; // MMDBF_EnforceUniqueChainID will make MMDB to rename chains on // reading a file such as to maintain chains uniquesness. This // is supposed to work only with 1-letter chain IDs and only // if chain names are interchanged in the file. For example, // if file contains a sequence of chains named // // A,B, A,B, A,B, A,B, A,B // // and this flag is set on, the resulting chain names in // MMDB will be: // // A,B, A0,B0, A1,B1, A2,B2, A3,B3 // // file types: enum MMDB_FILE_TYPE { MMDB_FILE_Undefined = -1, MMDB_FILE_PDB = 0, MMDB_FILE_CIF = 1, MMDB_FILE_Binary = 2 }; // cleanup flags: enum PDB_CLEAN_FLAG { PDBCLEAN_ATNAME = 0x00000001, PDBCLEAN_TER = 0x00000002, PDBCLEAN_CHAIN = 0x00000004, PDBCLEAN_CHAIN_STRONG = 0x00000008, PDBCLEAN_ALTCODE = 0x00000010, PDBCLEAN_ALTCODE_STRONG = 0x00000020, PDBCLEAN_SERIAL = 0x00000040, PDBCLEAN_SEQNUM = 0x00000080, PDBCLEAN_CHAIN_ORDER = 0x00000100, PDBCLEAN_CHAIN_ORDER_IX = 0x00000200, PDBCLEAN_SOLVENT = 0x00000400, PDBCLEAN_INDEX = 0x00000800, PDBCLEAN_ELEMENT = 0x00001000, PDBCLEAN_ELEMENT_STRONG = 0x00002000 }; // crystallographic info inquery enum MMDB_CRYST_FLAG { CRRDY_NotPrecise = 0x00000001, CRRDY_isTranslation = 0x00000002, CRRDY_NoOrthCode = 0x00000004, CRRDY_Complete = 0, CRRDY_NoTransfMatrices = -1, CRRDY_Unchecked = -2, CRRDY_Ambiguous = -3, CRRDY_NoCell = -4, CRRDY_NoSpaceGroup = -5 }; DefineClass(Root); DefineStreamFunctions(Root); class Root : public UDData { friend class Model; friend class Chain; friend class Residue; friend class Atom; public : Root (); Root ( io::RPStream Object ); ~Root(); void FreeFileMemory(); // --------------- Reading/Writing external files --------- void SetFlag ( word Flag ); void RemoveFlag ( word Flag ); ERROR_CODE ReadPDBASCII ( cpstr PDBFileName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadPDBASCII1 ( cpstr PDBLFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadPDBASCII ( io::RFile f ); ERROR_CODE ReadCIFASCII ( cpstr CIFFileName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadCIFASCII1 ( cpstr CIFLFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadCIFASCII ( io::RFile f ); ERROR_CODE ReadFromCIF ( mmcif::PData CIFD ); // adds info from PDB file ERROR_CODE AddPDBASCII1 ( cpstr PDBLFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE AddPDBASCII ( cpstr PDBFileName, io::GZ_MODE gzipMode=io::GZM_CHECK ); // auto format recognition ERROR_CODE ReadCoorFile ( cpstr LFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadCoorFile1 ( cpstr CFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadCoorFile ( io::RFile f ); ERROR_CODE WritePDBASCII ( cpstr PDBFileName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE WritePDBASCII1 ( cpstr PDBLFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); void WritePDBASCII ( io::RFile f ); ERROR_CODE WriteCIFASCII ( cpstr CIFFileName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE WriteCIFASCII1 ( cpstr CIFLFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadMMDBF ( cpstr MMDBRootName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadMMDBF1 ( cpstr MMDBLFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE ReadMMDBF ( io::File & f ); ERROR_CODE WriteMMDBF ( cpstr MMDBRootName, io::GZ_MODE gzipMode=io::GZM_CHECK ); ERROR_CODE WriteMMDBF1 ( cpstr MMDBLFName, io::GZ_MODE gzipMode=io::GZM_CHECK ); void WriteMMDBF ( io::File & f ); void GetInputBuffer ( pstr Line, int & count ); // PutPDBString adds a PDB-keyworded string // to the existing structure. Note that the string // is namely added meaning that it will be the // last REMARK, last JRNL, last ATOM etc. string // -- always the last one in its group. ERROR_CODE PutPDBString ( cpstr PDBString ); // PDBCleanup(..) cleans coordinate part to comply with PDB // standards and MMDB "expectations": // // PDBCLEAN_ATNAME pads atom names with spaces to form // 4-symbol names // PDBCLEAN_TER inserts TER cards in the end of each chain // PDBCLEAN_CHAIN generates 1-character chain ids instead of // those many-character // PDBCLEAN_CHAIN_STRONG generates 1-character chain ids starting // from 'A' on for all ids, including the // single-character ones // PDBCLEAN_ALTCODE generates 1-character alternative codes // instead of many-character ones // PDBCLEAN_ALTCODE_STRONG generates 1-character alternative codes // from 'A' on for all codes, including the // single-character ones // PDBCLEAN_SERIAL puts serial numbers in due order // PDBCLEAN_SEQNUM renumbers all residues so that they go // incrementally-by-one without insertion codes // PDBCLEAN_CHAIN_ORDER puts chains in order of atom's serial // numbers // PDBCLEAN_CHAIN_ORDER_IX puts chains in order of atom's // indices internal to MMDB // PDBCLEAN_SOLVENT moves solvent chains at the end of each model // // Return codes (as bits): // 0 Ok // PDBCLEAN_CHAIN too many chains for assigning them // 1-letter codes // PDBCLEAN_ATNAME element names were not available // PDBCLEAN_ALTCODE too many alternative codes encountered. // word PDBCleanup ( word CleanKey ); // Makes all atoms in chain 'chainID', in all models, as // 'Het' atoms if Make is set True, and makes them 'ordinary' // atoms otherwise. 'Ter' is automatically removed when // converting to 'Het' atoms, and is automatically added // when converting to 'ordinary' atoms. This may cause // disorder in serial numbers -- just call // PDBClean(PDBCLEAN_SERIAL) when necessary to fix this. void MakeHetAtoms ( cpstr chainID, bool Make ); // --------------- Working with atoms by serial numbers --- inline PPAtom GetAtomArray () { return atom; } inline int GetAtomArrayLength() { return atmLen; } // strictly not for // use in applications!! PAtom GetAtomI ( int index ); // returns Atom[index-1] // PutAtom(..) puts atom with the specified properties // into the structure. The current model is used; if no model // is set (crModel==NULL), one is created. Coordinates and // other parameters of the atom need to be set separately. // The place, at which the atom is put, is determined by // index. If index is positive, then it points onto (index-1)th // element of the Atom array (the index counts 1,2,... and // generally coincides with the atom's serial number). If // there is already an atom at this position in the system, // the new atom will REPLACE it. The corresponding residues // are automatically updated. // If index is null (=0), the new atom will be put on // the top of the structure, i.e. it will be put into // (index=nAtoms+1)-th position. // If index is negative, then the new atom is INSERTED // BEFORE the atom in the (-index)th position. For saving // the computational efforts, this WILL NOT cause the // recalculation of all atoms' serial numbers according // to their actual positions. It will be needed, however, // for putting the things in order at a certain point, // especially before writing an output ASCII file. NOTE // that this ordering is never done automatically. // In a correct PDB file the serial number (serNum) is always // equal to its position (index). However here we allow them // to be different for easing the management of relations, // particularly the connectivity. // // Limitation: if PutAtom implies creating new // chains/residues, these are always created on the top // of existing chains/residues. int PutAtom ( int index, int serNum, const AtomName atomName, const ResName resName, const ChainID chainID, int seqNum, const InsCode insCode, const AltLoc altLoc, const SegID segID, const Element element ); int PutAtom ( int index, // same meaning as above PAtom A, // pointer to completed atom class int serNum=0 // 0 means that the serial number // will be set equal to index. // Otherwise the serial number // is set to the specified // value ); // RemoveAtom(..) removes atom at the specified index // in the Atom array. This index is always accessible // as Atom[index]->index. If this leaves a residue empty, // the residue is removed. If this leaves an empty chain, // the chain is removed as well; the same happens to the // model. void RemoveAtom ( int index ); int FinishStructEdit(); void TrimModelTable(); // ---------------- Deleting models ----------------------- int DeleteAllModels (); bool GetNewChainID ( int modelNo, ChainID chID, int length=1 ); // --------------- Enquiring ------------------------------- bool isCompactBinary(); int CrystReady(); // Returns flags: // CRRDY_Complete if crystallographic information is complete // CRRDY_NotPrecise if cryst. inf-n is not precise // CRRDY_isTranslation if cryst. inf-n contains translation // CRRDY_NoOrthCode no orthogonalization code // Fatal: // CRRDY_NoTransfMatrices if transform. matrices were not // calculated // CRRDY_Unchecked if cryst. inf-n was not checked // CRRDY_Ambiguous if cryst. inf-n is ambiguous // CRRDY_NoCell if cryst. inf-n is unusable // CRRDY_NoSpaceGroup if space group is not set bool isCrystInfo (); // cell parameters and space group bool isCellInfo (); // cell param-s a,b,c, alpha,beta,gamma bool isSpaceGroup (); // space group on CRYST1 card bool isTransfMatrix(); // orthogonalizing/fractionalizing // matrices bool isScaleMatrix (); // SCALEx PDB records bool isNCSMatrix (); // MTRIXx PDB records int GetNumberOfNCSMatrices(); int GetNumberOfNCSMates (); // Returns the number of // NCS mates not given in // the file (iGiven==0) bool GetNCSMatrix ( int NCSMatrixNo, // 0..N-1 mat44 & ncs_m, int & iGiven ); int GetNumberOfSymOps (); // number of symmetry operations pstr GetSymOp ( int Nop ); // XYZ symmetry operation name // ------------- User-Defined Data ------------------------ int RegisterUDInteger ( UDR_TYPE udr_type, cpstr UDDataID ); int RegisterUDReal ( UDR_TYPE udr_type, cpstr UDDataID ); int RegisterUDString ( UDR_TYPE udr_type, cpstr UDDataID ); int GetUDDHandle ( UDR_TYPE udr_type, cpstr UDDataID ); // ---------------------------------------------------------- void SetSyminfoLib ( cpstr syminfo_lib ); pstr GetSyminfoLib (); int SetSpaceGroup ( cpstr spGroup ); pstr GetSpaceGroup (); pstr GetSpaceGroupFix(); void GetAtomStatistics ( RAtomStat AS ); void SetIgnoreSCALEi ( bool ignoreScalei ); // SetCell(..) is for changing cell parameters void SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode=0 ); // PutCell(..) is for setting cell parameters void PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode=0 ); int GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & vol, int & OrthCode ); int GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & vols, int & OrthCode ); void GetROMatrix ( mat44 & RO ); // GetTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation number Nop and places // them into unit cell shifted by cellshift_a a's, cellshift_b // b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetTMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c ); // GetUCTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation number Nop. Translation // part of the matrix is being chosen such that point (x,y,z) // has least distance to the center of primary (333) unit cell, // and then it is shifted by cellshift_a a's, cellshift_b b's and // cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetUCTMatrix ( mat44 & TMatrix, int Nop, realtype x, realtype y, realtype z, int cellshift_a, int cellshift_b, int cellshift_c ); // GetFractMatrix(..) calculates and returns the coordinate // transformation matrix, which converts fractional coordinates // according to the symmetry operation number Nop and places them // into unit cell shifted by cellshift_a a's, cellshift_b b's // and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetFractMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c ); // GetSymOpMatrix(..) returns the transformation matrix for // Nop-th symmetry operator in the space group // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // int GetSymOpMatrix ( mat44 & TMatrix, int Nop ); int AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ); int GenerateNCSMates(); // 1: no NCS matrices, 0: Ok pstr GetEntryID (); void SetEntryID ( const IDCode idCode ); int GetNofExpDataRecs(); pstr GetExpDataRec ( int recNo ); // 0.. on int GetNofMdlTypeRecs(); pstr GetMdlTypeRec ( int recNo ); // 0.. on int GetFileType() { return FType; } void Copy ( PRoot MMDBRoot ); void SetCompactBinary(); // leaves only coordinates in binary files // ------- user-defined data handlers int PutUDData ( int UDDhandle, int iudd ); int PutUDData ( int UDDhandle, realtype rudd ); int PutUDData ( int UDDhandle, cpstr sudd ); int GetUDData ( int UDDhandle, int & iudd ); int GetUDData ( int UDDhandle, realtype & rudd ); int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); int GetUDData ( int UDDhandle, pstr & sudd ); // GetStructureTitle() returns the contents of TITLE record // unfolded into single line. If Title is missing, returns // contents of COMPND(:MOLECULE). If COMPND is missing, returns // HEADER. If Header is missing, returns PDB code. If no PDB // code is there, returns "Not available". pstr GetStructureTitle ( pstr & L ); PCryst GetCrystData() { return &cryst; } PClassContainer GetUnparsedA() { return &SA; } PClassContainer GetUnparsedB() { return &SB; } PClassContainer GetUnparsedC() { return &SC; } protected : word Flags; // special effect flags int FType; // type of last file operation: // -1 : none // 0 : PDB // 1 : CIF // 2 : BIN // encoded as MMDB_FILE_XXXXX above Title title; // title section Cryst cryst; // crystallographic information section UDRegister udRegister; // register of user-defined data int nModels; // number of models PPModel model; // array of models [0..nModels-1] int nAtoms; // number of atoms int atmLen; // length of Atom array PPAtom atom; // array of atoms ordered by serial numbers AtomPath DefPath; // default coordinate path ClassContainer SA; // string container for unrecognized strings // which are between the title and the // crystallographic sections ClassContainer Footnote; // string container for footnotes ClassContainer SB; // string container for unrecognized strings // which are between the crystallographic and // the coordinate sections ClassContainer SC; // string container for unrecognized strings // following the coordinate section // input buffer int lcount; // input line counter char S[500]; // read buffer mmcif::PData CIF; // CIF file manager PModel crModel; // current model, used at reading a PDB file PChain crChain; // current chain, used at reading a PDB file PResidue crRes; // current residue, used at reading a PDB file bool Exclude; // used internally bool ignoreRemarks; // used temporarily bool allowDuplChID; // used temporarily bool enforceUniqueChID; // used temporarily void InitMMDBRoot (); void FreeCoordMemory (); void ReadPDBLine ( io::RFile f, pstr L, int maxlen ); ERROR_CODE ReadPDBAtom ( cpstr L ); ERROR_CODE ReadCIFAtom ( mmcif::PData CIFD ); ERROR_CODE CheckAtomPlace ( int index, cpstr L ); ERROR_CODE CheckAtomPlace ( int index, mmcif::PLoop Loop ); ERROR_CODE SwitchModel ( cpstr L ); ERROR_CODE SwitchModel ( int nM ); ERROR_CODE AllocateAtom ( int index, const ChainID chainID, const ChainID label_asym_id, const ResName resName, const ResName label_comp_id, int seqNum, int label_seq_id, int label_entity_id, const InsCode insCode, bool Replace ); void ExpandAtomArray ( int inc ); void AddAtomArray ( int inc ); void ApplyNCSTransform ( int NCSMatrixNo ); virtual void ResetManager(); // --------------- Stream I/O ----------------------------- void write ( io::RFile f ); void read ( io::RFile f ); // don't use _ExcludeModel in your applications! int _ExcludeModel ( int serNum ); int CheckInAtom ( int index, PAtom A ); int CheckInAtoms ( int index, PPAtom A, int natms ); virtual PMask GetSelMask ( int selHnd ); private : int modelCnt; // used only at reading files }; // isMMDBBIN will return // -1 if file FName does not exist // 0 if file FName is likely a MMDB BIN (binary) file // 1 if file FName is not a MMDB BIN (binary) file // 2 if file FName is likely a MMDB BIN (binary) file, // but of a wrong edition (i.e. produced by a lower // version of MMDB). extern int isMMDBBIN ( cpstr FName, io::GZ_MODE gzipMode=io::GZM_CHECK ); extern int isMMDBBIN ( io::RFile f ); // isPDB will return // -1 if file FName does not exist // 0 if file FName is likely a PDB file // 1 if file FName is not a PDB file extern int isPDB ( cpstr FName, io::GZ_MODE gzipMode=io::GZM_CHECK, bool IgnoreBlankLines=false ); extern int isPDB ( io::RFile f, bool IgnoreBlankLines=false ); } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_math_linalg.cpp0000644000175000017500000006550013271367640017436 0ustar maartenmaarten// $Id: mmdb_math_linalg.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : LinAlg // ~~~~~~~~~ // **** Project : MMDB ( MacroMolecular Data Base ) // ~~~~~~~~~ // // (C) E.Krissinel 2000-2013 // // ================================================================= // // #include #include #include "mmdb_math_linalg.h" namespace mmdb { namespace math { // ========================== Jacobi ============================= void Jacobi ( int N, // dimension of the matrix rmatrix A, // matrix to diagonalize; the lower // triangle, except the diagonal, // will remain unchanged rmatrix T, // eigenvectors placed as columns rvector Eigen, // vector of eigenvalues, orderd // by increasing rvector Aik, // working array int & Signal // 0 <=> Ok, ItMax <=> iteration limit // exchausted. ) { // Diagonalization of symmetric matrices by the method of Jacobi. // Key variables: // ItMax - the maximum available number of iterations // Eps1 - is used in SNA and CSA calculations // Eps2 - is the level of the elimination of the // non-diagonal matrix elements // Eps3 - the criterion to stop the iterations. // The iterations stop if (1-Sigma1/Sigma2)<=Eps3 // where Sigma1 is the dekart norm of the eigenvalues // at the preceding iteration and Sigma2 is // the same for the current iteration. realtype Eps1,Eps2,Eps3; realtype Sigma1,Sigma2,OffDsq, SPQ,CSA,SNA,Q,P, HoldIK,HoldKI; int ItMax; int i,j,k,Iter; Eps1 = 6.0e-9; Eps2 = 9.0e-12; Eps3 = 1.0e-8; ItMax = 9999; Signal = 0; if (N<=1) { T[1][1] = 1.0; Eigen[1] = A[1][1]; return; } for (i=1;i<=N;i++) { for (j=1;j<=N;j++) T[i][j] = 0.0; T[i][i] = 1.0; Eigen[i] = A[i][i]; } Sigma1 = 0.0; OffDsq = 0.0; // Sigma1 is the Dekart measure of the diagonal elements // OffDsq is the Dekart measure of the non-diagonal elements for (i=1;i<=N;i++) { Sigma1 += A[i][i]*A[i][i]; if (iEps3)) { for (i=1;iEps2)) { if (Q>Eps1) { P = 2.0*A[i][j]*(Q/(A[i][i]-A[j][j])); SPQ = sqrt(P*P+Q*Q); CSA = sqrt((1.0+Q/SPQ)/2.0); SNA = P/(SPQ*CSA*2.0); } else { CSA = sqrt(0.5); SNA = CSA; } for (k=1;k<=N;k++) { HoldKI = T[k][i]; T[k][i] = HoldKI*CSA + T[k][j]*SNA; T[k][j] = HoldKI*SNA - T[k][j]*CSA; } for (k=i;k<=N;k++) if (k<=j) { Aik[k] = A[i][k]; A[i][k] = CSA*Aik[k] + SNA*A[k][j]; if (k==j) { A[j][k] = SNA*Aik[k] - CSA*A[j][k]; Aik[j] = SNA*Aik[i] - CSA*Aik[j]; } } else { HoldIK = A[i][k]; A[i][k] = CSA*HoldIK + SNA*A[j][k]; A[j][k] = SNA*HoldIK - CSA*A[j][k]; } for (k=1;k<=j;k++) if (k>i) A[k][j] = SNA*Aik[k] - CSA*A[k][j]; else { HoldKI = A[k][i]; A[k][i] = CSA*HoldKI + SNA*A[k][j]; A[k][j] = SNA*HoldKI - CSA*A[k][j]; } } } Sigma2 = 0.0; for (i=1;i<=N;i++) { Eigen[i] = A[i][i]; Sigma2 += Eigen[i]*Eigen[i]; } HoldIK = fabs(1.0-Sigma1/Sigma2); Sigma1 = Sigma2; Iter++; } if (Iter>ItMax) Signal = ItMax; for (i=1;i<=N;i++) { k = i; for (j=i;j<=N;j++) if (Eigen[j]MaxOffl) MaxOffl = BB; } MaxOffl = sqrt(MaxOffl); } MinL2 = sqrt(MachEps)*MaxOffl; MaxAdd = 0.0; for (j=1;j<=N;j++) { S = 0.0; if (j>1) for (i=1;i1) for (k=1;kMinLjj) MinLjj = BB; } BB = MinLjj/MaxOffl; if (BB>MinL) MinLjj = BB; else MinLjj = MinL; if (L[j][j]>MinLjj*MinLjj) L[j][j] = sqrt(L[j][j]); else { if (MinL2>MinLjj) MinLjj = MinL2; BB = MinLjj*MinLjj-L[j][j]; if (BB>MaxAdd) MaxAdd = BB; L[j][j] = MinLjj; } if (j1) for (i=2;i<=N;i++) { Y[i] = B[i]; for (j=1;j1) for (i=N-1;i>=1;i--) { X[i] = Y[i]; for (j=i+1;j<=N;j++) X[i] -= L[j][i]*X[j]; X[i] /= L[i][i]; } } // ----------------------------------------------------- void ChSolve ( int N, rmatrix L, rvector G, rvector S ) { // A3.2.3 : Solution of the equation L*LT*S = G // by the Cholesky's method //int i; LSolve ( N,L,G,S ); LTSolve ( N,L,S,S ); // for (i=1;i<=N;i++) // S[i] = -S[i]; } // ---------------------------------------------------- void FastInverse ( int N, rmatrix A, ivector J0, //#D realtype & Det, int & Signal ) { // // 17.01.91 <-- Last Date of Modification. // ---------------------------- // // ================================================ // // Fast Inversion of the matrix A // by the method of GAUSS - JOIRDAN . // // ------------------------------------------------ // // Input parameters are : // // N - dimension of the matrix // A - the matrix [1..N][1..N] to be inverted. // // ------------------------------------------------ // // J0 - integer vector [1..N] for temporal storage // // // ------------------------------------------------ // // Output parameters are : // // A - the inverted matrix // Signal - the error key : // = 0 <=> O'K // else // degeneration was found, and // the rang of matrix is Signal-1. // // Variable Det may return the determinant // of matrix A. To obtain it, remove all comments // of form //#D . // // ------------------------------------------------ // // Key Variables are : // // Eps - is the level for the degeneration // detection. Keep in mind, that // this routine does not norm the // matrix given, and thus Eps1 // is the ABSOLUTE value. // // ================================================ // realtype Eps = 1.0e-16; int i,j,k,i0; realtype A0,B; rvector Ai,Ai0; Signal = 0; if (N<=1) { if (fabs(A[1][1])A0) { A0 = fabs(A[j][i]); i0 = j; } } if (A0=1;i--) { j = J0[i]; if (j!=i) { //#D Det = -Det; for (k=1;k<=N;k++) { B = A[k][i]; A[k][i] = A[k][j]; A[k][j] = B; } } } return; } // End of the procedure FastInverse // ---------------------------------------------------- realtype Sign ( realtype A, realtype B ) { if (B>=0.0) return A; else return -A; } realtype SrX2Y2 ( realtype X, realtype Y ) { realtype Ax,Ay; Ax = fabs(X); Ay = fabs(Y); if (Ay>Ax) return Ay*sqrt((X*X)/(Y*Y)+1.0); if (Ay==Ax) return Ax*sqrt(2.0); return Ax*sqrt((Y*Y)/(X*X)+1.0); } // ---------------------------------------------------- void SVD ( int NA, int M, int N, rmatrix A, rmatrix U, rmatrix V, rvector W, rvector RV1, bool MatU, bool MatV, int & RetCode ) { // // 13.12.01 <-- Last Modification Date // ------------------------ // // ================================================ // // The Singular Value Decomposition // of the matrix A by the algorithm from // G.Forsait, M.Malkolm, K.Mouler. Numerical // methods of mathematical calculations // M., Mir, 1980. // // Matrix A is represented as // // A = U * W * VT // // ------------------------------------------------ // // All dimensions are indexed from 1 on. // // ------------------------------------------------ // // Input parameters: // // NA - number of lines in A. NA may be // equal to M or N only. If NA=M // then usual SVD will be made. If MA=N // then matrix A is transposed before // the decomposition, and the meaning of // output parameters U and V is // swapped (U accepts VT and VT accepts U). // In other words, matrix A has physical // dimension of M x N , same as U and V; // however the logical dimension of it // remains that of N x M . // M - number of lines in U // N - number of columns in U,V and length // of W,RV1 . Always provide M >= N ! // A - matrix [1..M][1..N] or [1..N][1..M] // to be decomposed. The matrix does not // change, and it may coincide with U or // V, if NA=M (in which case A does change) // MatU - compute U , if set True // MatV - compute V , if set True // RV1 - temporary array [1..N]. // U - should be always supplied as an array of // [1..M][1..N], M>=N . // V - should be suuplied as an array of // [1..N][1..N] if MatV is True . // // ------------------------------------------------ // // Output parameters are : // // W - N non-ordered singular values, // if RetCode=0. If RetCode<>0, the // RetCode+1 ... N -th values are still // valid // U - matrix of right singular vectors // (arranged in columns), corresponding // to the singular values in W, if // RetCode=0 and MatU is True. If MatU // is False, U is still used as a // temporary array. If RetCode<>0 then // the RetCode+1 ... N -th vectors // are valid // V - matrix of left singular vectors // (arranged in columns), corresponding // to the singular values in W, if // RetCode=0 and MatV is True. If MatV // is False, V is not used and may be set // to NULL. If RetCode<>0 then the // RetCode+1 ... N -th vectors are valid // RetCode - the error key : // = 0 <=> O'K // else // = k, if the k-th singular value // was not computed after 30 iterations. // // ------------------------------------------------ // // Key Variables are : // // ItnLimit - the limit for iterations // // This routine does not use any machine-dependent // constants. // // ================================================ // // int ItnLimit=300; int i,j,k,l,i1,k1,l1,its,mn,ExitKey; realtype C,G,F,X,S,H,Y,Z,Scale,ANorm,GG; l1 = 0; // this is to keep compiler happy RetCode = 0; if (U!=A) { if (NA==M) for (i=1;i<=M;i++) for (j=1;j<=N;j++) U[i][j] = A[i][j]; else for (i=1;i<=M;i++) for (j=1;j<=N;j++) U[i][j] = A[j][i]; } G = 0.0; Scale = 0.0; ANorm = 0.0; for (i=1;i<=N;i++) { l = i+1; RV1[i] = Scale*G; G = 0.0; S = 0.0; Scale = 0.0; if (i<=M) { for (k=i;k<=M;k++) Scale += fabs(U[k][i]); if (Scale!=0.0) { for (k=i;k<=M;k++) { U[k][i] /= Scale; S += U[k][i]*U[k][i]; } F = U[i][i]; G = -Sign(sqrt(S),F); H = F*G-S; U[i][i] = F-G; if (i!=N) for (j=l;j<=N;j++) { S = 0.0; for (k=i;k<=M;k++) S += U[k][i]*U[k][j]; F = S/H; for (k=i;k<=M;k++) U[k][j] += F*U[k][i]; } for (k=i;k<=M;k++) U[k][i] *= Scale; } } W[i] = Scale*G; G = 0.0; S = 0.0; Scale = 0.0; if ((i<=M) && (i!=N)) { for (k=l;k<=N;k++) Scale += fabs(U[i][k]); if (Scale!=0.0) { for (k=l;k<=N;k++) { U[i][k] /= Scale; S += U[i][k]*U[i][k]; } F = U[i][l]; G = -Sign(sqrt(S),F); H = F*G-S; U[i][l] = F-G; for (k=l;k<=N;k++) RV1[k] = U[i][k]/H; if (i!=M) for (j=l;j<=M;j++) { S = 0.0; for (k=l;k<=N;k++) S += U[j][k]*U[i][k]; for (k=l;k<=N;k++) U[j][k] += S*RV1[k]; } for (k=l;k<=N;k++) U[i][k] *= Scale; } } ANorm = RMax( ANorm,fabs(W[i])+fabs(RV1[i]) ); } // Accumulation of the right-hand transformations if (MatV) for (i=N;i>=1;i--) { if (i!=N) { if (G!=0.0) { for (j=l;j<=N;j++) V[j][i] = (U[i][j]/U[i][l]) / G; for (j=l;j<=N;j++) { S = 0.0; for (k=l;k<=N;k++) S += U[i][k]*V[k][j]; for (k=l;k<=N;k++) V[k][j] += S*V[k][i]; } } for (j=l;j<=N;j++) { V[i][j] = 0.0; V[j][i] = 0.0; } } V[i][i] = 1.0; G = RV1[i]; l = i; } // Accumulation of the left-hand transformations if (MatU) { mn = N; if (M=1;i--) { l = i+1; G = W[i]; if (i!=N) for (j=l;j<=N;j++) U[i][j] = 0.0; if (G!=0.0) { if (i!=mn) for (j=l;j<=N;j++) { S = 0.0; for (k=l;k<=M;k++) S += U[k][i]*U[k][j]; F = (S/U[i][i]) / G; for (k=i;k<=M;k++) U[k][j] += F*U[k][i]; } for (j=i;j<=M;j++) U[j][i] /= G; } else for (j=i;j<=M;j++) U[j][i] = 0.0; U[i][i] += 1.0; } } // Diagonalization of the two-diagonal form. for (k=N;k>=1;k--) { k1 = k-1; its = 0; do { ExitKey = 0; l = k+1; while ((ExitKey==0) && (l>1)) { l--; l1 = l-1; if (fabs(RV1[l])+ANorm==ANorm) ExitKey=1; else if (l1>0) { if (fabs(W[l1])+ANorm==ANorm) ExitKey=2; } } // if (ExitKey!=1) { <-- this is original statement if (ExitKey>1) { // <-- prevents from corruption due to l1<1. // This is a rare case as RV1[1] should be // always 0.0 . Apparently this logics is // on the edge of float-point arithmetic, // therefore extra precaution for the case // of l1<1 was found necessary. C = 0.0; S = 1.0; ExitKey = 0; i = l; while ((ExitKey==0) && (i<=k)) { F = S*RV1[i]; RV1[i] = C*RV1[i]; if (fabs(F)+ANorm==ANorm) ExitKey = 1; else { G = W[i]; H = SrX2Y2(F,G); W[i] = H; C = G/H; S = -F/H; if (MatU) for (j=1;j<=M;j++) { Y = U[j][l1]; Z = U[j][i]; U[j][l1] = Y*C+Z*S; U[j][i] = -Y*S+Z*C; } i++; } } } // Convergence Checking Z = W[k]; if (l!=k) { if (its>=ItnLimit) { RetCode = k; return; } its++; X = W[l]; Y = W[k1]; G = RV1[k1]; H = RV1[k]; F = ((Y-Z)*(Y+Z) + (G-H)*(G+H)) / ( 2.0*H*Y ); if (fabs(F)<=1.0) GG = Sign(sqrt(F*F+1.0),F); else GG = F*sqrt(1.0+1.0/F/F); F = ((X-Z)*(X+Z) + H*(Y/(F+GG)-H)) / X; // Next QR - Transformation C = 1.0; S = 1.0; for (i1=l;i1<=k1;i1++) { i = i1+1; G = RV1[i]; Y = W[i]; H = S*G; G = C*G; Z = SrX2Y2(F,H); RV1[i1] = Z; C = F/Z; S = H/Z; F = X*C+G*S; G = -X*S+G*C; H = Y*S; Y = Y*C; if (MatV) for (j=1;j<=N;j++) { X = V[j][i1]; Z = V[j][i]; V[j][i1] = X*C+Z*S; V[j][i] = -X*S+Z*C; } Z = SrX2Y2(F,H); W[i1] = Z; if (Z!=0.0) { C = F/Z; S = H/Z; } F = C*G+S*Y; X = -S*G+C*Y; if (MatU) for (j=1;j<=M;j++) { Y = U[j][i1]; Z = U[j][i]; U[j][i1] = Y*C+Z*S; U[j][i] = -Y*S+Z*C; } } RV1[l] = 0.0; RV1[k] = F; W[k] = X; } else if (Z<0.0) { W[k] = -Z; if (MatV) for (j=1;j<=N;j++) V[j][k] = -V[j][k]; } } while (l!=k); } } // ----------------------------------------------------- void OrderSVD ( int M, int N, rmatrix U, rmatrix V, rvector W, bool MatU, bool MatV ) { int i,k,j; realtype P; // External loop of the re-ordering for (i=1;iP) { k = j; P = W[j]; } if (k!=i) { // Swapping the singular value W[k] = W[i]; W[i] = P; // Swapping the U's columns ( if needed ) if (MatU) for (j=1;j<=M;j++) { P = U[j][i]; U[j][i] = U[j][k]; U[j][k] = P; } // Swapping the V's columns ( if needed ) if (MatV) for (j=1;j<=N;j++) { P = V[j][i]; V[j][i] = V[j][k]; V[j][k] = P; } } } } /* #ifndef __STDIO_H #include #endif int main ( int argc, char ** argv, char ** env ) { // Test Jacobi matrix A,T,A1; vector Eigen,Aik; realtype SR; int N,i,j,k,Signal; N = 4; GetMatrixMemory ( A,N,N,1,1 ); GetMatrixMemory ( T,N,N,1,1 ); GetMatrixMemory ( A1,N,N,1,1 ); GetVectorMemory ( Eigen,N,1 ); GetVectorMemory ( Aik ,N,1 ); k = 1; for (i=1;i<=N;i++) for (j=i;j<=N;j++) { A[i][j] = k++; A[i][j] *= 1000.0; A[j][i] = A[i][j]; } printf ( " INITIAL MATRIX:\n" ); for (i=1;i<=N;i++) { for (j=1;j<=N;j++) printf ( " %10.4f",A[i][j] ); printf ( "\n" ); } Jacobi ( N,A,T,Eigen,Aik,Signal ); printf ( "\n EIGEN VALUES AND EIGEN VECTORS:\n" ); for (i=1;i<=N;i++) { printf ( " %10.4f ",Eigen[i] ); for (j=1;j<=N;j++) printf ( " %10.4f",T[j][i] ); printf ( "\n" ); } printf ( "\n measure: " ); for (i=1;i<=N;i++) { SR = 0.0; for (j=1;j<=N;j++) SR += T[j][i]*T[j][i]; printf ( " %10.4f",sqrt(SR) ); } printf ( "\n" ); for (i=1;i<=N;i++) for (j=1;j<=N;j++) { A1[i][j] = 0.0; for (k=1;k<=N;k++) A1[i][j] += T[i][k]*Eigen[k]*T[j][k]; } printf ( "\n RESTORED INITIAL MATRIX:\n" ); for (i=1;i<=N;i++) { for (j=1;j<=N;j++) printf ( " %10.4f",A1[j][i] ); printf ( "\n" ); } FreeMatrixMemory ( A,N,1,1 ); FreeMatrixMemory ( T,N,1,1 ); FreeMatrixMemory ( A1,N,1,1 ); FreeVectorMemory ( Eigen,1 ); FreeVectorMemory ( Aik ,1 ); } */ } } mmdb2-2.0.20/mmdb2/mmdb_math_align.h0000644000175000017500000001372013271367640016724 0ustar maartenmaarten// $Id: mmdb_math_align.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Align // ~~~~~~~~~ // **** Classes : mmdb::math::Alignment (char strings alignment) // ~~~~~~~~~~~~ mmdb::math::Alignment1 (int vectors alignment) // // (C) E.Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_MATH_Align__ #define __MMDB_MATH_Align__ #include "mmdb_io_stream.h" namespace mmdb { namespace math { // ===================== AlignParams ====================== DefineClass(AlignParams); DefineStreamFunctions(AlignParams); class AlignParams : public io::Stream { public : realtype gapWeight,spaceWeight; realtype equalScore,nequalScore; int method; AlignParams(); AlignParams ( io::RPStream Object ); void write ( io::RFile f ); void read ( io::RFile f ); protected : void InitAlignParams(); }; // ====================== Alignment ======================= DefineClass(Alignment); enum ALIGN_METHOD { ALIGN_GLOBAL = 0, ALIGN_LOCAL = 1, ALIGN_GLOBLOC = 2, ALIGN_FREEENDS = 3 }; class Alignment : public io::Stream { public : Alignment (); Alignment ( io::RPStream Object ); ~Alignment (); void SetAffineModel ( realtype WGap, realtype WSpace ); void SetScores ( realtype SEqual, realtype SNEqual ); void Align ( cpstr S, cpstr T, ALIGN_METHOD Method=ALIGN_GLOBAL ); inline pstr GetAlignedS() { return AlgnS; } inline pstr GetAlignedT() { return AlgnT; } inline realtype GetScore () { return VAchieved; } inline char GetSpace () { return Space; } realtype GetSimilarity(); // Score-weighted sequence id realtype GetSeqId (); // Primitive sequence id int GetNAlign (); // number of aligned residues virtual void OutputResults ( io::RFile f, cpstr S, cpstr T ); void read ( io::RFile f ); void write ( io::RFile f ); protected : char Space; int AlignKey, SLen,TLen; rmatrix VT,ET,FT; pstr AlgnS,AlgnT; realtype VAchieved; realtype SEq,SNEq, Wg,Ws; virtual void InitAlignment(); virtual void FreeMemory (); virtual realtype Score ( char A, char B ); void BuildGATable ( cpstr S, cpstr T, bool FreeSEnd, bool FreeTEnd ); void BuildLATable ( cpstr S, cpstr T ); void Backtrace ( cpstr S, cpstr T, int J, int I, bool StopAtZero ); void AdjustEnds ( cpstr S, cpstr T, int J, int I ); void PrintVT ( cpstr S, cpstr T ); }; // ====================== Alignment1 ======================= DefineClass(Alignment1); class Alignment1 : public io::Stream { public : Alignment1 (); Alignment1 ( io::RPStream Object ); ~Alignment1(); void SetAffineModel ( realtype WGap, realtype WSpace ); void SetScores ( realtype SEqual, realtype SNEqual ); void Align ( ivector S, int SLength, ivector T, int TLength, ALIGN_METHOD Method=ALIGN_GLOBAL ); inline ivector GetAlignedS () { return AlgnS; } inline ivector GetAlignedT () { return AlgnT; } inline int GetAlignLength() { return AlgnLen; } inline realtype GetScore () { return VAchieved; } realtype GetSimilarity(); // Score-weighted sequence id virtual void OutputResults ( io::RFile f, ivector S, int lenS, ivector T, int lenT ); void read ( io::RFile f ); void write ( io::RFile f ); protected : int Space; int AlignKey, SLen,TLen, AlgnLen; rmatrix VT,ET,FT; ivector AlgnS,AlgnT; realtype VAchieved; realtype SEq,SNEq, Wg,Ws; virtual void InitAlignment1(); virtual void FreeMemory (); virtual realtype Score ( int A, int B ); void BuildGATable ( ivector S, ivector T, bool FreeSEnds, bool FreeTEnds ); void BuildLATable ( ivector S, ivector T ); void Backtrace ( ivector S, ivector T, int J, int I, bool StopAtZero ); void AdjustEnds ( ivector S, ivector T, int J, int I ); void PrintVT ( ivector S, ivector T ); }; } // namespace math } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_rwbrook.cpp0000644000175000017500000032616113271367640016647 0ustar maartenmaarten// $Id: mmdb_rwbrook.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 08.11.17 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_RWBrook // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB), "new rwbrook" // ~~~~~~~~~ // **** Functions : mmdb_f_init_ ( initializer ) // ~~~~~~~~~~~ mmdb_f_quit_ ( disposer ) // autoserials_ ( switch to the autoserials regime ) // setreadcoords_ ( switch for reading coordinates ) // simrwbrook_ ( simulates old RWBROOK printout ) // mmdb_f_openl_ ( associates a unit with a file ) // mmdb_f_open_ ( associates a unit with a file ) // mmdb_f_copy_ ( copies contents of units ) // mmdb_f_delete_ ( deletes part of a unit ) // mmdb_f_settype_ ( changes type of file and r/w mode ) // mmdb_f_setname_ ( changes file name ) // mmdb_f_write_ ( writes a data structure into file ) // mmdb_f_close_ ( closes and disposes a data str-re ) // mmdb_f_advance_ ( advances the internal pointer ) // mmdb_f_rewd_ ( sets internal pointer on the top ) // mmdb_f_bksp_ ( shifts int-l pointer 1 atom back ) // mmdb_f_atom_ ( reads/writes atom properties ) // mmdb_f_coord_ ( reads/writes atom coordinates ) // mmdb_f_setcell_ ( sets the crystal cell parameters ) // mmdb_f_wbspgrp_ ( sets the space group ) // mmdb_f_rbspgrp_ ( gets the space group ) // mmdb_f_wbcell_ ( sets the crystal cell parameters ) // mmdb_f_rbcell_ ( gets the crystal cell parameters ) // mmdb_f_rbcelln_ ( gets the crystal cell parameters ) // mmdb_f_rbrcel_ ( gets the recipricol cell ) // mmdb_f_rborf_ ( returns or fill transf. matrices ) // mmdb_f_orthmat_ ( calc. standard othogonalisations ) // mmdb_f_cvanisou_ ( converts between cryst-c units ) // mmdb_f_wremark_ ( writes a remark statement ) // mmdb_f_setter // mmdb_f_sethet // mmdb_f_getnofncsmates_ // rberrstop_ ( error messenger ) // rbcheckerr_ ( a simple error messenger ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include "string.h" #include "stdlib.h" #include "math.h" #include "mmdb_rwbrook.h" #include "mmdb_manager.h" #include "mmdb_tables.h" #include "hybrid_36.h" // ========================== Channel =========================== DefineClass(Channel) class Channel { public : int nUnit; // unit number int nType; // unit type: 0- PDB; 1- CIF; 2- binary int nRead; // 0: input, 1: output mmdb::PManager MMDBManager; // MMDB manager mmdb::pstr FName; // file name int fPos; // "position" in the file int ErrCode; // error code of last operation bool FAutoSer; // autoserials flag for reading PDB bool FReadCoords; // flag to read coordinate section bool FSimRWBROOK; // flag to simulate old RWBROOK's printout Channel (); ~Channel(); void Dispose(); void Init (); void SetFileType ( mmdb::pstr FType ); void SetFileName ( mmdb::pstr FileName, int FNameLen ); void IdentifyFile( mmdb::pstr ExistingFName ); bool EndOfFile (); mmdb::PAtom * GetAtomArray(); mmdb::PAtom GetAtomI ( int index ); mmdb::PCryst GetCryst (); bool areCrystMatrices(); void Frac2Orth ( mmdb::realtype x, mmdb::realtype y, mmdb::realtype z, mmdb::realtype & xx, mmdb::realtype & yy, mmdb::realtype & zz ); void Orth2Frac ( mmdb::realtype x, mmdb::realtype y, mmdb::realtype z, mmdb::realtype & xx, mmdb::realtype & yy, mmdb::realtype & zz ); void Cryst2Orth ( mmdb::rvector U ); void Orth2Cryst ( mmdb::rvector U ); int SetCell ( mmdb::realtype cell_a, mmdb::realtype cell_b, mmdb::realtype cell_c, mmdb::realtype cell_alpha, mmdb::realtype cell_beta, mmdb::realtype cell_gamma, int OrthCode ); int PutCell ( mmdb::realtype cell_a, mmdb::realtype cell_b, mmdb::realtype cell_c, mmdb::realtype cell_alpha, mmdb::realtype cell_beta, mmdb::realtype cell_gamma, int OrthCode ); int SetSpGroup ( mmdb::pstr spGroup ); int GetSpGroup ( mmdb::pstr spGroup ); int GetCell ( mmdb::realtype & cell_a, mmdb::realtype & cell_b, mmdb::realtype & cell_c, mmdb::realtype & cell_alpha, mmdb::realtype & cell_beta, mmdb::realtype & cell_gamma, mmdb::realtype & cell_v, int & OrthCode ); int GetRCell ( mmdb::realtype & cell_as, mmdb::realtype & cell_bs, mmdb::realtype & cell_cs, mmdb::realtype & cell_alphas, mmdb::realtype & cell_betas, mmdb::realtype & cell_gammas, mmdb::realtype & cell_vs ); int GetNumberOfNCSMates(); // Returns the number of // NCS mates not given in // the file (iGiven==0) void MakeCoordStructure(); void Read (); void Write(); void GetInputBuffer ( mmdb::pstr Line, int & count ); protected : void TranslateError(); }; Channel::Channel() { Init(); } Channel::~Channel() { Dispose(); } void Channel::Init() { nUnit = -1; nType = -1; nRead = 0; MMDBManager = NULL; FName = NULL; ErrCode = 0; fPos = 0; FAutoSer = false; FReadCoords = true; FSimRWBROOK = false; } void Channel::Dispose() { if (MMDBManager) delete MMDBManager; if (FName) delete[] FName; MMDBManager = NULL; FName = NULL; nUnit = -1; nType = -1; nRead = 0; ErrCode = 0; fPos = 0; } void Channel::SetFileType ( mmdb::pstr FType ) { switch (FType[0]) { default : case ' ' : if (nRead==0) nType = -1; // auto at reading else if (MMDBManager) nType = MMDBManager->GetFileType(); // auto at writing else nType = -1; break; case 'P' : nType = 0; break; // PDB case 'C' : nType = 1; break; // CIF case 'B' : nType = 2; break; // BIN } } void Channel::IdentifyFile ( mmdb::pstr ExistingFName ) { if (nType==-1) { if (ExistingFName) { if (mmdb::isMMDBBIN(ExistingFName)==0) nType = 2; else if (mmdb::isPDB(ExistingFName,mmdb::io::GZM_CHECK,true)==0) nType = 0; else if (mmdb::mmcif::isCIF(ExistingFName)==0) nType = 1; else nType = -2; // unidentified } else { if (MMDBManager) { if (MMDBManager->GetFileType()<0) nType = 0; // PDB else nType = MMDBManager->GetFileType(); // same as it was on last input } else nType = 0; } } } void Channel::SetFileName ( mmdb::pstr FileName, int FNameLen ) { if (FName) delete[] FName; FName = new char[FNameLen+1]; strncpy ( FName,FileName,FNameLen ); FName[FNameLen] = char(0); } void Channel::MakeCoordStructure() { if (MMDBManager) MMDBManager->Delete ( mmdb::MMDBFCM_All ); else { MMDBManager = new mmdb::Manager(); MMDBManager->SetFlag ( mmdb::MMDBF_AllowDuplChainID ); } } int Channel::GetNumberOfNCSMates() { // Returns the number of NCS mates not given in the file (iGiven==0) if (!MMDBManager) return RWBERR_NoData; return MMDBManager->GetNumberOfNCSMates(); } void Channel::Read() { int RC; ErrCode = -2; if (!FName) return; MakeCoordStructure(); IdentifyFile ( FName ); if (FAutoSer) MMDBManager->SetFlag ( mmdb::MMDBF_AutoSerials ); else MMDBManager->RemoveFlag ( mmdb::MMDBF_AutoSerials ); if (FReadCoords) MMDBManager->RemoveFlag ( mmdb::MMDBF_NoCoordRead ); else MMDBManager->SetFlag ( mmdb::MMDBF_NoCoordRead ); if (FSimRWBROOK) MMDBManager->SetFlag ( mmdb::MMDBF_SimRWBROOK ); else MMDBManager->RemoveFlag ( mmdb::MMDBF_SimRWBROOK ); MMDBManager->SetFlag ( mmdb::MMDBF_IgnoreDuplSeqNum | mmdb::MMDBF_IgnoreBlankLines | mmdb::MMDBF_IgnoreRemarks | mmdb::MMDBF_IgnoreNonCoorPDBErrors | mmdb::MMDBF_AllowDuplChainID ); switch (nType) { default : nType = 0; // nType=-2: unidentified: try PDB case 0 : ErrCode = MMDBManager->ReadPDBASCII ( FName ); break; case 1 : ErrCode = MMDBManager->ReadCIFASCII ( FName ); break; case 2 : ErrCode = MMDBManager->ReadMMDBF ( FName ); break; } if (ErrCode==0) { RC = MMDBManager->CrystReady(); switch (RC) { case mmdb::CRRDY_NoTransfMatrices : ErrCode = RWBERR_NoMatrices; break; case mmdb::CRRDY_Unchecked : ErrCode = RWBERR_NoCheck; break; case mmdb::CRRDY_Ambiguous : ErrCode = RWBERR_Disagreement; break; case mmdb::CRRDY_NoCell : ErrCode = RWBERR_NoCellParams; break; default : ; } } fPos = 0; // begining of the file TranslateError(); } void Channel::Write() { ErrCode = -3; if ((!MMDBManager) || (!FName)) return; IdentifyFile ( FName ); switch (nType) { default : nType = 0; // nType=-2: unidentified: make PDB case 0 : ErrCode = MMDBManager->WritePDBASCII ( FName ); break; case 1 : ErrCode = MMDBManager->WriteCIFASCII ( FName ); break; case 2 : ErrCode = MMDBManager->WriteMMDBF ( FName ); break; } // we do not change fPos here! TranslateError(); } void Channel::TranslateError() { switch (ErrCode) { case mmdb::Error_CantOpenFile : ErrCode = RWBERR_CantOpenFile; break; case mmdb::Error_UnrecognizedInteger : ErrCode = RWBERR_WrongInteger; break; case mmdb::Error_NoData : ErrCode = RWBERR_NotACIFFile; break; case mmdb::Error_WrongModelNo : ErrCode = RWBERR_WrongModelNo; break; case mmdb::Error_DuplicatedModel : ErrCode = RWBERR_DuplicatedModel; break; case mmdb::Error_ForeignFile : ErrCode = RWBERR_ForeignFile; break; case mmdb::Error_WrongEdition : ErrCode = RWBERR_WrongEdition; break; case mmdb::Error_ATOM_Unrecognized : ErrCode = RWBERR_ATOM_Unrecognd; break; case mmdb::Error_ATOM_AlreadySet : ErrCode = RWBERR_ATOM_AlreadySet; break; case mmdb::Error_ATOM_NoResidue : ErrCode = RWBERR_ATOM_NoResidue; break; case mmdb::Error_ATOM_Unmatch : ErrCode = RWBERR_ATOM_Unmatch; break; case mmdb::Error_NotACIFFile : ErrCode = RWBERR_NotACIFFile; break; case mmdb::Error_UnrecognCIFItems : ErrCode = RWBERR_UnrecognCIFItems; break; case mmdb::Error_MissingCIFField : ErrCode = RWBERR_MissingCIFField; break; case mmdb::Error_EmptyCIFLoop : ErrCode = RWBERR_EmptyCIFLoop; break; case mmdb::Error_UnexpEndOfCIF : ErrCode = RWBERR_UnexpEndOfCIF; break; case mmdb::Error_MissgCIFLoopField : ErrCode = RWBERR_MissgCIFLoopField; break; case mmdb::Error_NotACIFStructure : ErrCode = RWBERR_NotACIFStructure; break; case mmdb::Error_NotACIFLoop : ErrCode = RWBERR_NotACIFLoop; break; case mmdb::Error_UnrecognizedReal : ErrCode = RWBERR_WrongReal; break; case mmdb::Error_Ok : ErrCode = RWBERR_Ok; break; case mmdb::Error_WrongChainID : ErrCode = RWBERR_WrongChainID; break; case mmdb::Error_WrongEntryID : ErrCode = RWBERR_WrongEntryID; break; case mmdb::Error_SEQRES_serNum : ErrCode = RWBERR_SEQRES_serNum; break; case mmdb::Error_SEQRES_numRes : ErrCode = RWBERR_SEQRES_numRes; break; case mmdb::Error_SEQRES_extraRes : ErrCode = RWBERR_SEQRES_exraRes; break; case mmdb::Error_NCSM_Unrecognized : ErrCode = RWBERR_NCSM_Unrecogn; break; case mmdb::Error_NCSM_AlreadySet : ErrCode = RWBERR_NCSM_AlreadySet; break; case mmdb::Error_NCSM_WrongSerial : ErrCode = RWBERR_NCSM_WrongSerial; break; case mmdb::Error_NCSM_UnmatchIG : ErrCode = RWBERR_NCSM_UnmatchIG; break; case mmdb::Error_NoModel : ErrCode = RWBERR_NoModel; break; case mmdb::Error_NoSheetID : ErrCode = RWBERR_NoSheetID; break; case mmdb::Error_WrongSheetID : ErrCode = RWBERR_WrongSheetID; break; case mmdb::Error_WrongStrandNo : ErrCode = RWBERR_WrongStrandNo; break; case mmdb::Error_WrongNumberOfStrands : ErrCode = RWBERR_WrongNofStrands; break; case mmdb::Error_WrongSheetOrder : ErrCode = RWBERR_WrongSheetOrder; break; case mmdb::Error_HBondInconsistency : ErrCode = RWBERR_HBondInconsis; break; case mmdb::Error_EmptyResidueName : ErrCode = RWBERR_EmptyResidueName; break; case mmdb::Error_DuplicateSeqNum : ErrCode = RWBERR_DuplicateSeqNum; break; case mmdb::Error_NoLogicalName : ErrCode = RWBERR_NoLogicalName; break; case mmdb::Error_GeneralError1 : ErrCode = RWBERR_GeneralError1; break; default : ; } } bool Channel::EndOfFile() { int nA; if (MMDBManager) { nA = MMDBManager->GetNumberOfAtoms(); if (fPos>nA) { fPos = nA+1; return true; } } else return true; return false; } mmdb::PAtom * Channel::GetAtomArray() { if (MMDBManager) return MMDBManager->GetAtomArray(); else return NULL; } mmdb::PAtom Channel::GetAtomI ( int index ) { // returns index-th atom, as counted from the // top of file if (MMDBManager) return MMDBManager->GetAtomI ( index ); else return NULL; } mmdb::PCryst Channel::GetCryst() { if (MMDBManager) return MMDBManager->GetCrystData(); else return NULL; } bool Channel::areCrystMatrices() { if (MMDBManager) return MMDBManager->isTransfMatrix(); else return false; } void Channel::Frac2Orth ( mmdb::realtype x, mmdb::realtype y, mmdb::realtype z, mmdb::realtype & xx, mmdb::realtype & yy, mmdb::realtype & zz ) { if (MMDBManager) MMDBManager->Frac2Orth ( x,y,z,xx,yy,zz ); else { xx = x; yy = y; zz = z; } } void Channel::Orth2Frac ( mmdb::realtype x, mmdb::realtype y, mmdb::realtype z, mmdb::realtype & xx, mmdb::realtype & yy, mmdb::realtype & zz ) { if (MMDBManager) MMDBManager->Orth2Frac ( x,y,z,xx,yy,zz ); else { xx = x; yy = y; zz = z; } } void Channel::Cryst2Orth ( mmdb::rvector U ) { if (MMDBManager) MMDBManager->GetCrystData()->Cryst2Orth ( U ); } void Channel::Orth2Cryst ( mmdb::rvector U ) { if (MMDBManager) MMDBManager->GetCrystData()->Orth2Cryst ( U ); } int Channel::PutCell ( mmdb::realtype cell_a, mmdb::realtype cell_b, mmdb::realtype cell_c, mmdb::realtype cell_alpha, mmdb::realtype cell_beta, mmdb::realtype cell_gamma, int OrthCode ) { if (MMDBManager) { mmdb::PCryst cryst = MMDBManager->GetCrystData(); cryst->PutCell ( cell_a,cell_b,cell_c, cell_alpha,cell_beta,cell_gamma, OrthCode ); if ((cell_a!=0.0) || (OrthCode>0)) { if (cryst->CellCheck & mmdb::CCHK_Disagreement) return RWBERR_Disagreement; if (cryst->CellCheck & mmdb::CCHK_NoOrthCode) return RWBERR_NoOrthCode; if (cryst->CellCheck & mmdb::CCHK_Unchecked) return RWBERR_NoCheck; } return RWBERR_Ok; } else return RWBERR_NoFile; } int Channel::SetCell ( mmdb::realtype cell_a, mmdb::realtype cell_b, mmdb::realtype cell_c, mmdb::realtype cell_alpha, mmdb::realtype cell_beta, mmdb::realtype cell_gamma, int OrthCode ) { if (MMDBManager) { mmdb::PCryst cryst = MMDBManager->GetCrystData(); cryst->SetCell ( cell_a,cell_b,cell_c, cell_alpha,cell_beta,cell_gamma, OrthCode ); if (cryst->CellCheck & mmdb::CCHK_Disagreement) return RWBERR_Disagreement; if (cryst->CellCheck & mmdb::CCHK_NoOrthCode) return RWBERR_NoOrthCode; if (cryst->CellCheck & mmdb::CCHK_Unchecked) return RWBERR_NoCheck; return RWBERR_Ok; } else return RWBERR_NoFile; } int Channel::SetSpGroup ( mmdb::pstr spGroup ) { if (MMDBManager) { MMDBManager->SetSpaceGroup(spGroup); return RWBERR_Ok; } else return RWBERR_NoFile; } int Channel::GetSpGroup ( mmdb::pstr spGroup ) { if (MMDBManager) { mmdb::PCryst cryst = MMDBManager->GetCrystData(); if (cryst->WhatIsSet & mmdb::CSET_SpaceGroup) strcpy ( spGroup,cryst->spaceGroup ); else strcpy ( spGroup," " ); return RWBERR_Ok; } else return RWBERR_NoFile; } int Channel::GetCell ( mmdb::realtype & cell_a, mmdb::realtype & cell_b, mmdb::realtype & cell_c, mmdb::realtype & cell_alpha, mmdb::realtype & cell_beta, mmdb::realtype & cell_gamma, mmdb::realtype & cell_v, int & OrthCode ) { if (MMDBManager) { mmdb::PCryst cryst = MMDBManager->GetCrystData(); cell_a = cryst->a; cell_b = cryst->b; cell_c = cryst->c; cell_alpha = cryst->alpha; cell_beta = cryst->beta; cell_gamma = cryst->gamma; cell_v = cryst->Vol; OrthCode = cryst->NCode; if (!(cryst->WhatIsSet & mmdb::CSET_CellParams)) return RWBERR_NoCellParams; if (!(cryst->WhatIsSet & mmdb::CSET_Transforms)) return RWBERR_NoCheck; // if (MMDBManager->Cryst.CellCheck & mmdb::CCHK_NoOrthCode) // return RWBERR_NoOrthCode; return RWBERR_Ok; } else return RWBERR_NoFile; } int Channel::GetRCell ( mmdb::realtype & cell_as, mmdb::realtype & cell_bs, mmdb::realtype & cell_cs, mmdb::realtype & cell_alphas, mmdb::realtype & cell_betas, mmdb::realtype & cell_gammas, mmdb::realtype & cell_vs ) { if (MMDBManager) { mmdb::PCryst cryst = MMDBManager->GetCrystData(); cryst->GetRCell ( cell_as,cell_bs,cell_cs, cell_alphas,cell_betas,cell_gammas, cell_vs ); if (!(cryst->WhatIsSet & mmdb::CSET_CellParams)) return RWBERR_NoCellParams; if (!(cryst->WhatIsSet & mmdb::CSET_Transforms)) return RWBERR_NoCheck; return RWBERR_Ok; } else return RWBERR_NoFile; } void Channel::GetInputBuffer ( mmdb::pstr Line, int & count ) { if (MMDBManager) MMDBManager->GetInputBuffer ( Line,count ); else { strcpy ( Line,"" ); count = -1; } } // ======================== static data =========================== static int nChannels; // number of channels in processing static PChannel * channel; // array of channels in processing static bool FAutoSer; // flag to automatically generate // serial numbers at reading PDB files static bool FReadCoords; // flag to read coordinates; if set to // false, only the header of PDB file // is read static bool FSimRWBROOK; // flag to simulate old RWBROOK printout // as closely as possible static char LastFunc[80]; // name of the last called function static int LastUnit; // number of the last unit called static int LastRC; // last return code static int LastSer; // last serial number kept for // certain warnings // ======================== RWBrook API =========================== FORTRAN_SUBR ( MMDB_F_INIT, mmdb_f_init,(),(),() ) { mmdb::InitMatType(); nChannels = 0; channel = NULL; strcpy ( LastFunc,"MMDB_F_Init" ); LastUnit = -1; LastRC = 0; LastSer = 0; FAutoSer = false; FReadCoords = true; FSimRWBROOK = false; } FORTRAN_SUBR ( MMDB_F_QUIT, mmdb_f_quit,(),(),() ) { int i; for (i=0;inUnit==iUnit) return i; } return -1; } int MakeChannel ( int iUnit ) { // If iUnit-th unit already exists, it is // reinitialized. Otherwise the function looks // for a not used channel, and if there is one, // associates the new iUnit-th unit with it. // If there is no unused channels, the new one // is created and the new iUnit-th unit is // associated with it. // Returns serial number of the channel // associated with the newly reinitialized // or created unit. int i,m; PChannel * channel1; m = GetChannel ( iUnit ); if (m>=0) { // such channel already exists channel[m]->Dispose(); // clear it first channel[m]->Init(); // reinitialize it channel[m]->nUnit = iUnit; return m; } for (i=0;inUnit = iUnit; return m; } FORTRAN_SUBR ( MMDB_F_OPEN, mmdb_f_open, ( // lengths-at-end list mmdb::machine::fpstr FName, // file name mmdb::machine::fpstr RWStat, // "INPUT" or "OUTPUT" mmdb::machine::fpstr FType, // "PDB", "CIF", "BIN" or " " int * iUnit, // channel number int * iRet, // returns error code int FName_len, // fortran-hidden length of FName int RWStat_len, // fortran-hidden length of RWStat int FType_len // fortran-hidden length of FType ), ( // lengths-in-structure list mmdb::machine::fpstr FName, mmdb::machine::fpstr RWStat, mmdb::machine::fpstr FType, int * iUnit, int * iRet ), ( // lengths-follow list mmdb::machine::fpstr FName, int FName_len, mmdb::machine::fpstr RWStat, int RWStat_len, mmdb::machine::fpstr FType, int FType_len, int * iUnit, int * iRet ) ) { UNUSED_ARGUMENT(RWStat_len); UNUSED_ARGUMENT(FType_len); int k; char L[500]; #ifdef WIN32 mmdb::GetStrTerWin32File ( L,FTN_STR(FName),0,sizeof(L),FTN_LEN(FName) ); #else mmdb::GetStrTer ( L,FTN_STR(FName),0,sizeof(L),FTN_LEN(FName) ); #endif strcpy ( LastFunc,"MMDB_F_Open" ); LastUnit = *iUnit; if (*iUnit==0) { // generate unit number *iUnit = 1; do { k = GetChannel ( *iUnit ); if (k>=0) *iUnit = *iUnit+1; } while (k>=0); } // create channel k = MakeChannel ( *iUnit ); if (k>=0) { if (FTN_STR(RWStat)[0]=='I') { channel[k]->nRead = 0; channel[k]->FAutoSer = FAutoSer; channel[k]->FReadCoords = FReadCoords; channel[k]->FSimRWBROOK = FSimRWBROOK; } else channel[k]->nRead = 1; // store file name channel[k]->SetFileName ( L,sizeof(L) ); // store unit type channel[k]->SetFileType ( FTN_STR(FType) ); channel[k]->IdentifyFile( L ); if (FSimRWBROOK) { switch (channel[k]->nType) { default : printf ( " unknown-format" ); break; case 0 : printf ( " PDB" ); break; case 1 : printf ( " mmCIF" ); break; case 2 : printf ( " MMDB BINARY" ); } printf ( " file is being opened on unit %i",*iUnit ); if (FTN_STR(RWStat)[0]=='I') printf ( " for INPUT.\n\n" ); else printf ( " for OUTPUT.\n\n" ); } if (FTN_STR(RWStat)[0]=='I') { channel[k]->Read(); *iRet = channel[k]->ErrCode; } else { channel[k]->MakeCoordStructure(); channel[k]->fPos = 1; *iRet = RWBERR_Ok; } } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_OPENL, mmdb_f_openl, ( // lengths-at-end list mmdb::machine::fpstr LName, // logical name mmdb::machine::fpstr RWStat, // "INPUT" or "OUTPUT" mmdb::machine::fpstr FType, // "PDB", "CIF", "BIN" or " " int * iUnit, // channel number int * iRet, // returns error code int LName_len, // fortran-hidden length of LName int RWStat_len, // fortran-hidden length of RWStat int FType_len // fortran-hidden length of FType ), ( // lengths-in-structure list mmdb::machine::fpstr LName, mmdb::machine::fpstr RWStat, mmdb::machine::fpstr FType, int * iUnit, int * iRet ), ( // lengths-follow list mmdb::machine::fpstr LName, int LName_len, mmdb::machine::fpstr RWStat, int RWStat_len, mmdb::machine::fpstr FType, int FType_len, int * iUnit, int * iRet ) ) { char L[200]; mmdb::pstr S; char_struct(FName) strcpy ( LastFunc,"MMDB_F_Openl" ); mmdb::GetStrTer ( L,FTN_STR(LName),0,sizeof(L),FTN_LEN(LName) ); S = getenv ( L ); if (S) { fill_char_struct(FName,S) } else if (FTN_STR(RWStat)[0]=='O') { // The user may not have assigned a logical // for output, so that the program should write file "XYZOUT". This // is allowed as a convenience when user is not really interested // in output file. fill_char_struct(FName,L) } else { *iRet = RWBERR_NoLogicalName; return; } printf ( "\n Logical name: %s File name: %s\n",L,FName ); FORTRAN_CALL ( MMDB_F_OPEN, mmdb_f_open, ( FName,RWStat,FType,iUnit,iRet, FName_len,RWStat_len,FType_len ), ( &FName,RWStat,FType,iUnit,iRet ), ( FName,FName_len,RWStat,RWStat_len, FType,FType_len,iUnit,iRet ) ); } FORTRAN_SUBR ( MMDB_F_COPY, mmdb_f_copy, ( // lengths-at-end list int * iUnit1, // destination unit int * iUnit2, // source unit int * copyKey, // copy key: // = 1 copy all // = 2 copy all except coordinates // = 3 copy title section only // = 4 copy crystallographic // section only // = 5 copy coordinate section only // any other value does not do anything int * iRet // return code: // =0 if success // =RWBERR_NoChannel if a unit // does not exist ), ( // lengths-in-structure list int * iUnit1, int * iUnit2, int * copyKey, int * iRet ), ( // lengths-follow list int * iUnit1, int * iUnit2, int * copyKey, int * iRet ) ) { int k1,k2; mmdb::COPY_MASK copyMask; strcpy ( LastFunc,"MMDB_F_Copy" ); LastUnit = *iUnit1; k1 = GetChannel ( LastUnit ); if (k1>=0) { if (channel[k1]->MMDBManager) { LastUnit = *iUnit2; k2 = GetChannel ( LastUnit ); if (k2>=0) { if (channel[k2]->MMDBManager) { switch (*copyKey) { case 1 : copyMask = mmdb::MMDBFCM_All; break; case 2 : copyMask = mmdb::MMDBFCM_Top; break; case 3 : copyMask = mmdb::MMDBFCM_Title; break; case 4 : copyMask = mmdb::MMDBFCM_Cryst; break; case 5 : copyMask = mmdb::MMDBFCM_Coord; break; default : copyMask = mmdb::MMDBFCM_None; } channel[k1]->MMDBManager->Copy ( channel[k2]->MMDBManager, copyMask ); *iRet = RWBERR_Ok; } else *iRet = RWBERR_NoFile; } else *iRet = RWBERR_NoChannel; } else *iRet = RWBERR_NoFile; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_DELETE, mmdb_f_delete, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" int * delKey, // delete key: // = 1 delete all // = 2 delete all except coordinates // = 3 delete title section only // = 4 delete crystallographic // section only // = 5 delete coordinate section only // any other value does not do anything int * iRet // return code: // =0 if success // =RWBERR_NoChannel if a unit // does not exist // =RWBERR_NoFile if a unit // was not opened ), ( // lengths-in-structure list int * iUnit, int * delKey, int * iRet ), ( // lengths-follow list int * iUnit, int * delKey, int * iRet ) ) { int k; mmdb::word delMask; strcpy ( LastFunc,"MMDB_F_Delete" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k>=0) { if (channel[k]->MMDBManager) { switch (*delKey) { case 1 : delMask = mmdb::MMDBFCM_All; break; case 2 : delMask = mmdb::MMDBFCM_Top; break; case 3 : delMask = mmdb::MMDBFCM_Title; break; case 4 : delMask = mmdb::MMDBFCM_Cryst; break; case 5 : delMask = mmdb::MMDBFCM_Coord; break; default : delMask = 0x0000; } channel[k]->MMDBManager->Delete ( delMask ); *iRet = RWBERR_Ok; } else *iRet = RWBERR_NoFile; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SETTYPE, mmdb_f_settype, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::fpstr FType, // "PDB", "CIF", "BIN" or " " mmdb::machine::fpstr RWStat, // "INPUT" or "OUTPUT" int * iRet, // returns -1 if unit not found, // otherwise 0 int FType_len, // fortran-hidden length of FType int RWStat_len // fortran-hidden length of RWStat ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr FType, mmdb::machine::fpstr RWStat, int * iRet ), ( // length-follow list int * iUnit, mmdb::machine::fpstr FType, int FType_len, mmdb::machine::fpstr RWStat, int RWStat_len, int * iRet ) ) { UNUSED_ARGUMENT(FType_len); UNUSED_ARGUMENT(RWStat_len); int k; strcpy ( LastFunc,"MMDB_F_SetType" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k>=0) { // store unit type channel[k]->SetFileType ( FTN_STR(FType) ); // store unit mode if (FTN_STR(RWStat)[0]=='I') channel[k]->nRead = 0; else channel[k]->nRead = 1; *iRet = RWBERR_Ok; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SETNAME, mmdb_f_setname, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::fpstr FName, // file name int * iRet, // returns -1 if unit not found, // otherwise 0 int FName_len // fortran-hidden length of FName ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr FName, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr FName, int FName_len, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_SetName" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else { // store file name channel[k]->SetFileName ( FTN_STR(FName),FTN_LEN(FName) ); *iRet = RWBERR_Ok; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_WRITE, mmdb_f_write, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_Write" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else { channel[k]->Write(); *iRet = channel[k]->ErrCode; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_CLOSE, mmdb_f_close, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_Close" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else if (channel[k]->nRead==1) { channel[k]->Write(); *iRet = channel[k]->ErrCode; if (!(*iRet)) { delete channel[k]; channel[k] = NULL; } } else { delete channel[k]; channel[k] = NULL; *iRet = RWBERR_Ok; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_ADVANCE, mmdb_f_advance, ( // lengths-at-end list int * iUnit, // unit number int * iOut, // output echo file int * iTer, // FLAG =1, return iRet=1 if 'ter' card found // =0, do not return on 'ter' card int * iRet // =0 if normal return // =1 if return on 'ter' card (iTer=1) // =2 if return on end of file // =3 if return on 'hetatm' card // =RWBERR_NoChannel if unit does not exist // =RWBERR_NoAdvance if pointer was not // advanced ), ( // lengths-in-structure list int * iUnit, int * iOut, int * iTer, int * iRet ), ( // lengths-follow list int * iUnit, int * iOut, int * iTer, int * iRet ) ) { UNUSED_ARGUMENT(iOut); int k; mmdb::PAtom atom; strcpy ( LastFunc,"mmdb_f_advance" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) *iRet = RWBERR_NoChannel; else if (channel[k]->nRead==0) { // in the input file, try to get pointer on the next atom do { channel[k]->fPos++; // advance the pointer on Atom array if (channel[k]->EndOfFile()) { atom = NULL; break; } atom = channel[k]->GetAtomI ( channel[k]->fPos ); if (atom) { if ((atom->Ter) && (*iTer==0)) { // ignore 'ter' card if iTer is set to 0 atom = NULL; } } } while (!atom); if (!atom) *iRet = 2; // no atom found == end of file else if (atom->Ter) *iRet = 1; // 'ter' card encountered else if (atom->Het) *iRet = 3; // 'hetatm' card encountered else *iRet = 0; // advance ok; normal return } else { // in the output file, just advance the pointer if (channel[k]->fPos==0) { channel[k]->fPos++; *iRet = 0; } else { atom = channel[k]->GetAtomI ( channel[k]->fPos ); if (atom) { // the previous atom was set -- advance the pointer channel[k]->fPos++; *iRet = 0; } else // no atom was set; make no advancement *iRet = RWBERR_NoAdvance; } } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_REWD, mmdb_f_rewd, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_Rewd" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k>=0) { channel[k]->fPos = 0; if (channel[k]->nRead!=0) *iRet = RWBWAR_RewOutput; else *iRet = RWBERR_Ok; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_BKSP, mmdb_f_bksp, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_BkSp" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k>=0) { *iRet = RWBERR_Ok; if (channel[k]->fPos==0) *iRet |= RWBWAR_FileTop; else channel[k]->fPos--; if (channel[k]->nRead!=0) *iRet |= RWBWAR_RewOutput; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SEEK, mmdb_f_seek, ( // lengths-at-end list int * iUnit, // unit number int * fPos, // position to set int * iRet // return code: // 0 Ok // 1 'ter' card met // 2 end of file // 3 'hetatm' card met // <0 error: // RWBERR_NoChannel // iUnit was not // initialized // RWBERR_EmptyPointer // fPos-th position ), ( // lengths-in-structure list int * iUnit, int * fPos, int * iRet ), ( // lengths-follow list int * iUnit, int * fPos, int * iRet ) ) { int k; mmdb::PAtom atom; strcpy ( LastFunc,"MMDB_F_Seek" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) *iRet = RWBERR_NoChannel; else { // set the pointer channel[k]->fPos = mmdb::IMax(0,*fPos); if (*fPos==0) *iRet = RWBWAR_FileTop; else *iRet = RWBERR_Ok; if (channel[k]->nRead==0) { // in the input file, check the end-of-file state // and analyze the atom if (channel[k]->EndOfFile()) *iRet = 2; atom = channel[k]->GetAtomI ( channel[k]->fPos ); if (!atom) *iRet = RWBERR_EmptyPointer; // empty place else if (atom->Ter) *iRet = 1; // 'ter' card encountered else if (atom->Het) *iRet = 3; // 'hetatm' card encountered } // in the output file, there is nothing to do } LastRC = *iRet; } void Make_AN_ID_IZ ( mmdb::PAtom atom, mmdb::pstr AtNam, int AtNam_L, mmdb::pstr ID, int ID_L, int * IZ, int * iRet ) { char chrg[10]; int i,k; if (atom->Ter) { mmdb::strcpy_ns ( AtNam,mmdb::pstr(" "),AtNam_L ); mmdb::strcpy_ns ( ID ,mmdb::pstr(" "),ID_L ); *IZ = 7; } else { if (atom->name[0]==' ') mmdb::strcpy_ns ( AtNam,&(atom->name[1]),4 ); else mmdb::strcpy_ns ( AtNam,atom->name,4 ); // first try to identify the atom with the element name mmdb::strcpy_ns ( ID,atom->element,ID_L ); // not more than ID_L symbols // from element until but not including // the terminated null are copied into // ID, and the latter is padded with // spaces up to the length of ID_L if (ID_L>3) { // if length permits, add ID with atom charge // (always 2 symbols). atom->GetAtomCharge(chrg); ID[2] = chrg[0]; ID[3] = chrg[1]; } k = 0; while ((kelement[0]!=mmdb::ElementName[k][0]) || (atom->element[1]!=mmdb::ElementName[k][1]))) k++; if (k>=mmdb::nElementNames) { // no match for atom ID -- make sure to set it blank mmdb::strcpy_ns ( ID,mmdb::pstr(" "),ID_L ); // try to identify the atom using the atom name k = 0; while ((kname[0]!=mmdb::ElementName[k][0]) || (atom->name[1]!=mmdb::ElementName[k][1]))) k++; // try to identify a heteroatom i = 0; while ((i=mmdb::nElementNames)) { if ((atom->name[0]==mmdb::HydAtomName[i][0]) && (atom->name[1]==mmdb::HydAtomName[i][1])) k = 0; i++; } if (k>=mmdb::nElementNames) { // unknown or ambiguous formfactor k = -1; if ((atom->name[0]==' ') && (atom->name[1]=='A')) k = 6; if (k==-1) *iRet |= RWBWAR_UnkFormFactor; else *iRet |= RWBWAR_AmbFormFactor; } } *IZ = k+1; if (*IZ==0) mmdb::strcpy_ns ( ID,mmdb::pstr(" "),ID_L ); else { if (ID_L>3) { if (ID[0]==' ') { if ((AtNam[2]=='+') || (AtNam[2]=='-')) { ID[2] = AtNam[2]; ID[3] = AtNam[3]; } } else if ((ID[2]!='+') && (ID[2]!='-')) { ID[2] = ' '; ID[3] = ' '; } } mmdb::strcpy_ns ( ID,mmdb::ElementName[k],mmdb::IMin(2,ID_L) ); } } } FORTRAN_SUBR ( MMDB_F_ATOM, mmdb_f_atom, ( // lengths-at-end list int * iUnit, // unit number int * iSer, // atom serial number mmdb::machine::fpstr AtNam, // atom name (left justified) mmdb::machine::fpstr ResNam, // residue name mmdb::machine::fpstr ChnNam, // chain name int * iResN, // residue number as an integer mmdb::machine::fpstr ResNo, // residue number as character (input only) mmdb::machine::fpstr InsCod, // the insertion code mmdb::machine::fpstr AltCod, // the alternate conformation code mmdb::machine::fpstr segID, // segment ID int * IZ, // atomic number (input only, returned as // 7 from ambiguous atoms) mmdb::machine::fpstr ID, // atomic ID related to atomic number // (element symbol right justified), plus // the ionic state +2, +3 etc.. // int * iRet, // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // RWBERR_Error1 internal error #1 // RWBERR_Error2 internal error #2 // RWBERR_Error3 internal error #3 // // >=0 : success, warning flags: // RWBWAR_WrongSerial if serial number // differs from the position // number in the file // RWBWAR_UnkFormFactor unknown formfactor // RWBWAR_AmbFormFactor ambiguous formfactor // int AtNam_len, // fortran-hidden length of AtNam int ResNam_len, // fortran-hidden length of ResNam int ChnNam_len, // fortran-hidden length of ChnNam int ResNo_len, // fortran-hidden length of ResNo int InsCod_len, // fortran-hidden length of InsCod int AltCod_len, // fortran-hidden length of AltCod int segID_len, // fortran-hidden length of SegID int ID_len // fortran-hidden length of ID ), ( // lengths-in-structure list int * iUnit, int * iSer, mmdb::machine::fpstr AtNam, mmdb::machine::fpstr ResNam, mmdb::machine::fpstr ChnNam, int * iResN, mmdb::machine::fpstr ResNo, mmdb::machine::fpstr InsCod, mmdb::machine::fpstr AltCod, mmdb::machine::fpstr segID, int * IZ, mmdb::machine::fpstr ID, int * iRet ), ( // lengths-follow list int * iUnit, int * iSer, mmdb::machine::fpstr AtNam, int AtNam_len, mmdb::machine::fpstr ResNam, int ResNam_len, mmdb::machine::fpstr ChnNam, int ChnNam_len, int * iResN, mmdb::machine::fpstr ResNo, int ResNo_len, mmdb::machine::fpstr InsCod, int InsCod_len, mmdb::machine::fpstr AltCod, int AltCod_len, mmdb::machine::fpstr segID, int segID_len, int * IZ, mmdb::machine::fpstr ID, int ID_len, int * iRet ) ) { int k,RC; mmdb::ChainID chainID; mmdb::ResName resName; mmdb::InsCode insCode; mmdb::AtomName atomName; mmdb::AltLoc altLoc; mmdb::SegID sgID; mmdb::Element element; mmdb::PAtom atom; char charge[10]; strcpy ( LastFunc,"MMDB_F_Atom" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } *iRet = RWBERR_Ok; if (channel[k]->nRead==0) { // reading the atom characteristics atom = channel[k]->GetAtomI ( channel[k]->fPos ); if (!atom) { // atom position was not advanced properly *iRet = RWBERR_EmptyPointer; LastRC = *iRet; return; } *iSer = atom->serNum; if (*iSer!=channel[k]->fPos) *iRet |= RWBWAR_WrongSerial; LastSer = *iSer; Make_AN_ID_IZ ( atom,FTN_STR(AtNam),FTN_LEN(AtNam), FTN_STR(ID),FTN_LEN(ID),IZ,iRet ); if (atom->residue) { mmdb::strcpy_ns ( FTN_STR(ResNam),atom->residue->name,FTN_LEN(ResNam) ); *iResN = atom->residue->seqNum; mmdb::PutInteger ( FTN_STR(ResNo),*iResN,mmdb::IMin(4,FTN_LEN(ResNo)) ); mmdb::strcpy_ns ( FTN_STR(InsCod),atom->residue->insCode,FTN_LEN(InsCod) ); mmdb::strcpy_ns ( &(FTN_STR(ResNo)[4]),FTN_STR(InsCod),FTN_LEN(ResNo)-4 ); mmdb::strcpy_ns ( FTN_STR(ChnNam),atom->GetChainID(),FTN_LEN(ChnNam) ); } else { mmdb::strcpy_ns ( FTN_STR(ResNam),mmdb::pstr(" "),FTN_LEN(ResNam) ); mmdb::strcpy_ns ( FTN_STR(ChnNam),mmdb::pstr(" ") ,FTN_LEN(ChnNam) ); *iResN = 0; mmdb::strcpy_ns ( FTN_STR(ResNo) ,mmdb::pstr("0") ,FTN_LEN(ResNo) ); mmdb::strcpy_ns ( FTN_STR(InsCod),mmdb::pstr(" ") ,FTN_LEN(InsCod) ); } mmdb::strcpy_ns ( FTN_STR(AltCod),atom->altLoc,FTN_LEN(AltCod) ); mmdb::strcpy_ns ( FTN_STR(segID) ,atom->segID ,FTN_LEN(segID) ); } else { // storing the atom characteristics if (!channel[k]->MMDBManager) { *iRet = RWBERR_Error1; // should never happen LastRC = *iRet; return; } mmdb::GetStrTer ( chainID,FTN_STR(ChnNam),1,sizeof(chainID),FTN_LEN(ChnNam) ); mmdb::GetStrTer ( resName,FTN_STR(ResNam),3,sizeof(resName),FTN_LEN(ResNam) ); mmdb::GetStrTer ( insCode,FTN_STR(InsCod),1,sizeof(insCode),FTN_LEN(InsCod) ); mmdb::GetStrTer ( altLoc ,FTN_STR(AltCod),1,sizeof(altLoc) ,FTN_LEN(AltCod) ); mmdb::GetStrTer ( sgID ,FTN_STR(segID) ,4,sizeof(sgID) ,FTN_LEN(segID) ); element[0] = FTN_STR(ID)[0]; element[1] = FTN_STR(ID)[1]; element[2] = char(0); if (FTN_LEN(ID)>3) { charge [0] = FTN_STR(ID)[2]; charge [1] = FTN_STR(ID)[3]; charge [2] = char(0); } else charge [0] = char(0); mmdb::CutSpaces ( resName,mmdb::SCUTKEY_BEGEND ); if (FTN_STR(ID)[0]==' ') { atomName[0] = char(0); // if ((FTN_STR(AtNam)[1]=='H') || // ((FTN_STR(AtNam)[1]=='D') && (FTN_STR(ID)[2]=='D'))) { // int i = 0; // while ((iMMDBManager->PutAtom ( channel[k]->fPos,*iSer, atomName,resName,chainID,*iResN, insCode,altLoc,sgID,element ); if (RC) { printf ( "Unusual error in MMDB_F_Atom, RC=%i\n" " fPos=%i\n" " iSer=%i\n" " atomName=[%s]\n" " resName=[%s]\n" " chainID=[%s]\n" " iResN=%i\n" " insCode=[%s]\n" " altLoc=[%s]\n" " sgID=[%s]\n" " element=[%s]\n", RC, channel[k]->fPos,*iSer, atomName,resName,chainID,*iResN, insCode,altLoc,sgID,element ); *iRet = RWBERR_Error2; // should never happen LastRC = *iRet; return; } mmdb::DelSpaces ( charge ); if (charge[0]) { atom = channel[k]->GetAtomI ( channel[k]->fPos ); if (!atom) { *iRet = RWBERR_EmptyPointer; // should never be so LastRC = *iRet; return; } atom->SetCharge ( charge ); } if (*iSer!=channel[k]->fPos) { *iRet |= RWBWAR_WrongSerial; // this is not the right thing at all atom = channel[k]->GetAtomI ( channel[k]->fPos ); if (!atom) { *iRet = RWBERR_EmptyPointer; // should never be so LastRC = *iRet; return; } // atom->serNum = *iSer; // - we allow for a mess in serials } LastSer = *iSer; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SETTER, mmdb_f_setter, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; mmdb::PAtom atom; strcpy ( LastFunc,"MMDB_F_SetTer" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = channel[k]->GetAtomI ( channel[k]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advanced properly LastRC = *iRet; return; } atom->Ter = true; atom->WhatIsSet |= mmdb::ASET_Coordinates; } FORTRAN_SUBR ( MMDB_F_SETHET, mmdb_f_sethet, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; mmdb::PAtom atom; strcpy ( LastFunc,"MMDB_F_SetHet" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = channel[k]->GetAtomI ( channel[k]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advanced properly LastRC = *iRet; return; } atom->Het = true; atom->WhatIsSet |= mmdb::ASET_Coordinates; } FORTRAN_SUBR ( MMDB_F_GETHET, mmdb_f_gethet, ( int * iUnit, int * isHet, int * iRet ), ( int * iUnit, int * isHet, int * iRet ), ( int * iUnit, int * isHet, int * iRet ) ) { int k; mmdb::PAtom atom; strcpy ( LastFunc,"MMDB_F_GetHet" ); LastUnit = *iUnit; *isHet = 0; // no HETATM record k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = channel[k]->GetAtomI ( channel[k]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advance properly LastRC = *iRet; return; } if (atom->Het) *isHet = 1; // HETATM } // ------------------------------------------------------------------ // mmdb_f_getnofncsmates_(..) returns the number of NCS mates not // given in the file (iGiven=0). // // Negative returns N<0 mean an error. // // FORTRAN equivalent: subroutine MMDB_F_GetNofNCSMates ( iUnit,N ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,N FORTRAN_SUBR ( MMDB_F_GETNOFNCSMATES, mmdb_f_getnofncsmates, ( int * iUnit, int * N ), ( int * iUnit, int * N ), ( int * iUnit, int * N ) ) { int k; strcpy ( LastFunc,"mmdb_f_getnofncsmates" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *N = RWBERR_NoChannel; LastRC = *N; return; } *N = channel[k]->GetNumberOfNCSMates(); return; } FORTRAN_SUBR ( MMDB_F_COPYATOM, mmdb_f_copyatom, ( int * iUnit1, int * iUnit2, int * iRet ), ( int * iUnit1, int * iUnit2, int * iRet ), ( int * iUnit1, int * iUnit2, int * iRet ) ) { int k1,k2,RC; mmdb::PAtom atom; strcpy ( LastFunc,"mmdb_f_copyatom" ); LastUnit = *iUnit1; k1 = GetChannel ( *iUnit1 ); if (k1<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } k2 = GetChannel ( *iUnit2 ); if (k2<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = channel[k1]->GetAtomI ( channel[k1]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advanced // properly LastRC = *iRet; return; } RC = channel[k2]->MMDBManager->PutAtom ( channel[k2]->fPos,atom, atom->serNum ); if (RC) { *iRet = RWBERR_Error2; // should never happen LastRC = *iRet; return; } LastSer = atom->serNum; } FORTRAN_SUBR ( MMDB_F_COORD, mmdb_f_coord, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::fpstr XFlag, // "F" or "O" flag for the fractional // or orthogonal coordinates x,y,z // for output files XFlag may also be // set to "HF" or "HO", where "F" and // "O" have the same meaning as before // and "H" indicates that the atom // should be marked as heteroatom mmdb::machine::fpstr BFlag , // "F" or "O" flag for temperature // factor in fractional or orthogonal // Us mmdb::machine::apireal * x, // x-coordinate mmdb::machine::apireal * y, // y-coordinate mmdb::machine::apireal * z, // z-coordinate mmdb::machine::apireal * occ, // occupancy mmdb::machine::apireal * BIso, // isotropic temperature factor mmdb::machine::apireal * U, // array(6) of the anisotr. t-factor int * iRet, // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // RWBERR_NoMatrices if transformation // matrices are // undefined // RWBERR_NoCoordinates if coordinates were // not set in the atom // // >=0 : success, warning flags: // RWBERR_NoOccupancy if occupancy was // not set in the atom // RWBERR_NoTempFactor if temp. factor was // not set in the atom // int XFlag_len, // fortran-hidden length of XFlag int BFlag_len // fortran-hidden length of BFlag ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr XFlag, mmdb::machine::fpstr BFlag, mmdb::machine::apireal * x, mmdb::machine::apireal * y, mmdb::machine::apireal * z, mmdb::machine::apireal * occ, mmdb::machine::apireal * BIso, mmdb::machine::apireal * U, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr XFlag, int XFlag_len, mmdb::machine::fpstr BFlag, int BFlag_len, mmdb::machine::apireal * x, mmdb::machine::apireal * y, mmdb::machine::apireal * z, mmdb::machine::apireal * occ, mmdb::machine::apireal * BIso, mmdb::machine::apireal * U, int * iRet ) ) { UNUSED_ARGUMENT(XFlag_len); UNUSED_ARGUMENT(BFlag_len); mmdb::realtype AU[6]; mmdb::realtype xx,yy,zz; int k,i,m; mmdb::PAtom atom; strcpy ( LastFunc,"MMDB_F_Coord" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = channel[k]->GetAtomI ( channel[k]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advanced properly LastRC = *iRet; return; } if ((FTN_STR(XFlag)[0]=='H') || (FTN_STR(XFlag)[0]=='h')) m = 1; else m = 0; if (channel[k]->nRead==0) { // reading the atomic coordinates if (atom->Ter) { *x = 0.0; *y = 0.0; *z = 0.0; *occ = 1.0; *BIso = 1.0; U[0] = 1.0; U[1] = 0.0; U[2] = 0.0; U[3] = 0.0; U[4] = 0.0; U[5] = 0.0; } else { if (atom->WhatIsSet & mmdb::ASET_Coordinates) { if ((FTN_STR(XFlag)[m]=='F') || (FTN_STR(XFlag)[m]=='f')) { // receive fractional coordinates if (channel[k]->areCrystMatrices()) { channel[k]->Orth2Frac ( atom->x,atom->y,atom->z,xx,yy,zz ); *x = (mmdb::machine::apireal)xx; *y = (mmdb::machine::apireal)yy; *z = (mmdb::machine::apireal)zz; } else { *x = (mmdb::machine::apireal)atom->x; *y = (mmdb::machine::apireal)atom->y; *z = (mmdb::machine::apireal)atom->z; *iRet = RWBERR_NoMatrices; } } else { // receive orthogonal coordinates *x = (mmdb::machine::apireal)atom->x; *y = (mmdb::machine::apireal)atom->y; *z = (mmdb::machine::apireal)atom->z; } } else { *x = 0.0; *y = 0.0; *z = 0.0; *iRet = RWBERR_NoCoordinates; } // calculate isotropic Uf from Uo, and convert it // if necessary if (atom->WhatIsSet & mmdb::ASET_Anis_tFac) { AU[0] = atom->u11; // this intermediate array is AU[1] = atom->u22; // required because of possible AU[2] = atom->u33; // type difference between AU[3] = atom->u12; // 'mmdb::machine::apireal' and 'realtype' AU[4] = atom->u13; AU[5] = atom->u23; *BIso = (mmdb::machine::apireal)(8.0*mmdb::Pi*mmdb::Pi*(AU[0]+AU[1]+AU[2])/3.0); if ((FTN_STR(BFlag)[0]=='F') || (FTN_STR(BFlag)[0]=='f')) { if (channel[k]->areCrystMatrices()) channel[k]->Orth2Cryst ( AU ); else if (*iRet==RWBERR_Ok) *iRet = RWBERR_NoMatrices; } for (i=0;i<6;i++) U[i] = (mmdb::machine::apireal)AU[i]; } else { for (i=0;i<6;i++) U[i] = 0.0; if (atom->WhatIsSet & mmdb::ASET_tempFactor) U[0] = (mmdb::machine::apireal)atom->tempFactor; else if (*iRet>=RWBERR_Ok) *iRet |= RWBWAR_NoTempFactor; *BIso = U[0]; } // get occupancy now if (atom->WhatIsSet & mmdb::ASET_Occupancy) *occ = (mmdb::machine::apireal)atom->occupancy; else { *occ = 0.0; if (*iRet>=RWBERR_Ok) *iRet |= RWBWAR_NoOccupancy; } } } else { // storing the atomic coordinates if (atom->Ter) { atom->x = 0.0; atom->y = 0.0; atom->z = 0.0; atom->WhatIsSet |= mmdb::ASET_Coordinates; atom->occupancy = 1.0; atom->tempFactor = 1.0; atom->u11 = 0.0; atom->u22 = 0.0; atom->u33 = 0.0; atom->u12 = 0.0; atom->u13 = 0.0; atom->u23 = 0.0; } else { if ((FTN_STR(XFlag)[m]=='F') || (FTN_STR(XFlag)[m]=='f')) { // convert fractional coordinates if (channel[k]->areCrystMatrices()) { xx = *x; yy = *y; zz = *z; channel[k]->Frac2Orth ( xx,yy,zz,atom->x,atom->y,atom->z ); atom->WhatIsSet |= mmdb::ASET_Coordinates; } else { atom->x = *x; atom->y = *y; atom->z = *z; *iRet = RWBERR_NoMatrices; atom->WhatIsSet &= ~mmdb::ASET_Coordinates; } } else { // store orthogonal coordinates atom->x = *x; atom->y = *y; atom->z = *z; atom->WhatIsSet |= mmdb::ASET_Coordinates; } atom->Het = (m>0); // calculate isotropic Uf from Uo, and convert it // if necessary if ((U[1]!=0.0) || (U[2]!=0.0)) { for (i=0;i<6;i++) AU[i] = U[i]; if ((FTN_STR(BFlag)[0]=='F') || (FTN_STR(BFlag)[0]=='f')) { if (channel[k]->areCrystMatrices()) channel[k]->Cryst2Orth ( AU ); else *iRet = RWBERR_NoMatrices; } *BIso = (mmdb::machine::apireal)(8.0*mmdb::Pi*mmdb::Pi*(AU[0]+AU[1]+AU[2])/3.0); atom->tempFactor = *BIso; atom->u11 = AU[0]; atom->u22 = AU[1]; atom->u33 = AU[2]; atom->u12 = AU[3]; atom->u13 = AU[4]; atom->u23 = AU[5]; atom->WhatIsSet |= mmdb::ASET_tempFactor | mmdb::ASET_Anis_tFac; } else { *BIso = U[0]; atom->tempFactor = *BIso; atom->u11 = 0.0; atom->u22 = 0.0; atom->u33 = 0.0; atom->u12 = 0.0; atom->u13 = 0.0; atom->u23 = 0.0; atom->WhatIsSet |= mmdb::ASET_tempFactor; } // store occupancy now atom->occupancy = *occ; atom->WhatIsSet |= mmdb::ASET_Occupancy; } } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SETCELL, mmdb_f_setcell, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::apireal * a, // cell parameter a, angstroms mmdb::machine::apireal * b, // cell parameter b, angstroms mmdb::machine::apireal * c, // cell parameter c, angstroms mmdb::machine::apireal * alpha, // cell parameter alpha, degrees mmdb::machine::apireal * beta, // cell parameter beta, degrees mmdb::machine::apireal * gamma, // cell parameter gamma, degrees int * ArgNCode, // orthogonalization code, 1-6 int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Disagreement if a // disagreement in // cell parameters // was found // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * a, mmdb::machine::apireal * b, mmdb::machine::apireal * c, mmdb::machine::apireal * alpha, mmdb::machine::apireal * beta, mmdb::machine::apireal * gamma, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * a, mmdb::machine::apireal * b, mmdb::machine::apireal * c, mmdb::machine::apireal * alpha, mmdb::machine::apireal * beta, mmdb::machine::apireal * gamma, int * ArgNCode, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_SetCell" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else *iRet = channel[k]->SetCell ( *a,*b,*c,*alpha,*beta,*gamma, *ArgNCode ); LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_WBSPGRP, mmdb_f_wbspgrp, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::fpstr spGroup, // space group int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed int spGroup_len // fortran-hidden length of spGroup ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr spGroup, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr spGroup, int spGroup_len, int * iRet ) ) { int k; mmdb::SymGroup spaceGroup; strcpy ( LastFunc,"MMDB_F_WBSpGrp" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else { // GetStrTer ( spaceGroup,FTN_STR(spGroup),0, // sizeof(spaceGroup),FTN_LEN(spGroup) ); mmdb::strcpy_ncss(spaceGroup,FTN_STR(spGroup),mmdb::IMin(FTN_LEN(spGroup), sizeof(spaceGroup)-1) ); *iRet = channel[k]->SetSpGroup ( spaceGroup ); } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBSPGRP, mmdb_f_rbspgrp, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::fpstr spGroup, // space group int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed int spGroup_len // fortran-hidden length of spGroup ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr spGroup, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr spGroup, int spGroup_len, int * iRet ) ) { int k; char SpaceGroup[100]; strcpy ( LastFunc,"MMDB_F_RBSpGrp" ); if (*iUnit>0) LastUnit = *iUnit; SpaceGroup[0] = char(0); k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else *iRet = channel[k]->GetSpGroup ( SpaceGroup ); // all extra "superficial spaces" are killed in the following mmdb::CutSpaces ( SpaceGroup,mmdb::SCUTKEY_BEGEND ); mmdb::strcpy_ns ( FTN_STR(spGroup),SpaceGroup,FTN_LEN(spGroup) ); LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_WBCELL , mmdb_f_wbcell, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * ArgCell, // array to accept the cell parameters // if ArgCell(1) is set to 0, then // the cell does not change int * ArgNCode, // orthogonalisation code // if ArgNCode is set to 0, then // the orthogonalisation matrices // do not change int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * ArgCell, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * ArgCell, int * ArgNCode, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_WBCell" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else *iRet = channel[k]->PutCell ( ArgCell[0],ArgCell[1],ArgCell[2], ArgCell[3],ArgCell[4],ArgCell[5], *ArgNCode ); LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBCELL, mmdb_f_rbcell, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::apireal * celld, // array to accept the cell parameters mmdb::machine::apireal * cvol, // returns the cell volume int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * celld, mmdb::machine::apireal * cvol, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * celld, mmdb::machine::apireal * cvol, int * iRet ) ) { mmdb::realtype p[6]; mmdb::realtype v; int k,i,nc; strcpy ( LastFunc,"MMDB_F_RBCell" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } *iRet = channel[k]->GetCell ( p[0],p[1],p[2],p[3],p[4],p[5],v,nc ); if (*iRet==RWBERR_Ok) { for (i=0;i<6;i++) celld[i] = (mmdb::machine::apireal)p[i]; *cvol = (mmdb::machine::apireal)v; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBCELLN, mmdb_f_rbcelln, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::apireal * celld, // array to accept the cell parameters mmdb::machine::apireal * cvol, // returns the cell volume int * ArgNCode, // returns the orthogonalization code, 1-6 int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * celld, mmdb::machine::apireal * cvol, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * celld, mmdb::machine::apireal * cvol, int * ArgNCode, int * iRet ) ) { mmdb::realtype p[6]; mmdb::realtype v; int k,i,nc; strcpy ( LastFunc,"MMDB_F_RBCellN" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } *iRet = channel[k]->GetCell ( p[0],p[1],p[2],p[3],p[4],p[5],v,nc ); if (*iRet==RWBERR_Ok) { for (i=0;i<6;i++) celld[i] = (mmdb::machine::apireal)p[i]; *cvol = (mmdb::machine::apireal)v; *ArgNCode = nc; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBRCEL, mmdb_f_rbrcel, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::apireal * rcell, // array to accept the reciprocal // cell parameters mmdb::machine::apireal * rvol, // returns the reciprocal cell volume int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * rcell, mmdb::machine::apireal * rvol, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * rcell, mmdb::machine::apireal * rvol, int * iRet ) ) { mmdb::realtype p[6]; mmdb::realtype v; int k,i; strcpy ( LastFunc,"MMDB_F_RBRCel" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } *iRet = channel[k]->GetRCell ( p[0],p[1],p[2],p[3],p[4],p[5],v ); if (*iRet==RWBERR_Ok) { for (i=0;i<6;i++) rcell[i] = (mmdb::machine::apireal)p[i]; *rvol = (mmdb::machine::apireal)v; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBORF, mmdb_f_rborf, ( // lengths-at-end list int * iUnit, // unit number mmdb::machine::apireal * RO, // array for orthogonalising matrix mmdb::machine::apireal * RF, // array for fractionalising matrix int * LCode, // buffer for orthogonalisation code int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * RO, mmdb::machine::apireal * RF, int * LCode, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * RO, mmdb::machine::apireal * RF, int * LCode, int * iRet ) ) { int i,j,k,l; mmdb::PCryst Cryst; strcpy ( LastFunc,"MMDB_F_RBORF" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } Cryst = channel[k]->GetCryst(); if (Cryst==NULL) { *iRet = RWBERR_NoFile; LastRC = *iRet; return; } *iRet = RWBERR_Ok; l = 0; if (RO[0]<=0.0000000001) { for (j=0;j<4;j++) for (i=0;i<4;i++) { RF[l] = (mmdb::machine::apireal)Cryst->RF[i][j]; RO[l] = (mmdb::machine::apireal)Cryst->RO[i][j]; l++; } *LCode = Cryst->NCode; if (!(Cryst->WhatIsSet & mmdb::CSET_Transforms)) *iRet = RWBERR_NoMatrices; } else { for (j=0;j<4;j++) for (i=0;i<4;i++) { Cryst->RF[i][j] = RF[l]; Cryst->RO[i][j] = RO[l]; l++; } Cryst->NCode = *LCode; Cryst->WhatIsSet |= mmdb::CSET_Transforms; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_ORTHMAT, mmdb_f_orthmat, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * Cell, // array of cell parameters: // Cell(1) - a Cell(4) - alpha // Cell(2) - b Cell(5) - beta // Cell(3) - c Cell(6) - gamma mmdb::machine::apireal * Vol, // returns cell volume mmdb::machine::apireal * RRR, // array (3,3,6), returns // orthogonalisation matrices int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * Cell, mmdb::machine::apireal * Vol, mmdb::machine::apireal * RRR, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * Cell, mmdb::machine::apireal * Vol, mmdb::machine::apireal * RRR, int * iRet ) ) { int i,j,k,l,m; mmdb::PCryst Cryst; mmdb::realtype CelDel; strcpy ( LastFunc,"MMDB_F_OrthMat" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } Cryst = channel[k]->GetCryst(); if (Cryst==NULL) { *iRet = RWBERR_NoFile; LastRC = *iRet; return; } CelDel = 0.0; if (Cell[0]>0.0) { if ((Cryst->WhatIsSet & mmdb::CSET_CellParams)==mmdb::CSET_CellParams) { CelDel = fabs((Cell[0]-Cryst->a)/Cell[0]); if (Cell[1]!=0.0) CelDel = mmdb::RMax(CelDel,fabs((Cell[1]-Cryst->b)/Cell[1])); if (Cell[2]!=0.0) CelDel = mmdb::RMax(CelDel,fabs((Cell[2]-Cryst->c)/Cell[2])); if (Cell[3]!=0.0) CelDel = mmdb::RMax(CelDel,fabs((Cell[3]-Cryst->alpha)/Cell[3])); if (Cell[4]!=0.0) CelDel = mmdb::RMax(CelDel,fabs((Cell[4]-Cryst->beta )/Cell[4])); if (Cell[5]!=0.0) CelDel = mmdb::RMax(CelDel,fabs((Cell[5]-Cryst->gamma)/Cell[5])); if (FSimRWBROOK && (CelDel>0.01)) printf ( "\n Inconsistency in Cell Dimensions" " - replacing old:\n" " Old cell: " "%10.5f%10.5f%10.5f%10.5f%10.5f%10.5f\n" " New cell: " "%10.5f%10.5f%10.5f%10.5f%10.5f%10.5f\n", Cryst->a,Cryst->b,Cryst->c, Cryst->alpha,Cryst->beta,Cryst->gamma, Cell[0],Cell[1],Cell[2],Cell[3],Cell[4],Cell[5] ); } Cryst->a = Cell[0]; Cryst->b = Cell[1]; Cryst->c = Cell[2]; Cryst->alpha = Cell[3]; Cryst->beta = Cell[4]; Cryst->gamma = Cell[5]; Cryst->WhatIsSet |= mmdb::CSET_CellParams; } else { Cell[0] = (mmdb::machine::apireal)Cryst->a; Cell[1] = (mmdb::machine::apireal)Cryst->b; Cell[2] = (mmdb::machine::apireal)Cryst->c; Cell[3] = (mmdb::machine::apireal)Cryst->alpha; Cell[4] = (mmdb::machine::apireal)Cryst->beta; Cell[5] = (mmdb::machine::apireal)Cryst->gamma; } if ((Cryst->WhatIsSet & mmdb::CSET_CellParams)!=mmdb::CSET_CellParams) { *iRet = RWBERR_NoCellParams; LastRC = *iRet; return; } *iRet = RWBERR_Ok; // Cryst->CalcOrthMatrices(); <-- old version, changed 09.01.2004 Cryst->CalcCoordTransforms(); Cryst->WhatIsSet |= mmdb::CSET_Transforms; if (CelDel>0.01) *Vol = -(mmdb::machine::apireal)Cryst->Vol; else *Vol = (mmdb::machine::apireal)Cryst->Vol; l = 0; for (j=0;j<3;j++) for (i=0;i<3;i++) for (m=0;m<6;m++) RRR[l++] = (mmdb::machine::apireal)Cryst->RR[m][j][i]; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_CVANISOU, mmdb_f_cvanisou, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::apireal * U, // array of coordinates to convert int * iFlag, // =0: convert from fract. to orthog. // =1: convert from orthog. to fract. int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, mmdb::machine::apireal * U, int * iFlag, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::apireal * U, int * iFlag, int * iRet ) ) { int k,i; mmdb::PCryst Cryst; mmdb::realtype U1[6]; strcpy ( LastFunc,"MMDB_F_CVAnisou" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } Cryst = channel[k]->GetCryst(); if (Cryst==NULL) { *iRet = RWBERR_NoFile; LastRC = *iRet; return; } *iRet = RWBERR_Ok; for (i=0;i<6;i++) U1[i] = U[i]; if (iFlag==0) { if (!Cryst->Cryst2Orth(U1)) *iRet = RWBERR_NoMatrices; } else { if (!Cryst->Orth2Cryst(U1)) *iRet = RWBERR_NoMatrices; } if (*iRet==RWBERR_Ok) for (i=0;i<6;i++) U[i] = (mmdb::machine::apireal)U1[i]; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_WREMARK, mmdb_f_wremark, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" mmdb::machine::fpstr Line, // line to be added int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // other return codea are those // returned by xyzopen1_(..) int Line_len // fortran-hidden length of Line ), ( // lengths-in-structure list int * iUnit, mmdb::machine::fpstr Line, int * iRet ), ( // lengths-follow list int * iUnit, mmdb::machine::fpstr Line, int Line_len, int *iRet ) ) { int k; char S[500]; strcpy ( LastFunc,"MMDB_F_WRemark" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } if (channel[k]->MMDBManager) { mmdb::GetStrTer ( S,FTN_STR(Line),FTN_LEN(Line),sizeof(S),FTN_LEN(Line) ); *iRet = channel[k]->MMDBManager->PutPDBString ( S ); } else *iRet = RWBERR_NoFile; LastRC = *iRet; } /* FORTRAN_SUBR ( RBRINV, rbrinv, ( mmdb::machine::apireal * A, mmdb::machine::apireal * AI ), ( mmdb::machine::apireal * A, mmdb::machine::apireal * AI ), ( mmdb::machine::apireal * A, mmdb::machine::apireal * AI ) ) { mat44 A1,AI1; int i,j,k; k = 0; for (j=0;j<4;j++) for (i=0;i<4;i++) A1[j][i] = A[k++]; Mat4Inverse ( A1,AI1 ); k = 0; for (j=0;j<4;j++) for (i=0;i<4;i++) AI[k++] = AI1[j][i]; } */ /* FORTRAN_SUBR ( RES3TO1, res3to1, ( // lengths-at-end list mmdb::machine::fpstr ResNm3, // 3-char name, 4th char // will be set blank mmdb::machine::fpstr ResNm1, // 1-char name int ResNm3_len, // fortran-hidden length of ResNm3 int ResNm1_len // fortran-hidden length of ResNm3 ), ( // lengths-in-structure list mmdb::machine::fpstr ResNm3, mmdb::machine::fpstr ResNm1 ), ( // lengths-follow list mmdb::machine::fpstr ResNm3, int ResNm3_len, mmdb::machine::fpstr ResNm1, int ResNm1_len ) ) { int i; if (FTN_STR(ResNm3)[0]==' ') { for (i=0;i=0) printf ( " *** file : %s\n",channel[k]->FName ); for (i=0;i0) printf ( " *** position %i, serial number %i\n", channel[k]->fPos,LastSer ); else printf ( " *** position unavailable, serial number %i\n", LastSer ); } } if (!Msg) printf ( " *** warning: unknown warning code" ); return; } else Msg = MSG_Unknown; } if ((k>=0) && ( ((*iRet<=RWBERR_WrongInteger) && (*iRet>=RWBERR_DuplicatedModel)) || ((*iRet<=RWBERR_ATOM_Unrecognd) && (*iRet>=RWBERR_ATOM_Unmatch)) || ((*iRet<=RWBERR_NoData) && (*iRet>=RWBERR_DuplicateSeqNum)) )) channel[k]->GetInputBuffer ( ErrLine,lcount ); printf ( " \n *** RWBROOK error: point code unit function\n" ); printf ( " *** %5i %4i %4i %s\n",*iPlace,*iRet, *iUnit,LastFunc ); k = GetChannel(*iUnit); if (k>=0) printf ( " *** file : %s\n",channel[k]->FName ); printf ( " *** reason : %s\n",Msg ); if (lcount>=0) printf ( " *** at input line #%i:\n" " %s\n",lcount,ErrLine ); else if (lcount==-1) printf ( " *** at taking the following data from CIF:\n" " %s\n",ErrLine ); if (*iStop==0) { // will stop it printf ( " *** Execution stopped.\n \n" ); FORTRAN_CALL ( MMDB_F_QUIT, mmdb_f_quit,(),(),() ); // xyzquit_(); exit(0); } else // just warn, but no guarantee that it will not crash printf ( " *** continue running, may crash ...\n \n" ); } FORTRAN_SUBR ( RBCHECKERR, rbcheckerr, ( // lengths-at-end list int * iPlace, // (unique) identificator inside an application int * iStop // if 0 then stop if error ), ( // lengths-in-structure list int * iPlace, int * iStop ), ( // lengths-follow list int * iPlace, int * iStop ) ) { FORTRAN_CALL ( RBERRSTOP, rberrstop, ( iPlace,&LastRC,&LastUnit,iStop ), ( iPlace,&LastRC,&LastUnit,iStop ), ( iPlace,&LastRC,&LastUnit,iStop ) ); } /* hybrid-36 encoder: converts integer value to string result iwidth: must be 4 (e.g. for residue sequence numbers) or 5 (e.g. for atom serial numbers) value: integer value to be converted strval: char array containing string result */ FORTRAN_SUBR ( HY36ENCODE_F, hy36encode_f, (const int *iwidth, int *value, mmdb::machine::fpstr strval, int strval_len), (const int *iwidth, int *value, mmdb::machine::fpstr strval), (const int *iwidth, int *value, mmdb::machine::fpstr strval, int strval_len)) { unsigned width; char result[6]; width = (unsigned) *iwidth; if (hy36encode(width, *value, result)) { printf("problem in hy36encode_f! \n"); } mmdb::strcpy_ns(FTN_STR(strval),result,FTN_LEN(strval)); } /* hybrid-36 decoder: converts string s to integer result iwidth: must be 4 (e.g. for residue sequence numbers) or 5 (e.g. for atom serial numbers) strval: string to be converted value: integer holding the conversion result */ FORTRAN_SUBR ( HY36DECODE_F, hy36decode_f, (const int *iwidth, mmdb::machine::fpstr strval, int *value, int strval_len), (const int *iwidth, mmdb::machine::fpstr strval, int *value), (const int *iwidth, mmdb::machine::fpstr strval, int strval_len, int *value)) { UNUSED_ARGUMENT(strval); unsigned width; size_t length = FTN_LEN(strval); char* s; width = (unsigned) *iwidth; s = (char *) malloc((length+1)*sizeof(char)); s[length] = '\0'; if (hy36decode(width, s, width, value)) { printf("problem in hy36decode_f! \n"); } } mmdb2-2.0.20/mmdb2/mmdb_xml_.h0000644000175000017500000001332213271367640015556 0ustar maartenmaarten// $Id: mmdb_xml_.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 06.12.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_XML // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::xml::XMLObject // ~~~~~~~~~ // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_XML__ #define __MMDB_XML__ #include "mmdb_mmcif_.h" namespace mmdb { namespace xml { // ====================== XMLObject ========================== enum XML_RC { XMLRC_Ok = 0, XMLRC_NoFile = 1, XMLRC_CantOpenFile = 2, XMLRC_NoTag = 3, XMLRC_BrokenTag = 4, XMLRC_UnclosedTag = 5, XMLRC_RFormatError = 6, XMLRC_IFormatError = 7, XMLRC_OFormatError = 8 }; DefineClass(XMLObject); DefineStreamFunctions(XMLObject); class XMLObject : public io::Stream { public : XMLObject (); XMLObject ( cpstr Tag ); XMLObject ( cpstr Tag, cpstr Data ); XMLObject ( cpstr Tag, realtype V, int length=11 ); XMLObject ( cpstr Tag, int iV, int length=0 ); XMLObject ( cpstr Tag, bool bV ); XMLObject ( cpstr Tag, PXMLObject XMLObject ); XMLObject ( io::RPStream Object ); ~XMLObject(); void SetTag ( cpstr Tag ); void AddAttribute ( cpstr name, cpstr value ); void AddAttribute ( cpstr name, const int iV ); void AddAttribute ( cpstr name, const bool bV ); void SetData ( cpstr Data ); void AddData ( cpstr Data ); void SetData ( const realtype V, const int length=11 ); void SetData ( const int iV, const int length=0 ); void SetData ( const bool bV ); int AddMMCIFCategory ( mmcif::PCategory mmCIFCat ); int AddMMCIFStruct ( mmcif::PStruct mmCIFStruct ); int AddMMCIFLoop ( mmcif::PLoop mmCIFLoop ); int AddMMCIFData ( mmcif::PData mmCIFData ); inline pstr GetTag() { return objTag; } // Here and below the functions allow for "tag1>tag2>tag3>..." // as a composite multi-level tag, e.g. the above may stand for // data. NULL tag // corresponds to "this" object. // objNo counts same-tag objects of the *highest* level used // (e.g. level tag3 for composite tag tag1>tag2>tag3 ). // GetData ( pstr& ... ) only copies a pointer to data. pstr GetData ( cpstr Tag=NULL, int objNo=1 ); XML_RC GetData ( pstr & Data, cpstr Tag=NULL, int objNo=1 ); XML_RC GetData ( realtype & V, cpstr Tag=NULL, int objNo=1 ); XML_RC GetData ( int & iV, cpstr Tag=NULL, int objNo=1 ); XML_RC GetData ( bool & bV, cpstr Tag=NULL, int objNo=1 ); PXMLObject GetObject ( cpstr Tag, int objNo=1 ); PXMLObject GetFirstObject(); PXMLObject GetLastObject (); inline int GetNumberOfObjects() { return nObjects; } PXMLObject GetObject ( int objectNo ); // 0,1,... inline PXMLObject GetParent() { return parent; } void AddObject ( PXMLObject XMLObject, int lenInc=10 ); void InsertObject ( PXMLObject XMLObject, int pos, int lenInc=10 ); XML_RC WriteObject ( cpstr FName, int pos=0, int ident=2 ); void WriteObject ( io::RFile f, int pos=0, int ident=2 ); XML_RC ReadObject ( cpstr FName ); XML_RC ReadObject ( io::RFile f, pstr S, int & pos, int slen ); virtual void Copy ( PXMLObject xmlObject ); void write ( io::RFile f ); void read ( io::RFile f ); protected: PXMLObject parent; pstr objTag; pstr objData; int nObjects,nAlloc; PPXMLObject object; int nAttributes,nAttrAlloc; psvector attr_name,attr_value; void InitXMLObject(); virtual void FreeMemory (); inline void SetParent ( PXMLObject p ) { parent = p; } }; extern PXMLObject mmCIF2XML ( mmcif::PData mmCIFData, int * rc=NULL ); extern PXMLObject mmCIF2XML ( cpstr XMLName, mmcif::PFile mmCIFFile, int * rc=NULL ); } // namespace xml } // namespace mmdb #endif mmdb2-2.0.20/mmdb2/mmdb_title.cpp0000644000175000017500000020773613271367640016311 0ustar maartenmaarten// $Id: mmdb_title.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 28.09.15 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Title // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::TitleContainer (container of title classes) // ~~~~~~~~~ mmdb::ObsLine // mmdb::TitleLine // mmdb::Caveat // mmdb::Compound // mmdb::Source // mmdb::KeyWords // mmdb::ExpData // mmdb::MdlType // mmdb::Author // mmdb::RevData // mmdb::Supersede // mmdb::Journal // mmdb::Remark // mmdb::Biomolecule // mmdb::Title ( MMDB title section ) // // (C) E. Krissinel 2000-2015 // // ================================================================= // #include #include #include "mmdb_title.h" #include "mmdb_cifdefs.h" namespace mmdb { // ============== TitleContainer ==================== PContainerClass TitleContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return ClassContainer::MakeContainerClass(ClassID); case ClassID_ObsLine : return new ObsLine (); case ClassID_CAVEAT : return new Caveat (); case ClassID_TitleLine : return new TitleLine(); case ClassID_Compound : return new Compound (); case ClassID_Source : return new Source (); case ClassID_ExpData : return new ExpData (); case ClassID_Author : return new Author (); case ClassID_RevData : return new RevData (); case ClassID_Supersede : return new Supersede(); case ClassID_Journal : return new Journal (); case ClassID_Remark : return new Remark (); } } MakeStreamFunctions(TitleContainer) // ================ ObsLine =================== ObsLine::ObsLine() : ContainerClass() { InitObsLine(); } ObsLine::ObsLine ( cpstr S ) : ContainerClass() { InitObsLine(); ConvertPDBASCII ( S ); } ObsLine::ObsLine ( io::RPStream Object ) : ContainerClass(Object) { InitObsLine(); } ObsLine::~ObsLine() {} void ObsLine::InitObsLine() { int i; strcpy ( repDate,"DD-MMM-YYYY" ); strcpy ( idCode, "----" ); for (i=0;i<8;i++) strcpy ( rIdCode[i]," " ); } void ObsLine::PDBASCIIDump ( pstr S, int N ) { // makes the ASCII PDB OBSLTE line number N // from the class' data int i; if (N==0) strcpy ( S,"OBSLTE " ); else sprintf ( S,"OBSLTE %2i",N+1 ); PadSpaces ( S,80 ); Date11to9 ( repDate,&(S[11]) ); strncpy ( &(S[21]),idCode,4 ); for (i=0;i<8;i++) strncpy ( &(S[31+5*i]),rIdCode[i],4 ); } void ObsLine::MakeCIF ( mmcif::PData CIF, int ) { mmcif::PLoop Loop; int RC,i,j; char DateCIF[20]; RC = CIF->AddLoop ( CIFCAT_OBSLTE,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_DATE ); Loop->AddLoopTag ( CIFTAG_REPLACE_PDB_ID ); Loop->AddLoopTag ( CIFTAG_PDB_ID ); } Date11toCIF ( repDate,DateCIF ); for (i=0;i<8;i++) { j = 0; while (rIdCode[i][j] && (rIdCode[i][j]==' ')) j++; if (rIdCode[i][j]) { Loop->AddString ( pstr("OBSLTE") ); Loop->AddString ( DateCIF ); Loop->AddString ( idCode ); Loop->AddString ( rIdCode[i] ); } } } ERROR_CODE ObsLine::ConvertPDBASCII ( cpstr S ) { int i; Date9to11 ( &(S[11]),repDate ); strncpy ( idCode,&(S[21]),4 ); idCode[4] = char(0); for (i=0;i<8;i++) { strncpy ( rIdCode[i],&(S[31+i*5]),4 ); rIdCode[i][4] = char(0); } return Error_NoError; } ERROR_CODE ObsLine::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; int i,RC; pstr F,FDate,FID; char DateCIF [20]; char DateCIF0[20]; IDCode idCode1; Loop = CIF->GetLoop ( CIFCAT_OBSLTE ); if (!Loop) { n = -1; // signal to finish processing of this structure return Error_EmptyCIF; } i = 0; do { F = Loop->GetString ( CIFTAG_ID,n,RC ); if (RC) { if (i==0) n = -1; return Error_MissingCIFField; } if (F) { if (!strcmp(F,"OBSLTE")) { FDate = Loop->GetString ( CIFTAG_DATE,n,RC ); if ((!RC) && FDate) strncpy ( DateCIF,FDate,15 ); else strcpy ( DateCIF,"YYYY-MMM-DD" ); FID = Loop->GetString ( CIFTAG_REPLACE_PDB_ID,n,RC ); if ((!RC) && FID) strncpy ( idCode1,FID,sizeof(IDCode)-1 ); else idCode1[0] = char(0); if (i==0) { DateCIFto11 ( DateCIF,repDate ); DateCIF[11] = char(0); strcpy ( idCode ,idCode1 ); strcpy ( DateCIF0,DateCIF ); } else if ((strcmp(DateCIF0,DateCIF)) || (strcmp(idCode,idCode1))) return Error_MissingCIFField; FID = Loop->GetString ( CIFTAG_PDB_ID,n,RC ); if ((!RC) && FID) strncpy ( rIdCode[i],FID,sizeof(IDCode)-1 ); else rIdCode[i][0] = char(0); Loop->DeleteField ( CIFTAG_ID ,n ); Loop->DeleteField ( CIFTAG_DATE ,n ); Loop->DeleteField ( CIFTAG_REPLACE_PDB_ID,n ); Loop->DeleteField ( CIFTAG_PDB_ID ,n ); i++; } } n++; } while (i<8); return Error_NoError; } void ObsLine::Copy ( PContainerClass ObsLine ) { int i; strcpy ( repDate,PObsLine(ObsLine)->repDate ); strcpy ( idCode ,PObsLine(ObsLine)->idCode ); for (i=0;i<8;i++) strcpy ( rIdCode[i],PObsLine(ObsLine)->rIdCode[i] ); } void ObsLine::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( repDate,false ); f.WriteTerLine ( idCode ,false ); for (i=0;i<8;i++) f.WriteTerLine ( rIdCode[i],false ); } void ObsLine::read ( io::RFile f ) { int i; byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( repDate,false ); f.ReadTerLine ( idCode ,false ); for (i=0;i<8;i++) f.ReadTerLine ( rIdCode[i],false ); } MakeStreamFunctions(ObsLine) // =================== TitleLine ====================== TitleLine::TitleLine() : ContString() { InitTitleLine(); } TitleLine::TitleLine ( cpstr S ) : ContString() { InitTitleLine(); ConvertPDBASCII ( S ); } TitleLine::TitleLine ( io::RPStream Object ) : ContString(Object) { InitTitleLine(); } TitleLine::~TitleLine() { } void TitleLine::InitTitleLine() { CreateCopy ( CIFCategory,CIFCAT_STRUCT ); CreateCopy ( CIFTag, CIFTAG_TITLE ); } ERROR_CODE TitleLine::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return Error_NoError; } void TitleLine::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"TITLE " ); else sprintf ( S,"TITLE %2i",N+1 ); strcat ( S,Line ); } void TitleLine::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); ContString::write ( f ); } void TitleLine::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); ContString::read ( f ); } MakeStreamFunctions(TitleLine) // =================== Caveat ====================== Caveat::Caveat() : ContString() { InitCaveat(); } Caveat::Caveat ( cpstr S ) : ContString() { InitCaveat(); ConvertPDBASCII ( S ); } Caveat::Caveat ( io::RPStream Object ) : ContString(Object) { InitCaveat(); } Caveat::~Caveat() {} void Caveat::InitCaveat() { strcpy ( idCode,"----" ); CreateCopy ( CIFCategory,CIFCAT_DATABASE_PDB_CAVEAT ); CreateCopy ( CIFTag ,CIFTAG_TEXT ); } ERROR_CODE Caveat::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>12) { strncpy ( idCode,&(S[11]),4 ); idCode[4] = char(0); if (strlen(S)>19) CreateCopy ( Line,&(S[19]) ); else CreateCopy ( Line,pstr(" ") ); } else CreateCopy ( Line,pstr(" ") ); return Error_NoError; } void Caveat::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"CAVEAT " ); else sprintf ( S,"CAVEAT %2i ",N+1 ); strcat ( S,idCode ); strcat ( S," " ); strcat ( S,Line ); } void Caveat::MakeCIF ( mmcif::PData CIF, int N ) { char S[500]; CIF->PutString ( idCode,CIFCAT_DATABASE_PDB_CAVEAT,CIFTAG_ID,false ); strcpy ( S,"\n" ); strncat ( S,Line,sizeof(S)-2 ); S[sizeof(S)-1] = char(0); CIF->PutString ( S,CIFCAT_DATABASE_PDB_CAVEAT,CIFTAG_TEXT,(N!=0) ); } /* void Caveat::GetCIF1 ( mmcif::PData CIF, ERROR_CODE & Signal, int & pos ) { pstr F; int RC; F = CIF->GetString ( CIFCAT_DATABASE_PDB_CAVEAT,CIFTAG_ID,RC ); if ((!RC) && F) { strncpy ( idCode,F,sizeof(IDCode) ); idCode[sizeof(IDCode)-1] = char(0); } ContString::GetCIF1 ( CIF,Signal,pos ); if (Signal<0) CIF->DeleteField ( CIFCAT_DATABASE_PDB_CAVEAT,CIFTAG_ID ); } */ void Caveat::Copy ( PContainerClass Caveat ) { strcpy ( idCode,PCaveat(Caveat)->idCode ); ContString::Copy ( Caveat ); } void Caveat::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( idCode,false ); ContString::write ( f ); } void Caveat::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( idCode,false ); ContString::read ( f ); } MakeStreamFunctions(Caveat) // =================== Compound ====================== Compound::Compound() : ContString() { InitCompound(); } Compound::Compound ( cpstr S ) : ContString() { InitCompound(); ConvertPDBASCII ( S ); } Compound::Compound ( io::RPStream Object ) : ContString(Object) { InitCompound(); } Compound::~Compound() {} void Compound::InitCompound() { CreateCopy ( CIFCategory,CIFCAT_STRUCT ); CreateCopy ( CIFTag ,CIFTAG_NDB_DESCRIPTOR ); } ERROR_CODE Compound::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return Error_NoError; } void Compound::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"COMPND " ); else sprintf ( S,"COMPND %2i",N+1 ); strcat ( S,Line ); } void Compound::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); ContString::write ( f ); } void Compound::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); ContString::read ( f ); } MakeStreamFunctions(Compound) // =================== Source ====================== Source::Source() : ContString() { InitSource(); } Source::Source ( cpstr S ) : ContString() { InitSource(); ConvertPDBASCII ( S ); } Source::Source ( io::RPStream Object ) : ContString(Object) { InitSource(); } Source::~Source() {} void Source::InitSource() { CreateCopy ( CIFCategory,CIFCAT_STRUCT ); CreateCopy ( CIFTag ,CIFTAG_SOURCE ); } ERROR_CODE Source::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return Error_NoError; } void Source::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"SOURCE " ); else sprintf ( S,"SOURCE %2i",N+1 ); strcat ( S,Line ); } void Source::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); ContString::write ( f ); } void Source::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); ContString::read ( f ); } MakeStreamFunctions(Source) // =================== KeyWords ====================== KeyWords::KeyWords() : io::Stream() { Init(); } KeyWords::KeyWords ( cpstr S ) : io::Stream() { Init(); ConvertPDBASCII ( S ); } KeyWords::KeyWords ( io::RPStream Object ) : io::Stream(Object) { Init(); } KeyWords::~KeyWords() { Delete(); } void KeyWords::Init() { nKeyWords = 0; KeyWord = NULL; Cont = false; } void KeyWords::Delete() { int i; if (KeyWord) { for (i=0;i0) && (L[m]==' ')) m--; // remove padding spaces m++; L[m] = char(0); if (Cont) CreateConcat ( KeyWord[nKeyWords],L ); else CreateCopy ( KeyWord[nKeyWords],L ); if (S[i]==',') { i++; Cont = false; } else Cont = true; nKeyWords++; } return 0; } void KeyWords::PDBASCIIDump ( io::RFile f ) { int N,i,k,m1,m2,ms; char S[85]; char c; if (KeyWord) { N = 0; i = 0; while (i70) { CIF->PutString ( S,CIFCAT_STRUCT_KEYWORDS,CIFTAG_TEXT,true ); if (k>(int)sizeof(S)) { CIF->PutString ( KeyWord[i],CIFCAT_STRUCT_KEYWORDS, CIFTAG_TEXT,true ); k = 0; } strcpy ( S,"\n" ); } if (k>0) { strcat ( S,KeyWord[i] ); if (i1) CIF->PutString ( S,CIFCAT_STRUCT_KEYWORDS,CIFTAG_TEXT,true ); } void KeyWords::GetCIF ( mmcif::PData CIF ) { pstr F; int i,j,k; bool NB; char c; Delete(); F = CIF->GetString ( CIFCAT_STRUCT_KEYWORDS,CIFTAG_TEXT,i ); k = 0; if ((!i) && F) { i = 0; NB = false; while (F[i]) { if (F[i]==',') { nKeyWords++; NB = false; } else if (F[i]!=' ') NB = true; i++; } if (NB) nKeyWords++; KeyWord = new pstr[nKeyWords]; i = 0; while (F[i] && (kDeleteField ( CIFCAT_STRUCT_KEYWORDS,CIFTAG_TEXT ); } void KeyWords::Copy ( PKeyWords KeyWords ) { int i; Delete(); nKeyWords = KeyWords->nKeyWords; if (nKeyWords>0) { KeyWord = new pstr[nKeyWords]; for (i=0;iKeyWord[i] ); } } } void KeyWords::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &nKeyWords ); for (i=0;i0) { KeyWord = new pstr[nKeyWords]; for (i=0;i10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return Error_NoError; } void ExpData::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"EXPDTA " ); else sprintf ( S,"EXPDTA %2i",N+1 ); strcat ( S,Line ); } void ExpData::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); ContString::write ( f ); } void ExpData::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); ContString::read ( f ); } MakeStreamFunctions(ExpData) // =================== MdlType ====================== MdlType::MdlType() : ContString() { InitMdlType(); } MdlType::MdlType ( cpstr S ) : ContString() { InitMdlType(); ConvertPDBASCII ( S ); } MdlType::MdlType ( io::RPStream Object ) : ContString(Object) { InitMdlType(); } MdlType::~MdlType() {} void MdlType::InitMdlType() { CreateCopy ( CIFCategory,CIFCAT_EXPTL ); CreateCopy ( CIFTag ,CIFTAG_METHOD ); } ERROR_CODE MdlType::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return Error_NoError; } void MdlType::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"MDLTYP " ); else sprintf ( S,"MDLTYP %2i",N+1 ); strcat ( S,Line ); } void MdlType::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); ContString::write ( f ); } void MdlType::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); ContString::read ( f ); } MakeStreamFunctions(MdlType) // =================== Author ====================== Author::Author() : ContString() { InitAuthor(); } Author::Author ( cpstr S ) : ContString() { InitAuthor(); ConvertPDBASCII ( S ); } Author::Author ( io::RPStream Object ) : ContString(Object) { InitAuthor(); } Author::~Author() {} void Author::InitAuthor() { CreateCopy ( CIFCategory,CIFCAT_AUDIT_AUTHOR ); CreateCopy ( CIFTag ,CIFTAG_NAME ); } ERROR_CODE Author::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return Error_NoError; } void Author::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"AUTHOR " ); else sprintf ( S,"AUTHOR %2i",N+1 ); strcat ( S,Line ); } void Author::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); ContString::write ( f ); } void Author::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); ContString::read ( f ); } MakeStreamFunctions(Author) // ================ RevData =================== RevData::RevData() : ContainerClass() { InitRevData(); } RevData::RevData ( cpstr S ) : ContainerClass() { InitRevData(); ConvertPDBASCII ( S ); } RevData::RevData ( io::RPStream Object ) : ContainerClass(Object) { InitRevData(); } RevData::~RevData() {} void RevData::InitRevData() { int i; modNum = 0; strcpy ( modDate,"DD-MMM-YYYY" ); strcpy ( modId , "----" ); modType = -1; for (i=0;i<4;i++) strcpy ( record[i]," " ); Warning = 0; } void RevData::PDBASCIIDump ( pstr S, int N ) { // makes the ASCII PDB REVDATA line number N // from the class' data int i; if (N==0) sprintf ( S,"REVDAT %3i " ,modNum ); else sprintf ( S,"REVDAT %3i%2i",modNum,N+1 ); i = strlen(S); while (i<80) S[i++] = ' '; S[i] = char(0); Date11to9 ( modDate,&(S[13]) ); strncpy ( &(S[23]),modId,5 ); S[31] = char(modType+int('0')); for (i=0;i<4;i++) strncpy ( &(S[39+i*7]),record[i],6 ); } void RevData::MakeCIF ( mmcif::PData CIF, int N ) { mmcif::PLoop Loop; int RC,i,j; char DateCIF[20]; RC = CIF->AddLoop ( CIFCAT_DATABASE_PDB_REV,Loop ); if ((RC!=mmcif::CIFRC_Ok) || (N==0)) { // the category was (re)created, privide tags Loop->AddLoopTag ( CIFTAG_NUM ); Loop->AddLoopTag ( CIFTAG_DATE ); Loop->AddLoopTag ( CIFTAG_REPLACES ); Loop->AddLoopTag ( CIFTAG_MOD_TYPE ); Loop->AddLoopTag ( CIFTAG_RCSB_RECORD_REVISED_1 ); Loop->AddLoopTag ( CIFTAG_RCSB_RECORD_REVISED_2 ); Loop->AddLoopTag ( CIFTAG_RCSB_RECORD_REVISED_3 ); Loop->AddLoopTag ( CIFTAG_RCSB_RECORD_REVISED_4 ); } Date11toCIF ( modDate,DateCIF ); Loop->AddInteger ( modNum ); Loop->AddString ( DateCIF ); Loop->AddString ( modId ); Loop->AddInteger ( modType ); for (i=0;i<4;i++) { j = 0; while (record[i][j] && (record[i][j]==' ')) j++; if (record[i][j]) Loop->AddString ( record[i] ); else Loop->AddString ( NULL ); } } ERROR_CODE RevData::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; int RC; pstr F; Loop = CIF->GetLoop ( CIFCAT_DATABASE_PDB_REV ); if (!Loop) { n = -1; return Error_EmptyCIF; } RC = Loop->GetInteger ( modNum,CIFTAG_NUM,n,true ); if (RC==mmcif::CIFRC_WrongIndex) { n = -1; return Error_EmptyCIF; } if (RC==mmcif::CIFRC_WrongFormat) { sprintf ( CIFErrorLocation,"loop %s.%s row %i", CIFCAT_DATABASE_PDB_REV,CIFTAG_NUM,n ); n = -Error_UnrecognizedInteger-1; return Error_UnrecognizedInteger; } F = Loop->GetString ( CIFTAG_DATE,n,RC ); if ((!RC) && F) DateCIFto11 ( F,modDate ); F = Loop->GetString ( CIFTAG_REPLACES,n,RC ); if ((!RC) && F) strcpy ( modId,F ); RC = Loop->GetInteger ( modType,CIFTAG_MOD_TYPE,n,true ); if (RC==mmcif::CIFRC_WrongFormat) { sprintf ( CIFErrorLocation,"loop %s.%s row %i", CIFCAT_DATABASE_PDB_REV,CIFTAG_MOD_TYPE,n ); n = -Error_UnrecognizedInteger-1; return Error_UnrecognizedInteger; } F = Loop->GetString ( CIFTAG_RCSB_RECORD_REVISED_1,n,RC ); if ((!RC) && F) strcpy ( record[0],F ); F = Loop->GetString ( CIFTAG_RCSB_RECORD_REVISED_2,n,RC ); if ((!RC) && F) strcpy ( record[1],F ); F = Loop->GetString ( CIFTAG_RCSB_RECORD_REVISED_3,n,RC ); if ((!RC) && F) strcpy ( record[2],F ); F = Loop->GetString ( CIFTAG_RCSB_RECORD_REVISED_4,n,RC ); if ((!RC) && F) strcpy ( record[3],F ); Loop->DeleteField ( CIFTAG_DATE ,n ); Loop->DeleteField ( CIFTAG_REPLACES ,n ); Loop->DeleteField ( CIFTAG_RCSB_RECORD_REVISED_1,n ); Loop->DeleteField ( CIFTAG_RCSB_RECORD_REVISED_2,n ); Loop->DeleteField ( CIFTAG_RCSB_RECORD_REVISED_3,n ); Loop->DeleteField ( CIFTAG_RCSB_RECORD_REVISED_4,n ); n++; return Error_NoError; } ERROR_CODE RevData::ConvertPDBASCII ( cpstr S ) { int i; pstr endptr; char N[20]; Warning = 0; strncpy ( N,&(S[7]),3 ); N[3] = char(0); modNum = mround(strtod(N,&endptr)); if (endptr==N) Warning |= REVDAT_WARN_MODNUM; Date9to11 ( &(S[13]),modDate ); strncpy ( modId,&(S[23]),5 ); modId[5] = char(0); modType = int(S[31]) - int('0'); if (modType>9) Warning |= REVDAT_WARN_MODTYPE; for (i=0;i<4;i++) { strncpy ( record[i],&(S[39+i*7]),6 ); record[i][6] = char(0); } return Error_NoError; } void RevData::Copy ( PContainerClass RevData ) { int i; modNum = PRevData(RevData)->modNum; modType = PRevData(RevData)->modType; strcpy ( modDate,PRevData(RevData)->modDate ); strcpy ( modId ,PRevData(RevData)->modId ); for (i=0;i<4;i++) strcpy ( record[i],PRevData(RevData)->record[i] ); } void RevData::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &modNum ); f.WriteInt ( &modType ); f.WriteWord ( &Warning ); f.WriteTerLine ( modDate,false ); f.WriteTerLine ( modId ,false ); for (i=0;i<4;i++) f.WriteTerLine ( record[i],false ); } void RevData::read ( io::RFile f ) { int i; byte Version; f.ReadByte ( &Version ); f.ReadInt ( &modNum ); f.ReadInt ( &modType ); f.ReadWord ( &Warning ); f.ReadTerLine ( modDate,false ); f.ReadTerLine ( modId ,false ); for (i=0;i<4;i++) f.ReadTerLine ( record[i],false ); } MakeStreamFunctions(RevData) // ================ Supersede =================== Supersede::Supersede() : ContainerClass() { InitSupersede(); } Supersede::Supersede ( cpstr S ) : ContainerClass() { InitSupersede(); ConvertPDBASCII ( S ); } Supersede::Supersede ( io::RPStream Object ) : ContainerClass(Object) { InitSupersede(); } Supersede::~Supersede() {} void Supersede::InitSupersede() { int i; strcpy ( sprsdeDate,"DD-MMM-YYYY" ); strcpy ( idCode, "----" ); for (i=0;i<8;i++) strcpy ( sIdCode[i]," " ); } void Supersede::PDBASCIIDump ( pstr S, int N ) { // makes the ASCII PDB OBSLTE line number N // from the class' data int i; if (N==0) strcpy ( S,"SPRSDE " ); else sprintf ( S,"SPRSDE %2i",N+1 ); i = strlen(S); while (i<80) S[i++] = ' '; S[i] = char(0); if (N==0) { Date11to9 ( sprsdeDate,&(S[11]) ); strncpy ( &(S[21]),idCode,4 ); } for (i=0;i<8;i++) strncpy ( &(S[31+5*i]),sIdCode[i],4 ); } void Supersede::MakeCIF ( mmcif::PData CIF, int ) { mmcif::PLoop Loop; int RC,i,j; char DateCIF[20]; RC = CIF->AddLoop ( CIFCAT_SPRSDE,Loop ); if (RC!=mmcif::CIFRC_Ok) { // the category was (re)created, privide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_DATE ); Loop->AddLoopTag ( CIFTAG_REPLACE_PDB_ID ); Loop->AddLoopTag ( CIFTAG_PDB_ID ); } Date11toCIF ( sprsdeDate,DateCIF ); for (i=0;i<8;i++) { j = 0; while (sIdCode[i][j] && (sIdCode[i][j]==' ')) j++; if (sIdCode[i][j]) { Loop->AddString ( pstr("SPRSDE") ); Loop->AddString ( DateCIF ); Loop->AddString ( idCode ); Loop->AddString ( sIdCode[i] ); } } } ERROR_CODE Supersede::ConvertPDBASCII ( cpstr S ) { int i; if (S[9]==' ') { Date9to11 ( &(S[11]),sprsdeDate ); strncpy ( idCode,&(S[21]),4 ); idCode[4] = char(0); } for (i=0;i<8;i++) { strncpy ( sIdCode[i],&(S[31+i*5]),4 ); sIdCode[i][4] = char(0); } return Error_NoError; } ERROR_CODE Supersede::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; int i,RC; pstr F,FDate,FID; char DateCIF [20]; char DateCIF0[20]; IDCode idCode1; Loop = CIF->GetLoop ( CIFCAT_SPRSDE ); if (!Loop) { n = -1; // signal to finish processing of this structure return Error_EmptyCIF; } i = 0; do { F = Loop->GetString ( CIFTAG_ID,n,RC ); if (RC) { if (i==0) { n = -1; return Error_EmptyCIF; } else return Error_NoError; } if (F) { if (!strcmp(F,"SPRSDE")) { FDate = Loop->GetString ( CIFTAG_DATE,n,RC ); if ((!RC) && FDate) strncpy ( DateCIF,FDate,15 ); else strcpy ( DateCIF,"YYYY-MMM-DD" ); FID = Loop->GetString ( CIFTAG_REPLACE_PDB_ID,n,RC ); if ((!RC) && FID) strncpy ( idCode1,FID,sizeof(IDCode)-1 ); else idCode1[0] = char(0); if (i==0) { DateCIFto11 ( DateCIF,sprsdeDate ); DateCIF[11] = char(0); strcpy ( idCode ,idCode1 ); strcpy ( DateCIF0,DateCIF ); } else if ((strcmp(DateCIF0,DateCIF)) || (strcmp(idCode,idCode1))) return Error_NoError; FID = Loop->GetString ( CIFTAG_PDB_ID,n,RC ); if ((!RC) && FID) strncpy ( sIdCode[i],FID,sizeof(IDCode)-1 ); else sIdCode[i][0] = char(0); Loop->DeleteField ( CIFTAG_ID ,n ); Loop->DeleteField ( CIFTAG_DATE ,n ); Loop->DeleteField ( CIFTAG_REPLACE_PDB_ID,n ); Loop->DeleteField ( CIFTAG_PDB_ID ,n ); i++; } } n++; } while (i<8); return Error_NoError; } void Supersede::Copy ( PContainerClass Supersede ) { int i; strcpy ( sprsdeDate,PSupersede(Supersede)->sprsdeDate ); strcpy ( idCode ,PSupersede(Supersede)->idCode ); for (i=0;i<8;i++) strcpy ( sIdCode[i],PSupersede(Supersede)->sIdCode[i] ); } void Supersede::write ( io::RFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( sprsdeDate,false ); f.WriteTerLine ( idCode ,false ); for (i=0;i<8;i++) f.WriteTerLine ( sIdCode[i],false ); } void Supersede::read ( io::RFile f ) { int i; byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( sprsdeDate,false ); f.ReadTerLine ( idCode ,false ); for (i=0;i<8;i++) f.ReadTerLine ( sIdCode[i],false ); } MakeStreamFunctions(Supersede) // =================== Journal ====================== Journal::Journal() : ContString() { InitJournal(); } Journal::Journal ( cpstr S ) : ContString() { InitJournal(); ConvertPDBASCII ( S ); } Journal::Journal ( io::RPStream Object ) : ContString(Object) { InitJournal(); } Journal::~Journal() {} void Journal::InitJournal() { CreateCopy ( CIFCategory,CIFCAT_CITATION ); CreateCopy ( CIFTag ,CIFTAG_TEXT ); } ERROR_CODE Journal::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return Error_NoError; } void Journal::PDBASCIIDump ( pstr S, int ) { strcpy ( S,"JRNL " ); strcat ( S,Line ); } void Journal::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); ContString::write ( f ); } void Journal::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); ContString::read ( f ); } MakeStreamFunctions(Journal) // =================== Remark ====================== Remark::Remark() : ContainerClass() { InitRemark(); } Remark::Remark ( cpstr S ) : ContainerClass() { InitRemark(); ConvertPDBASCII ( S ); } Remark::Remark ( io::RPStream Object ) : ContainerClass(Object) { InitRemark(); } Remark::~Remark() { if (remark) delete[] remark; } void Remark::InitRemark() { remarkNum = 0; remark = NULL; } ERROR_CODE Remark::ConvertPDBASCII ( cpstr S ) { int i; GetInteger ( remarkNum,&(S[7]),3 ); if (remarkNum==MinInt4) CreateCopy ( remark,S ); else if (strlen(S)>11) CreateCopy ( remark,&(S[11]) ); else CreateCopy ( remark,pstr(" ") ); i = strlen(remark)-1; while ((i>0) && (remark[i]==' ')) i--; remark[i+1] = char(0); return Error_NoError; } void Remark::PDBASCIIDump ( pstr S, int ) { if (remarkNum==MinInt4) strcpy ( S,remark ); else { strcpy ( S,"REMARK" ); PadSpaces ( S,80 ); PutInteger ( &(S[7]) ,remarkNum,3 ); strncpy ( &(S[11]),remark,IMin(68,strlen(remark)) ); } } void Remark::MakeCIF ( mmcif::PData CIF, int N ) { mmcif::PLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_NDB_DATABASE_REMARK,Loop ); if ((RC!=mmcif::CIFRC_Ok) || (N==0)) { // the category was (re)created, privide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_TEXT ); } if (remarkNum==MinInt4) Loop->AddString ( NULL ); else Loop->AddInteger ( remarkNum ); Loop->AddString ( remark ); } ERROR_CODE Remark::GetCIF ( mmcif::PData CIF, int & n ) { mmcif::PLoop Loop; int RC; Loop = CIF->GetLoop ( CIFCAT_NDB_DATABASE_REMARK ); if (!Loop) { n = -1; return Error_EmptyCIF; } if (n>=Loop->GetLoopLength() ) { n = -1; return Error_EmptyCIF; } RC = Loop->GetInteger ( remarkNum,CIFTAG_ID,n,true ); if (RC==mmcif::CIFRC_WrongFormat) { sprintf ( CIFErrorLocation,"loop %s.%s row %i", CIFCAT_NDB_DATABASE_REMARK,CIFTAG_ID,n ); n = -Error_UnrecognizedInteger-1; return Error_UnrecognizedInteger; } else if (RC) remarkNum = MinInt4; Loop->GetString ( remark,CIFTAG_TEXT,n,true ); n++; return Error_NoError; } void Remark::Copy ( PContainerClass RemarkClass ) { remarkNum = PRemark(RemarkClass)->remarkNum; CreateCopy ( remark,PRemark(RemarkClass)->remark ); } void Remark::write ( io::RFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &remarkNum ); f.CreateWrite ( remark ); } void Remark::read ( io::RFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &remarkNum ); f.CreateRead ( remark ); } MakeStreamFunctions(Remark) // ================= Biomolecule ===================== #define R350_ERRBIOMT (-3) #define R350_ERROR (-2) #define R350_END (-1) #define R350_NONE 0 #define R350_BIOMOLECULE 1 #define R350_CHAINS 2 #define R350_BIOMT 3 void getRemarkKey ( RPRemark rem, int & lkey ) { if (rem) { if (rem->remarkNum!=350) lkey = R350_END; else if (rem->remark) { if (strcasestr(rem->remark,"BIOMOLECULE:")) lkey = R350_BIOMOLECULE; else if (strcasestr(rem->remark,"CHAINS:")) lkey = R350_CHAINS; else if (strcasestr(rem->remark,"BIOMT1") || strcasestr(rem->remark,"BIOMT2") || strcasestr(rem->remark,"BIOMT3")) lkey = R350_BIOMT; else lkey = R350_NONE; } } } int lookupRemarks ( int & i, RPRemark rem, RTitleContainer Remark ) { int l,lkey; l = Remark.Length(); lkey = R350_NONE; while ((iremark,"CHAINS:" ); if (p) p += 7; else { p = rem->remark; while (*p==' ') p++; if ((p[1]!=',') && (p[1]!=' ')) p = NULL; } if (p) { nAdd = strlen(p)/2 + 3; ch1 = chain; chain = new ChainID[nChains+nAdd]; for (j=0;jremarkNum!=350) lkey = R350_END; else getRemarkKey ( rem,lkey ); } } else lkey = R350_END; } while ((!rem) && (lkey==R350_NONE)); } return lkey; } int getBIOMT ( RPRemark rem, int biomtNo, mat44 & t, RTitleContainer Remark, int & i ) { char PN[20]; pstr p1,p2; int l,j,lkey; sprintf ( PN,"BIOMT%1i",biomtNo ); p1 = strcasestr ( rem->remark,PN ); if (!p1) return R350_ERRBIOMT; p1 += 6; while (*p1==' ') p1++; while (*p1 && (*p1!=' ')) p1++; l = biomtNo - 1; t[l][0] = strtod ( p1,&p2 ); if (p1==p2) return R350_ERRBIOMT; t[l][1] = strtod ( p2,&p1 ); if (p1==p2) return R350_ERRBIOMT; t[l][2] = strtod ( p1,&p2 ); if (p1==p2) return R350_ERRBIOMT; t[l][3] = strtod ( p2,&p1 ); if (p1==p2) return R350_ERRBIOMT; if (biomtNo==3) { for (j=0;j<3;j++) t[3][j] = 0.0; t[3][3] = 1.0; } l = Remark.Length(); lkey = R350_BIOMT; do { i++; if (iremarkNum!=350) lkey = R350_END; else getRemarkKey ( rem,lkey ); } } else lkey = R350_END; } while ((lkey==R350_NONE) || ((!rem) && (lkey==R350_BIOMT))); return lkey; } int BMApply::addMatrices ( int & i, RPRemark rem, RTitleContainer Remark ) { pmat44 tm1; int l,lkey,j,k1,k2,nAlloc; l = Remark.Length(); lkey = R350_BIOMT; nAlloc = nMatrices; while ((i=nAlloc) { nAlloc = nMatrices + 10; tm1 = tm; tm = new mat44[nAlloc]; for (j=0;jnChains; if (nChains>0) { chain = new ChainID[nChains]; for (i=0;ichain[i] ); } nMatrices = BMA->nMatrices; if (nMatrices>0) { tm = new mat44[nMatrices]; for (i=0;itm[i][j][k]; } } } void BMApply::write ( io::RFile f ) { int i,j,k; f.WriteInt ( &nChains ); for (i=0;i0) { chain = new ChainID[nChains]; for (i=0;i0) { tm = new mat44[nMatrices]; for (i=0;inChains*bmApply[i]->nMatrices; return k; } bool Biomolecule::checkComposition ( PChainID chID, ivector occ, ivector wocc, int n ) { // chID[n] is list of chain IDs // occ[n] is list of chain occurencies // wocc[n] is working array int i,j,k,k1; bool cmp; for (i=0;inChains) && cmp;j++) { k1 = -1; for (k=0;(kchain[j])) k1 = k; if (k1<0) cmp = false; // chain not found in the list else wocc[k1] += bmApply[i]->nMatrices; } for (i=0;(inBMAs; if (nBMAs>0) { bmApply = new PBMApply[nBMAs]; for (i=0;ibmApply[i]) { bmApply[i] = new BMApply(); bmApply[i]->Copy ( B->bmApply[i] ); } else bmApply[i] = NULL; } } } void Biomolecule::write ( io::RFile f ) { int i; f.WriteInt ( &nBMAs ); for (i=0;i0) { bmApply = new PBMApply[nBMAs]; for (i=0;i=10) && (PDBString[i]==' ')) i--; i++; c = PDBString[i]; PDBString[i] = char(0); CreateCopy ( classification,&(PDBString[10]) ); PDBString[i] = c; Date9to11 ( &(PDBString[50]),depDate ); strncpy ( idCode,&(PDBString[62]),4 ); idCode[4] = char(0); } else if (!strncmp(PDBString,"OBSLTE",6)) { ContainerClass = new ObsLine(PDBString); obsData.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"TITLE ",6)) { ContainerClass = new TitleLine(PDBString); title.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"CAVEAT",6)) { ContainerClass = new Caveat(PDBString); caveat.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"COMPND",6)) { ContainerClass = new Compound(PDBString); compound.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"SOURCE",6)) { ContainerClass = new Source(PDBString); source.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"KEYWDS",6)) { keyWords.ConvertPDBASCII ( PDBString ); } else if (!strncmp(PDBString,"EXPDTA",6)) { ContainerClass = new ExpData(PDBString); expData.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"MDLTYPE",6)) { ContainerClass = new MdlType(PDBString); mdlType.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"AUTHOR",6)) { ContainerClass = new Author(PDBString); author.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"REVDAT",6)) { ContainerClass = new RevData(PDBString); revData.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"SPRSDE",6)) { ContainerClass = new Supersede(PDBString); supersede.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"JRNL ",6)) { ContainerClass = new Journal(PDBString); journal.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"REMARK",6)) { ContainerClass = new Remark(PDBString); remark.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"SPLIT ",6)) { // do nothing at the moment } else return Error_WrongSection; // check for ID code in columns 73-80 if (!col73) { if (('0'<=idCode[0]) && (idCode[0]<='9')) { if (!strncasecmp(idCode,&(PDBString[72]),4)) col73 = true; } } return Error_NoError; } realtype Title::GetResolution() { // returns -1.0 if there is no resolution record in the file PRemark rem; pstr p,eptr; int i,l; if (resolution>-1.5) return resolution; l = remark.Length(); for (i=0;(iremarkNum==2) { if (rem->remark) { p = strcasestr ( rem->remark,"RESOLUTION" ); if (p) { while ((*p) && (*p!=' ')) p++; if (*p) { resolution = strtod ( p,&eptr ); if ((resolution<0.0) || (eptr==p)) resolution = -1.0; } } } } else if (rem->remarkNum>2) resolution = -1.0; } } return resolution; } PBiomolecule Title::addBiomolecule() { PPBiomolecule BM1; int i; BM1 = biomolecule; biomolecule = new PBiomolecule[nBiomolecules+1]; for (i=0;iremarkNum==350) lkey = 1; else if (rem->remarkNum>350) lkey = -1; } if (!lkey) i++; } BMol = NULL; BMA = NULL; while (lkey>0) { rem = (PRemark)remark.GetContainerClass ( i ); lkey = lookupRemarks ( i,rem,remark ); switch (lkey) { case R350_BIOMOLECULE : BMol = addBiomolecule(); i++; break; case R350_CHAINS : if (BMol) { BMA = BMol->addBMApply(); while (lkey==R350_CHAINS) lkey = BMA->addChains(i,rem,remark); } else lkey = R350_ERROR; break; case R350_BIOMT : if (BMA) lkey = BMA->addMatrices(i,rem,remark); else lkey = R350_ERROR; break; default : i++; } } if (lkey<=R350_ERROR) { FreeBiomolecules(); return lkey; } return nBiomolecules; } int Title::GetNofBiomolecules() { return nBiomolecules; } void Title::GetBiomolecules ( PPBiomolecule & BM, int & nBMs ) { BM = biomolecule; nBMs = nBiomolecules; } PBiomolecule Title::GetBiomolecule ( int bmNo ) { // bmno=0,1,.. if ((0<=bmNo) && (bmNoGetDataName ( S,true ); if (!S) CIF->GetString ( S,CIFCAT_DATABASE,CIFTAG_ENTRY_ID,true ); if (!S) CIF->GetString ( S,CIFCAT_DATABASE,CIFTAG_CODE_NDB,true ); if (!S) CIF->GetString ( S,CIFCAT_DATABASE,CIFTAG_CODE_PDB,true ); if (S) { strncpy ( idCode,S,sizeof(IDCode)-1 ); idCode[sizeof(IDCode)-1] = char(0); delete[] S; S = NULL; CIF->DeleteField ( CIFCAT_DATABASE,CIFTAG_ENTRY_ID ); CIF->DeleteField ( CIFCAT_DATABASE,CIFTAG_CODE_NDB ); CIF->DeleteField ( CIFCAT_DATABASE,CIFTAG_CODE_PDB ); } else idCode[0] = char(0); CIF->GetString ( classification,CIFCAT_STRUCT_KEYWORDS, CIFTAG_NDB_KEYWORDS,true ); CIF->GetString ( S,CIFCAT_DATABASE,CIFTAG_DATE_ORIGINAL,true ); if (S) { DateCIFto11 ( S,depDate ); delete[] S; S = NULL; } else depDate[0] = char(0); if (CIF->GetReal(resolution,CIFCAT_REFINE, CIFTAG_LS_D_RES_HIGH,false)!=mmcif::CIFRC_Ok) resolution = -2.0; obsData .GetCIF ( CIF,ClassID_ObsLine ); title .GetCIF ( CIF,ClassID_TitleLine ); caveat .GetCIF ( CIF,ClassID_CAVEAT ); compound.GetCIF ( CIF,ClassID_Compound ); source .GetCIF ( CIF,ClassID_Source ); keyWords.GetCIF ( CIF ); expData .GetCIF ( CIF,ClassID_ExpData ); mdlType .GetCIF ( CIF,ClassID_MdlType ); author .GetCIF ( CIF,ClassID_Author ); RC = revData.GetCIF ( CIF,ClassID_RevData ); if (RC!=Error_NoError) { supersede.GetCIF ( CIF,ClassID_Supersede ); journal .GetCIF ( CIF,ClassID_Journal ); RC = remark.GetCIF ( CIF,ClassID_Remark ); } return RC; } void Title::MakePDBHeaderString ( pstr PDBString ) { // makes the ASCII PDB HEADER line from the class' data int i; if (classification) { strcpy ( PDBString,"HEADER " ); strcat ( PDBString,classification ); i = strlen(PDBString); while (i<80) PDBString[i++] = ' '; PDBString[IMin(i,80)] = char(0); Date11to9 ( depDate,&(PDBString[50]) ); strncpy ( &(PDBString[62]),idCode,4 ); } else strcpy ( PDBString, "HEADER XXXXXXXXXXXXXXXXXXXXXXXXXXXX XX-XXX-XX ----" ); } pstr Title::GetStructureTitle ( pstr & S ) { // GetStructureTitle() returns the contents of TITLE record // unfolded into single line. If Title is missing, returns // contents of COMPND(:MOLECULE). If COMPND is missing, returns // HEADER. If Header is missing, returns PDB code. If no PDB // code is there, returns "Not available". PTitleLine TLine; PCompound CLine; pstr p; int i,cl,l; bool B; if (S) delete[] S; S = NULL; cl = title.Length(); if (cl>0) { l = 0; for (i=0;iLine)+5; } S = new char[l]; S[0] = char(0); for (i=0;i0) strcat ( S," " ); strcat_des ( S,TLine->Line ); } } } else { cl = compound.Length(); if (cl>0) { l = 0; p = NULL; B = true; for (i=0;(iLine,"MOLECULE:"); if (p) l += strlen_des(&(p[9]))+5; } else { p = strstr(CLine->Line,"MOLECULE:"); if (p) l += strlen_des(&(p[9]))+5; else { p = FirstOccurence(CLine->Line,':'); if (!p) { l += strlen_des(CLine->Line)+5; p = CLine->Line; } else B = false; } } } } if (l>0) { S = new char[l]; S[0] = char(0); p = NULL; B = true; for (i=0;(iLine,"MOLECULE:"); if (p) strcat_des ( S,&(p[9]) ); } else { p = strstr(CLine->Line,"MOLECULE:"); if (p) strcat_des ( S,&(p[9]) ); else { p = FirstOccurence(CLine->Line,':'); if (!p) { strcat_des ( S,CLine->Line ); p = CLine->Line; } else B = false; } } l = strlen(S)-1; if (S[l]==';') S[l] = char(0); } } } else { l = 0; for (i=0;iLine)+5; } S = new char[l]; S[0] = char(0); for (i=0;i0) strcat ( S," " ); strcat_des ( S,CLine->Line ); } } } } else if (classification) CreateCopy ( S,classification ); else if (idCode[0]) CreateCopy ( S,idCode ); else CreateCopy ( S,pstr("Not available") ); } if (!S[0]) CreateCopy ( S,pstr("Not available") ); return S; } void Title::PDBASCIIDump ( io::RFile f ) { char PDBString[100]; if (classification) { MakePDBHeaderString ( PDBString ); f.WriteLine ( PDBString ); } obsData .PDBASCIIDump ( f ); title .PDBASCIIDump ( f ); caveat .PDBASCIIDump ( f ); compound .PDBASCIIDump ( f ); source .PDBASCIIDump ( f ); keyWords .PDBASCIIDump ( f ); expData .PDBASCIIDump ( f ); mdlType .PDBASCIIDump ( f ); author .PDBASCIIDump ( f ); revData .PDBASCIIDump ( f ); supersede.PDBASCIIDump ( f ); journal .PDBASCIIDump ( f ); remark .PDBASCIIDump ( f ); } void Title::MakeCIF ( mmcif::PData CIF ) { realtype res; char DateCIF[20]; if (idCode[0]) { CIF->PutDataName ( idCode ); CIF->PutString ( idCode, CIFCAT_DATABASE,CIFTAG_ENTRY_ID ); CIF->PutString ( idCode, CIFCAT_DATABASE,CIFTAG_CODE_NDB ); CIF->PutString ( idCode, CIFCAT_DATABASE,CIFTAG_CODE_PDB ); } else { CIF->PutDataName ( pstr("") ); CIF->PutString ( NULL, CIFCAT_DATABASE,CIFTAG_ENTRY_ID ); CIF->PutString ( NULL, CIFCAT_DATABASE,CIFTAG_CODE_NDB ); CIF->PutString ( NULL, CIFCAT_DATABASE,CIFTAG_CODE_PDB ); } CIF->PutString ( classification, CIFCAT_STRUCT_KEYWORDS, CIFTAG_NDB_KEYWORDS ); if (depDate[0]) { Date11toCIF ( depDate,DateCIF ); CIF->PutString ( DateCIF,CIFCAT_DATABASE,CIFTAG_DATE_ORIGINAL ); } else CIF->PutString ( NULL,CIFCAT_DATABASE,CIFTAG_DATE_ORIGINAL ); res = GetResolution(); if (res>=0.0) CIF->PutReal ( res,CIFCAT_REFINE,CIFTAG_LS_D_RES_HIGH,3 ); else CIF->PutNoData ( mmcif::CIF_NODATA_QUESTION, CIFCAT_REFINE,CIFTAG_LS_D_RES_HIGH ); obsData .MakeCIF ( CIF ); title .MakeCIF ( CIF ); caveat .MakeCIF ( CIF ); compound .MakeCIF ( CIF ); source .MakeCIF ( CIF ); keyWords .MakeCIF ( CIF ); expData .MakeCIF ( CIF ); mdlType .MakeCIF ( CIF ); author .MakeCIF ( CIF ); revData .MakeCIF ( CIF ); supersede.MakeCIF ( CIF ); journal .MakeCIF ( CIF ); remark .MakeCIF ( CIF ); } void Title::Copy ( PTitle TS ) { int i; FreeBiomolecules(); if (TS) { CreateCopy ( classification,TS->classification ); strcpy ( depDate ,TS->depDate ); strcpy ( idCode ,TS->idCode ); resolution = TS->resolution; obsData .Copy ( &(TS->obsData) ); title .Copy ( &(TS->title) ); caveat .Copy ( &(TS->caveat) ); compound .Copy ( &(TS->compound) ); source .Copy ( &(TS->source) ); keyWords .Copy ( &(TS->keyWords) ); expData .Copy ( &(TS->expData) ); mdlType .Copy ( &(TS->mdlType) ); author .Copy ( &(TS->author) ); revData .Copy ( &(TS->revData) ); supersede.Copy ( &(TS->supersede) ); journal .Copy ( &(TS->journal) ); remark .Copy ( &(TS->remark) ); nBiomolecules = TS->nBiomolecules; if (nBiomolecules>0) { biomolecule = new PBiomolecule[nBiomolecules]; for (i=0;ibiomolecule[i]) { biomolecule[i] = new Biomolecule(); biomolecule[i]->Copy ( TS->biomolecule[i] ); } else biomolecule[i] = NULL; } } else { if (classification) delete[] classification; classification = NULL; resolution = -2.0; obsData .FreeContainer(); title .FreeContainer(); caveat .FreeContainer(); compound .FreeContainer(); source .FreeContainer(); keyWords .Delete (); expData .FreeContainer(); mdlType .FreeContainer(); author .FreeContainer(); revData .FreeContainer(); supersede.FreeContainer(); journal .FreeContainer(); remark .FreeContainer(); } } void Title::TrimInput ( pstr PDBString ) { if (col73) { if (!strncasecmp(idCode,&(PDBString[72]),4)) PDBString[72] = char(0); } PadSpaces ( PDBString,80 ); } void Title::write ( io::RFile f ) { // writes header to PDB binary file int i; byte Version=3; f.WriteByte ( &Version ); // Header data f.CreateWrite ( classification ); f.WriteTerLine ( depDate,false ); f.WriteTerLine ( idCode ,false ); f.WriteReal ( &resolution ); obsData .write ( f ); // Obsoletion data title .write ( f ); // Title caveat .write ( f ); // Error data compound .write ( f ); // Compound source .write ( f ); // Source keyWords .write ( f ); // Key words expData .write ( f ); // Experimental data mdlType .write ( f ); // Model descriptions author .write ( f ); // Author data revData .write ( f ); // Revision data supersede.write ( f ); // Supersede records journal .write ( f ); // Journal records remark .write ( f ); // Remarks f.WriteInt ( &nBiomolecules ); for (i=0;i1) f.ReadReal ( &resolution ); else resolution = -2.0; obsData .read ( f ); // Obsoletion data title .read ( f ); // Title caveat .read ( f ); // Error data compound .read ( f ); // Compound source .read ( f ); // Source keyWords .read ( f ); // Key words expData .read ( f ); // Experimental data if (Version>2) mdlType.read ( f ); // Model descriptions author .read ( f ); // Author data revData .read ( f ); // Revision data supersede.read ( f ); // Supersede records journal .read ( f ); // Journal records remark .read ( f ); // Remarks FreeBiomolecules(); if (Version>1) { f.ReadInt ( &nBiomolecules ); if (nBiomolecules>0) { biomolecule = new PBiomolecule[nBiomolecules]; for (i=0;iSetHeader ( pstr("MUSCLE PROTEIN"),pstr("02-JUN-1993"),pstr("1MYS") ); Hdr->MakePDBHeaderString ( S ); printf ( "1234567890123456789012345678901234567890" "1234567890123456789012345678901234567890\n" ); printf ( S ); printf ( "\n" ); strcpy ( S, // 1234567890123456789012345678901234567890123456789012345678901234567890 "HEADER HYDROLASE (CARBOXYLIC ESTER) 07-APR-01 2PHI" ); Hdr->ConvertPDBString ( S ); Hdr->MakePDBHeaderString ( S1 ); printf ( "1234567890123456789012345678901234567890" "1234567890123456789012345678901234567890\n" ); printf ( S1 ); printf ( "\n" ); Hdr->SetHeader ( pstr("MUSCLE PROTEIN;**A VERY LONG TITLE TEST;**ARBITRARY LENGTH"), pstr("02-JUN-1993"),pstr("1MYS") ); Hdr->MakePDBHeaderString ( S ); printf ( "1234567890123456789012345678901234567890" "1234567890123456789012345678901234567890\n" ); printf ( S ); printf ( "\n" ); delete Hdr; printf ( " header deleted \n" ); } void TestTitle() { // reads PDB title from file 'in.title' // and rewrites it into 'out.title' and 'abin.title' CFile f; char S[81]; PTitle Title; Title = new Title(); f.assign ( pstr("in.title"),true ); if (f.reset()) { while (!f.FileEnd()) { f.ReadLine ( S,sizeof(S) ); Title->ConvertPDBString ( S ); } f.shut(); } else { printf ( " Can't open input file 'in.title' \n" ); delete Title; return; } f.assign ( pstr("out.title"),true ); if (f.rewrite()) { Title->PDBASCIIDump ( f ); f.shut(); } else { printf ( " Can't open output file 'out.title' \n" ); delete Title; return; } f.assign ( pstr("mmdb.title.bin"),false ); if (f.rewrite()) { Title->write ( f ); f.shut(); } else { printf ( " Can't open binary file for writing.\n" ); delete Title; return; } delete Title; printf ( " Title deleted.\n" ); Title = new Title(); if (f.reset()) { Title->read ( f ); f.shut(); } else { printf ( " Can't open binary file for reading.\n" ); delete Title; return; } f.assign ( pstr("abin.title"),true ); if (f.rewrite()) { Title->PDBASCIIDump ( f ); f.shut(); } else { printf ( " Can't open output file 'abin.title' \n" ); } delete Title; } */ mmdb2-2.0.20/mmdb2/mmdb_cifdefs.cpp0000644000175000017500000005311513271367640016561 0ustar maartenmaarten// $Id: mmdb_cifdefs.cpp $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 21.11.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_Defs // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Namespace: mmdb:: // // CIF Definitions // // (C) E. Krissinel 2000-2013 // // ================================================================= // #include "mmdb_cifdefs.h" namespace mmdb { // ------------------------------------------------------------------ cpstr CIFName ( int NameID, CIF_MODE Mode ) { // Gives CIF name according to CIF Mode. switch (Mode) { case CIF_NDB : switch (NameID) { case CAT_POLY_SEQ_SCHEME : return CIFCAT_NDB_POLY_SEQ_SCHEME; case TAG_ID_CODE : return CIFTAG_NDB_PDB_ID_CODE; case TAG_CHAIN_ID : return CIFTAG_NDB_CHAIN_ID; case TAG_SEQ_ALIGN_BEG : return CIFTAG_SEQ_ALIGN_BEG; case TAG_SEQ_ALIGN_BEG_INS_CODE : return CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE; case TAG_SEQ_ALIGN_END : return CIFTAG_SEQ_ALIGN_END; case TAG_SEQ_ALIGN_END_INS_CODE : return CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE; case TAG_DB_ACCESSION : return CIFTAG_NDB_DB_ACCESSION; case TAG_DB_ALIGN_BEG : return CIFTAG_DB_ALIGN_BEG; case TAG_DB_ALIGN_BEG_INS_CODE : return CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE; case TAG_DB_ALIGN_END : return CIFTAG_DB_ALIGN_END; case TAG_DB_ALIGN_END_INS_CODE : return CIFTAG_NDB_DB_ALIGN_END_INS_CODE; case TAG_SEQ_CHAIN_ID : return CIFTAG_ID; default : return pstr("ERROR_IN_CIF_NAME_1"); } case CIF_PDBX : switch (NameID) { case CAT_POLY_SEQ_SCHEME : return CIFCAT_PDBX_POLY_SEQ_SCHEME; case TAG_ID_CODE : return CIFTAG_PDBX_PDB_ID_CODE; case TAG_CHAIN_ID : return CIFTAG_PDBX_STRAND_ID; case TAG_SEQ_ALIGN_BEG : return CIFTAG_SEQ_ALIGN_BEG; case TAG_SEQ_ALIGN_BEG_INS_CODE : return CIFTAG_PDBX_SEQ_ALIGN_BEG_INS_CODE; case TAG_SEQ_ALIGN_END : return CIFTAG_SEQ_ALIGN_END; case TAG_SEQ_ALIGN_END_INS_CODE : return CIFTAG_PDBX_SEQ_ALIGN_END_INS_CODE; case TAG_DB_ACCESSION : return CIFTAG_PDBX_DB_ACCESSION; case TAG_DB_ALIGN_BEG : return CIFTAG_DB_ALIGN_BEG; case TAG_DB_ALIGN_BEG_INS_CODE : return CIFTAG_PDBX_DB_ALIGN_BEG_INS_CODE; case TAG_DB_ALIGN_END : return CIFTAG_DB_ALIGN_END; case TAG_DB_ALIGN_END_INS_CODE : return CIFTAG_PDBX_DB_ALIGN_END_INS_CODE; case TAG_SEQ_CHAIN_ID : return CIFTAG_ASYM_ID; default : return pstr("ERROR_IN_CIF_NAME_2"); } default : return pstr("ERROR_IN_CIF_NAME_3"); } } cpstr CIFCAT_ATOM_SITE = cpstr("_atom_site"); cpstr CIFCAT_ATOM_SITE_ANISOTROP = cpstr("_atom_site_anisotrop"); cpstr CIFCAT_ATOM_SITES = cpstr("_atom_sites"); cpstr CIFCAT_AUDIT_AUTHOR = cpstr("_audit_author"); cpstr CIFCAT_CELL = cpstr("_cell"); cpstr CIFCAT_CHEM_COMP = cpstr("_chem_comp"); cpstr CIFCAT_CITATION = cpstr("_citation"); cpstr CIFCAT_DATABASE = cpstr("_database"); cpstr CIFCAT_DATABASE_PDB_CAVEAT = cpstr("_database_pdb_caveat"); cpstr CIFCAT_DATABASE_PDB_MATRIX = cpstr("_database_pdb_matrix"); cpstr CIFCAT_DATABASE_PDB_REV = cpstr("_database_pdb_rev"); cpstr CIFCAT_DATABASE_PDB_TVECT = cpstr("_database_pdb_tvect"); cpstr CIFCAT_ENTITY = cpstr("_entity"); cpstr CIFCAT_EXPTL = cpstr("_exptl"); cpstr CIFCAT_NDB_DATABASE_REMARK = cpstr("_ndb_database_remark"); cpstr CIFCAT_NDB_NONSTANDARD_LIST = cpstr("_ndb_nonstandard_list"); cpstr CIFCAT_NDB_POLY_SEQ_SCHEME = cpstr("_ndb_poly_seq_scheme"); cpstr CIFCAT_PDBX_POLY_SEQ_SCHEME = cpstr("_pdbx_poly_seq_scheme"); cpstr CIFCAT_REFINE = cpstr("_refine"); cpstr CIFCAT_SPRSDE = cpstr("_ndb_database_pdb_obs_spr"); cpstr CIFCAT_STRUCT = cpstr("_struct"); cpstr CIFCAT_STRUCT_ASYM = cpstr("_struct_asym"); cpstr CIFCAT_STRUCT_CONF = cpstr("_struct_conf"); cpstr CIFCAT_STRUCT_CONN = cpstr("_struct_conn"); cpstr CIFCAT_STRUCT_LINKR = cpstr("_struct_linkr"); cpstr CIFCAT_STRUCT_KEYWORDS = cpstr("_struct_keywords"); cpstr CIFCAT_STRUCT_NCS_OPER = cpstr("_struct_ncs_oper"); cpstr CIFCAT_STRUCT_REF = cpstr("_struct_ref"); cpstr CIFCAT_STRUCT_REF_SEQ = cpstr("_struct_ref_seq"); cpstr CIFCAT_STRUCT_REF_SEQ_DIF = cpstr("_struct_ref_seq_dif"); cpstr CIFCAT_STRUCT_SHEET = cpstr("_struct_sheet"); cpstr CIFCAT_STRUCT_SHEET_RANGE = cpstr("_struct_sheet_range"); cpstr CIFCAT_STRUCT_SHEET_ORDER = cpstr("_struct_sheet_order"); cpstr CIFCAT_STRUCT_SHEET_HBOND = cpstr("_struct_sheet_hbond"); cpstr CIFCAT_SYMMETRY = cpstr("_symmetry"); cpstr CIFCAT_OBSLTE = cpstr("_ndb_database_pdb_obs_spr"); cpstr CIFTAG_ANGLE_ALPHA = cpstr("angle_alpha"); cpstr CIFTAG_ANGLE_BETA = cpstr("angle_beta"); cpstr CIFTAG_ANGLE_GAMMA = cpstr("angle_gamma"); cpstr CIFTAG_ASYM_ID = cpstr("asym_id"); cpstr CIFTAG_ATOM_TYPE_SYMBOL = cpstr("atom_type_symbol"); cpstr CIFTAG_AUTH_ASYM_ID = cpstr("auth_asym_id"); cpstr CIFTAG_AUTH_ATOM_ID = cpstr("auth_atom_id"); cpstr CIFTAG_AUTH_COMP_ID = cpstr("auth_comp_id"); cpstr CIFTAG_AUTH_SEQ_ID = cpstr("auth_seq_id"); cpstr CIFTAG_B_ISO_OR_EQUIV = cpstr("B_iso_or_equiv"); cpstr CIFTAG_B_ISO_OR_EQUIV_ESD = cpstr("B_iso_or_equiv_esd"); cpstr CIFTAG_BEG_LABEL_ASYM_ID = cpstr("beg_label_asym_id"); cpstr CIFTAG_BEG_LABEL_COMP_ID = cpstr("beg_label_comp_id"); cpstr CIFTAG_BEG_LABEL_SEQ_ID = cpstr("beg_label_seq_id"); cpstr CIFTAG_CARTN_X = cpstr("cartn_x"); cpstr CIFTAG_CARTN_X_ESD = cpstr("cartn_x_esd"); cpstr CIFTAG_CARTN_Y = cpstr("cartn_y"); cpstr CIFTAG_CARTN_Y_ESD = cpstr("cartn_y_esd"); cpstr CIFTAG_CARTN_Z = cpstr("cartn_z"); cpstr CIFTAG_CARTN_Z_ESD = cpstr("cartn_z_esd"); cpstr CIFTAG_PDBX_FORMAL_CHARGE = cpstr("pdbx_formal_charge"); cpstr CIFTAG_CODE = cpstr("code"); cpstr CIFTAG_CODE_NDB = cpstr("code_NDB"); cpstr CIFTAG_CODE_PDB = cpstr("code_PDB"); cpstr CIFTAG_CONF_TYPE_ID = cpstr("conf_type_id"); cpstr CIFTAG_CONN_TYPE_ID = cpstr("conn_type_id"); cpstr CIFTAG_DATE = cpstr("date"); cpstr CIFTAG_DATE_ORIGINAL = cpstr("date_original"); cpstr CIFTAG_DB_ALIGN_BEG = cpstr("db_align_beg"); cpstr CIFTAG_DB_ALIGN_END = cpstr("db_align_end"); cpstr CIFTAG_DB_CODE = cpstr("db_code"); cpstr CIFTAG_DB_MON_ID = cpstr("db_mon_id"); cpstr CIFTAG_DB_NAME = cpstr("db_name"); cpstr CIFTAG_DETAILS = cpstr("details"); cpstr CIFTAG_END_LABEL_ASYM_ID = cpstr("end_label_asym_id"); cpstr CIFTAG_END_LABEL_COMP_ID = cpstr("end_label_comp_id"); cpstr CIFTAG_END_LABEL_SEQ_ID = cpstr("end_label_seq_id"); cpstr CIFTAG_ENTITY_ID = cpstr("entity_id"); cpstr CIFTAG_ENTRY_ID = cpstr("entry_id"); cpstr CIFTAG_FORMULA = cpstr("formula"); cpstr CIFTAG_FRACT_TRANSF_MATRIX11 = cpstr("fract_transf_matrix[1][1]"); cpstr CIFTAG_FRACT_TRANSF_MATRIX12 = cpstr("fract_transf_matrix[1][2]"); cpstr CIFTAG_FRACT_TRANSF_MATRIX13 = cpstr("fract_transf_matrix[1][3]"); cpstr CIFTAG_FRACT_TRANSF_MATRIX21 = cpstr("fract_transf_matrix[2][1]"); cpstr CIFTAG_FRACT_TRANSF_MATRIX22 = cpstr("fract_transf_matrix[2][2]"); cpstr CIFTAG_FRACT_TRANSF_MATRIX23 = cpstr("fract_transf_matrix[2][3]"); cpstr CIFTAG_FRACT_TRANSF_MATRIX31 = cpstr("fract_transf_matrix[3][1]"); cpstr CIFTAG_FRACT_TRANSF_MATRIX32 = cpstr("fract_transf_matrix[3][2]"); cpstr CIFTAG_FRACT_TRANSF_MATRIX33 = cpstr("fract_transf_matrix[3][3]"); cpstr CIFTAG_FRACT_TRANSF_VECTOR1 = cpstr("fract_transf_vector[1]"); cpstr CIFTAG_FRACT_TRANSF_VECTOR2 = cpstr("fract_transf_vector[2]"); cpstr CIFTAG_FRACT_TRANSF_VECTOR3 = cpstr("fract_transf_vector[3]"); cpstr CIFTAG_GROUP_PDB = cpstr("group_PDB" ); cpstr CIFTAG_ID = cpstr("id"); cpstr CIFTAG_INS_CODE = cpstr("ins_code"); cpstr CIFTAG_LABEL_ALT_ID = cpstr("label_alt_id"); cpstr CIFTAG_LABEL_ATOM_ID = cpstr("label_atom_id"); cpstr CIFTAG_LABEL_ASYM_ID = cpstr("label_asym_id"); cpstr CIFTAG_LABEL_COMP_ID = cpstr("label_comp_id"); cpstr CIFTAG_LABEL_ENTITY_ID = cpstr("label_entity_id"); cpstr CIFTAG_LABEL_SEQ_ID = cpstr("label_seq_id"); cpstr CIFTAG_LENGTH_A = cpstr("length_a"); cpstr CIFTAG_LENGTH_B = cpstr("length_b"); cpstr CIFTAG_LENGTH_C = cpstr("length_c"); cpstr CIFTAG_LS_D_RES_HIGH = cpstr("ls_d_res_high"); cpstr CIFTAG_MATRIX11 = cpstr("matrix[1][1]"); cpstr CIFTAG_MATRIX12 = cpstr("matrix[1][2]"); cpstr CIFTAG_MATRIX13 = cpstr("matrix[1][3]"); cpstr CIFTAG_MATRIX21 = cpstr("matrix[2][1]"); cpstr CIFTAG_MATRIX22 = cpstr("matrix[2][2]"); cpstr CIFTAG_MATRIX23 = cpstr("matrix[2][3]"); cpstr CIFTAG_MATRIX31 = cpstr("matrix[3][1]"); cpstr CIFTAG_MATRIX32 = cpstr("matrix[3][2]"); cpstr CIFTAG_MATRIX33 = cpstr("matrix[3][3]"); cpstr CIFTAG_METHOD = cpstr("method"); cpstr CIFTAG_MOD_TYPE = cpstr("mod_type"); cpstr CIFTAG_MON_ID = cpstr("mon_id"); cpstr CIFTAG_NAME = cpstr("name"); cpstr CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB = cpstr("ndb_beg_label_ins_code_pdb"); cpstr CIFTAG_NDB_CHAIN_ID = cpstr("ndb_chain_id"); cpstr CIFTAG_NDB_COMPONENT_NO = cpstr("ndb_component_no"); cpstr CIFTAG_NDB_DESCRIPTOR = cpstr("ndb_descriptor"); cpstr CIFTAG_NDB_DB_ACCESSION = cpstr("ndb_db_accession"); cpstr CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE = cpstr("ndb_db_align_beg_ins_code"); cpstr CIFTAG_NDB_DB_ALIGN_END_INS_CODE = cpstr("ndb_db_align_end_ins_code"); cpstr CIFTAG_NDB_END_LABEL_INS_CODE_PDB = cpstr("ndb_end_label_ins_code_pdb"); //cpstr CIFTAG_NDB_INS_CODE = cpstr("ndb_ins_code"); cpstr CIFTAG_PDBX_PDB_INS_CODE = cpstr("pdbx_PDB_ins_code"); cpstr CIFTAG_NDB_HELIX_CLASS_PDB = cpstr("ndb_helix_class_pdb"); cpstr CIFTAG_NDB_KEYWORDS = cpstr("ndb_keywords"); cpstr CIFTAG_NDB_LABEL_ALT_ID = cpstr("ndb_label_alt_id"); cpstr CIFTAG_NDB_LABEL_ATOM_ID = cpstr("ndb_label_atom_id"); cpstr CIFTAG_NDB_LABEL_ASYM_ID = cpstr("ndb_label_asym_id"); cpstr CIFTAG_NDB_LABEL_COMP_ID = cpstr("ndb_label_comp_id"); cpstr CIFTAG_NDB_LABEL_INS_CODE = cpstr("ndb_label_ins_code"); cpstr CIFTAG_NDB_LABEL_SEQ_NUM = cpstr("ndb_label_seq_num"); cpstr CIFTAG_NDB_LENGTH = cpstr("ndb_length"); cpstr CIFTAG_NDB_MODEL = cpstr("ndb_model"); cpstr CIFTAG_NDB_PDB_CHAIN_ID = cpstr("ndb_pdb_chain_id"); cpstr CIFTAG_NDB_PDB_ID = cpstr("ndb_pdb_id"); cpstr CIFTAG_NDB_PDB_ID_CODE = cpstr("ndb_pdb_id_code"); cpstr CIFTAG_NDB_PDB_INS_CODE = cpstr("ndb_pdb_ins_code"); cpstr CIFTAG_NDB_PTNR1_LABEL_INS_CODE = cpstr("ndb_ptnr1_label_ins_code"); cpstr CIFTAG_NDB_PTNR1_STANDARD_COMP_ID = cpstr("ndb_ptnr1_standard_comp_id"); cpstr CIFTAG_NDB_RANGE_1_BEG_LABEL_COMP_ID = cpstr("ndb_range_1_beg_label_comp_id"); cpstr CIFTAG_NDB_RANGE_1_BEG_LABEL_ASYM_ID = cpstr("ndb_range_1_beg_label_asym_id"); cpstr CIFTAG_NDB_RANGE_1_BEG_LABEL_INS_CODE= cpstr("ndb_range_1_beg_label_ins_code"); cpstr CIFTAG_NDB_RANGE_1_END_LABEL_COMP_ID = cpstr("ndb_range_1_end_label_comp_id"); cpstr CIFTAG_NDB_RANGE_1_END_LABEL_ASYM_ID = cpstr("ndb_range_1_end_label_asym_id"); cpstr CIFTAG_NDB_RANGE_1_END_LABEL_INS_CODE= cpstr("ndb_range_1_end_label_ins_code"); cpstr CIFTAG_NDB_SEQ_ALIGN_BEG = cpstr("ndb_seq_align_beg"); cpstr CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE = cpstr("ndb_seq_align_beg_ins_code"); cpstr CIFTAG_NDB_SEQ_ALIGN_END = cpstr("ndb_seq_align_end"); cpstr CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE = cpstr("ndb_seq_align_end_ins_code"); cpstr CIFTAG_NDB_SEQ_DB_NAME = cpstr("ndb_seq_db_name"); cpstr CIFTAG_NDB_SEQ_DB_ACCESSION_CODE = cpstr("ndb_seq_db_accession_code"); cpstr CIFTAG_NDB_SEQ_DB_SEQ_NUM = cpstr("ndb_seq_db_seq_num"); cpstr CIFTAG_NDB_SYNONYMS = cpstr("ndb_synonyms"); cpstr CIFTAG_NUM = cpstr("num"); cpstr CIFTAG_NUMBER_ATOMS_NH = cpstr("number_atoms_nh"); cpstr CIFTAG_NUMBER_STRANDS = cpstr("number_strands"); cpstr CIFTAG_OCCUPANCY = cpstr("occupancy"); cpstr CIFTAG_OCCUPANCY_ESD = cpstr("occupancy_esd"); cpstr CIFTAG_ORIGX11 = cpstr("origx[1][1]"); cpstr CIFTAG_ORIGX12 = cpstr("origx[1][2]"); cpstr CIFTAG_ORIGX13 = cpstr("origx[1][3]"); cpstr CIFTAG_ORIGX21 = cpstr("origx[2][1]"); cpstr CIFTAG_ORIGX22 = cpstr("origx[2][2]"); cpstr CIFTAG_ORIGX23 = cpstr("origx[2][3]"); cpstr CIFTAG_ORIGX31 = cpstr("origx[3][1]"); cpstr CIFTAG_ORIGX32 = cpstr("origx[3][2]"); cpstr CIFTAG_ORIGX33 = cpstr("origx[3][3]"); cpstr CIFTAG_ORIGX_VECTOR1 = cpstr("origx_vector[1]"); cpstr CIFTAG_ORIGX_VECTOR2 = cpstr("origx_vector[2]"); cpstr CIFTAG_ORIGX_VECTOR3 = cpstr("origx_vector[3]"); cpstr CIFTAG_PDB_ID = cpstr("pdb_id"); cpstr CIFTAG_PDB_MON_ID = cpstr("pdb_mon_id"); cpstr CIFTAG_PDB_STRAND_ID = cpstr("pdb_strand_id"); cpstr CIFTAG_PDBX_DB_ACCESSION = cpstr("pdbx_db_accession"); cpstr CIFTAG_PDBX_DB_ALIGN_BEG_INS_CODE = cpstr("pdbx_db_align_beg_ins_code"); cpstr CIFTAG_PDBX_DB_ALIGN_END_INS_CODE = cpstr("pdbx_db_align_end_ins_code"); cpstr CIFTAG_PDBX_PDB_ID_CODE = cpstr("pdbx_PDB_id_code"); cpstr CIFTAG_PDBX_PDB_MODEL_NUM = cpstr("pdbx_PDB_model_num"); cpstr CIFTAG_PDBX_STRAND_ID = cpstr("pdbx_strand_id"); cpstr CIFTAG_RANGE_1_BEG_LABEL_ATOM_ID = cpstr("range_1_beg_label_atom_id"); cpstr CIFTAG_RANGE_1_BEG_LABEL_SEQ_ID = cpstr("range_1_beg_label_seq_id"); cpstr CIFTAG_RANGE_1_END_LABEL_ATOM_ID = cpstr("range_1_end_label_atom_id"); cpstr CIFTAG_RANGE_1_END_LABEL_SEQ_ID = cpstr("range_1_end_label_seq_id"); cpstr CIFTAG_RANGE_ID_1 = cpstr("range_id_1"); cpstr CIFTAG_RANGE_ID_2 = cpstr("range_id_2"); cpstr CIFTAG_RCSB_RECORD_REVISED_1 = cpstr("rcsb_record_revised_1"); cpstr CIFTAG_RCSB_RECORD_REVISED_2 = cpstr("rcsb_record_revised_2"); cpstr CIFTAG_RCSB_RECORD_REVISED_3 = cpstr("rcsb_record_revised_3"); cpstr CIFTAG_RCSB_RECORD_REVISED_4 = cpstr("rcsb_record_revised_4"); cpstr CIFTAG_PDBX_SEQ_ALIGN_BEG_INS_CODE = cpstr("pdbx_seq_align_beg_ins_code"); cpstr CIFTAG_PDBX_SEQ_ALIGN_END_INS_CODE = cpstr("pdbx_seq_align_end_ins_code"); cpstr CIFTAG_PTNR1_LABEL_ASYM_ID = cpstr("ptnr1_label_asym_id"); cpstr CIFTAG_PTNR1_LABEL_COMP_ID = cpstr("ptnr1_label_comp_id"); cpstr CIFTAG_PTNR1_LABEL_SEQ_ID = cpstr("ptnr1_label_seq_id"); cpstr CIFTAG_REF_ID = cpstr("ref_id"); cpstr CIFTAG_REPLACES = cpstr("replaces"); cpstr CIFTAG_REPLACE_PDB_ID = cpstr("replace_pdb_id"); cpstr CIFTAG_SEGMENT_ID = cpstr("segment_id"); cpstr CIFTAG_SEQ_ALIGN_BEG = cpstr("seq_align_beg"); cpstr CIFTAG_SEQ_ALIGN_END = cpstr("seq_align_end"); cpstr CIFTAG_SEQ_NUM = cpstr("seq_num"); cpstr CIFTAG_SENSE = cpstr("sense"); cpstr CIFTAG_SHEET_ID = cpstr("sheet_id"); cpstr CIFTAG_SOURCE = cpstr("source"); cpstr CIFTAG_SPACE_GROUP_NAME_H_M = cpstr("space_group_name_H-M"); cpstr CIFTAG_TEXT = cpstr("text"); cpstr CIFTAG_TITLE = cpstr("title"); cpstr CIFTAG_TYPE = cpstr("type"); cpstr CIFTAG_TYPE_SYMBOL = cpstr("type_symbol"); cpstr CIFTAG_VECTOR1 = cpstr("vector[1]"); cpstr CIFTAG_VECTOR2 = cpstr("vector[2]"); cpstr CIFTAG_VECTOR3 = cpstr("vector[3]"); cpstr CIFTAG_U11 = cpstr("u[1][1]"); cpstr CIFTAG_U11_ESD = cpstr("u[1][1]_esd"); cpstr CIFTAG_U12 = cpstr("u[1][2]"); cpstr CIFTAG_U12_ESD = cpstr("u[1][2]_esd"); cpstr CIFTAG_U13 = cpstr("u[1][3]"); cpstr CIFTAG_U13_ESD = cpstr("u[1][3]_esd"); cpstr CIFTAG_U22 = cpstr("u[2][2]"); cpstr CIFTAG_U22_ESD = cpstr("u[2][2]_esd"); cpstr CIFTAG_U23 = cpstr("u[2][3]"); cpstr CIFTAG_U23_ESD = cpstr("u[2][3]_esd"); cpstr CIFTAG_U33 = cpstr("u[3][3]"); cpstr CIFTAG_U33_ESD = cpstr("u[3][3]_esd"); cpstr CIFTAG_Z_PDB = cpstr("z_pdb"); cpstr CIFTAG_CONN_PTNR1_AUTH_ATOM_ID = cpstr("ptnr1_auth_atom_id"); cpstr CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID = cpstr("pdbx_ptnr1_auth_alt_id"); cpstr CIFTAG_CONN_PTNR1_AUTH_COMP_ID = cpstr("ptnr1_auth_comp_id"); cpstr CIFTAG_CONN_PTNR1_AUTH_ASYM_ID = cpstr("ptnr1_auth_asym_id"); cpstr CIFTAG_CONN_PTNR1_AUTH_SEQ_ID = cpstr("ptnr1_auth_seq_id"); cpstr CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE = cpstr("pdbx_ptnr1_PDB_ins_code"); cpstr CIFTAG_CONN_DIST = cpstr("link_dist"); cpstr CIFTAG_CONN_PTNR2_AUTH_ATOM_ID = cpstr("ptnr2_auth_atom_id"); cpstr CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID = cpstr("pdbx_ptnr2_auth_alt_id"); cpstr CIFTAG_CONN_PTNR2_AUTH_COMP_ID = cpstr("ptnr2_auth_comp_id"); cpstr CIFTAG_CONN_PTNR2_AUTH_ASYM_ID = cpstr("ptnr2_auth_asym_id"); cpstr CIFTAG_CONN_PTNR2_AUTH_SEQ_ID = cpstr("ptnr2_auth_seq_id"); cpstr CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE = cpstr("pdbx_ptnr2_PDB_ins_code"); cpstr CIFTAG_CONN_PTNR1_SYMMETRY = cpstr("ptnr1_symmetry"); cpstr CIFTAG_CONN_PTNR2_SYMMETRY = cpstr("ptnr2_symmetry"); cpstr CIFTAG_CONN_NAME = cpstr("link_name"); } // namespace mmdb mmdb2-2.0.20/mmdb2/mmdb_mmcif_.h0000644000175000017500000027675213271367640016073 0ustar maartenmaarten// $Id: mmdb_mmcif_.h $ // ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2013. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // ================================================================= // // 12.09.13 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_MMCIF // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : mmdb::mmcif::Category ( mmCIF category ) // ~~~~~~~~~ mmdb::mmcif::Struct ( mmCIF structure ) // mmdb::mmcif::Loop ( mmCIF loop ) // mmdb::mmcif::Data ( mmCIF data block ) // mmdb::mmcif::File ( mmCIF file ) // // (C) E. Krissinel 2000-2013 // // ================================================================= // #ifndef __MMDB_MMCIF__ #define __MMDB_MMCIF__ #include "mmdb_io_stream.h" namespace mmdb { namespace mmcif { // ====================== Category ========================== enum MMCIF_ITEM { MMCIF_Category = 0, MMCIF_Struct = 1, MMCIF_Loop = 2, MMCIF_Data = 3 }; DefineClass(Category); DefineStreamFunctions(Category); /// \brief mmcif::Category is a base class for mmcif::Struct and /// mmcif::Loop, implementations of mmCIF's "structure" and /// "loop" categories. /*! This class is not instantiated independently in any applications, however, it provides a few public functions which work for both mmcif::Struct and mmcif::Loop. All data in mmCIF hierarchy is addressed using construct "category.tag" plus row number (>=0) for loops. Category names should always start from underscore, while tags normally start with a letter, e.g. "_barrel.id". See general principles of working with mmCIF files and mmCIF hierarchies in Section \"\ref mmcif_handler\". */ class Category : public io::Stream { friend class Data; public : /// \brief Basic constructor. Category (); /// \brief Constructor that assigns category name. /// \param[in] N category name (must start with underscore). Category ( cpstr N ); /// \brief Constructor for MMDB data streaming functions. Category ( io::RPStream Object ); /// \brief Destructor. ~Category(); /// \brief Returns category name. /// \return NULL if name was not set /// \return pointer to character string if name was set inline pstr GetCategoryName() { return name; } /// \brief Sets category name. /// \param N new category name void SetCategoryName ( cpstr N ); /// \brief Returns category type. /// This function may be used when retrieving categories /// (structures and loops) from data blocks (mmcif::Data). /// \return MMCIF_Category for mmcif::Category /// \return MMCIF_Struct for mmcif::Struct /// \return MMCIF_Loop for mmcif::Loop virtual MMCIF_ITEM GetCategoryID() { return MMCIF_Category; } /// \brief Virtual function for writing category's content /// into mmCIF file. /// Default implementation does nothing. virtual void WriteMMCIF ( io::RFile ) {} /// \brief Virtual function for optimizig data structures. /// Optimized data structures take less RAM and their indexes /// are sorted for quicker access. Sorting is done automatically /// as new data is added to the category. If the /// category is edited (fields/data removed), it may need /// optimization and re-sorting for efficiency.\n\n /// The sorting preserves the order of actual appearance of /// tags in mmCIF file. If a category is created /// programmatically, the order of tags in mmCIF file will be /// the same as order of adding them to the category. virtual void Optimize(); /// \brief Sorts category's data for quicker access. /// The sorting is essentially re-indexing of data for quicker /// access. It does not change the order of data in both mmCIF /// hierarchy and mmCIF file. E.g., if tag "serial_no" was 2nd /// one in given category before sorting, it will remain on 2nd /// place after it, therefore no change in tag number passed /// to functions in mmcif::Struct, mmcif::Loop and mmcif::Data. void Sort(); /// \brief Returns serial number of a tag in the category. /// \param[in] ttag tag (or name of a field in category) /// \return \b >=0 : the tag is in given position /// \return \b <0 : the tag was not found, but it could be /// inserted before tag with (-rc-1)th index, where /// 'rc' is the return. int GetTagNo ( cpstr ttag ); /// \brief Adds a tag to the category. /// Adding a tag in mmcif::Category does not reserve any /// placeholder for the corresponding value. All tags get /// automatically sorted (reindexed) for quicker access. /// Tags will appear in mmCIF file in order of their addition /// to the category. /// \param[in] ttag tag to be added. /// \return \b >=0 the tag is already in the category, and return /// is its serial number. No changes to the category /// is done /// \return \b <0 the tag was added to the list of tags, and /// return is minus total number of tags in the /// category. int AddTag ( cpstr ttag ); /// \brief Returns the total number of tags in the category int GetNofTags() { return nTags; } /// \brief Returns tag with the specified serial number. /// The tags are enumerated as 0..GetNofTags()-1. /// \param tagNo tag's serial number /// \return \b NULL: tagNo is outside the range /// of 0..GetNofTags()-1 /// \return \b not \b NULL: tag in tagNo'th position pstr GetTag ( int tagNo ); // 0..nTags-1 /// \brief Prints list of tags to stdout. /// Both sorted and unsorted tags are printed to standard /// output. This function may be used for debugging. void PrintTags(); /// \brief Returns true if all tags from the list are found /// in the category. /// The size of the list of tags may be less than the number /// of tags in the category, and order of tags is disregarded. /// \param[in] tagList list of tags to be checked for presence /// in the category. The list must end with NULL /// pointer, or your program will crash. /// \return \b true if all tags from the list were found in the /// category /// \return \b false if one or more tags from the list were not /// found in the category. /// /// Example: /// \code /// cpstr tagList[] = {"id","type","date",NULL}; /// mmcif::Struct cifStruct; /// if (cifStruct.CheckTags(tagList)) /// printf ( " all tags are found in category %s\n", /// cifStruct.GetCategoryName() ); /// \endcode /// This function is useful for finding categories in /// "dirty cifs", where category name is not given. bool CheckTags ( cpstr * tagList ); /// \brief Deep copy of categories. /// Deep copy duplicates all data and memory allocations, /// producing a genuine clone of the original. Only deep copy /// should be used for copying MMDB objects, a mere assignment /// operator will fail you. /// \param[in] Category a pointer to mmcif::Category, the content of /// which is copied into 'this' category. virtual void Copy ( PCategory Category ); /// \brief MMDB stream writer. void write ( io::RFile f ); /// \brief MMDB stream reader. void read ( io::RFile f ); protected: int nTags; pstr name; psvector tag; ivector index; int nAllocTags; void InitCategory (); virtual void FreeMemory (); void ExpandTags ( int nTagsNew ); void PutCategoryName ( cpstr newName ); }; // ====================== Struct ============================ DefineClass(Struct); DefineStreamFunctions(Struct); /// \brief Constants used to specify mmCIF's \"data not given\" and /// \"data not available\" data types. extern const int CIF_NODATA_DOT; extern const int CIF_NODATA_QUESTION; extern cpstr CIF_NODATA_DOT_FIELD; extern cpstr CIF_NODATA_QUESTION_FIELD; /// \brief mmcif::Struct represents mmCIF's \"structure\" category, /// where data follows directly the corresponding tag. /*! mmCIF's \"structure\" category has the following form: \code _structure_name.tag0 value0 _structure_name.tag1 value1 ........... _structure_name.tagN valueN \endcode mmcif::Struct represents this construct by keeping category name (\"_structure_name\") and associated lists of tags (\"tag0,tag1...tagN\") and their values (\"value0,value1...valueN\"). The structure is created automatically when an mmCIF file is read, or it may be created programatically and then pushed into file. Access to data is provided via tags. Internally, all values are kept as character fields, and it is only on the retrieval stage that they are converted to other data types (integers, floats or strings). If conversion is not possible, an error code is returned by the corresponding functions, which should be checked by the application. See general principles of working with mmCIF files and mmCIF hierarchies, as well as some code samples, in Section \"\ref mmcif_handler\". */ class Struct : public Category { public : /// \brief Basic constructor Struct (); /// \brief Constructor that assigns structure name. /// \param[in] N structure name (must start with underscore). Struct ( cpstr N ); /// \brief Constructor for MMDB data streaming functions Struct ( io::RPStream Object ); /// \brief Destructor ~Struct(); /// \brief Adds field to the structure. /// \param[in] F field value /// \param[in] T tag name /// \param[in] Concatenate flag to concatenate existing field /// with the value of \b F. If tag \b T is already in /// the structure and \b Concatenate=true, then /// value of \b F is appended to the existing field. /// Otherwise, the field is replaced with the value /// of \b F void AddField ( cpstr F, cpstr T, bool Concatenate=false ); /// \brief Returns category type \b MMCIF_Struct. MMCIF_ITEM GetCategoryID() { return MMCIF_Struct; } /// \brief Optimizes structure for RAM and data access speed. /// Optimized data structures take less RAM and their indexes /// are sorted for quicker access. Sorting is done automatically /// as new data is added to the category. If the structure /// is edited (fields/data removed), it may need /// optimization and re-sorting for efficiency.\n\n /// The sorting preserves the order of actual appearance of /// tags in mmCIF file. If a structure is created /// programmatically, the order of tags in mmCIF file will be /// the same as order of adding them to the structure. void Optimize(); /// \brief Returns value of field corresponding to tag in the /// specified position. /// Tag positions are defined by the order of their appearance in /// mmCIF file (if structure was read from a file), or by the /// order of their addition to the structure (if structure was /// created programmatically). Tags are numbered as /// 0...GetNofTags()-1. /// \param[in] tagNo tag number (position in the structure) /// \return \b NULL: tag does not exist /// \return \b CIF_NODATA_DOT_FIELD the field contains /// \"data not given\" value /// \return \b CIF_NODATA_QUESTION_FIELD the field contains /// \"data not available\" value /// \return \b not \b NULL: string value of the field pstr GetField ( int tagNo ); // 0..nTags-1 /// \brief Fetches value, corresponding to the given tag, as /// a string /// \param[out] S pointer to string, which will point to newly /// allocated character string, containing value /// associated with tag \b TName. If tag or value /// is not found, or if value corresponds to /// mmCIF's \"data not given\" or /// \"data not available\", \b S returns NULL. /// \param[in] TName character string with tag name /// \param[in] Remove flag to remove the tag and its value from /// structure after it is read. /// \return \b CIFRC_NoTag: tag is not found /// \return \b CIFRC_NoField: value is not found /// \return \b CIFRC_Ok: success. If \b S returns NULL, then /// the value corresponds to either /// \"data not available\" or /// \"data not given\". /// \remarks If \b S!=NULL at time of call, the function will /// try to dispose the string it points on. This allows a slick /// re-use of the same pointer in consequitive calls. This also /// means that one should never pass unallocated pointer to /// this function. Safe use assumes the following patern: /// \code /// mmcif::Struct mmCIFStruct; /// pstr S; // this is merely "char *S" /// int rc; /// /// S = NULL; // null pointer before first use /// rc = mmCIFStruct.GetString ( S,"id" ); /// if (rc) CreateCopy ( S,"*** data not found" ); /// if (!S) CreateCopy ( S,"*** data not given or not available" ); /// printf ( " rc=%i, S='%s'\n",rc,S ); /// /// rc = mmCIFStruct.GetString ( S,"property" ); /// if (rc) CreateCopy ( S,"*** data not found" ); /// if (!S) CreateCopy ( S,"*** data not given or not available" ); /// printf ( " rc=%i, S='%s'\n",rc,S ); /// /// // etc etc etc /// /// delete[] S; // application is responsible for final /// // disposal of memory /// \endcode int GetString ( pstr & S, cpstr TName, bool Remove=false ); /// \brief Returns pointer to value associated with given tag. /// \param[in] TName character string with tag name /// \param[out] RC return code: /// \arg \b CIFRC_NoTag: tag is not found /// \arg \b CIFRC_NoField: value is not found /// \arg \b CIFRC_Ok: success. If function returns NULL, then /// the value corresponds to either /// \"data not available\" or /// \"data not given\". /// \return \b NULL: either tag or value is not found, or the /// value is \"data not available\" or \"data not given\". /// Read return code \b RC in order to interpret NULL return. /// \return \b not \b NULL: pointer (\c char \c *) to value /// associated with \b TName. /// \remarks Never try to dispose memory pointed by the return /// value, or your program will crash. pstr GetString ( cpstr TName, int & RC ); // NULL if TName // is not there /// \brief Deletes field associated with given tag. /// \param[in] TName character string with tag name /// \return \b >=0: field deleted /// \return \b <0: either field or tag is not found int DeleteField ( cpstr TName ); // <0 the field was not there /// \brief Fetches value, corresponding to the given tag, as /// a real number. /// \param[out] R reference to real number to accept the value. /// In case of failure, \b R returns zero. /// \param[in] TName character string with tag name /// \param[in] Remove flag to remove the tag and its value from /// structure after it is read. /// \return \b CIFRC_NoTag: tag is not found /// \return \b CIFRC_NoField: field is not found /// \return \b CIFRC_WrongFormat: value is not a real or integer /// number. /// \return \b CIFRC_NoData: value is either /// \"data not available\" or /// \"data not given\". /// \return \b CIFRC_Ok: success. int GetReal ( realtype & R, cpstr TName, bool Remove=false ); /// \brief Fetches value, corresponding to the given tag, as /// an integer number. /// \param[out] I reference to integer number to accept the /// value. In case of failure, \b I returns zero, except /// when value is \"data not available\" or /// \"data not given\", when I returns \c MinInt4. /// \param[in] TName character string with tag name /// \param[in] Remove flag to remove the tag and its value from /// structure after it is read. /// \return \arg \b CIFRC_NoTag: tag is not found /// \return \b CIFRC_NoField: field is not found /// \return \b CIFRC_WrongFormat: value is not an integer number. /// \return \b CIFRC_NoData: value is either /// \"data not available\" or /// \"data not given\". /// \return \b CIFRC_Ok: success. int GetInteger ( int & I, cpstr TName, bool Remove=false ); /// \brief Sets string value for given tag. /// \param[in] S character string with value to be set. /// If \b S==NULL, the \"data not given\" value /// will be set. If \b S==\"\" (empty string), the /// \"data not available\" value is stored. /// \param[in] TName character string with tag name. If tag /// is not found, it will be added to the structure. /// \param[in] NonBlankOnly flag to treat white-space-only /// strings: /// \arg \b false: set as is /// \arg \b true: set \"data not available\" value instead. void PutString ( cpstr S, cpstr TName, bool NonBlankOnly=false ); /// \brief Sets current date in format YYYY-MM-DD as a value /// for given tag. /// \param[in] T character string with tag name. If tag /// is not found, it will be added to the structure. void PutDate ( cpstr T ); /// \brief Sets \"data not given\" or \"data not available\" /// values for given tag. /// \param[in] NoDataType can be either /// \arg \b CIF_NODATA_DOT for \"data not given\" /// \arg \b CIF_NODATA_QUESTION for \"data not available\" /// \param[in] T character string with tag name. If tag /// is not found, it will be added to the structure. void PutNoData ( int NoDataType, cpstr T ); /// \brief Sets float-point value for given tag. /// \param[in] R real number with value to be set. /// \param[in] TName character string with tag name. If tag /// is not found, it will be added to the structure. /// \param[in] prec float-point precision; g-format with given /// precision will be used void PutReal ( realtype R, cpstr TName, int prec=8 ); /// \brief Sets float-point value for given tag. /// \param[in] R real number with value to be set. /// \param[in] TName character string with tag name. If tag /// is not found, it will be added to the structure. /// \param[in] format format string to convert \b R. void PutReal ( realtype R, cpstr TName, cpstr format ); /// \brief Sets integer value for given tag. /// \param[in] I integer number with value to be set. /// \param[in] TName character string with tag name. If tag /// is not found, it will be added to the structure. void PutInteger ( int I, cpstr TName ); /// \brief Writes structure data in mmCIF format into file. /// \param[in] FName character string with file name. /// \param[in] gzipMode flag to controll compression of files: /// \arg \b GZM_NONE: do not compress /// \arg \b GZM_CHECK: check file name suffix and compress /// (or not) accordingly /// \arg \b GZM_ENFORCE_GZIP: force gzip compression despite /// suffix /// \arg \b GZM_ENFORCE_COMPRESS: force using compress despite /// suffix /// \return \b true: success /// \return \b false: can not open file for writing. /// \remarks This function does not create a valid mmCIF file /// as \"data_XXX\" record will be missing. It may be used for /// debugging though. bool WriteMMCIFStruct ( cpstr FName, io::GZ_MODE gzipMode=io::GZM_CHECK ); /// \brief Writes structure into given file. /// \param f reference to MMDB's file class. The file should be /// opened and closed by application. /// \remarks There is a very limited use of this function on /// application level. It is primarily used by mmcif::Data class. void WriteMMCIF ( io::RFile f ); /// \brief Deep copy of structures. /// Deep copy duplicates all data and memory allocations, /// producing a genuine clone of the original. Only deep copy /// should be used for copying MMDB objects, a mere assignment /// operator will fail you. /// \param[in] Struct a pointer to mmcif::Struct, the content of /// which is copied into 'this' structure. void Copy ( PCategory Struct ); /// \brief MMDB stream writer. void write ( io::RFile f ); /// \brief MMDB stream reader. void read ( io::RFile f ); protected: psvector field; void InitStruct(); void FreeMemory(); }; // ====================== Loop ============================== DefineClass(Loop); DefineStreamFunctions(Loop); /// \brief mmcif::Loop represents mmCIF's \"loop\" category, which keeps /// rows of data values associated with tags. /*! mmCIF's \"loop\" category has the following form: \code loop_ _loop_name.tag0 value0 _loop_name.tag1 value1 ........... _loop_name.tagN valueN value00 value10 ... valueN0 value01 value11 ... valueN1 ........... value0M value1M ... valueNM \endcode mmcif::Loop represents this construct by keeping category name (\"_loop_name\") and associated lists of tags (\"tag0,tag1...tagN\") and data vectors (\"[value00...value0M],[value10...value1M]...[valueN0...valueNM]\"). The loop object is created automatically when an mmCIF file is read, or it may be created programatically and then pushed into file. Access to data is provided via tags and data indexes. Internally, all values are kept as character fields, and it is only on the retrieval stage that they are converted to other data types (integers, floats or strings). If conversion is not possible, an error code is returned by the corresponding functions, which should be checked by the application. The following code gives an example of creating mmCIF loop category and populating it with data: \code mmcif::Loop loop; char S[100]; int i; // Specify loop name: loop.SetCategoryName ( "_sample_loop" ); // Create loop structure, i.e., list of tags first: loop.AddLoopTag ( "id" ); loop.AddLoopTag ( "name" ); loop.AddLoopTag ( "value" ); // Now populate it with data. This my be done in 2 ways. // Here is how you write loop data in stream fashion, // value-after-value: for (i=0;i<3;i++) { loop.AddInteger ( i ); sprintf ( S,"1st_way-%i",i ); loop.AddString ( S ); loop.AddReal ( 2.5*(i+1) ); } // Here is how you populate loop data using direct-access // functions: for (i=3;i<6;i++) { loop.PutReal ( 2.5*(i+1),"value",i ); loop.PutInteger ( i,"id" ); sprintf ( S,"2nd way: %i",i ); loop.PutString ( S,"name" ); } loop.WriteMMCIFLoop ( "sample_loop.cif" ); \endcode The resulting file \b sample_loop.cif will contain: \code loop_ _sample_loop.id _sample_loop.name _sample_loop.value 0 1st_way-0 2.5 1 1st_way-1 5.0 2 1st_way-2 7.5 3 "2nd way: 3" 10.0 4 "2nd way: 4" 12.5 5 "2nd way: 5" 15.0 \endcode See general principles of working with mmCIF files and mmCIF hierarchies, as well as some code samples, in Section \"\ref mmcif_handler\". */ class Loop : public Category { friend class Data; public : /// \brief Basic constructor Loop (); /// \brief Constructor that assigns structure name. /// \param[in] N structure name (must start with underscore). Loop ( cpstr N ); /// \brief Constructor for MMDB data streaming functions Loop ( io::RPStream Object ); /// \brief Destructor ~Loop(); /// \brief Adds tag to the loop. /// The tag is appended to the list of existing tags. The order /// of tags cannot be changed. /// \param[in] T tag name /// \param[in] Remove flag to remove all fields in the loop. void AddLoopTag ( cpstr T, bool Remove=true ); /// \brief Sets string value at current loop position. /// When \b mmcif::Loop::Add[Data] functions use internal loop /// pointer. When category is created or cleared (by using /// \b mmcif::Loop::AddLoopTag ( T,true )) the pointer is set to /// 0th row and 0th column (tag). After each call to /// \b mmcif::Loop::Add[Data] function, internal pointer advances /// to next column (tag), and wraps over to next row, 0th tag, /// if list of tags is exhausted. Any remaining fields in last /// row will be populated with \"data not given\" value. /// \param[in] S character string with value to be set. /// If \b S==NULL, the \"data not given\" value /// will be set. If \b S==\"\" (empty string), the /// \"data not available\" value is stored. /// \param[in] NonBlankOnly flag to treat white-space-only /// strings: /// \arg \b false: set as is /// \arg \b true: set \"data not available\" value instead. void AddString ( cpstr S, bool NonBlankOnly=false ); /// \brief Sets \"data not given\" or \"data not available\" at /// current loop position. /// When \b mmcif::Loop::Add[Data] functions use internal loop /// pointer. When category is created or cleared (by using /// \b mmcif::Loop::AddLoopTag ( T,true )) the pointer is set to /// 0th row and 0th column (tag). After each call to /// \b mmcif::Loop::Add[Data] function, internal pointer advances /// to next column (tag), and wraps over to next row, 0th tag, /// if list of tags is exhausted. Any remaining fields in last /// row will be populated with \"data not given\" value. /// \param[in] NoDataType integer key specifying which type of /// data absence should be set as a value: /// \arg \b CIF_NODATA_DOT for \"data not given\" /// \arg \b CIF_NODATA_QUESTION for \"data not available\" void AddNoData ( int NoDataType ); /// \brief Sets float-point value at current loop position. /// When \b mmcif::Loop::Add[Data] functions use internal loop /// pointer. When category is created or cleared (by using /// \b mmcif::Loop::AddLoopTag ( T,true )) the pointer is set to /// 0th row and 0th column (tag). After each call to /// \b mmcif::Loop::Add[Data] function, internal pointer advances /// to next column (tag), and wraps over to next row, 0th tag, /// if list of tags is exhausted. Any remaining fields in last /// row will be populated with \"data not given\" value. /// \param[in] R real number with value to be set. /// \param[in] prec float-point precision; g-format with given /// precision will be used void AddReal ( realtype R, int prec=8 ); /// \brief Sets float-point value at current loop position in /// given format. /// When \b mmcif::Loop::Add[Data] functions use internal loop /// pointer. When category is created or cleared (by using /// \b mmcif::Loop::AddLoopTag ( T,true )) the pointer is set to /// 0th row and 0th column (tag). After each call to /// \b mmcif::Loop::Add[Data] function, internal pointer advances /// to next column (tag), and wraps over to next row, 0th tag, /// if list of tags is exhausted. Any remaining fields in last /// row will be populated with \"data not given\" value. /// \brief Sets float-point value for given tag. /// \param[in] R real number with value to be set. /// \param[in] format format string to convert \b R. void AddReal ( realtype R, cpstr format ); /// \brief Sets integer value at current loop position in given /// format. /// When \b mmcif::Loop::Add[Data] functions use internal loop /// pointer. When category is created or cleared (by using /// \b mmcif::Loop::AddLoopTag ( T,true )) the pointer is set to /// 0th row and 0th column (tag). After each call to /// \b mmcif::Loop::Add[Data] function, internal pointer advances /// to next column (tag), and wraps over to next row, 0th tag, /// if list of tags is exhausted. Any remaining fields in last /// row will be populated with \"data not given\" value. /// \param[in] I integer number with value to be set. void AddInteger ( int I ); /// \brief Returns current length of the loop (i.e. the number /// of rows). /// \return number of data rows in the loop. int GetLoopLength() { return nRows; } /// \brief Returns string pointer on the field corresponding to /// tag in the specified position, in the specified row. /// Tag positions are defined by the order of their appearance in /// mmCIF file (if loop was read from a file), or by the /// order of their addition to the loop (if loop was /// created programmatically). /// \param[in] rowNo row number (0...GetLoopLength()-1) /// \param[in] tagNo tag number (0...GetNofTags()-1) /// \return \b NULL: tag or row do not exist /// \return \b CIF_NODATA_DOT_FIELD the field contains /// \"data not given\" value /// \return \b CIF_NODATA_QUESTION_FIELD the field contains /// \"data not available\" value /// \return \b not \b NULL: string value of the field /// \remarks Never try to dispose memory pointed by the return /// value, or your program will crash. pstr GetField ( int rowNo, int tagNo ); /// \brief Fetches value, corresponding to the given tag, in /// the given row, as a string /// \param[out] S pointer to string, which will point to newly /// allocated character string, containing value /// associated with tag \b TName and row \b nrow. /// If tag, row or value /// is not found, or if value corresponds to /// mmCIF's \"data not given\" or /// \"data not available\", \b S returns NULL. /// \param[in] TName character string with tag name /// \param[in] nrow row number (0...GetLoopLength()-1) /// \param[in] Remove flag to remove the field from /// structure after it is read. /// \return \b CIFRC_NoTag: tag is not found /// \return \b CIFRC_WrongIndex: row is not found /// \return \b CIFRC_NoField: value is not found /// \return \b CIFRC_Ok: success. If \b S returns NULL, then /// the value corresponds to either /// \"data not available\" or /// \"data not given\". /// \remarks If \b S!=NULL at time of call, the function will /// try to dispose the string it points on. This allows a slick /// re-use of the same pointer in consequitive calls. This also /// means that one should never pass unallocated pointer to /// this function. Safe use assumes the following patern: /// \code /// mmcif::Loop mmCIFLoop; /// pstr S; // this is merely "char *S" /// int rc; /// /// S = NULL; // null pointer before first use /// rc = mmCIFLoop.GetString ( S,"id",1 ); /// if (rc) CreateCopy ( S,"*** data not found" ); /// if (!S) CreateCopy ( S,"*** data not given or not available" ); /// printf ( " rc=%i, S='%s'\n",rc,S ); /// /// rc = mmCIFLoop.GetString ( S,"property",0 ); /// if (rc) CreateCopy ( S,"*** data not found" ); /// if (!S) CreateCopy ( S,"*** data not given or not available" ); /// printf ( " rc=%i, S='%s'\n",rc,S ); /// /// // etc etc etc /// /// delete[] S; // application is responsible for final /// // disposal of memory /// \endcode int GetString ( pstr & S, cpstr TName, int nrow, bool Remove=false ); /// \brief Returns pointer to value associated with given tag, /// in the given row of the loop. /// \param[in] TName character string with tag name /// \param[in] nrow row number (0...GetLoopLength()-1) /// \param[out] RC return code: /// \arg \b CIFRC_NoTag: tag is not found /// \arg \b CIFRC_WrongIndex: row is not found /// \arg \b CIFRC_NoField: value is not found /// \arg \b CIFRC_Ok: success. If function returns NULL, then /// the value corresponds to either /// \"data not available\" or /// \"data not given\". /// \return \b NULL: either tag, row or value is not found, or the /// value is \"data not available\" or \"data not given\". /// Read return code \b RC in order to interpret NULL return. /// \return \b not \b NULL: pointer (\c char \c *) to value /// associated with \b TName. /// \remarks Never try to dispose memory pointed by the return /// value, or your program will crash. pstr GetString ( cpstr TName, int nrow, int & RC ); /// \brief Copies value, associated with given tag, /// in the given row, into specified buffer. /// Terminating NULL character is appended. /// \param[out] buf character string to accept the value /// \param[in] maxlength maximum number of bytes to copy /// \param[in] TName character string with tag name /// \param[in] nrow row number (0...GetLoopLength()-1) /// \param[out] RC return code: /// \arg \b CIFRC_NoTag: tag is not found /// \arg \b CIFRC_WrongIndex: row is not found /// \arg \b CIFRC_NoField: value is not found /// \arg \b CIFRC_Ok: success. /// \remarks Destination string \b buf is not modified if /// \b RC!=CIFRC_Ok . void CopyString ( pstr buf, int maxlength, cpstr TName, int nrow, int & RC ); /// \brief Deletes field associated with given tag in /// the given row. /// \param[in] TName character string with tag name /// \param[in] nrow row number (0...GetLoopLength()-1) /// \return \b >=0: field deleted /// \return \b <0: either field or tag is not found int DeleteField ( cpstr TName, int nrow ); /// \brief Deletes all fields in given row. /// \param[in] nrow row number (0...GetLoopLength()-1) /// \return \b CIFRC_Ok: fields deleted /// \return \b CIFRC_WrongIndex: row not found /// \remarks Note that this function delets just the fields, but /// not the row. If you wish the row to be deleted, call /// mmcif::Loop::Optimize() function after this one. int DeleteRow ( int nrow ); /// \brief Fetches value, corresponding to the given tag, /// in the given row, as a real number. /// \param[out] R reference to real number to accept the value. /// In case of failure, \b R returns zero. /// \param[in] TName character string with tag name /// \param[in] nrow row number (0...GetLoopLength()-1) /// \param[in] Remove flag to remove the field from /// the loop after it is read. /// \return \b CIFRC_NoTag: tag is not found /// \return \b CIFRC_WrongIndex: row not found /// \return \b CIFRC_NoField: field is not found /// \return \b CIFRC_WrongFormat: value is not a real or integer /// number. /// \return \b CIFRC_NoData: value is either /// \"data not available\" or /// \"data not given\". /// \return \b CIFRC_Ok: success. int GetReal ( realtype & R, cpstr TName, int nrow, bool Remove=false ); /// \brief Copies value, associated with given tag, /// in the given row, into specified destination as /// a real number. /// \param[out] R reference to real number to accept the value /// \param[in] TName character string with tag name /// \param[in] nrow row number (0...GetLoopLength()-1) /// \param[out] RC return code: /// \arg \b CIFRC_NoTag: tag is not found /// \arg \b CIFRC_WrongIndex: row is not found /// \arg \b CIFRC_NoField: value is not found /// \arg \b CIFRC_Ok: success. /// \remarks Destination \b R is set 0 if \b RC!=CIFRC_Ok. void CopyReal ( realtype & R, cpstr TName, int nrow, int & RC ); /// \brief Copies value, associated with given tag, /// in the given row, into specified destination as /// an integer number. /// \param[out] I reference to integer number to accept the value /// \param[in] TName character string with tag name /// \param[in] nrow row number (0...GetLoopLength()-1) /// \param[out] RC return code: /// \arg \b CIFRC_NoTag: tag is not found /// \arg \b CIFRC_WrongIndex: row is not found /// \arg \b CIFRC_NoField: value is not found /// \arg \b CIFRC_Ok: success. /// \remarks Destination \b I is set 0 if \b RC!=CIFRC_Ok. void CopyInteger ( int & I, cpstr TName, int nrow, int & RC ); /// \brief Fetches value, corresponding to the given tag, /// in the given row, as an integer number. /// \param[out] I reference to integer number to accept the value. /// In case of failure, \b R returns zero. /// \param[in] TName character string with tag name /// \param[in] nrow row number (0...GetLoopLength()-1) /// \param[in] Remove flag to remove the field from /// the loop after it is read. /// \return \b CIFRC_NoTag: tag is not found /// \return \b CIFRC_WrongIndex: row not found /// \return \b CIFRC_NoField: field is not found /// \return \b CIFRC_WrongFormat: value is not a real or integer /// number. /// \return \b CIFRC_NoData: value is either /// \"data not available\" or /// \"data not given\". /// \return \b CIFRC_Ok: success. int GetInteger ( int & I, cpstr TName, int nrow, bool Remove=false ); /// \brief Fetches set of values, corresponding to the given /// tag, in the given range of rows, as a vector of /// strings. /// \param[out] S reference to string vector to accept /// the values. if \b S==NULL , the vector will be /// allocated with starting index of \b i1. /// \param[in] TName character string with tag name /// \param[in] i1 minimum row number to fetch, the actual /// index will be calculated as \b max(0,min(i1,i2)) /// \param[in] i2 maximum row number to fetch, the actual /// index will be calculated as /// \b min(GetLoopLength()-1,max(i1,i2)) /// \param[in] Remove flag to remove fetched fields from /// the loop after they are read. /// \return \b CIFRC_NoTag: tag is not found /// \return \b CIFRC_WrongIndex: invalid range of rows /// \return \b CIFRC_Ok: success. /// /// For safe use, \b S should be pre-allocated by calling /// process. Only elements \b S[i1] to \b S[i2] will contain /// fetched data, others remain untouched. The calling /// process is responsible for the disposal of \b S. Example: /// \code /// mmcif::Loop loop; /// psvector S; // equivalent to char **S /// int i,i1,i2,rc,n; /// /// // ... get loop data /// /// n = loop.GetLoopLength(); /// i1 = 5; i2 = n - 5; // could be wrong! /// /// // allocate vector of strings /// GetVectorMemory ( S,n,0 ); // "0" for starting index /// for (i=0;i