Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F8725468
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
70 KB
Subscribers
None
View Options
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
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Jan 21, 1:45 AM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4243499
Default Alt Text
(70 KB)
Attached To
rHEJ HEJ
Event Timeline
Log In to Comment