diff options
-rw-r--r-- | CMakeLists.txt | 146 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | config.h.cmake.in | 22 | ||||
-rw-r--r-- | libcrystfel/CMakeLists.txt | 44 | ||||
-rw-r--r-- | libcrystfel/config.h.cmake.in | 19 | ||||
-rw-r--r-- | libcrystfel/crystfel.pc.in | 6 | ||||
-rw-r--r-- | libcrystfel/src/index.c | 2 | ||||
-rw-r--r-- | libcrystfel/src/symmetry.c | 11 | ||||
-rw-r--r-- | src/scaling.c | 1 |
9 files changed, 132 insertions, 120 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b8b9e5a..8bb37e05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.6) -project(crystfel VERSION 0.6.3 LANGUAGES C) +set(CRYSTFEL_VERSION 0.7.0) +set(CRYSTFEL_API_VERSION 10) +project(crystfel VERSION ${CRYSTFEL_VERSION} LANGUAGES C) include(GNUInstallDirs) @@ -12,16 +14,9 @@ find_package(GSL REQUIRED) find_package(GTK2 2.0.0 COMPONENTS gtk) find_package(GdkPixbuf2) find_package(GDK) -find_package(FFTW) -find_package(CBF) find_package(TIFF) find_package(Cairo) -find_package(XGANDALF) -find_package(PINKINDEXER) -find_package(NBP) -find_package(FDIP) find_package(OpenCL) -find_package(Curses) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color=always") @@ -29,16 +24,10 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_definitions(-DHAVE_CONFIG_H -DDATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}\") set(CMAKE_C_STANDARD 99) -# Make programs work without LD_LIBRARY_PATH when installed to a non system directory -list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) -if("${isSystemDir}" STREQUAL "-1") - set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") -endif("${isSystemDir}" STREQUAL "-1") - # Common include directories and libraries set(COMMON_INCLUDES ${HDF5_INCLUDE_DIRS}) -set(COMMON_LIBRARIES libcrystfel ${HDF5_C_LIBRARIES} Threads::Threads GSL::gsl) +set(COMMON_LIBRARIES libcrystfel m GSL::gsl Threads::Threads) include(GetGitRevisionDescription) get_git_head_revision(GIT_REFSPEC GIT_SHA1) @@ -50,14 +39,9 @@ include(CheckLibraryExists) set(HAVE_CAIRO ${CAIRO_FOUND}) set(HAVE_TIFF ${TIFF_FOUND}) set(HAVE_GTK ${GTK2_FOUND}) -set(HAVE_FFTW ${FFTW_FOUND}) -set(HAVE_XGANDALF ${XGANDALF_FOUND}) -set(HAVE_FDIP ${FDIP_FOUND}) set(HAVE_OPENCL ${OpenCL_FOUND}) -set(HAVE_CBFLIB ${CBF_FOUND}) set(HAVE_GDKPIXBUF ${GDKPIXBUF_FOUND}) set(HAVE_GDK ${GDK_FOUND}) -set(HAVE_CURSES ${CURSES_FOUND}) set(PACKAGE_VERSION ${PROJECT_VERSION}) @@ -72,55 +56,48 @@ endif (OpenCL_FOUND) # Check for nice clock function check_symbol_exists(clock_gettime "time.h" HAVE_CLOCK_GETTIME) -# Check for CPU affinity functions (Linux-specific) -set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE") -check_symbol_exists(sched_setaffinity "sched.h" HAVE_CPU_AFFINITY) -unset(CMAKE_REQUIRED_DEFINITIONS) +# Add the libcrystfel target +add_subdirectory(libcrystfel) configure_file(config.h.cmake.in config.h) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -# Add the libcrystfel target -add_subdirectory(libcrystfel) - # Add tests enable_testing() add_subdirectory(tests) -# crystfel.pc -configure_file(libcrystfel/crystfel.pc.in crystfel.pc) -install(FILES ${CMAKE_BINARY_DIR}/crystfel.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) - # Install scripts install(DIRECTORY ${CMAKE_SOURCE_DIR}/scripts DESTINATION ${CMAKE_INSTALL_DOCDIR}) # API docs -find_package(GtkDoc 1.25) -if (GTKDOC_FOUND) - configure_file(doc/reference/libcrystfel/xml/gtkdocentities.ent.cmake.in - docs/xml/gtkdocentities.ent) - configure_file(doc/reference/libcrystfel/CrystFEL-docs.sgml - docs/CrystFEL-docs.sgml COPYONLY) - add_custom_target(documentation ALL VERBATIM COMMAND - ${CMAKE_SOURCE_DIR}/doc/reference/libcrystfel/build-docs) - install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs/html - DESTINATION ${CMAKE_INSTALL_DOCDIR}) -endif (GTKDOC_FOUND) +option(BUILD_API_DOCS "Build API documentation" OFF) +if (BUILD_API_DOCS) + find_package(GtkDoc 1.25) + if (GTKDOC_FOUND) + configure_file(doc/reference/libcrystfel/xml/gtkdocentities.ent.cmake.in + docs/xml/gtkdocentities.ent) + configure_file(doc/reference/libcrystfel/CrystFEL-docs.sgml + docs/CrystFEL-docs.sgml COPYONLY) + add_custom_target(documentation ALL VERBATIM COMMAND + ${CMAKE_SOURCE_DIR}/doc/reference/libcrystfel/build-docs) + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs/html + DESTINATION ${CMAKE_INSTALL_DOCDIR}) + else (GTKDOC_FOUND) + message(SEND_ERROR "gtk-doc not found") + endif (GTKDOC_FOUND) +endif (BUILD_API_DOCS) # ---------------------------------------------------------------------- -# Build Target # partial_sim set(PARTIAL_SIM_SOURCES src/partial_sim.c) - add_executable(partial_sim ${PARTIAL_SIM_SOURCES}) target_include_directories(partial_sim PRIVATE ${COMMON_INCLUDES}) target_link_libraries(partial_sim ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES partial_sim) # ---------------------------------------------------------------------- -# Build Target # pattern_sim set(PATTERN_SIM_SOURCES src/pattern_sim.c src/diffraction.c) @@ -132,7 +109,7 @@ endif(HAVE_OPENCL) add_executable(pattern_sim ${PATTERN_SIM_SOURCES} ${PATTERN_SIM_OPENCL_SOURCES}) target_include_directories(pattern_sim PRIVATE ${COMMON_INCLUDES}) -target_link_libraries(pattern_sim ${COMMON_LIBRARIES}) +target_link_libraries(pattern_sim ${COMMON_LIBRARIES} ${HDF5_C_LIBRARIES}) if(HAVE_OPENCL) target_include_directories(pattern_sim PRIVATE ${OpenCL_INCLUDE_DIRS}) @@ -142,8 +119,9 @@ endif(HAVE_OPENCL) set_target_properties(pattern_sim PROPERTIES RESOURCE "${PATTERN_SIM_RESOURCE_FILES}") +list(APPEND CRYSTFEL_EXECUTABLES pattern_sim) + # ---------------------------------------------------------------------- -# Build Target # hdfsee if (GTK2_FOUND) @@ -162,15 +140,11 @@ if (GTK2_FOUND) set_target_properties(hdfsee PROPERTIES RESOURCE "${HDFSEE_RESOURCE_FILES}") - install (TARGETS hdfsee - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - RESOURCE DESTINATION share/crystfel) + list(APPEND CRYSTFEL_EXECUTABLES hdfsee) endif (GTK2_FOUND) # ---------------------------------------------------------------------- -# Build Target # cell_explorer if (GTK2_FOUND) @@ -181,14 +155,11 @@ if (GTK2_FOUND) target_include_directories(cell_explorer PRIVATE ${COMMON_INCLUDES} ${GTK2_INCLUDE_DIRS}) target_link_libraries(cell_explorer ${COMMON_LIBRARIES} ${GTK2_LIBRARIES}) - install (TARGETS cell_explorer - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib) + list(APPEND CRYSTFEL_EXECUTABLES cell_explorer) endif (GTK2_FOUND) # ---------------------------------------------------------------------- -# Build Target # render_hkl if (CAIRO_FOUND) @@ -199,32 +170,29 @@ if (CAIRO_FOUND) target_include_directories(render_hkl PRIVATE ${COMMON_INCLUDES} ${CAIRO_INCLUDE_DIRS}) target_link_libraries(render_hkl ${COMMON_LIBRARIES} ${CAIRO_LIBRARIES}) - install (TARGETS render_hkl - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib) + list(APPEND CRYSTFEL_EXECUTABLES render_hkl) endif (CAIRO_FOUND) # ---------------------------------------------------------------------- -# Build Target # process_hkl set(PROCESS_HKL_SOURCES src/process_hkl.c) add_executable(process_hkl ${PROCESS_HKL_SOURCES}) target_include_directories(process_hkl PRIVATE ${COMMON_INCLUDES}) target_link_libraries(process_hkl ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES process_hkl) # ---------------------------------------------------------------------- -# Build Target # list_events set(LIST_EVENTS_SOURCES src/list_events.c) add_executable(list_events ${LIST_EVENTS_SOURCES}) target_include_directories(list_events PRIVATE ${COMMON_INCLUDES}) target_link_libraries(list_events ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES list_events) # ---------------------------------------------------------------------- -# Build Target # indexamajig set(INDEXAMAJIG_SOURCES src/indexamajig.c src/im-sandbox.c src/process_image.c @@ -233,36 +201,36 @@ set(INDEXAMAJIG_SOURCES src/indexamajig.c src/im-sandbox.c src/process_image.c add_executable(indexamajig ${INDEXAMAJIG_SOURCES}) target_include_directories(indexamajig PRIVATE ${COMMON_INCLUDES}) target_link_libraries(indexamajig ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES indexamajig) # ---------------------------------------------------------------------- -# Build Target # get_hkl set(GET_HKL_SOURCES src/get_hkl.c) add_executable(get_hkl ${GET_HKL_SOURCES}) target_include_directories(get_hkl PRIVATE ${COMMON_INCLUDES}) target_link_libraries(get_hkl ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES get_hkl) # ---------------------------------------------------------------------- -# Build Target # compare_hkl set(COMPARE_HKL_SOURCES src/compare_hkl.c) add_executable(compare_hkl ${COMPARE_HKL_SOURCES}) target_include_directories(compare_hkl PRIVATE ${COMMON_INCLUDES}) target_link_libraries(compare_hkl ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES compare_hkl) # ---------------------------------------------------------------------- -# Build Target # check_hkl set(CHECK_HKL_SOURCES src/check_hkl.c) add_executable(check_hkl ${CHECK_HKL_SOURCES}) target_include_directories(check_hkl PRIVATE ${COMMON_INCLUDES}) target_link_libraries(check_hkl ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES check_hkl) # ---------------------------------------------------------------------- -# Build Target # partialator set(PARTIALATOR_SOURCES src/partialator.c src/post-refinement.c src/merge.c @@ -270,24 +238,25 @@ set(PARTIALATOR_SOURCES src/partialator.c src/post-refinement.c src/merge.c add_executable(partialator ${PARTIALATOR_SOURCES}) target_include_directories(partialator PRIVATE ${COMMON_INCLUDES}) target_link_libraries(partialator ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES partialator) # ---------------------------------------------------------------------- -# Build Target # ambigator set(AMBIGATOR_SOURCES src/ambigator.c) add_executable(ambigator ${AMBIGATOR_SOURCES}) target_include_directories(ambigator PRIVATE ${COMMON_INCLUDES}) -target_link_libraries(ambigator ${COMMON_LIBRARIES}) +target_link_libraries(ambigator ${COMMON_LIBRARIES} ${HDF5_C_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES ambigator) # ---------------------------------------------------------------------- -# Build Target # geoptimiser set(GEOPTIMISER_SOURCES src/geoptimiser.c src/hdfsee-render.c) add_executable(geoptimiser ${GEOPTIMISER_SOURCES}) target_include_directories(geoptimiser PRIVATE ${COMMON_INCLUDES}) target_link_libraries(geoptimiser ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES geoptimiser) # Add features one by one so that #ifdef HAVE_XX//#include XX.h always works # If Cairo, gdk-pixbuf and GDK are all found, geoptimiser will add PNG support @@ -312,37 +281,30 @@ if (TIFF_FOUND) endif (TIFF_FOUND) # ---------------------------------------------------------------------- -# Build Target # whirligig set(WHIRLIGIG_SOURCES src/whirligig.c) add_executable(whirligig ${WHIRLIGIG_SOURCES}) target_include_directories(whirligig PRIVATE ${COMMON_INCLUDES}) target_link_libraries(whirligig ${COMMON_LIBRARIES}) +list(APPEND CRYSTFEL_EXECUTABLES whirligig) # ---------------------------------------------------------------------- -# install targets - -install(TARGETS - partial_sim - pattern_sim - process_hkl - list_events - indexamajig - get_hkl - compare_hkl - check_hkl - partialator - ambigator - whirligig - geoptimiser - # hdfsee, cell_explorer, render_hkl only if dependencies are satisfied - - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - RESOURCE DESTINATION share/crystfel -) +# Install targets + +set_target_properties(${CRYSTFEL_EXECUTABLES} + PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1) + +list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_LIBDIR}" isSystemDir) +if("${isSystemDir}" STREQUAL "-1") + set_target_properties(${CRYSTFEL_EXECUTABLES} + PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR};${CMAKE_INSTALL_RPATH}") +endif("${isSystemDir}" STREQUAL "-1") + +install(TARGETS ${CRYSTFEL_EXECUTABLES} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + RESOURCE DESTINATION share/crystfel) install(FILES doc/man/ambigator.1 @@ -1 +0,0 @@ -There is no NEWS. Check the version control repository... diff --git a/config.h.cmake.in b/config.h.cmake.in index 2db30860..24b2ab86 100644 --- a/config.h.cmake.in +++ b/config.h.cmake.in @@ -1,24 +1,12 @@ -#cmakedefine HAVE_CAIRO -#cmakedefine HAVE_CLOCK_GETTIME -#cmakedefine HAVE_CPU_AFFINITY -#cmakedefine HAVE_FFTW +/* config.h for CrystFEL main programs */ + #cmakedefine HAVE_GTK #cmakedefine HAVE_GDKPIXBUF #cmakedefine HAVE_GDK -#cmakedefine HAVE_OPENCL -#cmakedefine HAVE_CL_CL_H #cmakedefine HAVE_TIFF -#cmakedefine HAVE_XGANDALF -#cmakedefine HAVE_FDIP -#cmakedefine HAVE_CURSES - -/* We avoid adding the full path to cbf.h, because CBFlib unhelpfully installs - * some conflicting HDF5 headers which we want to keep out of the include path. - * Unfortunately, sometimes CBFlib installs cbf/cbf.h, other times cbflib/cbf.h. - * These defines tell whether we have CBFlib at all, and if so, what to #include */ -#cmakedefine HAVE_CBFLIB -#cmakedefine HAVE_CBF_CBF_H -#cmakedefine HAVE_CBFLIB_CBF_H +#cmakedefine HAVE_CAIRO +#cmakedefine HAVE_OPENCL +#cmakedefine HAVE_CLOCK_GETTIME #define PACKAGE_VERSION "${PROJECT_VERSION}" diff --git a/libcrystfel/CMakeLists.txt b/libcrystfel/CMakeLists.txt index 5d0ee069..1fba6624 100644 --- a/libcrystfel/CMakeLists.txt +++ b/libcrystfel/CMakeLists.txt @@ -1,4 +1,28 @@ -project(libcrystfel) +project(libcrystfel VERSION ${CRYSTFEL_VERSION} LANGUAGES C) + +find_package(Curses) +find_package(FFTW) +find_package(CBF) +find_package(XGANDALF) +find_package(PINKINDEXER) +find_package(NBP) +find_package(FDIP) + +set(HAVE_CURSES ${CURSES_FOUND}) +set(HAVE_FFTW ${FFTW_FOUND}) +set(HAVE_XGANDALF ${XGANDALF_FOUND}) +set(HAVE_FDIP ${FDIP_FOUND}) +set(HAVE_CBFLIB ${CBF_FOUND}) + +# Check for CPU affinity functions (Linux-specific) +set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE") +check_symbol_exists(sched_setaffinity "sched.h" HAVE_CPU_AFFINITY) +unset(CMAKE_REQUIRED_DEFINITIONS) + +# Check for nice clock function +check_symbol_exists(clock_gettime "time.h" HAVE_CLOCK_GETTIME) + +configure_file(config.h.cmake.in config.h) set(LIBCRYSTFEL_SOURCES src/reflist.c @@ -76,10 +100,18 @@ add_library(${PROJECT_NAME} SHARED ${LIBCRYSTFEL_FFTW_SOURCES} ${LIBCRYSTFEL_HEADERS}) +set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1) + +set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${CRYSTFEL_API_VERSION}) +set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${CRYSTFEL_VERSION}) + set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") target_include_directories(${PROJECT_NAME} INTERFACE ${PROJECT_SOURCE_DIR}/src) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) +add_definitions(-DHAVE_CONFIG_H) + target_include_directories(${PROJECT_NAME} PRIVATE ${HDF5_INCLUDE_DIRS}) -target_link_libraries(${PROJECT_NAME} PRIVATE util ${HDF5_C_LIBRARIES}) +target_link_libraries(${PROJECT_NAME} PRIVATE util ${HDF5_C_LIBRARIES} Threads::Threads GSL::gsl m) if (XGANDALF_FOUND) target_include_directories(${PROJECT_NAME} PRIVATE ${XGANDALF_INCLUDES}) @@ -119,5 +151,9 @@ endif (CURSES_FOUND) target_compile_options(${PROJECT_NAME} PRIVATE -Wall) install (TARGETS libcrystfel - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib) + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +# crystfel.pc +configure_file(crystfel.pc.in crystfel.pc) +install(FILES ${CMAKE_BINARY_DIR}/libcrystfel/crystfel.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/libcrystfel/config.h.cmake.in b/libcrystfel/config.h.cmake.in new file mode 100644 index 00000000..36bbba60 --- /dev/null +++ b/libcrystfel/config.h.cmake.in @@ -0,0 +1,19 @@ +/* config.h for libcrystfel */ + +#cmakedefine HAVE_CLOCK_GETTIME +#cmakedefine HAVE_CPU_AFFINITY +#cmakedefine HAVE_FFTW +#cmakedefine HAVE_CL_CL_H +#cmakedefine HAVE_XGANDALF +#cmakedefine HAVE_FDIP +#cmakedefine HAVE_CURSES + +/* We avoid adding the full path to cbf.h, because CBFlib unhelpfully installs + * some conflicting HDF5 headers which we want to keep out of the include path. + * Unfortunately, sometimes CBFlib installs cbf/cbf.h, other times cbflib/cbf.h. + * These defines tell whether we have CBFlib at all, and if so, what to #include */ +#cmakedefine HAVE_CBFLIB +#cmakedefine HAVE_CBF_CBF_H +#cmakedefine HAVE_CBFLIB_CBF_H + +#define CRYSTFEL_VERSIONSTRING "${PROJECT_VERSION}+${GIT_SHA1}" diff --git a/libcrystfel/crystfel.pc.in b/libcrystfel/crystfel.pc.in index 7539cad1..3a355f06 100644 --- a/libcrystfel/crystfel.pc.in +++ b/libcrystfel/crystfel.pc.in @@ -5,7 +5,7 @@ includedir=${CMAKE_INSTALL_FULL_INCLUDEDIR} Name: CrystFEL Description: Useful routines for crystallography using a free-electron laser -Version: ${PROJECT_VERSION}+${GIT_SHA1} -Cflags: -I${CMAKE_INSTALL_FULL_INCLUDEDIR} -pthread +Version: ${PROJECT_VERSION} +Cflags: -I${CMAKE_INSTALL_FULL_INCLUDEDIR} Libs: -L${CMAKE_INSTALL_FULL_LIBDIR} -lcrystfel -Requires: gsl +Requires.private: gsl diff --git a/libcrystfel/src/index.c b/libcrystfel/src/index.c index b20c689a..ff84c629 100644 --- a/libcrystfel/src/index.c +++ b/libcrystfel/src/index.c @@ -474,8 +474,6 @@ void cleanup_indexing(IndexingPrivate *ipriv) } - n++; - } free(ipriv->methods); diff --git a/libcrystfel/src/symmetry.c b/libcrystfel/src/symmetry.c index 897d134f..5f3b67f2 100644 --- a/libcrystfel/src/symmetry.c +++ b/libcrystfel/src/symmetry.c @@ -981,6 +981,7 @@ static SymOpList *getpg_arbitrary_ua(const char *sym, size_t s) char *pg_type; SymOpList *pg; IntegerMatrix *t; + char *new_name; if ( strncmp(sym+s, "ua", 2) == 0 ) { ua = sym[s+2]; @@ -1037,6 +1038,16 @@ static SymOpList *getpg_arbitrary_ua(const char *sym, size_t s) transform_ops(pg, t); intmat_free(t); + new_name = malloc(64); + if ( new_name == NULL ) { + ERROR("Couldn't allocate space for PG name\n"); + return NULL; + } + + snprintf(new_name, 64, "%s_ua%c", pg->name, ua); + free(pg->name); + pg->name = new_name; + return pg; } diff --git a/src/scaling.c b/src/scaling.c index cabc5952..21bd0db2 100644 --- a/src/scaling.c +++ b/src/scaling.c @@ -37,7 +37,6 @@ #include <gsl/gsl_vector.h> #include <gsl/gsl_linalg.h> #include <gsl/gsl_eigen.h> -#include <gsl/gsl_blas.h> #include <gsl/gsl_fit.h> #include <gsl/gsl_statistics_double.h> |