Added documentation for statgen

This commit is contained in:
arcan1s
2013-07-27 23:38:42 +04:00
parent f2ec8c6580
commit 1af86034e7
54 changed files with 3953 additions and 308 deletions

3
agl/AUTHORS Normal file
View File

@ -0,0 +1,3 @@
Current developers:
Evgeniy Alekseev aka arcanis <esalexeev (at) gmail (dot) com>

31
agl/CMakeLists.txt Normal file
View File

@ -0,0 +1,31 @@
cmake_minimum_required (VERSION 2.8)
cmake_policy(SET CMP0011 NEW)
cmake_policy(SET CMP0003 OLD)
# set project name
set (PROJECT agl)
# set additional cmake file
include (${PROJECT}.cmake)
# additional options
OPTION (WITH_DEBUG_MODE "Build with debug mode" OFF)
OPTION (ADD_INCLUDE "Add include files" OFF)
# set libraries
set (LIBRARIES)
foreach (LIBRARY ${LIBRARIES})
find_library ("${LIBRARY}_FOUND" ${LIBRARY})
message (STATUS "Check the ${LIBRARY} is installed: " ${${LIBRARY}_FOUND})
if ("${${LIBRARY}_FOUND}" STREQUAL "${LIBRARY}_FOUND-NOTFOUND")
message (STATUS "Adding library sources")
add_subdirectory (../${LIBRARY} lib/${LIBRARY})
endif ()
endforeach ()
# additional targets
set (TARGETS "")
set (HEADERS "")
add_subdirectory (src)

341
agl/COPYING Normal file
View File

@ -0,0 +1,341 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) 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
this service 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 make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. 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.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
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
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the 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 a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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
MERCHANTABILITY AND 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.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
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
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
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 2 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, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision 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, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This 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 Library General
Public License instead of this License.

14
agl/INSTALL Normal file
View File

@ -0,0 +1,14 @@
CMakeFlags:
-DCMAKE_INSTALL_PREFIX= - install prefix (default is '/usr/local')
-DADD_INCLUDE=1 - install include files (default is disable)
-DWITH_DEBUG_MODE=1 - compile with flag '-g' (default is disable)
Install for Linux:
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ../
make
make install
Install for Windows:
create project file using 'cmake'
compile project
You may also download compiled executable file for Win_x86.

22
agl/agl.cmake Normal file
View File

@ -0,0 +1,22 @@
# set directories
set (${PROJECT}_BINARY_DIR bin)
set (${PROJECT}_SOURCE_DIR src:include)
set (${PROJECT}_LIB_DIR lib)
set (CMAKE_INCLUDE_PATH ${${PROJECT}_SOURCE_DIR})
set (CMAKE_LIBRARY_PATH ${${PROJECT}_LIB_DIR})
set (EXECUTABLE_OUTPUT_PATH ${${PROJECT}_BINARY_DIR})
set (CMAKE_VERBOSE_MAKEFILE ON)
if ( WITH_DEBUG_MODE )
ADD_DEFINITIONS ( -DDEBUG_MODE=1 )
endif ()
if ( CMAKE_COMPILER_IS_GNUCXX )
set (ADD_CXX_FLAGS "-Wall")
set (CMAKE_CXX_FLAGS "-O0 ${ADD_CXX_FLAGS}")
set (CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set (CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
else ()
message (STATUS "Flags not enabled")
endif ()

61
agl/src/CMakeLists.txt Normal file
View File

@ -0,0 +1,61 @@
set ("${PROJECT}_VERSION_MAJOR" 1)
set ("${PROJECT}_VERSION_MINOR" 0)
set ("${PROJECT}_VERSION_PATCH" 1)
set ("${PROJECT}_VERSION" ${${PROJECT}_VERSION_MAJOR}.${${PROJECT}_VERSION_MINOR}.${${PROJECT}_VERSION_PATCH})
message (STATUS ${${PROJECT}_VERSION})
## set files
# main files
set (MAIN_SOURCES main)
# not public srcs
set (PRIVATE_CLASSES)
# headers only files
SET (HEADERS_ONLY)
# public srcs
set (PUBLIC_CLASSES add_main
coords
envir_search
messages
print_struct
set_center)
# public headers
set (PUBLIC_HEADERS)
# shared libraries
if (CMAKE_COMPILER_IS_GNUCXX)
set (ADDITIONAL_LIB m)
else ()
set (ADDITIONAL_LIB)
endif()
set (SOURCES)
# append list
foreach (class ${PRIVATE_CLASSES})
LIST (APPEND SOURCES ${class}.c)
LIST (APPEND HEADERS ${class}.h)
endforeach ()
foreach (class ${HEADERS_ONLY})
LIST (APPEND HEADERS ${class}.h)
endforeach ()
foreach (class ${PUBLIC_CLASSES})
LIST (APPEND SOURCES ${class}.c)
LIST (APPEND HEADERS ../include/${PROJECT}/${class}.h)
LIST (APPEND PUBLIC_HEADERS ../include/${PROJECT}/${class}.h)
endforeach ()
# message
message (STATUS "SOURCES: ${SOURCES}")
# link libraries and compile
add_executable (${PROJECT} ${MAIN_SOURCES} ${SOURCES})
target_link_libraries (${PROJECT} ${ADDITIONAL_LIB})
# install properties
INSTALL (TARGETS ${PROJECT}
DESTINATION bin)
if (ADD_INCLUDE)
INSTALL (FILES ${PUBLIC_HEADERS}
DESTINATION include/${PROJECT})
endif ()

21
agl/src/Makefile Normal file
View File

@ -0,0 +1,21 @@
PROJECT=AGL
CC=gcc
CFLAGS=-c -Wall -fPIC
LDFLAGS=-lm
SOURCES_DIR=src
SOURCES=main.c add_main.c coords.c messages.c print_struct.c set_center.c read_agl.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=agl
$(PROJECT): $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.c.o:
$(CC) $(CFLAGS) $< -o $@
clean:
rm -f *.o

53
agl/src/add_main.c Normal file
View File

@ -0,0 +1,53 @@
/* Additional library for main.c (agl)
*/
#include <stdio.h>
// #include "messages.h"
int error_checking (const char *aglinp, const float *cell, const char *input,
const char *output)
{
if ((cell[0] == 0.0) || (cell[1] == 0.0) || (cell[2] == 0.0))
return 11;
if (input[0] == '#')
return 12;
if (output[0] == '#')
return 13;
if (aglinp[0] == '#')
return 14;
return 0;
}
int print_message (const int quiet, FILE *std_output, const int log, FILE *f_log,
const int mode, const char *str)
{
if ((quiet != 1) && (std_output != stderr))
message (0, mode, str, std_output);
if (log == 1)
message (1, mode, str, f_log);
return 0;
}
int set_defaults (char aglinp, float *cell, char *input, int *log, int *num_of_mol,
char *output, int *quiet, float *rad)
{
int i;
aglinp[0] = '#';
for (i=0; i<3; i++)
cell[i] = 0.0;
input[0] = '#';
*log = 0;
*num_of_mol = 1;
output[0] = '#';
*quiet = 0;
*rad = 6.0;
return 0;
}

338
agl/src/coords.c Normal file
View File

@ -0,0 +1,338 @@
/* Library for reading coordinates from input file
*
* Usage:
* reading_coords (mode, filename, type_interaction, labels,
* cell, &number_of_molecules, &number_of_atoms, true_label_molecule,
* label_molecule, type_atoms, coords, char_type_atoms)
*/
#include <stdio.h>
#include <stdlib.h>
int reading_coords (const int mode, const char *filename, const int type_inter,
const int *label_atom, const float *cell, int *num_mol,
int *num_atoms, int *true_label_mol, int *label_mol,
int *type_atoms, float *coords, char *ch_type_atoms)
/* filename - name of file with coordinates
* type_inter - type interaction (number of molecules for interaction)
* (number of molecules in aglomerate for agl)
* label_atom - types of atom for interaction
* (molecules in aglomerate for agl)
* cell - cell dimension
* num_mol - number of molecules for writing coordinates
* num_atoms - number of atoms for writing coordinates
* true_label_mol - massive of true numbers of molecule for atoms
* label_mol - massive of numbers of molecule for atoms
* type_atoms - massive of atom types for atoms
* coords - massive of coordinates
* ch_type_atoms - massive of char types for atoms
*/
{
char at_symb[32], file_string[256];
int atoms, cur_at_num, cur_at_type, cur_mol, i, j, tr_num_atoms, ref_mol, x, y;
float cur_coords[3], *not_tr_coords, ref[3];
FILE *inp;
/* cur_*, at_symb - temp variables
* file_string - temp string variable
* atoms - total number of atoms in system
* tr_num_atoms - number of translated atoms for writing coordinates (m.b. 8*num_atoms)
* ref_mol - number of molecule for reference
* not_tr_coords - not translated coordinates
* ref - coordinates of reference molecule
* inp - file with input data
*/
*num_atoms = 0;
*num_mol = 0;
// Reading file
inp = fopen (filename, "r");
if (inp == NULL)
return 1;
ref_mol = -1;
fscanf (inp, "%i", &atoms);
not_tr_coords = (float *) malloc (3 * atoms * sizeof (float));
fgets (file_string, 256, inp);
for (i=0; i<atoms; i++)
{
fgets (file_string, 256, inp);
sscanf (file_string, "%i%s%f%f%f%i%i", &cur_at_num, at_symb, &cur_coords[0],
&cur_coords[1], &cur_coords[2], &cur_at_type, &cur_mol);
switch (mode)
{
case 0:
// for statgen
for (j=0; j<type_inter; j++)
if (cur_at_type == label_atom[j])
{
not_tr_coords[3**num_atoms+0] = cur_coords[0];
not_tr_coords[3**num_atoms+1] = cur_coords[1];
not_tr_coords[3**num_atoms+2] = cur_coords[2];
if (ref_mol != cur_mol)
{
ref_mol = cur_mol;
true_label_mol[*num_mol] = ref_mol;
*num_mol = *num_mol + 1;
}
label_mol[*num_atoms] = *num_mol - 1;
type_atoms[*num_atoms] = j;
*num_atoms = *num_atoms + 1;
}
break;
case 1:
// for envir and frad
not_tr_coords[3**num_atoms+0] = cur_coords[0];
not_tr_coords[3**num_atoms+1] = cur_coords[1];
not_tr_coords[3**num_atoms+2] = cur_coords[2];
ch_type_atoms[2**num_atoms+0] = at_symb[0];
ch_type_atoms[2**num_atoms+1] = at_symb[1];
if (ref_mol != cur_mol)
{
ref_mol = cur_mol;
true_label_mol[*num_mol] = ref_mol;
*num_mol = *num_mol + 1;
}
label_mol[*num_atoms] = *num_mol - 1;
type_atoms[*num_atoms] = j;
*num_atoms = *num_atoms + 1;
break;
case 2:
// for agl
for (j=0; j<type_inter; j++)
if (cur_mol == label_atom[j])
{
not_tr_coords[3**num_atoms+0] = cur_coords[0];
not_tr_coords[3**num_atoms+1] = cur_coords[1];
not_tr_coords[3**num_atoms+2] = cur_coords[2];
ch_type_atoms[2**num_atoms+0] = at_symb[0];
ch_type_atoms[2**num_atoms+1] = at_symb[1];
if (ref_mol != cur_mol)
{
ref_mol = cur_mol;
true_label_mol[*num_mol] = ref_mol;
*num_mol = *num_mol + 1;
}
label_mol[*num_atoms] = *num_mol - 1;
type_atoms[*num_atoms] = j;
*num_atoms = *num_atoms + 1;
}
break;
default: return 1;
}
}
fclose (inp);
// Translation
tr_num_atoms = *num_atoms;
for (i=0; i<*num_atoms; i++)
for (j=0; j<3; j++)
coords[3*i+j] = not_tr_coords[3*i+j];
// Assign initial value to reference coordinates
ref_mol = label_mol[0];
for (i=0; i<3; i++)
ref[i] = coords[3*0+i];
for (i=0; i<*num_atoms; i++)
{
if (label_mol[i] != ref_mol)
{
ref_mol = label_mol[i];
for (j=0; j<3; j++)
ref[j] = not_tr_coords[3*i+j];
}
for (x=0; x<3; x++)
{
if (ref[x] >= 0.0)
// if xyz >= 0.0 A
{
for (j=0; j<3; j++)
if (j == x)
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j] - cell[j];
else
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
else
// if xyz < 0.0 A
{
for (j=0; j<3; j++)
if (j == x)
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j] + cell[j];
else
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
}
for (x=0; x<3; x++)
{
for (y=x+1; y<3; y++)
{
if ((ref[x] >= 0.0) && (ref[y] >= 0.0))
// if xyz and xyz >= 0.0 A
{
for (j=0; j<3; j++)
if ((j == x) || (j == y))
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j] - cell[j];
else
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
if ((ref[x] < 0.0) && (ref[y] < 0.0))
// if xyz and xyz < 0.0 A
{
for (j=0; j<3; j++)
if ((j == x) || (j == y))
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j] + cell[j];
else
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
}
for (y=0; y<3; y++)
if ((ref[x] < 0.0) && (ref[y] >= 0.0))
// if xyz OR xyz >= 0.0
{
for (j=0; j<3; j++)
{
if (j == x)
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j] + cell[j];
if (j == y)
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j] - cell[j];
if ((j != x) && (j != y))
coords[3*tr_num_atoms+j] = not_tr_coords[3*i+j];
}
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
}
if ((ref[0] >= 0.0) && (ref[1] >= 0.0) && (ref[2] >= 0.0))
// if x and y and z >= 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] - cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] - cell[1];
coords[3*tr_num_atoms+2] = not_tr_coords[3*i+2] - cell[2];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
if ((ref[0] >= 0.0) && (ref[1] >= 0.0) && (ref[2] < 0.0))
// if x and y >= 0.0 A and z < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] - cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] - cell[1];
coords[3*tr_num_atoms+2] = not_tr_coords[3*i+2] + cell[2];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
if ((ref[0] >= 0.0) && (ref[1] < 0.0) && (ref[2] >= 0.0))
// if x and z >= 0.0 A and y < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] - cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] + cell[1];
coords[3*tr_num_atoms+2] = not_tr_coords[3*i+2] - cell[2];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
if ((ref[0] < 0.0) && (ref[1] >= 0.0) && (ref[2] >= 0.0))
// if y and z >= 0.0 A and x < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] + cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] - cell[1];
coords[3*tr_num_atoms+2] = not_tr_coords[3*i+2] - cell[2];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
if ((ref[0] < 0.0) && (ref[1] < 0.0) && (ref[2] >= 0.0))
// if x and y < 0.0 A and z >= 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] + cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] + cell[1];
coords[3*tr_num_atoms+2] = not_tr_coords[3*i+2] - cell[2];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
if ((ref[0] < 0.0) && (ref[1] >= 0.0) && (ref[2] < 0.0))
// if x and z < 0.0 A and y >= 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] + cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] - cell[1];
coords[3*tr_num_atoms+2] = not_tr_coords[3*i+2] + cell[2];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
if ((ref[0] >= 0.0) && (ref[1] < 0.0) && (ref[2] < 0.0))
// if x >= 0.0 A and y and z < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] - cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] + cell[1];
coords[3*tr_num_atoms+2] = not_tr_coords[3*i+2] + cell[2];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
if ((ref[0] < 0.0) && (ref[1] < 0.0) && (ref[2] < 0.0))
// if x and y and z < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] + cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] + cell[1];
coords[3*tr_num_atoms+2] = not_tr_coords[3*i+2] + cell[2];
label_mol[tr_num_atoms] = label_mol[i];
type_atoms[tr_num_atoms] = type_atoms[i];
tr_num_atoms++;
}
}
// free memory
free (not_tr_coords);
return 0;
}

203
agl/src/main.c Normal file
View File

@ -0,0 +1,203 @@
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// #include "add_main.h"
// #include "coords.h"
// #include "messages.h"
// #include "print_struct.h"
// #include "read_agl.h"
int main(int argc, char *argv[])
{
char tmp_str[2048];
int error, i, j, *tmp_int;
FILE *f_inp, *f_log;
char aglinp[256], *ch_type_atoms, input[256], logfile[256], output[256];
float cell[3], *coords;
int *label_mol, log, num_atoms, num_mol, num_needed_mol, *needed_mol, quiet,
*true_label_mol;
/* ch_type_atoms - massive of char types for atoms
* aglinp - input file with aglomerate name
* input - input file name
* logfile - log file name
* output - output file name
*
* cell - cell dimension
* coords - massive of coordinates
*
* label_mol - massive of numbers of molecule for atoms
* log - status of log-mode
* num_atoms - number of atoms for writing coordinates
* num_mol - number of molecules for writing coordinates
* num_needed_mol - number of needed molecules
* needed_mol - massive of needed molecules
* quiet - status of quiet-mode
* true_label_mol - massive of true numbers of molecule for atoms
*/
set_defaults (aglinp, cell, input, &log, &num_of_mol, output, &quiet, &rad);
for (i=1; i<argc; i++)
{
if ((argv[i][0] == '-') && (argv[i][1] == 'h'))
{
sprintf (tmp_str, " agl\n");
sprintf (tmp_str, "%sProgram for create PDB file with choosen aglomerate\n", tmp_str);
sprintf (tmp_str, "%sVersion : 1.0.1 License : GPL\n", tmp_str);
sprintf (tmp_str, "%s Evgeniy Alekseev aka arcanis\n", tmp_str);
sprintf (tmp_str, "%s E-mail : esalexeev@gmail.com\n\n", tmp_str);
sprintf (tmp_str, "%sUsage:\n", tmp_str);
sprintf (tmp_str, "%sagl -a FILENAME -i FILENAME -c X,Y,Z -o FILEMANE [ -l LOGFILE] [ -q ] [ -h ]\n\n", tmp_str);
sprintf (tmp_str, "%sParametrs:\n", tmp_str);
sprintf (tmp_str, "%s -a - input file with aglomerates (in format statgen)\n", tmp_str);
sprintf (tmp_str, "%s -i - input file with coordinates\n", tmp_str);
sprintf (tmp_str, "%s -c - cell size (float), A\n", tmp_str);
sprintf (tmp_str, "%s -o - output file with coordinates\n", tmp_str);
sprintf (tmp_str, "%s -l - log enable\n", tmp_str);
sprintf (tmp_str, "%s -q - quiet enable\n", tmp_str);
sprintf (tmp_str, "%s -h - show this help and exit\n", tmp_str);
fputs (tmp_str, stdout);
return 0;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'a'))
// input file
{
strcpy (aglinp, argv[i+1]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'i'))
// input file
{
strcpy (input, argv[i+1]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'c'))
// cell size
{
sscanf (argv[i+1], "%f,%f,%f", &cell[0], &cell[1], &cell[2]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'o'))
// output file
{
strcpy (output, argv[i+1]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'l'))
// log mode
{
log = 1;
strcpy (logfile, argv[i+1]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'q'))
// quiet mode
{
quiet = 1;
}
}
if (log == 1)
f_log = fopen (logfile, "w");
print_message (quiet, stdout, log, f_log, 0, argv[0]);
print_message (quiet, stdout, log, f_log, 1, argv[0]);
// error check
error = error_checking (aglinp, cell, input, output);
if (error != 0)
{
print_message (quiet, stderr, log, f_log, 17, argv[0]);
return 1;
}
print_message (quiet, stdout, log, f_log, 2, argv[0]);
// processing
// initial variables
print_message (quiet, stdout, log, f_log, 3, input);
f_inp = fopen (input, "r");
if (f_inp == NULL)
{
print_message (quiet, stderr, log, f_log, 18, input);
return 1;
}
fscanf (f_inp, "%i", &num_atoms);
fclose (f_inp);
ch_type_atoms = (char *) malloc (2 * num_atoms * sizeof (char));
coords = (float *) malloc (3 * 8 * num_atoms * sizeof (float));
label_mol = (int *) malloc (8 * num_atoms * sizeof (int));
needed_mol = (int *) malloc (num_atoms * sizeof (int));
tmp_int = (int *) malloc (8 * num_atoms * sizeof (int));
true_label_mol = (int *) malloc (num_atoms * sizeof (int));
// error checking
if ((ch_type_atoms == NULL) ||
(coords == NULL) ||
(label_mol == NULL) ||
(needed_mol == NULL) ||
(tmp_int == NULL) ||
(true_label_mol == NULL))
{
print_message (quiet, stderr, log, f_log, 19, argv[0]);
return 17;
}
sprintf (tmp_str, "%6cAglomerate file: '%s';\n%6cInput file: '%s';\n\
%6cOutput file: '%s';\n%6cLog: %i;\n%6cQuiet: %i;\n%6cCell size: %.4f, %.4f, %.4f\n",
' ', aglinp, ' ', input, ' ', output, ' ', log, ' ', quiet, ' ', cell[0], cell[1], cell[2]);
print_message (quiet, stdout, log, f_log, 5, tmp_str);
print_message (quiet, stdout, log, f_log, 6, argv[0]);
// reading aglomerate
print_message (quiet, stdout, log, f_log, 7, aglinp);
error = reading_agl (aglinp, &num_needed_mol, tmp_str, needed_mol);
if (error == 0)
{
sprintf (tmp_str, "%6cNumber of molecules in aglomerate: %i\n", num_needed_mol);
print_message (quiet, stdout, log, f_log, 8, tmp_str);
// reading coordinates
print_message (quiet, stdout, log, f_log, 7, input);
error = reading_coords (1, input, num_needed_mol, needed_mol, cell, &num_mol,
&num_atoms, true_label_mol, label_mol, tmp_int, coords,
ch_type_atoms);
// analyze
if (error == 0)
{
sprintf (tmp_str, "%6cNumber of molecules: %i; %6cNumber of atoms: %i\n",
' ', num_mol, ' ', num_atoms);
print_message (quiet, stdout, log, f_log, 8, tmp_str);
error =
if (error == 0)
{
print_message (quiet, stderr, log, f_log, 21, argv[0]);
error = print_structure (output, num_needed_mol, needed_mol, num_atoms,
label_mol, ch_type_atoms, coords);
print_message (quiet, stderr, log, f_log, 12, output);
}
}
}
}
print_message (quiet, stdout, log, f_log, 13, argv[0]);
print_message (quiet, stdout, log, f_log, 15, argv[0]);
// free memory
free (ch_type_atoms);
free (coords);
free (label_mol);
free (needed_mol);
free (tmp_int);
free (true_label_mol);
print_message (quiet, stdout, log, f_log, 16, argv[0]);
if (log == 1)
fclose (f_log);
return 0;
}

99
agl/src/messages.c Normal file
View File

@ -0,0 +1,99 @@
/* Library for printing messages at output
*
* Usage:
* message (log, mode, text, output)
*/
#include <stdio.h>
#include <time.h>
int message (const int log, const int mode, const char *text, FILE *output)
/* mode - number of message
* text - additional text
*/
{
char out[4096];
if (log == 1)
{
char time_str[256];
time_t t = time (NULL);
struct tm* aTm = localtime (&t);
sprintf (time_str, "[%04d-%02d-%02d %02d:%02d:%02d] [%2i]: ", aTm->tm_year+1900,
aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec, mode);
fputs (time_str, output);
}
switch (mode)
{
case 0:
sprintf (out, "Starting program: '%s'\n", text);
break;
case 1:
sprintf (out, "Checking errors\n");
break;
case 2:
sprintf (out, "Errors are not detected\n");
break;
case 3:
sprintf (out, "Initialization of variables from file '%s'\n", text);
break;
case 4:
break;
case 5:
sprintf (out, "Initial parametrs: \n%s", text);
break;
case 6:
sprintf (out, "Processing\n");
break;
case 7:
sprintf (out, "Open file: '%s'\n", text);
break;
case 8:
sprintf (out, "%s", text);
break;
case 9:
sprintf (out, "%6cSize of variables was changed successfully\n", ' ');
break;
case 10:
sprintf (out, "%6cConnectivity matrix was created successfully\n", ' ');
break;
case 11:
sprintf (out, "%6cConnectivity matrix was processed successfully\n", ' ');
break;
case 12:
sprintf (out, "%6cResult was printed to file '%s' successfully\n", ' ', text);
break;
case 13:
sprintf (out, "End of processing\n");
break;
case 14:
sprintf (out, "Printing summary statistic to file '%s'\n", text);
break;
case 15:
sprintf (out, "Free memory\n");
break;
case 16:
sprintf (out, "Exiting without errors\n");
break;
case 17:
sprintf (out, "Something wrong!\nSee '%s -h' for more details\n", text);
break;
case 18:
sprintf (out, "File '%s' not found\nError\n", text);
break;
case 19:
sprintf (out, "Memory error\n");
break;
case 20:
sprintf (out, "%6cCenter of molecules was set successfully\n", ' ');
break;
case 21:
sprintf (out, "%6cEnvironment was selected successfully\n", ' ');
break;
}
fputs (out, output);
return 0;
}

58
agl/src/print_struct.c Normal file
View File

@ -0,0 +1,58 @@
/* Library for printing structure to pdb file
*
* Usage:
* print_structure (output, num_needed_mol, needed_mol, num_atoms,
* label_mol, char_type_atoms, coords)
*/
#include <stdio.h>
int print_structure (const char *output, const int num_needed_mol, const int *needed_mol,
const int num_atoms, const int *label_mol, const char *ch_type_atoms,
const float *coords)
/* output - output file name
* num_needed_mol - number of needed molecules
* needed_mol - massive of needed molecules
* num_atoms - number of atoms
* label_mol - massive of numbers of molecule for atoms
* ch_type_atoms - massive of char types for atoms
* coords - massive of coordinates
*/
{
int cur_atom, cur_atom_num, cur_mol, i, j;
FILE *f_out;
/* cur_atom - current atom
* cur_atom_num - true atom number
* cur_mol - current molecule
*/
cur_atom = 1;
f_out = fopen (output, "w");
for (i=0; i<num_needed_mol; i++)
for (j=0; j<8*num_atoms; j++)
{
if (j < num_atoms)
{
cur_mol = 0;
cur_atom_num = j;
}
else
{
cur_mol = ((j - num_atoms) % 7) + 1;
cur_atom_num = (j - num_atoms) / 7;
}
if (needed_mol[i] == (8*label_mol[j]+cur_mol))
{
fprintf(f_out, "ATOM %5i %c%c MOL %4i %8.3f%8.3f%8.3f\n", cur_atom,
ch_type_atoms[2*cur_atom_num+0], ch_type_atoms[2*cur_atom_num+1],
i+1, coords[3*j+0], coords[3*j+1], coords[3*j+2]);
cur_atom++;
}
}
fclose (f_out);
return 0;
}

33
agl/src/read_agl.c Normal file
View File

@ -0,0 +1,33 @@
/* Library for reading aglomerate from statgen-file
*
* Usage:
* reading_agl (aglinput, &num_needed_mol, agl_class, needed_mol)
*/
#include <stdio.h>
int reading_agl (const char *aglinp, int *num_needed_mol, char *agl_class, int *needed_mol)
/* aglinp - input file with aglomerate
* num_needed_mol - number of needed molecules
* agl_class - aglomerate class
* needed_mol - massive of needed molecules
*/
{
char connect[256], tmp_str[256];
int i;
FILE *f_agl;
f_agl = fopen (aglinp, "r");
fgets (tmp_str, 256, f_agl);
sscanf (tmp_str, "AGL=%i=%s", num_needed_mol, agl_class);
for (i=0; i<*num_needed_mol; i++)
{
fgets (tmp_str, 256, f_agl);
sscanf (tmp_str, "%i=%s", &needed_mol[i], connect);
}
fclose (f_agl);
return 0;
}

59
agl/src/select_mol.c Normal file
View File

@ -0,0 +1,59 @@
/* Library for select molecules in translations
*
* Usage:
*
*/
#include <math.h>
int select_molecule (const int num_atoms, const int *label_mol, const int *true_label_mol, const float *coords, const int num_needed_mol, int *needed_mol)
{
float r, ref[3], rmin;
int i, j, k, *old_needed_mol;
old_needed_mol = (int *) malloc (num_needed_mol * sizeof (int));
if (old_needed_mol == NULL)
return 1;
// set first molecule
ref_mol = old_needed_mol[0];
needed_mol[0] = 0;
k = 1;
for (i=0; i<3; i++)
ref[i] = coords[3*0+i];
for (i=1; i<num_needed_mol; i++)
for (j=0; j<8*num_atoms; j++)
if (old_needed_mol[i] == true_label_mol[label_mol[j]])
{
if (j < num_atoms)
cur_mol = 0;
else
cur_mol = ((j - num_atoms) % 7) + 1;
// for (j=0; j<3; j++)
// centr_coords[3*(8*label_mol[i]+cur_mol)+j] += coords[3*i+j];
}
for (i=1; i<num_needed_mol; i++)
for (j=0; j<num_atoms; j++)
if (old_needed_mol[i] == true_label_mol[label_mol[j]])
{
if (ref_mol != true_label_mol[label_mol[j]])
{
ref_i = j;
rmin = sqrt (pow ((coords[3*j+0] - ref[0]), 2) + \
pow ((coords[3*j+1] - ref[1]), 2) + \
pow ((coords[3*j+2] - ref[2]), 2));
ref_mol = true_label_mol[label_mol[j]];
}
else
{
}
}
free (old_needed_mol);
return 0;
}

View File

@ -9,16 +9,16 @@ message (STATUS ${${PROJECT}_VERSION})
# main files
set (MAIN_SOURCES main)
# not public srcs
set (PRIVATE_CLASSES)
set (PRIVATE_CLASSES add_main
coords
envir_search
messages
print_struct
set_center)
# headers only files
SET (HEADERS_ONLY)
# public srcs
set (PUBLIC_CLASSES add_main
coords
envir_search
messages
print_struct
set_center)
set (PUBLIC_CLASSES)
# public headers
set (PUBLIC_HEADERS)
# shared libraries

View File

@ -3,7 +3,7 @@
#include <stdio.h>
// #include "messages.h"
#include "messages.h"
int error_checking (const float *cell, const char *input, const char *output)

View File

@ -15,8 +15,10 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
int *num_atoms, int *true_label_mol, int *label_mol,
int *type_atoms, float *coords, char *ch_type_atoms)
/* filename - name of file with coordinates
* type_inter - type interaction (number of molecules for interaction)
* label_atom - types of atom for interaction
* type_inter - type interaction (number of molecules for interaction)
* (number of molecules in aglomerate for agl)
* label_atom - types of atom for interaction
* (molecules in aglomerate for agl)
* cell - cell dimension
* num_mol - number of molecules for writing coordinates
* num_atoms - number of atoms for writing coordinates
@ -83,7 +85,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
break;
case 1:
// for envir
// for envir and frad
not_tr_coords[3**num_atoms+0] = cur_coords[0];
not_tr_coords[3**num_atoms+1] = cur_coords[1];
not_tr_coords[3**num_atoms+2] = cur_coords[2];
@ -101,6 +103,29 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
*num_atoms = *num_atoms + 1;
break;
case 2:
// for agl
for (j=0; j<type_inter; j++)
if (cur_mol == label_atom[j])
{
not_tr_coords[3**num_atoms+0] = cur_coords[0];
not_tr_coords[3**num_atoms+1] = cur_coords[1];
not_tr_coords[3**num_atoms+2] = cur_coords[2];
ch_type_atoms[2**num_atoms+0] = at_symb[0];
ch_type_atoms[2**num_atoms+1] = at_symb[1];
if (ref_mol != cur_mol)
{
ref_mol = cur_mol;
true_label_mol[*num_mol] = ref_mol;
*num_mol = *num_mol + 1;
}
label_mol[*num_atoms] = *num_mol - 1;
type_atoms[*num_atoms] = j;
*num_atoms = *num_atoms + 1;
}
break;
default: return 1;
}
}

View File

@ -22,6 +22,7 @@ int search_envir (const int num_of_mol, const int num_mol, const float *centr_co
int i;
/* r - radius
*/
*num_needed_mol = 0;
for (i=0; i<8*num_mol; i++)

View File

@ -3,12 +3,12 @@
#include <stdlib.h>
#include <string.h>
// #include "add_main.h"
// #include "coords.h"
// #include "envir_search.h"
// #include "messages.h"
// #include "print_struct.h"
// #include "set_center.h"
#include "add_main.h"
#include "coords.h"
#include "envir_search.h"
#include "messages.h"
#include "print_struct.h"
#include "set_center.h"
int main(int argc, char *argv[])

View File

@ -1,7 +1,8 @@
cmake_minimum_required (VERSION 2.8)
cmake_policy(SET CMP0011 NEW)
cmake_policy(SET CMP0003 OLD)
cmake_policy(SET CMP0011 NEW)
cmake_policy(SET CMP0015 NEW)
# set project name
set (PROJECT statgen)
@ -28,4 +29,4 @@ set (LIBRARIES)
set (TARGETS "")
set (HEADERS "")
add_subdirectory (src)
add_subdirectory (${${PROJECT}_SOURCE_DIR})

61
statgen/about.dox Normal file
View File

@ -0,0 +1,61 @@
/*! @mainpage statgen
*
* @section intro_sec Introduction
*
* <b>Developer</b>:
* <ul>
* <li>Evgeniy Alekseev aka arcanis <pre><esalexeev (at) gmail (dot) com></pre>
*</ul>
* <b>License</b>:
* <ul>
* <li>GPL
* </ul>
*
* @section How-To-Use How to use
* Usage:
* <pre>
* statgen -i INPUT -s FIRST,LAST -c X,Y,Z -a ... -r ... -o OUTPUT [ -g DEPTH ]
* [ -l LOGFILE ] [ -q ] [ -h ]
*
* Parametrs:
* -i - mask of input files
* -s - trajectory steps (integer)
* -c - cell size (float), A
* -a - atom types (integer). Format: 'ATOM1' or 'ATOM1,ATOM2' or etc
* -r - criteria (float), A. Format: '0-0:2.4,0-1:3.0' means 0-0-interaction
* (<2.4 A) and 0-1 (<3.0) are needed. This flag can be used multiple times
* -o - output file name
* -g - check graph isomorphism. DEPTH is max depth for check cycles (>= 3)
* -l - log enable
* -q - quiet enable
* -h - show this help and exit
* </pre>
*
* @page Install
*
* @section Requirements Requirements
* The application statgen requires the following external stuff:
* - cmake >= 2.8
* - gcc >= 4.8
*
* @section How-To How to install
*
* @subsection Linux Linux
* @code
* mkdir build && cd build
* cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ../
* make
* make install
* @endcode
*
* @subsection Windows Windows
* @code
* create project file using 'cmake'
* compile project
* @endcode
* You may also download compiled executable file for Win_x86.
*
* @page Changelog
* V.1.0.1 (2013-07-27)
* * initial release
*/

BIN
statgen/logo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -3,62 +3,27 @@ set ("${PROJECT}_VERSION_MINOR" 0)
set ("${PROJECT}_VERSION_PATCH" 1)
set ("${PROJECT}_VERSION" ${${PROJECT}_VERSION_MAJOR}.${${PROJECT}_VERSION_MINOR}.${${PROJECT}_VERSION_PATCH})
message (STATUS ${${PROJECT}_VERSION})
message (STATUS "${PROJECT}: Version ${${PROJECT}_VERSION}")
## set files
# main files
set (MAIN_SOURCES main)
# not public srcs
set (PRIVATE_CLASSES)
# headers only files
SET (HEADERS_ONLY)
# public srcs
set (PUBLIC_CLASSES add_main
coords
graph
int2char
messages
stat_print
stat_select
stat_sort
summary_stat)
# public headers
set (PUBLIC_HEADERS)
# shared libraries
# set files
aux_source_directory (. SOURCES)
# set library
if (CMAKE_COMPILER_IS_GNUCXX)
set (ADDITIONAL_LIB m)
else ()
set (ADDITIONAL_LIB)
endif()
set (SOURCES)
# append list
foreach (class ${PRIVATE_CLASSES})
LIST (APPEND SOURCES ${class}.c)
LIST (APPEND HEADERS ${class}.h)
endforeach ()
foreach (class ${HEADERS_ONLY})
LIST (APPEND HEADERS ${class}.h)
endforeach ()
foreach (class ${PUBLIC_CLASSES})
LIST (APPEND SOURCES ${class}.c)
LIST (APPEND HEADERS ../include/${PROJECT}/${class}.h)
LIST (APPEND PUBLIC_HEADERS ../include/${PROJECT}/${class}.h)
endforeach ()
# message
message (STATUS "SOURCES: ${SOURCES}")
# link libraries and compile
add_executable (${PROJECT} ${MAIN_SOURCES} ${SOURCES})
add_executable (${PROJECT} ${SOURCES})
target_link_libraries (${PROJECT} ${ADDITIONAL_LIB})
# install properties
INSTALL (TARGETS ${PROJECT}
DESTINATION bin)
INSTALL (TARGETS ${PROJECT} DESTINATION bin)
if (ADD_INCLUDE)
INSTALL (FILES ${PUBLIC_HEADERS}
DESTINATION include/${PROJECT})
INSTALL (FILES ${PUBLIC_HEADERS} DESTINATION include/${PROJECT})
endif ()

View File

@ -1,14 +1,43 @@
/* Additional library for main.c (statgen)
/**
* @file
*/
#include <stdio.h>
// #include "messages.h"
#include "messages.h"
/**
* @fn error_checking
*/
int error_checking (const float *cell, const int from, const char *input,
const int max_depth, const int num_of_inter, const char *output,
const int to, const int type_inter)
/**
* @brief function that checks errors in input variables
* @code
* error_checking (cell, from, input, max_depth, num_of_inter, output, to,
* type_inter);
* @endcode
*
* @param cell massive of cell size
* @param from first trajectory step
* @param input mask of trajectory files
* @param max_depth max depth for check cycles in graph analyze
* @param num_of_inter number of different interactions
* @param output output file name
* @param to last trajectory step
* @param type_inter number of atoms for interactions
*
* @return 11 - error in 'type_inter'
* @return 12 - error in 'cell'
* @return 13 - error in 'to' or 'from'
* @return 14 - error in 'num_of_inter'
* @return 15 - error in 'input'
* @return 16 - error in 'output'
* @return 19 - error in 'max_depth'
* @return 0 - exit without errors
*/
{
if ((type_inter == 0) || (type_inter > 4))
return 11;
@ -29,10 +58,35 @@ int error_checking (const float *cell, const int from, const char *input,
}
/**
* @fn printing_head
*/
int printing_head (const char *output, const int log, const int quiet,
const char *input, const int from, const int to, const float *cell,
const int type_inter, const int *label_atom,
const int num_of_inter, const float *crit, const int max_depth)
/**
* @brief function that prints header in output file
* @code
* printing_head (output, log, quiet, input, from, to, cell, type_inter, label_atom,
* num_of_inter, crit, max_depth);
* @endcode
*
* @param output output file nams
* @param log status of log-mode
* @param quiet status of quiet-mode
* @param input mask of trajectory files
* @param from first trajectory step
* @param to last trajectory step
* @param cell massive of cell size
* @param type_inter number of atoms for interactions
* @param label_atom massive of atom types for interactions
* @param num_of_inter number of different interactions
* @param crit massive of criteria
* @param max_depth maximum depth for check cycles in graph analyze
*
* @return 0 - exit without errors
*/
{
int i, j;
FILE *f_out;
@ -65,9 +119,26 @@ int printing_head (const char *output, const int log, const int quiet,
return 0;
}
/**
* @fn print_message
*/
int print_message (const int quiet, FILE *std_output, const int log, FILE *f_log,
const int mode, const char *str)
/**
* @brief function that prints message in log and stdout
* @code
* print_message (quiet, stdout, log, f_log, 0, str);
* @endcode
*
* @param quiet status of quiet-mode
* @param std_output stdout
* @param log status of log-mode
* @param f_log log file
* @param mode number of message in "messages.c"
* @param str additional text in message
*
* @return 0 - exit without errors
*/
{
if ((quiet != 1) && (std_output != stderr))
message (0, mode, str, std_output);
@ -78,8 +149,31 @@ int print_message (const int quiet, FILE *std_output, const int log, FILE *f_log
}
/**
* @fn set_defaults
*/
int set_defaults (float *cell, int *from, char *input, int *log, int *max_depth,
int *num_of_inter, char *output, int *to, int *type_inter, int *quiet)
/**
* @brief function for set default values of variables
* @code
* set_defaults (cell, &from, input, &log, &max_depth, &num_of_inter, output, &to,
* &type_inter, &quiet);
* @endcode
*
* @param cell massive of cell size
* @param from first trajectory step
* @param input mask of trajectory files
* @param log status of log-mode
* @param max_depth maximum depth for check cycles in graph analyze
* @param num_of_inter number of different interactions
* @param output output file name
* @param to last trajectory step
* @param type_inter number of atoms for interactions
* @param quiet status of quiet-mode
*
* @return 0 - exit without errors
*/
{
int i;

View File

@ -1,6 +1,23 @@
/**
* @file
*/
#ifndef ADD_MAIN_H
#define ADD_MAIN_H
/**
* @fn error_checking
*/
/**
* @fn printing_head
*/
/**
* @fn print_message
*/
/**
* @fn set_defaults
*/
int error_checking (const float *, const int, const char *, const int, const int,
const char *, const int, const int);
int printing_head (const char *, const int, const int, const char *, const int,

View File

@ -1,50 +1,68 @@
/* Library for reading coordinates from input file
*
* Usage:
* reading_coords (mode, filename, type_interaction, labels,
* cell, &number_of_molecules, &number_of_atoms, true_label_molecule,
* label_molecule, type_atoms, coords, char_type_atoms)
/**
* @file
*/
#include <stdio.h>
#include <stdlib.h>
/**
* @fn reading_coords
*/
int reading_coords (const int mode, const char *filename, const int type_inter,
const int *label_atom, const float *cell, int *num_mol,
int *num_atoms, int *true_label_mol, int *label_mol,
int *type_atoms, float *coords, char *ch_type_atoms)
/* filename - name of file with coordinates
* type_inter - type interaction (number of molecules for interaction)
* label_atom - types of atom for interaction
* cell - cell dimension
* num_mol - number of molecules for writing coordinates
* num_atoms - number of atoms for writing coordinates
* true_label_mol - massive of true numbers of molecule for atoms
* label_mol - massive of numbers of molecule for atoms
* type_atoms - massive of atom types for atoms
* coords - massive of coordinates
* ch_type_atoms - massive of char types for atoms
/**
* @brief function that reads coordinates from special file format
* @code
* reading_coords (0, filename, type_inter, label_atom, cell, &num_mol,
* &num_atoms, true_label_mol, label_mol, type_atoms,
* coords, ch_type_atoms);
* @endcode
*
* @param mode mode of reading; '1' is statgen, '2' is envir or
* frad, '3' is agl
* @param filename input file name
* @param type_inter number of needed atoms
* (number of needed molecules)
* @param label_atom massive of needed atom types
* (massive of needed molecules)
* @param cell massive of cell size
* @param num_mol number of molecules
* @param num_atoms number of atoms
* @param true_label_mol massive of true numbers of molecule for atoms
* @param label_mol massive of numbers of molecule for atoms
* @param type_atoms massive of atom types
* @param coords massive of coordinates
* @param ch_type_atoms massive of char atom types
*
* @return 1 - file $filename does not exist
* @return 2 - unknown mode
* @return 0 - exit without errors
*/
{
char at_symb[32], file_string[256];
int atoms, cur_at_num, cur_at_type, cur_mol, i, j, tr_num_atoms, ref_mol, x, y;
float cur_coords[3], *not_tr_coords, ref[3];
FILE *inp;
/* cur_*, at_symb - temp variables
* file_string - temp string variable
* atoms - total number of atoms in system
* tr_num_atoms - number of translated atoms for writing coordinates (m.b. 8*num_atoms)
* ref_mol - number of molecule for reference
* not_tr_coords - not translated coordinates
* ref - coordinates of reference molecule
* inp - file with input data
/* cur_* temp variables
* at_symb temp variable
* file_string temp string variable
* atoms total number of atoms in system
* tr_num_atoms number of translated atoms (must be 8*num_atoms)
* ref_mol number of molecule for reference in translation
* not_tr_coords massive of not translated coordinates
* ref massive of coordinates of reference molecule
* inp input file
*/
/// <b>Work blocks</b>
*num_atoms = 0;
*num_mol = 0;
// Reading file
/// <pre> reading file </pre>
inp = fopen (filename, "r");
if (inp == NULL)
return 1;
@ -59,10 +77,11 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
sscanf (file_string, "%i%s%f%f%f%i%i", &cur_at_num, at_symb, &cur_coords[0],
&cur_coords[1], &cur_coords[2], &cur_at_type, &cur_mol);
// reading variables according to selected mode
switch (mode)
{
case 0:
// for statgen
// mode == 0 (selected atoms)
for (j=0; j<type_inter; j++)
if (cur_at_type == label_atom[j])
{
@ -83,7 +102,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
break;
case 1:
// for envir
// mode == 1 (all atoms)
not_tr_coords[3**num_atoms+0] = cur_coords[0];
not_tr_coords[3**num_atoms+1] = cur_coords[1];
not_tr_coords[3**num_atoms+2] = cur_coords[2];
@ -101,18 +120,41 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
*num_atoms = *num_atoms + 1;
break;
default: return 1;
case 2:
// mode == 2 (selected molecules)
for (j=0; j<type_inter; j++)
if (cur_mol == label_atom[j])
{
not_tr_coords[3**num_atoms+0] = cur_coords[0];
not_tr_coords[3**num_atoms+1] = cur_coords[1];
not_tr_coords[3**num_atoms+2] = cur_coords[2];
ch_type_atoms[2**num_atoms+0] = at_symb[0];
ch_type_atoms[2**num_atoms+1] = at_symb[1];
if (ref_mol != cur_mol)
{
ref_mol = cur_mol;
true_label_mol[*num_mol] = ref_mol;
*num_mol = *num_mol + 1;
}
label_mol[*num_atoms] = *num_mol - 1;
type_atoms[*num_atoms] = j;
*num_atoms = *num_atoms + 1;
}
break;
default: return 2;
}
}
fclose (inp);
// Translation
/// <pre> translation </pre>
tr_num_atoms = *num_atoms;
for (i=0; i<*num_atoms; i++)
for (j=0; j<3; j++)
coords[3*i+j] = not_tr_coords[3*i+j];
// Assign initial value to reference coordinates
// assign initial value to reference coordinates
ref_mol = label_mol[0];
for (i=0; i<3; i++)
ref[i] = coords[3*0+i];
@ -129,7 +171,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
for (x=0; x<3; x++)
{
if (ref[x] >= 0.0)
// if xyz >= 0.0 A
// if xyz >= 0.0 A
{
for (j=0; j<3; j++)
if (j == x)
@ -142,7 +184,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
tr_num_atoms++;
}
else
// if xyz < 0.0 A
// if xyz < 0.0 A
{
for (j=0; j<3; j++)
if (j == x)
@ -161,7 +203,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
for (y=x+1; y<3; y++)
{
if ((ref[x] >= 0.0) && (ref[y] >= 0.0))
// if xyz and xyz >= 0.0 A
// if xyz and xyz >= 0.0 A
{
for (j=0; j<3; j++)
if ((j == x) || (j == y))
@ -175,7 +217,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[x] < 0.0) && (ref[y] < 0.0))
// if xyz and xyz < 0.0 A
// if xyz and xyz < 0.0 A
{
for (j=0; j<3; j++)
if ((j == x) || (j == y))
@ -191,7 +233,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
for (y=0; y<3; y++)
if ((ref[x] < 0.0) && (ref[y] >= 0.0))
// if xyz OR xyz >= 0.0
// if xyz OR xyz >= 0.0
{
for (j=0; j<3; j++)
{
@ -210,7 +252,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[0] >= 0.0) && (ref[1] >= 0.0) && (ref[2] >= 0.0))
// if x and y and z >= 0.0 A
// if x and y and z >= 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] - cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] - cell[1];
@ -222,7 +264,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[0] >= 0.0) && (ref[1] >= 0.0) && (ref[2] < 0.0))
// if x and y >= 0.0 A and z < 0.0 A
// if x and y >= 0.0 A and z < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] - cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] - cell[1];
@ -234,7 +276,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[0] >= 0.0) && (ref[1] < 0.0) && (ref[2] >= 0.0))
// if x and z >= 0.0 A and y < 0.0 A
// if x and z >= 0.0 A and y < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] - cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] + cell[1];
@ -246,7 +288,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[0] < 0.0) && (ref[1] >= 0.0) && (ref[2] >= 0.0))
// if y and z >= 0.0 A and x < 0.0 A
// if y and z >= 0.0 A and x < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] + cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] - cell[1];
@ -258,7 +300,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[0] < 0.0) && (ref[1] < 0.0) && (ref[2] >= 0.0))
// if x and y < 0.0 A and z >= 0.0 A
// if x and y < 0.0 A and z >= 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] + cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] + cell[1];
@ -270,7 +312,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[0] < 0.0) && (ref[1] >= 0.0) && (ref[2] < 0.0))
// if x and z < 0.0 A and y >= 0.0 A
// if x and z < 0.0 A and y >= 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] + cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] - cell[1];
@ -282,7 +324,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[0] >= 0.0) && (ref[1] < 0.0) && (ref[2] < 0.0))
// if x >= 0.0 A and y and z < 0.0 A
// if x >= 0.0 A and y and z < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] - cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] + cell[1];
@ -294,7 +336,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
if ((ref[0] < 0.0) && (ref[1] < 0.0) && (ref[2] < 0.0))
// if x and y and z < 0.0 A
// if x and y and z < 0.0 A
{
coords[3*tr_num_atoms+0] = not_tr_coords[3*i+0] + cell[0];
coords[3*tr_num_atoms+1] = not_tr_coords[3*i+1] + cell[1];
@ -306,7 +348,7 @@ int reading_coords (const int mode, const char *filename, const int type_inter,
}
}
// free memory
/// <pre> free memory </pre>
free (not_tr_coords);
return 0;

View File

@ -1,6 +1,14 @@
/**
* @file
*/
#ifndef COORDS_H
#define COORDS_H
/**
* @fn reading_coords
*/
int reading_coords (const int, const char *, const int, const int *,
const float *, int *, int *, int *, int *, int *, float *,
char *);

View File

@ -1,46 +1,77 @@
/* Library for graph structure analyze
* Usage:
* graph_analyze (N, connect, max_depth, isomorphism_class)
/**
* @file
*/
#include <math.h>
#include <stdlib.h>
/**
* @fn check_cycle
*/
int check_cycle (const int N, const int *pn)
// function to return number of cycles
/**
* @brief function that calculates number of cycles in graph
* @code
* cycle = check_cycle (N, pn);
* @endcode
*
* @param N number of vertexes
* @param pn massive of number of vertexes with weight equals to i
*
* @return number of cycles
*/
{
int cycle, i;
/* cycle - number of cycle
/* cycle number of cycle
*/
cycle = 0;
for (i=1; i<N; i++)
cycle += i*pn[i];
// for linear (0.5*cycle == N-1)
// for linear (0.5*cycle == N-1)
cycle = 0.5 * cycle - (N - 1);
return cycle;
}
/**
* @fn check_cycle_size
*/
int check_cycle_size (const int N, const int *matrix, const int depth, int *n_cycle)
// function to return number of cycles of certain size
/**
* @brief function that returns number of cycles different size
* @code
* check_cycle_size (N, matrix, depth, n_cycle);
* @endcode
*
* @param N number of vertexes
* @param matrix connectivity matrix
* @param depth depth of search (maximum number of vertexes in cycle)
* @param n_cycle massive of number of cycle with number of vertexes
* equals to i
*
* @return 1 - memory error
* @return 0 - exit without errors
*/
{
int cur_N, cycle, i, j, k, n, p, *vertex;
/* cur_N - current number of elements in submatrix
* cycle - if (cycle == 1) that cycle exist
* n - number of samples
* vertex - vertexes of subgraph
/* cur_N current number of elements in submatrix
* cycle if (cycle == 1) that cycle exist
* n number of samples
* vertex vertexes of subgraph
*/
vertex = (int *) malloc (N * sizeof (int));
if (vertex == NULL)
return 1;
for (i=0; i<depth-2; i++)
n_cycle[i] = 0;
// matrix generation from
// http://wincode.org/acm-icpc/subsets-generation
// matrix generation from
// http://wincode.org/acm-icpc/subsets-generation
n = pow (2, N);
for (i=0; i<n; i++)
{
@ -54,7 +85,7 @@ int check_cycle_size (const int N, const int *matrix, const int depth, int *n_cy
if ((cur_N > 2) && (cur_N <= depth))
{
// copy connectivity matrix
// copy connectivity matrix
cycle = 1;
for (j=0; j<cur_N; j++)
{
@ -65,7 +96,7 @@ int check_cycle_size (const int N, const int *matrix, const int depth, int *n_cy
cycle = 0;
}
// analyze subgraph
// analyze subgraph
if (cycle == 1)
n_cycle[cur_N-3]++;
}
@ -77,32 +108,56 @@ int check_cycle_size (const int N, const int *matrix, const int depth, int *n_cy
}
/**
* @fn check_tail
*/
int check_tail (const int *pn)
// function to return number of tails
/**
* @brief function that calculates number of tails
* @code
* tails = check_tail (pn);
* @endcode
*
* @param pn massive of number of vertexes with weight equals to i
*
* @return number of tails
*/
{
return pn[1];
}
/**
* @fn graph_analyze
*/
int graph_analyze (const int N, const int *matrix, const int max_depth, int *iso)
/* N - number of vertex in graph
* matrix - connectivity matrix
* max_depth - maximum depth for check_cycle_size
* iso - isomorphism class
/**
* @brief function that analyzes graph isomorhic class
* @code
* graph_analyze (N, matrix, max_depth, iso);
* @endcode
*
* @param N number of vertexes
* @param matrix connectivity matrix
* @param max_depth maximum depth of search for check_cycle_size
* @param iso isomorphism class
*
* @return 1 - memory error
* @return 0 - exit without errors
*/
{
int depth, i, j, *n_cycle, p, *pn;
/* depth - depth for check_cycle_size
* n_cycle - number of cycle
* p - current weight
* pn - total weight
/* depth depth of search for check_cycle_size
* n_cycle number of cycle
* p current weight
* pn massive of number of vertexes with weight equals to i
*/
if (max_depth > N)
depth = N;
else
depth = max_depth;
// convert to matrix of weight
// convert to matrix of weight
pn = (int *) malloc (N * sizeof (int));
n_cycle = (int *) malloc ((depth - 2) * sizeof (int));
if ((pn == NULL) ||
@ -129,6 +184,7 @@ int graph_analyze (const int N, const int *matrix, const int max_depth, int *iso
iso[i+2] = n_cycle[i];
}
// free memory
free (n_cycle);
free (pn);

View File

@ -1,6 +1,23 @@
/**
* @file
*/
#ifndef GRAPH_H
#define GRAPH_H
/**
* @fn graph_analyze
*/
/**
* @fn check_cycle
*/
/**
* @fn check_cycle_size
*/
/**
* @fn check_tail
*/
int graph_analyze (const int, const int *, const int, int *);
int check_cycle (const int, const int *);
int check_cycle_size (const int, const int *, const int, int *);

View File

@ -1,12 +1,22 @@
/* Library for converting integer to string
* Usage
* char = conv (number, position)
/**
* @file
*/
/**
* @fn conv
*/
char conv (const int fnumb, const int dig_pos)
/* fnumb - integer
* dig_pos - position
/**
* @brief function that converts from integer to char
* @code
* char = conv (N, 0);
* @endcode
*
* @param fnumb integer
* @param dig_pos position: ones=1, decimals=2, hundreds=3
*
* @return char
*/
{
int d, h, o;

View File

@ -1,6 +1,14 @@
/**
* @file
*/
#ifndef INT2CHAR_H
#define INT2CHAR_H
/**
* @fn conv
*/
char conv (const int, const int);
#endif /* INT2CHAR_H */

View File

@ -1,17 +1,21 @@
/**
* @file
*/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
// #include "add_main.h"
// #include "coords.h"
// #include "int2char.h"
// #include "messages.h"
// #include "stat_print.h"
// #include "stat_select.h"
// #include "stat_sort.h"
// #include "summary_stat.h"
#include "add_main.h"
#include "coords.h"
#include "int2char.h"
#include "messages.h"
#include "stat_print.h"
#include "stat_select.h"
#include "stat_sort.h"
#include "summary_stat.h"
int main (int argc, char *argv[])
@ -26,40 +30,40 @@ int main (int argc, char *argv[])
int *agl, *connect, from, *label_atom, *label_mol, log, max_depth, num_atoms,
num_mol, *num_mol_agl, num_of_inter, *stat, *stat_all, step, to,
*true_label_mol, *type_agl, *type_atoms, type_inter, quiet;
/* input - mask of input files
* logfile - log file name
* output - output file name
/* input mask of trajectory files
* logfile log file name
* output output file name
*
* cell - cell dimension
* coords - massive of coordinates
* crit - massive of criteria
* cell massive of cell size
* coords massive of coordinates
* crit massive of criteria
*
* agl - massive of aglomerates
* connect - connectivity graph for all molecules
* from - start point
* label_atom - types of atom for interaction
* label_mol - massive of numbers of molecule for atoms
* log - status of log-mode
* max_depth - max depth for check cycles in graph analyze
* num_atoms - number of atoms for writing coordinates
* num_mol - number of molecules for writing coordinates
* num_mol_agl - massive of numbers of molecule in aglomerates
* num_of_inter - number of different interactions
* stat - massive of statistics
* stat_all - massive of summary statistics
* step - $(to - from + 1)
* to - finish point
* true_label_mol - massive of true numbers of molecule for atoms
* type_agl - massive of numbers of aglomerate types
* type_atoms - massive of atom types for atoms
* type_inter - type interaction (number of molecules for interaction)
* quiet - status of quiet-mode
* agl massive of aglomerates
* connect connectivity graph for all molecules
* from first trajectory step
* label_atom massive of atom types for interactions
* label_mol massive of numbers of molecule for atoms
* log status of log-mode
* max_depth maximum depth for check cycles in graph analyze
* num_atoms number of atoms
* num_mol number of molecules
* num_mol_agl massive of number of molecules in aglomerates
* num_of_inter number of different interactions
* stat massive of statistic
* stat_all massive of summary statistic
* step $(to - from + 1)
* to last trajectory step
* true_label_mol massive of true numbers of molecule for atoms
* type_agl massive of number of aglomerate types
* type_atoms massive of atom types
* type_inter number of atoms for interactions
* quiet status of quiet-mode
*/
set_defaults (cell, &from, input, &log, &max_depth, &num_of_inter, output, &to,
&type_inter, &quiet);
// reading number of interactions
// reading number of interactions
for (i=1; i<argc; i++)
if ((argv[i][0] == '-') && (argv[i][1] == 'r'))
num_of_inter++;
@ -71,7 +75,7 @@ int main (int argc, char *argv[])
num_of_inter = 0;
}
// reading arguments
// reading arguments
for (i=1; i<argc; i++)
{
if ((argv[i][0] == '-') && (argv[i][1] == 'h'))
@ -99,13 +103,13 @@ int main (int argc, char *argv[])
return 0;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'i'))
// mask of input files
// mask of input files
{
strcpy (input, argv[i+1]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 's'))
// steps
// steps
{
sscanf (argv[i+1], "%i,%i", &from, &to);
if (from > to)
@ -118,13 +122,13 @@ int main (int argc, char *argv[])
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'c'))
// cell size
// cell size
{
sscanf (argv[i+1], "%f,%f,%f", &cell[0], &cell[1], &cell[2]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'a'))
// atom types
// atom types
{
type_inter = 1;
for (j=0; j<strlen(argv[i+1]); j++)
@ -153,7 +157,7 @@ int main (int argc, char *argv[])
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'r'))
// criteria
// criteria
{
index = 0;
sscanf (&argv[i+1][index], "%i-%i:%f%s", &label[0], &label[1], &label_fl, tmp_str);
@ -172,26 +176,26 @@ int main (int argc, char *argv[])
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'o'))
// output file
// output file
{
strcpy (output, argv[i+1]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'g'))
// graph isomorphism scan
// graph isomorphism scan
{
sscanf (argv[i+1], "%i", &max_depth);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'l'))
// log mode
// log mode
{
log = 1;
strcpy (logfile, argv[i+1]);
i++;
}
else if ((argv[i][0] == '-') && (argv[i][1] == 'q'))
// quiet mode
// quiet mode
{
quiet = 1;
}
@ -203,7 +207,7 @@ int main (int argc, char *argv[])
print_message (quiet, stdout, log, f_log, 0, argv[0]);
print_message (quiet, stdout, log, f_log, 1, argv[0]);
// error checking
// error checking
error = error_checking (cell, from, input, max_depth, num_of_inter, output, to,
type_inter);
if (error != 0)
@ -214,8 +218,8 @@ int main (int argc, char *argv[])
print_message (quiet, stdout, log, f_log, 2, argv[0]);
// processing
// initial variables
// processing
// initial variables
k = strlen (input);
strcpy (filename, input);
filename[k] = '.';
@ -237,13 +241,13 @@ int main (int argc, char *argv[])
true_label_mol = (int *) malloc (num_atoms * sizeof (int));
type_agl = (int *) malloc ((max_depth + 2) * sizeof (int));
type_atoms = (int *) malloc (8 * num_atoms * sizeof (int));
// temporary declaration of variables
// temporary declaration of variables
agl = (int *) malloc (2 * 2 * sizeof (int));
connect = (int *) malloc (2 * 2 * sizeof (int));
num_mol_agl = (int *) malloc (2 * sizeof (int));
stat = (int *) malloc (2 * sizeof (int));
stat_all = (int *) malloc (2 * sizeof (int));
// error checking
// error checking
if ((coords == NULL) ||
(label_mol == NULL) ||
(true_label_mol == NULL) ||
@ -258,7 +262,7 @@ int main (int argc, char *argv[])
print_message (quiet, stderr, log, f_log, 19, argv[0]);
return 17;
}
// set type_agl to zero
// set type_agl to zero
for (i=0; i<max_depth+2; i++)
type_agl[i] = 0;
sprintf (tmp_str, "%6cOutput file: '%s';\n%6cLog: %i;\n%6cQuiet: %i;\n\
@ -280,15 +284,15 @@ int main (int argc, char *argv[])
sprintf (tmp_str, "%s%6cIsomorphism check: %i\n", tmp_str, ' ', max_depth);
print_message (quiet, stdout, log, f_log, 5, tmp_str);
// head
// head
printing_head (output, log, quiet, input, from, to, cell, type_inter, label_atom,
num_of_inter, crit, max_depth);
// main cycle
// main cycle
print_message (quiet, stdout, log, f_log, 6, argv[0]);
for (i=from; i<to+1; i++)
{
// reading coordinates
// reading coordinates
filename[k+1] = conv (i, 3);
filename[k+2] = conv (i, 2);
filename[k+3] = conv (i, 1);
@ -304,7 +308,7 @@ int main (int argc, char *argv[])
print_message (quiet, stdout, log, f_log, 8, tmp_str);
}
// resize dynamic arrays
// resize dynamic arrays
agl = (int *) realloc (agl, num_mol * num_mol * sizeof (int));
connect = (int *) realloc (connect, num_mol * num_mol * sizeof (int));
num_mol_agl = (int *) realloc (num_mol_agl, num_mol * sizeof (int));
@ -315,7 +319,7 @@ int main (int argc, char *argv[])
for (j=0; j<num_mol; j++)
stat_all[j] = 0;
}
// error checking
// error checking
if ((agl == NULL) ||
(connect == NULL) ||
(num_mol_agl == NULL) ||
@ -327,7 +331,7 @@ int main (int argc, char *argv[])
}
print_message (quiet, stdout, log, f_log, 9, argv[0]);
// analyze
// analyze
if (error == 0)
{
error = 1;
@ -352,11 +356,11 @@ int main (int argc, char *argv[])
print_message (quiet, stdout, log, f_log, 13, argv[0]);
print_message (quiet, stdout, log, f_log, 14, output);
// tail
// tail
summary_statistic (output, step, num_mol, max_depth, type_agl, stat_all);
print_message (quiet, stdout, log, f_log, 15, argv[0]);
// free memory
// free memory
free (agl);
free (connect);
free (coords);

View File

@ -1,16 +1,27 @@
/* Library for printing messages at output
*
* Usage:
* message (log, mode, text, output)
/**
* @file
*/
#include <stdio.h>
#include <time.h>
/**
* @fn message
*/
int message (const int log, const int mode, const char *text, FILE *output)
/* mode - number of message
* text - additional text
/**
* @brief function that prints messages to output
* @code
* message (log, mode, text, output);
* @endcode
*
* @param log equal to 1 if print to logfile
* @param mode number of message
* @param text additional text
* @param output output file (may be stdout)
*
* @return 0 - exit without errors
*/
{
char out[4096];
@ -18,6 +29,7 @@ int message (const int log, const int mode, const char *text, FILE *output)
if (log == 1)
{
char time_str[256];
time_t t = time (NULL);
struct tm* aTm = localtime (&t);
sprintf (time_str, "[%04d-%02d-%02d %02d:%02d:%02d] [%2i]: ", aTm->tm_year+1900,

View File

@ -1,6 +1,14 @@
/**
* @file
*/
#ifndef MESSAGES_H
#define MESSAGES_H
/**
* @fn message
*/
int message (const int, const int, const char *, FILE *);
#endif /* MESSAGES_H */

View File

@ -1,57 +1,69 @@
/* Library for printing aglomerates
*
* Usage:
* printing_agl (input_file, output_file, number_of_molecules,
* true_label_molecules, num_of_molecules_in_aglomerates, aglomerates,
* statistic, max_depth, type_of_aglomerate)
/**
* @file
*/
#include <stdio.h>
#include <stdlib.h>
// #include "graph.h"
#include "graph.h"
/**
* @fn printing_agl
*/
int printing_agl (const char *input, const char *output, const int *connect,
const int num_mol, const int *true_label_mol, const int *num_mol_agl,
const int *agl, const int *stat, const int max_depth, int *type_agl)
/* input - name of file with coordinates
* output - name of output file
* connect - connectivity graph for all molecules
* num_mol - number of molecules
* true_label_mol - massive of true numbers of molecule for atoms
* num_mol_agl - massive of numbers of molecule in aglomerates
* agl - massive of aglomerates
* stat - massive of statistics
* max_depth - max depth for check cycles in graph analyze
* type_agl - massive of numbers of aglomerate types
/**
* @brief function that prints aglomerates to output file
* @code
* printing_agl (input_file, output_file, number_of_molecules,
* true_label_molecules, num_of_molecules_in_aglomerates, aglomerates,
* statistic, max_depth, type_of_aglomerate);
* @endcode
*
* @param input input file name
* @param output output file name
* @param connect connectivity graph for all molecules
* @param num_mol number of molecules
* @param true_label_mol massive of true numbers of molecule for atoms
* @param num_mol_agl massive of number of molecules in aglomerates
* @param agl massive of aglomerates
* @param stat massive of statistic
* @param max_depth maximum depth for check cycles in graph analyze
* @param type_agl massive of number of aglomerate types
*
* @return 1 - memory error
* @return 0 - exit without errors
*/
{
int error, i, *iso, j, k, *label_matrix, *matrix;
FILE *f_out;
/* iso - isomorphic graph in database
* label_matrix - massive of indexes of molecule
* matrix - connectivity graph
* f_out - output file
/* iso isomorphic graph in database
* label_matrix massive of indexes of molecule
* matrix connectivity graph
* f_out output file
*/
/// <b>Work blocks</b>
iso = (int *) malloc (max_depth * sizeof (int));
if (iso == NULL)
return 1;
f_out = fopen (output, "a");
// head
/// <pre> print header </pre>
fprintf (f_out, "FILE=%s\nSTATISTIC\n| n | N |\n-----------------\n", input);
for (i=0; i<num_mol; i++)
if (stat[i] != 0)
fprintf (f_out, " %7i %7i \n", i+1, stat[i]);
fprintf (f_out, "-----------------\n");
// body
/// <pre> print body </pre>
for (i=0; i<num_mol; i++)
if (num_mol_agl[i] > 0)
{
// creating connectivity graph
/// <pre> creating connectivity graph </pre>
label_matrix = (int *) malloc (num_mol * sizeof (int));
matrix = (int *) malloc (num_mol_agl[i] * num_mol_agl[i] * sizeof (int));
if ((matrix == NULL) ||
@ -71,34 +83,34 @@ int printing_agl (const char *input, const char *output, const int *connect,
matrix[label_matrix[agl[num_mol*i+k]]*num_mol_agl[i]+label_matrix[agl[num_mol*i+j]]] = 1;
}
// graph topology analyze
/// <pre> graph topology analyze </pre>
if (max_depth > 0)
error = graph_analyze (num_mol_agl[i], matrix, max_depth, iso);
if (error > 0)
return 1;
// printing class of aglomerate
// print class of aglomerate
fprintf (f_out, "AGL=%i=", num_mol_agl[i]);
for (j=0; j<max_depth; j++)
{
// number of tails
// number of tails
if (j == 0)
if (iso[j] > 2)
// branched
// branched
type_agl[3]++;
else
// not branched
// not branched
type_agl[2]++;
// number of cycles
// number of cycles
else if (j == 1)
if (iso[j] > 0)
// cycle
// cycle
type_agl[1]++;
else
// linear
// linear
type_agl[0]++;
else if (j > 1)
// number of n_cycles
// number of n_cycles
type_agl[j+2] += iso[j];
fprintf (f_out, "%i.", iso[j]);
@ -108,20 +120,21 @@ int printing_agl (const char *input, const char *output, const int *connect,
{
fprintf (f_out, "%7i=", true_label_mol[agl[num_mol*i+j]]);
for (k=0; k<num_mol_agl[i]; k++)
{
if (matrix[j*num_mol_agl[i]+k] == 1)
fprintf (f_out, "%i,", true_label_mol[agl[num_mol*i+k]]);
}
fprintf (f_out, "\n");
}
// free memory
/// <pre> free memory </pre>
free (matrix);
free (label_matrix);
}
fprintf (f_out, "---------------------------------------------------\n");
fclose (f_out);
/// <pre> free memory </pre>
free (iso);
return 0;
}

View File

@ -1,6 +1,14 @@
/**
* @file
*/
#ifndef STAT_PRINT_H
#define STAT_PRINT_H
/**
* @fn printing_agl
*/
int printing_agl (const char *, const char *, const int *, const int, const int *,
const int *, const int *, const int *, const int,int *);

View File

@ -1,35 +1,47 @@
/* Library for creating connectivity matrix
*
* Usage:
* create_matrix (number_of_molecules, number_of_atoms, label_molecule,
* type_atoms, coords, number_of_interactions, criteria, connect_matrix)
/**
* @file
*/
#include <math.h>
#include <stdlib.h>
/**
* @fn create_matrix
*/
int create_matrix (const int num_mol, const int num_atoms, const int *label_mol,
const int *type_atoms, const float *coords, const int num_of_inter,
const float *crit, int *connect)
/* num_mol - number of molecules
* num_atoms - number of atoms
* label_mol - massive of numbers of molecule for atoms
* type_atoms - massive of atom types for atoms
* coords - massive of coordinates
* num_of_inter - number of different interactions
* crit - massive of criteria
* connect - connectivity graph for all molecules
/**
* @brief function that creates connectivity matrix
* @code
* create_matrix (number_of_molecules, number_of_atoms, label_molecule,
* type_atoms, coords, number_of_interactions, criteria, connect_matrix);
* @endcode
*
* @param num_mol number of molecules
* @param num_atoms number of atoms
* @param label_mol massive of numbers of molecule for atoms
* @param type_atoms massive of atom types
* @param coords massive of coordinates
* @param num_of_inter number of different interactions
* @param crit massive of criteria
* @param connect connectivity graph for all molecules
*
* @return 1 - memory error
* @return 0 - exit without errors
*/
{
float r;
int cur_num_inter, i, j, k, l, num_inter, ***label_inter;
/* r - radius
* cur_num_inter - current number of true interactions
* num_inter - needed number of true interactions
* label_inter - temporary massive of true interactions
/* r radius
* cur_num_inter current number of true interactions
* num_inter needed number of true interactions
* label_inter temporary massive of true interactions
*/
/// <b>Work blocks</b>
label_inter = (int ***) malloc (num_mol * sizeof (int **));
for (i=0; i<num_mol; i++)
{
@ -44,10 +56,10 @@ int create_matrix (const int num_mol, const int num_atoms, const int *label_mol,
if (label_inter == NULL)
return 1;
// creating initial connectivity matrix
/// <pre> creating initial connectivity matrix </pre>
for (i=0; i<num_atoms*8; i++)
for (j=i+1; j<num_atoms*8; j++)
// if atoms from different molecules
// if atoms from different molecules
if (label_mol[i] != label_mol[j])
{
r = sqrt (pow ((coords[3*i+0]-coords[3*j+0]), 2) +
@ -68,10 +80,10 @@ int create_matrix (const int num_mol, const int num_atoms, const int *label_mol,
for (j=0; j<num_mol; j++)
connect[i*num_mol+j] = 0;
// processing of initial connectivity matrix
/// <pre> processing of initial connectivity matrix </pre>
for (k=0; k<num_of_inter; k++)
{
// determination of the number of interactions
// determination of the number of interactions
num_inter = 0;
for (l=0; l<16; l++)
if (crit[16*k+l] != 0.0)
@ -92,7 +104,7 @@ int create_matrix (const int num_mol, const int num_atoms, const int *label_mol,
}
}
// free memory
/// <pre> free memory</pre>
for (i=0; i<num_mol; i++)
{
for (j=0; j<num_mol; j++)

View File

@ -1,6 +1,14 @@
/**
* @file
*/
#ifndef STAT_SELECT_H
#define STAT_SELECT_H
/**
* @fn create_matrix
*/
int create_matrix (const int, const int, const int *, const int *, const float *,
const int, const float *, int *);

View File

@ -1,29 +1,41 @@
/* Library for processing connectivity matrix
*
* Usage:
* proc_matrix (number_of_molecules, connect_matrix,
* num_of_molecules_in_aglomerates, aglomerates, statistic, summary_statistic)
/**
* @file
*/
#include <stdlib.h>
/**
* @fn proc_matrix
*/
int proc_matrix (const int num_mol, const int *connect, int *num_mol_agl, int *agl,
int *stat, int *stat_all)
/* num_mol - number of molecules
* connect - connectivity graph for all molecules
* num_mol_agl - massive of numbers of molecule in aglomerates
* agl - massive of aglomerates
* stat - massive of statistics
* stat_all - massive of summary statistics
/**
* @brief function that processes connectivity matrix
* @code
* proc_matrix (number_of_molecules, connect_matrix,
* num_of_molecules_in_aglomerates, aglomerates, statistic, summary_statistic);
* @endcode
*
* @param num_mol number of molecules
* @param connect connectivity graph for all molecules
* @param num_mol_agl massive of number of molecules in aglomerates
* @param agl massive of aglomerates
* @param stat massive of statistic
* @param stat_all massive of summary statistic
*
* @return 1 - memory error
* @return 0 - exit without errors
*/
{
int i, j, k, p, *bin;
/* p - weight / graph index
* bin - binary massive of labels
/* p weight / graph index
* bin binary massive of labels
*/
// definition and zeroing
/// <b>Work blocks</b>
// definition and zeroing
bin = (int *) malloc (num_mol * sizeof (int));
if (bin == NULL)
return 1;
@ -36,7 +48,7 @@ int proc_matrix (const int num_mol, const int *connect, int *num_mol_agl, int *a
agl[num_mol*i+j] = 0;
}
// select non-bonded molecules
/// <pre> select non-bonded molecules </pre>
for (i=0; i<num_mol; i++)
{
p = 0;
@ -50,7 +62,7 @@ int proc_matrix (const int num_mol, const int *connect, int *num_mol_agl, int *a
}
}
// unwraping of connectivity matrix
/// <pre> unwraping of connectivity matrix </pre>
p = 0;
for (i=0; i<num_mol; i++)
if (bin[i] == 1)
@ -71,7 +83,7 @@ int proc_matrix (const int num_mol, const int *connect, int *num_mol_agl, int *a
p++;
}
// filling statistic array
/// <pre> filling statistic array </pre>
i = 0;
while (num_mol_agl[i] > 0)
{
@ -80,6 +92,7 @@ int proc_matrix (const int num_mol, const int *connect, int *num_mol_agl, int *a
i++;
}
/// <pre> free memory </pre>
free (bin);
return 0;

View File

@ -1,6 +1,14 @@
/**
* @file
*/
#ifndef STAT_SORT_H
#define STAT_SORT_H
/**
* @fn proc_matrix
*/
int proc_matrix (const int, const int *, int *, int *, int *, int *);
#endif /* STAT_SORT_H */

View File

@ -1,29 +1,39 @@
/* Library for summary statistic
* Usage:
* summary_statistic (filename, number_of_step, number_of_molecules,
* max_depth, type_of_aglomerate, summary_statistic)
/**
* @file
*/
#include <stdio.h>
/**
* @fn summary_statistic
*/
int summary_statistic (const char *filename, const int step, const int num_mol,
const int max_depth, const int *type_agl, const int *stat_all)
/* filename - name of output file
* step - number of steps
* num_mol - number of molecules
* max_depth - max depth for check cycles in graph analyze
* type_agl - massive of numbers of aglomerate types
* stat_all - massive of summary statistics
/**
* @brief function that prints summary statistic
* @code
* summary_statistic (filename, number_of_step, number_of_molecules, max_depth,
* type_of_aglomerate, summary_statistic);
* @endcode
*
* @param filename output file name
* @param step number of steps
* @param num_mol number of molecules
* @param max_depth maximum depth for check cycles in graph analyze
* @param type_agl massive of number of aglomerate types
* @param stat_all massive of summary statistic
*
* @return 0 - exit without errors
*/
{
float conc, p, pn, type[2], x, y;
int i, index;
FILE *f_out;
/* conc - concentrate of aglomerates
* p - probability of aglomerates
* pn - weight probability of aglomerates
* f_out - output file
/* conc concentrate of aglomerates
* p probability of aglomerates
* pn weight probability of aglomerates
* f_out output file
*/
index = 0;
@ -31,19 +41,19 @@ int summary_statistic (const char *filename, const int step, const int num_mol,
if (stat_all[i] != 0)
index = i;
// head
// head
f_out = fopen (filename, "a");
fprintf (f_out, "SUMMARY STATISTIC\n");
fprintf (f_out, "| n | N | C | p | pn |\n------------------------------------------------\n");
for (i=0; i<index+1; i++)
{
// calculating concentrates
// calculating concentrates
x = stat_all[i];
y = step;
conc = x / y;
// calculating probabilityes
// calculating probabilityes
x = (i + 1) * stat_all[i];
y = step * num_mol;
p = x / y;
@ -54,18 +64,18 @@ int summary_statistic (const char *filename, const int step, const int num_mol,
if (max_depth > 0)
{
// types of aglomerates
// types of aglomerates
fprintf (f_out, "------------------------------------------------\n");
// linear and cycle
// linear and cycle
x = type_agl[0] + type_agl[1];
type[0] = type_agl[0];
type[1] = type_agl[1];
fprintf (f_out, "LINEAR=%7.5f\nCYCLE=%7.5f\n--------------------\n", type[0]/x, type[1]/x);
// branched
// branched
type[0] = type_agl[2];
type[1] = type_agl[3];
fprintf (f_out, "NOT BRANCHED=%7.5f\nBRANCHED=%7.5f\n--------------------\n", type[0]/x, type[1]/x);
// n_cycle
// n_cycle
x = 0;
for (i=4; i<max_depth+2; i++)
x += type_agl[i];

View File

@ -1,6 +1,14 @@
/**
* @file
*/
#ifndef SUMMARY_STAT_H
#define SUMMARY_STAT_H
/**
* @fn summary_statistic
*/
int summary_statistic (const char *, const int, const int, const int, const int *,
const int *);

View File

@ -1,22 +1,32 @@
# set directories
set (${PROJECT}_BINARY_DIR bin)
set (${PROJECT}_SOURCE_DIR src:include)
set (${PROJECT}_SOURCE_DIR src)
set (${PROJECT}_INCLUDE_DIR include)
set (${PROJECT}_LIB_DIR lib)
set (CMAKE_INCLUDE_PATH ${${PROJECT}_SOURCE_DIR})
set (CMAKE_LIBRARY_PATH ${${PROJECT}_LIB_DIR})
# include_path
include_directories (${${PROJECT}_INCLUDE_DIR}/${PROJECT}
${${PROJECT}_SOURCE_DIR})
# library path
link_directories (${${PROJECT}_LIB_DIR})
# executable path
set (EXECUTABLE_OUTPUT_PATH ${${PROJECT}_BINARY_DIR})
# verbose
set (CMAKE_VERBOSE_MAKEFILE ON)
# flags
if ( WITH_DEBUG_MODE )
ADD_DEFINITIONS ( -DDEBUG_MODE=1 )
add_definitions ( -DDEBUG_MODE=1 )
endif ()
if ( CMAKE_COMPILER_IS_GNUCXX )
set (ADD_CXX_FLAGS "-Wall")
set (CMAKE_CXX_FLAGS "-O0 ${ADD_CXX_FLAGS}")
set (CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set (CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
elseif ( MSVC )
set (ADD_CXX_FLAGS "/W4")
set (CMAKE_CXX_FLAGS "${ADD_CXX_FLAGS}")
else ()
message (STATUS "Flags not enabled")
message ("Unknown compiler")
endif ()

1890
statgen/statgen.doxygen Normal file

File diff suppressed because it is too large Load Diff

BIN
statgen/statgen.pdf Normal file

Binary file not shown.