{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.P1Sh8qFd/b1/siscone_3.0.5-2_i386.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.P1Sh8qFd/b2/siscone_3.0.5-2_i386.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -2,9 +2,9 @@\n c2eba7ab2ff86ddecab30f5dbe3a3b58 89024 libdevel optional libsiscone-dev_3.0.5-2_i386.deb\n 57ef7753326658b39c4e262a4cf41815 79800 libdevel optional libsiscone-spherical-dev_3.0.5-2_i386.deb\n 0315030af9b19045fcd1c7428d030006 412472 debug optional libsiscone-spherical0v5-dbgsym_3.0.5-2_i386.deb\n 53d3042cf5a5605735dbb8458c64b2aa 64244 libs optional libsiscone-spherical0v5_3.0.5-2_i386.deb\n b2a91641e4ed029f2312b9d72d55fd63 484376 debug optional libsiscone0v5-dbgsym_3.0.5-2_i386.deb\n 100a2e3e8fb4068517d40bb4c98f70f6 70124 libs optional libsiscone0v5_3.0.5-2_i386.deb\n 7d89227e5e8612b9277739fbcc5b1ec0 1052220 doc optional siscone-doc-html_3.0.5-2_all.deb\n- 228d739ed929e4c18b1ce0ee2be58927 1466272 doc optional siscone-doc-pdf_3.0.5-2_all.deb\n+ ee505e8819739325a8da1d49b7381da6 1463572 doc optional siscone-doc-pdf_3.0.5-2_all.deb\n ee8a36e6ed6ae32143424e71fcc9dc11 34968 devel optional siscone-examples_3.0.5-2_all.deb\n"}, {"source1": "siscone-doc-pdf_3.0.5-2_all.deb", "source2": "siscone-doc-pdf_3.0.5-2_all.deb", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -1,3 +1,3 @@\n -rw-r--r-- 0 0 0 4 2023-01-10 17:32:40.000000 debian-binary\n -rw-r--r-- 0 0 0 808 2023-01-10 17:32:40.000000 control.tar.xz\n--rw-r--r-- 0 0 0 1465272 2023-01-10 17:32:40.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 1462572 2023-01-10 17:32:40.000000 data.tar.xz\n"}, {"source1": "control.tar.xz", "source2": "control.tar.xz", "unified_diff": null, "details": [{"source1": "control.tar", "source2": "control.tar", "unified_diff": null, "details": [{"source1": "./control", "source2": "./control", "unified_diff": "@@ -1,13 +1,13 @@\n Package: siscone-doc-pdf\n Source: siscone\n Version: 3.0.5-2\n Architecture: all\n Maintainer: Debian Science Maintainers \n-Installed-Size: 1446\n+Installed-Size: 1444\n Section: doc\n Priority: optional\n Multi-Arch: foreign\n Homepage: http://projects.hepforge.org/siscone/\n Description: Developer's reference manual of SISCone (PDF)\n SISCone implements a Seedless Infrared (IR) Safe Cone jet algorithm, it takes\n N^2*ln(N) time to find jets among N particles, comparing to N*2^N time of\n"}, {"source1": "./md5sums", "source2": "./md5sums", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "comments": ["Files differ"], "unified_diff": null}]}]}]}, {"source1": "data.tar.xz", "source2": "data.tar.xz", "unified_diff": null, "details": [{"source1": "data.tar", "source2": "data.tar", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -3,10 +3,10 @@\n drwxr-xr-x 0 root (0) root (0) 0 2023-01-10 17:32:40.000000 ./usr/share/\n drwxr-xr-x 0 root (0) root (0) 0 2023-01-10 17:32:40.000000 ./usr/share/doc/\n drwxr-xr-x 0 root (0) root (0) 0 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-pdf/\n -rw-r--r-- 0 root (0) root (0) 1125 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-pdf/changelog.Debian.gz\n -rw-r--r-- 0 root (0) root (0) 16688 2020-04-24 08:56:01.000000 ./usr/share/doc/siscone-doc-pdf/changelog.gz\n -rw-r--r-- 0 root (0) root (0) 1151 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-pdf/copyright\n drwxr-xr-x 0 root (0) root (0) 0 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-pdf/pdf/\n--rw-r--r-- 0 root (0) root (0) 1449983 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-pdf/pdf/refman.pdf.gz\n+-rw-r--r-- 0 root (0) root (0) 1447242 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-pdf/pdf/refman.pdf.gz\n drwxr-xr-x 0 root (0) root (0) 0 2023-01-10 17:32:40.000000 ./usr/share/doc-base/\n -rw-r--r-- 0 root (0) root (0) 240 2023-01-10 17:32:40.000000 ./usr/share/doc-base/siscone-doc-pdf.siscone-pdf\n"}, {"source1": "./usr/share/doc/siscone-doc-pdf/pdf/refman.pdf.gz", "source2": "./usr/share/doc/siscone-doc-pdf/pdf/refman.pdf.gz", "unified_diff": null, "details": [{"source1": "refman.pdf", "source2": "refman.pdf", "unified_diff": null, "details": [{"source1": "pdftotext {} -", "source2": "pdftotext {} -", "unified_diff": "@@ -1699,35 +1699,35 @@\n 4.37.2.1 centre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174\n 4.37.2.2 is_stable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174\n 4.37.2.3 next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174\n 5 File Documentation\n \n 175\n \n-5.1 area.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175\n-5.2 area.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176\n-5.3 main.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180\n-5.4 options.cpp\n+5.1 main.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175\n+5.2 options.cpp\n \n-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182\n+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176\n \n-5.5 options.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185\n-5.6 sample.cpp\n+5.3 options.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179\n+5.4 sample.cpp\n \n-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186\n+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180\n \n-5.7 spherical.cpp\n+5.5 spherical.cpp\n \n-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187\n+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181\n \n-5.8 test.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188\n-5.9 times.cpp\n+5.6 test.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182\n+5.7 times.cpp\n \n-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190\n+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184\n \n+5.8 area.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185\n+5.9 area.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187\n 5.10 area.h\n \n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191\n \n 5.11 circulator.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192\n \n Generated by Doxygen\n@@ -1747,66 +1747,66 @@\n 5.14.1.4 PT_TSHOLD\n \n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197\n \n 5.14.2 Variable Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198\n 5.14.2.1 twopi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198\n 5.15 defines.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198\n-5.16 geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199\n-5.17 geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201\n-5.18 hash.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203\n-5.19 hash.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206\n-5.20 hash.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208\n-5.21 hash.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209\n-5.22 momentum.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210\n-5.23 momentum.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212\n-5.24 momentum.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215\n-5.25 momentum.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217\n-5.26 protocones.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219\n-5.27 protocones.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229\n-5.28 protocones.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238\n-5.29 protocones.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240\n-5.30 quadtree.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242\n-5.31 quadtree.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246\n-5.32 ranlux.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247\n-5.33 siscone/ranlux.h File Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249\n-5.33.1 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249\n-5.33.1.1 ranlux_get() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249\n-5.33.1.2 ranlux_init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250\n-5.33.1.3 ranlux_print_state() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250\n-5.34 ranlux.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250\n-5.35 reference.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251\n-5.36 reference.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252\n-5.37 siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253\n-5.38 siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257\n-5.39 siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260\n-5.40 siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261\n-5.41 siscone_error.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262\n-5.42 siscone_error.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263\n+5.16 geom_2d.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199\n+5.17 geom_2d.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200\n+5.18 hash.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201\n+5.19 hash.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204\n+5.20 hash.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207\n+5.21 hash.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207\n+5.22 momentum.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208\n+5.23 momentum.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210\n+5.24 protocones.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214\n+5.25 protocones.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223\n+5.26 quadtree.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233\n+5.27 quadtree.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237\n+5.28 ranlux.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238\n+5.29 siscone/ranlux.h File Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240\n+5.29.1 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240\n+5.29.1.1 ranlux_get() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240\n+5.29.1.2 ranlux_init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240\n+5.29.1.3 ranlux_print_state() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240\n+5.30 ranlux.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241\n+5.31 reference.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241\n+5.32 reference.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243\n+5.33 siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244\n+5.34 siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247\n+5.35 siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251\n+5.36 siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252\n+5.37 siscone_error.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253\n+5.38 siscone_error.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253\n+5.39 geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254\n+5.40 geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256\n+5.41 momentum.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258\n+5.42 momentum.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260\n \n Generated by Doxygen\n \n \fxvi\n \n-5.43 geom_2d.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264\n-5.44 geom_2d.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265\n+5.43 protocones.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262\n+5.44 protocones.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264\n 5.45 split_merge.cpp\n \n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266\n \n 5.46 split_merge.cpp\n \n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280\n \n-5.47 split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293\n-5.48 split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296\n-5.49 vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299\n-5.50 vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302\n-5.51 vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306\n-5.52 vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307\n+5.47 vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293\n+5.48 vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294\n+5.49 split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296\n+5.50 split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299\n+5.51 vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301\n+5.52 vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305\n Index\n \n 309\n \n Generated by Doxygen\n \n \fChapter 1\n@@ -2064,49 +2064,49 @@\n siscone/siscone_error.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/siscone_error.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/split_merge.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n Generated by Doxygen\n \n+185\n 175\n+176\n+179\n 180\n+181\n 182\n-185\n-186\n+184\n 187\n-188\n-190\n-176\n 191\n 192\n 193\n 194\n 196\n+254\n 199\n-264\n-203\n+201\n+207\n 208\n-210\n-215\n-219\n+258\n+214\n+262\n+233\n+237\n 238\n-242\n-246\n-247\n-249\n+240\n+241\n+243\n+244\n 251\n-252\n 253\n-260\n-262\n-263\n+253\n 280\n-296\n-302\n+299\n+305\n \n \f6\n \n File Index\n \n siscone/vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/spherical/geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n@@ -2120,29 +2120,29 @@\n siscone/spherical/siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/spherical/siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/spherical/split_merge.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/spherical/split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/spherical/vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/spherical/vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n \n-307\n-201\n-265\n-206\n-209\n-212\n-217\n-229\n-240\n-257\n-261\n+294\n+256\n+200\n+204\n+207\n+210\n+260\n+223\n+264\n+247\n+252\n 266\n+296\n+301\n 293\n-299\n-306\n \n Generated by Doxygen\n \n \fChapter 4\n \n Class Documentation\n \n@@ -10217,15 +10217,15 @@\n \u2022 siscone/spherical/hash.h\n \n Generated by Doxygen\n \n \fChapter 5\n \n File Documentation\n-5.1 area.cpp\n+5.1 main.cpp\n 00001\n //\n 00002 // File: main.cpp\n 00003 // Description: main program that runs siscone from the command line\n //\n 00004 // This file is part of the SISCone project.\n //\n@@ -10260,848 +10260,14 @@\n 00019 // You should have received a copy of the GNU General Public License\n //\n 00020 // along with this program; if not, write to the Free Software\n //\n 00021 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n 00022 //\n //\n-00023 // $Revision:: 171\n-$//\n-00024 // $Date:: 2007-06-19 10:26:05 -0400 (Tue, 19 Jun 2007)\n-$//\n-00026\n-00027 #include \n-00028 #include \n-00029 #include \n-00030 #include \"siscone/momentum.h\"\n-00031 #include \"siscone/siscone.h\"\n-00032 #include \"siscone/area.h\"\n-00033 #include \"options.h\"\n-00034\n-00035 using namespace std;\n-00036 using namespace siscone;\n-00037\n-00038 int main(int argc, char *argv[]){\n-00039\n-vector particles;\n-00040\n-Carea siscone_with_area;\n-int i,N;\n-00041\n-double px,py,pz,E;\n-00042\n-00043\n-Coptions opts;\n-char fline[512];\n-00044\n-00045\n-00046\n-if (opts.parse_options(argc, argv))\n-00047\n-exit(1);\n-00048\n-// deal with help message\n-00049\n-00050\n-if (opts.help_flag){\n-00051\n-opts.print_help();\n-00052\n-exit(0);\n-00053\n-}\n-00054\n-// deal with version flag\n-00055\n-00056\n-if (opts.version_flag){\n-\n-Generated by Doxygen\n-\n-\f176\n-\n-File Documentation\n-\n-00057\n-opts.print_version();\n-00058\n-exit(0);\n-00059\n-}\n-00060\n-// various files used to read input data and store results\n-00061\n-00062\n-FILE *flux;\n-00063\n-FILE *fpart;\n-00064\n-// read particles\n-00065\n-00066\n-if (opts.verbose_flag) cout \u00ab \"reading particles\" \u00ab endl;\n-00067\n-flux = fopen(opts.ev_name, \"r\");\n-if (flux==NULL){\n-00068\n-00069\n-cerr \u00ab \"cannot read event\" \u00ab endl;\n-return 1;\n-00070\n-00071\n-}\n-00072\n-00073\n-N=0;\n-00074\n-fpart = fopen(\"particles.dat\", \"w+\");\n-while ((opts.N_stop!=0) && (fgets(fline, 512, flux)!=NULL)){\n-00075\n-00076\n-if (fline[0]!=\u2019#\u2019){ // skip lines beginning with \u2019#\u2019\n-00077\n-if (sscanf(fline, \"%le%le%le%le\", &px, &py, &pz, &E)==4){\n-00078\n-particles.push_back(Cmomentum(px, py, pz, E));\n-00079\n-fprintf(fpart, \"%e\\t%e\\n\",\n-particles[N].eta, particles[N].phi);\n-00080\n-N++;\n-00081\n-opts.N_stop--;\n-00082\n-} else {\n-00083\n-cout \u00ab \"error in reading event file Giving up.\" \u00ab endl;\n-00084\n-fclose(flux);\n-00085\n-fclose(fpart);\n-00086\n-exit(2);\n-00087\n-}\n-00088\n-}\n-00089\n-}\n-00090\n-fclose(flux);\n-00091\n-fclose(fpart);\n-if (opts.verbose_flag)\n-00092\n-00093\n-cout \u00ab \" working with \" \u00ab N \u00ab \" particles\" \u00ab endl;\n-00094\n-// compute jets\n-00095\n-00096\n-if (opts.verbose_flag) cout \u00ab \"computing jet contents\" \u00ab endl;\n-00097\n-i=siscone_with_area.compute_areas(particles, opts.R, opts.f, opts.npass, opts.SM_var);\n-00098\n-if (opts.verbose_flag){\n-unsigned int pass;\n-00099\n-00100\n-for (pass=0;pass::iterator ja;\n-for (ja=siscone_with_area.jet_areas.begin();ja!=siscone_with_area.jet_areas.end();ja++){\n-00111\n-00112\n-fprintf(flux, \"%e\\t%e\\t%e\\t%e\\t%e\\n\",\n-00113\n-ja->v.perp(), ja->v.eta, ja->v.phi,\n-00114\n-ja->active_area, ja->passive_area);\n-00115\n-}\n-00116\n-00117\n-fclose(flux);\n-00118\n-00119\n-if (opts.verbose_flag)\n-00120\n-cout \u00ab \"bye...\" \u00ab endl;\n-00121\n-return 0;\n-00122\n-00123 }\n-\n-5.2 area.cpp\n-00001 // -*- C++ -*00003 // File: area.h\n-00004 // Description: header file for the computation of jet area\n-00005 // This file is part of the SISCone project.\n-//\n-00006 // For more details, see http://projects.hepforge.org/siscone\n-00007 //\n-00008 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n-00009 //\n-00010 // This program is free software; you can redistribute it and/or modify\n-00011 // it under the terms of the GNU General Public License as published by\n-00012 // the Free Software Foundation; either version 2 of the License, or\n-00013 // (at your option) any later version.\n-//\n-\n-//\n-//\n-\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-\n-Generated by Doxygen\n-\n-\f5.2 area.cpp\n-\n-00014 //\n-//\n-00015 // This program is distributed in the hope that it will be useful,\n-//\n-00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n-00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-//\n-00018 // GNU General Public License for more details.\n-//\n-00019 //\n-//\n-00020 // You should have received a copy of the GNU General Public License\n-//\n-00021 // along with this program; if not, write to the Free Software\n-//\n-00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n-00023 //\n-//\n-00024 // $Revision:: 149\n-$//\n-00025 // $Date:: 2007-03-15 00:13:58 +0100 (Thu, 15 Mar 2007)\n-$//\n-00027\n-00028 #include \"area.h\"\n-00029 #include \"momentum.h\"\n-00030 #include \n-00031 #include \n-00032\n-00033 namespace siscone{\n-00034 using namespace std;\n-00035\n-00036 /*******************************************************\n-00037 * Cjet_area implementation\n-*\n-00038 * real Jet information, including its area(s)\n-*\n-00039 *\n-*\n-00040 * This class contains information for one single jet. *\n-00041 * That is, first, its momentum carrying information\n-*\n-00042 * about its centre and pT, and second, its particle\n-*\n-00043 * contents (from CJeT).\n-*\n-00044 * Compared to the Cjet class, it also includes the\n-*\n-00045 * passive and active areas of the jet computed using *\n-00046 * the Carea class.\n-*\n-00047 *******************************************************/\n-00048\n-00049 // default ctor\n-00050 //-------------00051 Cjet_area::Cjet_area(){\n-00052\n-active_area = passive_area = 0.0;\n-00053 }\n-00054\n-00055 // jet-initiated ctor\n-00056 //------------------00057 Cjet_area::Cjet_area(Cjet &j){\n-00058\n-v = j.v;\n-00059\n-n = j.n;\n-00060\n-contents = j.contents;\n-00061\n-00062\n-pass = j.pass;\n-00063\n-00064\n-pt_tilde = j.pt_tilde;\n-00065\n-sm_var2 = j.sm_var2;\n-00066\n-00067\n-active_area = passive_area = 0.0;\n-00068 }\n-00069\n-00070 // default dtor\n-00071 //-------------00072 Cjet_area::~Cjet_area(){\n-00073\n-00074 }\n-00075\n-00076\n-00077 /******************************************************************\n-00078 * Csiscone_area implementation\n-*\n-00079 * class for the computation of jet areas.\n-*\n-00080 *\n-*\n-00081 * This is the class user should use whenever you want to compute *\n-00082 * the jet area (passive and active).\n-00083 * It uses the SISCone algorithm to perform the jet analysis.\n-*\n-00084 ******************************************************************/\n-00085\n-00086 // default ctor\n-00087 //------------00088 Carea::Carea(){\n-// 3600 particles added\n-00089\n-grid_size = 60;\n-00090\n-grid_eta_max = 6.0; // maybe having twice more points in eta than in phi should be nice\n-00091\n-grid_shift = 0.5;\n-// 50% \"shacking\"\n-00092\n-00093\n-pt_soft = 1e-100;\n-00094\n-pt_shift = 0.05;\n-00095\n-pt_soft_min = 1e-90;\n-00096 }\n-00097\n-00098 // default dtor\n-00099 //------------00100 Carea::~Carea(){\n-\n-Generated by Doxygen\n-\n-177\n-\n-*\n-\n-\f178\n-\n-File Documentation\n-\n-00101\n-00102 }\n-00103\n-00104 /*\n-00105 * compute the jet areas from a given particle set.\n-00106 * The parameters of this method are the ones which control the jet clustering alghorithm.\n-00107 * Note that the pt_min is not allowed here soince the jet-area determination involves soft\n-00108 * particles/jets and thus is used internally.\n-00109 * - _particles\n-list of particles\n-00110 * - _radius\n-cone radius\n-shared energy threshold for splitting&merging\n-00111 * - _f\n-00112 * - _n_pass_max maximum number of passes (0=full search, the default)\n-the scale choice for the split-merge procedure\n-00113 * - _split_merge_scale\n-00114 *\n-NOTE: SM_pt leads to IR unsafety for some events with momentum conservation.\n-SM_Et is IR safe but not boost invariant and not implemented(!)\n-00115 *\n-00116 *\n-SM_mt is IR safe for hadronic events, but not for decays of two\n-00117 *\n-back-to-back particles of identical mass\n-SM_pttilde\n-00118 *\n-00119 *\n-is always IR safe, and also boost invariant (default)\n-when this is set on, only hard jets are computed\n-00120 * - _hard_only\n-00121 *\n-and not the purely ghosted jets (default: false)\n-00122 * return the jets together with their areas\n-00123 * The return value is the number of jets (including pure-ghost ones if they are included)\n-00124 ********************************************************************************************/\n-00125 int Carea::compute_areas(std::vector &_particles, double _radius, double _f,\n-int _n_pass_max, Esplit_merge_scale _split_merge_scale,\n-00126\n-00127\n-bool _hard_only){\n-00128\n-00129\n-vector all_particles;\n-00130\n-// put \"hardest cut-off\" if needed\n-00131\n-00132\n-// this avoids computation of ghosted jets when not required and\n-00133\n-// significantly shortens the SM.\n-00134\n-if (_hard_only){\n-00135\n-SM_var2_hardest_cut_off = pt_soft_min*pt_soft_min;\n-00136\n-}\n-00137\n-// clear potential previous runs\n-00138\n-00139\n-jet_areas.clear();\n-00140\n-// put initial set of particles in the list\n-00141\n-00142\n-int n_hard = _particles.size();\n-00143\n-all_particles = _particles;\n-00144\n-// build the set of ghost particles and add them to the particle list\n-00145\n-00146\n-int i,j;\n-double eta_g,phi_g,pt_g;\n-00147\n-00148\n-00149\n-for (i=0;i= n_hard\n-00167\n-// and deduce the number of ghosts in the jet, hence the area.\n-00168\n-double area_factor = (2.0*grid_eta_max/grid_size)*(twopi/grid_size);\n-00169\n-for (i=0;i<(int) jets.size();i++){\n-00170\n-00171\n-jet_areas.push_back(jets[i]);\n-00172\n-j=0;\n-00173\n-while ((j &_particles, double _radius, double _f,\n-00218\n-int _n_pass_max, Esplit_merge_scale _split_merge_scale){\n-00219\n-00220\n-vector all_particles;\n-00221\n-// in the case of passive area, we do not need\n-00222\n-00223\n-// to put the ghosts in the stable-cone search\n-00224\n-// (they do no influence the list of stable cones)\n-00225\n-// Here\u2019s how it goes...\n-00226\n-stable_cone_soft_pt2_cutoff = pt_soft_min*pt_soft_min;\n-00227\n-00228\n-// clear potential previous runs\n-00229\n-jet_areas.clear();\n-00230\n-// put initial set of particles in the list\n-00231\n-00232\n-int n_hard = _particles.size();\n-00233\n-all_particles = _particles;\n-00234\n-00235\n-// build the set of ghost particles and add them to the particle list\n-00236\n-int i,j;\n-00237\n-double eta_g,phi_g,pt_g;\n-00238\n-for (i=0;i= n_hard\n-00257\n-// and deduce the number of ghosts in the jet, hence the area.\n-00258\n-double area_factor = (2.0*grid_eta_max/grid_size)*(twopi/grid_size);\n-00259\n-for (i=0;i<(int) jets.size();i++){\n-00260\n-j=0;\n-while ((j &_particles, double _radius, double _f,\n-00292\n-int _n_pass_max, Esplit_merge_scale _split_merge_scale,\n-bool _hard_only){\n-00293\n-00294\n-00295\n-vector all_particles;\n-00296\n-// put \"hardest cut-off\" if needed\n-00297\n-00298\n-// this avoids computation of ghosted jets when not required and\n-00299\n-// significantly shortens the SM.\n-00300\n-if (_hard_only){\n-00301\n-SM_var2_hardest_cut_off = pt_soft_min*pt_soft_min;\n-00302\n-}\n-00303\n-// clear potential previous runs\n-00304\n-00305\n-jet_areas.clear();\n-00306\n-// put initial set of particles in the list\n-00307\n-00308\n-int n_hard = _particles.size();\n-00309\n-all_particles = _particles;\n-00310\n-// build the set of ghost particles and add them to the particle list\n-00311\n-00312\n-int i,j;\n-00313\n-double eta_g,phi_g,pt_g;\n-00314\n-for (i=0;i= n_hard\n-00333\n-// and deduce the number of ghosts in the jet, hence the area.\n-00334\n-double area_factor = (2.0*grid_eta_max/grid_size)*(twopi/grid_size);\n-00335\n-for (i=0;i<(int) jets.size();i++){\n-00336\n-00337\n-jet_areas.push_back(jets[i]);\n-00338\n-j=0;\n-00339\n-while ((j\n 00028 #include \n@@ -11116,87 +10282,94 @@\n 00037 int main(int argc, char *argv[]){\n 00038\n vector particles;\n 00039\n Csiscone siscone;\n int i,N;\n 00040\n-double px,py,pz,E;\n 00041\n+double px,py,pz,E;\n 00042\n Coptions opts;\n-00043\n char fline[512];\n+00043\n 00044\n if (opts.parse_options(argc, argv))\n 00045\n 00046\n exit(1);\n 00047\n-// deal with help message\n 00048\n+// deal with help message\n 00049\n if (opts.help_flag){\n 00050\n opts.print_help();\n 00051\n exit(0);\n 00052\n }\n 00053\n-// deal with version flag\n 00054\n+// deal with version flag\n 00055\n if (opts.version_flag){\n 00056\n opts.print_version();\n+\n+Generated by Doxygen\n+\n+\f176\n+\n+File Documentation\n+\n 00057\n exit(0);\n 00058\n }\n 00059\n-00060\n // various files used to read input data and store results\n+00060\n 00061\n FILE *flux;\n 00062\n FILE *fpart;\n 00063\n 00064\n // read particles\n 00065\n if (opts.verbose_flag) cout \u00ab \"reading particles\" \u00ab endl;\n 00066\n flux = fopen(opts.ev_name, \"r\");\n-if (flux==NULL){\n 00067\n+if (flux==NULL){\n 00068\n cerr \u00ab \"cannot read event \u2019\" \u00ab opts.ev_name \u00ab \"\u2019\" \u00ab endl;\n 00069\n cerr \u00ab \"specify the event to read using the -e option\" \u00ab endl;\n return 1;\n 00070\n 00071\n }\n 00072\n 00073\n N=0;\n 00074\n fpart = fopen(\"particles.dat\", \"w+\");\n-00075\n while ((opts.N_stop!=0) && (fgets(fline, 512, flux)!=NULL)){\n+00075\n 00076\n if (fline[0]!=\u2019#\u2019){ // skip lines beginning with \u2019#\u2019\n 00077\n if (sscanf(fline, \"%le%le%le%le\", &px, &py, &pz, &E)==4){\n 00078\n particles.push_back(Cmomentum(px, py, pz, E));\n-particles[N].eta, particles[N].phi);\n 00079\n fprintf(fpart, \"%e\\t%e\\n\",\n+particles[N].eta, particles[N].phi);\n 00080\n N++;\n 00081\n opts.N_stop--;\n 00082\n } else {\n 00083\n@@ -11207,23 +10380,14 @@\n fclose(fpart);\n 00086\n exit(2);\n 00087\n }\n 00088\n }\n-\n-Generated by Doxygen\n-\n-181\n-\n-\f182\n-\n-File Documentation\n-\n 00089\n }\n 00090\n fclose(flux);\n 00091\n fclose(fpart);\n if (opts.verbose_flag)\n@@ -11233,23 +10397,23 @@\n 00094\n // compute jets\n 00095\n 00096\n if (opts.verbose_flag) cout \u00ab \"computing jet contents\" \u00ab endl;\n 00097\n i=siscone.compute_jets(particles, opts.R, opts.f, opts.npass, opts.ptmin, opts.SM_var);\n-if (opts.verbose_flag){\n 00098\n-00099\n+if (opts.verbose_flag){\n unsigned int pass;\n-for (pass=0;pass\n 00029 #include \n 00030 #include \n 00031\n 00032 using namespace std;\n 00033 using namespace siscone;\n 00034\n-00035 #define N_DEFAULT\n -1\n+00035 #define N_DEFAULT\n 00036 #define R_DEFAULT\n 0.7\n 00037 #define THRESHOLD_DEFAULT 0.5\n 00038 #define PTMIN_DEFAULT\n 0.0\n 00039 #define NPASS_DEFAULT\n 0\n@@ -11349,23 +10521,15 @@\n 00044 * Coptions implementation\n *\n 00045 * options for the \u2019cone\u2019 sample\n *\n 00046 *******************************************/\n 00047\n 00048 // default ctor\n-00049 //--------------\n-\n-Generated by Doxygen\n-\n-\f5.4 options.cpp\n-\n-183\n-\n-00050 Coptions::Coptions(){\n+00049 //-------------00050 Coptions::Coptions(){\n // set default flags values\n 00051\n 00052\n help_flag=0;\n 00053\n version_flag=0;\n 00054\n@@ -11422,16 +10586,16 @@\n no_argument, &verbose_flag, 0},\n no_argument, &help_flag\n , 1},\n 00089\n {\"help\",\n 00090\n {\"version\", no_argument, &version_flag, 1},\n-00091\n // options setting parameters\n+00091\n 00092\n {\"number\",\n required_argument, NULL, \u2019N\u2019},\n 00093\n {\"radius\",\n required_argument, NULL, \u2019R\u2019},\n 00094\n@@ -11441,64 +10605,75 @@\n required_argument, NULL, \u2019p\u2019},\n required_argument, NULL, \u2019n\u2019},\n 00096\n {\"npass\",\n 00097\n {\"event\",\n required_argument, NULL, \u2019e\u2019},\n+required_argument, NULL, \u2019s\u2019},\n 00098\n {\"sm\",\n-required_argument, NULL, \u2019s\u2019},\n 00099\n {0,0,0,0}\n 00100\n };\n 00101\n 00102\n-do{\n 00103\n-00104\n+do{\n // getopt_long stores the option index here.\n+00104\n 00105\n option_index=0;\n+\n+Generated by Doxygen\n+\n+177\n+\n+\f178\n+\n 00106\n-// retreive options\n 00107\n 00108\n-opt_param = getopt_long(argc, argv, \"hvqN:R:f:p:n:e:s:\",\n 00109\n-siscone_options, &option_index);\n 00110\n 00111\n-// Detect the end of the options.\n 00112\n-if (opt_param == -1)\n 00113\n-stop=true;\n 00114\n-// branch according to \u2019opt_param\u2019\n 00115\n 00116\n-switch (opt_param){\n 00117\n+00118\n+00119\n+00120\n+00121\n+00122\n+00123\n+\n+File Documentation\n+\n+// retreive options\n+opt_param = getopt_long(argc, argv, \"hvqN:R:f:p:n:e:s:\",\n+siscone_options, &option_index);\n+// Detect the end of the options.\n+if (opt_param == -1)\n+stop=true;\n+\n+// branch according to \u2019opt_param\u2019\n+switch (opt_param){\n case \u2019h\u2019: help_flag = 1;\n break; // help\n-00118\n case \u2019v\u2019: verbose_flag = 1;\n break; // verbose\n-00119\n case \u2019q\u2019: verbose_flag = 0;\n break; // quiet\n-00120\n case \u2019N\u2019: // max number of paprticles\n-00121\n sscanf(optarg, \"%d\", &N_stop);\n if (N_stop<=0){\n-00122\n-00123\n cout \u00ab \"Warning: the specified number of particles must be positive. Using default one\" \u00ab\n endl;\n 00124\n N_stop = N_DEFAULT;\n 00125\n }\n break;\n@@ -11511,77 +10686,65 @@\n if (R<=0){\n 00130\n cout \u00ab \"Warning: the specified cone radius must be positive. Using default one\" \u00ab endl;\n 00131\n R = R_DEFAULT;\n 00132\n }\n-break;\n 00133\n-case \u2019f\u2019:\n+break;\n 00134\n+case \u2019f\u2019:\n 00135\n sscanf(optarg, \"%lf\", &f);\n-\n-Generated by Doxygen\n-\n-\f184\n-\n-File Documentation\n-\n 00136\n-00137\n-\n if ((f<0) || (f>1)){\n-cout \u00ab \"Warning: the specified split/merge threshold must be in [0,1].\n-\n-Using default one\" \u00ab\n-\n+00137\n+cout \u00ab \"Warning: the specified split/merge threshold must be in [0,1]. Using default one\" \u00ab\n endl;\n 00138\n-00139\n-00140\n-00141\n-00142\n-00143\n-00144\n-00145\n-00146\n-00147\n-00148\n-00149\n-00150\n-00151\n-\n f = THRESHOLD_DEFAULT;\n+00139\n }\n+00140\n break;\n case \u2019p\u2019:\n+00141\n+00142\n sscanf(optarg, \"%lf\", &ptmin);\n if (ptmin<0){\n+00143\n+00144\n cout \u00ab \"Warning: the specified minimal pT must be non-negative. Using default one\" \u00ab endl;\n+00145\n ptmin = PTMIN_DEFAULT;\n+00146\n }\n+00147\n break;\n case \u2019n\u2019:\n // max number of paprticles\n+00148\n+00149\n sscanf(optarg, \"%d\", &npass);\n if (npass<0){\n+00150\n+00151\n cout \u00ab \"Warning: the specified number of passes must be non negative. Using default one\" \u00ab\n endl;\n 00152\n npass = NPASS_DEFAULT;\n 00153\n }\n break;\n 00154\n 00155\n case \u2019e\u2019:\n-00156\n if (ev_name==NULL){\n+00156\n 00157\n ev_name = new char[strlen(optarg)+1];\n 00158\n strcpy(ev_name, optarg);\n 00159\n }\n 00160\n@@ -11625,44 +10788,51 @@\n case -1:\n break;\n 00179\n 00180\n case \u2019?\u2019:\n 00181\n fprintf(stderr, \"Giving up.\\n\");\n-return 1;\n 00182\n+return 1;\n 00183\n break;\n default:\n 00184\n 00185\n if (!help_flag){\n 00186\n fprintf(stderr, \"unrecognized option %c. Giving up.\\n\", opt_param);\n-00187\n return 1;\n+00187\n 00188\n }\n+\n+Generated by Doxygen\n+\n+\f5.3 options.h\n+\n+179\n+\n 00189\n }\n 00190\n } while (!stop);\n 00191\n if (ev_name==NULL){\n 00192\n 00193\n ev_name = new char[strlen(DEFAULT_EVENT)+1];\n 00194\n strcpy(ev_name, DEFAULT_EVENT);\n 00195\n }\n 00196\n-return 0;\n 00197\n+return 0;\n 00198 }\n 00199\n 00200\n 00201 // print the help message\n 00202 //-----------------------00203 int Coptions::print_help(){\n 00204\n cout \u00ab siscone_package_name() \u00ab \" \" \u00ab siscone_version() \u00ab endl;\n@@ -11685,26 +10855,21 @@\n 00212\n cout \u00ab \" -p , --ptmin=\n endl;\n : set the maximal number of passes (0 for no limit) (\" \u00ab\n 00213\n cout \u00ab \" -n , --npass=\n NPASS_DEFAULT \u00ab \")\" \u00ab endl;\n-: set the event filename (\" \u00ab DEFAULT_EVENT \u00ab \")\" \u00ab endl;\n 00214\n cout \u00ab \" -e , --event=\n-: variable for split--merge: pttilde, mt, pt or Et (pttilde)\"\n+: set the event filename (\" \u00ab DEFAULT_EVENT \u00ab \")\" \u00ab endl;\n 00215\n cout \u00ab \" -s , --sm=\n+: variable for split--merge: pttilde, mt, pt or Et (pttilde)\"\n \u00ab endl;\n-\n-Generated by Doxygen\n-\n-\f5.5 options.h\n-\n 00216\n cout \u00ab endl;\n 00217\n cout \u00ab \"Output flags\" \u00ab endl;\n 00218\n cout \u00ab \" --version\n : show version information\" \u00ab endl;\n@@ -11714,16 +10879,16 @@\n 00220\n cout \u00ab \" -v, --verbose: be verbose (on by default)\" \u00ab endl;\n 00221\n cout \u00ab \" -q, --quiet : be quiet\" \u00ab endl;\n 00222\n cout \u00ab endl;\n 00223\n-00224\n return 0;\n+00224\n 00225 }\n 00226\n 00227\n 00228 // print program version\n 00229 //----------------------00230 int Coptions::print_version(){\n 00231\n cout \u00ab siscone_package_name() \u00ab \" \" \u00ab siscone_version() \u00ab endl;\n@@ -11744,52 +10909,63 @@\n 00239\n cout \u00ab \"Please send bugs or comments to AUTHORS\" \u00ab endl;\n 00240\n return 0;\n 00241\n 00242 }\n \n-5.5 options.h\n+5.3 options.h\n 00001\n-//\n 00002 // File: options.h\n 00003 // Description: management of the cmdline options of the main program\n-//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // For more details, see http://projects.hepforge.org/siscone\n-//\n 00006 //\n-//\n 00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n-//\n 00008 //\n-//\n 00009 // This program is free software; you can redistribute it and/or modify\n-//\n 00010 // it under the terms of the GNU General Public License as published by\n-//\n 00011 // the Free Software Foundation; either version 2 of the License, or\n-//\n 00012 // (at your option) any later version.\n //\n 00013 //\n-//\n 00014 // This program is distributed in the hope that it will be useful,\n-//\n 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-//\n 00017 // GNU General Public License for more details.\n //\n 00018 //\n-//\n 00019 // You should have received a copy of the GNU General Public License\n+\n+Generated by Doxygen\n+\n+//\n+//\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+//\n+//\n+//\n+//\n+\n+//\n //\n+\n+\f180\n+\n+File Documentation\n+\n 00020 // along with this program; if not, write to the Free Software\n //\n 00021 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n 00022 //\n //\n 00023 // $Revision:: 180\n $//\n@@ -11808,63 +10984,54 @@\n 00041\n 00043\n ~Coptions();\n 00044\n 00049\n int parse_options(int argc, char **argv);\n 00050\n-int print_help();\n 00052\n+int print_help();\n 00053\n-00055\n int print_version();\n+00055\n 00056\n // flags\n 00057\n 00058\n int help_flag;\n-00059\n int version_flag;\n-int verbose_flag;\n+00059\n 00060\n+int verbose_flag;\n 00061\n-00062\n // options\n+00062\n 00063\n int N_stop;\n double R;\n 00064\n-\n-Generated by Doxygen\n-\n-185\n-\n-\f186\n-\n-File Documentation\n-\n 00065\n double f;\n double ptmin;\n 00066\n 00067\n char *ev_name;\n-00068\n int npass;\n+00068\n 00069\n 00071\n siscone::Esplit_merge_scale SM_var;\n 00072 };\n 00073\n 00074 #endif\n \n-5.6 sample.cpp\n+5.4 sample.cpp\n 00001\n-//\n 00002 // File: sample.cpp\n+//\n 00003 // Description: example program for the Csiscone class (see documentation)\n //\n 00004 // This file is part of the SISCone project.\n //\n 00005 // For more details, see http://projects.hepforge.org/siscone\n //\n 00006 //\n@@ -11915,14 +11082,19 @@\n 0.7\n 00034 #define f\n 0.5\n 00035 #define f_alt 0.75\n 00036\n 00037 using namespace std;\n 00038 using namespace siscone;\n+\n+Generated by Doxygen\n+\n+\f5.5 spherical.cpp\n+\n 00039\n 00040 int main(){\n 00041\n vector particles;\n // list of particles\n 00042\n Csiscone siscone;\n@@ -11942,29 +11114,29 @@\n 00047\n 00048\n // read particles\n 00049\n FILE *flux;\n 00050\n flux = fopen(\"events/single-event.dat\", \"r\");\n-if (flux==NULL){\n 00051\n+if (flux==NULL){\n 00052\n cerr \u00ab \"cannot read event\" \u00ab endl;\n-return 1;\n 00053\n+return 1;\n 00054\n }\n 00055\n 00056\n N=0;\n-00057\n while (fgets(fline, 512, flux)!=NULL){\n-if (fline[0]!=\u2019#\u2019){ // skip lines beginning with \u2019#\u2019\n+00057\n 00058\n+if (fline[0]!=\u2019#\u2019){ // skip lines beginning with \u2019#\u2019\n 00059\n if (sscanf(fline, \"%le%le%le%le\", &px, &py, &pz, &E)==4){\n 00060\n particles.push_back(Cmomentum(px, py, pz, E));\n 00061\n N++;\n 00062\n@@ -11979,54 +11151,45 @@\n }\n 00067\n }\n 00068\n }\n 00069\n fclose(flux);\n-\n-Generated by Doxygen\n-\n-\f5.7 spherical.cpp\n-\n 00070\n+// compute jets\n 00071\n 00072\n+// first compute with multiple passes (default)\n 00073\n+i=siscone.compute_jets(particles, R, f);\n 00074\n+cout \u00ab \" \" \u00ab i \u00ab \" jets found in multi-pass run\" \u00ab endl;\n 00075\n+// then, recompute it with a different f\n 00076\n 00077\n+i=siscone.recompute_jets(f_alt);\n 00078\n+cout \u00ab \" \" \u00ab i \u00ab \" jets found with alternative f\" \u00ab endl;\n 00079\n 00080\n+// one pass\n 00081\n+i=siscone.compute_jets(particles, R, f, 1);\n 00082\n+cout \u00ab \" \" \u00ab i \u00ab \" jets found in single-pass run\" \u00ab endl;\n 00083\n+// show jets\n 00084\n 00085\n-00086\n-00087\n-\n-187\n-\n-// compute jets\n-// first compute with multiple passes (default)\n-i=siscone.compute_jets(particles, R, f);\n-cout \u00ab \" \" \u00ab i \u00ab \" jets found in multi-pass run\" \u00ab endl;\n-// then, recompute it with a different f\n-i=siscone.recompute_jets(f_alt);\n-cout \u00ab \" \" \u00ab i \u00ab \" jets found with alternative f\" \u00ab endl;\n-// one pass\n-i=siscone.compute_jets(particles, R, f, 1);\n-cout \u00ab \" \" \u00ab i \u00ab \" jets found in single-pass run\" \u00ab endl;\n-\n-// show jets\n vector::iterator it_j;\n+00086\n int i1;\n+00087\n fprintf(stdout, \"#\n pT\n eta\n phi\n px\n py\n \\n\");\n@@ -12042,15 +11205,15 @@\n 00092\n }\n 00093\n 00094\n return 0;\n 00095 }\n \n-5.7 spherical.cpp\n+5.5 spherical.cpp\n 00001\n //\n 00002 // File: spherical.cpp\n 00003 // Description: example program for the CSphsiscone class (spherical SISCone)//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // WARNING: this is not the main SISCone trunk but\n@@ -12080,14 +11243,29 @@\n //\n 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n //\n 00019 // GNU General Public License for more details.\n //\n+\n+Generated by Doxygen\n+\n+181\n+\n+pz\n+\n+it_j->v.pz,\n+\n+E\n+\n+\f182\n+\n+File Documentation\n+\n 00020 //\n //\n 00021 // You should have received a copy of the GNU General Public License\n //\n 00022 // along with this program; if not, write to the Free Software\n //\n 00023 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n@@ -12128,46 +11306,35 @@\n 00047\n double px,py,pz,E;\n // particles 4-momentum\n 00048\n char fline[512];\n // line to read from a file\n 00049\n-// read particles\n 00050\n-\n-Generated by Doxygen\n-\n-pz\n-\n-it_j->v.pz,\n-\n-E\n-\n-\f188\n-\n+// read particles\n 00051\n FILE *flux;\n 00052\n flux = fopen(\"events/single-event.dat\", \"r\");\n-00053\n if (flux==NULL){\n+00053\n 00054\n cerr \u00ab \"cannot read event\" \u00ab endl;\n-00055\n return 1;\n+00055\n 00056\n }\n 00057\n 00058\n N=0;\n-00059\n while (fgets(fline, 512, flux)!=NULL){\n-00060\n+00059\n if (fline[0]!=\u2019#\u2019){ // skip lines beginning with \u2019#\u2019\n+00060\n 00061\n if (sscanf(fline, \"%le%le%le%le\", &px, &py, &pz, &E)==4){\n 00062\n particles.push_back(CSphmomentum(px, py, pz, E));\n 00063\n N++;\n 00064\n@@ -12183,16 +11350,16 @@\n 00069\n }\n 00070\n }\n 00071\n fclose(flux);\n 00072\n-00073\n // compute jets\n+00073\n 00074\n // first compute with multiple passes (default)\n 00075\n i=siscone.compute_jets(particles, R, f);\n 00076\n cout \u00ab \" \" \u00ab i \u00ab \" jets found in multi-pass run\" \u00ab endl;\n 00077\n@@ -12210,51 +11377,56 @@\n 00084\n cout \u00ab \" \" \u00ab i \u00ab \" jets found in single-pass run\" \u00ab endl;\n 00085\n // show jets\n 00086\n 00087\n vector::iterator it_j;\n-int i1;\n 00088\n-00089\n-fprintf(stdout, \"#\n+int i1;\n theta\n phi\n px\n py\n pz\n-for (it_j = siscone.jets.begin(), i1=0 ;\n+00089\n+fprintf(stdout, \"#\n 00090\n+for (it_j = siscone.jets.begin(), i1=0 ;\n 00091\n it_j != siscone.jets.end() ; it_j++, i1++){\n 00092\n fprintf(stdout, \"Jet %3d: %8.3f %8.3f %10.3f %10.3f %10.3f %10.3f\\n\",\n 00093\n i1, it_j->v._theta, it_j->v._phi, it_j->v.px, it_j->v.py, it_j->v.pz,\n 00094\n }\n 00095\n-return 0;\n 00096\n+return 0;\n 00097 }\n \n-File Documentation\n-\n E\n \n \\n\");\n \n it_j->v.E);\n \n-5.8 test.cpp\n+5.6 test.cpp\n 00001\n-//\n 00002 // File: test.cpp\n-00003 // Description: example program that implements tests with random particles //\n+00003 // Description: example program that implements tests with random particles\n+\n+//\n+//\n+\n+Generated by Doxygen\n+\n+\f5.6 test.cpp\n+\n 00004 //\n and output various informations\n //\n 00005 //\n //\n 00006 // Note: for a usage example of SISCone, we advise looking at main.cpp\n //\n@@ -12301,21 +11473,14 @@\n 00027 //\n //\n 00028 // $Revision:: 324\n $//\n 00029 // $Date:: 2011-11-16 12:10:27 +0100 (Wed, 16 Nov 2011)\n $//\n 00031\n-\n-Generated by Doxygen\n-\n-\f5.8 test.cpp\n-\n-189\n-\n 00032 #include \n 00033 #include \n 00034 #include \n 00035 #include \n 00036 #include \n 00037 #include \n 00038\n@@ -12334,48 +11499,48 @@\n 00049 int main(int argc, char* argv[]){\n 00050\n vector particles;\n 00051\n Cmomentum *v;\n double phi=0, eta=0, pt=1;\n 00052\n-00053\n unsigned int N;\n+00053\n 00054\n unsigned int i;\n 00055\n 00056\n FILE *flux;\n 00057\n 00058\n if (argc==1){\n-//cout \u00ab \"using default number of particles\" \u00ab endl;\n 00059\n+//cout \u00ab \"using default number of particles\" \u00ab endl;\n 00060\n N = N_default;\n 00061\n } else {\n 00062\n sscanf(argv[1], \"%u\", &N);\n-00063\n //cout \u00ab \"using \" \u00ab N \u00ab \" particles\" \u00ab endl;\n+00063\n 00064\n }\n 00065\n // Initialise random number generator\n 00066\n 00067\n timeval timestamp;\n 00068\n gettimeofday(×tamp, NULL);\n 00069\n srand(timestamp.tv_usec);\n 00070\n-// build particle list\n 00071\n+// build particle list\n 00072\n cout \u00ab \"build particle list\" \u00ab endl;\n 00073\n flux = fopen(\"particles.dat\", \"w+\");\n for (i=0;i time_start.tv_usec){\n 00053\n time_diff.tv_usec = time_end.tv_usec-time_start.tv_usec;\n 00054\n@@ -12565,36 +11739,31 @@\n 00062\n 00063\n 00064 int main(){\n 00065\n vector particles;\n 00066\n Csiscone siscone;\n-00067\n double eta,phi;\n+00067\n 00068\n-// number of events and particles\n 00069\n+// number of events and particles\n 00070\n int i, N;\n 00071\n int n_ev, part_inc;\n 00072\n // time statistics variables\n 00073\n 00074\n int time_siscone;\n 00075\n-// save files\n 00076\n-\n-Generated by Doxygen\n-\n-\f5.10 area.h\n-\n+// save files\n 00077\n FILE *flux;\n 00078\n // initialise random number generator\n 00079\n 00080\n cout \u00ab \"initialise random number generator\" \u00ab endl;\n@@ -12609,40 +11778,40 @@\n 00086\n flux = fopen(\"times.dat\", \"w+\");\n 00087\n 00088\n N = 1;\n 00089\n part_inc = 1;\n-do{\n 00090\n+do{\n 00091\n fprintf(stdout, \"\\r%5d particles\\n\", N);\n 00092\n time_siscone=0;\n 00093\n 00094\n for (n_ev=0;n_ev\n+00028 #include \n+00029 #include \n+00030 #include \"siscone/momentum.h\"\n+00031 #include \"siscone/siscone.h\"\n+00032 #include \"siscone/area.h\"\n+00033 #include \"options.h\"\n+00034\n+00035 using namespace std;\n+00036 using namespace siscone;\n+00037\n+00038 int main(int argc, char *argv[]){\n+00039\n+vector particles;\n+00040\n+Carea siscone_with_area;\n+int i,N;\n+00041\n+00042\n+double px,py,pz,E;\n+00043\n+Coptions opts;\n+char fline[512];\n+00044\n+00045\n+if (opts.parse_options(argc, argv))\n+00046\n+00047\n+exit(1);\n+00048\n+00049\n+// deal with help message\n+00050\n+if (opts.help_flag){\n+00051\n+opts.print_help();\n+00052\n+exit(0);\n+00053\n+}\n+00054\n+// deal with version flag\n+00055\n+00056\n+if (opts.version_flag){\n+00057\n+opts.print_version();\n+00058\n+exit(0);\n+00059\n+}\n+00060\n+00061\n+// various files used to read input data and store results\n+00062\n+FILE *flux;\n+00063\n+FILE *fpart;\n+00064\n+00065\n+// read particles\n+00066\n+if (opts.verbose_flag) cout \u00ab \"reading particles\" \u00ab endl;\n+00067\n+flux = fopen(opts.ev_name, \"r\");\n+00068\n+if (flux==NULL){\n+00069\n+cerr \u00ab \"cannot read event\" \u00ab endl;\n+00070\n+return 1;\n+00071\n+}\n+00072\n+00073\n+N=0;\n+00074\n+fpart = fopen(\"particles.dat\", \"w+\");\n+00075\n+while ((opts.N_stop!=0) && (fgets(fline, 512, flux)!=NULL)){\n+if (fline[0]!=\u2019#\u2019){ // skip lines beginning with \u2019#\u2019\n+00076\n+00077\n+if (sscanf(fline, \"%le%le%le%le\", &px, &py, &pz, &E)==4){\n+00078\n+particles.push_back(Cmomentum(px, py, pz, E));\n+particles[N].eta, particles[N].phi);\n+00079\n+fprintf(fpart, \"%e\\t%e\\n\",\n+00080\n+N++;\n+00081\n+opts.N_stop--;\n+00082\n+} else {\n+00083\n+cout \u00ab \"error in reading event file Giving up.\" \u00ab endl;\n+00084\n+fclose(flux);\n+00085\n+fclose(fpart);\n+00086\n+exit(2);\n+00087\n+}\n+\n+Generated by Doxygen\n+\n+\f5.9 area.cpp\n+\n+00088\n+}\n+00089\n+}\n+00090\n+fclose(flux);\n+00091\n+fclose(fpart);\n+if (opts.verbose_flag)\n+00092\n+00093\n+cout \u00ab \" working with \" \u00ab N \u00ab \" particles\" \u00ab endl;\n+00094\n+// compute jets\n+00095\n+00096\n+if (opts.verbose_flag) cout \u00ab \"computing jet contents\" \u00ab endl;\n+00097\n+i=siscone_with_area.compute_areas(particles, opts.R, opts.f, opts.npass, opts.SM_var);\n+00098\n+if (opts.verbose_flag){\n+unsigned int pass;\n+00099\n+00100\n+for (pass=0;pass::iterator ja;\n+for (ja=siscone_with_area.jet_areas.begin();ja!=siscone_with_area.jet_areas.end();ja++){\n+00111\n+00112\n+fprintf(flux, \"%e\\t%e\\t%e\\t%e\\t%e\\n\",\n+00113\n+ja->v.perp(), ja->v.eta, ja->v.phi,\n+00114\n+ja->active_area, ja->passive_area);\n+00115\n+}\n+00116\n+00117\n+fclose(flux);\n+00118\n+if (opts.verbose_flag)\n+00119\n+00120\n+cout \u00ab \"bye...\" \u00ab endl;\n+00121\n+return 0;\n+00122\n+00123 }\n+\n+5.9 area.cpp\n+00001 // -*- C++ -*00003 // File: area.h\n+//\n+00004 // Description: header file for the computation of jet area\n+//\n+00005 // This file is part of the SISCone project.\n+//\n+00006 // For more details, see http://projects.hepforge.org/siscone\n+//\n+00007 //\n+//\n+00008 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n+//\n+00009 //\n+//\n+00010 // This program is free software; you can redistribute it and/or modify\n+//\n+00011 // it under the terms of the GNU General Public License as published by\n+//\n+00012 // the Free Software Foundation; either version 2 of the License, or\n+//\n+00013 // (at your option) any later version.\n+//\n+00014 //\n+//\n+00015 // This program is distributed in the hope that it will be useful,\n+//\n+00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+//\n+00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+//\n+00018 // GNU General Public License for more details.\n+//\n+00019 //\n+//\n+00020 // You should have received a copy of the GNU General Public License\n+//\n+00021 // along with this program; if not, write to the Free Software\n+//\n+00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n+00023 //\n+//\n+00024 // $Revision:: 149\n+$//\n+00025 // $Date:: 2007-03-15 00:13:58 +0100 (Thu, 15 Mar 2007)\n+$//\n+00027\n+00028 #include \"area.h\"\n+00029 #include \"momentum.h\"\n+00030 #include \n+00031 #include \n+00032\n+00033 namespace siscone{\n+00034 using namespace std;\n+00035\n+00036 /*******************************************************\n+00037 * Cjet_area implementation\n+*\n+00038 * real Jet information, including its area(s)\n+*\n+00039 *\n+*\n+00040 * This class contains information for one single jet. *\n+00041 * That is, first, its momentum carrying information\n+*\n+00042 * about its centre and pT, and second, its particle\n+*\n+00043 * contents (from CJeT).\n+*\n+\n+Generated by Doxygen\n+\n+187\n+\n+\f188\n+\n+File Documentation\n+\n+00044 * Compared to the Cjet class, it also includes the\n+*\n+00045 * passive and active areas of the jet computed using *\n+00046 * the Carea class.\n+*\n+00047 *******************************************************/\n+00048\n+00049 // default ctor\n+00050 //-------------00051 Cjet_area::Cjet_area(){\n+00052\n+active_area = passive_area = 0.0;\n+00053 }\n+00054\n+00055 // jet-initiated ctor\n+00056 //------------------00057 Cjet_area::Cjet_area(Cjet &j){\n+00058\n+v = j.v;\n+00059\n+n = j.n;\n+00060\n+contents = j.contents;\n+00061\n+00062\n+pass = j.pass;\n+00063\n+00064\n+pt_tilde = j.pt_tilde;\n+00065\n+sm_var2 = j.sm_var2;\n+00066\n+00067\n+active_area = passive_area = 0.0;\n+00068 }\n+00069\n+00070 // default dtor\n+00071 //-------------00072 Cjet_area::~Cjet_area(){\n+00073\n+00074 }\n+00075\n+00076\n+00077 /******************************************************************\n+00078 * Csiscone_area implementation\n+*\n+00079 * class for the computation of jet areas.\n+*\n+00080 *\n+*\n+00081 * This is the class user should use whenever you want to compute *\n+00082 * the jet area (passive and active).\n+*\n+00083 * It uses the SISCone algorithm to perform the jet analysis.\n+*\n+00084 ******************************************************************/\n+00085\n+00086 // default ctor\n+00087 //------------00088 Carea::Carea(){\n+00089\n+grid_size = 60;\n+// 3600 particles added\n+00090\n+grid_eta_max = 6.0; // maybe having twice more points in eta than in phi should be nice\n+00091\n+grid_shift = 0.5;\n+// 50% \"shacking\"\n+00092\n+00093\n+pt_soft = 1e-100;\n+00094\n+pt_shift = 0.05;\n+00095\n+pt_soft_min = 1e-90;\n+00096 }\n+00097\n+00098 // default dtor\n+00099 //------------00100 Carea::~Carea(){\n+00101\n+00102 }\n+00103\n+00104 /*\n+00105 * compute the jet areas from a given particle set.\n+00106 * The parameters of this method are the ones which control the jet clustering alghorithm.\n+00107 * Note that the pt_min is not allowed here soince the jet-area determination involves soft\n+00108 * particles/jets and thus is used internally.\n+00109 * - _particles\n+list of particles\n+00110 * - _radius\n+cone radius\n+shared energy threshold for splitting&merging\n+00111 * - _f\n+00112 * - _n_pass_max maximum number of passes (0=full search, the default)\n+the scale choice for the split-merge procedure\n+00113 * - _split_merge_scale\n+00114 *\n+NOTE: SM_pt leads to IR unsafety for some events with momentum conservation.\n+SM_Et is IR safe but not boost invariant and not implemented(!)\n+00115 *\n+00116 *\n+SM_mt is IR safe for hadronic events, but not for decays of two\n+00117 *\n+back-to-back particles of identical mass\n+SM_pttilde\n+00118 *\n+00119 *\n+is always IR safe, and also boost invariant (default)\n+when this is set on, only hard jets are computed\n+00120 * - _hard_only\n+00121 *\n+and not the purely ghosted jets (default: false)\n+00122 * return the jets together with their areas\n+00123 * The return value is the number of jets (including pure-ghost ones if they are included)\n+00124 ********************************************************************************************/\n+00125 int Carea::compute_areas(std::vector &_particles, double _radius, double _f,\n+int _n_pass_max, Esplit_merge_scale _split_merge_scale,\n+00126\n+00127\n+bool _hard_only){\n+00128\n+00129\n+vector all_particles;\n+00130\n+\n+Generated by Doxygen\n+\n+\f5.9 area.cpp\n+\n+00131\n+00132\n+00133\n+00134\n+00135\n+00136\n+00137\n+00138\n+00139\n+00140\n+00141\n+00142\n+00143\n+00144\n+00145\n+00146\n+00147\n+00148\n+00149\n+00150\n+00151\n+00152\n+00153\n+00154\n+\n+189\n+\n+// put \"hardest cut-off\" if needed\n+// this avoids computation of ghosted jets when not required and\n+// significantly shortens the SM.\n+if (_hard_only){\n+SM_var2_hardest_cut_off = pt_soft_min*pt_soft_min;\n+}\n+// clear potential previous runs\n+jet_areas.clear();\n+// put initial set of particles in the list\n+int n_hard = _particles.size();\n+all_particles = _particles;\n+// build the set of ghost particles and add them to the particle list\n+int i,j;\n+double eta_g,phi_g,pt_g;\n+for (i=0;i= n_hard\n+00167\n+// and deduce the number of ghosts in the jet, hence the area.\n+00168\n+double area_factor = (2.0*grid_eta_max/grid_size)*(twopi/grid_size);\n+00169\n+for (i=0;i<(int) jets.size();i++){\n+00170\n+00171\n+jet_areas.push_back(jets[i]);\n+00172\n+j=0;\n+00173\n+while ((j &_particles, double _radius, double _f,\n+int _n_pass_max, Esplit_merge_scale _split_merge_scale){\n+00218\n+00219\n+00220\n+vector all_particles;\n+00221\n+00222\n+// in the case of passive area, we do not need\n+00223\n+// to put the ghosts in the stable-cone search\n+00224\n+// (they do no influence the list of stable cones)\n+00225\n+// Here\u2019s how it goes...\n+00226\n+stable_cone_soft_pt2_cutoff = pt_soft_min*pt_soft_min;\n+00227\n+// clear potential previous runs\n+00228\n+00229\n+jet_areas.clear();\n+00230\n+// put initial set of particles in the list\n+00231\n+00232\n+int n_hard = _particles.size();\n+00233\n+all_particles = _particles;\n+00234\n+00235\n+// build the set of ghost particles and add them to the particle list\n+00236\n+int i,j;\n+double eta_g,phi_g,pt_g;\n+00237\n+00238\n+00239\n+for (i=0;i= n_hard\n+00257\n+// and deduce the number of ghosts in the jet, hence the area.\n+00258\n+double area_factor = (2.0*grid_eta_max/grid_size)*(twopi/grid_size);\n+00259\n+for (i=0;i<(int) jets.size();i++){\n+00260\n+j=0;\n+while ((j &_particles, double _radius, double _f,\n+00292\n+int _n_pass_max, Esplit_merge_scale _split_merge_scale,\n+bool _hard_only){\n+00293\n+00294\n+00295\n+vector all_particles;\n+00296\n+00297\n+// put \"hardest cut-off\" if needed\n+00298\n+// this avoids computation of ghosted jets when not required and\n+00299\n+// significantly shortens the SM.\n+00300\n+if (_hard_only){\n+00301\n+SM_var2_hardest_cut_off = pt_soft_min*pt_soft_min;\n+00302\n+}\n+\n+Generated by Doxygen\n+\n+\f5.10 area.h\n+\n+00303\n+00304\n+00305\n+00306\n+00307\n+00308\n+00309\n+00310\n+00311\n+00312\n+00313\n+00314\n+00315\n+00316\n+00317\n+00318\n+00319\n+00320\n+\n+191\n+\n+// clear potential previous runs\n+jet_areas.clear();\n+// put initial set of particles in the list\n+int n_hard = _particles.size();\n+all_particles = _particles;\n+// build the set of ghost particles and add them to the particle list\n+int i,j;\n+double eta_g,phi_g,pt_g;\n+for (i=0;i= n_hard\n+00333\n+// and deduce the number of ghosts in the jet, hence the area.\n+00334\n+double area_factor = (2.0*grid_eta_max/grid_size)*(twopi/grid_size);\n+00335\n+for (i=0;i<(int) jets.size();i++){\n+00336\n+00337\n+jet_areas.push_back(jets[i]);\n+00338\n+j=0;\n+00339\n+while ((j &_particles, double _radius, double _f,\n-00101\n int _n_pass_max=0, Esplit_merge_scale _split_merge_scale=SM_pttilde,\n-bool _hard_only=false);\n+00101\n 00102\n+bool _hard_only=false);\n 00103\n int compute_active_areas(std::vector &_particles, double _radius, double _f,\n 00112\n-00113\n int _n_pass_max=0, Esplit_merge_scale _split_merge_scale=SM_pttilde,\n+00113\n 00114\n bool _hard_only=false);\n 00115\n int compute_passive_areas(std::vector &_particles, double _radius, double _f,\n 00123\n-int _n_pass_max=0, Esplit_merge_scale _split_merge_scale=SM_pttilde);\n 00124\n+int _n_pass_max=0, Esplit_merge_scale _split_merge_scale=SM_pttilde);\n 00125\n int grid_size;\n 00126\n-00127\n double grid_eta_max;\n+00127\n 00128\n double grid_shift;\n 00129\n double pt_soft;\n 00130\n-double pt_shift;\n 00131\n-00132\n+double pt_shift;\n double pt_soft_min;\n+00132\n 00133\n 00135\n std::vector jet_areas;\n 00136 };\n 00137\n 00138 }\n 00139 #endif\n@@ -12855,36 +12861,36 @@\n $//\n 00027\n 00028 #ifndef __CIRCULATOR_H__\n 00029 #define __CIRCULATOR_H__\n 00030\n 00031 namespace siscone{\n 00032\n+00036 template class circulator {\n \n Generated by Doxygen\n \n \f5.12 config.h\n \n 193\n \n-00036 template class circulator {\n 00037\n 00038 public:\n-inline circulator(T here, T begin, T end) : m_here(here), m_begin(begin), m_end(end) {}\n 00043\n+inline circulator(T here, T begin, T end) : m_here(here), m_begin(begin), m_end(end) {}\n 00044\n-00047\n inline circulator(const circulator & other) : m_here(other.m_here), m_begin(other.m_begin),\n+00047\n m_end(other.m_end) {}\n 00048\n-void set_position(const circulator & other) {m_here = other.m_here;}\n 00051\n+void set_position(const circulator & other) {m_here = other.m_here;}\n 00052\n-00055\n void set_position(T pointer) {m_here = pointer;}\n+00055\n 00056\n 00058\n T operator()() {return m_here;}\n 00059\n inline circulator & operator++() {\n 00061\n 00062\n@@ -12894,20 +12900,20 @@\n 00064\n return *this;\n 00065\n }\n 00066\n 00068\n inline circulator & operator--() {\n-00069\n if (m_here == m_begin) m_here = m_end;\n+00069\n 00070\n --m_here;\n-return *this;\n 00071\n+return *this;\n 00072\n }\n 00073\n 00077\n bool operator==(const circulator & other)const {return m_here == other.m_here;}\n 00078\n bool operator!=(const circulator & other)const {return m_here != other.m_here;}\n@@ -12965,24 +12971,24 @@\n 00037\n 00038 /* Define to 1 if you have the header file. */\n 00039 #ifndef SISCONE_HAVE_STRINGS_H\n 00040 #define SISCONE_HAVE_STRINGS_H 1\n 00041 #endif\n 00042\n 00043 /* Define to 1 if you have the header file. */\n+00044 #ifndef SISCONE_HAVE_STRING_H\n \n Generated by Doxygen\n \n */\n \n \f194\n \n File Documentation\n \n-00044 #ifndef SISCONE_HAVE_STRING_H\n 00045 #define SISCONE_HAVE_STRING_H 1\n 00046 #endif\n 00047\n 00048 /* Define to 1 if you have the header file. */\n 00049 #ifndef SISCONE_HAVE_SYS_STAT_H\n 00050 #define SISCONE_HAVE_SYS_STAT_H 1\n 00051 #endif\n@@ -13054,27 +13060,27 @@\n 00117 #define SISCONE_VERSION \"3.0.5\"\n 00118 #endif\n 00119\n 00120 /* once: _SISCONE_CONFIG_H */\n 00121 #endif\n \n 5.13 config_raw.h\n-00001 /* siscone/config_raw.h.\n Generated from config.h.in by configure.\n+00001 /* siscone/config_raw.h.\n 00002 /* config.h.in.\n Generated from configure.ac by autoheader.\n */\n+00003\n \n */\n \n Generated by Doxygen\n \n \f5.13 config_raw.h\n \n-00003\n 00004 /* Define to 1 if you have the header file. */\n 00005 #define HAVE_DLFCN_H 1\n 00006\n 00007 /* Define to 1 if you have the header file. */\n 00008 #define HAVE_INTTYPES_H 1\n 00009\n 00010 /* Define to 1 if you have the \u2018m\u2019 library (-lm). */\n@@ -13402,15 +13408,15 @@\n 00052 //#define USE_QUADTREE_FOR_STABILITY_TEST\n 00053\n 00054\n 00061 #define PT_TSHOLD 1000.0\n \n Generated by Doxygen\n \n-\f5.16 geom_2d.cpp\n+\f5.16 geom_2d.h\n \n 00062\n 00063\n 00075 #define EPSILON_COLLINEAR 1e-8\n 00076\n 00077\n 00082 #define EPSILON_COCIRCULAR 1e-12\n@@ -13436,556 +13442,349 @@\n 00123 #define DEBUG_STABLE_CONES\n 00124 #define DEBUG_SPLIT_MERGE\n 00125 #endif\n 00126\n 00127 #endif // __DEFINES_H__\n 00128\n \n-5.16 geom_2d.cpp\n-00001\n-00002 // File: geom_2d.cpp\n+5.16 geom_2d.h\n+00001 // -*- C++ -*00003 // File: geom_2d.h\n //\n-00003 // Description: source file for two-dimensional geometry tools\n+00004 // Description: header file for two-dimensional geometry tools\n //\n-00004 // This file is part of the SISCone project.\n+00005 // This file is part of the SISCone project.\n //\n-00005 // For more details, see http://projects.hepforge.org/siscone\n+00006 // For more details, see http://projects.hepforge.org/siscone\n //\n-00006 //\n+00007 //\n //\n-00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n+00008 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n //\n-00008 //\n+00009 //\n //\n-00009 // This program is free software; you can redistribute it and/or modify\n+00010 // This program is free software; you can redistribute it and/or modify\n //\n-00010 // it under the terms of the GNU General Public License as published by\n+00011 // it under the terms of the GNU General Public License as published by\n //\n-00011 // the Free Software Foundation; either version 2 of the License, or\n+00012 // the Free Software Foundation; either version 2 of the License, or\n //\n-00012 // (at your option) any later version.\n+00013 // (at your option) any later version.\n //\n-00013 //\n+00014 //\n //\n-00014 // This program is distributed in the hope that it will be useful,\n+00015 // This program is distributed in the hope that it will be useful,\n //\n-00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n-00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n //\n-00017 // GNU General Public License for more details.\n+00018 // GNU General Public License for more details.\n //\n-00018 //\n+00019 //\n //\n-00019 // You should have received a copy of the GNU General Public License\n+00020 // You should have received a copy of the GNU General Public License\n //\n-00020 // along with this program; if not, write to the Free Software\n+00021 // along with this program; if not, write to the Free Software\n //\n-00021 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n-00022 //\n+00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n+00023 //\n //\n-00023 // $Revision:: 171\n+00024 // $Revision:: 422\n $//\n-00024 // $Date:: 2007-06-19 16:26:05 +0200 (Tue, 19 Jun 2007)\n+00025 // $Date:: 2020-04-22 11:51:09 +0200 (Wed, 22 Apr 2020)\n $//\n-00026\n-00027 #include \"geom_2d.h\"\n-00028 #include \n-00029\n-00030 namespace siscone{\n-00031\n-00032 #define PHI_RANGE_MASK 0xFFFFFFFF\n-00033\n-00034 /*********************************************************\n-00035 * class Ceta_phi_range implementation\n-*\n-00036 * class for holding a covering range in eta-phi\n-*\n-00037 *\n-*\n-00038 * This class deals with ranges in the eta-phi plane. It *\n-00039 * implements methods to test if two ranges overlap and *\n-00040 * to take the union of two overlapping intervals.\n-*\n-00041 *********************************************************/\n-00042\n-00043 using namespace std;\n+00027\n+00028 #ifndef __GEOM_2D_H__\n+00029 #define __GEOM_2D_H__\n+00030\n+00031 #include \n+00032 #include \n+00033 #include \"defines.h\"\n+00034\n+00035 #ifndef M_PI\n+00036 #define M_PI 3.141592653589793238462643383279502884197\n+00037 #endif\n+00038\n+00039 namespace siscone{\n+00040\n+00043 inline double phi_in_range(double phi) {\n 00044\n-00045 // static member default init\n-00046 //---------------------------00047 double Ceta_phi_range::eta_min = -100.0;\n-00048 double Ceta_phi_range::eta_max = 100.0;\n-00049\n-00050 // default ctor\n+if\n+(phi <= -M_PI) phi += twopi;\n+else if (phi >\n+M_PI) phi -= twopi;\n+00045\n+00046\n+return phi;\n+00047 }\n+00048\n+00052 inline double dphi(double phi1, double phi2) {\n+00053\n+return phi_in_range(phi1-phi2);\n+00054 }\n+00055\n+00056\n \n Generated by Doxygen\n \n 199\n \n \f200\n \n File Documentation\n \n-00051 //-------------00052 Ceta_phi_range::Ceta_phi_range(){\n-00053\n-eta_range = 0;\n-00054\n-phi_range = 0;\n-00055 }\n-00056\n-00057 // ctor with initialisation\n-00058 // we initialise with a centre (in eta,phi) and a radius\n-00059 // - c_eta\n-eta coordinate of the centre\n-00060 // - c_phi\n-phi coordinate of the centre\n-00061 // - R\n-radius\n-00062 //------------------------------------------------------00063 Ceta_phi_range::Ceta_phi_range(double c_eta, double c_phi, double R){\n-// determination of the eta range\n+00060 inline double abs_dphi(double phi1, double phi2) {\n+double delta = fabs(phi1-phi2);\n+00061\n+00062\n+return delta > M_PI ? twopi-delta : delta;\n+00063 }\n 00064\n-00065\n-//------------------------------00066\n-double xmin = max(c_eta-R,eta_min+0.0001);\n+00066 inline double pow2(double x) {return x*x;}\n 00067\n-double xmax = min(c_eta+R,eta_max-0.0001);\n 00068\n-unsigned int cell_min = get_eta_cell(xmin);\n-00069\n-00070\n-unsigned int cell_max = get_eta_cell(xmax);\n-00071\n-// warning: if cell_max==2^31, 2*cell_max==0 hence,\n-00072\n-00073\n-// even if the next formula is formally (2*cell_max-cell_min),\n-00074\n-// expressing it as (cell_max-cell_min)+cell_max is safe.\n-00075\n-eta_range = (cell_max-cell_min)+cell_max;\n+00073 class Ctwovect {\n+00074 public:\n 00076\n-// determination of the phi range\n+Ctwovect() : x(0.0), y(0.0) {}\n 00077\n-00078\n-// !! taking care of periodicity !!\n-00079\n-//--------------------------------00080\n-xmin = phi_in_range(c_phi-R);\n 00081\n-xmax = phi_in_range(c_phi+R);\n+Ctwovect(double _x, double _y) : x(_x), y(_y) {}\n 00082\n-00083\n-cell_min = get_phi_cell(xmin);\n+double x, y;\n 00084\n-cell_max = get_phi_cell(xmax);\n 00085\n-// Also, if the interval goes through pi, inversion is needed\n-00086\n+inline double mod2()const {return pow2(x)+pow2(y);}\n 00087\n-if (xmax>xmin)\n 00088\n-phi_range = (cell_max-cell_min)+cell_max;\n-else {\n-00089\n+inline double modulus()const {return sqrt(mod2());}\n 00090\n-phi_range = (cell_min==cell_max)\n-00091\n-? PHI_RANGE_MASK\n+00091 };\n 00092\n-: ((PHI_RANGE_MASK^(cell_min-cell_max)) + cell_max);\n 00093\n-}\n-00094 }\n-00095\n-00096 // assignment of range\n-00097 // - r\n-range to assign to current one\n-00098 //--------------------------------------00099 Ceta_phi_range& Ceta_phi_range::operator = (const Ceta_phi_range &r){\n-00100\n-eta_range = r.eta_range;\n+00098 inline double dot_product(const Ctwovect & a, const Ctwovect & b) {\n+return a.x*b.x + a.y*b.y;\n+00099\n+00100 }\n 00101\n-phi_range = r.phi_range;\n 00102\n-return *this;\n-00103\n-00104 }\n-00105\n-00106 // add a particle to the range\n-00107 // - eta eta coordinate of the particle\n-00108 // - phi phi coordinate of the particle\n-00109 // \\return 0 on success, 1 on error\n-00110 //---------------------------------------00111 int Ceta_phi_range::add_particle(const double eta, const double phi){\n-// deal with the eta coordinate\n-00112\n-00113\n-eta_range |= get_eta_cell(eta);\n-00114\n-// deal with the phi coordinate\n-00115\n-00116\n-phi_range |= get_phi_cell(phi);\n-00117\n-00118\n-return 0;\n-00119 }\n-00120\n-00121\n-00122 // test overlap\n-00123 // - r1 first range\n-00124 // - r2 second range\n-00125 // return true if overlap, false otherwise.\n-00126 //-----------------------------------------00127 bool is_range_overlap(const Ceta_phi_range &r1, const Ceta_phi_range &r2){\n-// check overlap in eta AND phi\n-00128\n-00129\n-return ((r1.eta_range & r2.eta_range) && (r1.phi_range & r2.phi_range));\n-00130 }\n+00107 inline double cross_product(const Ctwovect & a, const Ctwovect & b) {\n+00108\n+return a.x*b.y - a.y*b.x;\n+00109 }\n+00110\n+00111\n+00120 class Ceta_phi_range{\n+00121 public:\n+00123\n+Ceta_phi_range();\n+00124\n+00130\n+Ceta_phi_range(double c_eta, double c_phi, double R);\n 00131\n-00132 // compute union\n-00133 // Note: we assume that the two intervals overlap\n-00134 // - r1 first range\n-00135 // - r2 second range\n-00136 // \\return union of the two ranges\n-00137 //------------------------------------------\n-\n-Generated by Doxygen\n-\n-\f5.17 geom_2d.cpp\n-\n-00138 const Ceta_phi_range range_union (const Ceta_phi_range &r1, const Ceta_phi_range &r2){\n-00139\n-Ceta_phi_range tmp;\n+00134\n+Ceta_phi_range& operator = (const Ceta_phi_range &r);\n+00135\n+int add_particle(const double eta, const double phi);\n 00140\n-// compute union in eta\n 00141\n-00142\n-tmp.eta_range = r1.eta_range | r2.eta_range;\n+unsigned int eta_range;\n 00143\n-// compute union in phi\n 00144\n-00145\n-tmp.phi_range = r1.phi_range | r2.phi_range;\n+unsigned int phi_range;\n 00146\n-return tmp;\n 00147\n-00148 }\n+// extremal value for eta\n+00148\n 00149\n-00150 }\n+static double eta_min;\n+00150\n+static double eta_max;\n+00151\n+00152 private:\n+inline unsigned int get_eta_cell(double eta){\n+00154\n+00155\n+return (unsigned int) (1u \u00ab ((int) (32*((eta-eta_min)/(eta_max-eta_min)))));\n+00156\n+}\n+00157\n+00159\n+inline unsigned int get_phi_cell(double phi){\n+return (unsigned int) (1u \u00ab ((int) (32*phi/twopi+16)%32));\n+00160\n+00161\n+}\n+00162 };\n+00163\n+00168 bool is_range_overlap(const Ceta_phi_range &r1, const Ceta_phi_range &r2);\n+00169\n+00175 const Ceta_phi_range range_union(const Ceta_phi_range &r1, const Ceta_phi_range &r2);\n+00176\n+00177 }\n+00178\n+00179 #endif\n \n-5.17 geom_2d.cpp\n-00001\n+5.17 geom_2d.h\n+00001 // -*- C++ -*00003 // File: geom_2d.h\n+00004 // Description: header file for two-dimensional geometry tools\n+00005 // This file is part of the SISCone project.\n //\n-00002 // File: geom_2d.cpp\n-00003 // Description: source file for two-dimensional geometry tools\n+00006 // WARNING: this is not the main SISCone trunk but\n+00007 //\n+an adaptation to spherical coordinates\n+00008 // For more details, see http://projects.hepforge.org/siscone\n+00009 //\n+00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n+00011 //\n+00012 // This program is free software; you can redistribute it and/or modify\n+00013 // it under the terms of the GNU General Public License as published by\n+\n //\n-00004 // This file is part of the SISCone project.\n //\n-00005 // WARNING: this is not the main SISCone trunk but\n+\n //\n-00006 //\n-an adaptation to spherical coordinates\n //\n-00007 // For more details, see http://projects.hepforge.org/siscone\n //\n-00008 //\n //\n-00009 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n //\n-00010 //\n //\n-00011 // This program is free software; you can redistribute it and/or modify\n //\n-00012 // it under the terms of the GNU General Public License as published by\n //\n-00013 // the Free Software Foundation; either version 2 of the License, or\n+\n+Generated by Doxygen\n+\n+\f5.18 hash.cpp\n+\n+201\n+\n+00014 // the Free Software Foundation; either version 2 of the License, or\n //\n-00014 // (at your option) any later version.\n+00015 // (at your option) any later version.\n //\n-00015 //\n+00016 //\n //\n-00016 // This program is distributed in the hope that it will be useful,\n+00017 // This program is distributed in the hope that it will be useful,\n //\n-00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n-00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n //\n-00019 // GNU General Public License for more details.\n+00020 // GNU General Public License for more details.\n //\n-00020 //\n+00021 //\n //\n-00021 // You should have received a copy of the GNU General Public License\n+00022 // You should have received a copy of the GNU General Public License\n //\n-00022 // along with this program; if not, write to the Free Software\n+00023 // along with this program; if not, write to the Free Software\n //\n-00023 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n-00024 //\n+00024 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n+00025 //\n //\n-00025 // $Revision:: 378\n+00026 // $Revision:: 422\n $//\n-00026 // $Date:: 2016-02-24 15:10:38 +0100 (Wed, 24 Feb 2016)\n+00027 // $Date:: 2020-04-22 11:51:09 +0200 (Wed, 22 Apr 2020)\n $//\n-00028\n-00029 #include \"geom_2d.h\"\n-00030 #include \n-00031\n-00032 namespace siscone_spherical{\n-00033\n-00034 #define PHI_RANGE_MASK 0xFFFFFFFF\n-00035\n-00036 /*********************************************************\n-00037 * class CSphtheta_phi_range implementation\n-*\n-00038 * class for holding a covering range in eta-phi\n-*\n-00039 *\n-*\n-00040 * This class deals with ranges in the eta-phi plane. It *\n-00041 * implements methods to test if two ranges overlap and *\n-00042 * to take the union of two overlapping intervals.\n-*\n-00043 *********************************************************/\n-00044\n-00045 using namespace std;\n-00046\n-00047 // static member default init\n-00048 //---------------------------00049 double CSphtheta_phi_range::theta_min = 0.0;\n-00050 double CSphtheta_phi_range::theta_max = M_PI;\n-00051\n-00052 // default ctor\n-00053 //-------------00054 CSphtheta_phi_range::CSphtheta_phi_range(){\n+00029\n+00030 #ifndef __SPH_GEOM_2D_H__\n+00031 #define __SPH_GEOM_2D_H__\n+00032\n+00033 #include \n+00034 #include \n+00035 #include \n+00036 #include \n+00037\n+00038 #ifndef M_PI\n+00039 #define M_PI 3.141592653589793238462643383279502884197\n+00040 #endif\n+00041\n+00042 namespace siscone_spherical{\n+00043\n+00052 class CSphtheta_phi_range{\n+00053 public:\n 00055\n-theta_range = 0;\n+CSphtheta_phi_range();\n 00056\n-phi_range = 0;\n-00057 }\n-00058\n-00059 // ctor with initialisation\n-00060 // we initialise with a centre (in eta,phi) and a radius\n-00061 // - c_theta theta coordinate of the centre\n-00062 // - c_phi\n-phi coordinate of the centre\n-00063 // - R\n-radius\n-00064 //------------------------------------------------------00065 CSphtheta_phi_range::CSphtheta_phi_range(double c_theta, double c_phi, double R){\n-\n-Generated by Doxygen\n-\n-201\n-\n-\f202\n-\n-File Documentation\n-\n+00062\n+CSphtheta_phi_range(double c_theta, double c_phi, double R);\n+00063\n 00066\n-// determination of the eta range\n+CSphtheta_phi_range& operator = (const CSphtheta_phi_range &r);\n 00067\n-//------------------------------00068\n-double xmin = max(c_theta-R,theta_min+0.00001);\n-double xmax = min(c_theta+R,theta_max-0.00001);\n-00069\n-00070\n-00071\n-unsigned int cell_min = get_theta_cell(xmin);\n-unsigned int cell_max = get_theta_cell(xmax);\n+int add_particle(const double theta, const double phi);\n 00072\n 00073\n-// warning: if cell_max==2^31, 2*cell_max==0 hence,\n-00074\n 00075\n-// even if the next formula is formally (2*cell_max-cell_min),\n+unsigned int theta_range;\n 00076\n-// expressing it as (cell_max-cell_min)+cell_max is safe.\n-00077\n-theta_range = (cell_max-cell_min)+cell_max;\n+unsigned int phi_range;\n 00078\n-// determination of the phi range\n 00079\n-00080\n-// !! taking care of periodicity !!\n+static double theta_min;\n 00081\n-// !! and the theta dependence\n-!!\n+static double theta_max;\n 00082\n-//--------------------------------00083\n-double ymin,ymax;\n-double extra = asin(R/M_PI);\n-00084\n-00085\n-// if the theta range comes too close to the endpoints (theta=0 or\n+00083\n+00084 private:\n+inline unsigned int get_theta_cell(double theta){\n 00086\n-// theta=pi), then keep the full phi range\n 00087\n-if (xmin<=theta_min+extra){\n+if (theta>=theta_max) return 1u\u00ab31;\n+return (unsigned int) (1u \u00ab ((int) (32*((theta-theta_min)/(theta_max-theta_min)))));\n 00088\n-ymin = -M_PI+0.00001;\n 00089\n-ymax = M_PI-0.00001;\n+}\n 00090\n-} else if (xmax>=theta_max-extra){\n-00091\n-ymin = -M_PI+0.00001;\n 00092\n-ymax = M_PI-0.00001;\n+inline unsigned int get_phi_cell(double phi){\n 00093\n-} else {\n+return (unsigned int) (1u \u00ab ((int) (32*phi/twopi+16)%32));\n 00094\n-extra = max(1.0/sin(xmin), 1.0/sin(xmax));\n-00095\n-ymin = (c_phi-R)*extra;\n-00096\n-while (ymin<-M_PI) ymin+=twopi;\n-00097\n-while (ymin> M_PI) ymin-=twopi;\n-00098\n-ymax = (c_phi-R)*extra;\n-while (ymax<-M_PI) ymax+=twopi;\n-00099\n-while (ymax> M_PI) ymax-=twopi;\n-00100\n-00101\n }\n+00095 };\n+00096\n+00101 bool is_range_overlap(const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2);\n 00102\n-cell_min = get_phi_cell(ymin);\n-00103\n-cell_max = get_phi_cell(ymax);\n-00104\n-// Also, if the interval goes through pi, inversion is needed\n-00105\n-00106\n-if (ymax>ymin)\n-00107\n-phi_range = (cell_max-cell_min)+cell_max;\n-else {\n-00108\n+00108 const CSphtheta_phi_range range_union(const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2);\n 00109\n-phi_range = (cell_min==cell_max)\n-00110\n-? PHI_RANGE_MASK\n+00110 }\n 00111\n-: ((PHI_RANGE_MASK^(cell_min-cell_max)) + cell_max);\n-00112\n-}\n-00113 }\n-00114\n-00115 // assignment of range\n-00116 // - r\n-range to assign to current one\n-00117 //--------------------------------------00118 CSphtheta_phi_range& CSphtheta_phi_range::operator = (const CSphtheta_phi_range &r){\n-00119\n-theta_range = r.theta_range;\n-00120\n-phi_range = r.phi_range;\n-00121\n-return *this;\n-00122\n-00123 }\n-00124\n-00125 // add a particle to the range\n-00126 // - eta eta coordinate of the particle\n-00127 // - phi phi coordinate of the particle\n-00128 // \\return 0 on success, 1 on error\n-00129 //---------------------------------------00130 int CSphtheta_phi_range::add_particle(const double theta, const double phi){\n-// get the theta cell\n-00131\n-00132\n-unsigned int theta_cell = get_theta_cell(theta);\n-00133\n-// deal with the eta coordinate\n-00134\n-00135\n-theta_range |= theta_cell;\n-00136\n-// deal with the phi coordinate\n-00137\n-00138\n-//\n-00139\n-// watch out: if the theta_cell includes theta==0 or theta==pi,\n-00140\n-// incude the full phi range\n-00141\n-if ((theta_cell == 0x1) || (theta_cell == 0x80000000))\n-00142\n-phi_range = 0xffffffff;\n-else\n-00143\n-00144\n-phi_range |= get_phi_cell(phi);\n-00145\n-return 0;\n-00146\n-00147 }\n-00148\n-00149\n-00150 // test overlap\n-00151 // - r1 first range\n-00152 // - r2 second range\n-\n-Generated by Doxygen\n-\n-\f5.18 hash.cpp\n-\n-203\n-\n-00153 // return true if overlap, false otherwise.\n-00154 //-----------------------------------------00155 bool is_range_overlap(const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2){\n-// check overlap in eta AND phi\n-00156\n-00157\n-return ((r1.theta_range & r2.theta_range) && (r1.phi_range & r2.phi_range));\n-00158 }\n-00159\n-00160 // compute union\n-00161 // Note: we assume that the two intervals overlap\n-00162 // - r1 first range\n-00163 // - r2 second range\n-00164 // \\return union of the two ranges\n-00165 //-----------------------------------------00166 const CSphtheta_phi_range range_union (const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2){\n-00167\n-CSphtheta_phi_range tmp;\n-00168\n-00169\n-// compute union in eta\n-00170\n-tmp.theta_range = r1.theta_range | r2.theta_range;\n-00171\n-// compute union in phi\n-00172\n-00173\n-tmp.phi_range = r1.phi_range | r2.phi_range;\n-00174\n-00175\n-return tmp;\n-00176 }\n-00177\n-00178 }\n+00112 #endif\n \n 5.18 hash.cpp\n 00001\n-//\n 00002 // File: hash.cpp\n 00003 // Description: source file for classes hash_element and hash_cones\n-//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // For more details, see http://projects.hepforge.org/siscone\n-//\n 00006 //\n-//\n 00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n-//\n 00008 //\n-//\n 00009 // This program is free software; you can redistribute it and/or modify\n-//\n 00010 // it under the terms of the GNU General Public License as published by\n-//\n 00011 // the Free Software Foundation; either version 2 of the License, or\n-//\n 00012 // (at your option) any later version.\n //\n+\n+Generated by Doxygen\n+\n+//\n+//\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+\f202\n+\n 00013 //\n //\n 00014 // This program is distributed in the hope that it will be useful,\n //\n 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n@@ -14024,36 +13823,26 @@\n 00040 * functions to manipulate them.\n 00041 **************************************************************/\n 00042\n 00043 // constructor with initialisation\n 00044 // - _Np number of particles\n 00045 // - _R2 cone radius (squared)\n 00046 //----------------------------------00047 hash_cones::hash_cones(int _Np, double _R2){\n-int i;\n 00048\n+int i;\n 00049\n 00050\n n_cones = 0;\n 00051 #ifdef DEBUG_STABLE_CONES\n 00052\n n_occupied_cells = 0;\n-\n-Generated by Doxygen\n-\n-*\n-*\n-\n-\f204\n-\n-File Documentation\n-\n 00053 #endif\n 00054\n-00055\n // determine hash size\n+00055\n 00056\n // for a ymax=5 and R=0.7, we observed an occupancy around 1/8 N^2 ~ N2 R2/4\n 00057\n //mask = 1 \u00ab (int) (2*log(double(_Np))/log(2.0));\n 00058\n //if (mask<=1) mask=2;\n 00059\n@@ -14111,20 +13900,30 @@\n 00091\n 00092\n 00093 /*\n 00094 * insert a new candidate into the hash.\n 00095 * - v\n 4-momentum of the cone to add\n 00096 * - parent parent particle defining the cone\n-00097 * - child\n child particle defining the cone\n-whether the parent has to belong to the cone or not\n+00097 * - child\n 00098 * - p_io\n-00099 * - c_io\n+whether the parent has to belong to the cone or not\n whether the child has to belong to the cone or not\n+00099 * - c_io\n+\n+File Documentation\n+\n+*\n+*\n+\n+Generated by Doxygen\n+\n+\f5.18 hash.cpp\n+\n 00100 * return 0 on success, 1 on error\n 00101 ***********************************************************************/\n 00102 int hash_cones::insert(Cmomentum *v, Cmomentum *parent, Cmomentum *child, bool p_io, bool c_io){\n 00103\n hash_element *elm;\n int index = (v->ref.ref[0]) & mask;\n 00104\n@@ -14137,27 +13936,27 @@\n 00109 #ifdef DEBUG_STABLE_CONES\n 00110\n if (elm==NULL)\n 00111\n n_occupied_cells++;\n 00112 #endif\n 00113\n-do{\n 00114\n-00115\n+do{\n // if it is not present, add it\n+00115\n 00116\n if (elm==NULL){\n 00117\n // create element\n 00118\n elm = new hash_element;\n 00119\n-00120\n // set its varibles\n+00120\n 00121\n // Note: at this level, eta and phi have already been computed\n 00122\n //\n through Cmomentum::build_etaphi.\n 00123\n elm->ref = v->ref;\n@@ -14175,90 +13974,85 @@\n 00130\n // the || will be true hence !(...) false as wanted\n 00131\n elm->is_stable = !((is_inside(v, parent)^p_io)||(is_inside(v, child)^c_io));\n //cout \u00ab \"-- new status of \" \u00ab v->ref[0] \u00ab \":\" \u00ab elm->is_stable \u00ab endl;\n 00132\n 00133\n-00134\n // update hash\n+00134\n 00135\n elm->next = hash_array[index];\n 00136\n hash_array[index] = elm;\n 00137\n 00138\n n_cones++;\n-00139\n return 0;\n-\n-Generated by Doxygen\n-\n-\f5.18 hash.cpp\n-\n+00139\n 00140\n }\n 00141\n-// if the cone is already there, simply update stability status\n 00142\n+// if the cone is already there, simply update stability status\n 00143\n if (v->ref == elm->ref){\n-00144\n // there is only an update to perform to see if the cone is still stable\n+00144\n 00145\n if (elm->is_stable){\n 00146\n v->build_etaphi();\n 00147\n elm->is_stable = !((is_inside(v, parent)^p_io)||(is_inside(v, child)^c_io));\n-//cout \u00ab \" parent/child: \"\n 00148\n+//cout \u00ab \" parent/child: \"\n 00149\n //\n \u00ab parent->ref[0] \u00ab \":\" \u00ab is_inside(v, parent) \u00ab \":\" \u00ab p_io \u00ab \" \"\n 00150\n //\n \u00ab child->ref[0] \u00ab \":\" \u00ab is_inside(v, child) \u00ab \":\" \u00ab c_io \u00ab endl;\n 00151\n //cout \u00ab \"-- rep status of \" \u00ab v->ref[0] \u00ab \":\" \u00ab elm->is_stable \u00ab endl;\n 00152\n //cout \u00ab v->eta \u00ab \" \" \u00ab v->phi \u00ab endl;\n 00153\n //cout \u00ab (child->eta) \u00ab \" \" \u00ab child->phi \u00ab endl;\n 00154\n }\n-return 0;\n 00155\n+return 0;\n 00156\n }\n 00157\n 00158\n elm = elm->next;\n 00159\n } while (1);\n 00160\n return 1;\n 00161\n 00162 }\n 00163\n 00164 /*\n 00165 * insert a new candidate into the hash.\n-4-momentum of te cone to add\n 00166 * - v\n+4-momentum of te cone to add\n 00167 * Note, in this case, we assume stability. We also assume\n 00168 * that eta and phi are computed for v\n 00169 * return 0 on success, 1 on error\n 00170 ***********************************************************************/\n 00171 int hash_cones::insert(Cmomentum *v){\n 00172\n hash_element *elm;\n int index = (v->ref.ref[0]) & mask;\n 00173\n-//cout \u00ab \"-- stable candidate: \" \u00ab v->ref[0] \u00ab \":\" \u00ab endl;\n 00174\n+//cout \u00ab \"-- stable candidate: \" \u00ab v->ref[0] \u00ab \":\" \u00ab endl;\n 00175\n 00176\n // check the array cell corresponding to our reference\n 00177\n elm = hash_array[index];\n 00178\n do{\n@@ -14267,50 +14061,59 @@\n 00180\n if (elm==NULL){\n 00181\n // create element\n 00182\n elm = new hash_element;\n 00183\n-// set its varibles\n 00184\n+// set its varibles\n 00185\n // Note: at this level, eta and phi have already been computed\n 00186\n //\n through Cmomentum::build_etaphi.\n+\n+Generated by Doxygen\n+\n+203\n+\n+\f204\n+\n+File Documentation\n+\n 00187\n elm->ref = v->ref;\n 00188\n elm->eta = v->eta;\n 00189\n elm->phi = v->phi;\n 00190\n elm->is_stable = true;\n 00191\n-// update hash\n 00192\n+// update hash\n 00193\n elm->next = hash_array[index];\n 00194\n hash_array[index] = elm;\n 00195\n 00196\n n_cones++;\n 00197\n return 0;\n 00198\n }\n 00199\n-00200\n // if the cone is already there, we have nothing to do\n+00200\n 00201\n if (v->ref == elm->ref){\n-00202\n return 0;\n+00202\n 00203\n }\n 00204\n 00205\n elm = elm->next;\n 00206\n } while (1);\n@@ -14338,23 +14141,14 @@\n 00223\n dy = fabs(centre->phi - v->phi);\n if (dy>M_PI)\n 00224\n 00225\n dy -= 2.0*M_PI;\n 00226\n-\n-Generated by Doxygen\n-\n-205\n-\n-\f206\n-\n-File Documentation\n-\n 00227\n return dx*dx+dy*dy\n 00030 #include \n 00031 #include \"hash.h\"\n 00032 #include \n 00033\n 00034 namespace siscone_spherical{\n+\n+//\n+\n+Generated by Doxygen\n+\n+\f5.19 hash.cpp\n+\n+205\n+\n 00035\n 00036 using namespace std;\n 00037\n 00038 /**************************************************************\n 00039 * implementation of sph_hash_cones\n *\n 00040 * list of cones candidates.\n+*\n 00041 * We store in this class all the sph_hash_element and give\n *\n 00042 * functions to manipulate them.\n+*\n 00043 **************************************************************/\n 00044\n 00045 // constructor with initialisation\n 00046 // - _Np\n number of particles\n 00047 // - _radius cone radius\n 00048 //----------------------------------00049 sph_hash_cones::sph_hash_cones(int _Np, double _radius){\n-00050\n int i;\n+00050\n 00051\n 00052\n n_cones = 0;\n 00053 #ifdef DEBUG_STABLE_CONES\n 00054\n n_occupied_cells = 0;\n 00055 #endif\n@@ -14447,49 +14252,37 @@\n // for a ymax=5 and R=0.7, we observed an occupancy around 1/8 N^2 ~ N2 R2/4\n 00059\n //mask = 1 \u00ab (int) (2*log(double(_Np))/log(2.0));\n 00060\n //if (mask<=1) mask=2;\n 00061\n int nbits = (int) (log(_Np*_radius*_radius*_Np/4.0)/log(2.0));\n-00062\n if (nbits<1) nbits=1;\n+00062\n 00063\n mask = 1 \u00ab nbits;\n 00064\n 00065\n // create hash\n 00066\n hash_array = new sph_hash_element*[mask];\n 00067\n mask--;\n 00068\n-00069\n // set the array to 0\n+00069\n 00070\n //? needed ?\n 00071\n for (i=0;iref.ref[0]) & mask;\n@@ -14551,16 +14344,23 @@\n 00116\n 00117\n do{\n // if it is not present, add it\n 00118\n 00119\n if (elm==NULL){\n-// create element\n 00120\n+// create element\n+\n+Generated by Doxygen\n+\n+\f206\n+\n+File Documentation\n+\n 00121\n elm = new sph_hash_element;\n 00122\n // set its varibles\n 00123\n 00124\n // Note: at this level, eta and phi have already been computed\n@@ -14584,21 +14384,21 @@\n 00134\n elm->next = hash_array[index];\n 00135\n hash_array[index] = elm;\n 00136\n 00137\n n_cones++;\n-return 0;\n 00138\n+return 0;\n 00139\n }\n 00140\n-00141\n // if the cone is already there, simply update stability status\n+00141\n 00142\n if (v->ref == elm->centre.ref){\n 00143\n // there is only an update to perform to see if the cone is still stable\n 00144\n if (elm->is_stable){\n 00145\n@@ -14628,46 +14428,39 @@\n elm = elm->next;\n 00157\n } while (1);\n 00158\n return 1;\n 00159\n 00160 }\n-\n-Generated by Doxygen\n-\n-\f208\n-\n-File Documentation\n-\n 00161\n 00162 /*\n 00163 * insert a new candidate into the hash.\n-00164 * - v\n 4-momentum of te cone to add\n+00164 * - v\n 00165 * Note, in this case, we assume stability. We also assume\n 00166 * that eta and phi are computed for v\n 00167 * return 0 on success, 1 on error\n 00168 ***********************************************************************/\n 00169 int sph_hash_cones::insert(CSphmomentum *v){\n 00170\n sph_hash_element *elm;\n-00171\n int index = (v->ref.ref[0]) & mask;\n+00171\n //cout \u00ab \"-- stable candidate: \" \u00ab v->ref[0] \u00ab \":\" \u00ab endl;\n 00172\n 00173\n // check the array cell corresponding to our reference\n 00174\n 00175\n elm = hash_array[index];\n-do{\n 00176\n-00177\n+do{\n // if it is not present, add it\n+00177\n 00178\n if (elm==NULL){\n // create element\n 00179\n 00180\n elm = new sph_hash_element;\n 00181\n@@ -14679,16 +14472,16 @@\n //\n through CSphmomentum::build_thetaphi.\n 00185\n elm->centre = *v;\n 00186\n elm->is_stable = true;\n 00187\n-// update hash\n 00188\n+// update hash\n 00189\n elm->next = hash_array[index];\n 00190\n hash_array[index] = elm;\n 00191\n 00192\n n_cones++;\n@@ -14713,14 +14506,20 @@\n 00203\n return 1;\n 00204\n 00205 }\n 00206\n 00207 }\n \n+Generated by Doxygen\n+\n+\f5.20 hash.h\n+\n+207\n+\n 5.20 hash.h\n 00001 // -*- C++ -*00003 // File: hash.h\n //\n 00004 // Description: header file for classes hash_element and hash_cones\n //\n 00005 // This file is part of the SISCone project.\n //\n@@ -14765,21 +14564,14 @@\n $//\n 00027\n 00028 #ifndef __HASH_H__\n 00029 #define __HASH_H__\n 00030\n 00031 #include \"momentum.h\"\n 00032 #include \"reference.h\"\n-\n-Generated by Doxygen\n-\n-\f5.21 hash.h\n-\n-209\n-\n 00033\n 00034 namespace siscone{\n 00035\n 00045 class hash_element{\n 00046 public:\n 00047\n Creference ref;\n@@ -14815,44 +14607,53 @@\n 00096\n 00097\n 00099 #ifdef DEBUG_STABLE_CONES\n 00100\n int n_occupied_cells;\n 00101 #endif\n 00102\n-00104\n int mask;\n+00104\n 00105\n-double R2;\n 00108\n+double R2;\n 00109\n inline bool is_inside(Cmomentum *centre, Cmomentum *v);\n 00118\n 00119 };\n 00120\n 00121 }\n 00122 #endif\n \n 5.21 hash.h\n 00001 // -*- C++ -*00003 // File: hash.h\n-//\n 00004 // Description: header file for classes hash_element and hash_cones\n-//\n 00005 // This file is part of the SISCone project.\n //\n+\n+Generated by Doxygen\n+\n+//\n+//\n+\n+\f208\n+\n+File Documentation\n+\n 00006 // WARNING: this is not the main SISCone trunk but\n //\n 00007 //\n an adaptation to spherical coordinates\n //\n 00008 // For more details, see http://projects.hepforge.org/siscone\n //\n 00009 //\n //\n 00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n+//\n 00011 //\n //\n 00012 // This program is free software; you can redistribute it and/or modify\n //\n 00013 // it under the terms of the GNU General Public License as published by\n //\n 00014 // the Free Software Foundation; either version 2 of the License, or\n@@ -14890,25 +14691,16 @@\n 00034\n 00035 namespace siscone_spherical{\n 00036\n 00046 class sph_hash_element{\n 00047 public:\n 00048\n CSph3vector centre;\n-\n-Generated by Doxygen\n-\n-//\n-\n-\f210\n-\n-File Documentation\n-\n-00049\n bool is_stable;\n+00049\n 00050\n 00051\n sph_hash_element *next;\n 00052 };\n 00053\n 00061 class sph_hash_cones{\n 00062 public:\n@@ -14917,65 +14709,72 @@\n 00066\n 00068\n ~sph_hash_cones();\n 00069\n int insert(CSphmomentum *v, CSphmomentum *parent, CSphmomentum *child, bool p_io, bool c_io);\n 00079\n 00080\n-int insert(CSphmomentum *v);\n 00088\n+int insert(CSphmomentum *v);\n 00089\n 00091\n sph_hash_element **hash_array;\n 00092\n-00094\n int n_cones;\n+00094\n 00095\n 00097 #ifdef DEBUG_STABLE_CONES\n 00098\n int n_occupied_cells;\n 00099 #endif\n 00100\n int mask;\n 00102\n 00103\n-double R2;\n 00106\n+double R2;\n 00107\n double tan2R;\n 00109\n 00110 };\n 00111\n 00112 }\n 00113 #endif\n \n 5.22 momentum.cpp\n 00001\n-//\n 00002 // File: momentum.cpp\n 00003 // Description: source file for 4-momentum class Cmomentum\n-//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // For more details, see http://projects.hepforge.org/siscone\n-//\n 00006 //\n-//\n 00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n-//\n 00008 //\n-//\n 00009 // This program is free software; you can redistribute it and/or modify\n-//\n 00010 // it under the terms of the GNU General Public License as published by\n-//\n 00011 // the Free Software Foundation; either version 2 of the License, or\n-//\n 00012 // (at your option) any later version.\n //\n+\n+//\n+//\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+Generated by Doxygen\n+\n+\f5.22 momentum.cpp\n+\n 00013 //\n //\n 00014 // This program is distributed in the hope that it will be useful,\n //\n 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n@@ -15016,19 +14815,14 @@\n 00041 //-------------00042 Cmomentum::Cmomentum(){\n 00043\n eta = 0.0;\n 00044\n phi = 0.0;\n 00045\n px = py = pz = E = 0.0;\n-\n-Generated by Doxygen\n-\n-\f5.22 momentum.cpp\n-\n 00046\n ref = Creference();\n 00047\n index = -1;\n 00048 }\n 00049\n 00050 // ctor with initialisation\n@@ -15038,16 +14832,16 @@\n 00054\n py = _py;\n 00055\n pz = _pz;\n 00056\n E = _E;\n 00057\n-00058\n // compute eta and phi\n+00058\n 00059\n build_etaphi();\n 00060\n ref = Creference();\n 00061 }\n 00062\n 00063 // ctor with detailed initialisation\n@@ -15080,25 +14874,34 @@\n 00086\n eta = v.eta;\n 00087\n phi = v.phi;\n 00088\n 00089\n ref = v.ref;\n-return *this;\n 00090\n+return *this;\n 00091 }\n 00092\n 00093 // addition of vectors\n 00094 // !!! WARNING !!! no updating of eta and phi !!!\n 00095 //-----------------------------------------------00096 const Cmomentum Cmomentum::operator + (const Cmomentum &v){\n 00097\n Cmomentum tmp = *this;\n 00098\n return tmp+=v;\n+\n+Generated by Doxygen\n+\n+209\n+\n+\f210\n+\n+File Documentation\n+\n 00099 }\n 00100\n 00101 // incrementation of vectors\n 00102 // !!! WARNING !!! no updating of eta and phi !!!\n 00103 //-----------------------------------------------00104 Cmomentum& Cmomentum::operator += (const Cmomentum &v){\n 00105\n px+=v.px;\n@@ -15126,97 +14929,97 @@\n 00121\n pz-=v.pz;\n 00122\n E -=v.E;\n 00123\n 00124\n ref-=v.ref;\n-00125\n return *this;\n+00125\n 00126 }\n 00127\n 00128 // build eta-phi from 4-momentum info\n 00129 // !!!\n WARNING\n !!!\n 00130 // !!! computing eta and phi is time-consuming !!!\n 00131 // !!! use this whenever you need eta or phi\n !!!\n 00132 // !!! automatically called for single-particle !!!\n-\n-Generated by Doxygen\n-\n-211\n-\n-\f212\n-\n-File Documentation\n-\n 00133 //-------------------------------------------------00134 void Cmomentum::build_etaphi(){\n 00135\n // note: the factor n (ref.nb) cancels in all expressions !!\n 00136\n eta = 0.5*log((E+pz)/(E-pz));\n 00137\n phi = atan2(py,px);\n 00138 }\n 00139\n 00140\n 00141 // ordering of two vectors\n 00142 // the default ordering is w.r.t. their references\n 00143 //------------------------------------------------00144 bool operator < (const Cmomentum &v1, const Cmomentum &v2){\n-00145\n return v1.ref < v2.ref;\n+00145\n 00146 }\n 00147\n 00148 // ordering of vectors in eta (e.g. used in collinear tests)\n 00149 //----------------------------------------------------------00150 bool momentum_eta_less(const Cmomentum &v1, const Cmomentum &v2){\n-return v1.eta < v2.eta;\n 00151\n+return v1.eta < v2.eta;\n 00152 }\n 00153\n 00154 // ordering of vectors in pt\n 00155 //--------------------------00156 bool momentum_pt_less(const Cmomentum &v1, const Cmomentum &v2){\n-00157\n return v1.perp2() < v2.perp2();\n+00157\n 00158 }\n 00159\n 00160 }\n 00161\n \n 5.23 momentum.cpp\n 00001\n-//\n 00002 // File: momentum.cpp\n 00003 // Description: source file for 4-momentum class Cmomentum\n-//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // WARNING: this is not the main SISCone trunk but\n-//\n 00006 //\n an adaptation to spherical coordinates\n-//\n 00007 // For more details, see http://projects.hepforge.org/siscone\n-//\n 00008 //\n-//\n 00009 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n 00010 //\n-//\n 00011 // This program is free software; you can redistribute it and/or modify\n-//\n 00012 // it under the terms of the GNU General Public License as published by\n-//\n 00013 // the Free Software Foundation; either version 2 of the License, or\n-//\n 00014 // (at your option) any later version.\n //\n 00015 //\n+\n+//\n+//\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n //\n+\n+Generated by Doxygen\n+\n+\f5.23 momentum.cpp\n+\n 00016 // This program is distributed in the hope that it will be useful,\n //\n 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n //\n 00019 // GNU General Public License for more details.\n@@ -15256,21 +15059,14 @@\n _theta = _phi = _norm = 0.0;\n 00045\n px = py = pz = 0.0;\n 00046\n ref = siscone::Creference();\n 00047 }\n 00048\n-\n-//\n-\n-Generated by Doxygen\n-\n-\f5.23 momentum.cpp\n-\n 00049 // ctor with initialisation\n 00050 //-------------------------00051 CSph3vector::CSph3vector(double _px, double _py, double _pz){\n 00052\n px = _px;\n 00053\n py = _py;\n 00054\n@@ -15306,16 +15102,16 @@\n _theta = v._theta;\n 00078\n _phi\n = v._phi;\n 00079\n 00080\n ref = v.ref;\n-return *this;\n 00081\n+return *this;\n 00082 }\n 00083\n 00084 // addition of vectors\n 00085 //-----------------------------------------------00086 const CSph3vector CSph3vector::operator + (const CSph3vector &v){\n 00087\n CSph3vector tmp = *this;\n 00088\n@@ -15330,14 +15126,23 @@\n return tmp-=v;\n 00096 }\n 00097\n 00098 // division by constant\n 00099 //-----------------------------------------------00100 const CSph3vector CSph3vector::operator / (const double &r){\n 00101\n CSph3vector tmp = *this;\n+\n+Generated by Doxygen\n+\n+211\n+\n+\f212\n+\n+File Documentation\n+\n 00102\n return tmp/=r;\n 00103 }\n 00104\n 00105 // incrementation\n 00106 //-----------------------------------------------00107 CSph3vector& CSph3vector::operator += (const CSph3vector &v){\n 00108\n@@ -15369,41 +15174,32 @@\n 00128\n px*=r;\n 00129\n py*=r;\n 00130\n pz*=r;\n 00131\n-return *this;\n 00132\n+return *this;\n 00133 }\n 00134\n 00135 // division by a constant\n-\n-Generated by Doxygen\n-\n-213\n-\n-\f214\n-\n-File Documentation\n-\n 00136 //-----------------------------------------------00137 CSph3vector& CSph3vector::operator /= (const double &r){\n 00138\n px/=r;\n 00139\n py/=r;\n 00140\n pz/=r;\n 00141\n 00142\n _norm/=r;\n 00143\n-00144\n return *this;\n+00144\n 00145 }\n 00146\n 00147 // build norm from 3-momentum info\n 00148 void CSph3vector::build_norm(){\n 00149\n _norm = norm();\n 00150 }\n@@ -15426,32 +15222,32 @@\n 00163\n 00164\n // z smallest\n 00165\n angular_dir1 = CSph3vector(-py, px, 0.0);\n 00166\n } else {\n-00167\n // x smallest\n+00167\n 00168\n angular_dir1 = CSph3vector(0.0, -pz, py);\n 00169\n }\n 00170\n } else {\n 00171\n if (pz < py){\n-00172\n // z smallest\n+00172\n 00173\n angular_dir1 = CSph3vector(-py, px, 0.0);\n 00174\n } else {\n-// y smallest\n 00175\n+// y smallest\n 00176\n angular_dir1 = CSph3vector(-pz, 0.0, px);\n 00177\n }\n 00178\n }\n 00179\n@@ -15466,14 +15262,19 @@\n 00184\n 00185 /*************************************************************************\n 00186 * class CSphmomentum\n *\n 00187 * This class contains the information for particle or group of\n *\n 00188 * particles management.\n+\n+Generated by Doxygen\n+\n+\f5.23 momentum.cpp\n+\n *\n 00189 * It includes all Lorentz properties as well as tools for summing them. *\n 00190 *************************************************************************/\n 00191\n 00192 // default ctor\n 00193 //-------------00194 CSphmomentum::CSphmomentum(){\n 00195\n@@ -15485,16 +15286,16 @@\n 00199 // ctor with initialisation\n 00200 //-------------------------00201 CSphmomentum::CSphmomentum(double _px, double _py, double _pz, double _E)\n 00202\n : CSph3vector(_px, _py, _pz) {\n 00203\n E = _E;\n 00204\n-// compute the angles\n 00205\n+// compute the angles\n 00206\n build_thetaphi();\n 00207 }\n 00208\n 00209 // ctor with initialisation\n 00210 //-------------------------00211 CSphmomentum::CSphmomentum(CSph3vector &_v, double _E)\n 00212\n@@ -15504,21 +15305,14 @@\n 00214 }\n 00215\n 00216 // default dtor\n 00217 //-------------00218 CSphmomentum::~CSphmomentum(){\n 00219\n 00220 }\n 00221\n-\n-Generated by Doxygen\n-\n-\f5.24 momentum.h\n-\n-215\n-\n 00222 // assignment of vectors\n 00223 //----------------------00224 CSphmomentum& CSphmomentum::operator = (const CSphmomentum &v){\n 00225\n px = v.px;\n 00226\n py = v.py;\n 00227\n@@ -15532,16 +15326,16 @@\n _theta = v._theta;\n 00232\n _phi\n = v._phi;\n 00233\n 00234\n ref = v.ref;\n-00235\n return *this;\n+00235\n 00236 }\n 00237\n 00238 // addition of vectors\n 00239 // !!! WARNING !!! no updating of eta and phi !!!\n 00240 //-----------------------------------------------00241 const CSphmomentum CSphmomentum::operator + (const CSphmomentum &v){\n 00242\n CSphmomentum tmp = *this;\n@@ -15560,16 +15354,16 @@\n pz+=v.pz;\n 00253\n E +=v.E;\n 00254\n 00255\n ref+=v.ref;\n 00256\n-return *this;\n 00257\n+return *this;\n 00258 }\n 00259\n 00260 // decrementation of vectors\n 00261 // !!! WARNING !!! no updating of eta and phi !!!\n 00262 //-----------------------------------------------00263 CSphmomentum& CSphmomentum::operator -= (const CSphmomentum &v){\n 00264\n px-=v.px;\n@@ -15578,20 +15372,29 @@\n 00266\n pz-=v.pz;\n 00267\n E -=v.E;\n 00268\n 00269\n ref-=v.ref;\n-return *this;\n 00270\n+return *this;\n 00271 }\n 00272\n 00273\n 00274 // ordering of two vectors\n+\n+Generated by Doxygen\n+\n+213\n+\n+\f214\n+\n+File Documentation\n+\n 00275 // the default ordering is w.r.t. their references\n 00276 //------------------------------------------------00277 bool operator < (const CSphmomentum &v1, const CSphmomentum &v2){\n return v1.ref < v2.ref;\n 00278\n 00279 }\n 00280\n 00281 // ordering of vectors in eta (e.g. used in collinear tests)\n@@ -15605,503 +15408,15 @@\n return v1.perp2() < v2.perp2();\n 00290\n 00291 }\n 00292\n 00293 }\n 00294\n \n-5.24 momentum.h\n-00001 // -*- C++ -*00003 // File: momentum.h\n-00004 // Description: header file for 4-momentum class Cmomentum\n-00005 // This file is part of the SISCone project.\n-//\n-00006 // For more details, see http://projects.hepforge.org/siscone\n-00007 //\n-\n-Generated by Doxygen\n-\n-//\n-//\n-\n-//\n-//\n-\n-\f216\n-\n-File Documentation\n-\n-00008 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n-//\n-00009 //\n-//\n-00010 // This program is free software; you can redistribute it and/or modify\n-//\n-00011 // it under the terms of the GNU General Public License as published by\n-//\n-00012 // the Free Software Foundation; either version 2 of the License, or\n-//\n-00013 // (at your option) any later version.\n-//\n-00014 //\n-//\n-00015 // This program is distributed in the hope that it will be useful,\n-//\n-00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n-00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-//\n-00018 // GNU General Public License for more details.\n-//\n-00019 //\n-//\n-00020 // You should have received a copy of the GNU General Public License\n-//\n-00021 // along with this program; if not, write to the Free Software\n-//\n-00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n-00023 //\n-//\n-00024 // $Revision:: 163\n-$//\n-00025 // $Date:: 2007-04-26 22:31:02 +0200 (Thu, 26 Apr 2007)\n-$//\n-00027\n-00028 #ifndef __VECTOR_H__\n-00029 #define __VECTOR_H__\n-00030\n-00031 #include \n-00032 #include \n-00033 #include \"reference.h\"\n-00034 #include \"geom_2d.h\"\n-00035 #include \"defines.h\"\n-00036\n-00037 namespace siscone{\n-00038\n-00049 class Cmomentum{\n-00050 public:\n-00052\n-Cmomentum();\n-00053\n-00055\n-Cmomentum(double _px, double _py, double _pz, double _E);\n-00056\n-00058\n-Cmomentum(double _eta, double _phi, Creference _ref);\n-00059\n-00061\n-~Cmomentum();\n-00062\n-inline double perp()const {return sqrt(perp2());}\n-00064\n-00065\n-inline double perp2()const {return px*px+py*py;}\n-00067\n-00068\n-inline double mass()const {return sqrt(mass2());}\n-00070\n-00071\n-00073\n-inline double mass2()const {return perpmass2()-perp2();}\n-00074\n-inline double perpmass()const {return sqrt((E-pz)*(E+pz));}\n-00076\n-00077\n-inline double perpmass2()const {return (E-pz)*(E+pz);}\n-00079\n-00080\n-inline double Et()const {return E/sqrt(1.0+pz*pz/perp2());}\n-00082\n-00083\n-inline double Et2()const {return E*E/(1.0+pz*pz/perp2());}\n-00085\n-00086\n-00088\n-Cmomentum& operator = (const Cmomentum &v);\n-00089\n-00092\n-const Cmomentum operator + (const Cmomentum &v);\n-00093\n-00096\n-Cmomentum& operator += (const Cmomentum &v);\n-00097\n-00100\n-Cmomentum& operator -= (const Cmomentum &v);\n-00101\n-void build_etaphi();\n-00107\n-00108\n-double px;\n-00109\n-00110\n-double py;\n-double pz;\n-00111\n-00112\n-double E;\n-00113\n-double eta;\n-00114\n-00115\n-double phi;\n-int parent_index;\n-00116\n-00117\n-int index;\n-00118\n-// the following part is used for checksums //\n-00120\n-00122\n-Creference ref;\n-00123 };\n-00124\n-00127 bool operator < (const Cmomentum &v1, const Cmomentum &v2);\n-00128\n-00130 bool momentum_eta_less(const Cmomentum &v1, const Cmomentum &v2);\n-00131\n-00133 bool momentum_pt_less(const Cmomentum &v1, const Cmomentum &v2);\n-\n-Generated by Doxygen\n-\n-\f5.25 momentum.h\n-\n-00134\n-00135\n-00137 // some handy utilities //\n-00139\n-00144 inline double get_distance(double eta, double phi, Cmomentum *v){\n-00145\n-double dx, dy;\n-00146\n-00147\n-dx = eta - v->eta;\n-00148\n-dy = fabs(phi - v->phi);\n-00149\n-if (dy>M_PI)\n-00150\n-dy -= twopi;\n-00151\n-00152\n-return dx*dx+dy*dy;\n-00153 }\n-00154\n-00155 }\n-00156\n-00157 #endif\n-\n-5.25 momentum.h\n-00001 // -*- C++ -*00003 // File: momentum.h\n-//\n-00004 // Description: header file for 4-momentum class Cmomentum\n-//\n-00005 // This file is part of the SISCone project.\n-//\n-00006 // WARNING: this is not the main SISCone trunk but\n-//\n-00007 //\n-an adaptation to spherical coordinates\n-//\n-00008 // For more details, see http://projects.hepforge.org/siscone\n-//\n-00009 //\n-//\n-00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n-//\n-00011 //\n-//\n-00012 // This program is free software; you can redistribute it and/or modify\n-//\n-00013 // it under the terms of the GNU General Public License as published by\n-//\n-00014 // the Free Software Foundation; either version 2 of the License, or\n-//\n-00015 // (at your option) any later version.\n-//\n-00016 //\n-//\n-00017 // This program is distributed in the hope that it will be useful,\n-//\n-00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n-00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-//\n-00020 // GNU General Public License for more details.\n-//\n-00021 //\n-//\n-00022 // You should have received a copy of the GNU General Public License\n-//\n-00023 // along with this program; if not, write to the Free Software\n-//\n-00024 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n-00025 //\n-//\n-00026 // $Revision:: 256\n-$//\n-00027 // $Date:: 2008-07-14 13:52:16 +0200 (Mon, 14 Jul 2008)\n-$//\n-00029\n-00030 #ifndef __SPH_VECTOR_H__\n-00031 #define __SPH_VECTOR_H__\n-00032\n-00033 #include \n-00034 #include \n-00035 #include \n-00036 #include \"geom_2d.h\"\n-00037 #include \n-00038\n-00039 namespace siscone_spherical{\n-00040\n-00054 class CSph3vector{\n-00055 public:\n-00057\n-CSph3vector();\n-00058\n-00060\n-CSph3vector(double _px, double _py, double _pz);\n-00061\n-00063\n-~CSph3vector();\n-00064\n-00066\n-CSph3vector& operator = (const CSph3vector &v);\n-00067\n-const CSph3vector operator + (const CSph3vector &v);\n-00070\n-00071\n-const CSph3vector operator - (const CSph3vector &v);\n-00074\n-00075\n-const CSph3vector operator / (const double &r);\n-00078\n-00079\n-00082\n-CSph3vector& operator += (const CSph3vector &v);\n-00083\n-00086\n-CSph3vector& operator -= (const CSph3vector &v);\n-00087\n-00090\n-CSph3vector& operator *= (const double &r);\n-\n-Generated by Doxygen\n-\n-217\n-\n-\f218\n-\n-File Documentation\n-\n-00091\n-00094\n-CSph3vector& operator /= (const double &r);\n-00095\n-inline double perp()const {return sqrt(perp2());}\n-00097\n-00098\n-00100\n-inline double perp2()const {return px*px+py*py;}\n-00101\n-inline double norm()const {return sqrt(px*px+py*py+pz*pz);}\n-00103\n-00104\n-inline double norm2()const {return px*px+py*py+pz*pz;}\n-00106\n-00107\n-inline double phi()const {return atan2(py, px);}\n-00109\n-00110\n-inline double theta()const {return atan2(perp(),pz);}\n-00112\n-00113\n-void build_norm();\n-00120\n-00121\n-00125\n-void build_thetaphi();\n-00126\n-void get_angular_directions(CSph3vector &angular_dir1, CSph3vector &angular_dir2);\n-00129\n-00130\n-double px;\n-00131\n-00132\n-double py;\n-double pz;\n-00133\n-00134\n-double _norm;\n-00135\n-00136\n-double _theta;\n-double _phi;\n-00137\n-00138\n-00140\n-// the following part is used for checksums //\n-00142\n-siscone::Creference ref;\n-00143 };\n-00144\n-00158 class CSphmomentum : public CSph3vector{\n-00159 public:\n-00161\n-CSphmomentum();\n-00162\n-00164\n-CSphmomentum(CSph3vector &init, double E=0.0);\n-00165\n-00167\n-CSphmomentum(double _px, double _py, double _pz, double _E);\n-00168\n-00170\n-//CSphmomentum(double _eta, double _phi, siscone::Creference _ref);\n-00171\n-00173\n-~CSphmomentum();\n-00174\n-inline double mass()const {return sqrt(mass2());}\n-00176\n-00177\n-inline double mass2()const {return perpmass2()-perp2();}\n-00179\n-00180\n-inline double perpmass()const {return sqrt((E-pz)*(E+pz));}\n-00182\n-00183\n-inline double perpmass2()const {return (E-pz)*(E+pz);}\n-00185\n-00186\n-inline double Et()const {return E/sqrt(1.0+pz*pz/perp2());}\n-00188\n-00189\n-00191\n-inline double Et2()const {return E*E/(1.0+pz*pz/perp2());}\n-00192\n-00194\n-CSphmomentum& operator = (const CSphmomentum &v);\n-00195\n-const CSphmomentum operator + (const CSphmomentum &v);\n-00198\n-00199\n-00202\n-CSphmomentum& operator += (const CSphmomentum &v);\n-00203\n-00206\n-CSphmomentum& operator -= (const CSphmomentum &v);\n-00207\n-double E;\n-00208\n-00209\n-00210\n-int parent_index;\n-int index;\n-00211\n-00212 };\n-00213\n-00216 bool operator < (const CSphmomentum &v1, const CSphmomentum &v2);\n-00217\n-00219 bool momentum_theta_less(const CSphmomentum &v1, const CSphmomentum &v2);\n-00220\n-00222 bool momentum_pt_less(const CSphmomentum &v1, const CSphmomentum &v2);\n-00223\n-00224\n-00226 // some handy utilities //\n-00228\n-00230 inline double sqr(double x){return x*x;}\n-00231\n-00235 inline double dot_product3(const CSph3vector &v1, const CSph3vector &v2){\n-00236\n-//double tmp = v1.px*v2.px + v1.py*v2.py + v1.pz*v2.pz;\n-00237\n-//if (!isfinite(tmp)){\n-00238\n-// std::cout \u00ab \"dot_product inf: \" \u00ab std::endl;\n-00239\n-// std::cout \u00ab \" angles: \" \u00ab v1._theta \u00ab \" \" \u00ab v1._phi \u00ab \" and \" \u00ab v2._theta \u00ab \" \" \u00ab v2._phi \u00ab\n-\n-Generated by Doxygen\n-\n-\f5.26 protocones.cpp\n-\n-219\n-\n-std::endl;\n-00240\n-// std::cout \u00ab \" moms : \" \u00ab v1.px \u00ab \" \" \u00ab v1.py \u00ab \" \" \u00ab v1.pz\n-00241\n-//\n-\u00ab \" and \"\n-\u00ab v2.px \u00ab \" \" \u00ab v2.py \u00ab \" \" \u00ab v2.pz \u00ab std::endl;\n-00242\n-//}\n-00243\n-return v1.px*v2.px + v1.py*v2.py + v1.pz*v2.pz;\n-00244 }\n-00245\n-00249 inline CSph3vector cross_product3(const CSph3vector &v1, const CSph3vector &v2){\n-//CSph3vector tmp;\n-00250\n-00251\n-//tmp.px = v1.py*v2.pz-v1.pz*v2.py;\n-00252\n-//tmp.py = v1.pz*v2.px-v1.px*v2.pz;\n-00253\n-//tmp.pz = v1.px*v2.py-v1.py*v2.px;\n-00254\n-//return tmp;\n-00255\n-return CSph3vector(v1.py*v2.pz-v1.pz*v2.py,\n-00256\n-v1.pz*v2.px-v1.px*v2.pz,\n-00257\n-v1.px*v2.py-v1.py*v2.px);\n-00258 }\n-00259\n-00263 inline double norm2_cross_product3(const CSph3vector &v1, const CSph3vector &v2){\n-00264\n-return sqr(v1.py*v2.pz-v1.pz*v2.py) + sqr(v1.pz*v2.px-v1.px*v2.pz) + sqr(v1.px*v2.py-v1.py*v2.px);\n-00265 }\n-00266\n-00270 inline double get_tan2_distance(const CSphmomentum &v1, const CSphmomentum &v2){\n-return norm2_cross_product3(v1,v2)/sqr(dot_product3(v1,v2));\n-00271\n-00272 }\n-00273\n-00277 inline double get_distance(const CSph3vector *v1, const CSph3vector *v2){\n-return atan2(sqrt(norm2_cross_product3(*v1,*v2)), dot_product3(*v1,*v2));\n-00278\n-00279 }\n-00280\n-00289 inline bool is_closer(const CSph3vector *v1, const CSph3vector *v2, const double tan2R){\n-00290\n-double dot = dot_product3(*v1,*v2);\n-return (dot>=0) && (norm2_cross_product3(*v1,*v2)<=tan2R*dot*dot);\n-00291\n-00292 }\n-00293\n-00299 inline bool is_closer_safer(const CSph3vector *v1, const CSph3vector *v2, const double cosR){\n-00300\n-return dot_product3(*v1,*v2)>=cosR*sqrt(v1->norm2()*v2->norm2());\n-//double dot = dot_product3(*v1,*v2);\n-00301\n-00302\n-//return (dot>=0) && (norm2_cross_product3(*v1,*v2)\n 00063 #include \n 00064 #include \"circulator.h\"\n 00065 #include \n@@ -16263,99 +15578,101 @@\n nb_tot = 0;\n 00100\n hc = NULL;\n 00101 }\n 00102\n 00103 // default dtor\n 00104 //-------------00105 Cstable_cones::~Cstable_cones(){\n-00106\n if (hc!=NULL) delete hc;\n+00106\n 00107 }\n 00108\n 00109 /*\n 00110 * initialisation\n 00111 * - _particle_list list of particles\n-00112 * - _n\n number of particles\n+00112 * - _n\n 00113 *********************************************************************/\n 00114 void Cstable_cones::init(vector &_particle_list){\n-// check already allocated mem\n 00115\n+// check already allocated mem\n 00116\n if (hc!=NULL){\n-delete hc;\n 00117\n+delete hc;\n 00118\n }\n-00119\n if (protocones.size()!=0)\n-\n-File Documentation\n-\n-*\n-\n-Generated by Doxygen\n-\n-\f5.26 protocones.cpp\n-\n+00119\n 00120\n protocones.clear();\n 00121\n 00122\n multiple_centre_done.clear();\n 00123\n-// initialisation\n 00124\n+// initialisation\n 00125\n set_particle_list(_particle_list);\n 00126 }\n 00127\n 00128\n 00130 // ALGORITHM MAIN ENTRY\n //\n 00131 // - get_stable_cone(radius)\n //\n 00133\n 00134 /*\n 00135 * compute stable cones.\n 00136 * This function really does the job i.e. computes\n 00137 * the list of stable cones (in a seedless way)\n-00138 * - _radius:\n radius of the cones\n+00138 * - _radius:\n 00139 * The number of stable cones found is returned\n 00140 *********************************************************************/\n 00141 int Cstable_cones::get_stable_cones(double _radius){\n-int p_idx;\n 00142\n+int p_idx;\n 00143\n-00144\n // check if everything is correctly initialised\n+00144\n 00145\n if (n_part==0){\n-00146\n return 0;\n+00146\n 00147\n }\n 00148\n+\n+Generated by Doxygen\n+\n+215\n+\n+*\n+\n+\f216\n+\n+File Documentation\n+\n 00149\n R = _radius;\n 00150\n R2 = R*R;\n 00151\n-00152\n // allow hash for cones candidates\n+00152\n 00153\n hc = new hash_cones(n_part, R2);\n 00154\n // browse all particles\n 00155\n 00156\n for (p_idx=0;p_idxside){\n-// test when both particles are not in the cone\n 00248\n+// test when both particles are not in the cone\n 00249\n // or when both are in.\n 00250\n // Note: for the totally exclusive case, test emptyness before\n 00251\n cone_candidate = cone;\n 00252\n@@ -16524,16 +15837,16 @@\n cone_candidate = cone;\n 00257\n cone_candidate+= *parent + *child;\n 00258\n hc->insert(&cone_candidate, parent, child, true, true);\n 00259\n } else {\n-// test when 1! of the particles is in the cone\n 00260\n+// test when 1! of the particles is in the cone\n 00261\n cone_candidate = cone + *parent;\n 00262\n hc->insert(&cone_candidate, parent, child, true, false);\n 00263\n 00264\n cone_candidate = cone + *child;\n@@ -16541,31 +15854,31 @@\n hc->insert(&cone_candidate, parent, child, false, true);\n 00266\n }\n 00267\n 00268\n nb_tot+=2;\n 00269\n-00270\n return 0;\n+00270\n 00271 }\n 00272\n 00273\n 00274 /*\n 00275 * update the cone\n 00276 * go to the next child for that parent and update \u2019cone\u2019 appropriately\n 00277 * return 0 if update candidate found, 1 otherwise\n 00278 ***********************************************************************/\n 00279 int Cstable_cones::update_cone(){\n-00280\n // get the next child and centre\n+00280\n 00281\n centre_idx++;\n-00282\n if (centre_idx==vicinity_size)\n+00282\n 00283\n centre_idx=0;\n if (centre_idx==first_cone)\n 00284\n 00285\n return 1;\n 00286\n@@ -16580,24 +15893,19 @@\n 00291\n if (!centre->side){\n 00292\n // update cone\n 00293\n cone += (*child);\n 00294\n-00295\n // update info on particles inside\n+00295\n 00296\n centre->is_inside->cone = true;\n 00297\n-\n-Generated by Doxygen\n-\n-\f5.26 protocones.cpp\n-\n 00298\n // update stability check quantities\n 00299\n dpt += fabs(child->px)+fabs(child->py);\n 00300\n }\n 00301\n@@ -16620,68 +15928,77 @@\n //if (cocircular_check())\n 00311\n if (cocircular_check())\n 00312\n return update_cone();\n 00313\n 00314\n-00315\n // update the cone w.r.t. the new child\n+00315\n 00316\n // only required if the new child was already inside in which\n 00317\n // case we need to remove it. We also know that the child is\n 00318\n // inside iff its side is +.\n 00319\n if ((centre->side) && (cone.ref.not_empty())){\n-00320\n // update cone\n+00320\n 00321\n cone -= (*child);\n 00322\n // update info on particles inside\n 00323\n 00324\n centre->is_inside->cone = false;\n+\n+Generated by Doxygen\n+\n+217\n+\n+\f218\n+\n+File Documentation\n+\n 00325\n // update stability check quantities\n 00326\n 00327\n dpt += fabs(child->px)+fabs(child->py); //child->perp2();\n 00328\n }\n 00329\n-// check that the addition and subtraction of vectors does\n 00330\n+// check that the addition and subtraction of vectors does\n 00331\n // not lead to too much rounding error\n 00332\n // for that, we compute the sum of pt modifications and of |pt|\n 00333\n // since last recomputation and once the ratio overpasses a threshold\n 00334\n // we recompute vicinity.\n 00335\n if ((dpt>PT_TSHOLD*(fabs(cone.px)+fabs(cone.py))) && (cone.ref.not_empty())){\n 00336\n recompute_cone_contents();\n 00337\n }\n-00338\n if (cone.ref.is_empty()){\n+00338\n 00339\n cone = Cmomentum();\n 00340\n dpt=0.0;\n 00341\n }\n 00342\n-return 0;\n 00343\n+return 0;\n 00344 }\n 00345\n 00346\n 00347 /*\n 00348 * compute stability of all enumerated candidates.\n 00349 * For all candidate cones which are stable w.r.t. their border particles,\n 00350 * pass the last test: stability with quadtree intersection\n@@ -16697,20 +16014,20 @@\n 00357\n for (i=0;i<=hc->mask;i++){\n 00358\n // test ith cell of the hash array\n 00359\n elm = hc->hash_array[i];\n 00360\n-// browse elements therein\n 00361\n+// browse elements therein\n 00362\n while (elm!=NULL){\n-// test stability\n 00363\n+// test stability\n 00364\n if (elm->is_stable){\n 00365\n // stability is not ensured by all pairs of \"edges\" already browsed\n 00366 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00367\n // => testing stability with quadtree intersection\n@@ -16736,57 +16053,48 @@\n 00378\n protocones.push_back(Cmomentum(elm->eta, elm->phi, elm->ref));\n 00379\n }\n 00380\n }\n 00381\n-// jump to the next one\n 00382\n+// jump to the next one\n 00383\n elm = elm->next;\n 00384\n }\n-\n-Generated by Doxygen\n-\n-223\n-\n-\f224\n-\n-File Documentation\n-\n 00385\n }\n 00386\n-// free hash\n 00387\n+// free hash\n 00388\n // we do that at this level because hash eats rather a lot of memory\n 00389\n // we want to free it before running the split/merge algorithm\n 00390 #ifdef DEBUG_STABLE_CONES\n 00391\n nb_hash_cones = hc->n_cones;\n 00392\n nb_hash_occupied = hc->n_occupied_cells;\n 00393 #endif\n 00394\n-00395\n delete hc;\n+00395\n 00396\n hc=NULL;\n 00397\n-return protocones.size();\n 00398\n+return protocones.size();\n 00399 }\n 00400\n 00401\n-00403 // ALGORITHM MAIN STEPS FOR COCIRCULAR SITUATIONS\n //\n+00403 // ALGORITHM MAIN STEPS FOR COCIRCULAR SITUATIONS\n 00404 // - cocircular_pt_less(v1, v2)\n //\n 00405 // - prepare_cocircular_list()\n //\n 00406 // - test_cone_cocircular()\n //\n 00407 // - test_stability(candidate, border_vect)\n@@ -16794,14 +16102,19 @@\n 00408 // - updat_cone_cocircular()\n //\n 00410\n 00412 bool cocircular_pt_less(Cmomentum *v1, Cmomentum *v2){\n return v1->perp2() < v2->perp2();\n 00413\n 00414 }\n+\n+Generated by Doxygen\n+\n+\f5.24 protocones.cpp\n+\n 00415\n 00416 /*\n 00417 * run through the vicinity of the current parent and for each child\n 00418 * establish which other members are cocircular... Note that the list\n 00419 * associated with each child contains references to vicinity\n 00420 * elements: thus two vicinity elements each associated with one given\n 00421 * particle may appear in a list -- this needs to be watched out for\n@@ -16839,23 +16152,23 @@\n here_pntr->cocircular_range\n 00441\n && search() != here()) {\n 00442\n (*search())->cocircular.push_back(here_pntr);\n 00443\n } else {\n-break;\n 00444\n+break;\n 00445\n }\n 00446\n }\n 00447\n-00448\n // search backwards\n+00448\n 00449\n search.set_position(here);\n 00450\n while (true) {\n 00451\n --search;\n if ( abs_dphi((*search())->angle, here_pntr->angle) <\n@@ -16864,16 +16177,16 @@\n here_pntr->cocircular_range\n 00454\n && search() != here()) {\n 00455\n (*search())->cocircular.push_back(here_pntr);\n 00456\n } else {\n-00457\n break;\n+00457\n 00458\n }\n 00459\n }\n 00460\n 00461\n ++here;\n@@ -16888,37 +16201,30 @@\n 00469 * on the border --- note that this is till probably overkill, since\n 00470 * in principle we only have to test situations where up to a\n 00471 * half-circle is filled (but going to a full circle is simpler)\n 00472 ******************************************************************/\n 00473 void Cstable_cones::test_cone_cocircular(Cmomentum & borderless_cone,\n 00474\n list & border_list) {\n-\n-Generated by Doxygen\n-\n-\f5.26 protocones.cpp\n-\n-225\n-\n 00475\n vector border_vect;\n 00476\n 00477\n border_vect.reserve(border_list.size());\n-for (list::iterator it = border_list.begin();\n 00478\n+for (list::iterator it = border_list.begin();\n 00479\n it != border_list.end(); it++) {\n 00480\n border_vect.push_back(Cborder_store(*it, centre->eta, centre->phi));\n 00481\n }\n 00482\n-00483\n // get them into order of angle\n+00483\n 00484\n sort(border_vect.begin(), border_vect.end());\n 00485\n // set up some circulators, since these will help us go around the\n 00486\n 00487\n // circle easily\n@@ -16938,47 +16244,56 @@\n if (candidate.ref.not_empty())\n 00495\n 00496\n test_stability(candidate, border_vect);\n 00497\n 00498\n do {\n-00499\n // reset status wrt inclusion in the cone\n+00499\n 00500\n mid = start;\n 00501\n do {\n+\n+Generated by Doxygen\n+\n+219\n+\n+\f220\n+\n+File Documentation\n+\n 00502\n mid()->is_in = false;\n 00503\n } while (++mid != start);\n 00504\n // now run over all inclusion possibilities with this starting point\n 00505\n 00506\n candidate = borderless_cone;\n-while (++mid != start) {\n 00507\n-00508\n+while (++mid != start) {\n // will begin with start+1 and go up to start-1\n+00508\n 00509\n mid()->is_in = true;\n 00510\n candidate += *(mid()->mom);\n 00511\n test_stability(candidate, border_vect);\n 00512\n }\n 00513\n 00514\n } while (++start != end);\n 00515\n-00516\n // mid corresponds to momentum that we need to include to get the\n+00516\n 00517\n // full cone\n 00518\n mid()->is_in = true;\n 00519\n candidate += *(mid()->mom);\n 00520\n@@ -16993,20 +16308,20 @@\n 00533\n candidate.build_etaphi();\n 00534\n bool stable = true;\n 00535\n 00536\n for (unsigned i = 0; i < border_vect.size(); i++) {\n-if (is_inside(&candidate, border_vect[i].mom) ^ (border_vect[i].is_in)) {\n 00537\n+if (is_inside(&candidate, border_vect[i].mom) ^ (border_vect[i].is_in)) {\n 00538\n stable = false;\n-break; // it\u2019s unstable so there\u2019s no point continuing\n 00539\n+break; // it\u2019s unstable so there\u2019s no point continuing\n 00540\n }\n 00541\n }\n 00542\n 00543\n if (stable) hc->insert(&candidate);\n@@ -17016,212 +16331,201 @@\n 00547 * check if we are in a situation of cocircularity.\n 00548 * if it is the case, update and test in the corresponding way\n 00549 * return \u2019false\u2019 if no cocircularity detected, \u2019true\u2019 otherwise\n 00550 * Note that if cocircularity is detected, we need to\n 00551 * recall \u2019update\u2019 from \u2019update\u2019 !!!\n 00552 ***************************************************************/\n 00553 bool Cstable_cones::cocircular_check(){\n-00554\n // check if many configurations have the same centre.\n+00554\n 00555\n // if this is the case, branch on the algorithm for this\n 00556\n // special case.\n 00557\n // Note that those situation, being considered separately in\n 00558\n // test_cone_multiple, must only be considered here if all\n 00559\n // angles are on the same side (this avoid multiple counting)\n 00560\n-00561\n if (centre->cocircular.empty()) return false;\n+00561\n 00562\n-// first get cone into status required at end...\n 00563\n+// first get cone into status required at end...\n 00564\n if ((centre->side) && (cone.ref.not_empty())){\n-// update cone\n 00565\n+// update cone\n 00566\n cone -= (*child);\n 00567\n-\n-Generated by Doxygen\n-\n-\f226\n-\n 00568\n+// update info on particles inside\n 00569\n+centre->is_inside->cone = false;\n 00570\n+// update stability check quantities\n 00571\n 00572\n+dpt += fabs(child->px)+fabs(child->py); //child->perp2();\n 00573\n+}\n 00574\n 00575\n 00576\n+// now establish the list of unique children in the list\n 00577\n+// first make sure parent and child are in!\n 00578\n 00579\n+list removed_from_cone;\n 00580\n+list put_in_border;\n 00581\n+list border_list;\n 00582\n 00583\n+Cmomentum cone_removal;\n 00584\n+Cmomentum border = *parent;\n 00585\n+border_list.push_back(parent);\n 00586\n+// make sure child appears in the border region\n 00587\n 00588\n+centre->cocircular.push_back(centre);\n 00589\n 00590\n+// now establish the full contents of the cone minus the cocircular\n 00591\n+// region and of the cocircular region itself\n 00592\n+for(list::iterator it = centre->cocircular.begin();\n 00593\n+it != centre->cocircular.end(); it++) {\n 00594\n+\n+Generated by Doxygen\n+\n+\f5.24 protocones.cpp\n+\n 00595\n+if ((*it)->is_inside->cone) {\n 00596\n+cone_removal\n++= *((*it)->v);\n 00597\n+(*it)->is_inside->cone = false;\n 00598\n+removed_from_cone.push_back((*it)->is_inside);\n 00599\n+}\n 00600\n+// if a point appears twice (i.e. with + and - sign) in the list of\n 00601\n 00602\n+// points on the border, we take care not to include it twice.\n 00603\n+// Note that this situation may appear when a point is at a distance\n 00604\n+// close to 2R from the parent\n 00605\n+if (!(*it)->is_inside->cocirc) {\n 00606\n+border += *((*it)->v);\n 00607\n+(*it)->is_inside->cocirc = true;\n 00608\n+put_in_border.push_back((*it)->is_inside);\n 00609\n+border_list.push_back((*it)->v);\n 00610\n+}\n 00611\n+}\n 00612\n 00613\n+// figure out whether this pairing has been observed before\n 00614\n 00615\n+Cmomentum borderless_cone = cone;\n 00616\n+borderless_cone -= cone_removal;\n 00617\n+bool consider = true;\n+for (unsigned int i=0;i(borderless_cone.ref,\n 00628\n+border.ref));\n 00629\n 00630\n+// first figure out whether our cone momentum is good\n 00631\n+double local_dpt = fabs(cone_removal.px) + fabs(cone_removal.py);\n+double total_dpt = dpt + local_dpt;\n 00632\n 00633\n 00634\n+recompute_cone_contents_if_needed(borderless_cone, total_dpt);\n 00635\n+if (total_dpt == 0) {\n 00636\n+// a recomputation has taken place -- so take advantage of this\n 00637\n+// and update the member cone momentum\n 00638\n+cone = borderless_cone + cone_removal;\n 00639\n+dpt = local_dpt;\n 00640\n+}\n 00641\n 00642\n+test_cone_cocircular(borderless_cone, border_list);\n 00643\n+}\n 00644\n 00645\n+// relabel things that were in the cone but got removed\n 00646\n 00647\n+for(list::iterator is_in = removed_from_cone.begin();\n 00648\n+is_in != removed_from_cone.end(); is_in++) {\n 00649\n+(*is_in)->cone = true;\n 00650\n+}\n 00651\n 00652\n-00653\n-00654\n-\n-File Documentation\n-\n-// update info on particles inside\n-centre->is_inside->cone = false;\n-// update stability check quantities\n-dpt += fabs(child->px)+fabs(child->py); //child->perp2();\n-}\n-\n-// now establish the list of unique children in the list\n-// first make sure parent and child are in!\n-list removed_from_cone;\n-list put_in_border;\n-list border_list;\n-Cmomentum cone_removal;\n-Cmomentum border = *parent;\n-border_list.push_back(parent);\n-// make sure child appears in the border region\n-centre->cocircular.push_back(centre);\n-// now establish the full contents of the cone minus the cocircular\n-// region and of the cocircular region itself\n-for(list::iterator it = centre->cocircular.begin();\n-it != centre->cocircular.end(); it++) {\n-if ((*it)->is_inside->cone) {\n-cone_removal\n-+= *((*it)->v);\n-(*it)->is_inside->cone = false;\n-removed_from_cone.push_back((*it)->is_inside);\n-}\n-// if a point appears twice (i.e. with + and - sign) in the list of\n-// points on the border, we take care not to include it twice.\n-// Note that this situation may appear when a point is at a distance\n-// close to 2R from the parent\n-if (!(*it)->is_inside->cocirc) {\n-border += *((*it)->v);\n-(*it)->is_inside->cocirc = true;\n-put_in_border.push_back((*it)->is_inside);\n-border_list.push_back((*it)->v);\n-}\n-}\n-\n-// figure out whether this pairing has been observed before\n-Cmomentum borderless_cone = cone;\n-borderless_cone -= cone_removal;\n-bool consider = true;\n-for (unsigned int i=0;i(borderless_cone.ref,\n-border.ref));\n-// first figure out whether our cone momentum is good\n-double local_dpt = fabs(cone_removal.px) + fabs(cone_removal.py);\n-double total_dpt = dpt + local_dpt;\n-recompute_cone_contents_if_needed(borderless_cone, total_dpt);\n-if (total_dpt == 0) {\n-// a recomputation has taken place -- so take advantage of this\n-// and update the member cone momentum\n-cone = borderless_cone + cone_removal;\n-dpt = local_dpt;\n-}\n-test_cone_cocircular(borderless_cone, border_list);\n-}\n-\n-// relabel things that were in the cone but got removed\n-for(list::iterator is_in = removed_from_cone.begin();\n-is_in != removed_from_cone.end(); is_in++) {\n-(*is_in)->cone = true;\n-}\n // relabel things that got put into the border\n+00653\n for(list::iterator is_in = put_in_border.begin();\n+00654\n is_in != put_in_border.end(); is_in++) {\n-\n-Generated by Doxygen\n-\n-\f5.26 protocones.cpp\n-\n 00655\n (*is_in)->cocirc = false;\n 00656\n }\n 00657\n // we\u2019re done with everything -- return true to signal to user that we\u2019ve\n 00658\n@@ -17259,30 +16563,39 @@\n 00688\n // loop will at some point go to the corresponding situation with positive\n 00689\n // sign and set the inclusion status to 0.\n 00690\n 00691\n do {\n-// as we leave this position a particle enters if its side is\n+\n+Generated by Doxygen\n+\n+221\n+\n+\f222\n+\n+File Documentation\n+\n 00692\n+// as we leave this position a particle enters if its side is\n 00693\n // negative (i.e. the centre is the one at -ve angle wrt to the\n 00694\n // parent-child line\n 00695\n if (!(*here())->side) ((*here())->is_inside->cone) = 1;\n 00696\n-// move on to the next position\n 00697\n+// move on to the next position\n 00698\n ++here;\n 00699\n-// as we arrive at this position a particle leaves if its side is positive\n 00700\n+// as we arrive at this position a particle leaves if its side is positive\n 00701\n if ((*here())->side) ((*here())->is_inside->cone) = 0;\n 00702\n } while (here != start);\n 00703\n // once we\u2019ve reached the start the \u2019is_inside\u2019 information should be\n 00704\n@@ -17300,19 +16613,19 @@\n 00712\n 00713 /*\n 00714 * compute the cone momentum from particle list.\n 00715 * in this version, we use the \u2019pincluded\u2019 information\n 00716 * from the Cvicinity class\n 00717 */\n 00718 void Cstable_cones::recompute_cone_contents(){\n-00719\n unsigned int i;\n+00719\n 00720\n-// set momentum to 0\n 00721\n+// set momentum to 0\n 00722\n cone = Cmomentum();\n 00723\n // Important note: we can browse only the particles\n 00724\n 00725\n // in vicinity since all particles in the cone are\n@@ -17320,56 +16633,47 @@\n // withing a distance 2R w.r.t. parent hence in vicinity.\n 00727\n // Among those, we only add the particles for which \u2019is_inside\u2019 is true !\n 00728\n // This methos rather than a direct comparison avoids rounding errors\n 00729\n for (i=0;iside) && (vicinity[i]->is_inside->cone))\n 00732\n cone += *vicinity[i]->v;\n 00733\n }\n 00734\n-// set check variables back to 0\n 00735\n+// set check variables back to 0\n 00736\n dpt = 0.0;\n 00737 }\n 00738\n 00739\n 00740 /*\n 00741 * if we have gone beyond the acceptable threshold of change, compute\n-00742 * the cone momentum from particle list.\n in this version, we use the\n+00742 * the cone momentum from particle list.\n 00743 * \u2019pincluded\u2019 information from the Cvicinity class, but we don\u2019t\n 00744 * change the member cone, only the locally supplied one\n 00745 */\n 00746 void Cstable_cones::recompute_cone_contents_if_needed(Cmomentum & this_cone,\n-double & this_dpt){\n 00747\n+double & this_dpt){\n 00748\n-00749\n if (this_dpt > PT_TSHOLD*(fabs(this_cone.px)+fabs(this_cone.py))) {\n+00749\n if (cone.ref.is_empty()) {\n 00750\n 00751\n this_cone = Cmomentum();\n-\n-Generated by Doxygen\n-\n-227\n-\n-\f228\n-\n-File Documentation\n-\n 00752\n } else {\n // set momentum to 0\n 00753\n 00754\n this_cone = Cmomentum();\n 00755\n@@ -17381,16 +16685,16 @@\n // withing a distance 2R w.r.t. parent hence in vicinity.\n 00759\n // Among those, we only add the particles for which \u2019is_inside\u2019 is true !\n 00760\n // This methos rather than a direct comparison avoids rounding errors\n 00761\n for (unsigned int i=0;iside) && (vicinity[i]->is_inside->cone))\n 00764\n this_cone += *vicinity[i]->v;\n 00765\n }\n 00766\n@@ -17402,84 +16706,91 @@\n this_dpt = 0.0;\n 00770\n }\n 00771\n 00772 }\n 00773\n 00774\n-//\n 00776 // VARIOUS TOOLS\n+//\n 00777 // - circle_intersect()\n //\n 00778 // - is_inside()\n //\n 00779 // - abs_dangle()\n //\n+\n+Generated by Doxygen\n+\n+\f5.25 protocones.cpp\n+\n+223\n+\n 00781\n 00782\n 00783 /*\n 00784 * circle intersection.\n 00785 * computes the intersection with a circle of given centre and radius.\n 00786 * The output takes the form of a checkxor of the intersection\u2019s particles\n-circle centre x coordinate\n 00787 * - cx\n-00788 * - cy\n+circle centre x coordinate\n circle centre y coordinate\n+00788 * - cy\n 00789 * return the checkxor for the intersection\n 00790 ******************************************************************/\n 00791 Creference Cstable_cones::circle_intersect(double cx, double cy){\n 00792\n Creference intersection;\n int i;\n 00793\n-00794\n double dx, dy;\n+00794\n 00795\n for (i=0;iM_PI)\n 00803\n dy -= twopi;\n 00804\n // really check if the distance is less than VR\n 00805\n 00806\n if (dx*dx+dy*dyeta - v->eta;\n 00825\n dy = fabs(centre_in->phi - v->phi);\n if (dy>M_PI)\n 00826\n@@ -17489,65 +16800,65 @@\n 00829\n return dx*dx+dy*dyM_PI)\n 00843\n+if (dphi>M_PI)\n 00844\n dphi = dphi-twopi;\n 00845\n-00846\n return dphi;\n+00846\n 00847 }\n 00848\n 00849 }\n \n-5.27 protocones.cpp\n+5.25 protocones.cpp\n 00001\n 00002 // File: protocones.cpp\n-//\n 00003 // Description: source file for stable cones determination (Cstable_cones)\n-//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // WARNING: this is not the main SISCone trunk but\n-//\n 00006 //\n an adaptation to spherical coordinates\n-//\n 00007 // For more details, see http://projects.hepforge.org/siscone\n-//\n 00008 //\n-//\n 00009 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n-//\n 00010 //\n+\n+Generated by Doxygen\n+\n+//\n+//\n+\n+//\n+//\n+//\n //\n+//\n+//\n+\n+\f224\n+\n 00011 // This program is free software; you can redistribute it and/or modify\n //\n 00012 // it under the terms of the GNU General Public License as published by\n //\n 00013 // the Free Software Foundation; either version 2 of the License, or\n //\n 00014 // (at your option) any later version.\n@@ -17640,38 +16951,32 @@\n 00063 #include \n 00064 #include \"protocones.h\"\n 00065 #include \n 00066 #include \n 00067 #include \n 00068\n 00069 namespace siscone_spherical{\n-\n-Generated by Doxygen\n-\n-*\n-\n-\f230\n-\n 00070\n 00071 using namespace std;\n 00072\n 00073 /**********************************************************************\n 00074 * CSphstable_cones implementation\n *\n 00075 * Computes the list of stable comes from a particle list.\n+*\n 00076 * This class does the first fundamental task of te cone algorithm:\n *\n 00077 * it is used to compute the list of stable cones given a list\n *\n 00078 * of particles.\n *\n 00079 **********************************************************************/\n 00080\n-00082 // INITIALISATION FUNCTIONS\n //\n+00082 // INITIALISATION FUNCTIONS\n 00083 // - ctor()\n //\n 00084 // - ctor(particle_list)\n //\n 00085 // - dtor()\n //\n 00086 // - init(particle_list)\n@@ -17682,39 +16987,49 @@\n 00092\n nb_tot = 0;\n 00093\n hc = NULL;\n 00094 }\n 00095\n 00096 // ctor with initialisation\n-00097 //-------------------------00098 CSphstable_cones::CSphstable_cones(vector &_particle_list)\n+00097 //--------------------------\n+\n+File Documentation\n+\n+*\n+\n+Generated by Doxygen\n+\n+\f5.25 protocones.cpp\n+\n+00098 CSphstable_cones::CSphstable_cones(vector &_particle_list)\n 00099\n : CSphvicinity(_particle_list){\n 00100\n 00101\n nb_tot = 0;\n 00102\n hc = NULL;\n 00103 }\n 00104\n 00105 // default dtor\n 00106 //-------------00107 CSphstable_cones::~CSphstable_cones(){\n-if (hc!=NULL) delete hc;\n 00108\n+if (hc!=NULL) delete hc;\n 00109 }\n 00110\n 00111 /*\n 00112 * initialisation\n 00113 * - _particle_list list of particles\n-number of particles\n 00114 * - _n\n+number of particles\n 00115 *********************************************************************/\n 00116 void CSphstable_cones::init(vector &_particle_list){\n-// check already allocated mem\n 00117\n+// check already allocated mem\n 00118\n if (hc!=NULL){\n 00119\n delete hc;\n 00120\n }\n if (protocones.size()!=0)\n@@ -17728,37 +17043,37 @@\n 00126\n // initialisation\n 00127\n set_particle_list(_particle_list);\n 00128 }\n 00129\n 00130\n-00132 // ALGORITHM MAIN ENTRY\n //\n+00132 // ALGORITHM MAIN ENTRY\n 00133 // - get_stable_cone(radius)\n //\n 00135\n 00136 /*\n 00137 * compute stable cones.\n 00138 * This function really does the job i.e. computes\n 00139 * the list of stable cones (in a seedless way)\n radius of the cones\n 00140 * - _radius:\n 00141 * The number of stable cones found is returned\n 00142 *********************************************************************/\n 00143 int CSphstable_cones::get_stable_cones(double _radius){\n-00144\n int p_idx;\n+00144\n 00145\n // check if everything is correctly initialised\n 00146\n 00147\n if (n_part==0){\n-return 0;\n 00148\n+return 0;\n 00149\n }\n 00150\n 00151\n R = _radius;\n 00152\n R2 = R*R;\n@@ -17768,87 +17083,87 @@\n tan2R *= tan2R;\n 00155\n // allow hash for cones candidates\n 00156\n 00157\n hc = new sph_hash_cones(n_part, R);\n 00158\n-00159\n // browse all particles\n-\n-File Documentation\n-\n-*\n-\n-Generated by Doxygen\n-\n-\f5.27 protocones.cpp\n-\n+00159\n 00160\n for (p_idx=0;p_idx_phi \u00ab \", \" \u00ab parent->_theta \u00ab endl;\n 00177 #endif\n 00178\n-00179\n // step 1: initialise with the first cone candidate\n+00179\n 00180\n init_cone();\n 00181\n 00182\n do{\n-// step 2: test cone stability for that pair (P,C)\n 00183\n+// step 2: test cone stability for that pair (P,C)\n 00184\n test_cone();\n 00185\n-// step 3: go to the next cone child candidate C\n 00186\n+// step 3: go to the next cone child candidate C\n+\n+Generated by Doxygen\n+\n+225\n+\n+\f226\n+\n+File Documentation\n+\n 00187\n } while (!update_cone());\n 00188\n }\n 00189\n-00190\n return proceed_with_stability();\n+00190\n 00191 }\n 00192\n 00193\n-//\n 00195 // ALGORITHM MAIN STEPS\n+//\n 00196 // - init_cone()\n //\n 00197 // - test_cone()\n //\n 00198 // - update_cone()\n //\n 00199 // - proceed_with_stability()\n@@ -17857,32 +17172,32 @@\n 00202 /*\n 00203 * initialise the cone.\n 00204 * We take the first particle in the angular ordering to compute\n 00205 * this one\n 00206 * return 0 on success, 1 on error\n 00207 *********************************************************************/\n 00208 int CSphstable_cones::init_cone(){\n-00209\n // The previous version of the algorithm was starting the\n+00209\n 00210\n // loop around vicinity elements with the \"most isolated\" child.\n 00211\n // given the nodist method to calculate the cone contents, we no\n 00212\n // longer need to worry about which cone comes first...\n 00213\n first_cone=0;\n 00214\n // now make sure we have lists of the cocircular particles\n 00215\n 00216\n prepare_cocircular_lists();\n 00217\n-//TODO? deal with a configuration with only degeneracies ?\n 00218\n+//TODO? deal with a configuration with only degeneracies ?\n 00219\n // The only possibility seems a regular hexagon with a parent point\n 00220\n // in the centre. And this situation is by itself unclear.\n 00221\n // Hence, we do nothing here !\n 00222\n@@ -17914,29 +17229,20 @@\n 00240 * are stable\n 00241 * return 0 on success 1 on error\n 00242 *********************************************************************/\n 00243 int CSphstable_cones::test_cone(){\n 00244\n siscone::Creference weighted_cone_ref;\n 00245\n-// depending on the side we are taking the child particle,\n 00246\n+// depending on the side we are taking the child particle,\n 00247\n // we test different configuration.\n 00248\n // Each time, two configurations are tested in such a way that\n-\n-Generated by Doxygen\n-\n-231\n-\n-\f232\n-\n-File Documentation\n-\n 00249\n // all 4 possible cases (parent or child in or out the cone)\n 00250\n // are tested when taking the pair of particle parent+child\n 00251\n // and child+parent.\n 00252\n@@ -17996,35 +17302,40 @@\n //UPDATED(see below):\n 00274\n //UPDATED(see below):\n cone_candidate = cone + *child;\n 00275\n //UPDATED(see below):\n hc->insert(&cone_candidate, parent, child, false, true);\n+\n+Generated by Doxygen\n+\n+\f5.25 protocones.cpp\n+\n 00276\n //UPDATED(see below): }\n 00277\n //UPDATED(see below):\n 00278\n //UPDATED(see below): nb_tot+=2;\n 00279\n 00280\n // instead of testing 2 inclusion/exclusion states for every pair, we test the 4 of them\n 00281\n // when the parent has an energy bigger than the child\n 00282\n if (parent->E >= child->E){\n-// test when both particles are not in the cone\n 00283\n+// test when both particles are not in the cone\n 00284\n // Note: for the totally exclusive case, test emptiness before\n 00285\n cone_candidate = cone;\n-if (cone.ref.not_empty()){\n 00286\n+if (cone.ref.not_empty()){\n 00287\n hc->insert(&cone_candidate, parent, child, false, false);\n 00288\n }\n 00289\n 00290\n // test when 1! of the particles is in the cone\n@@ -18036,29 +17347,29 @@\n 00294\n cone_candidate = cone;\n 00295\n cone_candidate += *child;\n 00296\n hc->insert(&cone_candidate, parent, child, false, true);\n 00297\n-// test when both are in.\n 00298\n+// test when both are in.\n 00299\n cone_candidate += *parent;\n 00300\n hc->insert(&cone_candidate, parent, child, true, true);\n 00301\n 00302\n nb_tot += 4;\n 00303\n }\n 00304\n 00305\n-00306\n return 0;\n+00306\n 00307 }\n 00308\n 00309\n 00310 /*\n 00311 * update the cone\n 00312 * go to the next child for that parent and update \u2019cone\u2019 appropriately\n 00313 * return 0 if update candidate found, 1 otherwise\n@@ -18069,72 +17380,67 @@\n cout \u00ab \"call \u2019circles_plot.gp\u2019 \u2019\" \u00ab centre->centre.px \u00ab \"\u2019 \u2019\"\n 00318\n \u00ab centre->centre.py \u00ab \"\u2019 \u2019\" \u00ab centre->centre.pz \u00ab \"\u2019\" \u00ab endl\n 00319\n \u00ab \"pause -1 \u2019(\" \u00ab centre->angle \u00ab \" \" \u00ab (centre->side ? \u2019+\u2019 : \u2019-\u2019) \u00ab \")\";\n 00320 #endif\n 00321\n-00322\n // get the next child and centre\n+00322\n 00323\n centre_idx++;\n-if (centre_idx==vicinity_size)\n 00324\n+if (centre_idx==vicinity_size)\n 00325\n centre_idx=0;\n if (centre_idx==first_cone)\n 00326\n-00327\n return 1;\n+00327\n 00328\n // update the cone w.r.t. the old child\n 00329\n 00330\n // only required if the old child is entering inside in which\n 00331\n // case we need to add it. We also know that the child is\n 00332\n // inside iff its side is -.\n 00333\n if (!centre->side){\n 00334 #ifdef DEBUG_STABLE_CONES\n 00335\n cout \u00ab \" old_enter\";\n-\n-Generated by Doxygen\n-\n-\f5.27 protocones.cpp\n-\n 00336 #endif\n 00337\n // update cone\n 00338\n cone += (*child);\n 00339\n // update info on particles inside\n 00340\n 00341\n centre->is_inside->cone = true;\n 00342\n-// update stability check quantities\n 00343\n+// update stability check quantities\n 00344\n dpt += fabs(child->px)+fabs(child->py)+fabs(child->pz);\n 00345\n }\n 00346\n 00347\n // update centre and child to correspond to the new position\n 00348\n centre = vicinity[centre_idx];\n 00349\n child = centre->v;\n 00350\n-// check cocircularity\n 00351\n+// check cocircularity\n 00352\n // note that if cocirculaity is detected (i.e. if we receive 1\n 00353\n // in the next test), we need to recall \u2019update_cone\u2019 directly\n 00354\n // since tests and remaining part of te update has been performed\n 00355\n@@ -18146,16 +17452,25 @@\n cout \u00ab \" Co-circular case detected\" \u00ab endl;\n 00359 #endif\n 00360\n return update_cone();\n 00361\n }\n 00362\n-// update the cone w.r.t. the new child\n+\n+Generated by Doxygen\n+\n+227\n+\n+\f228\n+\n+File Documentation\n+\n 00363\n+// update the cone w.r.t. the new child\n 00364\n // only required if the new child was already inside in which\n 00365\n // case we need to remove it. We also know that the child is\n 00366\n // inside iff its side is +.\n 00367\n@@ -18194,73 +17509,64 @@\n // we recompute vicinity.\n 00387\n if ((dpt>PT_TSHOLD*(fabs(cone.px)+fabs(cone.py)+fabs(cone.pz))) && (cone.ref.not_empty())){\n 00388\n recompute_cone_contents();\n 00389\n }\n-00390\n if (cone.ref.is_empty()){\n+00390\n 00391\n cone = CSphmomentum();\n 00392\n dpt=0.0;\n 00393\n }\n 00394\n 00395 #ifdef DEBUG_STABLE_CONES\n 00396\n cout \u00ab \"\u2019\" \u00ab endl;\n 00397 #endif\n 00398\n-return 0;\n 00399\n+return 0;\n 00400 }\n 00401\n 00402\n 00403 /*\n 00404 * compute stability of all enumerated candidates.\n 00405 * For all candidate cones which are stable w.r.t. their border particles,\n 00406 * pass the last test: stability with quadtree intersection\n 00407 ************************************************************************/\n 00408 int CSphstable_cones::proceed_with_stability(){\n-00409\n int i;\n+00409\n 00410\n sph_hash_element *elm;\n 00411\n 00412\n for (i=0;i<=hc->mask;i++){\n-// test ith cell of the hash array\n 00413\n+// test ith cell of the hash array\n 00414\n elm = hc->hash_array[i];\n 00415\n // browse elements therein\n 00416\n 00417\n while (elm!=NULL){\n-// test stability\n 00418\n+// test stability\n 00419\n if (elm->is_stable){\n-// stability is not ensured by all pairs of \"edges\" already browsed\n 00420\n+// stability is not ensured by all pairs of \"edges\" already browsed\n 00421 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00422\n // => testing stability with quadtree intersection\n-\n-Generated by Doxygen\n-\n-233\n-\n-\f234\n-\n-File Documentation\n-\n 00423\n if (quadtree->circle_intersect(elm->eta, elm->phi, R2)==elm->ref)\n 00424 #else\n 00425\n // => testing stability with the particle-list intersection\n 00426\n if (circle_intersect(elm->centre)==elm->centre.ref)\n@@ -18297,14 +17603,19 @@\n 00445\n hc=NULL;\n 00446\n return protocones.size();\n 00447\n 00448 }\n 00449\n+\n+Generated by Doxygen\n+\n+\f5.25 protocones.cpp\n+\n 00450\n //\n 00452 // ALGORITHM MAIN STEPS FOR COCIRCULAR SITUATIONS\n 00453 // - cocircular_pt_less(v1, v2)\n //\n 00454 // - prepare_cocircular_list()\n //\n@@ -18350,26 +17661,26 @@\n 00485\n 00486\n // their cocircularity list\n 00487\n while (true) {\n 00488\n ++search;\n-if ( siscone::abs_dphi((*search())->angle, here_pntr->angle) <\n 00489\n+if ( siscone::abs_dphi((*search())->angle, here_pntr->angle) <\n 00490\n here_pntr->cocircular_range\n 00491\n && search() != here()) {\n 00492\n (*search())->cocircular.push_back(here_pntr);\n 00493\n } else {\n-break;\n 00494\n+break;\n 00495\n }\n 00496\n }\n 00497\n // search backwards\n 00498\n@@ -18396,19 +17707,14 @@\n 00509\n }\n 00510\n 00511\n ++here;\n 00512\n } while (here() != vicinity.begin());\n-\n-Generated by Doxygen\n-\n-\f5.27 protocones.cpp\n-\n 00513 }\n 00514\n 00515 /*\n 00516 * Testing cocircular configurations in p^3 time,\n 00517 * rather than 2^p time; we will test all contiguous subsets of points\n 00518 * on the border --- note that this is till probably overkill, since\n 00519 * in principle we only have to test situations where up to a\n@@ -18428,168 +17734,168 @@\n 00528\n centre->centre.get_angular_directions(angl_dir1, angl_dir2);\n 00529\n angl_dir1/=angl_dir1._norm;\n 00530\n angl_dir2/=angl_dir2._norm;\n 00531\n-00532\n // now we have te reference axis, create the CSphborder_store structure\n+00532\n 00533\n vector border_vect;\n 00534\n border_vect.reserve(border_list.size());\n 00535\n for (list::iterator it = border_list.begin();\n 00536\n it != border_list.end(); it++) {\n 00537\n border_vect.push_back(CSphborder_store(*it, centre->centre, angl_dir1, angl_dir2));\n 00538\n }\n 00539\n-// get them into order of angle\n+\n+Generated by Doxygen\n+\n+229\n+\n+\f230\n+\n+File Documentation\n+\n 00540\n+// get them into order of angle\n 00541\n sort(border_vect.begin(), border_vect.end());\n 00542\n // set up some circulators, since these will help us go around the\n 00543\n 00544\n // circle easily\n 00545\n siscone::circulator::iterator >\n 00546\n start(border_vect.begin(), border_vect.begin(),border_vect.end());\n 00547\n siscone::circulator::iterator > mid(start), end(start);\n 00548\n-00549\n // test the borderless cone\n+00549\n 00550\n CSphmomentum candidate = borderless_cone;\n-00551\n //candidate.build_etaphi();\n+00551\n 00552\n if (candidate.ref.not_empty())\n 00553\n test_stability(candidate, border_vect);\n 00554\n-00555\n do {\n+00555\n 00556\n // reset status wrt inclusion in the cone\n 00557\n mid = start;\n-00558\n do {\n+00558\n 00559\n mid()->is_in = false;\n 00560\n } while (++mid != start);\n 00561\n-// now run over all inclusion possibilities with this starting point\n 00562\n+// now run over all inclusion possibilities with this starting point\n 00563\n candidate = borderless_cone;\n-while (++mid != start) {\n 00564\n-00565\n+while (++mid != start) {\n // will begin with start+1 and go up to start-1\n+00565\n 00566\n mid()->is_in = true;\n 00567\n candidate += *(mid()->mom);\n 00568\n test_stability(candidate, border_vect);\n 00569\n }\n 00570\n 00571\n } while (++start != end);\n 00572\n-00573\n // mid corresponds to momentum that we need to include to get the\n+00573\n 00574\n // full cone\n 00575\n mid()->is_in = true;\n 00576\n candidate += *(mid()->mom);\n 00577\n test_stability(candidate, border_vect);\n 00578 }\n 00579\n 00580\n 00587 void CSphstable_cones::test_stability(CSphmomentum & candidate, const vector &\n border_vect) {\n 00588\n-00589\n // this almost certainly has not been done...\n+00589\n 00590\n //candidate.build_etaphi();\n 00591\n 00592\n bool stable = true;\n-for (unsigned i = 0; i < border_vect.size(); i++) {\n 00593\n-00594\n+for (unsigned i = 0; i < border_vect.size(); i++) {\n if (is_closer(&candidate, border_vect[i].mom,tan2R) ^ (border_vect[i].is_in)) {\n+00594\n 00595\n stable = false;\n-00596\n break; // it\u2019s unstable so there\u2019s no point continuing\n+00596\n 00597\n }\n 00598\n }\n 00599\n 00600\n if (stable) hc->insert(&candidate);\n 00601 }\n 00602\n 00603 /*\n 00604 * check if we are in a situation of cocircularity.\n-\n-Generated by Doxygen\n-\n-235\n-\n-\f236\n-\n-File Documentation\n-\n 00605 * if it is the case, update and test in the corresponding way\n 00606 * return \u2019false\u2019 if no cocircularity detected, \u2019true\u2019 otherwise\n 00607 * Note that if cocircularity is detected, we need to\n 00608 * recall \u2019update\u2019 from \u2019update\u2019 !!!\n 00609 ***************************************************************/\n 00610 bool CSphstable_cones::cocircular_check(){\n-// check if many configurations have the same centre.\n 00611\n+// check if many configurations have the same centre.\n 00612\n // if this is the case, branch on the algorithm for this\n 00613\n // special case.\n 00614\n // Note that those situation, being considered separately in\n 00615\n // test_cone_multiple, must only be considered here if all\n 00616\n // angles are on the same side (this avoid multiple counting)\n 00617\n-if (centre->cocircular.empty()) return false;\n 00618\n+if (centre->cocircular.empty()) return false;\n 00619\n // first get cone into status required at end...\n 00620\n 00621\n if ((centre->side) && (cone.ref.not_empty())){\n-00622\n // update cone\n+00622\n 00623\n cone -= (*child);\n 00624\n // update info on particles inside\n 00625\n 00626\n centre->is_inside->cone = false;\n@@ -18597,79 +17903,88 @@\n // update stability check quantities\n 00628\n 00629\n dpt += fabs(child->px)+fabs(child->py)+fabs(child->pz); //child->perp2();\n 00630\n }\n 00631\n+\n+Generated by Doxygen\n+\n+\f5.25 protocones.cpp\n+\n 00632\n 00633\n-// now establish the list of unique children in the list\n 00634\n-// first make sure parent and child are in!\n 00635\n 00636\n-list removed_from_cone;\n 00637\n-list put_in_border;\n 00638\n-list border_list;\n 00639\n 00640\n-CSphmomentum cone_removal;\n 00641\n-CSphmomentum border = *parent;\n 00642\n-border_list.push_back(parent);\n 00643\n-// make sure child appears in the border region\n 00644\n 00645\n-centre->cocircular.push_back(centre);\n 00646\n-// now establish the full contents of the cone minus the cocircular\n 00647\n 00648\n-// region and of the cocircular region itself\n 00649\n-for(list::iterator it = centre->cocircular.begin();\n 00650\n-it != centre->cocircular.end(); it++) {\n 00651\n 00652\n-if ((*it)->is_inside->cone) {\n 00653\n-cone_removal\n-+= *((*it)->v);\n 00654\n-(*it)->is_inside->cone = false;\n 00655\n-removed_from_cone.push_back((*it)->is_inside);\n 00656\n-}\n 00657\n-// if a point appears twice (i.e. with + and - sign) in the list of\n 00658\n 00659\n-// points on the border, we take care not to include it twice.\n 00660\n-// Note that this situation may appear when a point is at a distance\n 00661\n-// close to 2R from the parent\n 00662\n-if (!(*it)->is_inside->cocirc) {\n 00663\n-border += *((*it)->v);\n 00664\n-(*it)->is_inside->cocirc = true;\n 00665\n-put_in_border.push_back((*it)->is_inside);\n 00666\n-border_list.push_back((*it)->v);\n 00667\n+\n+231\n+\n+// now establish the list of unique children in the list\n+// first make sure parent and child are in!\n+list removed_from_cone;\n+list put_in_border;\n+list border_list;\n+CSphmomentum cone_removal;\n+CSphmomentum border = *parent;\n+border_list.push_back(parent);\n+// make sure child appears in the border region\n+centre->cocircular.push_back(centre);\n+// now establish the full contents of the cone minus the cocircular\n+// region and of the cocircular region itself\n+for(list::iterator it = centre->cocircular.begin();\n+it != centre->cocircular.end(); it++) {\n+if ((*it)->is_inside->cone) {\n+cone_removal\n++= *((*it)->v);\n+(*it)->is_inside->cone = false;\n+removed_from_cone.push_back((*it)->is_inside);\n+}\n+\n+// if a point appears twice (i.e. with + and - sign) in the list of\n+// points on the border, we take care not to include it twice.\n+// Note that this situation may appear when a point is at a distance\n+// close to 2R from the parent\n+if (!(*it)->is_inside->cocirc) {\n+border += *((*it)->v);\n+(*it)->is_inside->cocirc = true;\n+put_in_border.push_back((*it)->is_inside);\n+border_list.push_back((*it)->v);\n //cout \u00ab \" adding particle \" \u00ab (*it)->v->_theta \u00ab \", \" \u00ab (*it)->v->_phi \u00ab \" to the border list\"\n \u00ab endl;\n 00668\n }\n 00669\n }\n 00670\n@@ -18678,52 +17993,47 @@\n // figure out whether this pairing has been observed before\n 00673\n CSphmomentum borderless_cone = cone;\n 00674\n borderless_cone -= cone_removal;\n bool consider = true;\n 00675\n-for (unsigned int i=0;i(borderless_cone.ref,\n 00686\n border.ref));\n 00687\n-// first figure out whether our cone momentum is good\n 00688\n+// first figure out whether our cone momentum is good\n 00689\n double local_dpt = fabs(cone_removal.px) + fabs(cone_removal.py);\n 00690\n double total_dpt = dpt + local_dpt;\n-\n-Generated by Doxygen\n-\n-\f5.27 protocones.cpp\n-\n 00691\n 00692\n recompute_cone_contents_if_needed(borderless_cone, total_dpt);\n-if (total_dpt == 0) {\n 00693\n+if (total_dpt == 0) {\n // a recomputation has taken place -- so take advantage of this\n 00694\n 00695\n // and update the member cone momentum\n 00696\n cone = borderless_cone + cone_removal;\n 00697\n@@ -18744,29 +18054,36 @@\n 00706\n is_in != removed_from_cone.end(); is_in++) {\n 00707\n (*is_in)->cone = true;\n 00708\n }\n 00709\n-00710\n // relabel things that got put into the border\n+00710\n 00711\n for(list::iterator is_in = put_in_border.begin();\n 00712\n is_in != put_in_border.end(); is_in++) {\n 00713\n (*is_in)->cocirc = false;\n 00714\n }\n 00715\n-// we\u2019re done with everything -- return true to signal to user that we\u2019ve\n 00716\n+// we\u2019re done with everything -- return true to signal to user that we\u2019ve\n 00717\n // been through the co-circularity rigmarole\n+\n+Generated by Doxygen\n+\n+\f232\n+\n+File Documentation\n+\n 00718\n return true;\n 00719 }\n 00720\n 00721\n //\n 00723 // RECOMPUTATION OF CONE CONTENTS\n@@ -18782,29 +18099,29 @@\n siscone::circulator::iterator >\n 00739\n start(vicinity.begin()+first_cone, vicinity.begin(), vicinity.end());\n 00740\n 00741\n siscone::circulator::iterator > here(start);\n 00742\n-00743\n // note that in the following algorithm, the cone contents never includes\n+00743\n 00744\n // the child. Indeed, if it has positive sign, then it will be set as\n 00745\n // outside at the last step in the loop. If it has negative sign, then the\n 00746\n // loop will at some point go to the corresponding situation with positive\n 00747\n // sign and set the inclusion status to 0.\n 00748\n 00749\n do {\n-// as we leave this position a particle enters if its side is\n 00750\n+// as we leave this position a particle enters if its side is\n 00751\n // negative (i.e. the centre is the one at -ve angle wrt to the\n 00752\n // parent-child line\n 00753\n if (!(*here())->side) ((*here())->is_inside->cone) = 1;\n 00754\n@@ -18824,120 +18141,116 @@\n 00762\n 00763\n // 100% complete, so we can use it to calculate the cone contents\n 00764\n // and then exit\n 00765\n recompute_cone_contents();\n-return;\n 00766\n+return;\n 00767\n 00768 }\n 00769\n 00770\n 00771 /*\n 00772 * compute the cone momentum from particle list.\n 00773 * in this version, we use the \u2019pincluded\u2019 information\n 00774 * from the CSphvicinity class\n 00775 */\n 00776 void CSphstable_cones::recompute_cone_contents(){\n-00777\n unsigned int i;\n+00777\n 00778\n // set momentum to 0\n 00779\n 00780\n cone = CSphmomentum();\n 00781\n-00782\n // Important note: we can browse only the particles\n+00782\n 00783\n // in vicinity since all particles in the cone are\n 00784\n // withing a distance 2R w.r.t. parent hence in vicinity.\n 00785\n // Among those, we only add the particles for which \u2019is_inside\u2019 is true !\n 00786\n // This methos rather than a direct comparison avoids rounding errors\n 00787\n for (i=0;iside) && (vicinity[i]->is_inside->cone))\n 00790\n cone += *vicinity[i]->v;\n 00791\n }\n 00792\n-00793\n // set check variables back to 0\n+00793\n 00794\n dpt = 0.0;\n 00795 }\n 00796\n 00797\n 00798 /*\n 00799 * if we have gone beyond the acceptable threshold of change, compute\n-in this version, we use the\n 00800 * the cone momentum from particle list.\n+in this version, we use the\n 00801 * \u2019pincluded\u2019 information from the CSphvicinity class, but we don\u2019t\n 00802 * change the member cone, only the locally supplied one\n 00803 */\n 00804 void CSphstable_cones::recompute_cone_contents_if_needed(CSphmomentum & this_cone,\n-00805\n double & this_dpt){\n+00805\n 00806\n if (this_dpt > PT_TSHOLD*(fabs(this_cone.px)+fabs(this_cone.py))) {\n 00807\n-if (cone.ref.is_empty()) {\n 00808\n+if (cone.ref.is_empty()) {\n 00809\n this_cone = CSphmomentum();\n 00810\n } else {\n-// set momentum to 0\n 00811\n+// set momentum to 0\n 00812\n this_cone = CSphmomentum();\n 00813\n-// Important note: we can browse only the particles\n 00814\n+// Important note: we can browse only the particles\n+\n+Generated by Doxygen\n+\n+\f5.26 quadtree.cpp\n+\n 00815\n // in vicinity since all particles in the this_cone are\n 00816\n // withing a distance 2R w.r.t. parent hence in vicinity.\n 00817\n // Among those, we only add the particles for which \u2019is_inside\u2019 is true !\n 00818\n // This methos rather than a direct comparison avoids rounding errors\n 00819\n for (unsigned int i=0;iside) && (vicinity[i]->is_inside->cone))\n 00822\n this_cone += *vicinity[i]->v;\n 00823\n }\n 00824\n 00825\n }\n-// set check variables back to 0\n 00826\n+// set check variables back to 0\n 00827\n this_dpt = 0.0;\n 00828\n }\n 00829\n 00830 }\n 00831\n@@ -18952,583 +18265,67 @@\n //\n 00839\n 00840\n 00841 /*\n 00842 * circle intersection.\n 00843 * computes the intersection with a circle of given centre and radius.\n 00844 * The output takes the form of a checkxor of the intersection\u2019s particles\n-circle centre x coordinate\n 00845 * - cx\n-00846 * - cy\n+circle centre x coordinate\n circle centre y coordinate\n+00846 * - cy\n 00847 * return the checkxor for the intersection\n 00848 ******************************************************************/\n 00849 siscone::Creference CSphstable_cones::circle_intersect(CSph3vector &cone_centre){\n 00850\n siscone::Creference intersection;\n int i;\n 00851\n 00852\n-for (i=0;i\n-00034 #include \n-00035 #include \n-00036 #include \"hash.h\"\n-00037\n-00038 #include \"defines.h\"\n-00039\n-00040 namespace siscone{\n-00041\n-00053 class Cborder_store{\n-00054 public:\n-00056\n-Cborder_store(Cmomentum * momentum, double centre_eta, double centre_phi) :\n-00057\n-mom(momentum), is_in(false) {\n-00058\n-angle = atan2(mom->phi - centre_phi, mom->eta - centre_eta);\n-00059\n-}\n-00060\n-00061\n-Cmomentum * mom;\n-double angle;\n-00062\n-bool\n-is_in;\n-00063\n-00064 };\n-00065\n-00066\n-00069 inline bool operator<(const Cborder_store & a, const Cborder_store & b) {\n-return a.angle < b.angle;\n-00070\n-00071 }\n-00072\n-00073\n-00082 class Cstable_cones : public Cvicinity{\n-00083 public:\n-00085\n-Cstable_cones();\n-00086\n-00088\n-Cstable_cones(std::vector &_particle_list);\n-00089\n-00091\n-~Cstable_cones();\n-00092\n-00097\n-void init(std::vector &_particle_list);\n-00098\n-int get_stable_cones(double _radius);\n-00106\n-00107\n-00109\n-std::vector protocones;\n-00110\n-00112\n-hash_cones *hc;\n-00113\n-00115\n-int nb_tot;\n-00116 #ifdef DEBUG_STABLE_CONES\n-00117\n-int nb_hash_cones, nb_hash_occupied;\n-00118 #endif\n-00119\n-00120 protected:\n-double R;\n-00122\n-00123\n-double R2;\n-00125\n-00126\n-00127 private:\n-00130\n-Cmomentum cone;\n-00131\n-00133\n-Cmomentum *child;\n-00134\n-00136\n-Cvicinity_elm *centre;\n-00137\n-00139\n-unsigned int centre_idx;\n-\n-Generated by Doxygen\n-\n-239\n-\n-\f240\n-\n-File Documentation\n-\n-00140\n-unsigned int first_cone;\n-00142\n-00143\n-int init_cone();\n-00149\n-00150\n-00157\n-int test_cone();\n-00158\n-int update_cone();\n-00164\n-00165\n-/*\n-00166\n-00167 * run through the vicinity of the current parent and for each child\n-00168 * indicate which members are cocircular...\n-00169 */\n-00170\n-void prepare_cocircular_lists();\n-00171\n-bool cocircular_check();\n-00179\n-00180\n-00185\n-void test_cone_cocircular(Cmomentum & borderless_cone,\n-00186\n-std::list & border_list);\n-00187\n-void test_stability(Cmomentum & candidate,\n-00194\n-00195\n-const std::vector & border_vect);\n-00196\n-void compute_cone_contents();\n-00203\n-00204\n-void recompute_cone_contents();\n-00210\n-00211\n-/*\n-00212\n-00213 * if we have gone beyond the acceptable threshold of change, compute\n-in this version, we use the\n-00214 * the cone momentum from particle list.\n-00215 * \u2019pincluded\u2019 information from the Cvicinity class, but we don\u2019t\n-00216 * change the member cone, only the locally supplied one\n-00217 */\n-00218\n-void recompute_cone_contents_if_needed(Cmomentum & this_cone, double & this_dpt);\n-00219\n-int proceed_with_stability();\n-00225\n-00226\n-/*\n-00227\n-00228 * circle intersection.\n-00229 * computes the intersection with a circle of given centre and radius.\n-00230 * The output takes the form of a checkxor of the intersection\u2019s particles\n-circle centre x coordinate\n-00231 * - cx\n-00232 * - cy\n-circle centre y coordinate\n-00233 * return the checkxor for the intersection\n-00234 ******************************************************************/\n-00235\n-Creference circle_intersect(double cx, double cy);\n-00236\n-00238\n-Cmomentum cone_candidate;\n-00239\n-00241\n-std::vector child_list;\n-00242\n-00245\n-std::vector< std::pair > multiple_centre_done;\n-00246\n-// information for updating cone contents to avoid rounding errors\n-00247\n-00248\n-double dpt;\n-00249\n-inline bool is_inside(Cmomentum *centre, Cmomentum *v);\n-00258\n-00259 };\n-00260\n-00261 /*\n-00262 * compute the absolute value of the difference between 2 angles.\n-00263 * We take care of the 2pi periodicity\n-first angle\n-00264 * \\param angle1\n-00265 * \\param angle2\n-second angle\n-00266 * \\return the absolute value of the difference between the angles\n-00267 *****************************************************************/\n-00268 inline double abs_dangle(double &angle1, double &angle2);\n-00269\n-00270 }\n-00271 #endif\n-\n-5.29 protocones.h\n-00001 // -*- C++ -*00003 // File: protocones.h\n-00004 // Description: header file for stable cones determination (Cstable_cones)\n-00005 // This file is part of the SISCone project.\n-//\n-00006 // WARNING: this is not the main SISCone trunk but\n-00007 //\n-an adaptation to spherical coordinates\n-00008 // For more details, see http://projects.hepforge.org/siscone\n-00009 //\n-00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n-\n-//\n-//\n-\n-//\n-//\n-//\n-//\n-//\n-\n-Generated by Doxygen\n-\n-\f5.29 protocones.h\n-\n-241\n-\n-00011 //\n-//\n-00012 // This program is free software; you can redistribute it and/or modify\n-//\n-00013 // it under the terms of the GNU General Public License as published by\n-//\n-00014 // the Free Software Foundation; either version 2 of the License, or\n-//\n-00015 // (at your option) any later version.\n-//\n-00016 //\n-//\n-00017 // This program is distributed in the hope that it will be useful,\n-//\n-00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n-00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-//\n-00020 // GNU General Public License for more details.\n-//\n-00021 //\n-//\n-00022 // You should have received a copy of the GNU General Public License\n-//\n-00023 // along with this program; if not, write to the Free Software\n-//\n-00024 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n-00025 //\n-//\n-00026 // $Revision:: 255\n-$//\n-00027 // $Date:: 2008-07-12 17:40:35 +0200 (Sat, 12 Jul 2008)\n-$//\n-00029\n-00030 #ifndef __SPH_PROTOCONES_H__\n-00031 #define __SPH_PROTOCONES_H__\n-00032\n-00033 #include \"momentum.h\"\n-00034 #include \"vicinity.h\"\n-00035 #include \n-00036 #include \n-00037 #include \n-00038 #include \"hash.h\"\n-00039\n-00040 #include \n-00041\n-00042 namespace siscone_spherical{\n-00043\n-00055 class CSphborder_store{\n-00056 public:\n-00058\n-CSphborder_store(CSphmomentum * momentum, CSph3vector ¢re, CSph3vector &angl_dir1, CSph3vector\n-&angl_dir2) :\n-00059\n-mom(momentum), is_in(false) {\n-00060\n-CSph3vector diff = (*momentum) - centre;\n-00061\n-angle = atan2(dot_product3(diff, angl_dir2), dot_product3(diff, angl_dir1));\n-00062 #ifdef DEBUG_STABLE_CONES\n-00063\n-std::cout \u00ab \" adding point \" \u00ab momentum->_theta \u00ab \", \" \u00ab momentum->_phi\n-00064\n-\u00ab \" at an angle of \" \u00ab angle \u00ab std::endl;\n-00065 #endif\n-00066\n-}\n-00067\n-00068\n-CSphmomentum * mom;\n-00069\n-double angle;\n-bool\n-is_in;\n-00070\n-00071 };\n-00072\n-00073\n-00076 inline bool operator<(const CSphborder_store & a, const CSphborder_store & b) {\n-00077\n-return a.angle < b.angle;\n-00078 }\n-00079\n-00080\n-00089 class CSphstable_cones : public CSphvicinity{\n-00090 public:\n-00092\n-CSphstable_cones();\n-00093\n-00095\n-CSphstable_cones(std::vector &_particle_list);\n-00096\n-00098\n-~CSphstable_cones();\n-00099\n-void init(std::vector &_particle_list);\n-00104\n-00105\n-int get_stable_cones(double _radius);\n-00113\n-00114\n-00116\n-std::vector protocones;\n-00117\n-00119\n-sph_hash_cones *hc;\n-00120\n-int nb_tot;\n-00122\n-00123 #ifdef DEBUG_STABLE_CONES\n-00124\n-int nb_hash_cones, nb_hash_occupied;\n-00125 #endif\n-00126\n-00127 protected:\n-00129\n-double R;\n-00130\n-double R2;\n-00132\n-00133\n-00135\n-double tan2R;\n-00136\n-00137 private:\n-\n-Generated by Doxygen\n-\n-\f242\n-\n-File Documentation\n-\n-00140\n-CSphmomentum cone;\n-00141\n-00143\n-CSphmomentum *child;\n-00144\n-00146\n-CSphvicinity_elm *centre;\n-00147\n-00149\n-unsigned int centre_idx;\n-00150\n-unsigned int first_cone;\n-00152\n-00153\n-00159\n-int init_cone();\n-00160\n-int test_cone();\n-00167\n-00168\n-int update_cone();\n-00174\n-00175\n-/*\n-00176\n-00177 * run through the vicinity of the current parent and for each child\n-00178 * indicate which members are cocircular...\n-00179 */\n-00180\n-void prepare_cocircular_lists();\n-00181\n-00189\n-bool cocircular_check();\n-00190\n-void test_cone_cocircular(CSphmomentum & borderless_cone,\n-00195\n-00196\n-std::list & border_list);\n-00197\n-void test_stability(CSphmomentum & candidate,\n-00204\n-00205\n-const std::vector & border_vect);\n-00206\n-void compute_cone_contents();\n-00213\n-00214\n-void recompute_cone_contents();\n-00220\n-00221\n-/*\n-00222\n-00223 * if we have gone beyond the acceptable threshold of change, compute\n-in this version, we use the\n-00224 * the cone momentum from particle list.\n-00225 * \u2019pincluded\u2019 information from the CSphvicinity class, but we don\u2019t\n-00226 * change the member cone, only the locally supplied one\n-00227 */\n-00228\n-void recompute_cone_contents_if_needed(CSphmomentum & this_cone, double & this_dpt);\n-00229\n-int proceed_with_stability();\n-00235\n-00236\n-/*\n-00237\n-00238 * circle intersection.\n-00239 * computes the intersection with a circle of given centre and radius.\n-00240 * The output takes the form of a checkxor of the intersection\u2019s particles\n-circle centre x coordinate\n-00241 * - cx\n-00242 * - cy\n-circle centre y coordinate\n-00243 * return the checkxor for the intersection\n-00244 ******************************************************************/\n-00245\n-siscone::Creference circle_intersect(CSph3vector &cone_centre);\n-00246\n-00248\n-CSphmomentum cone_candidate;\n-00249\n-00251\n-std::vector child_list;\n-00252\n-00255\n-std::vector< std::pair > multiple_centre_done;\n-00256\n-// information for updating cone contents to avoid rounding errors\n-00257\n-00258\n-double dpt;\n-00259 };\n-00260\n-00261 }\n-00262 #endif\n-\n-5.30 quadtree.cpp\n+5.26 quadtree.cpp\n 00001\n+//\n 00002 // File: quadtree.cpp\n 00003 // Description: source file for quadtree management (Cquadtree class)\n+//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // For more details, see http://projects.hepforge.org/siscone\n-00006 //\n-00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n-00008 //\n-00009 // This program is free software; you can redistribute it and/or modify\n-00010 // it under the terms of the GNU General Public License as published by\n-00011 // the Free Software Foundation; either version 2 of the License, or\n-00012 // (at your option) any later version.\n-//\n-\n-//\n //\n-\n+00006 //\n //\n+00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n //\n+00008 //\n //\n+00009 // This program is free software; you can redistribute it and/or modify\n //\n+00010 // it under the terms of the GNU General Public License as published by\n //\n+00011 // the Free Software Foundation; either version 2 of the License, or\n //\n+00012 // (at your option) any later version.\n //\n-\n-Generated by Doxygen\n-\n-\f5.30 quadtree.cpp\n-\n 00013 //\n //\n 00014 // This program is distributed in the hope that it will be useful,\n //\n 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n@@ -19551,14 +18348,23 @@\n 00026\n 00027 #include \"quadtree.h\"\n 00028 #include \n 00029 #include \n 00030 #include \n 00031\n 00032 namespace siscone{\n+\n+Generated by Doxygen\n+\n+233\n+\n+\f234\n+\n+File Documentation\n+\n 00033\n 00034 using namespace std;\n 00035\n 00036 /*******************************************************************\n 00037 * Cquadtree implementation\n *\n 00038 * Implementation of a 2D quadtree.\n@@ -19594,87 +18400,76 @@\n 00062 }\n 00063\n 00064\n 00065 // default destructor\n 00066 // at destruction, everything is destroyed except\n 00067 // physical values at the leaves\n 00068 //-----------------------------------------------00069 Cquadtree::~Cquadtree(){\n-00070\n if (has_child){\n-if (v!=NULL) delete v;\n+00070\n 00071\n-00072\n+if (v!=NULL) delete v;\n delete children[0][0];\n+00072\n 00073\n delete children[0][1];\n-delete children[1][0];\n 00074\n-00075\n+delete children[1][0];\n delete children[1][1];\n+00075\n 00076\n }\n 00077 }\n 00078\n 00079\n 00080 /*\n 00081 * init the tree.\n 00082 * By initializing the tree, we mean setting the cell parameters\n 00083 * and preparing the object to act as a seed for a new tree.\n-x-position of the center\n 00084 * - _x\n-00085 * - _y\n+x-position of the center\n y-position of the center\n+00085 * - _y\n 00086 * - half_size_x half x-size of the cell\n 00087 * - half_size_y half y-size of the cell\n 00088 * return 0 on success, 1 on error. Note that if the cell\n-is already filled, we return an error.\n 00089 *\n+is already filled, we return an error.\n 00090 ******************************************************************/\n 00091 int Cquadtree::init(double _x, double _y, double _half_size_x, double _half_size_y){\n-if (v!=NULL)\n 00092\n+if (v!=NULL)\n 00093\n return 1;\n 00094\n 00095\n centre_x = _x;\n 00096\n centre_y = _y;\n 00097\n half_size_x = _half_size_x;\n 00098\n half_size_y = _half_size_y;\n 00099\n-\n-Generated by Doxygen\n-\n-243\n-\n-*\n-\n-\f244\n-\n-File Documentation\n-\n-00100\n return 0;\n+00100\n 00101 }\n 00102\n 00103\n 00104 /*\n 00105 * adding a particle to the tree.\n 00106 * This method adds one vector to the quadtree structure which\n 00107 * is updated consequently.\n 00108 * - v\n vector to add\n 00109 * return 0 on success 1 on error\n 00110 ******************************************************************/\n 00111 int Cquadtree::add(Cmomentum *v_add){\n-00112\n // Description of the method:\n+00112\n 00113\n // -------------------------00114\n // the addition process goes as follows:\n 00115\n // 1. check if the cell is empty, in which case, add the particle\n 00116\n //\n@@ -19683,47 +18478,54 @@\n // 2. If there is a unique particle already inside,\n 00118\n //\n (a) create children\n 00119\n //\n (b) forward the existing particle to the appropriate child\n+\n+*\n+\n+Generated by Doxygen\n+\n+\f5.26 quadtree.cpp\n+\n 00120\n // 3. Add current particle to this cell and forward to the\n 00121\n //\n adequate child\n 00122\n // NOTE: we assume in the whole procedure that the particle is\n 00123\n //\n indeed inside the cell !\n 00124\n-// step 1: the case of empty cells\n 00125\n+// step 1: the case of empty cells\n 00126\n if (v==NULL){\n 00127\n v = v_add;\n return 0;\n 00128\n 00129\n }\n 00130\n-// step 2: additional work if 1! particle already present\n 00131\n+// step 2: additional work if 1! particle already present\n 00132\n //\n we use the fact that only 1-particle systems have no child\n 00133\n if (!has_child){\n-double new_half_size_x = 0.5*half_size_x;\n 00134\n-00135\n+double new_half_size_x = 0.5*half_size_x;\n double new_half_size_y = 0.5*half_size_y;\n+00135\n 00136\n // create children\n 00137\n children[0][0] = new Cquadtree(centre_x-new_half_size_x, centre_y-new_half_size_y,\n 00138\n new_half_size_x, new_half_size_y);\n 00139\n@@ -19738,16 +18540,16 @@\n children[1][1] = new Cquadtree(centre_x+new_half_size_x, centre_y+new_half_size_y,\n 00144\n new_half_size_x, new_half_size_y);\n 00145\n 00146\n has_child = true;\n 00147\n-00148\n // forward to child\n+00148\n 00149\n //? The following line assumes \u2019true\u2019==1 and \u2019false\u2019==0\n 00150\n // Note: v being a single particle, eta and phi are correct\n 00151\n children[v->eta>centre_x][v->phi>centre_y]->add(v);\n 00152\n@@ -19773,25 +18575,25 @@\n 00164\n 00165\n 00166 /*\n 00167 * circle intersection.\n 00168 * computes the intersection with a circle of given centre and radius.\n 00169 * The output takes the form of a quadtree with all squares included\n 00170 * in the circle.\n-circle centre x coordinate\n 00171 * - cx\n-00172 * - cy\n+circle centre x coordinate\n circle centre y coordinate\n+00172 * - cy\n 00173 * - cR2\n circle radius SQUARED\n 00174 * return the checksum for the intersection\n 00175 ******************************************************************/\n 00176 Creference Cquadtree::circle_intersect(double cx, double cy, double cR2){\n-// Description of the method:\n 00177\n+// Description of the method:\n 00178\n // -------------------------00179\n // 1. check if cell is empty => no intersection\n 00180\n // 2. if cell has 1! particle, check if it is inside the circle.\n 00181\n //\n@@ -19802,19 +18604,14 @@\n // 4. check if the square is inside the circle.\n 00184\n //\n If yes, add it to qt and return.\n 00185\n // 5. check intersections with children.\n 00186\n-\n-Generated by Doxygen\n-\n-\f5.30 quadtree.cpp\n-\n 00187\n // step 1: if there is no particle inside te square, no reason to go further\n 00188\n if (v==NULL)\n 00189\n return Creference();\n 00190\n@@ -19845,22 +18642,31 @@\n // test distance\n 00204\n if (dx*dx+dy*dyref;\n 00205\n 00206\n }\n+\n+Generated by Doxygen\n+\n+235\n+\n+\f236\n+\n+File Documentation\n+\n 00207\n-00208\n return Creference();\n+00208\n 00209\n }\n 00210\n-// step 3: check if there is an intersection\n 00211\n+// step 3: check if there is an intersection\n 00212\n //double ryp, rym;\n 00213\n double dx_c, dy_c;\n 00214\n // store distance with the centre of the square\n 00215\n@@ -19871,20 +18677,20 @@\n if (dy_c>M_PI) dy_c = 2.0*M_PI-dy_c;\n 00218\n 00219\n // compute (minimal) the distance (pay attention to the periodicity in phi).\n 00220\n 00221\n dx = dx_c-half_size_x;\n-00222\n if (dx<0) dx=0;\n+00222\n 00223\n dy = dy_c-half_size_y;\n-if (dy<0) dy=0;\n 00224\n+if (dy<0) dy=0;\n 00225\n // check the distance\n 00226\n 00227\n if (dx*dx+dy*dy>=cR2){\n 00228\n // no intersection\n@@ -19892,29 +18698,29 @@\n return Creference();\n 00230\n }\n 00231\n // step 4: check if included\n 00232\n 00233\n-00234\n // compute the (maximal) distance\n+00234\n 00235\n dx = dx_c+half_size_x;\n 00236\n dy = dy_c+half_size_y;\n if (dy>M_PI) dy = M_PI;\n 00237\n 00238\n // compute the distance\n 00239\n 00240\n if (dx*dx+dy*dyref;\n+00241\n 00242\n }\n 00243\n 00244\n // step 5: the square is not fully in. Recurse to children\n 00245\n return children[0][0]->circle_intersect(cx, cy, cR2)\n@@ -19936,16 +18742,16 @@\n 00258 * - flux opened stream to write to\n 00259 * return 0 on success, 1 on error\n 00260 ******************************************************************/\n 00261 int Cquadtree::save(FILE *flux){\n 00262\n if (flux==NULL)\n 00263\n-return 1;\n 00264\n+return 1;\n 00265\n if (has_child){\n 00266\n 00267\n fprintf(flux, \"%e\\t%e\\t%e\\t%e\\n\", centre_x, centre_y, half_size_x, half_size_y);\n 00268\n children[0][0]->save(flux);\n@@ -19954,25 +18760,16 @@\n 00270\n children[1][0]->save(flux);\n 00271\n children[1][1]->save(flux);\n 00272\n }\n 00273\n-\n-Generated by Doxygen\n-\n-245\n-\n-\f246\n-\n-File Documentation\n-\n-00274\n return 0;\n+00274\n 00275 }\n 00276\n 00277\n 00278 /*\n 00279 * output a data file for drawing the tree leaves.\n 00280 * This can be used to output a data file containing all the\n 00281 * tree leaves. The file contents is as follows:\n@@ -19988,34 +18785,39 @@\n 00290\n return 1;\n 00291\n if (has_child){\n 00292\n 00293\n if (children[0][0]!=NULL) children[0][0]->save_leaves(flux);\n-if (children[0][1]!=NULL) children[0][1]->save_leaves(flux);\n+\n+Generated by Doxygen\n+\n+\f5.27 quadtree.h\n+\n 00294\n-00295\n+if (children[0][1]!=NULL) children[0][1]->save_leaves(flux);\n if (children[1][0]!=NULL) children[1][0]->save_leaves(flux);\n+00295\n 00296\n if (children[1][1]!=NULL) children[1][1]->save_leaves(flux);\n 00297\n } else {\n 00298\n fprintf(flux, \"%e\\t%e\\t%e\\t%e\\n\", centre_x, centre_y, half_size_x, half_size_y);\n 00299\n }\n 00300\n-return 0;\n 00301\n+return 0;\n 00302 }\n 00303\n 00304 }\n \n-5.31 quadtree.h\n+5.27 quadtree.h\n 00001 // -*- C++ -*00003 // File: quadtree.h\n //\n 00004 // Description: header file for quadtree management (Cquadtree class)\n //\n 00005 // This file is part of the SISCone project.\n //\n 00006 // For more details, see http://projects.hepforge.org/siscone\n@@ -20073,27 +18875,22 @@\n 00047\n 00049\n Cquadtree(double _x, double _y, double _half_size_x, double _half_size_y);\n 00050\n 00054\n ~Cquadtree();\n 00055\n-00067\n int init(double _x, double _y, double _half_size_x, double _half_size_y);\n+00067\n 00068\n-00076\n int add(Cmomentum *v_add);\n+00076\n 00077\n 00088\n Creference circle_intersect(double cx, double cy, double cR2);\n-\n-Generated by Doxygen\n-\n-\f5.32 ranlux.cpp\n-\n 00089\n int save(FILE *flux);\n 00099\n 00100\n int save_leaves(FILE *flux);\n 00110\n 00111\n@@ -20114,15 +18911,23 @@\n 00120\n bool has_child;\n 00121 };\n 00122\n 00123 }\n 00124 #endif\n \n-5.32 ranlux.cpp\n+Generated by Doxygen\n+\n+237\n+\n+\f238\n+\n+File Documentation\n+\n+5.28 ranlux.cpp\n 00001 // file: ranlux.xpp\n 00002 #include \"ranlux.h\"\n 00003 #include \n 00004 #include \n 00005\n 00006 /* This is a lagged fibonacci generator with skipping developed by Luescher.\n 00007 The sequence is a series of 24-bit integers, x_n,\n@@ -20181,36 +18986,26 @@\n 00054\n 00055\n 00056 // internal generator state\n 00057 //-------------------------00058 ranlux_state_t local_ranlux_state;\n 00059\n 00060\n 00061 // incrementation of the generator state\n-00062 //---------------------------------------\n-\n-Generated by Doxygen\n-\n-247\n-\n-\f248\n-\n-File Documentation\n-\n-00063 static inline unsigned long int increment_state(){\n-unsigned int i = local_ranlux_state.i;\n+00062 //--------------------------------------00063 static inline unsigned long int increment_state(){\n 00064\n-00065\n+unsigned int i = local_ranlux_state.i;\n unsigned int j = local_ranlux_state.j;\n-long int delta = local_ranlux_state.u[j] - local_ranlux_state.u[i]\n+00065\n 00066\n+long int delta = local_ranlux_state.u[j] - local_ranlux_state.u[i]\n 00067\n - local_ranlux_state.carry;\n 00068\n-00069\n if (delta & mask_hi){\n+00069\n 00070\n local_ranlux_state.carry = 1;\n 00071\n delta &= mask_lo;\n 00072\n } else {\n 00073\n@@ -20221,63 +19016,68 @@\n 00076\n local_ranlux_state.u[i] = delta;\n 00077\n if (i==0)\n 00078\n 00079\n i = 23;\n-00080\n else\n+00080\n 00081\n i--;\n 00082\n 00083\n local_ranlux_state.i = i;\n 00084\n-00085\n if (j == 0)\n+00085\n+\n+Generated by Doxygen\n+\n+\f5.28 ranlux.cpp\n+\n 00086\n j = 23;\n else\n 00087\n 00088\n j--;\n 00089\n 00090\n local_ranlux_state.j = j;\n 00091\n-00092\n return delta;\n+00092\n 00093 }\n 00094\n 00095\n 00096 // set generator state\n 00097 //--------------------00098 static void ranlux_set(unsigned long int s){\n-00099\n int i;\n-long int seed;\n+00099\n 00100\n+long int seed;\n 00101\n if (s==0)\n 00102\n 00103\n s = 314159265;\n /* default seed is 314159265 */\n 00104\n 00105\n seed = s;\n 00106\n-/* This is the initialization algorithm of F. James, widely in use\n 00107\n+/* This is the initialization algorithm of F. James, widely in use\n 00108 for RANLUX. */\n 00109\n 00110\n for (i=0;i<24;i++){\n-00111\n unsigned long int k = seed/53668;\n+00111\n 00112\n seed = 40014*(seed-k*53668)-k*12211;\n if (seed<0){\n 00113\n 00114\n seed += 2147483563;\n 00115\n@@ -20292,16 +19092,16 @@\n 00120\n local_ranlux_state.j = 9;\n 00121\n local_ranlux_state.n = 0;\n 00122\n local_ranlux_state.skip = 389-24; // 389 => best decorrelation\n 00123\n-if (local_ranlux_state.u[23]&mask_hi){\n 00124\n+if (local_ranlux_state.u[23]&mask_hi){\n 00125\n local_ranlux_state.carry = 1;\n 00126\n } else {\n 00127\n local_ranlux_state.carry = 0;\n 00128\n@@ -20318,31 +19118,24 @@\n 00137 }\n 00138\n 00139\n 00140 // get random number\n 00141 //------------------00142 unsigned long int ranlux_get(){\n 00143\n const unsigned int skip = local_ranlux_state.skip;\n-00144\n unsigned long int r = increment_state();\n+00144\n 00145\n 00146\n local_ranlux_state.n++;\n 00147\n-if (local_ranlux_state.n == 24){\n 00148\n-00149\n+if (local_ranlux_state.n == 24){\n unsigned int i;\n-\n-Generated by Doxygen\n-\n-\f5.33 siscone/ranlux.h File Reference\n-\n-249\n-\n+00149\n 00150\n local_ranlux_state.n = 0;\n for (i = 0; i < skip; i++)\n 00151\n 00152\n increment_state();\n 00153\n@@ -20354,81 +19147,83 @@\n 00157\n 00158 // print generator state\n 00159 //----------------------00160 void ranlux_print_state(){\n size_t i;\n 00161\n 00162\n unsigned char *p = (unsigned char *) (&local_ranlux_state);\n-const size_t n = sizeof (ranlux_state_t);\n 00163\n+const size_t n = sizeof (ranlux_state_t);\n 00164\n for (i=0;i\n 00030\n 00031 namespace siscone{\n 00032\n 00033 /*******************************************************\n 00034 * Creference implementation\n *\n 00035 * references used for checksums.\n-*\n 00036 *\n *\n 00037 * This class implements some reference variable\n *\n 00038 * that can be used for checksums. Those checksums\n *\n 00039 * are useful to disentengle between contents of two\n@@ -20562,68 +19357,59 @@\n 00052 // create a random reference\n 00053 //--------------------------00054 void Creference::randomize(){\n 00055 // ref[0] = reference_bit;\n 00056 // ref[1] = 0;\n 00057 // ref[2] = 0;\n 00058 // reference_bit \u00ab= 1;\n 00059\n-unsigned int r1 = ranlux_get();\n 00060\n-00061\n+unsigned int r1 = ranlux_get();\n unsigned int r2 = ranlux_get();\n-unsigned int r3 = ranlux_get();\n+00061\n 00062\n-00063\n+unsigned int r3 = ranlux_get();\n unsigned int r4 = ranlux_get();\n-// since ranlux only produces 24 bits, take r4 and add 8 bits\n+00063\n 00064\n+// since ranlux only produces 24 bits, take r4 and add 8 bits\n 00065\n // from it to each of r1,r2, r3 to get 3*32 bits.\n 00066\n ref[0] = r1+((r4 & 0x00ff0000) \u00ab 8);\n 00067\n ref[1] = r2+((r4 & 0x0000ff00) \u00ab 16);\n 00068\n ref[2] = r3+((r4 & 0x000000ff) \u00ab 24);\n 00069\n-if (is_empty()) randomize();\n 00070\n+if (is_empty()) randomize();\n 00071 }\n 00072\n 00073 // test emptyness\n 00074 //---------------00075 bool Creference::is_empty(){\n-return (ref[0]==0) && (ref[1]==0) && (ref[2]==0);\n 00076\n+return (ref[0]==0) && (ref[1]==0) && (ref[2]==0);\n 00077 }\n 00078\n 00079 // test non-emptyness\n 00080 //-------------------00081 bool Creference::not_empty(){\n return (ref[0]!=0) || (ref[1]!=0) || (ref[2]!=0);\n 00082\n 00083 }\n 00084\n-\n-Generated by Doxygen\n-\n-*\n-\n-\f252\n-\n-File Documentation\n-\n 00085 // assignment of reference\n 00086 //------------------------00087 Creference& Creference::operator = (const Creference &r){\n 00088\n ref[0] = r.ref[0];\n 00089\n ref[1] = r.ref[1];\n 00090\n ref[2] = r.ref[2];\n-return *this;\n 00091\n+return *this;\n 00092 }\n 00093\n 00094 // addition of reference\n 00095 //----------------------00096 Creference Creference::operator + (const Creference &r){\n 00097\n Creference tmp = *this;\n 00098\n@@ -20634,34 +19420,45 @@\n 00102 //----------------------------00103 Creference& Creference::operator += (const Creference &r){\n 00104\n ref[0] ^= r.ref[0];\n 00105\n ref[1] ^= r.ref[1];\n 00106\n ref[2] ^= r.ref[2];\n-00107\n return *this;\n+00107\n 00108 }\n 00109\n 00110 // decrementation of reference\n 00111 //----------------------------00112 Creference& Creference::operator -= (const Creference &r){\n 00113\n ref[0] ^= r.ref[0];\n 00114\n ref[1] ^= r.ref[1];\n 00115\n ref[2] ^= r.ref[2];\n-return *this;\n+\n+File Documentation\n+\n+*\n+\n+*\n+\n+Generated by Doxygen\n+\n+\f5.32 reference.h\n+\n 00116\n+return *this;\n 00117 }\n 00118\n 00119 }\n 00120\n \n-5.36 reference.h\n+5.32 reference.h\n 00001 // -*- C++ -*00003 // File: reference.h\n //\n 00004 // Description: header file for checkxor management (Creference class)\n //\n 00005 // This file is part of the SISCone project.\n //\n 00006 // For more details, see http://projects.hepforge.org/siscone\n@@ -20713,42 +19510,37 @@\n 00044 public:\n 00046\n Creference();\n 00047\n void randomize();\n 00049\n 00050\n-bool is_empty();\n 00052\n+bool is_empty();\n 00053\n-00055\n bool not_empty();\n+00055\n 00056\n 00058\n Creference& operator = (const Creference &r);\n-\n-Generated by Doxygen\n-\n-\f5.37 siscone.cpp\n-\n 00059\n 00061\n Creference operator + (const Creference &r);\n 00062\n 00064\n Creference& operator += (const Creference &r);\n 00065\n 00067\n Creference& operator -= (const Creference &r);\n 00068\n inline unsigned int operator[] (int i) {return ref[i];}\n 00070\n 00071\n-unsigned int ref[3];\n 00072\n+unsigned int ref[3];\n 00073 };\n 00074\n 00076 Creference operator + (Creference &r1, Creference &r2);\n 00077\n 00079 bool operator == (const Creference &r1, const Creference &r2);\n 00080\n 00082 bool operator != (const Creference &r1, const Creference &r2);\n@@ -20756,20 +19548,30 @@\n 00085 bool operator < (const Creference &r1, const Creference &r2);\n 00086\n 00087\n 00088 //=============== inline material ================\n 00089\n 00090 // equality test for two references\n 00091 //---------------------------------00092 inline bool operator == (const Creference &r1, const Creference &r2){\n-00093\n return (r1.ref[0]==r2.ref[0]) && (r1.ref[1]==r2.ref[1]) && (r1.ref[2]==r2.ref[2]);\n+00093\n 00094 }\n 00095\n 00096 // difference test for two references\n-00097 //---------------------------------00098 inline bool operator != (const Creference &r1, const Creference &r2){\n+00097 //----------------------------------\n+\n+Generated by Doxygen\n+\n+243\n+\n+\f244\n+\n+File Documentation\n+\n+00098 inline bool operator != (const Creference &r1, const Creference &r2){\n return (r1.ref[0]!=r2.ref[0]) || (r1.ref[1]!=r2.ref[1]) || (r1.ref[2]!=r2.ref[2]);\n 00099\n 00100 }\n 00101\n 00102 // difference test for two references\n 00103 //---------------------------------00104 inline bool operator < (const Creference &r1, const Creference &r2){\n 00105\n@@ -20780,15 +19582,15 @@\n 00107\n ));\n 00108 }\n 00109\n 00110 }\n 00111 #endif\n \n-5.37 siscone.cpp\n+5.33 siscone.cpp\n 00001\n //\n 00002 // File: siscone.cpp\n 00003 // Description: source file for the main SISCone class\n //\n 00004 // This file is part of the SISCone project.\n //\n@@ -20834,23 +19636,14 @@\n 00026\n 00027 #include \"config.h\"\n 00028 #include \"ranlux.h\"\n 00029 #include \"momentum.h\"\n 00030 #include \"defines.h\"\n 00031 #include \"siscone.h\"\n 00032 #include \"siscone_error.h\"\n-\n-Generated by Doxygen\n-\n-253\n-\n-\f254\n-\n-File Documentation\n-\n 00033 #include \n 00034 #include \n 00035 #include \n 00036\n 00037 namespace siscone{\n 00038 using namespace std;\n 00039\n@@ -20878,29 +19671,36 @@\n 00058\n rerun_allowed = false;\n 00059 }\n 00060\n 00061 bool Csiscone::init_done=false;\n 00062 std::ostream* Csiscone::_banner_ostr = &cout;\n 00063\n+\n+*\n+\n+Generated by Doxygen\n+\n+\f5.33 siscone.cpp\n+\n 00064 /*\n 00065 * compute the jets from a given particle set doing multiple passes\n 00066 * such pass N looks for jets among all particles not put into jets\n 00067 * during previous passes.\n 00068 * - _particles\n list of particles\n cone radius\n 00069 * - _radius\n 00070 * - _f\n shared energy threshold for splitting&merging\n 00071 * - _n_pass_max maximum number of runs\n 00072 * - _ptmin\n minimum pT of the protojets\n-the scale choice for the split-merge procedure\n 00073 * - _split_merge_scale\n+the scale choice for the split-merge procedure\n NOTE: using pt leads to IR unsafety for some events with momentum\n 00074 *\n 00075 *\n conservation. So we strongly advise not to change the default\n value.\n 00076 *\n 00077 * return the number of jets found.\n@@ -20938,16 +19738,16 @@\n 00097\n // init the split_merge algorithm with the initial list of particles\n 00098\n // this initialises particle list p_left of remaining particles to deal with\n 00099\n init_particles(_particles);\n 00100\n-00101\n bool finished = false;\n+00101\n 00102\n 00103\n rerun_allowed = false;\n 00104\n protocones_list.clear();\n 00105\n 00106 #ifdef DEBUG_STABLE_CONES\n@@ -20955,36 +19755,29 @@\n nb_hash_cones_total = 0;\n 00108\n nb_hash_occupied_total = 0;\n 00109 #endif\n 00110\n 00111\n do{\n-// initialise stable_cone finder\n 00112\n+// initialise stable_cone finder\n 00113\n // here we use the list of remaining particles\n 00114\n // AFTER COLLINEAR CLUSTERING !!!!!!\n 00115\n Cstable_cones::init(p_uncol_hard);\n 00116\n-00117\n // get stable cones\n+00117\n 00118\n if (get_stable_cones(_radius)){\n 00119\n // we have some new protocones; add them to candidates\n-\n-*\n-\n-Generated by Doxygen\n-\n-\f5.37 siscone.cpp\n-\n 00120\n // Note that add_protocones has to be called first\n 00121\n // if we want the 4-vect components to be available\n 00122\n // on top of eta and phi.\n 00123\n@@ -21021,19 +19814,28 @@\n 00141 }\n 00142\n 00143\n 00144 /*\n 00145 * compute the jets from a given particle set doing multiple passes\n 00146 * such pass N looks for jets among all particles not put into jets\n 00147 * during previous passes.\n-00148 * - _particles\n list of particles\n-cone radius\n+00148 * - _particles\n 00149 * - _radius\n+cone radius\n 00150 * - _n_pass_max maximum number of runs\n+\n+Generated by Doxygen\n+\n+245\n+\n+\f246\n+\n+File Documentation\n+\n minimum pT of the protojets\n 00151 * - _ptmin\n 00152 * - _ordering_scale\n the ordering scale to decide which stable\n cone is removed\n 00153 *\n 00154 * return the number of jets found.\n@@ -21101,16 +19903,16 @@\n Cstable_cones::init(p_uncol_hard);\n 00190\n // get stable cones (stored in \u2019protocones\u2019)\n 00191\n 00192\n unclustered_left = get_stable_cones(_radius);\n 00193\n-00194\n // add the hardest stable cone to the list of jets\n+00194\n 00195\n if (add_hardest_protocone_to_jets(&protocones, R2, _ptmin)) break;\n 00196\n 00197\n _n_pass_max--;\n 00198\n } while ((unclustered_left) && (n_left>0) && (_n_pass_max!=0));\n@@ -21120,98 +19922,98 @@\n 00201\n return jets.size();\n 00202 }\n 00203\n 00204\n 00205 /*\n 00206 * recompute the jets with a different overlap parameter.\n-\n-Generated by Doxygen\n-\n-255\n-\n-\f256\n-\n-File Documentation\n-\n 00207 * we use the same particles and R as in the preceeding call.\n-00208 * - _f\n shared energy threshold for splitting&merging\n-minimum pT of the protojets\n+00208 * - _f\n 00209 * - _ptmin\n+minimum pT of the protojets\n 00210 * - _split_merge_scale\n the scale choice for the split-merge procedure\n-00211 *\n NOTE: using pt leads to IR unsafety for some events with momentum\n-conservation. So we strongly advise not to change the default\n+00211 *\n 00212 *\n-00213 *\n+conservation. So we strongly advise not to change the default\n value.\n+00213 *\n 00214 * return the number of jets found, -1 if recomputation not allowed.\n 00215 ********************************************************************/\n 00216 int Csiscone::recompute_jets(double _f, double _ptmin,\n 00217\n Esplit_merge_scale _split_merge_scale){\n-if (!rerun_allowed)\n 00218\n-00219\n+if (!rerun_allowed)\n return -1;\n+00219\n 00220\n 00221\n ptcomparison.split_merge_scale = _split_merge_scale;\n 00222\n // restore particle list\n 00223\n 00224\n partial_clear();\n 00225\n init_pleft();\n 00226\n-// initialise split/merge algorithm\n 00227\n+// initialise split/merge algorithm\n 00228\n unsigned int i;\n 00229\n for (i=0;iflags());\n 00250\n 00251\n-(*_banner_ostr) \u00ab \"#ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\" \u00ab endl;\n 00252\n+\n+247\n+\n+// initialise random number generator\n+if (init_done) return;\n+// initialise random number generator\n+ranlux_init();\n+// do not do this again\n+init_done=true;\n+// print the banner\n+if (_banner_ostr != 0){\n+ios::fmtflags flags_to_restore(_banner_ostr->flags());\n+\n+(*_banner_ostr) \u00ab \"#ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\" \u00ab endl;\n (*_banner_ostr) \u00ab \"#\n SISCone\n version \" \u00ab setw(28) \u00ab left \u00ab siscone_version()\n \u00ab \"o\" \u00ab endl;\n 00253\n (*_banner_ostr) \u00ab \"#\n http://projects.hepforge.org/siscone\n@@ -21226,17 +20028,17 @@\n (*_banner_ostr) \u00ab \"# SISCone was written by Gavin Salam and Gregory Soyez\n o\" \u00ab endl;\n 00257\n (*_banner_ostr) \u00ab \"# It is released under the terms of the GNU General Public License o\" \u00ab endl;\n 00258\n (*_banner_ostr) \u00ab \"#\n o\" \u00ab endl;\n-o\" \u00ab endl;\n 00259\n (*_banner_ostr) \u00ab \"# A description of the algorithm is available in the publication\n+o\" \u00ab endl;\n 00260\n (*_banner_ostr) \u00ab \"# JHEP 05 (2007) 086 [arXiv:0704.0292 (hep-ph)].\n o\" \u00ab endl;\n 00261\n (*_banner_ostr) \u00ab \"# Please cite it if you use SISCone.\n o\" \u00ab endl;\n 00262\n@@ -21266,68 +20068,71 @@\n 00282\n return SISCONE_PACKAGE_NAME;\n 00283 }\n 00284\n 00285 /*\n 00286 * return SISCone version number.\n 00287 * return a string of the form \"X.Y.Z\" with possible additional tag\n-(alpha, beta, devel) to mention stability status\n 00288 *\n+(alpha, beta, devel) to mention stability status\n 00289 */\n 00290 string siscone_version(){\n-\n-Generated by Doxygen\n-\n-\f5.38 siscone.cpp\n-\n-257\n-\n-00291\n return SISCONE_VERSION;\n+00291\n 00292 }\n 00293\n 00294 }\n \n-5.38 siscone.cpp\n+5.34 siscone.cpp\n 00001\n-//\n 00002 // File: siscone.cpp\n 00003 // Description: source file for the main SISCone class\n-//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // WARNING: this is not the main SISCone trunk but\n-//\n 00006 //\n an adaptation to spherical coordinates\n-//\n 00007 // For more details, see http://projects.hepforge.org/siscone\n-//\n 00008 //\n-//\n 00009 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n-//\n 00010 //\n-//\n 00011 // This program is free software; you can redistribute it and/or modify\n-//\n 00012 // it under the terms of the GNU General Public License as published by\n-//\n 00013 // the Free Software Foundation; either version 2 of the License, or\n-//\n 00014 // (at your option) any later version.\n //\n 00015 //\n-//\n 00016 // This program is distributed in the hope that it will be useful,\n-//\n 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+\n+Generated by Doxygen\n+\n+//\n+//\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+//\n+//\n //\n+//\n+\n+\f248\n+\n+File Documentation\n+\n 00019 // GNU General Public License for more details.\n //\n 00020 //\n //\n 00021 // You should have received a copy of the GNU General Public License\n //\n 00022 // along with this program; if not, write to the Free Software\n@@ -21356,14 +20161,15 @@\n 00042 /***************************************************************\n 00043 * CSphsiscone implementation\n *\n 00044 * final class: gather everything to compute the jet contents. *\n 00045 *\n *\n 00046 * This is the class user should use.\n+*\n 00047 * It computes the jet contents of a list of particles\n *\n 00048 * given a cone radius and a threshold for splitting/merging.\n *\n 00049 ***************************************************************/\n 00050\n 00051 // default ctor\n@@ -21385,50 +20191,41 @@\n 00067 * compute the jets from a given particle set doing multiple passes\n 00068 * such pass N looks for jets among all particles not put into jets\n 00069 * during previous passes.\n 00070 * - _particles\n list of particles\n cone radius\n 00071 * - _radius\n-shared energy threshold for splitting&merging\n 00072 * - _f\n+shared energy threshold for splitting&merging\n 00073 * - _n_pass_max maximum number of runs\n-00074 * - _Emin\n minimum energy of the protojets\n-\n-Generated by Doxygen\n-\n-*\n-\n-\f258\n-\n-File Documentation\n-\n-the scale choice for the split-merge procedure\n+00074 * - _Emin\n 00075 * - _split_merge_scale\n-00076 *\n+the scale choice for the split-merge procedure\n NOTE: using pt leads to IR unsafety for some events with momentum\n-conservation. So we strongly advise not to change the default\n+00076 *\n 00077 *\n+conservation. So we strongly advise not to change the default\n 00078 *\n value.\n 00079 * return the number of jets found.\n 00080 **********************************************************************/\n 00081 int CSphsiscone::compute_jets(vector &_particles, double _radius, double _f,\n-00082\n int _n_pass_max, double _Emin,\n+00082\n 00083\n Esplit_merge_scale _split_merge_scale){\n // make sure things are initialised\n 00084\n 00085\n _initialise_if_needed();\n 00086\n-// run some general safety tests (NB: f will be checked in split-merge)\n 00087\n+// run some general safety tests (NB: f will be checked in split-merge)\n 00088\n if (_radius <= 0.0 || _radius >= 0.5*M_PI) {\n 00089\n ostringstream message;\n 00090\n message \u00ab \"Illegal value for cone radius, R = \" \u00ab _radius\n 00091\n@@ -21441,24 +20238,31 @@\n 00095\n 00096\n 00097\n ptcomparison.split_merge_scale = _split_merge_scale;\n 00098\n partial_clear(); // make sure some things are initialised properly\n 00099\n-// init the split_merge algorithm with the initial list of particles\n 00100\n+// init the split_merge algorithm with the initial list of particles\n 00101\n // this initialises particle list p_left of remaining particles to deal with\n 00102\n init_particles(_particles);\n 00103\n-00104\n bool finished = false;\n+00104\n 00105\n+\n+Generated by Doxygen\n+\n+\f5.34 siscone.cpp\n+\n+249\n+\n 00106\n rerun_allowed = false;\n 00107\n protocones_list.clear();\n 00108\n 00109 #ifdef DEBUG_STABLE_CONES\n 00110\n@@ -21528,55 +20332,50 @@\n cone radius\n 00149 * - _radius\n 00150 * - _n_pass_max maximum number of runs\n minimum energy of the protojets\n 00151 * - _Emin\n 00152 * - _ordering_scale\n the ordering scale to decide which stable\n-cone is removed\n 00153 *\n+cone is removed\n 00154 * return the number of jets found.\n 00155 **********************************************************************/\n 00156 int CSphsiscone::compute_jets_progressive_removal(vector &_particles, double _radius,\n int _n_pass_max, double _Emin,\n 00157\n 00158\n Esplit_merge_scale _ordering_scale){\n-00159\n // make sure things are initialised\n+00159\n 00160\n _initialise_if_needed();\n 00161\n-\n-Generated by Doxygen\n-\n-\f5.38 siscone.cpp\n-\n-00162\n // run some general safety tests (NB: f will be checked in split-merge)\n+00162\n 00163\n if (_radius <= 0.0 || _radius >= 0.5*M_PI) {\n 00164\n ostringstream message;\n 00165\n message \u00ab \"Illegal value for cone radius, R = \" \u00ab _radius\n 00166\n \u00ab \" (legal values are 0flags());\n 00250\n 00251\n-00252\n-\n-File Documentation\n-\n-ios::fmtflags flags_to_restore(_banner_ostr->flags());\n-\n (*_banner_ostr) \u00ab \"#ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\" \u00ab endl;\n+00252\n+(*_banner_ostr) \u00ab \"#\n SISCone\n version \" \u00ab setw(28) \u00ab left \u00ab siscone_version()\n-(*_banner_ostr) \u00ab \"#\n \u00ab \"o\" \u00ab endl;\n-00253\n-(*_banner_ostr) \u00ab \"#\n http://projects.hepforge.org/siscone\n o\" \u00ab endl;\n-o\" \u00ab endl;\n+00253\n+(*_banner_ostr) \u00ab \"#\n 00254\n (*_banner_ostr) \u00ab \"#\n-00255\n-(*_banner_ostr) \u00ab \"# This is SISCone: the Seedless Infrared Safe Cone Jet Algorithm\n o\" \u00ab endl;\n o\" \u00ab endl;\n+00255\n+(*_banner_ostr) \u00ab \"# This is SISCone: the Seedless Infrared Safe Cone Jet Algorithm\n 00256\n (*_banner_ostr) \u00ab \"# SISCone was written by Gavin Salam and Gregory Soyez\n+o\" \u00ab endl;\n 00257\n (*_banner_ostr) \u00ab \"# It is released under the terms of the GNU General Public License o\" \u00ab endl;\n 00258\n (*_banner_ostr) \u00ab \"#\n o\" \u00ab endl;\n+00259\n+(*_banner_ostr) \u00ab \"#\n !!!\n WARNING\n !!!\n-00259\n-(*_banner_ostr) \u00ab \"#\n-o\" \u00ab endl;\n-This is the version of SISCone using spherical coordinates\n o\" \u00ab endl;\n 00260\n (*_banner_ostr) \u00ab \"#\n-00261\n-(*_banner_ostr) \u00ab \"#\n+This is the version of SISCone using spherical coordinates\n o\" \u00ab endl;\n o\" \u00ab endl;\n+00261\n+(*_banner_ostr) \u00ab \"#\n 00262\n (*_banner_ostr) \u00ab \"# A description of the algorithm is available in the publication\n+o\" \u00ab endl;\n 00263\n (*_banner_ostr) \u00ab \"# JHEP 05 (2007) 086 [arXiv:0704.0292 (hep-ph)].\n o\" \u00ab endl;\n 00264\n (*_banner_ostr) \u00ab \"# Please cite it if you use SISCone.\n o\" \u00ab endl;\n 00265\n@@ -21769,15 +20564,21 @@\n _banner_ostr->flags(flags_to_restore);\n 00270\n }\n 00271 }\n 00272\n 00273 // finally, a bunch of functions to access to\n 00274 // basic information (package name, version)\n-00275 //--------------------------------------------00276\n+00275 //---------------------------------------------\n+\n+Generated by Doxygen\n+\n+\f5.35 siscone.h\n+\n+00276\n 00277 /*\n 00278 * return SISCone package name.\n 00279 * This is nothing but \"SISCone\", it is a replacement to the\n 00280 * SISCONE_PACKAGE_NAME string defined in config.h and which is not\n 00281 * guaranteed to be public.\n 00282 * return the SISCone name as a string\n 00283 */\n@@ -21795,15 +20596,15 @@\n 00293 string siscone_version(){\n return SISCONE_VERSION;\n 00294\n 00295 }\n 00296\n 00297 }\n \n-5.39 siscone.h\n+5.35 siscone.h\n 00001 // -*- C++ -*00003 // File: siscone.h\n //\n 00004 // Description: header file for the main SISCone class\n //\n 00005 // This file is part of the SISCone project.\n //\n 00006 // For more details, see http://projects.hepforge.org/siscone\n@@ -21841,21 +20642,14 @@\n 00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n 00023 //\n //\n 00024 // $Revision:: 401\n $//\n 00025 // $Date:: 2016-05-19 16:44:37 +0200 (Thu, 19 May 2016)\n $//\n-\n-Generated by Doxygen\n-\n-\f5.40 siscone.h\n-\n-261\n-\n 00027\n 00028 #ifndef __SISCONE_H__\n 00029 #define __SISCONE_H__\n 00030\n 00031 #include \"protocones.h\"\n 00032 #include \"split_merge.h\"\n 00033\n@@ -21865,41 +20659,50 @@\n 00049 public:\n 00051\n Csiscone();\n 00052\n 00054\n ~Csiscone();\n 00055\n-int compute_jets(std::vector &_particles, double _radius, double _f,\n 00076\n+int compute_jets(std::vector &_particles, double _radius, double _f,\n 00077\n int _n_pass_max=0, double _ptmin=0.0,\n 00078\n Esplit_merge_scale _split_merge_scale=SM_pttilde);\n 00079\n-00097\n int compute_jets_progressive_removal(std::vector &_particles, double _radius,\n-int _n_pass_max=0, double _ptmin=0.0,\n+00097\n 00098\n+int _n_pass_max=0, double _ptmin=0.0,\n 00099\n Esplit_merge_scale _ordering_scale=SM_pttilde);\n 00100\n 00113\n int recompute_jets(double _f, double _ptmin = 0.0,\n 00114\n Esplit_merge_scale _split_merge_scale=SM_pttilde);\n 00115\n 00117\n std::vector > protocones_list;\n 00118\n-00119\n // random number initialisation\n+00119\n 00120\n static bool init_done;\n 00121\n+\n+Generated by Doxygen\n+\n+251\n+\n+\f252\n+\n+File Documentation\n+\n 00122 #ifdef DEBUG_STABLE_CONES\n 00123\n int nb_hash_cones_total, nb_hash_occupied_total;\n 00124 #endif\n 00125\n 00137\n static void set_banner_stream(std::ostream * ostr) {_banner_ostr = ostr;}\n@@ -21925,62 +20728,52 @@\n 00166 std::string siscone_package_name();\n 00167\n 00173 std::string siscone_version();\n 00174\n 00175 }\n 00176 #endif\n \n-5.40 siscone.h\n+5.36 siscone.h\n 00001 // -*- C++ -*00003 // File: siscone.h\n+//\n 00004 // Description: header file for the main SISCone class\n+//\n 00005 // This file is part of the SISCone project.\n //\n 00006 // WARNING: this is not the main SISCone trunk but\n+//\n 00007 //\n an adaptation to spherical coordinates\n+//\n 00008 // For more details, see http://projects.hepforge.org/siscone\n+//\n 00009 //\n+//\n 00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n+//\n 00011 //\n+//\n 00012 // This program is free software; you can redistribute it and/or modify\n+//\n 00013 // it under the terms of the GNU General Public License as published by\n+//\n 00014 // the Free Software Foundation; either version 2 of the License, or\n+//\n 00015 // (at your option) any later version.\n //\n 00016 //\n-00017 // This program is distributed in the hope that it will be useful,\n-00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-00020 // GNU General Public License for more details.\n-//\n-\n-Generated by Doxygen\n-\n-//\n-//\n-\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n //\n-\n+00017 // This program is distributed in the hope that it will be useful,\n //\n+00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n+00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n //\n+00020 // GNU General Public License for more details.\n //\n-\n-\f262\n-\n-File Documentation\n-\n 00021 //\n //\n 00022 // You should have received a copy of the GNU General Public License\n //\n 00023 // along with this program; if not, write to the Free Software\n //\n 00024 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n@@ -22005,36 +20798,43 @@\n CSphsiscone();\n 00054\n 00056\n ~CSphsiscone();\n 00057\n 00076\n int compute_jets(std::vector &_particles, double _radius, double _f,\n-int _n_pass_max=0, double _Emin=0.0,\n 00077\n+int _n_pass_max=0, double _Emin=0.0,\n 00078\n Esplit_merge_scale _split_merge_scale=SM_Etilde);\n 00079\n-00094\n int compute_jets_progressive_removal(std::vector &_particles, double _radius,\n-int _n_pass_max=0, double _Emin=0.0,\n+00094\n 00095\n+int _n_pass_max=0, double _Emin=0.0,\n 00096\n Esplit_merge_scale _ordering_scale=SM_Etilde);\n 00097\n-00110\n int recompute_jets(double _f, double _Emin = 0.0,\n+00110\n+\n+Generated by Doxygen\n+\n+\f5.37 siscone_error.cpp\n+\n+253\n+\n 00111\n Esplit_merge_scale _split_merge_scale=SM_Etilde);\n 00112\n 00114\n std::vector > protocones_list;\n 00115\n-00116\n // random number initialisation\n+00116\n 00117\n static bool init_done;\n 00118\n 00119 #ifdef DEBUG_STABLE_CONES\n 00120\n int nb_hash_cones_total, nb_hash_occupied_total;\n 00121 #endif\n@@ -22063,48 +20863,40 @@\n 00163 std::string siscone_package_name();\n 00164\n 00170 std::string siscone_version();\n 00171\n 00172 }\n 00173 #endif\n \n-5.41 siscone_error.cpp\n+5.37 siscone_error.cpp\n 00001\n+//\n 00002 // File: siscone_error.cpp\n 00003 // Description: source file for SISCone error messages (Csiscone_error)\n+//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // For more details, see http://projects.hepforge.org/siscone\n+//\n 00006 //\n+//\n 00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n+//\n 00008 //\n+//\n 00009 // This program is free software; you can redistribute it and/or modify\n+//\n 00010 // it under the terms of the GNU General Public License as published by\n+//\n 00011 // the Free Software Foundation; either version 2 of the License, or\n+//\n 00012 // (at your option) any later version.\n //\n 00013 //\n-\n-//\n-//\n-\n-//\n //\n-//\n-//\n-//\n-//\n-//\n-\n-//\n-\n-Generated by Doxygen\n-\n-\f5.42 siscone_error.h\n-\n 00014 // This program is distributed in the hope that it will be useful,\n //\n 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n //\n 00017 // GNU General Public License for more details.\n@@ -22127,19 +20919,27 @@\n 00028\n 00029 namespace siscone{\n 00030\n 00031 bool Csiscone_error::m_print_errors = true;\n 00032\n 00033 }\n \n-5.42 siscone_error.h\n+5.38 siscone_error.h\n 00001 // -*- C++ -*00003 // File: siscone_error.h\n-//\n 00004 // Description: header file for SISCone error messages (Csiscone_error)\n+\n+Generated by Doxygen\n+\n //\n+//\n+\n+\f254\n+\n+File Documentation\n+\n 00005 // This file is part of the SISCone project.\n //\n 00006 // For more details, see http://projects.hepforge.org/siscone\n //\n 00007 //\n //\n 00008 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n@@ -22214,26 +21014,535 @@\n static bool m_print_errors;\n 00060\n 00061 };\n 00062\n 00063 }\n 00064 #endif\n \n+5.39 geom_2d.cpp\n+00001\n+//\n+00002 // File: geom_2d.cpp\n+00003 // Description: source file for two-dimensional geometry tools\n+//\n+00004 // This file is part of the SISCone project.\n+//\n+00005 // For more details, see http://projects.hepforge.org/siscone\n+//\n+00006 //\n+//\n+00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n+//\n+00008 //\n+//\n+00009 // This program is free software; you can redistribute it and/or modify\n+//\n+00010 // it under the terms of the GNU General Public License as published by\n+//\n+00011 // the Free Software Foundation; either version 2 of the License, or\n+//\n+00012 // (at your option) any later version.\n+//\n+00013 //\n+//\n+00014 // This program is distributed in the hope that it will be useful,\n+//\n+00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+//\n+00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+//\n+00017 // GNU General Public License for more details.\n+//\n+00018 //\n+//\n+00019 // You should have received a copy of the GNU General Public License\n+//\n+00020 // along with this program; if not, write to the Free Software\n+//\n+00021 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n+00022 //\n+//\n+00023 // $Revision:: 171\n+$//\n+\n Generated by Doxygen\n \n-263\n+\f5.39 geom_2d.cpp\n \n-\f264\n+00024 // $Date:: 2007-06-19 16:26:05 +0200 (Tue, 19 Jun 2007)\n+00026\n+00027 #include \"geom_2d.h\"\n+00028 #include \n+00029\n+00030 namespace siscone{\n+00031\n+00032 #define PHI_RANGE_MASK 0xFFFFFFFF\n+00033\n+00034 /*********************************************************\n+00035 * class Ceta_phi_range implementation\n+*\n+00036 * class for holding a covering range in eta-phi\n+*\n+00037 *\n+*\n+00038 * This class deals with ranges in the eta-phi plane. It *\n+00039 * implements methods to test if two ranges overlap and *\n+00040 * to take the union of two overlapping intervals.\n+*\n+00041 *********************************************************/\n+00042\n+00043 using namespace std;\n+00044\n+00045 // static member default init\n+00046 //---------------------------00047 double Ceta_phi_range::eta_min = -100.0;\n+00048 double Ceta_phi_range::eta_max = 100.0;\n+00049\n+00050 // default ctor\n+00051 //-------------00052 Ceta_phi_range::Ceta_phi_range(){\n+00053\n+eta_range = 0;\n+00054\n+phi_range = 0;\n+00055 }\n+00056\n+00057 // ctor with initialisation\n+00058 // we initialise with a centre (in eta,phi) and a radius\n+00059 // - c_eta\n+eta coordinate of the centre\n+00060 // - c_phi\n+phi coordinate of the centre\n+00061 // - R\n+radius\n+00062 //------------------------------------------------------00063 Ceta_phi_range::Ceta_phi_range(double c_eta, double c_phi, double R){\n+// determination of the eta range\n+00064\n+00065\n+//------------------------------00066\n+double xmin = max(c_eta-R,eta_min+0.0001);\n+double xmax = min(c_eta+R,eta_max-0.0001);\n+00067\n+00068\n+unsigned int cell_min = get_eta_cell(xmin);\n+00069\n+00070\n+unsigned int cell_max = get_eta_cell(xmax);\n+00071\n+// warning: if cell_max==2^31, 2*cell_max==0 hence,\n+00072\n+00073\n+// even if the next formula is formally (2*cell_max-cell_min),\n+00074\n+// expressing it as (cell_max-cell_min)+cell_max is safe.\n+00075\n+eta_range = (cell_max-cell_min)+cell_max;\n+00076\n+// determination of the phi range\n+00077\n+00078\n+// !! taking care of periodicity !!\n+00079\n+//--------------------------------00080\n+xmin = phi_in_range(c_phi-R);\n+00081\n+xmax = phi_in_range(c_phi+R);\n+00082\n+00083\n+cell_min = get_phi_cell(xmin);\n+00084\n+cell_max = get_phi_cell(xmax);\n+00085\n+00086\n+// Also, if the interval goes through pi, inversion is needed\n+00087\n+if (xmax>xmin)\n+00088\n+phi_range = (cell_max-cell_min)+cell_max;\n+else {\n+00089\n+00090\n+phi_range = (cell_min==cell_max)\n+00091\n+? PHI_RANGE_MASK\n+00092\n+: ((PHI_RANGE_MASK^(cell_min-cell_max)) + cell_max);\n+00093\n+}\n+00094 }\n+00095\n+00096 // assignment of range\n+00097 // - r\n+range to assign to current one\n+00098 //--------------------------------------00099 Ceta_phi_range& Ceta_phi_range::operator = (const Ceta_phi_range &r){\n+00100\n+eta_range = r.eta_range;\n+00101\n+phi_range = r.phi_range;\n+00102\n+return *this;\n+00103\n+00104 }\n+00105\n+00106 // add a particle to the range\n+00107 // - eta eta coordinate of the particle\n+00108 // - phi phi coordinate of the particle\n+00109 // \\return 0 on success, 1 on error\n+00110 //---------------------------------------00111 int Ceta_phi_range::add_particle(const double eta, const double phi){\n+\n+Generated by Doxygen\n+\n+255\n+\n+$//\n+\n+\f256\n \n File Documentation\n \n-5.43 geom_2d.h\n-00001 // -*- C++ -*00003 // File: geom_2d.h\n+00112\n+// deal with the eta coordinate\n+00113\n+eta_range |= get_eta_cell(eta);\n+00114\n+// deal with the phi coordinate\n+00115\n+00116\n+phi_range |= get_phi_cell(phi);\n+00117\n+return 0;\n+00118\n+00119 }\n+00120\n+00121\n+00122 // test overlap\n+00123 // - r1 first range\n+00124 // - r2 second range\n+00125 // return true if overlap, false otherwise.\n+00126 //-----------------------------------------00127 bool is_range_overlap(const Ceta_phi_range &r1, const Ceta_phi_range &r2){\n+00128\n+// check overlap in eta AND phi\n+00129\n+return ((r1.eta_range & r2.eta_range) && (r1.phi_range & r2.phi_range));\n+00130 }\n+00131\n+00132 // compute union\n+00133 // Note: we assume that the two intervals overlap\n+00134 // - r1 first range\n+00135 // - r2 second range\n+00136 // \\return union of the two ranges\n+00137 //-----------------------------------------00138 const Ceta_phi_range range_union (const Ceta_phi_range &r1, const Ceta_phi_range &r2){\n+00139\n+Ceta_phi_range tmp;\n+00140\n+00141\n+// compute union in eta\n+00142\n+tmp.eta_range = r1.eta_range | r2.eta_range;\n+00143\n+// compute union in phi\n+00144\n+00145\n+tmp.phi_range = r1.phi_range | r2.phi_range;\n+00146\n+return tmp;\n+00147\n+00148 }\n+00149\n+00150 }\n+\n+5.40 geom_2d.cpp\n+00001\n //\n-00004 // Description: header file for two-dimensional geometry tools\n+00002 // File: geom_2d.cpp\n+00003 // Description: source file for two-dimensional geometry tools\n+//\n+00004 // This file is part of the SISCone project.\n+//\n+00005 // WARNING: this is not the main SISCone trunk but\n+//\n+00006 //\n+an adaptation to spherical coordinates\n+//\n+00007 // For more details, see http://projects.hepforge.org/siscone\n+//\n+00008 //\n+//\n+00009 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n+00010 //\n+//\n+00011 // This program is free software; you can redistribute it and/or modify\n+//\n+00012 // it under the terms of the GNU General Public License as published by\n+//\n+00013 // the Free Software Foundation; either version 2 of the License, or\n+//\n+00014 // (at your option) any later version.\n+//\n+00015 //\n+//\n+00016 // This program is distributed in the hope that it will be useful,\n+//\n+00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+//\n+00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+//\n+00019 // GNU General Public License for more details.\n+//\n+00020 //\n+//\n+00021 // You should have received a copy of the GNU General Public License\n+//\n+00022 // along with this program; if not, write to the Free Software\n+//\n+00023 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n+00024 //\n+//\n+00025 // $Revision:: 378\n+$//\n+00026 // $Date:: 2016-02-24 15:10:38 +0100 (Wed, 24 Feb 2016)\n+$//\n+00028\n+00029 #include \"geom_2d.h\"\n+00030 #include \n+00031\n+00032 namespace siscone_spherical{\n+00033\n+00034 #define PHI_RANGE_MASK 0xFFFFFFFF\n+00035\n+00036 /*********************************************************\n+00037 * class CSphtheta_phi_range implementation\n+*\n+00038 * class for holding a covering range in eta-phi\n+*\n+00039 *\n+*\n+\n+//\n+\n+Generated by Doxygen\n+\n+\f5.40 geom_2d.cpp\n+\n+00040 * This class deals with ranges in the eta-phi plane. It *\n+00041 * implements methods to test if two ranges overlap and *\n+00042 * to take the union of two overlapping intervals.\n+*\n+00043 *********************************************************/\n+00044\n+00045 using namespace std;\n+00046\n+00047 // static member default init\n+00048 //---------------------------00049 double CSphtheta_phi_range::theta_min = 0.0;\n+00050 double CSphtheta_phi_range::theta_max = M_PI;\n+00051\n+00052 // default ctor\n+00053 //-------------00054 CSphtheta_phi_range::CSphtheta_phi_range(){\n+00055\n+theta_range = 0;\n+00056\n+phi_range = 0;\n+00057 }\n+00058\n+00059 // ctor with initialisation\n+00060 // we initialise with a centre (in eta,phi) and a radius\n+00061 // - c_theta theta coordinate of the centre\n+00062 // - c_phi\n+phi coordinate of the centre\n+00063 // - R\n+radius\n+00064 //------------------------------------------------------00065 CSphtheta_phi_range::CSphtheta_phi_range(double c_theta, double c_phi, double R){\n+00066\n+// determination of the eta range\n+00067\n+//------------------------------00068\n+double xmin = max(c_theta-R,theta_min+0.00001);\n+00069\n+double xmax = min(c_theta+R,theta_max-0.00001);\n+00070\n+unsigned int cell_min = get_theta_cell(xmin);\n+00071\n+unsigned int cell_max = get_theta_cell(xmax);\n+00072\n+00073\n+// warning: if cell_max==2^31, 2*cell_max==0 hence,\n+00074\n+00075\n+// even if the next formula is formally (2*cell_max-cell_min),\n+00076\n+// expressing it as (cell_max-cell_min)+cell_max is safe.\n+00077\n+theta_range = (cell_max-cell_min)+cell_max;\n+00078\n+// determination of the phi range\n+00079\n+00080\n+// !! taking care of periodicity !!\n+00081\n+// !! and the theta dependence\n+!!\n+00082\n+//--------------------------------00083\n+double ymin,ymax;\n+double extra = asin(R/M_PI);\n+00084\n+00085\n+// if the theta range comes too close to the endpoints (theta=0 or\n+00086\n+// theta=pi), then keep the full phi range\n+00087\n+if (xmin<=theta_min+extra){\n+00088\n+ymin = -M_PI+0.00001;\n+00089\n+ymax = M_PI-0.00001;\n+00090\n+} else if (xmax>=theta_max-extra){\n+00091\n+ymin = -M_PI+0.00001;\n+00092\n+ymax = M_PI-0.00001;\n+00093\n+} else {\n+00094\n+extra = max(1.0/sin(xmin), 1.0/sin(xmax));\n+00095\n+ymin = (c_phi-R)*extra;\n+00096\n+while (ymin<-M_PI) ymin+=twopi;\n+00097\n+while (ymin> M_PI) ymin-=twopi;\n+00098\n+ymax = (c_phi-R)*extra;\n+while (ymax<-M_PI) ymax+=twopi;\n+00099\n+00100\n+while (ymax> M_PI) ymax-=twopi;\n+00101\n+}\n+00102\n+cell_min = get_phi_cell(ymin);\n+00103\n+cell_max = get_phi_cell(ymax);\n+00104\n+// Also, if the interval goes through pi, inversion is needed\n+00105\n+00106\n+if (ymax>ymin)\n+00107\n+phi_range = (cell_max-cell_min)+cell_max;\n+else {\n+00108\n+00109\n+phi_range = (cell_min==cell_max)\n+00110\n+? PHI_RANGE_MASK\n+00111\n+: ((PHI_RANGE_MASK^(cell_min-cell_max)) + cell_max);\n+00112\n+}\n+00113 }\n+00114\n+00115 // assignment of range\n+00116 // - r\n+range to assign to current one\n+00117 //--------------------------------------00118 CSphtheta_phi_range& CSphtheta_phi_range::operator = (const CSphtheta_phi_range &r){\n+00119\n+theta_range = r.theta_range;\n+00120\n+phi_range = r.phi_range;\n+00121\n+00122\n+return *this;\n+00123 }\n+00124\n+00125 // add a particle to the range\n+00126 // - eta eta coordinate of the particle\n+\n+Generated by Doxygen\n+\n+257\n+\n+\f258\n+\n+File Documentation\n+\n+00127 // - phi phi coordinate of the particle\n+00128 // \\return 0 on success, 1 on error\n+00129 //---------------------------------------00130 int CSphtheta_phi_range::add_particle(const double theta, const double phi){\n+00131\n+// get the theta cell\n+00132\n+unsigned int theta_cell = get_theta_cell(theta);\n+00133\n+// deal with the eta coordinate\n+00134\n+00135\n+theta_range |= theta_cell;\n+00136\n+00137\n+// deal with the phi coordinate\n+00138\n+//\n+00139\n+// watch out: if the theta_cell includes theta==0 or theta==pi,\n+00140\n+// incude the full phi range\n+00141\n+if ((theta_cell == 0x1) || (theta_cell == 0x80000000))\n+00142\n+phi_range = 0xffffffff;\n+else\n+00143\n+00144\n+phi_range |= get_phi_cell(phi);\n+00145\n+return 0;\n+00146\n+00147 }\n+00148\n+00149\n+00150 // test overlap\n+00151 // - r1 first range\n+00152 // - r2 second range\n+00153 // return true if overlap, false otherwise.\n+00154 //-----------------------------------------00155 bool is_range_overlap(const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2){\n+00156\n+// check overlap in eta AND phi\n+00157\n+return ((r1.theta_range & r2.theta_range) && (r1.phi_range & r2.phi_range));\n+00158 }\n+00159\n+00160 // compute union\n+00161 // Note: we assume that the two intervals overlap\n+00162 // - r1 first range\n+00163 // - r2 second range\n+00164 // \\return union of the two ranges\n+00165 //-----------------------------------------00166 const CSphtheta_phi_range range_union (const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2){\n+00167\n+CSphtheta_phi_range tmp;\n+00168\n+00169\n+// compute union in eta\n+00170\n+tmp.theta_range = r1.theta_range | r2.theta_range;\n+00171\n+// compute union in phi\n+00172\n+00173\n+tmp.phi_range = r1.phi_range | r2.phi_range;\n+00174\n+00175\n+return tmp;\n+00176 }\n+00177\n+00178 }\n+\n+5.41 momentum.h\n+00001 // -*- C++ -*00003 // File: momentum.h\n+//\n+00004 // Description: header file for 4-momentum class Cmomentum\n //\n 00005 // This file is part of the SISCone project.\n //\n 00006 // For more details, see http://projects.hepforge.org/siscone\n //\n 00007 //\n //\n@@ -22264,165 +21573,168 @@\n 00020 // You should have received a copy of the GNU General Public License\n //\n 00021 // along with this program; if not, write to the Free Software\n //\n 00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n 00023 //\n //\n-00024 // $Revision:: 422\n+00024 // $Revision:: 163\n $//\n-00025 // $Date:: 2020-04-22 11:51:09 +0200 (Wed, 22 Apr 2020)\n+00025 // $Date:: 2007-04-26 22:31:02 +0200 (Thu, 26 Apr 2007)\n $//\n 00027\n-00028 #ifndef __GEOM_2D_H__\n-00029 #define __GEOM_2D_H__\n+\n+Generated by Doxygen\n+\n+\f5.41 momentum.h\n+\n+00028 #ifndef __VECTOR_H__\n+00029 #define __VECTOR_H__\n 00030\n-00031 #include \n+00031 #include \n 00032 #include \n-00033 #include \"defines.h\"\n-00034\n-00035 #ifndef M_PI\n-00036 #define M_PI 3.141592653589793238462643383279502884197\n-00037 #endif\n+00033 #include \"reference.h\"\n+00034 #include \"geom_2d.h\"\n+00035 #include \"defines.h\"\n+00036\n+00037 namespace siscone{\n 00038\n-00039 namespace siscone{\n-00040\n-00043 inline double phi_in_range(double phi) {\n-00044\n-if\n-(phi <= -M_PI) phi += twopi;\n-else if (phi >\n-M_PI) phi -= twopi;\n-00045\n-00046\n-return phi;\n-00047 }\n-00048\n-00052 inline double dphi(double phi1, double phi2) {\n-return phi_in_range(phi1-phi2);\n+00049 class Cmomentum{\n+00050 public:\n+00052\n+Cmomentum();\n 00053\n-00054 }\n 00055\n+Cmomentum(double _px, double _py, double _pz, double _E);\n 00056\n-00060 inline double abs_dphi(double phi1, double phi2) {\n-double delta = fabs(phi1-phi2);\n+00058\n+Cmomentum(double _eta, double _phi, Creference _ref);\n+00059\n 00061\n+~Cmomentum();\n 00062\n-return delta > M_PI ? twopi-delta : delta;\n-00063 }\n+inline double perp()const {return sqrt(perp2());}\n 00064\n-00066 inline double pow2(double x) {return x*x;}\n+00065\n+inline double perp2()const {return px*px+py*py;}\n 00067\n 00068\n-00073 class Ctwovect {\n-00074 public:\n+inline double mass()const {return sqrt(mass2());}\n+00070\n+00071\n+inline double mass2()const {return perpmass2()-perp2();}\n+00073\n+00074\n 00076\n-Ctwovect() : x(0.0), y(0.0) {}\n+inline double perpmass()const {return sqrt((E-pz)*(E+pz));}\n 00077\n-00081\n-Ctwovect(double _x, double _y) : x(_x), y(_y) {}\n+inline double perpmass2()const {return (E-pz)*(E+pz);}\n+00079\n+00080\n+inline double Et()const {return E/sqrt(1.0+pz*pz/perp2());}\n 00082\n-00084\n-double x, y;\n+00083\n+inline double Et2()const {return E*E/(1.0+pz*pz/perp2());}\n 00085\n-inline double mod2()const {return pow2(x)+pow2(y);}\n-00087\n+00086\n 00088\n-inline double modulus()const {return sqrt(mod2());}\n-00090\n-00091 };\n+Cmomentum& operator = (const Cmomentum &v);\n+00089\n+const Cmomentum operator + (const Cmomentum &v);\n 00092\n 00093\n-00098 inline double dot_product(const Ctwovect & a, const Ctwovect & b) {\n-00099\n-return a.x*b.x + a.y*b.y;\n-00100 }\n+00096\n+Cmomentum& operator += (const Cmomentum &v);\n+00097\n+00100\n+Cmomentum& operator -= (const Cmomentum &v);\n 00101\n-00102\n-00107 inline double cross_product(const Ctwovect & a, const Ctwovect & b) {\n+void build_etaphi();\n+00107\n 00108\n-return a.x*b.y - a.y*b.x;\n-00109 }\n+double px;\n+00109\n 00110\n+double py;\n+double pz;\n 00111\n-00120 class Ceta_phi_range{\n-\n-Generated by Doxygen\n-\n-\f5.44 geom_2d.h\n-\n-265\n-\n-00121 public:\n-00123\n-Ceta_phi_range();\n+00112\n+double E;\n+00113\n+double eta;\n+00114\n+double phi;\n+00115\n+00116\n+int parent_index;\n+00117\n+int index;\n+00118\n+// the following part is used for checksums //\n+00120\n+00122\n+Creference ref;\n+00123 };\n 00124\n-00130\n-Ceta_phi_range(double c_eta, double c_phi, double R);\n+00127 bool operator < (const Cmomentum &v1, const Cmomentum &v2);\n+00128\n+00130 bool momentum_eta_less(const Cmomentum &v1, const Cmomentum &v2);\n 00131\n+00133 bool momentum_pt_less(const Cmomentum &v1, const Cmomentum &v2);\n 00134\n-Ceta_phi_range& operator = (const Ceta_phi_range &r);\n 00135\n-int add_particle(const double eta, const double phi);\n-00140\n-00141\n-unsigned int eta_range;\n-00143\n-00144\n-unsigned int phi_range;\n+00137 // some handy utilities //\n+00139\n+00144 inline double get_distance(double eta, double phi, Cmomentum *v){\n+00145\n+double dx, dy;\n 00146\n 00147\n-// extremal value for eta\n+dx = eta - v->eta;\n 00148\n+dy = fabs(phi - v->phi);\n 00149\n-static double eta_min;\n-static double eta_max;\n+if (dy>M_PI)\n 00150\n+dy -= twopi;\n 00151\n-00152 private:\n-inline unsigned int get_eta_cell(double eta){\n+00152\n+return dx*dx+dy*dy;\n+00153 }\n 00154\n-00155\n-return (unsigned int) (1u \u00ab ((int) (32*((eta-eta_min)/(eta_max-eta_min)))));\n+00155 }\n 00156\n-}\n-00157\n-00159\n-inline unsigned int get_phi_cell(double phi){\n-return (unsigned int) (1u \u00ab ((int) (32*phi/twopi+16)%32));\n-00160\n-00161\n-}\n-00162 };\n-00163\n-00168 bool is_range_overlap(const Ceta_phi_range &r1, const Ceta_phi_range &r2);\n-00169\n-00175 const Ceta_phi_range range_union(const Ceta_phi_range &r1, const Ceta_phi_range &r2);\n-00176\n-00177 }\n-00178\n-00179 #endif\n+00157 #endif\n \n-5.44 geom_2d.h\n-00001 // -*- C++ -*00003 // File: geom_2d.h\n+Generated by Doxygen\n+\n+259\n+\n+\f260\n+\n+File Documentation\n+\n+5.42 momentum.h\n+00001 // -*- C++ -*00003 // File: momentum.h\n //\n-00004 // Description: header file for two-dimensional geometry tools\n+00004 // Description: header file for 4-momentum class Cmomentum\n //\n 00005 // This file is part of the SISCone project.\n //\n 00006 // WARNING: this is not the main SISCone trunk but\n //\n 00007 //\n an adaptation to spherical coordinates\n //\n 00008 // For more details, see http://projects.hepforge.org/siscone\n //\n 00009 //\n //\n 00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n+//\n 00011 //\n //\n 00012 // This program is free software; you can redistribute it and/or modify\n //\n 00013 // it under the terms of the GNU General Public License as published by\n //\n 00014 // the Free Software Foundation; either version 2 of the License, or\n@@ -22444,97 +21756,783 @@\n 00022 // You should have received a copy of the GNU General Public License\n //\n 00023 // along with this program; if not, write to the Free Software\n //\n 00024 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n 00025 //\n //\n-00026 // $Revision:: 422\n+00026 // $Revision:: 256\n $//\n-00027 // $Date:: 2020-04-22 11:51:09 +0200 (Wed, 22 Apr 2020)\n+00027 // $Date:: 2008-07-14 13:52:16 +0200 (Mon, 14 Jul 2008)\n $//\n 00029\n-00030 #ifndef __SPH_GEOM_2D_H__\n-00031 #define __SPH_GEOM_2D_H__\n+00030 #ifndef __SPH_VECTOR_H__\n+00031 #define __SPH_VECTOR_H__\n 00032\n-00033 #include \n+00033 #include \n 00034 #include \n-00035 #include \n-00036 #include \n-00037\n-00038 #ifndef M_PI\n-00039 #define M_PI 3.141592653589793238462643383279502884197\n-00040 #endif\n-00041\n-00042 namespace siscone_spherical{\n-00043\n-00052 class CSphtheta_phi_range{\n-00053 public:\n+00035 #include \n+00036 #include \"geom_2d.h\"\n+00037 #include \n+00038\n+00039 namespace siscone_spherical{\n+00040\n+00054 class CSph3vector{\n+00055 public:\n+00057\n+CSph3vector();\n+00058\n+00060\n+CSph3vector(double _px, double _py, double _pz);\n+00061\n+00063\n+~CSph3vector();\n+00064\n+00066\n+CSph3vector& operator = (const CSph3vector &v);\n+00067\n+const CSph3vector operator + (const CSph3vector &v);\n+00070\n+00071\n+const CSph3vector operator - (const CSph3vector &v);\n+00074\n+00075\n+const CSph3vector operator / (const double &r);\n+00078\n+00079\n+00082\n+CSph3vector& operator += (const CSph3vector &v);\n+00083\n+00086\n+CSph3vector& operator -= (const CSph3vector &v);\n+00087\n+00090\n+CSph3vector& operator *= (const double &r);\n+00091\n+00094\n+CSph3vector& operator /= (const double &r);\n+00095\n+inline double perp()const {return sqrt(perp2());}\n+00097\n+00098\n+inline double perp2()const {return px*px+py*py;}\n+00100\n+00101\n+inline double norm()const {return sqrt(px*px+py*py+pz*pz);}\n+00103\n+00104\n+00106\n+inline double norm2()const {return px*px+py*py+pz*pz;}\n+00107\n+inline double phi()const {return atan2(py, px);}\n+00109\n+00110\n+inline double theta()const {return atan2(perp(),pz);}\n+00112\n+00113\n+void build_norm();\n+00120\n+00121\n+void build_thetaphi();\n+00125\n+00126\n+00129\n+void get_angular_directions(CSph3vector &angular_dir1, CSph3vector &angular_dir2);\n+00130\n+double px;\n+00131\n+00132\n+double py;\n \n Generated by Doxygen\n \n+\f5.42 momentum.h\n+\n+261\n+\n+00133\n+double pz;\n+00134\n+double _norm;\n+00135\n+double _theta;\n+00136\n+00137\n+double _phi;\n+00138\n+// the following part is used for checksums //\n+00140\n+00142\n+siscone::Creference ref;\n+00143 };\n+00144\n+00158 class CSphmomentum : public CSph3vector{\n+00159 public:\n+00161\n+CSphmomentum();\n+00162\n+00164\n+CSphmomentum(CSph3vector &init, double E=0.0);\n+00165\n+00167\n+CSphmomentum(double _px, double _py, double _pz, double _E);\n+00168\n+//CSphmomentum(double _eta, double _phi, siscone::Creference _ref);\n+00170\n+00171\n+00173\n+~CSphmomentum();\n+00174\n+00176\n+inline double mass()const {return sqrt(mass2());}\n+00177\n+inline double mass2()const {return perpmass2()-perp2();}\n+00179\n+00180\n+inline double perpmass()const {return sqrt((E-pz)*(E+pz));}\n+00182\n+00183\n+inline double perpmass2()const {return (E-pz)*(E+pz);}\n+00185\n+00186\n+inline double Et()const {return E/sqrt(1.0+pz*pz/perp2());}\n+00188\n+00189\n+inline double Et2()const {return E*E/(1.0+pz*pz/perp2());}\n+00191\n+00192\n+00194\n+CSphmomentum& operator = (const CSphmomentum &v);\n+00195\n+00198\n+const CSphmomentum operator + (const CSphmomentum &v);\n+00199\n+00202\n+CSphmomentum& operator += (const CSphmomentum &v);\n+00203\n+00206\n+CSphmomentum& operator -= (const CSphmomentum &v);\n+00207\n+double E;\n+00208\n+00209\n+int parent_index;\n+00210\n+00211\n+int index;\n+00212 };\n+00213\n+00216 bool operator < (const CSphmomentum &v1, const CSphmomentum &v2);\n+00217\n+00219 bool momentum_theta_less(const CSphmomentum &v1, const CSphmomentum &v2);\n+00220\n+00222 bool momentum_pt_less(const CSphmomentum &v1, const CSphmomentum &v2);\n+00223\n+00224\n+00226 // some handy utilities //\n+00228\n+00230 inline double sqr(double x){return x*x;}\n+00231\n+00235 inline double dot_product3(const CSph3vector &v1, const CSph3vector &v2){\n+00236\n+//double tmp = v1.px*v2.px + v1.py*v2.py + v1.pz*v2.pz;\n+00237\n+//if (!isfinite(tmp)){\n+00238\n+// std::cout \u00ab \"dot_product inf: \" \u00ab std::endl;\n+00239\n+// std::cout \u00ab \" angles: \" \u00ab v1._theta \u00ab \" \" \u00ab v1._phi \u00ab \" and \" \u00ab v2._theta \u00ab \" \" \u00ab v2._phi \u00ab\n+std::endl;\n+00240\n+// std::cout \u00ab \" moms : \" \u00ab v1.px \u00ab \" \" \u00ab v1.py \u00ab \" \" \u00ab v1.pz\n+00241\n //\n+\u00ab \" and \"\n+\u00ab v2.px \u00ab \" \" \u00ab v2.py \u00ab \" \" \u00ab v2.pz \u00ab std::endl;\n+00242\n+//}\n+00243\n+return v1.px*v2.px + v1.py*v2.py + v1.pz*v2.pz;\n+00244 }\n+00245\n+00249 inline CSph3vector cross_product3(const CSph3vector &v1, const CSph3vector &v2){\n+//CSph3vector tmp;\n+00250\n+00251\n+//tmp.px = v1.py*v2.pz-v1.pz*v2.py;\n+00252\n+//tmp.py = v1.pz*v2.px-v1.px*v2.pz;\n+00253\n+//tmp.pz = v1.px*v2.py-v1.py*v2.px;\n+00254\n+//return tmp;\n+00255\n+return CSph3vector(v1.py*v2.pz-v1.pz*v2.py,\n+00256\n+v1.pz*v2.px-v1.px*v2.pz,\n+00257\n+v1.px*v2.py-v1.py*v2.px);\n+00258 }\n+00259\n+00263 inline double norm2_cross_product3(const CSph3vector &v1, const CSph3vector &v2){\n+00264\n+return sqr(v1.py*v2.pz-v1.pz*v2.py) + sqr(v1.pz*v2.px-v1.px*v2.pz) + sqr(v1.px*v2.py-v1.py*v2.px);\n+00265 }\n+00266\n+00270 inline double get_tan2_distance(const CSphmomentum &v1, const CSphmomentum &v2){\n \n-\f266\n+Generated by Doxygen\n+\n+\f262\n \n File Documentation\n \n-00055\n-CSphtheta_phi_range();\n+00271\n+return norm2_cross_product3(v1,v2)/sqr(dot_product3(v1,v2));\n+00272 }\n+00273\n+00277 inline double get_distance(const CSph3vector *v1, const CSph3vector *v2){\n+00278\n+return atan2(sqrt(norm2_cross_product3(*v1,*v2)), dot_product3(*v1,*v2));\n+00279 }\n+00280\n+00289 inline bool is_closer(const CSph3vector *v1, const CSph3vector *v2, const double tan2R){\n+double dot = dot_product3(*v1,*v2);\n+00290\n+00291\n+return (dot>=0) && (norm2_cross_product3(*v1,*v2)<=tan2R*dot*dot);\n+00292 }\n+00293\n+00299 inline bool is_closer_safer(const CSph3vector *v1, const CSph3vector *v2, const double cosR){\n+return dot_product3(*v1,*v2)>=cosR*sqrt(v1->norm2()*v2->norm2());\n+00300\n+00301\n+//double dot = dot_product3(*v1,*v2);\n+00302\n+//return (dot>=0) && (norm2_cross_product3(*v1,*v2)\n+00034 #include \n+00035 #include \n+00036 #include \"hash.h\"\n+00037\n+00038 #include \"defines.h\"\n+00039\n+00040 namespace siscone{\n+00041\n+00053 class Cborder_store{\n+00054 public:\n 00056\n+Cborder_store(Cmomentum * momentum, double centre_eta, double centre_phi) :\n+00057\n+mom(momentum), is_in(false) {\n+00058\n+angle = atan2(mom->phi - centre_phi, mom->eta - centre_eta);\n+00059\n+}\n+00060\n+00061\n+Cmomentum * mom;\n 00062\n-CSphtheta_phi_range(double c_theta, double c_phi, double R);\n+double angle;\n+bool\n+is_in;\n 00063\n+00064 };\n+00065\n 00066\n-CSphtheta_phi_range& operator = (const CSphtheta_phi_range &r);\n-00067\n-int add_particle(const double theta, const double phi);\n+00069 inline bool operator<(const Cborder_store & a, const Cborder_store & b) {\n+\n+Generated by Doxygen\n+\n+\f5.43 protocones.h\n+\n+00070\n+return a.angle < b.angle;\n+00071 }\n 00072\n 00073\n-unsigned int theta_range;\n-00075\n-00076\n-00078\n-unsigned int phi_range;\n-00079\n-static double theta_min;\n-00081\n-static double theta_max;\n-00082\n-00083\n-00084 private:\n+00082 class Cstable_cones : public Cvicinity{\n+00083 public:\n+00085\n+Cstable_cones();\n 00086\n-inline unsigned int get_theta_cell(double theta){\n-00087\n-if (theta>=theta_max) return 1u\u00ab31;\n-return (unsigned int) (1u \u00ab ((int) (32*((theta-theta_min)/(theta_max-theta_min)))));\n 00088\n+Cstable_cones(std::vector &_particle_list);\n 00089\n+00091\n+~Cstable_cones();\n+00092\n+00097\n+void init(std::vector &_particle_list);\n+00098\n+int get_stable_cones(double _radius);\n+00106\n+00107\n+00109\n+std::vector protocones;\n+00110\n+00112\n+hash_cones *hc;\n+00113\n+int nb_tot;\n+00115\n+00116 #ifdef DEBUG_STABLE_CONES\n+00117\n+int nb_hash_cones, nb_hash_occupied;\n+00118 #endif\n+00119\n+00120 protected:\n+00122\n+double R;\n+00123\n+double R2;\n+00125\n+00126\n+00127 private:\n+00130\n+Cmomentum cone;\n+00131\n+00133\n+Cmomentum *child;\n+00134\n+00136\n+Cvicinity_elm *centre;\n+00137\n+00139\n+unsigned int centre_idx;\n+00140\n+unsigned int first_cone;\n+00142\n+00143\n+00149\n+int init_cone();\n+00150\n+int test_cone();\n+00157\n+00158\n+int update_cone();\n+00164\n+00165\n+/*\n+00166\n+00167 * run through the vicinity of the current parent and for each child\n+00168 * indicate which members are cocircular...\n+00169 */\n+00170\n+void prepare_cocircular_lists();\n+00171\n+bool cocircular_check();\n+00179\n+00180\n+00185\n+void test_cone_cocircular(Cmomentum & borderless_cone,\n+00186\n+std::list & border_list);\n+00187\n+void test_stability(Cmomentum & candidate,\n+00194\n+00195\n+const std::vector & border_vect);\n+00196\n+void compute_cone_contents();\n+00203\n+00204\n+void recompute_cone_contents();\n+00210\n+00211\n+/*\n+00212\n+00213 * if we have gone beyond the acceptable threshold of change, compute\n+in this version, we use the\n+00214 * the cone momentum from particle list.\n+00215 * \u2019pincluded\u2019 information from the Cvicinity class, but we don\u2019t\n+00216 * change the member cone, only the locally supplied one\n+00217 */\n+00218\n+void recompute_cone_contents_if_needed(Cmomentum & this_cone, double & this_dpt);\n+00219\n+int proceed_with_stability();\n+00225\n+00226\n+/*\n+00227\n+00228 * circle intersection.\n+00229 * computes the intersection with a circle of given centre and radius.\n+00230 * The output takes the form of a checkxor of the intersection\u2019s particles\n+00231 * - cx\n+circle centre x coordinate\n+00232 * - cy\n+circle centre y coordinate\n+00233 * return the checkxor for the intersection\n+00234 ******************************************************************/\n+00235\n+Creference circle_intersect(double cx, double cy);\n+00236\n+00238\n+Cmomentum cone_candidate;\n+00239\n+\n+Generated by Doxygen\n+\n+263\n+\n+\f264\n+\n+File Documentation\n+\n+00241\n+std::vector child_list;\n+00242\n+00245\n+std::vector< std::pair > multiple_centre_done;\n+00246\n+// information for updating cone contents to avoid rounding errors\n+00247\n+00248\n+double dpt;\n+00249\n+inline bool is_inside(Cmomentum *centre, Cmomentum *v);\n+00258\n+00259 };\n+00260\n+00261 /*\n+00262 * compute the absolute value of the difference between 2 angles.\n+00263 * We take care of the 2pi periodicity\n+00264 * \\param angle1\n+first angle\n+second angle\n+00265 * \\param angle2\n+00266 * \\return the absolute value of the difference between the angles\n+00267 *****************************************************************/\n+00268 inline double abs_dangle(double &angle1, double &angle2);\n+00269\n+00270 }\n+00271 #endif\n+\n+5.44 protocones.h\n+00001 // -*- C++ -*00003 // File: protocones.h\n+//\n+00004 // Description: header file for stable cones determination (Cstable_cones)\n+//\n+00005 // This file is part of the SISCone project.\n+//\n+00006 // WARNING: this is not the main SISCone trunk but\n+//\n+00007 //\n+an adaptation to spherical coordinates\n+//\n+00008 // For more details, see http://projects.hepforge.org/siscone\n+//\n+00009 //\n+//\n+00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n+//\n+00011 //\n+//\n+00012 // This program is free software; you can redistribute it and/or modify\n+//\n+00013 // it under the terms of the GNU General Public License as published by\n+//\n+00014 // the Free Software Foundation; either version 2 of the License, or\n+//\n+00015 // (at your option) any later version.\n+//\n+00016 //\n+//\n+00017 // This program is distributed in the hope that it will be useful,\n+//\n+00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+//\n+00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+//\n+00020 // GNU General Public License for more details.\n+//\n+00021 //\n+//\n+00022 // You should have received a copy of the GNU General Public License\n+//\n+00023 // along with this program; if not, write to the Free Software\n+//\n+00024 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n+00025 //\n+//\n+00026 // $Revision:: 255\n+$//\n+00027 // $Date:: 2008-07-12 17:40:35 +0200 (Sat, 12 Jul 2008)\n+$//\n+00029\n+00030 #ifndef __SPH_PROTOCONES_H__\n+00031 #define __SPH_PROTOCONES_H__\n+00032\n+00033 #include \"momentum.h\"\n+00034 #include \"vicinity.h\"\n+00035 #include \n+00036 #include \n+00037 #include \n+00038 #include \"hash.h\"\n+00039\n+00040 #include \n+00041\n+00042 namespace siscone_spherical{\n+00043\n+00055 class CSphborder_store{\n+00056 public:\n+00058\n+CSphborder_store(CSphmomentum * momentum, CSph3vector ¢re, CSph3vector &angl_dir1, CSph3vector\n+&angl_dir2) :\n+00059\n+mom(momentum), is_in(false) {\n+00060\n+CSph3vector diff = (*momentum) - centre;\n+00061\n+angle = atan2(dot_product3(diff, angl_dir2), dot_product3(diff, angl_dir1));\n+00062 #ifdef DEBUG_STABLE_CONES\n+00063\n+std::cout \u00ab \" adding point \" \u00ab momentum->_theta \u00ab \", \" \u00ab momentum->_phi\n+00064\n+\u00ab \" at an angle of \" \u00ab angle \u00ab std::endl;\n+00065 #endif\n+00066\n }\n-00090\n+00067\n+00068\n+CSphmomentum * mom;\n+double angle;\n+00069\n+\n+Generated by Doxygen\n+\n+\f5.44 protocones.h\n+\n+00070\n+bool\n+is_in;\n+00071 };\n+00072\n+00073\n+00076 inline bool operator<(const CSphborder_store & a, const CSphborder_store & b) {\n+00077\n+return a.angle < b.angle;\n+00078 }\n+00079\n+00080\n+00089 class CSphstable_cones : public CSphvicinity{\n+00090 public:\n 00092\n-inline unsigned int get_phi_cell(double phi){\n+CSphstable_cones();\n 00093\n-return (unsigned int) (1u \u00ab ((int) (32*phi/twopi+16)%32));\n-00094\n-}\n-00095 };\n+00095\n+CSphstable_cones(std::vector &_particle_list);\n 00096\n-00101 bool is_range_overlap(const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2);\n-00102\n-00108 const CSphtheta_phi_range range_union(const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2);\n-00109\n-00110 }\n-00111\n-00112 #endif\n+00098\n+~CSphstable_cones();\n+00099\n+void init(std::vector &_particle_list);\n+00104\n+00105\n+int get_stable_cones(double _radius);\n+00113\n+00114\n+00116\n+std::vector protocones;\n+00117\n+00119\n+sph_hash_cones *hc;\n+00120\n+int nb_tot;\n+00122\n+00123 #ifdef DEBUG_STABLE_CONES\n+00124\n+int nb_hash_cones, nb_hash_occupied;\n+00125 #endif\n+00126\n+00127 protected:\n+00129\n+double R;\n+00130\n+double R2;\n+00132\n+00133\n+double tan2R;\n+00135\n+00136\n+00137 private:\n+00140\n+CSphmomentum cone;\n+00141\n+00143\n+CSphmomentum *child;\n+00144\n+00146\n+CSphvicinity_elm *centre;\n+00147\n+00149\n+unsigned int centre_idx;\n+00150\n+unsigned int first_cone;\n+00152\n+00153\n+00159\n+int init_cone();\n+00160\n+int test_cone();\n+00167\n+00168\n+int update_cone();\n+00174\n+00175\n+/*\n+00176\n+00177 * run through the vicinity of the current parent and for each child\n+00178 * indicate which members are cocircular...\n+00179 */\n+00180\n+void prepare_cocircular_lists();\n+00181\n+00189\n+bool cocircular_check();\n+00190\n+void test_cone_cocircular(CSphmomentum & borderless_cone,\n+00195\n+00196\n+std::list & border_list);\n+00197\n+void test_stability(CSphmomentum & candidate,\n+00204\n+00205\n+const std::vector & border_vect);\n+00206\n+void compute_cone_contents();\n+00213\n+00214\n+void recompute_cone_contents();\n+00220\n+00221\n+/*\n+00222\n+00223 * if we have gone beyond the acceptable threshold of change, compute\n+in this version, we use the\n+00224 * the cone momentum from particle list.\n+00225 * \u2019pincluded\u2019 information from the CSphvicinity class, but we don\u2019t\n+00226 * change the member cone, only the locally supplied one\n+00227 */\n+00228\n+void recompute_cone_contents_if_needed(CSphmomentum & this_cone, double & this_dpt);\n+00229\n+int proceed_with_stability();\n+00235\n+00236\n+/*\n+00237\n+00238 * circle intersection.\n+00239 * computes the intersection with a circle of given centre and radius.\n+00240 * The output takes the form of a checkxor of the intersection\u2019s particles\n+circle centre x coordinate\n+00241 * - cx\n+\n+Generated by Doxygen\n+\n+265\n+\n+\f266\n+\n+File Documentation\n+\n+circle centre y coordinate\n+00242 * - cy\n+00243 * return the checkxor for the intersection\n+00244 ******************************************************************/\n+00245\n+siscone::Creference circle_intersect(CSph3vector &cone_centre);\n+00246\n+00248\n+CSphmomentum cone_candidate;\n+00249\n+00251\n+std::vector child_list;\n+00252\n+00255\n+std::vector< std::pair > multiple_centre_done;\n+00256\n+00257\n+// information for updating cone contents to avoid rounding errors\n+00258\n+double dpt;\n+00259 };\n+00260\n+00261 }\n+00262 #endif\n \n 5.45 split_merge.cpp\n 00001\n-00002 // File: split_merge.cpp\n //\n+00002 // File: split_merge.cpp\n 00003 // Description: source file for splitting/merging (contains the CJet class) //\n 00004 // This file is part of the SISCone project.\n //\n 00005 // WARNING: this is not the main SISCone trunk but\n //\n 00006 //\n an adaptation to spherical coordinates\n@@ -22594,21 +22592,14 @@\n 00040\n 00041 using namespace std;\n 00042\n 00043 /********************************************************\n 00044 * class CSphjet implementation\n *\n 00045 * real Jet information.\n-\n-*\n-\n-Generated by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n 00046 * This class contains information for one single jet.\n *\n 00047 * That is, first, its momentum carrying information\n *\n 00048 * about its centre and pT, and second, its particle\n *\n 00049 * contents\n@@ -22626,23 +22617,30 @@\n sm_var2 = 0.0;\n 00058\n pass = CJET_INEXISTENT_PASS; // initialised to a value that should\n 00059\n // notappear in the end (after clustering)\n 00060 }\n 00061\n+\n+*\n+\n+Generated by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n 00062 // default dtor\n 00063 //-------------00064 CSphjet::~CSphjet(){\n 00065\n 00066 }\n 00067\n 00068 // ordering of jets in E (e.g. used in final jets ordering)\n 00069 //---------------------------------------------------------00070 bool jets_E_less(const CSphjet &j1, const CSphjet &j2){\n-return j1.v.E > j2.v.E;\n 00071\n+return j1.v.E > j2.v.E;\n 00072 }\n 00073\n 00074\n 00075 /********************************************************\n 00076 * CSphsplit_merge_ptcomparison implementation\n *\n 00077 * This deals with the ordering of the jets candidates *\n@@ -22660,31 +22658,31 @@\n 00089 //\n 00090 // NB: there is a potential issue in momentum-conserving events,\n 00091 // whereby the harder of two jets becomes ill-defined when a soft\n 00092 // particle is emitted --- this may have a knock-on effect on\n 00093 // subsequent split-merge steps in cases with sufficiently large R\n 00094 // (but we don\u2019t know what the limit is...)\n 00095 //-----------------------------------------------------------------00096 bool CSphsplit_merge_ptcomparison::operator ()(const CSphjet &jet1, const CSphjet &jet2)const{\n-double q1, q2;\n 00097\n+double q1, q2;\n 00098\n // compute the value for comparison for both jets\n 00099\n 00100\n // This depends on the choice of variable (mt is the default)\n 00101\n q1 = jet1.sm_var2;\n 00102\n q2 = jet2.sm_var2;\n 00103\n-bool res = q1 > q2;\n 00104\n+bool res = q1 > q2;\n 00105\n-00106\n // if we enable the refined version of the comparison (see defines.h),\n+00106\n 00107\n // we compute the difference more precisely when the two jets are very\n 00108\n // close in the ordering variable.\n 00109 #ifdef EPSILON_SPLITMERGE\n 00110\n if ( (fabs(q1-q2) < EPSILON_SPLITMERGE*max(q1,q2)) &&\n@@ -22699,50 +22697,41 @@\n 00116\n CSphmomentum difference;\n 00117\n double E_tilde_difference;\n 00118\n get_difference(jet1,jet2,&difference,&E_tilde_difference);\n 00119\n-00120\n // use the following relation: pt1^2 - pt2^2 = (pt1+pt2)*(pt1-pt2)\n+00120\n 00121\n double qdiff;\n 00122\n CSphmomentum sum = jet1.v ;\n 00123\n sum += jet2.v;\n 00124\n double E_tilde_sum = jet1.E_tilde + jet2.E_tilde;\n 00125\n // depending on the choice of ordering variable, set the result\n 00126\n 00127\n switch (split_merge_scale){\n-case SM_Etilde:\n 00128\n+case SM_Etilde:\n 00129\n qdiff = E_tilde_sum*E_tilde_difference;\n-00130\n break;\n-case SM_E:\n+00130\n 00131\n+case SM_E:\n 00132\n qdiff = sum.E*difference.E;\n-\n-Generated by Doxygen\n-\n-267\n-\n-\f268\n-\n-File Documentation\n-\n-00133\n break;\n+00133\n default:\n 00134\n 00135\n throw siscone::Csiscone_error(\"Unsupported split-merge scale choice: \"\n 00136\n + SM_scale_name());\n 00137\n@@ -22755,28 +22744,37 @@\n 00141\n 00142\n return res;\n 00143 }\n 00144\n 00145\n 00148 std::string split_merge_scale_name(Esplit_merge_scale sms) {\n-00149\n switch(sms) {\n-case SM_E:\n+00149\n 00150\n+case SM_E:\n+\n+Generated by Doxygen\n+\n+267\n+\n+\f268\n+\n+File Documentation\n+\n 00151\n return \"E (IR unsafe for pairs of identical decayed heavy particles)\";\n-00152\n case SM_Etilde:\n-return \"Etilde (sum of E.[1+sin^2(theta_{i,jet})])\";\n+00152\n 00153\n-00154\n+return \"Etilde (sum of E.[1+sin^2(theta_{i,jet})])\";\n default:\n-return \"[SM scale without a name]\";\n+00154\n 00155\n+return \"[SM scale without a name]\";\n 00156\n }\n 00157 }\n 00158\n 00159\n 00160 // get the difference between 2 jets\n 00161 // - j1\n@@ -22790,16 +22788,16 @@\n 00165 // return true if overlapping, false if disjoint\n 00166 //----------------------------------------------00167 void CSphsplit_merge_ptcomparison::get_difference(const CSphjet &j1, const CSphjet &j2,\n 00168\n CSphmomentum *v, double *E_tilde)const {\n int i1,i2;\n 00169\n 00170\n-00171\n // initialise\n+00171\n 00172\n i1=i2=0;\n 00173\n *v = CSphmomentum();\n 00174\n *E_tilde = 0.0;\n 00175\n@@ -22807,21 +22805,21 @@\n CSph3vector jet1_axis = j1.v;\n 00177\n //jet1_axis /= j1.v._norm;\n 00178\n jet1_axis /= j1.v.E;\n 00179\n CSph3vector jet2_axis = j2.v;\n-//jet2_axis /= j2.v._norm;\n 00180\n+//jet2_axis /= j2.v._norm;\n 00181\n jet2_axis /= j2.v.E;\n 00182\n-00183\n // compute overlap\n+00183\n 00184\n // at the same time, we store union in indices\n 00185\n // note tat for Etilde, we\u2019ll add the direct energy contributino at the end\n 00186\n do{\n 00187\n@@ -22853,53 +22851,48 @@\n (*v) -= p;\n 00200\n (*E_tilde) -= p.E*norm2_cross_product3(p,jet2_axis)/(*particles_norm2)[j2.contents[i2]];\n 00201\n i2++;\n 00202\n } else {\n-00203\n throw siscone::Csiscone_error(\"get_non_overlap reached part it should never have seen...\");\n+00203\n 00204\n }\n 00205\n } while ((i1E;\n 00223 }\n 00224\n 00225\n@@ -22913,14 +22906,19 @@\n 00231 //-------------00232 CSphsplit_merge::CSphsplit_merge(){\n 00233\n merge_identical_protocones = false;\n 00234 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 00235 #ifdef MERGE_IDENTICAL_PROTOCONES_DEFAULT_TRUE\n 00236\n merge_identical_protocones = true;\n+\n+Generated by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n 00237 #endif\n 00238 #endif\n 00239\n _user_scale = NULL;\n 00240\n indices = NULL;\n 00241\n@@ -22929,21 +22927,21 @@\n 00243\n ptcomparison.particles = &particles;\n 00244\n ptcomparison.particles_norm2 = &particles_norm2;\n 00245\n candidates.reset(new multiset(ptcomparison));\n 00246\n-// no hardest cut (col-unsafe)\n 00247\n+// no hardest cut (col-unsafe)\n 00248\n SM_var2_hardest_cut_off = -numeric_limits::max();\n 00249\n-00250\n // no energy cutoff for the particles to put in p_uncol_hard\n+00250\n 00251\n stable_cone_soft_E2_cutoff = -1.0;\n 00252\n // no pt-weighted splitting\n 00253\n 00254\n use_E_weighted_splitting = false;\n@@ -22975,69 +22973,60 @@\n 00276\n 00277 // initialisation function for particle list\n 00278 // - _particles list of particles\n 00279 //------------------------------------------------------------00280 int CSphsplit_merge::init_particles(vector &_particles){\n 00281\n full_clear();\n 00282\n-// compute the list of particles\n 00283\n+// compute the list of particles\n 00284\n // here, we do not need to throw away particles\n 00285\n // with infinite rapidity (colinear with the beam)\n 00286\n particles = _particles;\n 00287\n n = particles.size();\n 00288\n-00289\n // store the particle norm^2\n+00289\n 00290\n particles_norm2.resize(n);\n 00291\n for (int i=0;iM_PI) dphi = twopi-dphi;\n-00434\n if (dphi *protocones, double R2, double Emin){\n-int i;\n 00463\n+int i;\n 00464\n CSphmomentum *c;\n 00465\n CSphmomentum *v;\n 00466\n double tan2R;\n 00467\n@@ -23318,23 +23318,16 @@\n tan2R = tan(R);\n 00475\n tan2R *= tan2R;\n 00476\n 00477 #ifdef DEBUG_SPLIT_MERGE\n 00478\n cout \u00ab \"particle list: \";\n-00479\n for (int i2=0;i2parent_index);\n 00500\n@@ -23375,16 +23375,16 @@\n 00502\n }\n 00503\n }\n 00504\n jet.n=jet.contents.size();\n 00505\n-// compute Etilde for that jet.\n 00506\n+// compute Etilde for that jet.\n 00507\n // we can\u2019t do that before as it requires knowledge of the jet axis\n 00508\n // which has just been computed.\n 00509\n compute_Etilde(jet);\n 00510\n@@ -23393,27 +23393,27 @@\n 00512\n // (it was only known through its spatial coordinates up to now)\n 00513\n *c = jet.v;\n 00514\n c->build_thetaphi();\n 00515\n-00516\n // set the jet range\n+00516\n 00517\n jet.range=CSphtheta_phi_range(c->_theta,c->_phi,R);\n 00518\n 00519 #ifdef DEBUG_SPLIT_MERGE\n 00520\n cout \u00ab \"adding protojet: \";\n 00521\n unsigned int phirange=jet.range.phi_range;\n 00522\n-00523\n for (unsigned int i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (phirange&(1\u00abi2)) \u00bb i2 );\n+00523\n 00524\n fprintf(stdout, \"\\t\");\n 00525\n unsigned int thetarange=jet.range.theta_range;\n for (unsigned int i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (thetarange&(1\u00abi2)) \u00bb i2);\n 00526\n 00527\n@@ -23430,39 +23430,39 @@\n // add it to the list of jets\n 00534\n 00535\n insert(jet);\n 00536\n }\n 00537\n-// update list of included particles\n 00538\n+// update list of included particles\n 00539\n n_pass++;\n 00540\n 00541 #ifdef DEBUG_SPLIT_MERGE\n 00542\n cout \u00ab \"remaining particles: \";\n 00543 #endif\n 00544\n int j=0;\n for (i=0;i *protocones, double R2,\n double Emin){\n 00581\n-int i;\n+\n+Generated by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n+273\n+\n 00582\n+int i;\n 00583\n CSphmomentum *c;\n 00584\n CSphmomentum *v;\n-00585\n double R, tan2R;\n+00585\n 00586\n CSphjet jet, jet_candidate;\n-bool found_jet = false;\n 00587\n+bool found_jet = false;\n 00588\n if (protocones->size()==0)\n 00589\n-00590\n return 1;\n+00590\n 00591\n 00592\n E_min = Emin;\n 00593\n R = sqrt(R2);\n 00594\n tan2R = tan(R);\n@@ -23551,16 +23551,16 @@\n 00603\n 00604\n // note that jet is always initialised with default values at this level\n 00605\n jet_candidate.v = CSphmomentum();\n 00606\n jet_candidate.contents.clear();\n-00607\n for (i=0;iparent_index);\n 00611\n@@ -23570,16 +23570,16 @@\n 00613\n }\n 00614\n }\n 00615\n jet_candidate.n=jet_candidate.contents.size();\n 00616\n-// compute Etilde for that jet.\n 00617\n+// compute Etilde for that jet.\n 00618\n // we can\u2019t do that before as it requires knowledge of the jet axis\n 00619\n // which has just been computed.\n 00620\n compute_Etilde(jet_candidate);\n 00621\n@@ -23588,47 +23588,47 @@\n 00623\n // (it was only known through its spatial coordinates up to now)\n 00624\n *c = jet_candidate.v;\n 00625\n c->build_thetaphi();\n 00626\n-00627\n // set the jet range\n+00627\n 00628\n jet_candidate.range=CSphtheta_phi_range(c->_theta,c->_phi,R);\n 00629\n-// check that the protojet has large enough pt\n 00630\n+// check that the protojet has large enough pt\n 00631\n if (jet_candidate.v.Eis_larger(jet_candidate, jet)\n 00647\n : ptcomparison(jet_candidate, jet))){\n 00648\n@@ -23636,28 +23636,21 @@\n 00649\n found_jet = true;\n 00650\n }\n 00651\n }\n 00652\n-\n-Generated by Doxygen\n-\n-\f274\n-\n-File Documentation\n-\n-00653\n // make sure at least one of the jets has passed the selection\n+00653\n 00654\n if (!found_jet) return 1;\n 00655\n-// add the jet to the list of jets\n 00656\n+// add the jet to the list of jets\n 00657\n jets.push_back(jet);\n 00658\n jets[jets.size()-1].v.build_thetaphi();\n 00659\n jets[jets.size()-1].v.build_norm();\n 00660\n@@ -23666,22 +23659,29 @@\n cout \u00ab \"PR-Jet \" \u00ab jets.size() \u00ab \" [size \" \u00ab jet.contents.size() \u00ab \"]:\";\n 00663 #endif\n 00664\n 00665\n // update the list of what particles are left\n 00666\n int p_remain_index = 0;\n-00667\n int contents_index = 0;\n-//sort(next_jet.contents.begin(),next_jet.contents.end());\n+00667\n 00668\n+//sort(next_jet.contents.begin(),next_jet.contents.end());\n+\n+Generated by Doxygen\n+\n+\f274\n+\n+File Documentation\n+\n 00669\n for (int index=0;indexsize()==0)\n-return 0;\n+00722\n 00723\n+return 0;\n 00724\n if (overlap_tshold>=1.0 || overlap_tshold <= 0) {\n 00725\n 00726\n ostringstream message;\n 00727\n message \u00ab \"Illegal value for overlap_tshold, f = \" \u00ab overlap_tshold;\n@@ -23783,65 +23783,65 @@\n 00733\n // the split--merge variable.)\n 00734\n // Note that the square of the ovelap is used\n 00735\n double overlap2;\n 00736\n-00737\n // avoid to compute tshold*tshold at each overlap\n+00737\n 00738\n double overlap_tshold2 = overlap_tshold*overlap_tshold;\n 00739\n-\n-Generated by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n-00740\n do{\n+00740\n if (candidates->size()>0){\n 00741\n 00742\n // browse for the first jet\n 00743\n j1 = candidates->begin();\n 00744\n-00745\n // if hardest jet does not pass threshold then nothing else will\n+00745\n 00746\n // either so one stops the split merge.\n 00747\n //if (j1->sm_var2sm_var2end()){\n 00755\n+while (j2 != candidates->end()){\n+\n+Generated by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n 00756 #ifdef DEBUG_SPLIT_MERGE\n 00757\n if (j2_relindex==1) show();\n 00758\n cout \u00ab \"check overlap between cdt 1 and cdt \" \u00ab j2_relindex+1 \u00ab \" with overlap \" \u00ab endl;\n 00759 #endif\n 00760\n // check overlapping\n 00761\n if (get_overlap(*j1, *j2, &overlap2)){\n-00762\n // check if overlapping energy passes threshold\n+00762\n 00763\n // Note that this depends on the ordering variable\n 00764 #ifdef DEBUG_SPLIT_MERGE\n 00765\n cout \u00ab \"overlap between cdt 1 and cdt \" \u00ab j2_relindex+1 \u00ab \" with overlap \"\n 00766\n \u00ab sqrt(overlap2)/j2->v.E \u00ab endl\u00abendl;\n@@ -23855,16 +23855,16 @@\n cout \u00ab \" --> split\" \u00ab endl\u00abendl;\n 00772 #endif\n 00773\n // split jets\n 00774\n split(j1, j2);\n 00775\n-00776\n // update iterators\n+00776\n 00777\n j2 = j1 = candidates->begin();\n 00778\n j2_relindex = 0;\n 00779\n } else {\n 00780 #ifdef DEBUG_SPLIT_MERGE\n@@ -23892,23 +23892,23 @@\n // Emin to disappear, so the total number of jets may\n 00793\n // have changed by more than expected and j2 might already by\n 00794\n // the end of the candidates list...\n 00795\n j2_relindex++;\n-if (j2 != candidates->end()) j2++;\n 00796\n+if (j2 != candidates->end()) j2++;\n 00797\n } // end of loop on the second jet\n 00798\n 00799\n if (j1 != candidates->end()) {\n-00800\n // all \"second jet\" passed without overlapping\n+00800\n 00801\n // (otherwise we won\u2019t leave the j2 loop)\n 00802\n // => store jet 1 as real jet\n 00803\n jets.push_back(*j1);\n 00804\n@@ -23945,23 +23945,14 @@\n show();\n 00822 #endif\n 00823\n return jets.size();\n 00824\n 00825 }\n 00826\n-\n-Generated by Doxygen\n-\n-275\n-\n-\f276\n-\n-File Documentation\n-\n 00827\n 00828\n 00829 // save the event on disk\n 00830 // - flux\n stream used to save jet contents\n 00831 //-------------------------------------------00832 int CSphsplit_merge::save_contents(FILE *flux){\n 00833\n@@ -23979,40 +23970,49 @@\n for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n 00840\n j1 = &(*it_j);\n 00841\n fprintf(flux, \"%e\\t%e\\t%e\\t%e\\t%d\\n\",\n 00842\n j1->v.px, j1->v.py, j1->v.pz, j1->v.E, j1->n);\n+\n+Generated by Doxygen\n+\n+275\n+\n+\f276\n+\n+File Documentation\n+\n 00843\n }\n 00844\n 00845\n fprintf(flux, \"# jet contents\\n\");\n 00846\n fprintf(flux, \"# columns are: px, py, pz, E, particle index and jet number\\n\");\n-for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n 00847\n+for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n 00848\n j1 = &(*it_j);\n-00849\n for (i2=0;i2n;i2++)\n+00849\n 00850\n fprintf(flux, \"%e\\t%e\\t%e\\t%e\\t%d\\t%d\\n\",\n 00851\n particles[j1->contents[i2]].px, particles[j1->contents[i2]].py,\n 00852\n particles[j1->contents[i2]].pz, particles[j1->contents[i2]].E,\n 00853\n j1->contents[i2], i1);\n 00854\n }\n 00855\n-00856\n return 0;\n+00856\n 00857 }\n 00858\n 00859\n 00860 // show current jets/candidate status\n 00861 //-----------------------------------00862 int CSphsplit_merge::show(){\n 00863\n jet_iterator it_j;\n@@ -24030,24 +24030,24 @@\n 00870\n j = &(*it_j);\n 00871\n fprintf(stdout, \"jet %2d: %e\\t%e\\t%e\\t%e\\t\", i1+1,\n 00872\n j->v.px, j->v.py, j->v.pz, j->v.E);\n 00873\n-00874\n unsigned int phirange=j->range.phi_range;\n-00875\n+00874\n for (i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (phirange&(1\u00abi2)) \u00bb i2 );\n+00875\n 00876\n fprintf(stdout, \"\\t\");\n-00877\n unsigned int thetarange=j->range.theta_range;\n-for (i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (thetarange&(1\u00abi2)) \u00bb i2);\n+00877\n 00878\n+for (i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (thetarange&(1\u00abi2)) \u00bb i2);\n 00879\n fprintf(stdout, \"\\t\");\n 00880\n for (i2=0;i2n;i2++)\n 00881\n 00882\n fprintf(stdout, \"%d \", j->contents[i2]);\n@@ -24067,23 +24067,23 @@\n 00890\n 00891\n unsigned int phirange=c->range.phi_range;\n for (i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (phirange&(1\u00abi2)) \u00bb i2 );\n 00892\n 00893\n fprintf(stdout, \"\\t\");\n-00894\n unsigned int thetarange=c->range.theta_range;\n-for (i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (thetarange&(1\u00abi2)) \u00bb i2);\n+00894\n 00895\n+for (i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (thetarange&(1\u00abi2)) \u00bb i2);\n 00896\n fprintf(stdout, \"\\t\");\n 00897\n-for (i2=0;i2n;i2++)\n 00898\n+for (i2=0;i2n;i2++)\n 00899\n fprintf(stdout, \"%d \", c->contents[i2]);\n 00900\n fprintf(stdout, \"\\n\");\n 00901\n }\n 00902\n@@ -24097,30 +24097,24 @@\n 00908 // get the overlap between 2 jets\n 00909 // - j1\n first jet\n 00910 // - j2\n second jet\n 00911 // - overlap2 returned overlap^2 (determined by the choice of SM variable)\n 00912 // return true if overlapping, false if disjoint\n-00913 //---------------------------------------------------------------------\n-\n-Generated by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n-00914 bool CSphsplit_merge::get_overlap(const CSphjet &j1, const CSphjet &j2, double *overlap2){\n-// check if ranges overlap\n+00913 //--------------------------------------------------------------------00914 bool CSphsplit_merge::get_overlap(const CSphjet &j1, const CSphjet &j2, double *overlap2){\n 00915\n+// check if ranges overlap\n 00916\n if (!is_range_overlap(j1.range,j2.range))\n-return false;\n 00917\n+return false;\n 00918\n-00919\n int i1,i2;\n+00919\n bool is_overlap;\n 00920\n 00921\n // initialise\n 00922\n 00923\n i1=i2=idx_size=0;\n@@ -24131,14 +24125,19 @@\n 00926\n // compute overlap\n 00927\n 00928\n // at the same time, we store union in indices\n 00929\n do{\n+\n+Generated by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n 00930\n if (j1.contents[i1]\" all over the place\n 00986\n@@ -24252,39 +24251,30 @@\n 00997\n // This is stored in E{1,2}_weight\n 00998\n E1_weight = (use_E_weighted_splitting) ? 1.0/j1.v.E/j1.v.E : 1.0;\n 00999\n E2_weight = (use_E_weighted_splitting) ? 1.0/j2.v.E/j2.v.E : 1.0;\n 01000\n-01001\n // compute jet splitting\n-\n-Generated by Doxygen\n-\n-277\n-\n-\f278\n-\n-File Documentation\n-\n+01001\n 01002\n do{\n if (j1.contents[i1]_theta,v->_phi);\n 01011\n } else if (j1.contents[i1]>j2.contents[i2]){\n 01012\n@@ -24295,40 +24285,49 @@\n jet2.contents.push_back(j2.contents[i2]);\n 01015\n jet2.v += *v;\n 01016\n //jet2.pt_tilde += pt[j2.contents[i2]];\n 01017\n i2++;\n+\n+Generated by Doxygen\n+\n+277\n+\n+\f278\n+\n+File Documentation\n+\n 01018\n jet2.range.add_particle(v->_theta,v->_phi);\n 01019\n } else { // (j1.contents[i1]==j2.contents[i2])\n 01020\n // common particle, decide which is the closest centre\n 01021\n v = &(particles[j1.contents[i1]]);\n 01022\n-//TODO: improve this brutal use of atan2 and sqrt !!!!\n 01023\n+//TODO: improve this brutal use of atan2 and sqrt !!!!\n 01024\n-//? what when == ?\n 01025\n+//? what when == ?\n 01026\n // When use_E_weighted_splitting is activated, the\n 01027\n // \"geometrical\" distance is weighted by the inverse\n 01028\n // of the E of the protojet\n 01029\n double d1 = get_distance(&(j1.v), v)*E1_weight;\n 01030\n double d2 = get_distance(&(j2.v), v)*E2_weight;\n-01031\n // do bookkeeping on most ambiguous split\n+01031\n 01032\n if (fabs(d1-d2) < most_ambiguous_split)\n 01033\n most_ambiguous_split = fabs(d1-d2);\n 01034\n 01035\n if (d1_theta,v->_phi);\n 01061\n }\n-01062\n while (i2_theta,v->_phi);\n 01069\n }\n 01070\n-01071\n // finalise jets\n+01071\n 01072\n jet1.n = jet1.contents.size();\n 01073\n jet2.n = jet2.contents.size();\n 01074\n 01075\n // now the jet axis is known, we can compute Etilde\n 01076\n compute_Etilde(jet1);\n 01077\n compute_Etilde(jet2);\n 01078\n-// remove previous jets\n 01079\n+// remove previous jets\n 01080 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 01081\n cand_refs.erase(j1.v.ref);\n 01082\n cand_refs.erase(j2.v.ref);\n 01083 #endif\n 01084\n@@ -24426,65 +24425,67 @@\n 01085\n candidates->erase(it_j2);\n 01086\n 01087\n // reinsert new ones\n 01088\n insert(jet1);\n-\n-Generated by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n 01089\n insert(jet2);\n 01090\n-return true;\n 01091\n+return true;\n 01092 }\n 01093\n 01094 // merge the two given jet.\n 01095 // during this procedure, the jets j1 & j2 are replaced\n 01096 // by 1 single jets containing both of them.\n 01097 // - it_j1 iterator of the first jet in \u2019candidates\u2019\n 01098 // - it_j2 iterator of the second jet in \u2019candidates\u2019\n 01099 // return true on success, false on error\n 01101 bool CSphsplit_merge::merge(cjet_iterator &it_j1, cjet_iterator &it_j2){\n 01102\n CSphjet jet;\n-int i;\n 01103\n+int i;\n 01104\n-// build new jet\n 01105\n+// build new jet\n+\n+Generated by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n+279\n+\n 01106\n // note: particles within j1 & j2 have already been stored in indices\n 01107\n for (i=0;irange, it_j2->range);\n 01118\n-01119\n // remove old candidates\n+01119\n 01120 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 01121\n if (merge_identical_protocones){\n 01122\n cand_refs.erase(it_j1->v.ref);\n 01123\n cand_refs.erase(it_j2->v.ref);\n@@ -24492,16 +24493,16 @@\n }\n 01125 #endif\n 01126\n candidates->erase(it_j1);\n 01127\n candidates->erase(it_j2);\n 01128\n-// reinsert new candidate\n 01129\n+// reinsert new candidate\n 01130\n insert(jet);\n 01131\n return true;\n 01132\n 01133 }\n 01134\n@@ -24516,16 +24517,16 @@\n 01145 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 01146\n if ((merge_identical_protocones) && (!cand_refs.insert(jet.v.ref).second))\n 01147\n return false;\n 01148 #endif\n 01149\n-01150\n // check that the protojet has large enough energy\n+01150\n 01151\n if (jet.v.Einsert(jet);\n 01159\n return true;\n 01160\n 01161 }\n 01162\n 01169 double CSphsplit_merge::get_sm_var2(CSphmomentum &v, double &E_tilde){\n-01170\n switch(ptcomparison.split_merge_scale) {\n+01170\n+01171\n case SM_E:\n return v.E*v.E;\n-01171\n 01172\n case SM_Etilde:\n return E_tilde*E_tilde;\n default:\n 01173\n 01174\n throw siscone::Csiscone_error(\"Unsupported split-merge scale choice: \"\n 01175\n + ptcomparison.SM_scale_name());\n 01176\n }\n 01177\n-//return 0.0;\n 01178\n+//return 0.0;\n 01179 }\n 01180\n 01181\n 01182\n 01184 void CSphsplit_merge::compute_Etilde(CSphjet &jet){\n 01185\n jet.v.build_norm();\n 01186\n jet.E_tilde=0.0;\n 01187\n CSph3vector jet_axis = jet.v;\n-01188\n //if (jet.v._norm==0){\n-\n-Generated by Doxygen\n-\n-279\n-\n-\f280\n-\n-File Documentation\n-\n+01188\n 01189\n // jet_axis = CSph3vector(0.0,0.0,0.0);\n 01190\n //} else {\n 01191\n jet_axis/=jet.v.E;\n-//}\n 01192\n+//}\n 01193\n //cout \u00ab \"~~~ Axis: \" \u00ab jet.v.px \u00ab \" \" \u00ab jet.v.py \u00ab \" \" \u00ab jet.v.pz \u00ab \" \" \u00ab jet.v._norm \u00ab endl;\n 01194\n //cout \u00ab \"~~~ Axis: \" \u00ab jet_axis.px \u00ab \" \" \u00ab jet_axis.py \u00ab \" \" \u00ab jet_axis.pz \u00ab endl;\n 01195\n for (vector::iterator cont_it=jet.contents.begin(); cont_it!=jet.contents.end(); cont_it++){\n 01196\n@@ -24603,14 +24595,20 @@\n jet.E_tilde+=p.E*(1.0+norm2_cross_product3(p,jet_axis)/particles_norm2[*cont_it]);\n 01198\n }\n 01199 }\n 01200\n 01201 }\n \n+Generated by Doxygen\n+\n+\f280\n+\n+File Documentation\n+\n 5.46 split_merge.cpp\n 00001\n //\n 00002 // File: split_merge.cpp\n 00003 // Description: source file for splitting/merging (contains the CJet class) //\n 00004 // This file is part of the SISCone project.\n //\n@@ -24699,25 +24697,18 @@\n 00058 }\n 00059\n 00060 // default dtor\n 00061 //-------------00062 Cjet::~Cjet(){\n 00063\n 00064 }\n 00065\n-\n-*\n-\n-Generated by Doxygen\n-\n-\f5.46 split_merge.cpp\n-\n 00066 // ordering of jets in pt (e.g. used in final jets ordering)\n 00067 //----------------------------------------------------------00068 bool jets_pt_less(const Cjet &j1, const Cjet &j2){\n-return j1.v.perp2() > j2.v.perp2();\n 00069\n+return j1.v.perp2() > j2.v.perp2();\n 00070 }\n 00071\n 00072\n 00073 /********************************************************\n 00074 * Csplit_merge_ptcomparison implementation\n *\n 00075 * This deals with the ordering of the jets candidates *\n@@ -24725,26 +24716,33 @@\n 00077\n 00078 // odering of two jets\n 00079 // The variable of the ordering is pt or mt\n 00080 // depending on \u2019split_merge_scale\u2019 choice\n 00081 //\n 00082 // with EPSILON_SPLITMERGE defined, this attempts to identify\n 00083 // delicate cases where two jets have identical momenta except for\n+\n+*\n+\n+Generated by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n 00084 // softish particles -- the difference of pt\u2019s may not be correctly\n 00085 // identified normally and so lead to problems for the fate of the\n 00086 // softish particle.\n 00087 //\n 00088 // NB: there is a potential issue in momentum-conserving events,\n 00089 // whereby the harder of two jets becomes ill-defined when a soft\n 00090 // particle is emitted --- this may have a knock-on effect on\n 00091 // subsequent split-merge steps in cases with sufficiently large R\n 00092 // (but we don\u2019t know what the limit is...)\n 00093 //-----------------------------------------------------------------00094 bool Csplit_merge_ptcomparison::operator ()(const Cjet &jet1, const Cjet &jet2)const{\n-00095\n double q1, q2;\n+00095\n 00096\n // compute the value for comparison for both jets\n 00097\n 00098\n // This depends on the choice of variable (mt is the default)\n 00099\n q1 = jet1.sm_var2;\n@@ -24765,56 +24763,56 @@\n if ( (fabs(q1-q2) < EPSILON_SPLITMERGE*max(q1,q2)) &&\n 00109\n (jet1.v.ref != jet2.v.ref) ) {\n // get the momentum of the difference\n 00110\n 00111\n Cmomentum difference;\n-double pt_tilde_difference;\n 00112\n+double pt_tilde_difference;\n 00113\n get_difference(jet1,jet2,&difference,&pt_tilde_difference);\n 00114\n 00115\n // use the following relation: pt1^2 - pt2^2 = (pt1+pt2)*(pt1-pt2)\n 00116\n double qdiff;\n 00117\n Cmomentum sum = jet1.v ;\n 00118\n sum += jet2.v;\n-double pt_tilde_sum = jet1.pt_tilde + jet2.pt_tilde;\n 00119\n+double pt_tilde_sum = jet1.pt_tilde + jet2.pt_tilde;\n 00120\n-00121\n // depending on the choice of ordering variable, set the result\n+00121\n 00122\n switch (split_merge_scale){\n-00123\n case SM_mt:\n+00123\n 00124\n qdiff = sum.E*difference.E - sum.pz*difference.pz;\n-break;\n 00125\n-00126\n+break;\n case SM_pt:\n+00126\n 00127\n qdiff = sum.px*difference.px + sum.py*difference.py;\n break;\n 00128\n-case SM_pttilde:\n 00129\n+case SM_pttilde:\n 00130\n qdiff = pt_tilde_sum*pt_tilde_difference;\n break;\n 00131\n 00132\n case SM_Et:\n-00133\n // diff = E^2 (dpt^2 pz^2- pt^2 dpz^2)\n+00133\n 00134\n //\n + dE^2 (pt^2+pz^2) pt2^2\n 00135\n // where, unless explicitely specified the variables\n 00136\n // refer to the first jet or differences jet1-jet2.\n@@ -24822,104 +24820,104 @@\n qdiff = jet1.v.E*jet1.v.E*\n 00138\n ((sum.px*difference.px + sum.py*difference.py)*jet1.v.pz*jet1.v.pz\n 00139\n -jet1.v.perp2()*sum.pz*difference.pz)\n 00140\n +sum.E*difference.E*(jet1.v.perp2()+jet1.v.pz*jet1.v.pz)*jet2.v.perp2();\n-break;\n 00141\n-00142\n+break;\n default:\n-throw Csiscone_error(\"Unsupported split-merge scale choice: \"\n+00142\n 00143\n+throw Csiscone_error(\"Unsupported split-merge scale choice: \"\n 00144\n + SM_scale_name());\n 00145\n }\n 00146\n res = qdiff > 0;\n 00147\n }\n 00148 #endif // EPSILON_SPLITMERGE\n 00149\n-return res;\n 00150\n+return res;\n 00151 }\n 00152\n-\n-Generated by Doxygen\n-\n-281\n-\n-\f282\n-\n-File Documentation\n-\n 00153\n 00156 std::string split_merge_scale_name(Esplit_merge_scale sms) {\n-switch(sms) {\n 00157\n+switch(sms) {\n case SM_pt:\n 00158\n 00159\n return \"pt (IR unsafe)\";\n 00160\n case SM_Et:\n return \"Et (boost dep.)\";\n 00161\n 00162\n case SM_mt:\n return \"mt (IR safe except for pairs of identical decayed heavy particles)\";\n 00163\n 00164\n case SM_pttilde:\n-00165\n return \"pttilde (scalar sum of pt\u2019s)\";\n-default:\n+00165\n 00166\n+default:\n 00167\n return \"[SM scale without a name]\";\n 00168\n }\n 00169 }\n 00170\n 00171\n 00172 // get the difference between 2 jets\n+\n+Generated by Doxygen\n+\n+281\n+\n+\f282\n+\n+File Documentation\n+\n 00173 // - j1\n first jet\n 00174 // - j2\n second jet\n 00175 // - v\n jet1-jet2\n 00176 // - pt_tilde\n jet1-jet2 pt_tilde\n 00177 // return true if overlapping, false if disjoint\n 00178 //----------------------------------------------00179 void Csplit_merge_ptcomparison::get_difference(const Cjet &j1, const Cjet &j2, Cmomentum *v, double\n *pt_tilde)const {\n-00180\n int i1,i2;\n+00180\n 00181\n-// initialise\n 00182\n+// initialise\n 00183\n i1=i2=0;\n 00184\n *v = Cmomentum();\n 00185\n *pt_tilde = 0.0;\n 00186\n // compute overlap\n 00187\n 00188\n // at the same time, we store union in indices\n 00189\n do{\n-00190\n if (j1.contents[i1]==j2.contents[i2]) {\n+00190\n 00191\n i1++;\n 00192\n i2++;\n 00193\n } else if (j1.contents[i1](ptcomparison));\n 00240\n-\n-Generated by Doxygen\n-\n-\f5.46 split_merge.cpp\n-\n-283\n-\n-00241\n // no hardest cut (col-unsafe)\n+00241\n 00242\n SM_var2_hardest_cut_off = -numeric_limits::max();\n 00243\n // no pt cutoff for the particles to put in p_uncol_hard\n 00244\n 00245\n stable_cone_soft_pt2_cutoff = -1.0;\n 00246\n-// no pt-weighted splitting\n 00247\n+// no pt-weighted splitting\n 00248\n use_pt_weighted_splitting = false;\n 00249 }\n 00250\n 00251\n 00252 // default dtor\n 00253 //-------------00254 Csplit_merge::~Csplit_merge(){\n 00255\n full_clear();\n 00256 }\n 00257\n 00258\n+\n+Generated by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n+283\n+\n 00259 // initialisation function\n 00260 // - _particles list of particles\n 00261 // - protocones list of protocones (initial jet candidates)\n 00262 // - R2\n cone radius (squared)\n 00263 // - ptmin\n minimal pT allowed for jets\n 00264 //------------------------------------------------------------00265 int Csplit_merge::init(vector & /*_particles*/, vector *protocones, double R2,\n double ptmin){\n-00266\n // browse protocones\n+00266\n 00267\n return add_protocones(protocones, R2, ptmin);\n 00268 }\n 00269\n 00270\n 00271 // initialisation function for particle list\n 00272 // - _particles list of particles\n@@ -25060,20 +25058,20 @@\n 00279\n // with infinite rapidity (colinear with the beam)\n 00280\n particles = _particles;\n 00281\n n = particles.size();\n 00282\n-00283\n // build the vector of particles\u2019 pt\n+00283\n 00284\n pt.resize(n);\n-00285\n for (int i=0;i p_sorted;\n bool collinear;\n 00409\n-00410\n double dphi;\n+00410\n 00411\n 00412\n p_uncol_hard.clear();\n 00413\n-\n-Generated by Doxygen\n-\n-\f5.46 split_merge.cpp\n-\n-285\n-\n 00414\n // we first sort the particles according to their rapidity\n 00415\n for (i=0;iM_PI) dphi = twopi-dphi;\n-if (dphi *protocones, double R2, double ptmin){\n 00461\n int i;\n 00462\n Cmomentum *c;\n 00463\n Cmomentum *v;\n-00464\n double eta, phi;\n-double dx, dy;\n+00464\n 00465\n-00466\n+double dx, dy;\n double R;\n+00466\n 00467\n Cjet jet;\n 00468\n 00469\n if (protocones->size()==0)\n-return 1;\n 00470\n+return 1;\n 00471\n 00472\n pt_min2 = ptmin*ptmin;\n 00473\n R = sqrt(R2);\n 00474\n-// browse protocones\n 00475\n+// browse protocones\n 00476\n // for each of them, build the list of particles in them\n 00477\n for (vector::iterator p_it = protocones->begin();p_it != protocones->end();p_it++){\n-00478\n // initialise variables\n+00478\n 00479\n c = &(*p_it);\n 00480\n-00481\n // note: cones have been tested => their (eta,phi) coordinates are computed\n+00481\n 00482\n eta = c->eta;\n 00483\n phi = c->phi;\n 00484\n-00485\n // browse particles to create cone contents\n+00485\n 00486\n // note that jet is always initialised with default values at this level\n 00487\n jet.v = Cmomentum();\n 00488\n jet.pt_tilde=0;\n 00489\n jet.contents.clear();\n-00490\n for (i=0;ipz)!=v->E){\n 00495\n dx = eta - v->eta;\n 00496\n dy = fabs(phi - v->phi);\n if (dy>M_PI)\n 00497\n 00498\n dy -= twopi;\n-if (dx*dx+dy*dyparent_index);\n-\n-Generated by Doxygen\n-\n-\f286\n-\n-File Documentation\n-\n 00501\n jet.v+= *v;\n 00502\n jet.pt_tilde+= pt[v->parent_index];\n 00503\n v->index=0;\n 00504\n }\n 00505\n }\n 00506\n jet.n=jet.contents.size();\n 00507\n-// set the momentum in protocones\n 00508\n+// set the momentum in protocones\n 00509\n // (it was only known through eta and phi up to now)\n 00510\n *c = jet.v;\n 00511\n c->eta = eta; // restore exact original coords\n 00512\n@@ -25483,54 +25474,61 @@\n 00514\n 00515\n jet.range=Ceta_phi_range(eta,phi,R);\n 00516\n 00517 #ifdef DEBUG_SPLIT_MERGE\n 00518\n cout \u00ab \"adding jet: \";\n-for (int i2=0;i2 *protocones, double R2, double\n ptmin){\n 00572\n-int i;\n 00573\n+int i;\n 00574\n Cmomentum *c;\n 00575\n Cmomentum *v;\n-00576\n double eta, phi;\n-double dx, dy;\n+00576\n 00577\n+double dx, dy;\n 00578\n double R;\n 00579\n Cjet jet, jet_candidate;\n bool found_jet = false;\n 00580\n 00581\n if (protocones->size()==0)\n 00582\n-00583\n return 1;\n+00583\n 00584\n 00585\n pt_min2 = ptmin*ptmin;\n 00586\n R = sqrt(R2);\n-\n-Generated by Doxygen\n-\n-\f5.46 split_merge.cpp\n-\n 00587\n-// browse protocones\n 00588\n+// browse protocones\n 00589\n // for each of them, build the list of particles in them\n 00590\n for (vector::iterator p_it = protocones->begin();p_it != protocones->end();p_it++){\n 00591\n // initialise variables\n 00592\n@@ -25631,14 +25624,19 @@\n // browse particles to create cone contents\n 00602\n jet_candidate.v = Cmomentum();\n 00603\n jet_candidate.pt_tilde=0;\n 00604\n jet_candidate.contents.clear();\n+\n+Generated by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n 00605\n for (i=0;ieta = eta; // restore exact original coords\n 00627\n c->phi = phi; // to avoid rounding error inconsistencies\n 00628\n-// set the jet range\n 00629\n+// set the jet range\n 00630\n jet_candidate.range=Ceta_phi_range(eta,phi,R);\n 00631\n // check that the protojet has large enough pt\n 00632\n 00633\n if (jet_candidate.v.perp2()is_larger(jet_candidate, jet)\n 00649\n : ptcomparison(jet_candidate, jet))){\n 00650\n@@ -25746,35 +25744,26 @@\n cout \u00ab \"PR-Jet \" \u00ab jets.size() \u00ab \" [size \" \u00ab jet.contents.size() \u00ab \"]:\";\n 00664 #endif\n 00665\n // update the list of what particles are left\n 00666\n 00667\n int p_remain_index = 0;\n-00668\n int contents_index = 0;\n-//sort(next_jet.contents.begin(),next_jet.contents.end());\n+00668\n 00669\n+//sort(next_jet.contents.begin(),next_jet.contents.end());\n 00670\n for (int index=0;indexsize()==0)\n-00724\n return 0;\n+00724\n 00725\n if (overlap_tshold>=1.0 || overlap_tshold <= 0) {\n 00726\n 00727\n ostringstream message;\n 00728\n message \u00ab \"Illegal value for overlap_tshold, f = \" \u00ab overlap_tshold;\n 00729\n message \u00ab \" (legal values are 0size()>0){\n+00741\n 00742\n-00743\n+if (candidates->size()>0){\n // browse for the first jet\n+00743\n 00744\n j1 = candidates->begin();\n 00745\n // if hardest jet does not pass threshold then nothing else will\n 00746\n 00747\n // either so one stops the split merge.\n@@ -25899,32 +25897,27 @@\n 00749\n // browse for the second jet\n 00750\n 00751\n j2 = j1;\n 00752\n j2++;\n-int j2_relindex = 1; // used only in ifdef, but costs little so keep it outside\n 00753\n+int j2_relindex = 1; // used only in ifdef, but costs little so keep it outside\n 00754\n-00755\n while (j2 != candidates->end()){\n+00755\n 00756 #ifdef DEBUG_SPLIT_MERGE\n 00757\n show();\n 00758 #endif\n 00759\n // check overlapping\n 00760\n if (get_overlap(*j1, *j2, &overlap2)){\n-\n-Generated by Doxygen\n-\n-\f5.46 split_merge.cpp\n-\n 00761\n // check if overlapping energy passes threshold\n 00762\n // Note that this depends on the ordering variable\n 00763 #ifdef DEBUG_SPLIT_MERGE\n 00764\n cout \u00ab \"overlap between cdt 1 and cdt \" \u00ab j2_relindex+1 \u00ab \" with overlap \"\n@@ -25934,66 +25927,71 @@\n 00767\n if (overlap2sm_var2){\n 00768\n // split jets\n 00769\n split(j1, j2);\n 00770\n-00771\n // update iterators\n+00771\n 00772\n j2 = j1 = candidates->begin();\n 00773\n j2_relindex = 0;\n 00774\n } else {\n 00775\n // merge jets\n 00776\n merge(j1, j2);\n 00777\n 00778\n // update iterators\n+\n+Generated by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n 00779\n j2 = j1 = candidates->begin();\n 00780\n j2_relindex = 0;\n 00781\n }\n 00782\n }\n-00783\n // watch out: split/merge might have caused new jets with pt <\n+00783\n 00784\n // ptmin to disappear, so the total number of jets may\n 00785\n // have changed by more than expected and j2 might already by\n 00786\n // the end of the candidates list...\n 00787\n j2_relindex++;\n-if (j2 != candidates->end()) j2++;\n 00788\n+if (j2 != candidates->end()) j2++;\n 00789\n } // end of loop on the second jet\n 00790\n-if (j1 != candidates->end()) {\n 00791\n-00792\n+if (j1 != candidates->end()) {\n // all \"second jet\" passed without overlapping\n+00792\n 00793\n // (otherwise we won\u2019t leave the j2 loop)\n 00794\n // => store jet 1 as real jet\n 00795\n jets.push_back(*j1);\n 00796\n jets[jets.size()-1].v.build_etaphi();\n-00797\n // a bug where the contents has non-zero size has been cropping\n+00797\n 00798\n // up in many contexts -- so catch it!\n 00799\n assert(j1->contents.size() > 0);\n 00800\n jets[jets.size()-1].pass = particles[j1->contents[0]].index;\n 00801 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n@@ -26038,23 +26036,23 @@\n 00827 // - flux\n stream used to save jet contents\n 00828 //-------------------------------------------00829 int Csplit_merge::save_contents(FILE *flux){\n 00830\n jet_iterator it_j;\n 00831\n Cjet *j1;\n-int i1, i2;\n 00832\n+int i1, i2;\n 00833\n 00834\n fprintf(flux, \"# %d jets found\\n\", (int) jets.size());\n 00835\n fprintf(flux, \"# columns are: eta, phi, pt and number of particles for each jet\\n\");\n-00836\n for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n+00836\n 00837\n j1 = &(*it_j);\n 00838\n j1->v.build_etaphi();\n 00839\n fprintf(flux, \"%f\\t%f\\t%e\\t%d\\n\",\n 00840\n@@ -26062,58 +26060,58 @@\n 00841\n }\n 00842\n 00843\n fprintf(flux, \"# jet contents\\n\");\n 00844\n fprintf(flux, \"# columns are: eta, phi, pt, particle index and jet number\\n\");\n-00845\n for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n+00845\n 00846\n j1 = &(*it_j);\n-for (i2=0;i2n;i2++)\n 00847\n+for (i2=0;i2n;i2++)\n 00848\n fprintf(flux, \"%f\\t%f\\t%e\\t%d\\t%d\\n\",\n-\n-Generated by Doxygen\n-\n-289\n-\n-\f290\n-\n-File Documentation\n-\n 00849\n particles[j1->contents[i2]].eta, particles[j1->contents[i2]].phi,\n 00850\n particles[j1->contents[i2]].perp(), j1->contents[i2], i1);\n 00851\n }\n 00852\n-return 0;\n 00853\n+return 0;\n 00854 }\n 00855\n 00856\n 00857 // show current jets/candidate status\n 00858 //-----------------------------------00859 int Csplit_merge::show(){\n 00860\n jet_iterator it_j;\n 00861\n cjet_iterator it_c;\n 00862\n Cjet *j;\n-const Cjet *c;\n 00863\n+const Cjet *c;\n int i1, i2;\n 00864\n 00865\n 00866\n for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n+\n+Generated by Doxygen\n+\n+289\n+\n+\f290\n+\n+File Documentation\n+\n 00867\n j = &(*it_j);\n 00868\n fprintf(stdout, \"jet %2d: %e\\t%e\\t%e\\t%e\\t\", i1+1,\n 00869\n j->v.px, j->v.py, j->v.pz, j->v.E);\n for (i2=0;i2n;i2++)\n@@ -26140,58 +26138,58 @@\n 00881\n fprintf(stdout, \"\\n\");\n 00882\n }\n 00883\n 00884\n fprintf(stdout, \"\\n\");\n-00885\n return 0;\n+00885\n 00886 }\n 00887\n 00888\n 00889 // get the overlap between 2 jets\n 00890 // - j1\n first jet\n 00891 // - j2\n second jet\n 00892 // - overlap2 returned overlap^2 (determined by the choice of SM variable)\n 00893 // return true if overlapping, false if disjoint\n 00894 //--------------------------------------------------------------------00895 bool Csplit_merge::get_overlap(const Cjet &j1, const Cjet &j2, double *overlap2){\n-00896\n // check if ranges overlap\n+00896\n 00897\n if (!is_range_overlap(j1.range,j2.range))\n-return false;\n 00898\n+return false;\n 00899\n int i1,i2;\n 00900\n-00901\n bool is_overlap;\n+00901\n 00902\n-// initialise\n 00903\n+// initialise\n 00904\n i1=i2=idx_size=0;\n 00905\n is_overlap = false;\n 00906\n Cmomentum v;\n double pt_tilde=0.0;\n 00907\n 00908\n-00909\n // compute overlap\n+00909\n 00910\n // at the same time, we store union in indices\n 00911\n do{\n-if (j1.contents[i1]j2.contents[i2]){\n 00916\n@@ -26221,31 +26219,26 @@\n 00928\n // finish computing union\n 00929\n 00930\n // (only needed if overlap !)\n 00931\n if (is_overlap){\n-00932\n while (i1\" all over the place\n 00970\n@@ -26334,38 +26332,38 @@\n phi2 = tmp.phi;\n 00993\n pt2_weight = (use_pt_weighted_splitting) ? 1.0/tmp.perp2() : 1.0;\n 00994\n 00995\n jet1.v = jet2.v = Cmomentum();\n 00996\n-00997\n // compute jet splitting\n+00997\n 00998\n do{\n-00999\n if (j1.contents[i1]eta,v->phi);\n 01007\n } else if (j1.contents[i1]>j2.contents[i2]){\n-01008\n // particle i2 belong only to jet 2\n+01008\n 01009\n v = &(particles[j2.contents[i2]]);\n 01010\n jet2.contents.push_back(j2.contents[i2]);\n 01011\n jet2.v += *v;\n 01012\n@@ -26377,33 +26375,24 @@\n 01015\n } else { // (j1.contents[i1]==j2.contents[i2])\n 01016\n // common particle, decide which is the closest centre\n 01017\n v = &(particles[j1.contents[i1]]);\n 01018\n-01019\n // distance w.r.t. centroid 1\n+01019\n 01020\n dx1 = eta1 - v->eta;\n 01021\n dy1 = fabs(phi1 - v->phi);\n-if (dy1>M_PI)\n 01022\n+if (dy1>M_PI)\n 01023\n dy1 -= twopi;\n-\n-Generated by Doxygen\n-\n-291\n-\n-\f292\n-\n-File Documentation\n-\n 01024\n // distance w.r.t. centroid 2\n 01025\n 01026\n dx2 = eta2 - v->eta;\n 01027\n dy2 = fabs(phi2 - v->phi);\n@@ -26429,28 +26418,37 @@\n 01038\n if (fabs(d1sq-d2sq) < most_ambiguous_split)\n 01039\n most_ambiguous_split = fabs(d1sq-d2sq);\n 01040\n 01041\n if (d1sqeta,v->phi);\n 01047\n } else {\n-01048\n // particle i2 belong only to jet 2\n+01048\n 01049\n jet2.contents.push_back(j2.contents[i2]);\n 01050\n jet2.v += *v;\n 01051\n jet2.pt_tilde += pt[j2.contents[i2]];\n 01052\n@@ -26463,32 +26461,32 @@\n 01056\n i2++;\n 01057\n }\n 01058\n } while ((i1eta,v->phi);\n 01067\n }\n-while (i2range, it_j2->range);\n 01121\n-01122\n // remove old candidates\n+01122\n 01123 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 01124\n if (merge_identical_protocones){\n 01125\n cand_refs.erase(it_j1->v.ref);\n 01126\n cand_refs.erase(it_j2->v.ref);\n 01127\n }\n 01128 #endif\n 01129\n candidates->erase(it_j1);\n+\n+Generated by Doxygen\n+\n+\f5.47 vicinity.h\n+\n+293\n+\n 01130\n candidates->erase(it_j2);\n 01131\n // reinsert new candidate\n 01132\n 01133\n insert(jet);\n 01134\n-return true;\n 01135\n+return true;\n 01136 }\n 01137\n 01143 bool Csplit_merge::insert(Cjet &jet){\n 01144\n-// eventually check that no other candidate are present with the\n 01145\n+// eventually check that no other candidate are present with the\n 01146\n // same cone contents. We recall that this automatic merging of\n 01147\n // identical protocones can lead to infrared-unsafe situations.\n 01148 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 01149\n if ((merge_identical_protocones) && (!cand_refs.insert(jet.v.ref).second))\n-01150\n return false;\n+01150\n 01151 #endif\n 01152\n-01153\n // check that the protojet has large enough pt\n+01153\n 01154\n if (jet.v.perp2()insert(jet);\n 01162\n return true;\n 01163\n 01164 }\n 01165\n 01172 double Csplit_merge::get_sm_var2(Cmomentum &v, double &pt_tilde){\n-01173\n switch(ptcomparison.split_merge_scale) {\n+01173\n+01174\n case SM_pt:\n return v.perp2();\n-01174\n-01175\n case SM_mt:\n return v.perpmass2();\n-case SM_pttilde: return pt_tilde*pt_tilde;\n+01175\n 01176\n+case SM_pttilde: return pt_tilde*pt_tilde;\n 01177\n case SM_Et:\n return v.Et2();\n-01178\n default:\n-throw Csiscone_error(\"Unsupported split-merge scale choice: \"\n+01178\n 01179\n+throw Csiscone_error(\"Unsupported split-merge scale choice: \"\n 01180\n + ptcomparison.SM_scale_name());\n 01181\n }\n 01182\n 01183\n //return 0.0;\n 01184 }\n 01185\n 01186 }\n \n-5.47 split_merge.h\n-00001 // -*- C++ -*00003 // File: split_merge.h\n+5.47 vicinity.h\n+00001 // -*- C++ -*00003 // File: vicinity.h\n+//\n+00004 // Description: header file for particle vicinity (Cvicinity class)\n //\n-00004 // Description: header file for splitting/merging (contains the CJet class) //\n 00005 // This file is part of the SISCone project.\n //\n 00006 // WARNING: this is not the main SISCone trunk but\n //\n 00007 //\n an adaptation to spherical coordinates\n //\n@@ -26690,23 +26689,381 @@\n //\n 00013 // it under the terms of the GNU General Public License as published by\n //\n 00014 // the Free Software Foundation; either version 2 of the License, or\n //\n 00015 // (at your option) any later version.\n //\n+00016 //\n+//\n+00017 // This program is distributed in the hope that it will be useful,\n+//\n+00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+//\n+00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+//\n+00020 // GNU General Public License for more details.\n+//\n+00021 //\n+//\n+00022 // You should have received a copy of the GNU General Public License\n+//\n+00023 // along with this program; if not, write to the Free Software\n+//\n+00024 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n+00025 //\n+//\n+00026 // $Revision:: 255\n+$//\n+00027 // $Date:: 2008-07-12 17:40:35 +0200 (Sat, 12 Jul 2008)\n+$//\n+00029\n+00030 #ifndef __SPH_VICINITY_H__\n+00031 #define __SPH_VICINITY_H__\n+00032\n+00033 #include \n \n Generated by Doxygen\n \n //\n \n \f294\n \n File Documentation\n \n+00034 #include \n+00035 #include \n+00036 #include \"momentum.h\"\n+00037 #include \n+00038 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n+00039 #include \n+00040 #endif\n+00041\n+00042 namespace siscone_spherical{\n+00043\n+00044\n+00052 class CSphvicinity_elm{\n+00053 public:\n+00055\n+CSphmomentum *v;\n+00056\n+00058\n+siscone::Cvicinity_inclusion *is_inside;\n+00059\n+00060\n+// centre variables\n+00061\n+CSph3vector centre;\n+00062\n+double angle;\n+bool side;\n+00063\n+00064\n+double cocircular_range;\n+00066\n+00069\n+std::list cocircular;\n+00070 };\n+00071\n+00073 bool ve_less(CSphvicinity_elm *ve1, CSphvicinity_elm *ve2);\n+00074\n+00075\n+00083 class CSphvicinity{\n+00084 public:\n+00086\n+CSphvicinity();\n+00087\n+00089\n+CSphvicinity(std::vector &_particle_list);\n+00090\n+00092\n+~CSphvicinity();\n+00093\n+void set_particle_list(std::vector &_particle_list);\n+00098\n+00099\n+void build(CSphmomentum *_parent, double _VR);\n+00105\n+00106\n+00107\n+// cone kinematical information\n+00108\n+CSphmomentum *parent;\n+00109\n+double VR;\n+double VR2;\n+00110\n+00111\n+double cosVR;\n+double R;\n+00112\n+00113\n+double R2;\n+00114\n+double tan2R;\n+double D2_R;\n+00115\n+00116\n+double inv_R_EPS_COCIRC;\n+double inv_R_2EPS_COCIRC;\n+00117\n+00118\n+// particle list information\n+00119\n+00120\n+int n_part;\n+00121\n+std::vector plist;\n+00123\n+std::vector pincluded;\n+00124\n+CSphvicinity_elm *ve_list;\n+00125 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n+00126\n+siscone::Cquadtree *quadtree;\n+00127 #endif\n+00128\n+00129\n+// vicinity information\n+00130\n+std::vector vicinity;\n+00131\n+unsigned int vicinity_size;\n+00132\n+00133 protected:\n+00139\n+void append_to_vicinity(CSphmomentum *v);\n+00140\n+// internal variables\n+00141\n+00142\n+CSph3vector parent_centre;\n+00143\n+CSph3vector angular_dir1;\n+00144\n+CSph3vector angular_dir2;\n+00145 };\n+00146\n+00147 }\n+00148\n+00149 #endif\n+\n+5.48 vicinity.h\n+00001 // -*- C++ -*00003 // File: vicinity.h\n+\n+//\n+\n+Generated by Doxygen\n+\n+\f5.48 vicinity.h\n+\n+00004 // Description: header file for particle vicinity (Cvicinity class)\n+//\n+00005 // This file is part of the SISCone project.\n+//\n+00006 // For more details, see http://projects.hepforge.org/siscone\n+//\n+00007 //\n+//\n+00008 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n+//\n+00009 //\n+//\n+00010 // This program is free software; you can redistribute it and/or modify\n+//\n+00011 // it under the terms of the GNU General Public License as published by\n+//\n+00012 // the Free Software Foundation; either version 2 of the License, or\n+//\n+00013 // (at your option) any later version.\n+//\n+00014 //\n+//\n+00015 // This program is distributed in the hope that it will be useful,\n+//\n+00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+//\n+00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+//\n+00018 // GNU General Public License for more details.\n+//\n+00019 //\n+//\n+00020 // You should have received a copy of the GNU General Public License\n+//\n+00021 // along with this program; if not, write to the Free Software\n+//\n+00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n+00023 //\n+//\n+00024 // $Revision:: 123\n+$//\n+00025 // $Date:: 2007-03-01 02:52:16 +0100 (Thu, 01 Mar 2007)\n+$//\n+00027\n+00028 #ifndef __VICINITY_H__\n+00029 #define __VICINITY_H__\n+00030\n+00031 #include \n+00032 #include \n+00033 #include \"momentum.h\"\n+00034 #include \"defines.h\"\n+00035 #include \"quadtree.h\"\n+00036\n+00037 namespace siscone{\n+00038\n+00039\n+00040\n+00046 class Cvicinity_inclusion {\n+00047 public:\n+00049\n+Cvicinity_inclusion() : cone(false), cocirc(false) {}\n+00050\n+00051\n+bool cone;\n+bool cocirc;\n+00052\n+00053 };\n+00054\n+00055\n+00063 class Cvicinity_elm{\n+00064 public:\n+00066\n+Cmomentum *v;\n+00067\n+00069\n+Cvicinity_inclusion *is_inside;\n+00070\n+00071\n+// centre variables\n+00072\n+double eta;\n+double phi;\n+00073\n+00074\n+double angle;\n+bool side;\n+00075\n+00076\n+double cocircular_range;\n+00078\n+00081\n+std::list cocircular;\n+00082 };\n+00083\n+00085 bool ve_less(Cvicinity_elm *ve1, Cvicinity_elm *ve2);\n+00086\n+00087\n+00095 class Cvicinity{\n+00096 public:\n+00098\n+Cvicinity();\n+00099\n+00101\n+Cvicinity(std::vector &_particle_list);\n+00102\n+00104\n+~Cvicinity();\n+00105\n+00110\n+void set_particle_list(std::vector &_particle_list);\n+00111\n+void build(Cmomentum *_parent, double _VR);\n+00117\n+00118\n+// cone kinematical information\n+00119\n+00120\n+Cmomentum *parent;\n+00121\n+double VR;\n+double VR2;\n+00122\n+00123\n+double R;\n+double R2;\n+00124\n+double inv_R_EPS_COCIRC;\n+00125\n+00126\n+double inv_R_2EPS_COCIRC;\n+\n+Generated by Doxygen\n+\n+295\n+\n+\f296\n+\n+File Documentation\n+\n+00127\n+// particle list information\n+00128\n+00129\n+int n_part;\n+00130\n+std::vector plist;\n+00131\n+std::vector pincluded;\n+00132\n+Cvicinity_elm *ve_list;\n+00133 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n+00134\n+Cquadtree *quadtree;\n+00135 #endif\n+00136\n+00137\n+// vicinity information\n+00138\n+std::vector vicinity;\n+00139\n+unsigned int vicinity_size;\n+00140\n+00141 protected:\n+void append_to_vicinity(Cmomentum *v);\n+00147\n+00148\n+00149\n+// internal variables\n+00150\n+double pcx;\n+00151\n+double pcy;\n+00152 };\n+00153\n+00154 }\n+00155\n+00156 #endif\n+\n+5.49 split_merge.h\n+00001 // -*- C++ -*00003 // File: split_merge.h\n+//\n+00004 // Description: header file for splitting/merging (contains the CJet class) //\n+00005 // This file is part of the SISCone project.\n+//\n+00006 // WARNING: this is not the main SISCone trunk but\n+//\n+00007 //\n+an adaptation to spherical coordinates\n+//\n+00008 // For more details, see http://projects.hepforge.org/siscone\n+//\n+00009 //\n+//\n+00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n+00011 //\n+//\n+00012 // This program is free software; you can redistribute it and/or modify\n+//\n+00013 // it under the terms of the GNU General Public License as published by\n+//\n+00014 // the Free Software Foundation; either version 2 of the License, or\n+//\n+00015 // (at your option) any later version.\n+//\n 00016 //\n //\n 00017 // This program is distributed in the hope that it will be useful,\n //\n 00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n //\n 00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n@@ -26750,29 +27107,38 @@\n CSphjet();\n 00060\n 00062\n ~CSphjet();\n 00063\n 00064\n CSphmomentum v;\n-double E_tilde;\n 00065\n-int n;\n+double E_tilde;\n+\n+//\n+\n+Generated by Doxygen\n+\n+\f5.49 split_merge.h\n+\n+297\n+\n 00066\n+int n;\n 00067\n std::vector contents;\n 00068\n-00080\n double sm_var2;\n+00080\n 00081\n 00083\n CSphtheta_phi_range range;\n 00084\n-int pass;\n 00089\n+int pass;\n 00090 };\n 00091\n 00094\n 00096 bool jets_E_less(const CSphjet &j1, const CSphjet &j2);\n 00097\n 00098\n 00106 enum Esplit_merge_scale {\n@@ -26789,16 +27155,16 @@\n 00122\n CSphsplit_merge_ptcomparison() :\n 00123\n particles(0), split_merge_scale(SM_Etilde){};\n 00124\n 00126\n std::string SM_scale_name()const {\n-00127\n return split_merge_scale_name(split_merge_scale);}\n+00127\n 00128\n 00129\n std::vector * particles;\n 00130\n std::vector * particles_norm2;\n 00131\n 00133\n@@ -26816,39 +27182,32 @@\n 00164 typedef std::multiset::iterator\n cjet_iterator;\n 00165\n 00167 typedef std::vector::iterator jet_iterator;\n 00168\n 00169\n 00170\n-\n-Generated by Doxygen\n-\n-\f5.47 split_merge.h\n-\n-295\n-\n 00175 class CSphsplit_merge{\n 00176 public:\n 00178\n CSphsplit_merge();\n 00179\n 00181\n ~CSphsplit_merge();\n 00182\n 00183\n-00185\n // initialisation functions //\n+00185\n 00187\n 00196\n int init(std::vector &_particles, std::vector *protocones, double R2,\n double Emin=0.0);\n 00197\n-int init_particles(std::vector &_particles);\n 00203\n+int init_particles(std::vector &_particles);\n 00204\n int init_pleft();\n 00208\n 00209\n inline int set_E_weighted_splitting(bool _use_E_weighted_splitting){\n 00221\n 00222\n@@ -26857,75 +27216,84 @@\n 00223\n 00224\n }\n 00225\n 00227\n // cleaning functions //\n 00229\n-int partial_clear();\n 00231\n+int partial_clear();\n 00232\n int full_clear();\n 00234\n 00235\n // user-defined stable-cone ordering //\n 00237\n 00239\n-00245\n class Cuser_scale_base{\n-public:\n+00245\n 00246\n-00248\n+public:\n virtual ~Cuser_scale_base(){}\n+00248\n 00249\n-virtual double operator()(const CSphjet & jet) const = 0;\n 00254\n+virtual double operator()(const CSphjet & jet) const = 0;\n 00255\n virtual bool is_larger(const CSphjet & a, const CSphjet & b)const{\n 00266\n-00267\n return (a.sm_var2 > b.sm_var2);\n+00267\n 00268\n }\n 00269\n };\n+\n+Generated by Doxygen\n+\n+\f298\n+\n 00270\n-void set_user_scale(const Cuser_scale_base * user_scale_in){\n 00275\n 00276\n-_user_scale = user_scale_in;\n 00277\n-}\n 00278\n-const Cuser_scale_base * user_scale()const { return _user_scale; }\n 00280\n 00281\n 00282\n 00284\n-// main parts of the algorithm //\n 00286\n-int merge_collinear_and_remove_soft();\n 00296\n 00297\n-int add_protocones(std::vector *protocones, double R2, double Emin=0.0);\n 00305\n 00306\n-int add_hardest_protocone_to_jets(std::vector *protocones, double R2, double\n 00317\n+\n+File Documentation\n+\n+void set_user_scale(const Cuser_scale_base * user_scale_in){\n+_user_scale = user_scale_in;\n+}\n+const Cuser_scale_base * user_scale()const { return _user_scale; }\n+// main parts of the algorithm //\n+int merge_collinear_and_remove_soft();\n+int add_protocones(std::vector *protocones, double R2, double Emin=0.0);\n+int add_hardest_protocone_to_jets(std::vector *protocones, double R2, double\n Emin=0.0);\n+\n 00318\n-int perform(double overlap_tshold, double Emin=0.0);\n 00328\n+int perform(double overlap_tshold, double Emin=0.0);\n 00329\n 00330\n-00332\n // save and debug functions //\n+00332\n 00334\n-int save_contents(FILE *flux);\n 00337\n+int save_contents(FILE *flux);\n 00338\n int show();\n 00340\n 00341\n // particle information\n 00342\n 00343\n@@ -26936,19 +27304,19 @@\n std::vector particles_norm2;\n 00346\n int n_left;\n 00347\n std::vector p_remain;\n 00348\n std::vector p_uncol_hard;\n-int n_pass;\n 00349\n+int n_pass;\n 00350\n-00354\n double most_ambiguous_split;\n+00354\n 00355\n // jets information\n 00356\n 00357\n std::vector jets;\n 00358\n // working entries\n@@ -26960,40 +27328,33 @@\n 00362\n bool merge_identical_protocones;\n 00371\n 00372\n 00374\n CSphsplit_merge_ptcomparison ptcomparison;\n 00375\n-\n-Generated by Doxygen\n-\n-\f296\n-\n-File Documentation\n-\n 00382\n double SM_var2_hardest_cut_off;\n 00383\n double stable_cone_soft_E2_cutoff;\n 00391\n 00392\n 00393 private:\n-00401\n bool get_overlap(const CSphjet &j1, const CSphjet &j2, double *v);\n+00401\n 00402\n 00403\n-00415\n bool split(cjet_iterator &it_j1, cjet_iterator &it_j2);\n+00415\n 00416\n-00425\n bool merge(cjet_iterator &it_j1, cjet_iterator &it_j2);\n+00425\n 00426\n-bool insert(CSphjet &jet);\n 00433\n+bool insert(CSphjet &jet);\n 00434\n double get_sm_var2(CSphmomentum &v, double &E_tilde);\n 00441\n 00442\n void compute_Etilde(CSphjet &j);\n 00444\n 00445\n@@ -27003,35 +27364,40 @@\n 00449\n std::unique_ptr > candidates;\n 00450 #else\n 00451\n std::auto_ptr > candidates;\n 00452 #endif\n 00453\n-double E_min;\n 00455\n+double E_min;\n 00456\n bool use_E_weighted_splitting;\n 00462\n 00463\n-00466\n const Cuser_scale_base *_user_scale;\n+00466\n 00467\n 00468 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 00470\n std::set cand_refs;\n 00471 #endif\n 00472 };\n 00473\n 00474 }\n 00475\n 00476\n+\n+Generated by Doxygen\n+\n+\f5.50 split_merge.h\n+\n 00477 #endif\n \n-5.48 split_merge.h\n+5.50 split_merge.h\n 00001 // -*- C++ -*00003 // File: split_merge.h\n //\n 00004 // Description: header file for splitting/merging (contains the CJet class) //\n 00005 // This file is part of the SISCone project.\n //\n 00006 // For more details, see http://projects.hepforge.org/siscone\n //\n@@ -27081,21 +27447,14 @@\n 00033 #include \"geom_2d.h\"\n 00034 #include \"momentum.h\"\n 00035 #include \n 00036 #include \n 00037 #include \n 00038 #include \n 00039 #include \n-\n-Generated by Doxygen\n-\n-\f5.48 split_merge.h\n-\n-297\n-\n 00040\n 00041 namespace siscone{\n 00042\n 00043 const int CJET_INEXISTENT_PASS = -2;\n 00044\n 00054 class Cjet{\n 00055 public:\n@@ -27142,30 +27501,39 @@\n 00108\n 00116 class Csplit_merge_ptcomparison{\n 00117 public:\n 00119\n Csplit_merge_ptcomparison() :\n 00120\n particles(0), split_merge_scale(SM_pttilde){};\n+\n+Generated by Doxygen\n+\n+299\n+\n+\f300\n+\n+File Documentation\n+\n 00121\n 00123\n std::string SM_scale_name()const {\n 00124\n return split_merge_scale_name(split_merge_scale);}\n 00125\n 00126\n std::vector * particles;\n 00127\n std::vector * pt;\n 00128\n 00130\n bool operator()(const Cjet &jet1, const Cjet &jet2) const;\n 00131\n-00143\n void get_difference(const Cjet &j1, const Cjet &j2, Cmomentum *v, double *pt_tilde) const;\n+00143\n 00144\n 00163\n Esplit_merge_scale split_merge_scale;\n 00164 };\n 00165\n 00166\n 00167 // iterator types\n@@ -27183,243 +27551,245 @@\n 00186\n ~Csplit_merge();\n 00187\n 00188\n 00190\n // initialisation functions //\n 00192\n-int init(std::vector &_particles, std::vector *protocones, double R2, double\n 00201\n+int init(std::vector &_particles, std::vector *protocones, double R2, double\n ptmin=0.0);\n 00202\n int init_particles(std::vector &_particles);\n 00208\n 00209\n-int init_pleft();\n 00213\n+int init_pleft();\n 00214\n inline int set_pt_weighted_splitting(bool _use_pt_weighted_splitting){\n 00226\n 00227\n use_pt_weighted_splitting = _use_pt_weighted_splitting;\n return 0;\n 00228\n 00229\n }\n 00230\n 00232\n // cleaning functions //\n 00234\n-int partial_clear();\n 00236\n+int partial_clear();\n 00237\n-00239\n int full_clear();\n-\n-Generated by Doxygen\n-\n-\f298\n-\n-File Documentation\n-\n+00239\n 00240\n // user-defined stable-cone ordering //\n 00242\n 00244\n class Cuser_scale_base{\n 00250\n 00251\n public:\n-00253\n virtual ~Cuser_scale_base(){}\n+00253\n 00254\n-virtual double operator()(const Cjet & jet) const = 0;\n 00259\n+virtual double operator()(const Cjet & jet) const = 0;\n 00260\n virtual bool is_larger(const Cjet & a, const Cjet & b)const{\n 00271\n-00272\n return (a.sm_var2 > b.sm_var2);\n+00272\n 00273\n }\n 00274\n };\n 00275\n-void set_user_scale(const Cuser_scale_base * user_scale_in){\n 00280\n+void set_user_scale(const Cuser_scale_base * user_scale_in){\n 00281\n _user_scale = user_scale_in;\n 00282\n }\n 00283\n const Cuser_scale_base * user_scale()const { return _user_scale; }\n 00285\n 00286\n 00287\n 00289\n // main parts of the algorithm //\n 00291\n-int merge_collinear_and_remove_soft();\n 00299\n+int merge_collinear_and_remove_soft();\n 00300\n int add_protocones(std::vector *protocones, double R2, double ptmin=0.0);\n 00308\n 00309\n int add_hardest_protocone_to_jets(std::vector *protocones, double R2, double ptmin=0.0);\n 00320\n 00321\n-00331\n int perform(double overlap_tshold, double ptmin=0.0);\n+00331\n 00332\n 00333\n-// save and debug functions //\n 00335\n+// save and debug functions //\n 00337\n int save_contents(FILE *flux);\n 00340\n 00341\n 00343\n int show();\n 00344\n-// particle information\n 00345\n+// particle information\n+\n+Generated by Doxygen\n+\n+\f5.51 vicinity.cpp\n+\n+301\n+\n 00346\n int n;\n 00347\n std::vector particles;\n 00348\n std::vector pt;\n-00349\n int n_left;\n+00349\n 00350\n std::vector p_remain;\n 00351\n std::vector p_uncol_hard;\n-int n_pass;\n 00352\n+int n_pass;\n 00353\n double most_ambiguous_split;\n 00357\n 00358\n-// jets information\n 00359\n+// jets information\n 00360\n std::vector jets;\n 00361\n // working entries\n 00362\n 00363\n int *indices;\n int idx_size;\n 00364\n 00365\n-bool merge_identical_protocones;\n 00374\n+bool merge_identical_protocones;\n 00375\n 00377\n Csplit_merge_ptcomparison ptcomparison;\n 00378\n-00385\n double SM_var2_hardest_cut_off;\n+00385\n 00386\n double stable_cone_soft_pt2_cutoff;\n 00394\n 00395\n 00396 private:\n-bool get_overlap(const Cjet &j1, const Cjet &j2, double *v);\n 00404\n+bool get_overlap(const Cjet &j1, const Cjet &j2, double *v);\n 00405\n 00406\n 00418\n bool split(cjet_iterator &it_j1, cjet_iterator &it_j2);\n 00419\n bool merge(cjet_iterator &it_j1, cjet_iterator &it_j2);\n 00428\n 00429\n bool insert(Cjet &jet);\n 00436\n 00437\n-00444\n double get_sm_var2(Cmomentum &v, double &pt_tilde);\n+00444\n 00445\n // jet information\n 00446\n 00448 #ifdef SISCONE_USES_UNIQUE_PTR_AS_AUTO_PTR\n 00449\n std::unique_ptr > candidates;\n 00450 #else\n 00451\n std::auto_ptr > candidates;\n 00452 #endif\n 00453\n-00455\n double pt_min2;\n+00455\n 00456\n bool use_pt_weighted_splitting;\n 00462\n 00463\n-\n-Generated by Doxygen\n-\n-\f5.49 vicinity.cpp\n-\n-299\n-\n 00466\n const Cuser_scale_base *_user_scale;\n 00467\n 00468 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 00470\n std::set cand_refs;\n 00471 #endif\n 00472 };\n 00473\n 00474 }\n 00475\n 00476\n 00477 #endif\n \n-5.49 vicinity.cpp\n+5.51 vicinity.cpp\n 00001\n-//\n 00002 // File: vicinity.cpp\n 00003 // Description: source file for particle vicinity (Cvicinity class)\n-//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // WARNING: this is not the main SISCone trunk but\n-//\n 00006 //\n an adaptation to spherical coordinates\n-//\n 00007 // For more details, see http://projects.hepforge.org/siscone\n-//\n 00008 //\n-//\n 00009 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n 00010 //\n-//\n 00011 // This program is free software; you can redistribute it and/or modify\n-//\n 00012 // it under the terms of the GNU General Public License as published by\n-//\n 00013 // the Free Software Foundation; either version 2 of the License, or\n-//\n 00014 // (at your option) any later version.\n //\n 00015 //\n-//\n 00016 // This program is distributed in the hope that it will be useful,\n-//\n 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-//\n 00019 // GNU General Public License for more details.\n //\n+\n+Generated by Doxygen\n+\n+//\n+//\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+//\n+//\n+//\n+//\n+\n+\f302\n+\n 00020 //\n //\n 00021 // You should have received a copy of the GNU General Public License\n //\n 00022 // along with this program; if not, write to the Free Software\n //\n 00023 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n@@ -27446,16 +27816,16 @@\n 00041 * class used to manage one points in the vicinity\n *\n 00042 * of a parent point.\n 00043 *************************************************************/\n 00044\n 00045 // ordering pointers to CSphvicinity_elm\n 00046 //--------------------------------------00047 bool ve_less(CSphvicinity_elm *ve1, CSphvicinity_elm *ve2){\n-00048\n return ve1->angle < ve2->angle;\n+00048\n 00049 }\n 00050\n 00051\n 00052 /*************************************************************\n 00053 * CSphvicinity implementation\n *\n 00054 * list of element in the vicinity of a parent.\n@@ -27473,26 +27843,14 @@\n n_part = 0;\n 00064\n 00065\n ve_list = NULL;\n 00066 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00067\n quadtree = NULL;\n-\n-Generated by Doxygen\n-\n-//\n-\n-*\n-*\n-\n-\f300\n-\n-File Documentation\n-\n 00068 #endif\n 00069\n 00070\n parent = NULL;\n 00071\n VR2 = VR = 0.0;\n 00072\n@@ -27521,36 +27879,46 @@\n 00091\n 00092\n delete[] ve_list;\n 00093\n 00094 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00095\n if (quadtree!=NULL)\n-00096\n delete quadtree;\n+00096\n 00097 #endif\n 00098 }\n 00099\n 00100 /*\n 00101 * set the particle_list\n-00102 * - particle_list\n list of particles (type CSphmomentum)\n+00102 * - particle_list\n 00103 * - n\n number of particles in the list\n 00104 ************************************************************/\n 00105 void CSphvicinity::set_particle_list(vector &_particle_list){\n-00106\n int i,j;\n+00106\n 00107 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n+\n+File Documentation\n+\n+*\n+*\n+\n+Generated by Doxygen\n+\n+\f5.51 vicinity.cpp\n+\n 00108\n double eta_max=0.0;\n 00109 #endif\n 00110\n-00111\n // if the particle list is not empty, destroy it !\n+00111\n 00112\n if (ve_list!=NULL){\n 00113\n delete[] ve_list;\n 00114\n }\n 00115\n@@ -27573,16 +27941,16 @@\n n_part = 0;\n 00125\n plist.clear();\n 00126\n pincluded.clear();\n 00127\n for (i=0;i<(int) _particle_list.size();i++){\n-00128\n // if a particle is colinear with the beam (infinite rapidity)\n+00128\n 00129\n // we do not take it into account\n 00130\n //if (fabs(_particle_list[i].pz)!=_particle_list[i].E){\n 00131\n plist.push_back(_particle_list[i]);\n 00132\n@@ -27611,34 +27979,29 @@\n 00146\n n_part++;\n //}\n 00147\n 00148\n }\n 00149\n-00150\n // allocate quadtree and vicinity_elm list\n+00150\n 00151\n // note: we set phi in [-pi:pi] as it is the natural range for atan2!\n 00152\n ve_list = new CSphvicinity_elm[2*n_part];\n 00153 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00154\n eta_max+=0.1;\n-\n-Generated by Doxygen\n-\n-\f5.49 vicinity.cpp\n-\n 00155\n quadtree = new siscone::Cquadtree(0.0, 0.0, eta_max, M_PI);\n 00156 #endif\n 00157\n-// append particle to the vicinity_elm list\n 00158\n+// append particle to the vicinity_elm list\n 00159\n j = 0;\n 00160\n for (i=0;iadd(&plist[i]);\n@@ -27653,18 +28016,18 @@\n }\n 00168\n 00169 }\n 00170\n 00171\n 00172 /*\n 00173 * build the vicinity list from a list of points.\n-reference particle\n 00174 * - _parent\n-00175 * - _VR\n+reference particle\n vicinity radius\n+00175 * - _VR\n 00176 ************************************************************/\n 00177 void CSphvicinity::build(CSphmomentum *_parent, double _VR){\n int i;\n 00178\n 00179\n // set parent and radius\n 00180\n@@ -27678,30 +28041,39 @@\n 00185\n cosVR = cos(VR);\n 00186\n R2 = 0.25*VR2;\n 00187\n R\n = 0.5*VR;\n-double tmp = tan(R);\n 00188\n+double tmp = tan(R);\n 00189\n tan2R = tmp*tmp;\n 00190\n 00191\n D2_R = 2.0*(1-cos(R));\n //tmp = sqrt(D2_R);\n 00192\n 00193\n inv_R_EPS_COCIRC = 1.0 / R / EPSILON_COCIRCULAR;\n 00194\n inv_R_2EPS_COCIRC = 0.5 / R / EPSILON_COCIRCULAR;\n+\n+Generated by Doxygen\n+\n+303\n+\n+\f304\n+\n+File Documentation\n+\n 00195\n-00196\n // clear vicinity\n+00196\n 00197\n vicinity.clear();\n 00198\n // init parent variables\n 00199\n 00200\n // we cpte the direction of the centre and two orthogonal ones\n@@ -27714,16 +28086,16 @@\n 00204\n parent_centre.get_angular_directions(angular_dir1, angular_dir2);\n 00205\n angular_dir1 /= angular_dir1._norm;\n 00206\n angular_dir2 /= angular_dir2._norm;\n 00207\n-// really browse the particle list\n 00208\n+// really browse the particle list\n 00209\n for (i=0;i0) ? 0.0 : 2.0;\n-double t=c/s;\n+00223\n 00224\n+double t=c/s;\n 00225\n return (s>0) ? 1-t/(1+fabs(t)) : 3-t/(1+fabs(t));\n 00226 }\n 00227\n 00228\n 00229 /*\n 00230 * append a particle to the \u2019vicinity\u2019 list after\n@@ -27765,104 +28137,100 @@\n int i=2*(v->index);\n 00239\n 00240\n // compute the distance of the i-th particle with the parent\n 00241\n 00242\n double dot = dot_product3(parent_centre,*v);\n-\n-Generated by Doxygen\n-\n-301\n-\n-\f302\n-\n 00243\n+CSph3vector vnormal = *v;\n 00244\n+vnormal/=v->_norm;\n 00245\n+dot/=v->_norm;\n 00246\n 00247\n+// really check if the distance is less than VR\n 00248\n+if (dot>cosVR){\n 00249\n+CSph3vector cross = cross_product3(parent_centre,vnormal);\n 00250\n 00251\n+// for the centres\n 00252\n+CSph3vector median = (parent_centre+vnormal);\n 00253\n+double amplT = sqrt((tan2R*(1+dot)+(dot-1))*(1+dot));\n 00254\n+CSph3vector transverse = amplT*cross/cross._norm;\n 00255\n 00256\n+// first angle (+)\n 00257\n+ve_list[i].centre = median + transverse;\n 00258\n+ve_list[i].centre.build_norm();\n 00259\n+ve_list[i].centre/=ve_list[i].centre._norm;\n 00260\n+CSph3vector diff = ve_list[i].centre - parent_centre;\n+//ve_list[i].angle = atan2(dot_product3(angular_dir2, diff),dot_product3(angular_dir1, diff));\n 00261\n 00262\n+ve_list[i].angle = sort_angle(dot_product3(angular_dir2, diff),dot_product3(angular_dir1, diff));\n 00263\n+ve_list[i].side = true;\n 00264\n+ve_list[i].cocircular.clear();\n 00265\n+vicinity.push_back(&(ve_list[i]));\n 00266\n+// second angle (-)\n 00267\n 00268\n-00269\n-00270\n-00271\n-00272\n-\n-File Documentation\n-\n-CSph3vector vnormal = *v;\n-vnormal/=v->_norm;\n-dot/=v->_norm;\n-// really check if the distance is less than VR\n-if (dot>cosVR){\n-CSph3vector cross = cross_product3(parent_centre,vnormal);\n-// for the centres\n-CSph3vector median = (parent_centre+vnormal);\n-double amplT = sqrt((tan2R*(1+dot)+(dot-1))*(1+dot));\n-CSph3vector transverse = amplT*cross/cross._norm;\n-// first angle (+)\n-ve_list[i].centre = median + transverse;\n-ve_list[i].centre.build_norm();\n-ve_list[i].centre/=ve_list[i].centre._norm;\n-CSph3vector diff = ve_list[i].centre - parent_centre;\n-//ve_list[i].angle = atan2(dot_product3(angular_dir2, diff),dot_product3(angular_dir1, diff));\n-ve_list[i].angle = sort_angle(dot_product3(angular_dir2, diff),dot_product3(angular_dir1, diff));\n-ve_list[i].side = true;\n-ve_list[i].cocircular.clear();\n-vicinity.push_back(&(ve_list[i]));\n-\n-// second angle (-)\n ve_list[i+1].centre = median - transverse;\n+00269\n ve_list[i+1].centre.build_norm();\n+00270\n ve_list[i+1].centre/=ve_list[i+1].centre._norm;\n+00271\n diff = ve_list[i+1].centre - parent_centre;\n+00272\n ve_list[i+1].angle = sort_angle(dot_product3(angular_dir2, diff),dot_product3(angular_dir1,\n diff));\n 00273\n ve_list[i+1].side = false;\n 00274\n ve_list[i+1].cocircular.clear();\n 00275\n vicinity.push_back(&(ve_list[i+1]));\n 00276\n-// now work out the cocircularity range for the two points (range\n 00277\n+// now work out the cocircularity range for the two points (range\n 00278\n // of angle within which the points stay within a distance\n 00279\n // EPSILON_COCIRCULAR of circule\n 00280\n // P = parent; C = child; O = Origin (center of circle)\n 00281\n CSph3vector OP = parent_centre - ve_list[i+1].centre;\n+\n+Generated by Doxygen\n+\n+\f5.52 vicinity.cpp\n+\n+305\n+\n 00282\n CSph3vector OC = vnormal - ve_list[i+1].centre;\n 00283\n-00284\n // two sources of error are (GPS CCN29-19) epsilon/(R sin theta)\n+00284\n 00285\n // and sqrt(2*epsilon/(R (1-cos theta))) and the way things work\n 00286\n // out, it is the _smaller_ of the two that is relevant [NB have\n 00287\n // changed definition of theta here relative to that used in\n 00288\n@@ -27885,59 +28253,50 @@\n ve_list[i+1].cocircular_range = ve_list[i].cocircular_range;\n 00297\n }\n 00298 }\n 00299\n 00300 }\n \n-5.50 vicinity.cpp\n+5.52 vicinity.cpp\n 00001\n+//\n 00002 // File: vicinity.cpp\n 00003 // Description: source file for particle vicinity (Cvicinity class)\n+//\n 00004 // This file is part of the SISCone project.\n //\n 00005 // For more details, see http://projects.hepforge.org/siscone\n+//\n 00006 //\n+//\n 00007 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n+//\n 00008 //\n+//\n 00009 // This program is free software; you can redistribute it and/or modify\n+//\n 00010 // it under the terms of the GNU General Public License as published by\n+//\n 00011 // the Free Software Foundation; either version 2 of the License, or\n+//\n 00012 // (at your option) any later version.\n //\n 00013 //\n+//\n 00014 // This program is distributed in the hope that it will be useful,\n+//\n 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+//\n 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+//\n 00017 // GNU General Public License for more details.\n //\n 00018 //\n-\n-//\n-//\n-\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-\n-//\n-//\n //\n-//\n-\n-//\n-\n-Generated by Doxygen\n-\n-\f5.50 vicinity.cpp\n-\n 00019 // You should have received a copy of the GNU General Public License\n //\n 00020 // along with this program; if not, write to the Free Software\n //\n 00021 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n 00022 //\n //\n@@ -27962,16 +28321,16 @@\n 00039 * class used to manage one points in the vicinity\n *\n 00040 * of a parent point.\n 00041 *************************************************************/\n 00042\n 00043 // ordering pointers to Cvicinity_elm\n 00044 //-----------------------------------00045 bool ve_less(Cvicinity_elm *ve1, Cvicinity_elm *ve2){\n-00046\n return ve1->angle < ve2->angle;\n+00046\n 00047 }\n 00048\n 00049\n 00050 /*************************************************************\n 00051 * Cvicinity implementation\n *\n 00052 * list of element in the vicinity of a parent.\n@@ -27980,15 +28339,26 @@\n 00054 * of a parent point. The construction of the list can be\n *\n 00055 * made from a list of points or from a quadtree.\n *\n 00056 *************************************************************/\n 00057\n 00058 // default constructor\n-00059 //--------------------00060 Cvicinity::Cvicinity(){\n+00059 //---------------------\n+\n+Generated by Doxygen\n+\n+*\n+*\n+\n+\f306\n+\n+File Documentation\n+\n+00060 Cvicinity::Cvicinity(){\n 00061\n n_part = 0;\n 00062\n 00063\n ve_list = NULL;\n 00064 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00065\n@@ -28025,61 +28395,49 @@\n if (ve_list!=NULL)\n delete[] ve_list;\n 00090\n 00091\n 00092 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00093\n if (quadtree!=NULL)\n-00094\n delete quadtree;\n+00094\n 00095 #endif\n 00096 }\n 00097\n 00098 /*\n 00099 * set the particle_list\n-00100 * - particle_list\n list of particles (type Cmomentum)\n+00100 * - particle_list\n number of particles in the list\n 00101 * - n\n 00102 ************************************************************/\n 00103 void Cvicinity::set_particle_list(vector &_particle_list){\n int i,j;\n 00104\n 00105 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00106\n double eta_max=0.0;\n-\n-Generated by Doxygen\n-\n-303\n-\n-*\n-*\n-\n-\f304\n-\n-File Documentation\n-\n 00107 #endif\n 00108\n-00109\n // if the particle list is not empty, destroy it !\n+00109\n 00110\n if (ve_list!=NULL){\n-00111\n delete[] ve_list;\n+00111\n 00112\n }\n 00113\n vicinity.clear();\n 00114 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00115\n if (quadtree!=NULL)\n-00116\n delete quadtree;\n+00116\n 00117 #endif\n 00118\n 00119\n // allocate memory array for particles\n 00120\n // Note: - we compute max for |eta|\n 00121\n@@ -28087,16 +28445,16 @@\n - we allocate indices to particles\n 00122\n n_part = 0;\n 00123\n plist.clear();\n 00124\n pincluded.clear();\n-00125\n for (i=0;i<(int) _particle_list.size();i++){\n+00125\n 00126\n // if a particle is colinear with the beam (infinite rapidity)\n 00127\n // we do not take it into account\n 00128\n if (fabs(_particle_list[i].pz)!=_particle_list[i].E){\n 00129\n@@ -28125,19 +28483,24 @@\n if (fabs(plist[n_part].eta)>eta_max) eta_max=fabs(plist[n_part].eta);\n 00143 #endif\n 00144\n 00145\n n_part++;\n 00146\n }\n+\n+Generated by Doxygen\n+\n+\f5.52 vicinity.cpp\n+\n 00147\n }\n 00148\n-00149\n // allocate quadtree and vicinity_elm list\n+00149\n 00150\n // note: we set phi in [-pi:pi] as it is the natural range for atan2!\n 00151\n ve_list = new Cvicinity_elm[2*n_part];\n 00152 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00153\n eta_max+=0.1;\n@@ -28165,18 +28528,18 @@\n }\n 00167\n 00168 }\n 00169\n 00170\n 00171 /*\n 00172 * build the vicinity list from a list of points.\n-00173 * - _parent\n reference particle\n-vicinity radius\n+00173 * - _parent\n 00174 * - _VR\n+vicinity radius\n 00175 ************************************************************/\n 00176 void Cvicinity::build(Cmomentum *_parent, double _VR){\n int i;\n 00177\n 00178\n // set parent and radius\n 00179\n@@ -28197,28 +28560,23 @@\n inv_R_2EPS_COCIRC = 0.5 / R / EPSILON_COCIRCULAR;\n 00187\n 00188\n // clear vicinity\n 00189\n vicinity.clear();\n 00190\n-00191\n // init parent variables\n+00191\n 00192\n pcx = parent->eta;\n 00193\n pcy = parent->phi;\n-\n-Generated by Doxygen\n-\n-\f5.50 vicinity.cpp\n-\n 00194\n-// really browse the particle list\n 00195\n+// really browse the particle list\n 00196\n for (i=0;i0) ? 0.0 : 2.0;\n-double t=c/s;\n+00209\n 00210\n-00211\n+double t=c/s;\n return (s>0) ? 1-t/(1+fabs(t)) : 3-t/(1+fabs(t));\n+00211\n 00212 }\n 00213\n 00214\n 00215 /*\n 00216 * append a particle to the \u2019vicinity\u2019 list after\n 00217 * having computed the angular-ordering quantities\n 00218 * - v\n@@ -28258,54 +28616,63 @@\n if (v==parent)\n return;\n 00225\n 00226\n int i=2*(v->index);\n 00227\n 00228\n-// compute the distance of the i-th particle with the parent\n 00229\n+// compute the distance of the i-th particle with the parent\n 00230\n dx = v->eta - pcx;\n 00231\n dy = v->phi - pcy;\n 00232\n-// pay attention to the periodicity in phi !\n 00233\n+// pay attention to the periodicity in phi !\n 00234\n if (dy>M_PI)\n+\n+Generated by Doxygen\n+\n+307\n+\n+\f308\n+\n+File Documentation\n+\n 00235\n dy -= twopi;\n-00236\n else if (dy<-M_PI)\n+00236\n 00237\n dy += twopi;\n 00238\n 00239\n d2 = dx*dx+dy*dy;\n 00240\n-// really check if the distance is less than VR\n 00241\n+// really check if the distance is less than VR\n 00242\n if (d2 inv_err2_sq ?\n 00290\n 1.0/inv_err1 :\n 00291\n@@ -28396,374 +28754,14 @@\n ve_list[i+1].cocircular_range = ve_list[i].cocircular_range;\n 00293\n }\n 00294 }\n 00295\n 00296 }\n \n-5.51 vicinity.h\n-00001 // -*- C++ -*00003 // File: vicinity.h\n-//\n-00004 // Description: header file for particle vicinity (Cvicinity class)\n-//\n-00005 // This file is part of the SISCone project.\n-//\n-00006 // WARNING: this is not the main SISCone trunk but\n-//\n-00007 //\n-an adaptation to spherical coordinates\n-//\n-00008 // For more details, see http://projects.hepforge.org/siscone\n-//\n-00009 //\n-//\n-00010 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n-00011 //\n-//\n-00012 // This program is free software; you can redistribute it and/or modify\n-//\n-00013 // it under the terms of the GNU General Public License as published by\n-//\n-00014 // the Free Software Foundation; either version 2 of the License, or\n-//\n-00015 // (at your option) any later version.\n-//\n-00016 //\n-//\n-00017 // This program is distributed in the hope that it will be useful,\n-//\n-00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n-00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-//\n-00020 // GNU General Public License for more details.\n-//\n-00021 //\n-//\n-00022 // You should have received a copy of the GNU General Public License\n-//\n-00023 // along with this program; if not, write to the Free Software\n-//\n-00024 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n-00025 //\n-//\n-00026 // $Revision:: 255\n-$//\n-00027 // $Date:: 2008-07-12 17:40:35 +0200 (Sat, 12 Jul 2008)\n-$//\n-00029\n-00030 #ifndef __SPH_VICINITY_H__\n-00031 #define __SPH_VICINITY_H__\n-00032\n-00033 #include \n-00034 #include \n-00035 #include \n-00036 #include \"momentum.h\"\n-00037 #include \n-00038 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n-00039 #include \n-00040 #endif\n-00041\n-00042 namespace siscone_spherical{\n-00043\n-00044\n-00052 class CSphvicinity_elm{\n-00053 public:\n-00055\n-CSphmomentum *v;\n-00056\n-00058\n-siscone::Cvicinity_inclusion *is_inside;\n-00059\n-00060\n-// centre variables\n-00061\n-CSph3vector centre;\n-double angle;\n-00062\n-00063\n-bool side;\n-00064\n-double cocircular_range;\n-00066\n-00069\n-std::list cocircular;\n-00070 };\n-00071\n-00073 bool ve_less(CSphvicinity_elm *ve1, CSphvicinity_elm *ve2);\n-00074\n-00075\n-00083 class CSphvicinity{\n-00084 public:\n-\n-//\n-\n-Generated by Doxygen\n-\n-\f5.52 vicinity.h\n-\n-00086\n-CSphvicinity();\n-00087\n-00089\n-CSphvicinity(std::vector &_particle_list);\n-00090\n-00092\n-~CSphvicinity();\n-00093\n-void set_particle_list(std::vector &_particle_list);\n-00098\n-00099\n-void build(CSphmomentum *_parent, double _VR);\n-00105\n-00106\n-00107\n-// cone kinematical information\n-00108\n-CSphmomentum *parent;\n-00109\n-double VR;\n-double VR2;\n-00110\n-00111\n-double cosVR;\n-double R;\n-00112\n-00113\n-double R2;\n-00114\n-double tan2R;\n-double D2_R;\n-00115\n-00116\n-double inv_R_EPS_COCIRC;\n-double inv_R_2EPS_COCIRC;\n-00117\n-00118\n-00119\n-// particle list information\n-00120\n-int n_part;\n-00121\n-std::vector plist;\n-00123\n-std::vector pincluded;\n-00124\n-CSphvicinity_elm *ve_list;\n-00125 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n-00126\n-siscone::Cquadtree *quadtree;\n-00127 #endif\n-00128\n-00129\n-// vicinity information\n-00130\n-std::vector vicinity;\n-00131\n-unsigned int vicinity_size;\n-00132\n-00133 protected:\n-00139\n-void append_to_vicinity(CSphmomentum *v);\n-00140\n-// internal variables\n-00141\n-00142\n-CSph3vector parent_centre;\n-00143\n-CSph3vector angular_dir1;\n-00144\n-CSph3vector angular_dir2;\n-00145 };\n-00146\n-00147 }\n-00148\n-00149 #endif\n-\n-5.52 vicinity.h\n-00001 // -*- C++ -*00003 // File: vicinity.h\n-//\n-00004 // Description: header file for particle vicinity (Cvicinity class)\n-//\n-00005 // This file is part of the SISCone project.\n-//\n-00006 // For more details, see http://projects.hepforge.org/siscone\n-//\n-00007 //\n-//\n-00008 // Copyright (c) 2006 Gavin Salam and Gregory Soyez\n-//\n-00009 //\n-//\n-00010 // This program is free software; you can redistribute it and/or modify\n-//\n-00011 // it under the terms of the GNU General Public License as published by\n-//\n-00012 // the Free Software Foundation; either version 2 of the License, or\n-//\n-00013 // (at your option) any later version.\n-//\n-00014 //\n-//\n-00015 // This program is distributed in the hope that it will be useful,\n-//\n-00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-//\n-00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-//\n-00018 // GNU General Public License for more details.\n-//\n-00019 //\n-//\n-00020 // You should have received a copy of the GNU General Public License\n-//\n-00021 // along with this program; if not, write to the Free Software\n-//\n-00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //\n-00023 //\n-//\n-00024 // $Revision:: 123\n-$//\n-00025 // $Date:: 2007-03-01 02:52:16 +0100 (Thu, 01 Mar 2007)\n-$//\n-00027\n-00028 #ifndef __VICINITY_H__\n-00029 #define __VICINITY_H__\n-00030\n-00031 #include \n-00032 #include \n-\n-Generated by Doxygen\n-\n-307\n-\n-\f308\n-\n-File Documentation\n-\n-00033 #include \"momentum.h\"\n-00034 #include \"defines.h\"\n-00035 #include \"quadtree.h\"\n-00036\n-00037 namespace siscone{\n-00038\n-00039\n-00040\n-00046 class Cvicinity_inclusion {\n-00047 public:\n-00049\n-Cvicinity_inclusion() : cone(false), cocirc(false) {}\n-00050\n-00051\n-bool cone;\n-bool cocirc;\n-00052\n-00053 };\n-00054\n-00055\n-00063 class Cvicinity_elm{\n-00064 public:\n-00066\n-Cmomentum *v;\n-00067\n-00069\n-Cvicinity_inclusion *is_inside;\n-00070\n-00071\n-// centre variables\n-00072\n-double eta;\n-double phi;\n-00073\n-00074\n-double angle;\n-bool side;\n-00075\n-00076\n-double cocircular_range;\n-00078\n-00081\n-std::list cocircular;\n-00082 };\n-00083\n-00085 bool ve_less(Cvicinity_elm *ve1, Cvicinity_elm *ve2);\n-00086\n-00087\n-00095 class Cvicinity{\n-00096 public:\n-00098\n-Cvicinity();\n-00099\n-00101\n-Cvicinity(std::vector &_particle_list);\n-00102\n-00104\n-~Cvicinity();\n-00105\n-00110\n-void set_particle_list(std::vector &_particle_list);\n-00111\n-void build(Cmomentum *_parent, double _VR);\n-00117\n-00118\n-00119\n-// cone kinematical information\n-00120\n-Cmomentum *parent;\n-00121\n-double VR;\n-double VR2;\n-00122\n-00123\n-double R;\n-double R2;\n-00124\n-00125\n-double inv_R_EPS_COCIRC;\n-00126\n-double inv_R_2EPS_COCIRC;\n-00127\n-// particle list information\n-00128\n-00129\n-int n_part;\n-00130\n-std::vector plist;\n-00131\n-std::vector pincluded;\n-00132\n-Cvicinity_elm *ve_list;\n-00133 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n-00134\n-Cquadtree *quadtree;\n-00135 #endif\n-00136\n-00137\n-// vicinity information\n-00138\n-std::vector vicinity;\n-unsigned int vicinity_size;\n-00139\n-00140\n-00141 protected:\n-00147\n-void append_to_vicinity(Cmomentum *v);\n-00148\n-// internal variables\n-00149\n-00150\n-double pcx;\n-double pcy;\n-00151\n-00152 };\n-00153\n-00154 }\n-00155\n-00156 #endif\n-\n Generated by Doxygen\n \n \fIndex\n _norm\n siscone::Cjet_area, 28\n siscone_spherical::CSph3vector, 67\n add\n@@ -29006,22 +29004,22 @@\n siscone::Ceta_phi_range, 18\n eta_min\n siscone::Ceta_phi_range, 18\n eta_range\n siscone::Ceta_phi_range, 18\n ev_name\n Coptions, 40\n-examples/area.cpp, 175\n-examples/main.cpp, 180\n-examples/options.cpp, 182\n-examples/options.h, 185\n-examples/sample.cpp, 186\n-examples/spherical.cpp, 187\n-examples/test.cpp, 188\n-examples/times.cpp, 190\n+examples/area.cpp, 185\n+examples/main.cpp, 175\n+examples/options.cpp, 176\n+examples/options.h, 179\n+examples/sample.cpp, 180\n+examples/spherical.cpp, 181\n+examples/test.cpp, 182\n+examples/times.cpp, 184\n \n 311\n \n siscone::hash_cones, 164\n siscone_spherical::sph_hash_cones, 172\n hash_cones\n siscone::hash_cones, 162\n@@ -29358,23 +29356,23 @@\n siscone_spherical::sph_hash_cones, 172\n randomize\n siscone::Creference, 52\n range\n siscone::Cjet, 25\n siscone_spherical::CSphjet, 74\n ranlux.h\n-ranlux_get, 249\n-ranlux_init, 249\n-ranlux_print_state, 250\n+ranlux_get, 240\n+ranlux_init, 240\n+ranlux_print_state, 240\n ranlux_get\n-ranlux.h, 249\n+ranlux.h, 240\n ranlux_init\n-ranlux.h, 249\n+ranlux.h, 240\n ranlux_print_state\n-ranlux.h, 250\n+ranlux.h, 240\n recompute_jets\n siscone::Csiscone, 57\n siscone_spherical::CSphsiscone, 86\n ref\n siscone::Cmomentum, 37\n siscone::Creference, 52\n siscone::hash_element, 167\n@@ -29408,56 +29406,56 @@\n siscone_spherical::CSphsplit_merge, 95\n side\n siscone::Cvicinity_elm, 158\n siscone_spherical::CSphvicinity_elm, 122\n \n INDEX\n \n-siscone/area.cpp, 176\n+siscone/area.cpp, 187\n siscone/area.h, 191\n siscone/circulator.h, 192\n siscone/config.h, 193\n siscone/config_raw.h, 194\n siscone/defines.h, 196, 198\n-siscone/geom_2d.cpp, 199\n-siscone/geom_2d.h, 264\n-siscone/hash.cpp, 203\n-siscone/hash.h, 208\n-siscone/momentum.cpp, 210\n-siscone/momentum.h, 215\n-siscone/protocones.cpp, 219\n-siscone/protocones.h, 238\n-siscone/quadtree.cpp, 242\n-siscone/quadtree.h, 246\n-siscone/ranlux.cpp, 247\n-siscone/ranlux.h, 249, 250\n-siscone/reference.cpp, 251\n-siscone/reference.h, 252\n-siscone/siscone.cpp, 253\n-siscone/siscone.h, 260\n-siscone/siscone_error.cpp, 262\n-siscone/siscone_error.h, 263\n-siscone/spherical/geom_2d.cpp, 201\n-siscone/spherical/geom_2d.h, 265\n-siscone/spherical/hash.cpp, 206\n-siscone/spherical/hash.h, 209\n-siscone/spherical/momentum.cpp, 212\n-siscone/spherical/momentum.h, 217\n-siscone/spherical/protocones.cpp, 229\n-siscone/spherical/protocones.h, 240\n-siscone/spherical/siscone.cpp, 257\n-siscone/spherical/siscone.h, 261\n+siscone/geom_2d.cpp, 254\n+siscone/geom_2d.h, 199\n+siscone/hash.cpp, 201\n+siscone/hash.h, 207\n+siscone/momentum.cpp, 208\n+siscone/momentum.h, 258\n+siscone/protocones.cpp, 214\n+siscone/protocones.h, 262\n+siscone/quadtree.cpp, 233\n+siscone/quadtree.h, 237\n+siscone/ranlux.cpp, 238\n+siscone/ranlux.h, 240, 241\n+siscone/reference.cpp, 241\n+siscone/reference.h, 243\n+siscone/siscone.cpp, 244\n+siscone/siscone.h, 251\n+siscone/siscone_error.cpp, 253\n+siscone/siscone_error.h, 253\n+siscone/spherical/geom_2d.cpp, 256\n+siscone/spherical/geom_2d.h, 200\n+siscone/spherical/hash.cpp, 204\n+siscone/spherical/hash.h, 207\n+siscone/spherical/momentum.cpp, 210\n+siscone/spherical/momentum.h, 260\n+siscone/spherical/protocones.cpp, 223\n+siscone/spherical/protocones.h, 264\n+siscone/spherical/siscone.cpp, 247\n+siscone/spherical/siscone.h, 252\n siscone/spherical/split_merge.cpp, 266\n-siscone/spherical/split_merge.h, 293\n-siscone/spherical/vicinity.cpp, 299\n-siscone/spherical/vicinity.h, 306\n+siscone/spherical/split_merge.h, 296\n+siscone/spherical/vicinity.cpp, 301\n+siscone/spherical/vicinity.h, 293\n siscone/split_merge.cpp, 280\n-siscone/split_merge.h, 296\n-siscone/vicinity.cpp, 302\n-siscone/vicinity.h, 307\n+siscone/split_merge.h, 299\n+siscone/vicinity.cpp, 305\n+siscone/vicinity.h, 294\n siscone::Carea, 7\n \u223cCarea, 9\n Carea, 9\n compute_active_areas, 9\n compute_areas, 10\n compute_passive_areas, 11\n grid_eta_max, 11\n"}]}]}]}]}]}]}