# Copyright (C) 2014 Ion Torrent Systems, Inc. All Rights Reserved
cmake_minimum_required (VERSION 2.6)
project (ion-tvc)


set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-msse3")
add_definitions(-DALIGNSTATS_IGNORE)

configure_file (
        "${PROJECT_SOURCE_DIR}/IonVersion.cpp.in"
        "${PROJECT_BINARY_DIR}/IonVersion.cpp" @ONLY
)


set(ION_VCFLIB_DIR    external/vcflib)
set(ION_FREEBAYES_DIR external/freebayes)
set(ION_JSONCPP_DIR   external/jsoncpp-src-amalgated0.6.0-rc1)
set(ION_BAMTOOLS_DIR  ${PROJECT_BINARY_DIR}/../bamtools-2.3.0.20131211+git67178ae187)
set(ION_BAMTOOLS_LIBS ${PROJECT_BINARY_DIR}/../bamtools-2.3.0.20131211+git67178ae187-build/lib/libbamtools.a)
set(ION_ARMADILLO_DIR ${PROJECT_BINARY_DIR}/../armadillo-4.300.8)

include_directories(${ION_VCFLIB_DIR})
include_directories(${ION_FREEBAYES_DIR}/src)
include_directories(${ION_JSONCPP_DIR})
include_directories("${ION_ARMADILLO_DIR}/include")
include_directories("${ION_BAMTOOLS_DIR}/src")

include_directories("${PROJECT_SOURCE_DIR}/VariantCaller")
include_directories("${PROJECT_SOURCE_DIR}/VariantCaller/FlowDistEval")
include_directories("${PROJECT_SOURCE_DIR}/VariantCaller/EnsembleEval")
include_directories("${PROJECT_SOURCE_DIR}/VariantCaller/Bookkeeping")
include_directories("${PROJECT_SOURCE_DIR}/VariantCaller/Reads")
include_directories("${PROJECT_SOURCE_DIR}/VariantCaller/Splice")
include_directories("${PROJECT_SOURCE_DIR}/VariantCaller/Filter")
include_directories("${PROJECT_SOURCE_DIR}/realignment")
include_directories("${PROJECT_SOURCE_DIR}/file-io")
include_directories("${PROJECT_SOURCE_DIR}/BaseCaller")
include_directories("${PROJECT_SOURCE_DIR}/Util")
include_directories("${PROJECT_SOURCE_DIR}")

add_executable(tvc
  VariantCaller/VariantCaller.cpp
  VariantCaller/BAMWalkerEngine.cpp
  VariantCaller/SampleManager.cpp
  VariantCaller/TargetsManager.cpp
  VariantCaller/HandleVariant.cpp
  VariantCaller/HotspotReader.cpp
  VariantCaller/MetricsManager.cpp

  VariantCaller/Bookkeeping/MiscUtil.cpp
  VariantCaller/Bookkeeping/ExtendParameters.cpp 
  VariantCaller/Bookkeeping/InputStructures.cpp
  VariantCaller/Bookkeeping/VcfFormat.cpp

  VariantCaller/Reads/ExtendedReadInfo.cpp

  VariantCaller/Splice/ErrorMotifs.cpp
  VariantCaller/Splice/LocalContext.cpp
  VariantCaller/Splice/ClassifyVariant.cpp
  VariantCaller/Splice/ErrorMotifs.cpp
  VariantCaller/Splice/SpliceVariantHypotheses.cpp

  VariantCaller/Filter/DecisionTreeData.cpp
  VariantCaller/Filter/VariantAssist.cpp

  VariantCaller/HypothesisEvaluator.cpp

  VariantCaller/EnsembleEval/DiagnosticJSON.cpp
  VariantCaller/EnsembleEval/BiasGenerator.cpp
  VariantCaller/EnsembleEval/SigmaGenerator.cpp
  VariantCaller/EnsembleEval/SkewGenerator.cpp
  VariantCaller/EnsembleEval/PosteriorInference.cpp
  VariantCaller/EnsembleEval/ShortStack.cpp
  VariantCaller/EnsembleEval/StackEngine.cpp
  VariantCaller/EnsembleEval/CrossHypotheses.cpp

  # TODO: Actually build vcflib as a static library and link to variant caller.
  # TODO2: Resolve bgzf.c collisions between vcflib and bamtools
  ${ION_VCFLIB_DIR}/Variant.cpp
  ${ION_VCFLIB_DIR}/split.cpp
  ${ION_VCFLIB_DIR}/tabixpp/tabix.cpp
  ${ION_VCFLIB_DIR}/tabixpp/index.c
  ${ION_VCFLIB_DIR}/tabixpp/bgzf.c
  ${ION_VCFLIB_DIR}/smithwaterman/LeftAlign.cpp
  ${ION_VCFLIB_DIR}/smithwaterman/Repeats.cpp
  ${ION_VCFLIB_DIR}/smithwaterman/IndelAllele.cpp
  ${ION_VCFLIB_DIR}/smithwaterman/SmithWatermanGotoh.cpp
  ${ION_FREEBAYES_DIR}/src/AlleleParser.cpp
  ${ION_JSONCPP_DIR}/jsoncpp.cpp

  BaseCaller/PIDloop.cpp
  BaseCaller/DPTreephaser.cpp
  BaseCaller/TreephaserSSE.cpp
  BaseCaller/RecalibrationModel.cpp
  Util/OptArgs.cpp
  realignment/Realigner.cpp
  file-io/ion_util.c
  file-io/ion_error.c
  ${PROJECT_BINARY_DIR}/IonVersion.cpp
)

target_link_libraries(tvc ${ION_BAMTOOLS_LIBS} z pthread blas lapack)


add_executable(tvcutils
  VariantCaller/tvcutils/tvcutils.cpp
  VariantCaller/tvcutils/prepare_hotspots.cpp
  VariantCaller/tvcutils/validate_bed.cpp
  Util/OptArgs.cpp
  Util/Utils.cpp
  ${ION_JSONCPP_DIR}/jsoncpp.cpp
  ${PROJECT_BINARY_DIR}/IonVersion.cpp
)

install(TARGETS   tvc                                                 DESTINATION bin)
install(TARGETS   tvcutils                                            DESTINATION bin)
install(PROGRAMS  bin/variant_caller_pipeline.py                      DESTINATION bin)
install(PROGRAMS  share/TVC/scripts/unify_variants_and_annotations.py DESTINATION share/TVC/scripts)
install(PROGRAMS  share/TVC/scripts/sort_vcf.py                       DESTINATION share/TVC/scripts)
install(DIRECTORY share/TVC/pluginMedia                               DESTINATION share/TVC)
install(DIRECTORY share/TVC/sse                                       DESTINATION share/TVC)
install(DIRECTORY share/TVC/examples                                  DESTINATION share/TVC)

