Page MenuHomeHEPForge

No OneTemporary

diff --git a/doc/developer_manual/.gitignore b/doc/developer_manual/.gitignore
new file mode 100644
index 0000000..ee6b554
--- /dev/null
+++ b/doc/developer_manual/.gitignore
@@ -0,0 +1,3 @@
+developer_manual.*
+!developer_manual.tex
+build/
diff --git a/doc/developer_manual/JHEP.bst b/doc/developer_manual/JHEP.bst
new file mode 100644
index 0000000..de998be
--- /dev/null
+++ b/doc/developer_manual/JHEP.bst
@@ -0,0 +1,1104 @@
+% JHEP bibliography style ver. 2.1
+%
+% The bibtex output produced by inSPIRE, while far from perfect, is pretty
+% suitable for use with this style. Indeed, this style was designed with
+% inSPIRE in mind.
+%
+%
+%
+% Copyright 2015 SISSA Medialab
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `author-maintained'.
+%
+% The Current Maintainer of this work is
+% SISSA Medialab <info@medialab.sissa.it>
+%
+% This work consists of the file JHEP.bst.
+
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ doi
+ SLACcitation
+ type
+ volume
+ year
+ archive
+ eprint
+ report
+ collaboration
+ }
+ {}
+ { label }
+
+INTEGERS { output.state before.all mid.sentence after.quote after.sentence
+ after.quoted.block after.block }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.quote :=
+ #3 'after.sentence :=
+ #4 'after.quoted.block :=
+ #5 'after.block :=
+}
+
+STRINGS { s t ref }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.quote =
+ { " " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ "\newblock " write$
+ }
+ { output.state before.all =
+ 'write$
+ { output.state after.quoted.block =
+ { write$
+ newline$
+ "\newblock " write$
+ }
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\bibitem{" write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {blank.sep}
+{ after.quote 'output.state :=
+}
+
+
+
+FUNCTION {fin.entry}
+{ output.state after.quoted.block =
+ 'skip$
+ 'add.period$
+ if$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { output.state after.quote =
+ { after.quoted.block 'output.state := }
+ { after.block 'output.state := }
+ if$
+ }
+ if$
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\emph{" swap$ * "}" * }
+ if$
+}
+
+%% this functions should append the correct url prefix to doi
+FUNCTION {format.doi}
+{ doi empty$
+ { "" }
+ {"\href{http://dx.doi.org/" doi * "}" * }
+ if$
+}
+
+FUNCTION {formatfull.doi}
+{ doi empty$
+ { "" }
+ {"\href{http://dx.doi.org/" doi *
+ "}{DOI}" * }
+ if$
+}
+
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { numnames #2 >
+ { "" * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ nameptr #6 >
+ { #0 'namesleft :=
+ "others" 't :=
+ 't
+ }
+ {'t}
+ if$
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+}
+
+FUNCTION {format.eprint}
+{ eprint empty$
+ { ""}
+ { archive empty$
+ {"\href{http://arxiv.org/abs/" eprint * "}" *
+ "{{\tt " * eprint * "}}" *}
+ {"\href{http://arxiv.org/abs/" archive * "/" * eprint * "}" *
+ "{{\tt " * archive * "/" * eprint * "}}" *}
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.eprint.paren}
+{ eprint missing$ { "" } { eprint empty$ { "" }
+ {"[" format.eprint * "]" *}
+ if$
+ }
+ if$
+}
+
+
+
+FUNCTION {format.report}
+{ report empty$
+ { ""}
+ { report}
+ if$
+}
+
+
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", eds." * }
+ { ", ed." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { "\emph{" title "t" change.case$ * "}, " * }
+ if$
+}
+
+FUNCTION {format.title.p}
+{ title empty$
+ { "" }
+ { "``" title "t" change.case$ * ".''" * }
+ if$
+}
+
+FUNCTION {n.dashify}
+{ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {format.date}
+{ year empty$
+ { month empty$
+ { "" }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ }
+ if$
+ }
+ { month empty$
+ 'year
+ { month ", " * year * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.date.paren}
+{ year empty$
+ { month empty$
+ { "" }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ }
+ if$
+ }
+ { month empty$
+ {"(" year * ")" *}
+ {"(" month * ", " * year * ")" *}
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.collaboration}
+{ collaboration empty$
+ { "" }
+ { "{\scshape " collaboration * "} " * "collaboration" * }
+ if$
+}
+
+
+FUNCTION {format.btitle}
+{ title emphasize
+}
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { "vol.~" volume *
+ series empty$
+ 'skip$
+ { " of " * series emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { output.state mid.sentence =
+ { "no.~" }
+ { "No.~" }
+ if$
+ number *
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in " * series * }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { edition "l" change.case$ "~ed." * }
+ if$
+}
+
+INTEGERS { multiresult }
+
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { "pp.~" pages n.dashify * }
+ { "p.~" pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.pages.nopp}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { pages n.dashify }
+ { pages }
+ if$
+ }
+ if$
+}
+
+
+FUNCTION {format.volume}
+{ volume empty$
+ { "" }
+ { "{\bf " volume * "}" * }
+ if$
+}
+
+FUNCTION {format.number}
+{ number empty$
+ { "" }
+ { "no.~" number * }
+ if$
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pages
+ { type empty$
+ { "ch.~" chapter * }
+ { type "l" change.case$ chapter tie.or.space.connect }
+ if$
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { "in " booktitle emphasize *
+ editor empty$
+ 'skip$
+ { " (" * format.editors * ")" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ output.state after.block =
+ { type "t" change.case$ }
+ { type "l" change.case$ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Tech. Rep." }
+ 'type
+ if$
+ number empty$
+ { "l" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.paddress}
+{ address empty$
+ { "" }
+ { "(" address * ")" * }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "in \emph{" journal * "\/}" * }
+ if$
+ }
+ { "in " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.crossref.editor}
+{ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$ " {et~al.}" * }
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " {et~al.}" * }
+ { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Vol.~" volume *
+ " of " *
+ }
+ if$
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { series empty$
+ { "need editor, key, or series for " cite$ * " to crossref " *
+ crossref * warning$
+ "" *
+ }
+ { "{\em " * series * "\/}" * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { booktitle empty$
+ { "need editor, key, or booktitle for " cite$ * " to crossref " *
+ crossref * warning$
+ ""
+ }
+ { "in {\em " booktitle * "\/}" * }
+ if$
+ }
+ { "in " key * }
+ if$
+ }
+ { "in " format.crossref.editor * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.collaboration output
+ format.authors "author" output.check
+ format.title "title" output.check
+ blank.sep
+ crossref missing$
+ { journal missing$
+ { format.eprint output }
+ { journal empty$ { format.eprint output } {
+ format.doi * "{" * journal emphasize before.all 'output.state := "journal" output.check
+ % added \href{doi} and { before journal
+ % Slv
+ blank.sep
+ format.volume output
+ blank.sep
+ format.date.paren "year" output.check
+ %month empty$ { format.number output }
+ % 'skip$ if$
+ blank.sep
+ format.pages.nopp "}" * output }
+ %% closed parenthesis for href argument
+ if$
+ }
+ if$
+ report missing$
+ { journal empty$ {} { format.eprint.paren output} if$ }
+ {blank.sep format.report output format.eprint.paren output}
+ if$
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ format.eprint.paren output
+ }
+ if$
+ new.sentence
+ % format.doi output
+ % note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ format.collaboration output
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ doi empty$
+ {}
+ { format.doi "{" * doi * "}" * "DOI" output.check }
+ if$
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.collaboration output
+ format.authors output
+ title empty$
+ { "empty title in " cite$ * warning$
+ howpublished new.sentence.checka
+ }
+ { howpublished empty$ not
+ address empty$ month empty$ year empty$ and and
+ or
+ { format.title.p output.nonnull }
+ { format.title output.nonnull }
+ if$
+ blank.sep
+ }
+ if$
+ howpublished output
+ address output
+ format.date output
+ new.block
+ % note output
+ doi output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ format.collaboration output
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.number.series output
+ new.block
+ publisher "publisher" output.check
+ address output
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ format.eprint output
+ new.block
+ % note output
+ doi output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.collaboration output
+ format.authors "author" output.check
+ format.title "title" output.check
+ blank.sep
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ new.block
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ format.eprint output
+ new.block
+ % note output
+ formatfull.doi output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.collaboration output
+ format.authors "author" output.check
+ format.title "title" output.check
+ blank.sep
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.paddress output
+ format.pages output
+ organization output
+ publisher output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ format.eprint output
+ new.block
+ % note output
+ formatfull.doi output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ format.collaboration output
+ author empty$
+ { organization empty$
+ 'skip$
+ { organization output.nonnull
+ address output
+ }
+ if$
+ }
+ { format.authors output.nonnull }
+ if$
+ format.btitle "title" output.check
+ author empty$
+ { organization empty$
+ { address new.block.checka
+ address output
+ }
+ 'skip$
+ if$
+ }
+ { organization address new.block.checkb
+ organization output
+ address output
+ }
+ if$
+ format.edition output
+ format.date output
+ new.block
+ % note output
+ doi output
+ fin.entry
+}
+
+FUNCTION {electronic} { manual }
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ format.title "title" output.check
+ blank.sep
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ % note output
+ doi output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.collaboration output
+ format.authors output
+ title empty$
+ { howpublished new.sentence.checka }
+ { howpublished empty$ not
+ month empty$ year empty$ and
+ or
+ { format.title.p output.nonnull }
+ { format.title output.nonnull }
+ if$
+ blank.sep
+ }
+ if$
+ howpublished output
+ format.date output
+ new.block
+ % note output
+ doi output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ format.eprint output
+ new.block
+ % note output
+ doi output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ format.paddress output
+ editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ format.date "year" output.check
+ new.block
+ % note output
+ doi output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.collaboration output
+ format.authors "author" output.check
+ format.title "title" output.check
+ blank.sep
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ % note output
+ doi output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.collaboration output
+ format.authors "author" output.check
+ format.title.p "title" output.check
+ blank.sep
+ % note "note" output.check
+ format.date output
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"Mar."}
+
+MACRO {apr} {"Apr."}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sept."}
+
+MACRO {oct} {"Oct."}
+
+MACRO {nov} {"Nov."}
+
+MACRO {dec} {"Dec."}
+
+MACRO {nup} {"Nucl. Phys."}
+
+MACRO {cmp} {"Comm. Math. Phys."}
+
+MACRO {prl} {"Phys. Rev. Lett."}
+
+MACRO {pl} {"Phys. Lett."}
+
+MACRO {rmp} {"Rev. Mod. Phys."}
+
+MACRO {ijmp} {"Int. Jour. Mod. Phys."}
+
+MACRO {mpl} {"Mod. Phys. Lett."}
+
+MACRO {pr} {"Phys. Rev."}
+
+READ
+
+STRINGS { longest.label }
+
+INTEGERS { number.label longest.label.width }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #1 'number.label :=
+ #0 'longest.label.width :=
+}
+
+FUNCTION {longest.label.pass}
+{ number.label int.to.str$ 'label :=
+ number.label #1 + 'number.label :=
+ label width$ longest.label.width >
+ { label 'longest.label :=
+ label width$ 'longest.label.width :=
+ }
+ 'skip$
+ if$
+}
+
+EXECUTE {initialize.longest.label}
+
+ITERATE {longest.label.pass}
+
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\providecommand{\href}[2]{#2}"
+ "\begingroup\raggedright\begin{thebibliography}{" * longest.label *
+ "}" * write$ newline$ }
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}\endgroup" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/doc/developer_manual/Makefile b/doc/developer_manual/Makefile
new file mode 100644
index 0000000..67920f8
--- /dev/null
+++ b/doc/developer_manual/Makefile
@@ -0,0 +1,22 @@
+SHELL=/bin/bash
+
+SRCFILES=$(wildcard src/*.asy)
+FIGURES=$(patsubst src/%.asy,build/figures/%.pdf,$(SRCFILES))
+
+.SECONDARY:
+
+.SUFFIXES:
+
+developer_manual.pdf: developer_manual.tex $(FIGURES)
+ latexmk -pdf -pdflatex='pdflatex -synctex=1' $<
+
+build/figures/%.pdf: src/%.asy
+ mkdir -p $(@D)
+ asy -f pdf -o $@ $<
+
+.PHONY: clean
+
+clean:
+ rm -f developer_manual.{pdf,aux,dvi,fdb_latexmk,fls,nav,out,snm,synctex.gz,toc,vrb}
+ rm -f *.log
+ rm -fr build
diff --git a/doc/developer_manual/biblio.bib b/doc/developer_manual/biblio.bib
new file mode 100644
index 0000000..771d819
--- /dev/null
+++ b/doc/developer_manual/biblio.bib
@@ -0,0 +1,60 @@
+@Article{Andersen:2008gc,
+ author = "Andersen, Jeppe R. and Del Duca, Vittorio and White, Chris
+ D.",
+ title = "{Higgs Boson Production in Association with Multiple Hard
+ Jets}",
+ journal = "JHEP",
+ volume = "02",
+ year = "2009",
+ pages = "015",
+ eprint = "0808.3696",
+ archivePrefix = "arXiv",
+ primaryClass = "hep-ph",
+ doi = "10.1088/1126-6708/2009/02/015",
+ SLACcitation = "%%CITATION = 0808.3696;%%"
+}
+
+@Article{Andersen:2008ue,
+ author = "Andersen, Jeppe R. and White, Chris D.",
+ title = "{A New Framework for Multijet Predictions and its
+ application to Higgs Boson production at the LHC}",
+ journal = "Phys. Rev.",
+ volume = "D78",
+ year = "2008",
+ pages = "051501",
+ eprint = "0802.2858",
+ archivePrefix = "arXiv",
+ primaryClass = "hep-ph",
+ doi = "10.1103/PhysRevD.78.051501",
+ SLACcitation = "%%CITATION = 0802.2858;%%"
+}
+@article{Alwall:2006yp,
+ author = "Alwall, Johan and others",
+ title = "{A Standard format for Les Houches event files}",
+ booktitle = "{Monte Carlos for the LHC: A Workshop on the Tools for
+ LHC Event Simulation (MC4LHC) Geneva, Switzerland, July
+ 17-16, 2006}",
+ journal = "Comput. Phys. Commun.",
+ volume = "176",
+ year = "2007",
+ pages = "300-304",
+ doi = "10.1016/j.cpc.2006.11.010",
+ eprint = "hep-ph/0609017",
+ archivePrefix = "arXiv",
+ primaryClass = "hep-ph",
+ reportNumber = "FERMILAB-PUB-06-337-T, CERN-LCGAPP-2006-03",
+ SLACcitation = "%%CITATION = HEP-PH/0609017;%%"
+}
+@article{Andersen:2018tnm,
+ author = "Andersen, Jeppe R. and Hapola, Tuomas and Heil, Marian
+ and Maier, Andreas and Smillie, Jennifer M.",
+ title = "{Higgs-boson plus Dijets: Higher-Order Matching for
+ High-Energy Predictions}",
+ year = "2018",
+ eprint = "1805.04446",
+ archivePrefix = "arXiv",
+ primaryClass = "hep-ph",
+ reportNumber = "DCPT/18/66, IPPP/18/33, MCnet-18-10, DCPT-18-66,
+ IPPP-18-33, MCNET-18-10",
+ SLACcitation = "%%CITATION = ARXIV:1805.04446;%%"
+}
diff --git a/doc/developer_manual/developer_manual.tex b/doc/developer_manual/developer_manual.tex
new file mode 100644
index 0000000..4a402a6
--- /dev/null
+++ b/doc/developer_manual/developer_manual.tex
@@ -0,0 +1,888 @@
+\documentclass[a4paper,11pt]{article}
+
+\usepackage{fourier}
+\usepackage[T1]{fontenc}
+\usepackage{microtype}
+\usepackage{geometry}
+\usepackage{enumitem}
+\setlist[description]{leftmargin=\parindent,labelindent=\parindent}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage[utf8]{inputenc}
+\usepackage{graphicx}
+\usepackage{xcolor}
+\usepackage{todonotes}
+\usepackage{listings}
+\usepackage{xspace}
+\usepackage{tikz}
+\usetikzlibrary{arrows.meta}
+\usetikzlibrary{shapes}
+\usetikzlibrary{calc}
+\usepackage[colorlinks,linkcolor={blue!50!black}]{hyperref}
+\graphicspath{{build/figures/}{figures/}}
+
+\newcommand{\HEJ}{{\tt HEJ}\xspace}
+\newcommand{\HIGHEJ}{\emph{High Energy Jets}\xspace}
+\newcommand{\cmake}{\href{https://cmake.org/}{cmake}\xspace}
+\newcommand{\html}{\href{https://www.w3.org/html/}{html}\xspace}
+\newcommand{\YAML}{\href{http://yaml.org/}{YAML}\xspace}
+
+\definecolor{darkgreen}{rgb}{0,0.4,0}
+\lstset{ %
+ backgroundcolor=\color{lightgray}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}
+ basicstyle=\footnotesize\usefont{T1}{DejaVuSansMono-TLF}{m}{n}, % the size of the fonts that are used for the code
+ breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
+ breaklines=false, % sets automatic line breaking
+ captionpos=t, % sets the caption-position to bottom
+ commentstyle=\color{red}, % comment style
+ deletekeywords={...}, % if you want to delete keywords from the given language
+ escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
+ extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8
+ frame=false, % adds a frame around the code
+ keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)
+ keywordstyle=\color{blue}, % keyword style
+ otherkeywords={}, % if you want to add more keywords to the set
+ numbers=none, % where to put the line-numbers; possible values are (none, left, right)
+ numbersep=5pt, % how far the line-numbers are from the code
+ rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
+ showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
+ showstringspaces=false, % underline spaces within strings only
+ showtabs=false, % show tabs within strings adding particular underscores
+ stepnumber=2, % the step between two line-numbers. If it's 1, each line will be numbered
+ stringstyle=\color{gray}, % string literal style
+ tabsize=2, % sets default tabsize to 2 spaces
+ title=\lstname,
+ emph={},
+ emphstyle=\color{darkgreen}
+}
+
+\begin{document}
+
+\tikzstyle{mynode}=[rectangle split,rectangle split parts=2, draw,rectangle split part fill={lightgray, none}]
+
+
+\title{Reversed HEJ developer manual}
+\author{}
+\maketitle
+\tableofcontents
+
+\newpage
+
+\section{Overview}
+\label{sec:overview}
+
+Reversed HEJ is a C++ program and library implementing an algorithm to
+apply \HIGHEJ resummation~\cite{Andersen:2008ue,Andersen:2008gc} to
+pre-generated fixed-order events. This document is intended to give an
+overview over the concepts and structure of this implementation.
+
+\subsection{Project structure}
+\label{sec:project}
+
+Reversed HEJ is developed under the \href{https://git-scm.com/}{git}
+version control system. The main repository is on the IPPP
+\href{https://gitlab.com/}{gitlab} server under
+\url{https://gitlab.dur.scotgrid.ac.uk/hej/reversed_hej}. To get a local
+copy, get an account on the gitlab server and use
+\begin{lstlisting}[language=sh,caption={}]
+ git clone git@gitlab.dur.scotgrid.ac.uk:hej/reversed_hej.git
+\end{lstlisting}
+This should create a directory \texttt{reversed\_hej} with the following
+contents:
+\begin{description}
+\item[doc:] Contains additional documentation, see section~\ref{sec:doc}.
+\item[include:] Contains the C++ header files.
+\item[src:] Contains the C++ source files.
+\item[t:] Contains the source code for the automated tests.
+\item[CMakeLists.txt:] Configuration file for the \cmake build
+ system. See section~\ref{sec:cmake}.
+\item[cmake:] Auxiliary files for \cmake. This includes modules for
+ finding installed software in \texttt{cmake/Modules} and templates for
+ code generation during the build process in \texttt{cmake/Templates}.
+\item[config.yml:] Sample configuration file for running reversed HEJ.
+\item[events.lhe:] Fixed-order event sample that can be used as input
+ for reversed HEJ.
+\item[FixedOrderGen:] Contains the code for the fixed-order generator,
+ see section~\ref{sec:HEJFOG}.
+\end{description}
+In the following all paths are given relative to the
+\texttt{reversed\_hej} directory.
+
+\subsection{Documentation}
+\label{sec:doc}
+
+The \texttt{doc} directory contains user documentation in
+\texttt{doc/sphinx} and the configuration to generate source code
+documentation in \texttt{doc/doxygen}.
+
+The user documentation explains how to install and run reversed HEJ. The
+format is
+\href{http://docutils.sourceforge.net/rst.html}{reStructuredText}, which
+is mostly human-readable. Other formats, like \html, can be generated with the
+\href{http://www.sphinx-doc.org/en/master/}{sphinx} generator with
+\begin{lstlisting}[language=sh,caption={}]
+ make html
+\end{lstlisting}
+
+
+To document the source code we use
+\href{https://www.stack.nl/~dimitri/doxygen/}{doxygen}. To generate
+\html documentation, use the command
+\begin{lstlisting}[language=sh,caption={}]
+ doxygen -g Doxyfile
+\end{lstlisting}
+in the \texttt{doc/doxygen} directory.
+
+\subsection{Build system}
+\label{sec:cmake}
+
+For the most part, reversed HEJ is a library providing classes and
+functions that can be used to add resummation to fixed-order events. In
+addition, there is a relatively small executable program leveraging this
+library to read in events from an input file and produce resummation
+events. Both the library and the program are built and installed with
+the help of \cmake.
+
+In addition to the general build process described in the user
+documentation, see section~\ref{sec:doc}, it can be useful to build reversed
+HEJ with debugging information using
+\begin{lstlisting}[language=sh,caption={}]
+ cmake base/directory -DCMAKE_BUILD_TYPE=Debug
+ make install
+\end{lstlisting}
+This faciliates the use of debuggers like \href{https://www.gnu.org/software/gdb/}{gdb}.
+
+The main \cmake configuration file is \texttt{CMakeLists.txt}. It defines the
+compiler flags, software prerequisites, header and source files used to
+build reversed HEJ, and the automated tests. In addition,
+\texttt{cmake/Modules} contains module files that help with the
+detection of the software prerequisites and \texttt{cmake/Templates}
+contains template files for the automatic generation of header and
+source files. For example, this allows to only keep the version
+information in one central location (\texttt{CMakeLists.txt}) and
+automatically generate a header file to propagate this to the C++ code.
+
+\subsection{General coding guidelines}
+\label{sec:notes}
+
+The goal is to make the reversed HEJ code well-structured and
+readable. Here are a number of guidelines to this end.
+
+\begin{description}
+\item[Observe the boy scout rule.] Always leave the code cleaner
+ than how you found it. Ugly hacks can be useful for testing, but
+ shouldn't make their way into the main branch.
+\item[Ask if something is unclear.] Often there is a good reason why
+ code is written the way it is. Sometimes that reason is only obvious to
+ the original author (use \lstinline!git blame! to find them), in which
+ case they should be poked to add a comment. Sometimes there is no good
+ reason, but nobody has had the time to come up with something better,
+ yet. In some places the code might just be bad.
+\item[Don't break tests.] There are a number of tests in the \texttt{t}
+ directory, which can be run with \lstinline!make test!. Ideally, all
+ tests should run successfully in each git revision.
+\item[Test your new code.] When you add some new functionality, also add an
+ automated test. This can be useful even if you don't know the
+ ``correct'' result because it prevents the code from changing its behaviour
+ silently in the future.
+\end{description}
+
+\section{Program flow}
+\label{sec:flow}
+
+A run of the reversed HEJ program has three stages: initialisation,
+event processing, and cleanup. The following sections outline these
+stages and their relations to the various classes and functions in the
+code. Unless denoted otherwise, all classes and functions are part of
+the \lstinline!RHEJ! namespace. The code for the reversed HEJ program is
+in \texttt{src/main.cc}, all other code comprises the reversed HEJ
+library. Classes and free functions are usually implemented in header
+and source files with a corresponding name, i.e. the code for
+\lstinline!MyClass! can usually be found in
+\texttt{include/RHEJ/MyClass.hh} and \texttt{src/MyClass.cc}.
+
+\subsection{Initialisation}
+\label{sec:init}
+
+The first step is to load and parse the \YAML configuration file. The
+entry point for this is the \lstinline!load_config! function and the
+related code can be found in \texttt{include/RHEJ/YAMLreader.hh},
+\texttt{include/RHEJ/config.hh} and the corresponding \texttt{.cc} files
+in the \texttt{src} directory. The implementation is based on the
+\href{https://github.com/jbeder/yaml-cpp}{yaml-cpp} library.
+The \lstinline!load_config! function returns a \lstinline!Config! object
+containing all settings. To detect potential mistakes as early as
+possible, we throw an exception whenever one of the following errors
+occurs:
+\begin{itemize}
+\item There is an unknown option in the \YAML file.
+\item A setting is invalid, for example a string is given where a number
+ would be expected.
+\item An option value is not set.
+\end{itemize}
+The third rule is sometimes relaxed for ``advanced'' settings with an
+obvious default, like for importing custom scales or analyses.
+
+The information stored in the \lstinline!Config! object is then used to
+initialise various objects required for the event processing stage
+described in section~\ref{sec:processing}. First, the
+\lstinline!get_analysis! function creates an object that inherits from
+the \lstinline!Analysis! interface.\footnote{In the context of C++ the
+proper technical expression is ``pure abstract class''.} Using an
+interface allows us to decide the concrete type of the analysis at run
+time instead of having to make a compile-time decision. Depending on the
+settings, \lstinline!get_analysis! creates either a user-defined
+analysis loaded from an external library (see the user documentation
+\todo{link}) or the default \lstinline!EmptyAnalysis!, which does
+nothing.
+
+Together with a number of further objects, whose roles are described in
+section~\ref{sec:processing}, we also initialise the global random
+number generator. We again use an interface to defer deciding the
+concrete type until the program is actually run. Currently, we support the
+\href{https://mixmax.hepforge.org/}{MIXMAX}
+(\texttt{include/RHEJ/Mixmax.hh}) and Ranlux64
+(\texttt{include/RHEJ/Ranlux64.hh}) random number generators.
+
+We also set up a \lstinline!LHEF::Reader! object (see
+\texttt{include/LHEF/LHEF.h}) for reading events from a file in the Les
+Houches event file format~\cite{Alwall:2006yp}. A small wrapper around
+the
+\href{https://www.boost.org/doc/libs/1_67_0/libs/iostreams/doc/index.html}{boost
+iostreams} library allows us to also read event files compressed with
+\href{https://www.gnu.org/software/gzip/}{gzip}. The wrapper code is in
+\texttt{include/RHEJ/stream.hh} and the \texttt{src/stream.cc}.
+
+\subsection{Event processing}
+\label{sec:processing}
+
+In the second stage events are continously read from the event
+file. After jet clustering, a number of corresponding resummation events
+are generated for each input event and fed into the analysis and a
+number of output files. The roles of various classes and functions are
+illustrated in the following flow chart:
+\begin{center}
+ \begin{tikzpicture}[node distance=2cm and 5mm]
+ \node (reader) [mynode]
+ {\lstinline!LHEF::Reader::readEvent!\nodepart{second}{read event}};
+ \node
+ (cluster) [mynode,below=of reader]
+ {\lstinline!Event! constructor\nodepart{second}{cluster jets}};
+ \node
+ (resum) [mynode,below=of cluster]
+ {\lstinline!EventReweighter::reweight!\nodepart{second}{perform resummation}};
+ \node
+ (cut) [mynode,below=of resum]
+ {\lstinline!Analysis::pass_cuts!\nodepart{second}{apply cuts}};
+ \node
+ (fill) [mynode,below left=of cut]
+ {\lstinline!Analysis::fill!\nodepart{second}{analyse event}};
+ \node
+ (write) [mynode,below right=of cut]
+ {\lstinline!CombinedEventWriter::write!\nodepart{second}{write out event}};
+ \node
+ (control) [below=of cut] {};
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (reader.south) -- node[left] {\lstinline!LHEF::HEPEUP!} (cluster.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (cluster.south) -- node[left] {\lstinline!Event!} (resum.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (resum.south) -- (cut.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(resum.south)+(7mm, 0cm)$) -- ($(cut.north)+(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(resum.south)-(7mm, 0cm)$) -- node[left] {\lstinline!Event!} ($(cut.north)-(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(cut.south)-(3mm,0mm)$) .. controls ($(control)-(3mm,0mm)$) ..node[left] {\lstinline!Event!} (fill.east);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(cut.south)-(3mm,0mm)$) .. controls ($(control)-(3mm,0mm)$) .. (write.west);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(cut.south)+(3mm,0mm)$) .. controls ($(control)+(3mm,0mm)$) .. (fill.east);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(cut.south)+(3mm,0mm)$) .. controls ($(control)+(3mm,0mm)$) ..node[right] {\lstinline!Event!} (write.west);
+ \end{tikzpicture}
+\end{center}
+The resummation is performed by the \lstinline!EventReweighter! class,
+which is described in more detail in section~\ref{sec:resum}. The
+\lstinline!CombinedEventWriter! writes events to zero or more output
+files. To this end, it contains a number of objects implementing the
+\lstinline!EventWriter! interface. These event writers typically write
+the events to a file in a given format. We currently have the
+\lstinline!LesHouchesWriter! for event files in the Les Houches Event
+File format and the \lstinline!HepMCWriter! for the
+\href{https://hepmc.web.cern.ch/hepmc/}{HepMC} format.
+
+\subsection{Resummation}
+\label{sec:resum}
+
+In the \lstinline!EventReweighter::reweight! member function, we first
+classify the input fixed-order event (FKL, unordered, non-HEJ, \dots)
+and decide according to the user settings whether to discard, keep, or
+resum the event. If we perform resummation for the given event, we
+generate a number of trial \lstinline!PhaseSpacePoint! objects. Phase
+space generation is discussed in more detail in
+section~\ref{sec:pspgen}. We then perform jet clustering according to
+the settings for the resummation jets on each
+\lstinline!PhaseSpacePoint!, update the factorisation and
+renormalisation scale in the resulting \lstinline!Event! and reweight it
+according to the ratio of pdf factors and \HEJ matrix elements between
+resummation and original fixed-order event:
+\begin{center}
+ \begin{tikzpicture}[node distance=2cm and 5mm]
+ \node (in) {};
+ \node (treat) [diamond,draw,below=of in,minimum size=3.5cm,
+ label={[anchor=west, inner sep=8pt]west:discard},
+ label={[anchor=east, inner sep=14pt]east:keep},
+ label={[anchor=south, inner sep=20pt]south:reweight}
+ ] {};
+ \draw (treat.north west) -- (treat.south east);
+ \draw (treat.north east) -- (treat.south west);
+ \node
+ (psp) [mynode,below=of treat]
+ {\lstinline!PhaseSpacePoint! constructor};
+ \node
+ (cluster) [mynode,below=of psp]
+ {\lstinline!Event! constructor\nodepart{second}{cluster jets}};
+ \node
+ (gen_scales) [mynode,below=of cluster]
+ {\lstinline!ScaleGenerator::operator()!\nodepart{second}{update scales}};
+ \node
+ (rescale) [mynode,below=of gen_scales]
+ {\lstinline!PDF::pdfpt!,
+ \lstinline!MatrixElement!\nodepart{second}{reweight}};
+ \node (out) [below of=rescale] {};
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (in.south) -- node[left] {\lstinline!Event!} (treat.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (treat.south) -- node[left] {\lstinline!Event!} (psp.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (psp.south) -- (cluster.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(psp.south)+(7mm, 0cm)$) -- ($(cluster.north)+(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(psp.south)-(7mm, 0cm)$) -- node[left]
+ {\lstinline!PhaseSpacePoint!} ($(cluster.north)-(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (cluster.south) -- (gen_scales.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(cluster.south)+(7mm, 0cm)$) -- ($(gen_scales.north)+(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(cluster.south)-(7mm, 0cm)$) -- node[left]
+ {\lstinline!Event!} ($(gen_scales.north)-(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (gen_scales.south) -- (rescale.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(gen_scales.south)+(7mm, 0cm)$) -- ($(rescale.north)+(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(gen_scales.south)-(7mm, 0cm)$) -- node[left]
+ {\lstinline!Event!} ($(rescale.north)-(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (rescale.south) -- (out.north);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(rescale.south)+(7mm, 0cm)$) -- ($(out.north)+(7mm, 0cm)$);
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ ($(rescale.south)-(7mm, 0cm)$) -- node[left]
+ {\lstinline!Event!} ($(out.north)-(7mm, 0cm)$);
+ \node (helper) at ($(treat.east) + (15mm,0cm)$) {};
+ \draw[-{Latex[length=3mm, width=1.5mm]}]
+ (treat.east) -- ($(treat.east) + (15mm,0cm)$)
+ -- node[left] {\lstinline!Event!} (helper |- gen_scales.east) -- (gen_scales.east)
+ ;
+ \end{tikzpicture}
+\end{center}
+
+
+\subsection{Phase space point generation}
+\label{sec:pspgen}
+
+The resummed and matched \HEJ cross section for pure jet production of
+FKL configurations is given by (cf. eq. (3) of~\cite{Andersen:2018tnm})
+\begin{align}
+ \label{eq:resumdijetFKLmatched2}
+% \begin{split}
+ \sigma&_{2j}^\mathrm{resum, match}=\sum_{f_1, f_2}\ \sum_m
+ \prod_{j=1}^m\left(
+ \int_{p_{j\perp}^B=0}^{p_{j\perp}^B=\infty}
+ \frac{\mathrm{d}^2\mathbf{p}_{j\perp}^B}{(2\pi)^3}\ \int
+ \frac{\mathrm{d} y_j^B}{2} \right) \
+ (2\pi)^4\ \delta^{(2)}\!\!\left(\sum_{k=1}^{m}
+ \mathbf{p}_{k\perp}^B\right)\nonumber\\
+ &\times\ x_a^B\ f_{a, f_1}(x_a^B, Q_a^B)\ x_b^B\ f_{b, f_2}(x_b^B, Q_b^B)\
+ \frac{\overline{\left|\mathcal{M}_\text{LO}^{f_1f_2\to f_1g\cdots
+ gf_2}\big(\big\{p^B_j\big\}\big)\right|}^2}{(\hat {s}^B)^2}\nonumber\\
+& \times (2\pi)^{-4+3m}\ 2^m \nonumber\\
+&\times\ \sum_{n=2}^\infty\
+\int_{p_{1\perp}=p_{\perp,\mathrm{min}} }^{p_{1\perp}=\infty}
+ \frac{\mathrm{d}^2\mathbf{p}_{1\perp}}{(2\pi)^3}\
+ \int_{p_{n\perp}=p_{\perp,\mathrm{min}}}^{p_{n\perp}=\infty}
+ \frac{\mathrm{d}^2\mathbf{p}_{n\perp}}{(2\pi)^3}\
+ \prod_{i=2}^{n-1}\int_{p_{i\perp}=\lambda}^{p_{i\perp}=\infty}
+ \frac{\mathrm{d}^2\mathbf{p}_{i\perp}}{(2\pi)^3}\ (2\pi)^4\ \delta^{(2)}\!\!\left(\sum_{k=1}^n
+ \mathbf{p}_{k\perp}\right )\\
+ &\times \ \mathbf{T}_y \prod_{i=1}^n
+ \left(\int \frac{\mathrm{d} y_i}{2}\right)\
+ \mathcal{O}_{mj}^e\
+ \left(\prod_{l=1}^{m-1}\delta^{(2)}(\mathbf{p}_{\mathcal{J}_{l}\perp}^B -
+ \mathbf{j}_{l\perp})\right)\
+ \left(\prod_{l=1}^m\delta(y^B_{\mathcal{J}_l}-y_{\mathcal{J}_l})\right)
+ \ \mathcal{O}_{2j}(\{p_i\})\nonumber\\
+ &\times \frac{(\hat{s}^B)^2}{\hat{s}^2}\ \frac{x_a f_{a,f_1}(x_a, Q_a)\ x_b f_{b,f_2}(x_b, Q_b)}{x_a^B\ f_{a,f_1}(x_a^B, Q_a^B)\ x_b^B\ f_{b,f_2}(x_b^B, Q_b^B)}\ \frac{\overline{\left|\mathcal{M}_{\mathrm{HEJ}}^{f_1 f_2\to f_1 g\cdots
+ gf_2}(\{ p_i\})\right|}^2}{\overline{\left|\mathcal{M}_\text{LO, HEJ}^{f_1f_2\to f_1g\cdots
+ gf_2}\big(\big\{p^B_j\big\}\big)\right|}^{2}} \,.\nonumber
+% \end{split}
+\end{align}
+The first two lines correspond to the generation of the fixed-order
+input events with incoming partons $f_1, f_2$ and outgoing momenta
+$p_j^B$, where $\mathbf{p}_{j\perp}^B$ and $y_j^B$ denote the respective
+transverse momentum and rapidity. Note that, at leading order, these
+coincide with the fixed-order jet momenta $p_{\mathcal{J}_j}^B$. $f_{a,f_1}(x_a, Q_a),
+f_{b,f_2}(x_b, Q_b)$ are the pdf factors for the incoming partons with
+momentum fractions $x_a$ and $x_b$. The square of the partonic
+centre-of-mass energy is denoted by $\hat{s}^B$ and
+$\mathcal{M}_\text{LO}^{f_1f_2\to f_1g\cdots gf_2}$ is the
+leading-order matrix element.
+
+The third line is a factor accounting for the different multiplicities
+between fixed-order and resummation events. Lines four and five are
+the integration over the resummation phase space described in this
+section. $p_i$ are the momenta of the outgoing partons in resummation
+phase space. $\mathbf{T}_y$ denotes rapidity
+ordering and $\mathcal{O}_{mj}^e$ projects out the exclusive $m$-jet
+component. The relation between resummation and fixed-order momenta is
+fixed by the $\delta$ functions. The first sets each transverse fixed-order jet
+momentum to some function $\mathbf{j_{l\perp}}$ of the resummation
+momenta. The exact form is described in section~\ref{sec:ptj_res}. The second
+$\delta$ forces the rapidities of resummation and fixed-order jets to be
+the same. Finally, the last line is the reweighting of pdf and matrix
+element factors already shown in section~\ref{sec:resum}.
+
+There are two kinds of cut-off in the integration over the resummation
+partons. $\lambda$ is a technical cut-off connected to the cancellation
+of infrared divergencies between real and virtual corrections. Its
+numerical value is set in
+\texttt{include/RHEJ/Constants.h}. $p_{\perp,\mathrm{min}}$ regulates
+and \emph{uncancelled} divergence in the extremal parton momenta. Its
+size is set by the user configuration \todo{link}.
+
+It is straightforward to generalise eq.~(\ref{eq:resumdijetFKLmatched2})
+to unordered configurations and processes with additional colourless
+emissions, for example a Higgs or electroweak boson. In the latter case only
+the fixed-order integration and the matrix elements change.
+
+\subsubsection{Gluon Multiplicity}
+\label{sec:psp_ng}
+
+The first step in evaluating the resummation phase space in
+eq.~(\ref{eq:resumdijetFKLmatched2}) is to randomly pick terms in the
+sum over the number of emissions. This sampling of the gluon
+multiplicity is done in the \lstinline!PhaseSpacePoint::sample_ng!
+function in \texttt{src/PhaseSpacePoint.cc}.
+
+The typical number of extra emissions depends strongly on the rapidity
+span of the underlying fixed-order event. Let us, for example, consider
+a fixed-order FKL-type multi-jet configuration with rapidities
+$y_{j_f},\,y_{j_b}$ of the most forward and backward jets,
+respectively. By eq.~(\ref{eq:resumdijetFKLmatched2}), the jet
+multiplicity and the rapidity of each jet are conserved when adding
+resummation. This implies that additional hard radiation is restricted
+to rapidities $y$ within a region $y_{j_b} \lesssim y \lesssim
+y_{j_f}$. Within \HEJ, we require the most forward and most backward
+emissions to be hard in order to avoid divergences, so this constraint
+in fact applies to \emph{all} additional radiation.
+
+To simplify the remaining discussion, let us remove the FKL rapidity
+ordering
+\begin{equation}
+ \label{eq:remove_y_order}
+ \mathbf{T}_y \prod_{i=1}^n\int \frac{\mathrm{d}y_i}{2} =
+ \frac{1}{n!}\prod_{i=1}^n\int
+ \frac{\mathrm{d}y_i}{2}\,,
+\end{equation}
+where all rapidity integrals now cover a region which is approximately
+bounded by $y_{j_b}$ and $y_{j_f}$. Each of the $m$ jets has to contain at least
+one parton; selecting random emissions we can rewrite the phase space
+integrals as
+\begin{equation}
+ \label{eq:select_jets}
+ \frac{1}{n!}\prod_{i=1}^n\int [\mathrm{d}p_i] =
+ \left(\prod_{i=1}^{m}\int [\mathrm{d}p_i]\ {\cal J}_i(p_i)\right)
+ \frac{1}{n_g!}\prod_{i=m+1}^{m+n_g}\int [\mathrm{d}p_i]
+\end{equation}
+with jet selection functions
+\begin{equation}
+ \label{eq:def_jet_selection}
+ {\cal J}_i(p) =
+ \begin{cases}
+ 1 &p\text{ clustered into jet }i\\
+ 0 & \text{otherwise}
+ \end{cases}
+\end{equation}
+and $n_g \equiv n - m$. Here and in the following we use the short-hand
+notation $[\mathrm{d}p_i]$ to denote the phase-space measure for parton
+$i$. As is evident from eq.~\eqref{eq:select_jets}, adding an extra emission
+$n_g+1$ introduces a suppression factor $\tfrac{1}{n_g+1}$. However, the
+additional phase space integral also results in an enhancement proportional
+to $\Delta y_{j_f j_b} = y_{j_f} - y_{j_b}$. This is a result of the
+rapidity-independence of the MRK limit of the integrand, consisting of the
+matrix elements divided by the flux factor. Indeed, we observe that the
+typical number of gluon emissions is to a good approximation proportional to
+the rapidity separation and the phase space integral is dominated by events
+with $n_g \approx \Delta y_{j_f j_b}$.
+
+For the actual phase space sampling, we assume a Poisson distribution
+and extract the mean number of gluon emissions in different rapidity
+bins and fit the results to a linear function in $\Delta y_{j_f j_b}$,
+finding a coefficient of $0.975$ for the inclusive production of a Higgs
+boson with two jets. Here are the observed and fitted average gluon
+multiplicities as a function of $\Delta y_{j_f j_b}$:
+\begin{center}
+ \includegraphics[width=.75\textwidth]{ng_mean}
+\end{center}
+As shown for two rapidity slices the assumption of a Poisson
+distribution is also a good approximation:
+\begin{center}
+ \includegraphics[width=.49\textwidth]{{ng_1.5}.pdf}\hfill
+ \includegraphics[width=.49\textwidth]{{ng_5.5}.pdf}
+\end{center}
+
+\subsubsection{Number of Gluons inside Jets}
+\label{sec:psp_ng_jet}
+
+For each of the $n_g$ gluon emissions we can split the phase-space
+integral into a (disconnected) region inside the jets and a remainder:
+\begin{equation}
+ \label{eq:psp_split}
+ \int [\mathrm{d}p_i] = \int [\mathrm{d}p_i]\,
+ \theta\bigg(\sum_{j=1}^{m}{\cal J}_j(p_i)\bigg) + \int [\mathrm{d}p_i]\,
+ \bigg[1-\theta\bigg(\sum_{j=1}^{m}{\cal J}_j(p_i)\bigg)\bigg]\,.
+\end{equation}
+The next step is to decide how many of the gluons will form part of a
+jet. This is done in the \lstinline!PhaseSpacePoint::sample_ng_jets!
+function.
+
+We choose an importance sampling which is flat in the plane
+spanned by the azimuthal angle $\phi$ and the rapidity $y$. This is
+observed in BFKL and valid in the limit of Multi-Regge-Kinematics
+(MRK). Furthermore, we assume anti-$k_t$ jets, which cover an area of
+$\pi R^2$.
+
+In principle, the total accessible area in the $y$-$\phi$ plane is given
+by $2\pi \Delta y_{fb}$, where $\Delta y_{fb}\geq \Delta y_{j_f j_b}$ is
+the a priori unknown rapidity separation between the most forward and
+backward partons. In most cases the extremal jets consist of single
+partons, so that $\Delta y_{fb} = \Delta y_{j_f j_b}$. For the less common
+case of two partons forming a jet we observe a maximum distance of $R$
+between the constituents and the jet centre. In rare cases jets have
+more than two constituents. Empirically, they are always within a
+distance of $\tfrac{5}{3}R$ to the centre of the jet, so
+$\Delta y_{fb} \leq \Delta y_{j_f j_b} + \tfrac{10}{3} R$. In practice, the
+extremal partons are required to carry a large fraction of the jet
+transverse momentum and will therefore be much closer to the jet axis.
+
+In summary, for sufficiently large rapidity separations we can use the
+approximation $\Delta y_{fb} \approx \Delta y_{j_f j_b}$. This scenario
+is depicted here:
+\begin{center}
+ \includegraphics[width=0.5\linewidth]{ps_large_y}
+\end{center}
+If there is no overlap between jets, the probability $p_{\cal J, >}$ for
+an extra gluon to end up inside a jet is then given by
+\begin{equation}
+ \label{eq:p_J_large}
+ p_{\cal J, >} = \frac{(m - 1)\*R^2}{2\Delta y_{j_f j_b}}\,.
+\end{equation}
+For a very small rapidity separation, eq.~\eqref{eq:p_J_large}
+obviously overestimates the true probability. The maximum phase space
+covered by jets in the limit of a vanishing rapidity distance between
+all partons is $2mR \Delta y_{fb}$:
+\begin{center}
+ \includegraphics[width=0.5\linewidth]{ps_small_y}
+\end{center}
+We therefore estimate the probability for a parton
+to end up inside a jet as
+\begin{equation}
+ \label{eq:p_J}
+ p_{\cal J} = \min\bigg(\frac{(m - 1)\*R^2}{2\Delta y_{j_f j_b}}, \frac{mR}{\pi}\bigg)\,.
+\end{equation}
+Here we compare this estimate with the actually observed
+fraction of additional emissions into jets as a function of the rapidity
+separation:
+\begin{center}
+ \includegraphics[width=0.75\linewidth]{pJ}
+\end{center}
+
+\subsubsection{Gluons outside Jets}
+\label{sec:gluons_nonjet}
+
+Using our estimate for the probability of a gluon to be a jet
+constituent, we choose a number $n_{g,{\cal J}}$ of gluons inside
+jets, which also fixes the number $n_g - n_{g,{\cal J}}$ of gluons
+outside jets. As explained later on, we need to generate the momenta of
+the gluons outside jets first. This is done in
+\lstinline!PhaseSpacePoint::gen_non_jet!.
+
+The azimuthal angle $\phi$ is generated flat within $0\leq \phi \leq 2
+\pi$. The allowed rapidity interval is set by the most forward and
+backward partons, which are necessarily inside jets. Since these parton
+rapidities are not known at this point, we also have to postpone the
+rapidity generation for the gluons outside jets. For the scalar
+transverse momentum $p_\perp = |\mathbf{p}_\perp|$ of a gluon outside
+jets we use the parametrisation
+\begin{equation}
+ \label{eq:p_nonjet}
+ p_\perp = \lambda + \tilde{p}_\perp\*\tan(\tau\*r)\,, \qquad
+ \tau = \arctan\bigg(\frac{p_{\perp{\cal J}_\text{min}} - \lambda}{\tilde{p}_\perp}\bigg)\,.
+\end{equation}
+For $r \in [0,1)$, $p_\perp$ is always less than the minimum momentum
+$p_{\perp{\cal J}_\text{min}}$ required for a jet. $\tilde{p}_\perp$ is
+a free parameter, a good empirical value is $\tilde{p}_\perp = [1.3 +
+0.2\*(n_g - n_{g,\cal J})]\,$GeV
+
+\subsubsection{Resummation jet momenta}
+\label{sec:ptj_res}
+
+On the one hand, each jet momentum is given by the sum of its
+constituent momenta. On the other hand, the resummation jet momenta are
+fixed by the constraints in line five of the master
+equation~\eqref{eq:resumdijetFKLmatched2}. We therefore have to
+calculate the resummation jet momenta from these constraints before
+generating the momenta of the gluons inside jets. This is done in the
+\lstinline!resummation_jet_momenta! function in \texttt{src/PhaseSpacePoint.cc}.
+
+The resummation jet momenta are determined by the $\delta$ functions in
+line five of eq.~(\ref{eq:resumdijetFKLmatched2}). The rapidities are
+fixed to the rapidities of the jets in the input fixed-order events, so
+that the FKL ordering is guaranteed to be preserved. For the transverse
+momentum components we currently use the traditional \HEJ reshuffling
+relation
+\begin{equation}
+ \label{eq:ptreassign}
+ \mathbf{p}^B_{\mathcal{J}_{l\perp}} = \mathbf{j}_{l\perp} \equiv \mathbf{p}_{\mathcal{J}_{l}\perp} + \mathbf{q}_\perp \,
+ \frac{|\mathbf{p}_{\mathcal{J}_{l}\perp}|}{P_\perp},
+\end{equation}
+where $\mathbf{q}_\perp = \sum_{j=1}^n \mathbf{p}_{i\perp}
+\bigg[1-\theta\bigg(\sum_{j=1}^{m}{\cal J}_j(p_i)\bigg)\bigg] $ is the
+total transverse momentum of all partons \emph{outside} jets and
+$P_\perp = \sum_{j=1}^m |\mathbf{p}_{\mathcal{J}_{j}\perp}|$. Since the
+total transverse momentum of an event vanishes, we can also use
+$\mathbf{q}_\perp = - \sum_{j=1}^m
+\mathbf{p}_{\mathcal{J}_{j}\perp}$. Eq.~(\ref{eq:ptreassign}) is a
+non-linear system of equations in the resummation jet momenta
+$\mathbf{p}_{\mathcal{J}_{l}\perp}$. To solve it we use
+\href{https://www.gnu.org/software/gsl/}{GSL} routines.
+
+The reshuffling relation~\eqref{eq:ptreassign} allows the transverse
+momenta $p^B_{\mathcal{J}_{l\perp}}$ of the fixed-order jets to be
+somewhat below the minimum transverse momentum of resummation jets. It
+is crucial that this difference does not become too large, as the
+fixed-order cross section diverges for vanishing transverse momenta. In
+the production of a Higgs boson with resummation jets above $30\,$GeV we observe
+that the contribution from fixed-order events with jets softer than
+about $20\,$GeV can be safely neglected. This is shown in the following
+plot of the differential cross section over the transverse momentum of
+the softest fixed-order jet:
+\begin{center}
+ \includegraphics[width=.75\textwidth]{ptBMin}
+\end{center}
+
+
+\subsubsection{Gluons inside Jets}
+\label{sec:gluons_jet}
+
+After the steps outlined in section~\ref{sec:psp_ng_jet}, we have a
+total number of $m + n_{g,{\cal J}}$ constituents. In
+\lstinline!PhaseSpacePoint::distribute_jet_partons! we distribute them
+randomly among the jets such that each jet has at least one
+constituent. We then generate their momenta in
+\lstinline!PhaseSpacePoint::split! using the \lstinline!Splitter! class.
+
+The phase space integral for a jet ${\cal J}$ is given by
+\begin{equation}
+ \label{eq:ps_jetparton} \prod_{i\text{ in }{\cal J}} \bigg(\int
+\mathrm{d}\mathbf{p}_{i\perp}\ \int \mathrm{d} y_i
+\bigg)\delta^{(2)}\Big(\sum_{i\text{ in }{\cal J}} \mathbf{p}_{i\perp} -
+\mathbf{j}_{\perp}^B\Big)\delta(y_{\mathcal{J}}-y^B_{\mathcal{J}})\,.
+\end{equation}
+For jets with a single constituent, the parton momentum is obiously equal to the
+jet momentum. In the case of two constituents, we observe that the
+partons are always inside the jet cone with radius $R$ and often very
+close to the jet centre. The following plots show the typical relative
+distance $\Delta R/R$ for this scenario:
+\begin{center}
+ \includegraphics[width=0.45\linewidth]{dR_2}
+ \includegraphics[width=0.45\linewidth]{dR_2_small}
+\end{center}
+According to this preference for small values of $\Delta R$, we
+parametrise the $\Delta R$ integrals as
+\begin{equation}
+ \label{eq:dR_sampling}
+ \frac{\Delta R}{R} =
+ \begin{cases}
+ 0.25\,x_R & x_R < 0.4 \\
+ 1.5\,x_R - 0.5 & x_R \geq 0.4
+ \end{cases}\,.
+\end{equation}
+Next, we generate $\Theta_1 \equiv \Theta$ and use the constraint $\Theta_2 = \Theta
+\pm \pi$. The transverse momentum of the first parton is then given by
+\begin{equation}
+ \label{eq:delta_constraints}
+ p_{1\perp} =
+ \frac{p_{\mathcal{J} y} - \tan(\phi_2) p_{\mathcal{J} x}}{\sin(\phi_1)
+ - \tan(\phi_2)\cos(\phi_1)}\,.
+\end{equation}
+We get $p_{2\perp}$ by exchanging $1 \leftrightarrow 2$ in the
+indices. To obtain the Jacobian of the transformation, we start from the
+single jet phase space eq.~(\ref{eq:ps_jetparton}) with the rapidity
+delta function already rewritten to be linear in the rapidity of the
+last parton, i.e.
+\begin{equation}
+ \label{eq:jet_2p}
+\prod_{i=1,2} \bigg(\int
+\mathrm{d}\mathbf{p}_{i\perp}\ \int \mathrm{d} y_i
+\bigg)\delta^{(2)}\Big(\mathbf{p}_{1\perp} + \mathbf{p}_{2\perp} -
+\mathbf{j}_{\perp}^B\Big)\delta(y_2- \dots)\,.
+\end{equation}
+The integral over the second parton momentum is now trivial; we can just replace
+the integral over $y_2$ with the equivalent constraint
+\begin{equation}
+ \label{eq:R2}
+\int \mathrm{d}R_2 \ \delta\bigg(R_2 - \bigg[\phi_{\cal J} - \arctan
+\bigg(\frac{p_{{\cal J}y} - p_{1y}}{p_{{\cal J}x} -
+ p_{1x}}\bigg)\bigg]/\cos \Theta\bigg) \,.
+\end{equation}
+In order to fix the integral over $p_{1\perp}$ instead, we rewrite this
+$\delta$ function. This introduces the Jacobian
+\begin{equation}
+ \label{eq:jac_pt1}
+\bigg|\frac{\partial p_{1\perp}}{\partial R_2} \bigg| =
+\frac{\cos(\Theta)\mathbf{p}_{2\perp}^2}{p_{{\cal J}\perp}\sin(\phi_{\cal J}-\phi_1)}\,.
+\end{equation}
+The final form of the integral over the two parton momenta is then
+\begin{equation}
+ \label{eq:ps_jet_2p}
+\int \mathrm{d}R_1\ R_1 \int \mathrm{d}R_2 \int \mathrm{d}x_\Theta\ 2\pi \int
+\mathrm{d}p_{1\perp}\ p_{1\perp} \int \mathrm{d}p_{2\perp}
+\ \bigg|\frac{\partial p_{1\perp}}{\partial R_2} \bigg|\delta(p_{1\perp}
+-\dots) \delta(p_{2\perp} - \dots)\,.
+\end{equation}
+
+As is evident from section~\ref{sec:psp_ng_jet}, jets with three or more
+constituents are rare and an efficient phase-space sampling is less
+important. For such jets, we exploit the observation that partons with a
+distance larger than $R_{\text{max}} = \tfrac{5}{3} R$ to
+the jet centre are never clustered into the jet. Assuming $N$
+constituents, we generate all components
+for the first $N-1$ partons and fix the remaining parton with the
+$\delta$-functional. In order to end up inside the jet, we use the
+parametrisation
+\begin{align}
+ \label{eq:ps_jet_param}
+ \phi_i ={}& \phi_{\cal J} + \Delta \phi_i\,, & \Delta \phi_i ={}& \Delta
+ R_i
+ \cos(\Theta_i)\,, \\
+ y_i ={}& y_{\cal J} + \Delta y_i\,, & \Delta y_i ={}& \Delta
+ R_i
+ \sin(\Theta_i)\,,
+\end{align}
+and generate $\Theta_i$ and $\Delta R_i$ randomly with $\Delta R_i \leq
+R_{\text{max}}$ and the empiric value $R_{\text{max}} = 5\*R/3$. We can
+then write the phase space integral for a single parton as $(p_\perp = |\mathbf{p}_\perp|)$
+\begin{equation}
+ \label{eq:ps_jetparton_x}
+ \int \mathrm{d}\mathbf{p}_{\perp}\ \int
+ \mathrm{d} y \approx \int_{\Box} \mathrm{d}x_{\perp}
+ \mathrm{d}x_{ R}
+ \mathrm{d}x_{\theta}\
+ 2\*\pi\,\*R_{\text{max}}^2\,\*x_{R}\,\*p_{\perp}\,\*(p_{\perp,\text{max}}
+ - p_{\perp,\text{min}})
+\end{equation}
+with
+\begin{align}
+ \label{eq:ps_jetparton_parameters}
+ \Delta \phi ={}& R_{\text{max}}\*x_{R}\*\cos(2\*\pi\*x_\theta)\,,&
+ \Delta y ={}& R_{\text{max}}\*x_{R}\*\sin(2\*\pi\*x_\theta)\,, \\
+ p_{\perp} ={}& (p_{\perp,\text{max}} - p_{\perp,\text{min}})\*x_\perp +
+ p_{\perp,\text{min}}\,.
+\end{align}
+$p_{\perp,\text{max}}$ is determined from the requirement that the total
+contribution from the first $n-1$ partons --- i.e. the projection onto the
+jet $p_{\perp}$ axis --- must never exceed the jet $p_\perp$. This gives
+\todo{This bound is too high}
+\begin{equation}
+ \label{eq:pt_max}
+ p_{i\perp,\text{max}} = \frac{p_{{\cal J}\perp} - \sum_{j<i} p_{j\perp}
+ \cos \Delta
+\phi_j}{\cos \Delta
+\phi_i}\,.
+\end{equation}
+The $x$ and $y$ components of the last parton follow immediately from
+the first $\delta$ function. The last rapidity is fixed by the condition that
+the jet rapidity is kept fixed by the reshuffling, i.e.
+\begin{equation}
+ \label{eq:yJ_delta}
+ y^B_{\cal J} = y_{\cal J} = \frac 1 2 \ln \frac{\sum_{i=1}^n E_i+ p_{iz}}{\sum_{i=1}^n E_i - p_{iz}}\,.
+\end{equation}
+With $E_n \pm p_{nz} = p_{n\perp}\exp(\pm y_n)$ this can be rewritten to
+\begin{equation}
+ \label{eq:yn_quad_eq}
+ \exp(2y_{\cal J}) = \frac{\sum_{i=1}^{n-1} E_i+ p_{iz}+p_{n\perp} \exp(y_n)}{\sum_{i=1}^{n-1} E_i - p_{iz}+p_{n\perp} \exp(-y_n)}\,,
+\end{equation}
+which is a quadratic equation in $\exp(y_n)$. The physical solution is
+\begin{align}
+ \label{eq:yn}
+ y_n ={}& \log\Big(-b + \sqrt{b^2 + \exp(2y_{\cal J})}\,\Big)\,,\\
+b ={}& \bigg(\sum_{i=1}^{n-1} E_i + p_{iz} - \exp(2y_{\cal J})
+ \sum_{i=1}^{n-1} E_i - p_{iz}\bigg)/(2 p_{n\perp})\,.
+\end{align}
+\todo{what's wrong with the following?} To eliminate the remaining rapidity
+integral, we transform the $\delta$ function to be linear in the
+rapidity $y$ of the last parton. The corresponding Jacobian is
+\begin{equation}
+ \label{eq:jacobian_y}
+ \bigg|\frac{\partial y_{\cal J}}{\partial y_n}\bigg|^{-1} = 2 \bigg( \frac{E_n +
+ p_{nz}}{E_{\cal J} + p_{{\cal J}z}} + \frac{E_n - p_{nz}}{E_{\cal J} -
+ p_{{\cal J}z}}\bigg)^{-1}\,.
+\end{equation}
+Finally, we check that all designated constituents are actually
+clustered into the considered jet.
+
+\subsubsection{Final steps}
+\label{sec:final}
+
+Knowing the rapidity span covered by the extremal partons, we can now
+generate the rapdities for the partons outside jets. We perform jet
+clustering on all partons and check in
+\lstinline!PhaseSpacePoint::jets_ok! that all the following criteria are
+fulfilled:
+\begin{itemize}
+\item The number of resummation jets must match the number of
+ fixed-order jets.
+\item No partons designated to be outside jets may end up inside jets.
+\item All other outgoing partons \emph{must} end up inside jets.
+\item The extremal (in rapidity) partons must be inside the extremal
+ jets. If there is, for example, an unordered forward emission, the
+ most forward parton must end up inside the most forward jet and the
+ next parton must end up inside second jet.
+\item The rapidities of fixed-order and resummation jets must match.
+\end{itemize}
+After this, we adjust the phase-space normalisation according to the
+third line of eq.~(\ref{eq:resumdijetFKLmatched2}), determine the
+flavours of the outgoing partons, and adopt any additional colourless
+bosons from the fixed-order input event. Finally, we use momentum
+conservation to reconstruct the momenta of the incoming partons.
+
+\subsection{The matrix element }
+\label{sec:ME}
+
+
+
+\section{The fixed-order generator}
+\label{sec:HEJFOG}
+
+
+
+\bibliographystyle{JHEP}
+\bibliography{biblio}
+
+
+\end{document}
diff --git a/doc/developer_manual/figures/dR_2.pdf b/doc/developer_manual/figures/dR_2.pdf
new file mode 100644
index 0000000..5a8745c
Binary files /dev/null and b/doc/developer_manual/figures/dR_2.pdf differ
diff --git a/doc/developer_manual/figures/dR_2_small.pdf b/doc/developer_manual/figures/dR_2_small.pdf
new file mode 100644
index 0000000..4880eea
Binary files /dev/null and b/doc/developer_manual/figures/dR_2_small.pdf differ
diff --git a/doc/developer_manual/figures/ng_1.5.pdf b/doc/developer_manual/figures/ng_1.5.pdf
new file mode 100644
index 0000000..d405ea8
Binary files /dev/null and b/doc/developer_manual/figures/ng_1.5.pdf differ
diff --git a/doc/developer_manual/figures/ng_5.5.pdf b/doc/developer_manual/figures/ng_5.5.pdf
new file mode 100644
index 0000000..0435138
Binary files /dev/null and b/doc/developer_manual/figures/ng_5.5.pdf differ
diff --git a/doc/developer_manual/figures/ng_mean.pdf b/doc/developer_manual/figures/ng_mean.pdf
new file mode 100644
index 0000000..b4c4097
Binary files /dev/null and b/doc/developer_manual/figures/ng_mean.pdf differ
diff --git a/doc/developer_manual/figures/pJ.pdf b/doc/developer_manual/figures/pJ.pdf
new file mode 100644
index 0000000..4db6d25
Binary files /dev/null and b/doc/developer_manual/figures/pJ.pdf differ
diff --git a/doc/developer_manual/figures/ptBMin.pdf b/doc/developer_manual/figures/ptBMin.pdf
new file mode 100644
index 0000000..607cc20
Binary files /dev/null and b/doc/developer_manual/figures/ptBMin.pdf differ
diff --git a/doc/developer_manual/src/main_flow.asy b/doc/developer_manual/src/main_flow.asy
new file mode 100644
index 0000000..767463e
--- /dev/null
+++ b/doc/developer_manual/src/main_flow.asy
@@ -0,0 +1,31 @@
+import flowchart;
+
+usepackage("fourier");
+
+size(0, 400);
+defaultpen(fontsize(8));
+
+pen code = font("T1", "DejaVuSansMono-TLF", "m", "n") + fontsize(6);
+
+block read = rectangle(Label("LHEF::Reader::readEvent", code), Label("read event"),(0,1));
+block cluster = rectangle(Label("Event constructor", code), Label("perform jet clustering"), (0,0.5));
+block resum = rectangle(Label("EventReweighter::reweight", code), Label("perform resummation"), (0,0));
+block cut = rectangle(Label("Analysis::pass\_cuts", code), Label("apply cuts"),(0,-0.5));
+block fill = rectangle(Label("Analysis::fill", code), Label("analyse"), (-0.3,-1));
+block write = rectangle(Label("CombinedEventWriter::write", code), Label("write out event"), (0.5, -1));
+
+draw(read);
+draw(cluster);
+draw(resum);
+draw(cut);
+draw(fill);
+draw(write);
+add(new void(picture pic, transform t) {
+ blockconnector operator --=blockconnector(pic,t);
+ read--Down--Label("LHEF::HEPEUP", code)--Arrow--cluster;
+ cluster--Down--Label("Event", code)--Arrow--resum;
+ resum--Down--Arrow--cut;
+ resum--Down--Label("Event", code)--Arrow--cut;
+ cut--Down--Label("Event", code)--Left--Arrow--fill;
+ cut--Down--Right--Arrow--write;
+ });
diff --git a/doc/developer_manual/src/ps_large_y.asy b/doc/developer_manual/src/ps_large_y.asy
new file mode 100644
index 0000000..a2c3cfa
--- /dev/null
+++ b/doc/developer_manual/src/ps_large_y.asy
@@ -0,0 +1,27 @@
+import graph;
+
+real goldenratio=(1+sqrt(5))/2;
+size(4.5cm*goldenratio,4.5cm,IgnoreAspect);
+
+real ymin = -5;
+real ymax = 5;
+real phimin = 0;
+real phimax = 2*pi;
+
+real yb = -4;
+real phib = 1.76814;
+real phif = 3.347;
+real yf = 4.4;
+real R = 0.4;
+
+fill((yb,phimin)--(yb,phimax)--(yf,phimax)--(yf,phimin)--cycle, blue+opacity(0.3));
+fill(arc((yb, phib), R, -90, 90)--cycle, black + opacity(0.3));
+fill(arc((yf, phif), R, 90, 270)--cycle, black + opacity(0.3));
+draw(circle((yb, phib), R));
+draw(circle((yf, phif), R));
+filldraw(circle((-0.540897, 5.23749), R), black+opacity(0.3), black);
+
+xaxis(Label("$y$",0.5),YEquals(phimin),ymin,ymax);
+xaxis(YEquals(phimax),ymin,ymax);
+yaxis(Label("$\phi$",0.5),XEquals(ymin),phimin,phimax);
+yaxis(XEquals(ymax),phimin,phimax);
diff --git a/doc/developer_manual/src/ps_small_y.asy b/doc/developer_manual/src/ps_small_y.asy
new file mode 100644
index 0000000..50b2f87
--- /dev/null
+++ b/doc/developer_manual/src/ps_small_y.asy
@@ -0,0 +1,42 @@
+import graph;
+
+real goldenratio=(1+sqrt(5))/2;
+size(4.5cm*goldenratio,4.5cm,IgnoreAspect);
+
+real ymin = -5;
+real ymax = 5;
+real phimin = 0;
+real phimax = 2*pi;
+
+real yb = 0.647031;
+real yf = 0.80701;
+real yj = 0.758564;
+real phib = 3.18605;
+real phif = 4.05933;
+real phij = 0.614849;
+real R = 0.4;
+
+fill(
+ (yb,phimin)--(yb,phimax)--(yf,phimax)--(yf,phimin)--cycle,
+ blue+opacity(0.3)
+ );
+fill(
+ (yb,phib-R)--(yb,phib+R)--(yf,phib+R)--(yf,phib-R)--cycle,
+ black+opacity(0.3)
+ );
+fill(
+ (yb,phif-R)--(yb,phif+R)--(yf,phif+R)--(yf,phif-R)--cycle,
+ black+opacity(0.3)
+ );
+fill(
+ (yb,phij-R)--(yb,phij+R)--(yf,phij+R)--(yf,phij-R)--cycle,
+ black+opacity(0.3)
+ );
+draw(circle((yb, phib), R));
+draw(circle((yf, phif), R));
+draw(circle((yj, phij), R));
+
+xaxis(Label("$y$",0.5),YEquals(phimin),ymin,ymax);
+xaxis(YEquals(phimax),ymin,ymax);
+yaxis(Label("$\phi$",0.5),XEquals(ymin),phimin,phimax);
+yaxis(XEquals(ymax),phimin,phimax);

File Metadata

Mime Type
text/x-diff
Expires
Tue, Jan 21, 1:45 AM (1 d, 11 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4243499
Default Alt Text
(70 KB)

Event Timeline