#-*- Makefile -*-

###################################
PWHGPATH=../..
COLLIERPATH=/path/to/COLLIER
###################################

vpath %.f MODEL DHELAS Madlib
vpath %.F MODEL DHELAS Madlib
vpath %.F Virtuals_FC Virtuals_FC/src
vpath %.F Virtuals_FC/LQtchan_0/src
vpath %.F Virtuals_FC/LQtchan_1/src
vpath %.F Virtuals_FC/LQtchan_2/src
vpath %.F90 Virtuals_FC/collier_interface
vpath %.f POWHEG_MOD

## Choose compiler: gfortran,ifort (g77 not supported, F90 constructs in use!)
COMPILER=gfortran
FC=$(COMPILER)
## Choose PDF: native,lhapdf
## LHAPDF package has to be installed separately
PDF=lhapdf
#Choose Analysis: dummy, process specific
## default analysis may require FASTJET package, that has to be installed separately (see below)
# ANALYSIS=dummy
# ANALYSIS=standard
ANALYSIS=totxsec
## For static linking uncomment the following
#STATIC= -static
#

#OBJ=obj-$(COMPILER)
OBJ=build
OBJDIR:=$(OBJ)

ifeq ("$(COMPILER)","gfortran")	
F77=gfortran -fno-automatic -ffixed-line-length-none -ffree-line-length-none -Wno-tabs -J$(OBJ) -I$(OBJ) -cpp # -fbacktrace -ffpe-trap=zero,overflow,underflow,invalid
#-DDEBUG=$(DEBUG)
# -ffast-math #-W -Wall

## -fbounds-check sometimes causes a weird error due to non-lazy evaluation
## of boolean in gfortran.
#FFLAGS= -Wall -Wimplicit-interface -fbounds-check
## For floating point exception trapping  uncomment the following 
#FPE=-ffpe-trap=invalid,zero,overflow,underflow 
## gfortran 4.4.1 optimized with -O3 yields erroneous results
## Use -O2 to be on the safe side
#OPT=-O2
OPT=-O3
## For debugging uncomment the following
#DEBUGMAKE= -ggdb 
ifdef DEBUGMAKE
OPT=-O0
FPE=-ffpe-trap=invalid,zero,overflow,underflow
endif
endif

ifeq ("$(COMPILER)","ifort")
F77 = ifort -save  -extend_source  -module $(OBJ)
#CXX = g++
#LIBS = -limf
#FFLAGS =  -checkm
## For floating point exception trapping  uncomment the following 
#FPE = -fpe0
OPT = -O3 #-fast
## For debugging uncomment the following
#DEBUGMAKE= -debug -g
ifdef DEBUGMAKE
OPT=-O0 
FPE = -fpe0
endif
endif

PWD=$(shell pwd)
WDNAME=$(shell basename $(PWD))

#VPATH= ./:../:$(OBJDIR)
VPATH= ./:$(PWHGPATH):$(OBJDIR)

INCLUDE0=$(PWD)
INCLUDE1=$(PWD)/include
#INCLUDE2=$(shell dirname $(PWD))/include
INCLUDE2=$(PWHGPATH)/include
INCLUDE3=$(PWD)/MODEL
INCLUDE4=$(PWD)/Madlib

VFCINCLUDE:=-I$(PWD)/Virtuals_FC/include
VFCINCLUDE+= -I$(PWD)/Virtuals_FC/LQtchan_0/include
VFCINCLUDE+= -I$(PWD)/Virtuals_FC/LQtchan_1/include
VFCINCLUDE+= -I$(PWD)/Virtuals_FC/LQtchan_2/include
VFCINCLUDE+= -I$(PWD)/Virtuals_FC/collier_interface/include
VFCINCLUDE+= -I$(COLLIERPATH)/include
LIBS+= -L$(COLLIERPATH)/lib -Wl,-R -Wl,$(COLLIERPATH)/lib -lcollier -lstdc++

FF=$(F77) $(FFLAGS) $(FPE) $(OPT) $(DEBUGMAKE) -I$(INCLUDE0) -I$(INCLUDE1) -I$(INCLUDE2) -I$(INCLUDE3) -I$(INCLUDE4) $(VFCINCLUDE)

INCLUDE =$(wildcard ../include/*.h *.h include/*.h)

ifeq ("$(PDF)","lhapdf")
LHAPDF_CONFIG=lhapdf-config
#PDFPACK=lhapdfif.o
PDFPACK=lhapdf6if.o lhapdf6ifcc.o
FJCXXFLAGS+= $(shell $(LHAPDF_CONFIG) --cxxflags)
LIBSLHAPDF= -Wl,-rpath,$(shell $(LHAPDF_CONFIG) --libdir)  -L$(shell $(LHAPDF_CONFIG) --libdir) -lLHAPDF
ifeq  ("$(STATIC)","-static") 
## If LHAPDF has been compiled with gfortran and you want to link it statically, you have to include
## libgfortran as well. The same holds for libstdc++. 
## One possible solution is to use fastjet, since $(shell $(FASTJET_CONFIG) --libs --plugins ) -lstdc++
## does perform this inclusion. The path has to be set by the user. 
# LIBGFORTRANPATH= #/usr/lib/gcc/x86_64-redhat-linux/4.1.2
# LIBSTDCPP=/lib64
LIBSLHAPDF+=  -L$(LIBGFORTRANPATH)  -lgfortranbegin -lgfortran -L$(LIBSTDCPP) -lstdc++
endif
LIBS+=$(LIBSLHAPDF)
else
PDFPACK=mlmpdfif.o hvqpdfpho.o
endif


ifeq ("$(ANALYSIS)","YOURPROCESS")
##To include Fastjet configuration uncomment the following lines. 
FASTJET_CONFIG=$(shell which fastjet-config)
LIBSFASTJET += $(shell $(FASTJET_CONFIG) --libs --plugins ) -lstdc++
FJCXXFLAGS+= $(shell $(FASTJET_CONFIG) --cxxflags)
PWHGANAL=pwhg_bookhist-multi.o pwhg_analysis.o
## Also add required Fastjet drivers to PWHGANAL (examples are reported)
#PWHGANAL+= fastjetsisconewrap.o fastjetktwrap.o fastjetCDFMidPointwrap.o fastjetD0RunIIConewrap.o fastjetfortran.o
#PWHGANAL+= fastjetsisconewrap.o fastjetktwrap.o fastjetfortran.o
PWHGANAL+=  fastjetfortran.o
else ifeq ("$(ANALYSIS)","standard")
PWHGANAL=pwhg_bookhist-multi.o pwhg_analysis.o
FASTJET_CONFIG=$(shell which fastjet-config)
LIBSFASTJET += $(shell $(FASTJET_CONFIG) --libs --plugins ) -lstdc++
FJCXXFLAGS+= $(shell $(FASTJET_CONFIG) --cxxflags)
PWHGANAL+=  fastjetfortran.o
else ifeq ("$(ANALYSIS)","totxsec")
PWHGANAL=pwhg_bookhist-multi.o pwhg_analysis_totxsec.o
else
PWHGANAL=pwhg_bookhist-multi.o pwhg_analysis-dummy.o
endif

$(OBJ)/%.o: %.f $(INCLUDE) | $(OBJDIR)
	$(FF) -c -o $@ $<

$(OBJ)/%.o: %.F $(INCLUDE) | $(OBJDIR)
	$(FF) -c -o $@ $<

$(OBJ)/%.o: %.f90 $(INCLUDE) | $(OBJDIR)
	$(FF) -c -o $@ $<

$(OBJ)/%.o: %.F90 $(INCLUDE) | $(OBJDIR)
	$(FF) -c -o $@ $<

$(OBJ)/%.o: %.c | $(OBJDIR)
	$(CC) $(DEBUGMAKE) -c -o $@ $^ 

$(OBJ)/%.o: %.cc | $(OBJDIR)
	$(CXX) $(DEBUGMAKE) -c -o $@ $^ $(FJCXXFLAGS)

USER:=init_couplings.o init_processes_intelligent.o Born_phsp.o Born.o virtual.o real.o  $(PWHGANAL)

VIRTUALS_FC:=VecSet.o lt_collier_interface_complex.o set_parameters.o Alfas_rescale.o
VIRTUALS_FC+=$(patsubst Virtuals_FC/LQtchan_0/src/%.F,%.o,$(wildcard Virtuals_FC/LQtchan_0/src/*.F))
VIRTUALS_FC+=$(patsubst Virtuals_FC/LQtchan_1/src/%.F,%.o,$(wildcard Virtuals_FC/LQtchan_1/src/*.F))
VIRTUALS_FC+=$(patsubst Virtuals_FC/LQtchan_2/src/%.F,%.o,$(wildcard Virtuals_FC/LQtchan_2/src/*.F))

VIRTUALS_FC:=$(patsubst %,$(OBJ)/%,$(VIRTUALS_FC))

MADLIB  := sborn_proc.o
MADLIB += $(patsubst Madlib/%.f,%.o,$(wildcard Madlib/sborn_sf_???.f))
MADLIB += $(patsubst Madlib/%.f,%.o,$(wildcard Madlib/sborn_cl_???.f))
MADLIB += $(patsubst Madlib/%.f,%.o,$(wildcard Madlib/b_sf_???_???.f))
MADLIB += $(patsubst Madlib/%.f,%.o,$(wildcard Madlib/b_cl_???_???.f))
MADLIB += $(patsubst Madlib/%.f,%.o,$(wildcard Madlib/realmtrx_???.f))
MADLIB += sreal_proc.o nexper.o

MADLIB:=$(patsubst %,$(OBJ)/%,$(MADLIB))

###############
#MADLIB=
###############

DHELAS := $(patsubst DHELAS/%.f,%.o,$(wildcard DHELAS/*.f))
DHELAS += $(patsubst DHELAS/%.F,%.o,$(wildcard DHELAS/*.F))
DHELAS := $(patsubst %,$(OBJ)/%,$(DHELAS))

MGCOUPLING:=couplings.o lha_reading.o

PWHG:=pwhg_main.o pwhg_init.o bbinit.o btilde.o lhefwrite.o		\
	LesHouches.o LesHouchesreg.o gen_Born_phsp.o find_regions_MOD.o	\
	test_Sudakov.o pt2maxreg.o sigborn.o gen_real_phsp.o maxrat.o	\
	gen_index.o gen_radiation.o Bornzerodamp.o sigremnants.o	\
	random.o boostrot.o bra_ket_subroutines.o cernroutines.o	\
	init_phys.o powheginput.o pdfcalls_MOD.o sigreal.o sigcollremn.o	\
	pwhg_analysis_driver.o checkmomzero.o		                \
	setstrongcoupl.o integrator.o newunit.o mwarn.o sigsoftvirt_MOD.o	\
	reshufflemoms.o                                                 \
	sigcollsoft.o sigvirtual.o  ubprojections.o                     \
	pwhgreweight.o setlocalscales.o mint_upb.o opencount.o          \
	validflav.o $(PDFPACK) $(USER) $(FPEOBJ) \
	pwhg_io_interface.o rwl_weightlists.o lhefread.o rwl_setup_param_weights.o zlibdummy.o \
	$(MGCOUPLING)

PWHG:=$(patsubst %,$(OBJ)/%,$(PWHG))

LIBDHELAS:=$(OBJ)/libdhelas3.a
LIBMADS:=$(OBJ)/libmadgraph.a
LIBVIRTS:=$(OBJ)/libformcalc_virts.a

# Get SVN info for SVN version stamping code
#$(shell ../svnversion/svnversion.sh>/dev/null)

# target to generate LHEF output
pwhg_main: $(PWHG) $(LIBDHELAS) $(LIBMADS) $(LIBVIRTS)
	$(FF) $(PWHG) $(LIBMADS) $(LIBDHELAS) $(LIBVIRTS) $(LIBS) $(LIBSFASTJET) $(STATIC) -o $@

$(LIBDHELAS): $(DHELAS)
	ar cr $@ $^

$(LIBMADS): $(MADLIB)
	ar cr $@ $^

$(LIBVIRTS): $(VIRTUALS_FC)
	ar cr $@ $(VIRTUALS_FC)

LHEF:=lhef_analysis.o boostrot.o random.o cernroutines.o		\
     opencount.o powheginput.o $(PWHGANAL)	\
     lhefread.o newunit.o pwhg_analysis_driver.o $(FPEOBJ) \
     pwhg_io_interface.o rwl_weightlists.o zlibdummy.o

LHEF:=$(patsubst %,$(OBJ)/%,$(LHEF))

# target to analyze LHEF output
lhef_analysis:$(LHEF)
	$(FF) $(LHEF) $(LIBS) $(LIBSFASTJET) $(STATIC)  -o $@ 

# target to read event file, shower events with HERWIG + analysis
# HERWIG:=main-HERWIG.o setup-HERWIG-lhef.o herwig.o boostrot.o	\
# 	powheginput.o $(PWHGANAL) lhefread.o	\
# 	pdfdummies.o opencount.o $(FPEOBJ)
# 
# HERWIG:=$(patsubst %,$(OBJ)/%,$(HERWIG))
# 
# main-HERWIG-lhef: $(HERWIG)
# 	$(FF) $(HERWIG)  $(LIBSFASTJET)  $(STATIC) -o $@
# 
# # target to read event file, shower events with PYTHIA + analysis
# PYTHIA=main-PYTHIA.o setup-PYTHIA-lhef.o pythia.o boostrot.o powheginput.o \
# 	$(PWHGANAL) lhefread.o newunit.o 	\
# 	pwhg_analysis_driver.o random.o cernroutines.o opencount.o	\
# 	$(FPEOBJ) pwhg_io_interface.o rwl_weightlists.o zlibdummy.o
# 
# PYTHIA:=$(patsubst %,$(OBJ)/%,$(PYTHIA))
# 
# main-PYTHIA-lhef: $(PYTHIA)
# 	$(FF) $(PYTHIA) $(LIBS) $(LIBSFASTJET)  $(STATIC) -o $@
# 
# LIBPYTHIA8=-L$(PYTHIA8LOCATION)/lib -lpythia8 -ldl -lstdc++ -L$(HEPMCLOCATION)/lib -lHepMC -Wl,-rpath,$(HEPMCLOCATION)/lib
# 
# PYTHIA8=main-PYTHIA8.o boostrot.o powheginput.o \
# 	$(PWHGANAL) opencount.o  lhefread.o  newunit.o pdfdummies.o \
# 	random.o cernroutines.o bra_ket_subroutines.o \
# 	$(FPEOBJ) pwhg_io_interface.o rwl_weightlists.o zlibdummy.o \
# 	pythia82F77.o
# 
# PYTHIA8:=$(patsubst %,$(OBJ)/%,$(PYTHIA8))
# 
# main-PYTHIA82-lhef: $(PYTHIA8)
# 	$(FF) $(PYTHIA8) $(LIBSFASTJET) $(LIBPYTHIA8) $(STATIC) $(LIBS) -o $@


# target to cleanup
.PHONY: clean cleanvirts veryclean

clean:
	rm -f $(USER) $(PWHG) $(LHEF) $(HERWIG) $(PYTHIA) pwhg_main lhef_analysis main-HERWIG-lhef main-PYTHIA-lhef main-PYTHIA82-lhef

cleanvirts:
	rm -f $(VIRTUALS_FC) $(LIBVIRTS)

veryclean:
	rm -f $(OBJ)/*.o $(OBJ)/*.mod $(OBJ)/*.a pwhg_main lhef_analysis main-HERWIG-lhef	\
	main-PYTHIA-lhef main-PYTHIA82-lhef *.a DHELAS/*.o Madlib/*.o MODEL/*.o

##########################################################################


# Dependencies of SVN version stamp code
#pwhg_main.o: svn.version
#lhefwrite.o: svn.version

