{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.BRU2Klhr/b1/siscone_3.0.5-2_amd64.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.BRU2Klhr/b2/siscone_3.0.5-2_amd64.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -1,10 +1,10 @@\n \n 054f774245cc451f5ce146001b093f82 84996 libdevel optional libsiscone-dev_3.0.5-2_amd64.deb\n a002cd47981a9bc5a7fb06d542fa8e33 76864 libdevel optional libsiscone-spherical-dev_3.0.5-2_amd64.deb\n 32e9efebdff21584e6e75e809580188b 428928 debug optional libsiscone-spherical0v5-dbgsym_3.0.5-2_amd64.deb\n 17702298da7c943313b7d54aa1a0a4fd 61848 libs optional libsiscone-spherical0v5_3.0.5-2_amd64.deb\n 8cb201de6927af5d84457028d9539325 501452 debug optional libsiscone0v5-dbgsym_3.0.5-2_amd64.deb\n dab0f8b9c999c3f684f23311db059d55 67668 libs optional libsiscone0v5_3.0.5-2_amd64.deb\n- e62d9c3520741f199310f5c3f1aabe5d 1187940 doc optional siscone-doc-html_3.0.5-2_all.deb\n- 93d30f0ac8e052be2f1b652cdf5ba6e1 1587556 doc optional siscone-doc-pdf_3.0.5-2_all.deb\n+ 39f8f191170258ed0159848e82430cff 1187488 doc optional siscone-doc-html_3.0.5-2_all.deb\n+ 0d21f54f642c8d5741a895749a9e4544 1589424 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-html_3.0.5-2_all.deb", "source2": "siscone-doc-html_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 8560 2023-01-10 17:32:40.000000 control.tar.xz\n--rw-r--r-- 0 0 0 1179188 2023-01-10 17:32:40.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 8564 2023-01-10 17:32:40.000000 control.tar.xz\n+-rw-r--r-- 0 0 0 1178732 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-html\n Source: siscone\n Version: 3.0.5-2\n Architecture: all\n Maintainer: Debian Science Maintainers \n-Installed-Size: 5829\n+Installed-Size: 5826\n Depends: libjs-jquery\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 (HTML)\n SISCone implements a Seedless Infrared (IR) Safe Cone jet algorithm, it takes\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": "@@ -87,19 +87,19 @@\n -rw-r--r-- 0 root (0) root (0) 3326 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1Cvicinity__inclusion-members.html\n -rw-r--r-- 0 root (0) root (0) 8070 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1Cvicinity__inclusion.html\n -rw-r--r-- 0 root (0) root (0) 1000 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1Cvicinity__inherit__graph.map\n -rw-r--r-- 0 root (0) root (0) 8437 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1Cvicinity__inherit__graph.png\n -rw-r--r-- 0 root (0) root (0) 5402 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1circulator-members.html\n -rw-r--r-- 0 root (0) root (0) 26944 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1circulator.html\n -rw-r--r-- 0 root (0) root (0) 4952 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__cones-members.html\n--rw-r--r-- 0 root (0) root (0) 25474 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__cones.html\n+-rw-r--r-- 0 root (0) root (0) 26288 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__cones.html\n -rw-r--r-- 0 root (0) root (0) 822 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__cones__coll__graph.map\n -rw-r--r-- 0 root (0) root (0) 8816 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__cones__coll__graph.png\n -rw-r--r-- 0 root (0) root (0) 3722 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__element-members.html\n--rw-r--r-- 0 root (0) root (0) 11158 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__element.html\n+-rw-r--r-- 0 root (0) root (0) 12188 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__element.html\n -rw-r--r-- 0 root (0) root (0) 573 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__element__coll__graph.map\n -rw-r--r-- 0 root (0) root (0) 5833 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__element__coll__graph.png\n -rw-r--r-- 0 root (0) root (0) 11138 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone__spherical_1_1CSph3vector-members.html\n -rw-r--r-- 0 root (0) root (0) 64271 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone__spherical_1_1CSph3vector.html\n -rw-r--r-- 0 root (0) root (0) 478 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone__spherical_1_1CSph3vector__coll__graph.map\n -rw-r--r-- 0 root (0) root (0) 5961 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone__spherical_1_1CSph3vector__coll__graph.png\n -rw-r--r-- 0 root (0) root (0) 506 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/classsiscone__spherical_1_1CSph3vector__inherit__graph.map\n@@ -211,22 +211,22 @@\n -rw-r--r-- 0 root (0) root (0) 6639 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/functions_s.html\n -rw-r--r-- 0 root (0) root (0) 3191 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/functions_t.html\n -rw-r--r-- 0 root (0) root (0) 2319 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/functions_u.html\n -rw-r--r-- 0 root (0) root (0) 4264 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/functions_v.html\n -rw-r--r-- 0 root (0) root (0) 30418 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/functions_vars.html\n -rw-r--r-- 0 root (0) root (0) 2155 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/functions_x.html\n -rw-r--r-- 0 root (0) root (0) 5352 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/functions_~.html\n--rw-r--r-- 0 root (0) root (0) 34267 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/geom__2d_8cpp_source.html\n+-rw-r--r-- 0 root (0) root (0) 31816 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/geom__2d_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 30773 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/geom__2d_8h_source.html\n -rw-r--r-- 0 root (0) root (0) 2552 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/globals.html\n -rw-r--r-- 0 root (0) root (0) 2434 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/globals_defs.html\n -rw-r--r-- 0 root (0) root (0) 2059 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/globals_vars.html\n -rw-r--r-- 0 root (0) root (0) 6197 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/graph_legend.html\n -rw-r--r-- 0 root (0) root (0) 23370 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/graph_legend.png\n--rw-r--r-- 0 root (0) root (0) 54600 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/hash_8cpp_source.html\n+-rw-r--r-- 0 root (0) root (0) 52933 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/hash_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 22548 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/hash_8h_source.html\n -rw-r--r-- 0 root (0) root (0) 16741 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/hierarchy.html\n -rw-r--r-- 0 root (0) root (0) 1950 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/index.html\n -rw-r--r-- 0 root (0) root (0) 213 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_0.map\n -rw-r--r-- 0 root (0) root (0) 1411 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_0.png\n -rw-r--r-- 0 root (0) root (0) 272 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_1.map\n -rw-r--r-- 0 root (0) root (0) 2185 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_1.png\n@@ -280,15 +280,15 @@\n -rw-r--r-- 0 root (0) root (0) 1670 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_7.png\n -rw-r--r-- 0 root (0) root (0) 255 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_8.map\n -rw-r--r-- 0 root (0) root (0) 1737 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_8.png\n -rw-r--r-- 0 root (0) root (0) 1317 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_9.map\n -rw-r--r-- 0 root (0) root (0) 10333 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherit_graph_9.png\n -rw-r--r-- 0 root (0) root (0) 14157 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/inherits.html\n -rw-r--r-- 0 root (0) root (0) 30265 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/main_8cpp_source.html\n--rw-r--r-- 0 root (0) root (0) 43383 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/momentum_8cpp_source.html\n+-rw-r--r-- 0 root (0) root (0) 41791 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/momentum_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 39163 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/momentum_8h_source.html\n -rw-r--r-- 0 root (0) root (0) 153 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/nav_f.png\n -rw-r--r-- 0 root (0) root (0) 169 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/nav_fd.png\n -rw-r--r-- 0 root (0) root (0) 95 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/nav_g.png\n -rw-r--r-- 0 root (0) root (0) 98 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/nav_h.png\n -rw-r--r-- 0 root (0) root (0) 114 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/nav_hd.png\n -rw-r--r-- 0 root (0) root (0) 123 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/open.png\n@@ -307,15 +307,15 @@\n -rw-r--r-- 0 root (0) root (0) 25627 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/reference_8h_source.html\n -rw-r--r-- 0 root (0) root (0) 20315 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/sample_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 82495 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/siscone_2area_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 69585 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/siscone_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 23914 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/siscone_8h_source.html\n -rw-r--r-- 0 root (0) root (0) 8011 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/siscone__error_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 15206 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/siscone__error_8h_source.html\n--rw-r--r-- 0 root (0) root (0) 38355 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2geom__2d_8cpp_source.html\n+-rw-r--r-- 0 root (0) root (0) 38933 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2geom__2d_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 22148 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2geom__2d_8h_source.html\n -rw-r--r-- 0 root (0) root (0) 47437 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2hash_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 22599 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2hash_8h_source.html\n -rw-r--r-- 0 root (0) root (0) 81644 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2momentum_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 70242 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2momentum_8h_source.html\n -rw-r--r-- 0 root (0) root (0) 165886 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2protocones_8cpp_source.html\n -rw-r--r-- 0 root (0) root (0) 43294 2023-01-10 17:32:40.000000 ./usr/share/doc/siscone-doc-html/html/devel/spherical_2protocones_8h_source.html\n"}, {"source1": "./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__cones.html", "source2": "./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__cones.html", "unified_diff": "@@ -196,15 +196,15 @@\n \n \n \n
Returns
0 on success, 1 on error
\n \n

Definition at line 171 of file hash.cpp.

\n \n-

References siscone::Cmomentum::eta, hash_array, mask, n_cones, siscone::Cmomentum::phi, siscone::Cmomentum::ref, and siscone::Creference::ref.

\n+

References siscone::hash_element::eta, siscone::Cmomentum::eta, hash_array, siscone::hash_element::is_stable, mask, n_cones, siscone::hash_element::next, siscone::hash_element::phi, siscone::Cmomentum::phi, siscone::hash_element::ref, siscone::Cmomentum::ref, and siscone::Creference::ref.

\n \n \n \n \n

◆ insert() [2/2]

\n \n
\n@@ -259,15 +259,15 @@\n \n \n \n
Returns
0 on success, 1 on error
\n \n

Definition at line 102 of file hash.cpp.

\n \n-

References siscone::Cmomentum::build_etaphi(), siscone::Cmomentum::eta, hash_array, is_inside(), mask, n_cones, siscone::Cmomentum::phi, siscone::Cmomentum::ref, and siscone::Creference::ref.

\n+

References siscone::Cmomentum::build_etaphi(), siscone::hash_element::eta, siscone::Cmomentum::eta, hash_array, is_inside(), siscone::hash_element::is_stable, mask, n_cones, siscone::hash_element::next, siscone::hash_element::phi, siscone::Cmomentum::phi, siscone::hash_element::ref, siscone::Cmomentum::ref, and siscone::Creference::ref.

\n \n
\n \n \n

◆ is_inside()

\n \n
\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -66,16 +66,18 @@\n insert a new candidate into the hash.\n Parameters\n v 4-momentum of te cone to add Note, in this case, we assume stability.\n We also assume that eta and phi are computed for v\n Returns\n 0 on success, 1 on error\n Definition at line _\b1_\b7_\b1 of file _\bh_\ba_\bs_\bh_\b._\bc_\bp_\bp.\n-References _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\be_\bt_\ba, _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by, _\bm_\ba_\bs_\bk, _\bn_\b__\bc_\bo_\bn_\be_\bs, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:\n-_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bp_\bh_\bi, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\br_\be_\bf, and _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b:_\b:_\br_\be_\bf.\n+References _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\be_\bt_\ba, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\be_\bt_\ba, _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by,\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bi_\bs_\b__\bs_\bt_\ba_\bb_\bl_\be, _\bm_\ba_\bs_\bk, _\bn_\b__\bc_\bo_\bn_\be_\bs, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bn_\be_\bx_\bt,\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bp_\bh_\bi, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bp_\bh_\bi, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:\n+_\br_\be_\bf, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\br_\be_\bf, and _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b:_\b:_\br_\be_\bf.\n *\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0i\bin\bns\bse\ber\brt\bt(\b()\b) [\b[2\b2/\b/2\b2]\b] *\b**\b**\b**\b**\b*\n _\bi_\bn_\bt siscone::hash_cones::insert ( _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *\u00a0 v\bv,\n _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *\u00a0 p\bpa\bar\bre\ben\bnt\bt,\n _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *\u00a0 c\bch\bhi\bil\bld\bd,\n _\bb_\bo_\bo_\bl\u00a0 p\bp_\b_i\bio\bo,\n _\bb_\bo_\bo_\bl\u00a0 c\bc_\b_i\bio\bo\u00a0\n )\n@@ -85,17 +87,19 @@\n parent parent particle defining the cone\n child child particle defining the cone\n p_io whether the parent has to belong to the cone or not\n c_io whether the child has to belong to the cone or not\n Returns\n 0 on success, 1 on error\n Definition at line _\b1_\b0_\b2 of file _\bh_\ba_\bs_\bh_\b._\bc_\bp_\bp.\n-References _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\b__\be_\bt_\ba_\bp_\bh_\bi_\b(_\b), _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\be_\bt_\ba,\n-_\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by, _\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be_\b(_\b), _\bm_\ba_\bs_\bk, _\bn_\b__\bc_\bo_\bn_\be_\bs, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bp_\bh_\bi, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:\n-_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\br_\be_\bf, and _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b:_\b:_\br_\be_\bf.\n+References _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\b__\be_\bt_\ba_\bp_\bh_\bi_\b(_\b), _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\be_\bt_\ba,\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\be_\bt_\ba, _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by, _\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be_\b(_\b), _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:\n+_\bi_\bs_\b__\bs_\bt_\ba_\bb_\bl_\be, _\bm_\ba_\bs_\bk, _\bn_\b__\bc_\bo_\bn_\be_\bs, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bn_\be_\bx_\bt, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:\n+_\bp_\bh_\bi, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bp_\bh_\bi, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\br_\be_\bf, _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:\n+_\br_\be_\bf, and _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b:_\b:_\br_\be_\bf.\n *\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0i\bis\bs_\b_i\bin\bns\bsi\bid\bde\be(\b()\b) *\b**\b**\b**\b**\b*\n _\bb_\bo_\bo_\bl siscone::hash_cones::is_inside ( _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *\u00a0 c\bce\ben\bnt\btr\bre\be,\n _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *\u00a0 v\bv\u00a0 inline\n )\n test if a particle is inside a cone of given centre.\n check if the particle of coordinates 'v' is inside the circle of radius R\n centered at 'centre'.\n"}]}, {"source1": "./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__element.html", "source2": "./usr/share/doc/siscone-doc-html/html/devel/classsiscone_1_1hash__element.html", "unified_diff": "@@ -102,14 +102,16 @@\n \n
\n \n

centre: eta coordinate

\n \n

Definition at line 48 of file hash.h.

\n \n+

Referenced by siscone::hash_cones::insert(), and siscone::hash_cones::insert().

\n+\n
\n \n \n

◆ is_stable

\n \n
\n
\n@@ -120,14 +122,16 @@\n \n
\n \n

true if stable w.r.t. \"border particles\"

\n \n

Definition at line 50 of file hash.h.

\n \n+

Referenced by siscone::hash_cones::insert(), and siscone::hash_cones::insert().

\n+\n
\n
\n \n

◆ next

\n \n
\n
\n@@ -138,15 +142,15 @@\n \n
\n \n

pointer to the next element

\n \n

Definition at line 52 of file hash.h.

\n \n-

Referenced by siscone::hash_cones::~hash_cones().

\n+

Referenced by siscone::hash_cones::insert(), siscone::hash_cones::insert(), and siscone::hash_cones::~hash_cones().

\n \n
\n
\n \n

◆ phi

\n \n
\n@@ -158,14 +162,16 @@\n \n
\n \n

centre: phi coordinate

\n \n

Definition at line 49 of file hash.h.

\n \n+

Referenced by siscone::hash_cones::insert(), and siscone::hash_cones::insert().

\n+\n
\n \n \n

◆ ref

\n \n
\n
\n@@ -176,14 +182,16 @@\n \n
\n \n

reference

\n \n

Definition at line 47 of file hash.h.

\n \n+

Referenced by siscone::hash_cones::insert(), and siscone::hash_cones::insert().

\n+\n
\n
\n
The documentation for this class was generated from the following file:\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -31,29 +31,34 @@\n stbility with the parent-child particles (border particles).\n Definition at line _\b4_\b5 of file _\bh_\ba_\bs_\bh_\b._\bh.\n *\b**\b**\b**\b**\b* M\bMe\bem\bmb\bbe\ber\br D\bDa\bat\bta\ba D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n *\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0e\bet\bta\ba *\b**\b**\b**\b**\b*\n _\bd_\bo_\bu_\bb_\bl_\be siscone::hash_element::eta\n centre: eta coordinate\n Definition at line _\b4_\b8 of file _\bh_\ba_\bs_\bh_\b._\bh.\n+Referenced by _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b), and _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b).\n *\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0i\bis\bs_\b_s\bst\bta\bab\bbl\ble\be *\b**\b**\b**\b**\b*\n _\bb_\bo_\bo_\bl siscone::hash_element::is_stable\n true if stable w.r.t. \"border particles\"\n Definition at line _\b5_\b0 of file _\bh_\ba_\bs_\bh_\b._\bh.\n+Referenced by _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b), and _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b).\n *\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0n\bne\bex\bxt\bt *\b**\b**\b**\b**\b*\n _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt* siscone::hash_element::next\n pointer to the next element\n Definition at line _\b5_\b2 of file _\bh_\ba_\bs_\bh_\b._\bh.\n-Referenced by _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\b~_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b(_\b).\n+Referenced by _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b), _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b), and\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\b~_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b(_\b).\n *\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0p\bph\bhi\bi *\b**\b**\b**\b**\b*\n _\bd_\bo_\bu_\bb_\bl_\be siscone::hash_element::phi\n centre: phi coordinate\n Definition at line _\b4_\b9 of file _\bh_\ba_\bs_\bh_\b._\bh.\n+Referenced by _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b), and _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b).\n *\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bre\bef\bf *\b**\b**\b**\b**\b*\n _\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be siscone::hash_element::ref\n reference\n Definition at line _\b4_\b7 of file _\bh_\ba_\bs_\bh_\b._\bh.\n+Referenced by _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b), and _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\b(_\b).\n ===============================================================================\n The documentation for this class was generated from the following file:\n * siscone/_\bh_\ba_\bs_\bh_\b._\bh\n ===============================================================================\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/siscone-doc-html/html/devel/geom__2d_8cpp_source.html", "source2": "./usr/share/doc/siscone-doc-html/html/devel/geom__2d_8cpp_source.html", "unified_diff": "@@ -111,55 +111,55 @@\n
57// ctor with initialisation
\n
58// we initialise with a centre (in eta,phi) and a radius
\n
59// - c_eta eta coordinate of the centre
\n
60// - c_phi phi coordinate of the centre
\n
61// - R radius
\n
62//-------------------------------------------------------
\n
\n-
63Ceta_phi_range::Ceta_phi_range(double c_eta, double c_phi, double R){
\n+
63Ceta_phi_range::Ceta_phi_range(double c_eta, double c_phi, double R){
\n
64 // determination of the eta range
\n
65 //-------------------------------
\n-
66 double xmin = max(c_eta-R,eta_min+0.0001);
\n-
67 double xmax = min(c_eta+R,eta_max-0.0001);
\n+
66 double xmin = max(c_eta-R,eta_min+0.0001);
\n+
67 double xmax = min(c_eta+R,eta_max-0.0001);
\n
68
\n-
69 unsigned int cell_min = get_eta_cell(xmin);
\n-
70 unsigned int cell_max = get_eta_cell(xmax);
\n+
69 unsigned int cell_min = get_eta_cell(xmin);
\n+
70 unsigned int cell_max = get_eta_cell(xmax);
\n
71
\n
72 // warning: if cell_max==2^31, 2*cell_max==0 hence,
\n
73 // even if the next formula is formally (2*cell_max-cell_min),
\n
74 // expressing it as (cell_max-cell_min)+cell_max is safe.
\n-\n+
75 eta_range = (cell_max-cell_min)+cell_max;
\n
76
\n
77 // determination of the phi range
\n
78 // !! taking care of periodicity !!
\n
79 //---------------------------------
\n-
80 xmin = phi_in_range(c_phi-R);
\n-
81 xmax = phi_in_range(c_phi+R);
\n+
80 xmin = phi_in_range(c_phi-R);
\n+
81 xmax = phi_in_range(c_phi+R);
\n
82
\n-
83 cell_min = get_phi_cell(xmin);
\n-
84 cell_max = get_phi_cell(xmax);
\n+
83 cell_min = get_phi_cell(xmin);
\n+
84 cell_max = get_phi_cell(xmax);
\n
85
\n
86 // Also, if the interval goes through pi, inversion is needed
\n-
87 if (xmax>xmin)
\n-\n+
87 if (xmax>xmin)
\n+
88 phi_range = (cell_max-cell_min)+cell_max;
\n
89 else {
\n-\n+
90 phi_range = (cell_min==cell_max)
\n
91 ? PHI_RANGE_MASK
\n-
92 : ((PHI_RANGE_MASK^(cell_min-cell_max)) + cell_max);
\n+
92 : ((PHI_RANGE_MASK^(cell_min-cell_max)) + cell_max);
\n
93 }
\n
94}
\n
\n
95
\n
96// assignment of range
\n
97// - r range to assign to current one
\n
98//---------------------------------------
\n
\n-\n-
100 eta_range = r.eta_range;
\n-
101 phi_range = r.phi_range;
\n+\n+\n+\n
102
\n
103 return *this;
\n
104}
\n
\n
105
\n
106// add a particle to the range
\n
107// - eta eta coordinate of the particle
\n@@ -180,30 +180,30 @@\n
120
\n
121
\n
122// test overlap
\n
123// - r1 first range
\n
124// - r2 second range
\n
125// return true if overlap, false otherwise.
\n
126//------------------------------------------
\n-
127bool is_range_overlap(const Ceta_phi_range &r1, const Ceta_phi_range &r2){
\n+
127bool is_range_overlap(const Ceta_phi_range &r1, const Ceta_phi_range &r2){
\n
128 // check overlap in eta AND phi
\n-
129 return ((r1.eta_range & r2.eta_range) && (r1.phi_range & r2.phi_range));
\n+
129 return ((r1.eta_range & r2.eta_range) && (r1.phi_range & r2.phi_range));
\n
130}
\n
131
\n
132// compute union
\n
133// Note: we assume that the two intervals overlap
\n
134// - r1 first range
\n
135// - r2 second range
\n
136// \\return union of the two ranges
\n
137//------------------------------------------
\n
138const Ceta_phi_range range_union (const Ceta_phi_range &r1, const Ceta_phi_range &r2){
\n
139 Ceta_phi_range tmp;
\n
140
\n
141 // compute union in eta
\n-
142 tmp.eta_range = r1.eta_range | r2.eta_range;
\n+
142 tmp.eta_range = r1.eta_range | r2.eta_range;
\n
143
\n
144 // compute union in phi
\n
145 tmp.phi_range = r1.phi_range | r2.phi_range;
\n
146
\n
147 return tmp;
\n
148}
\n
149
\n@@ -212,15 +212,14 @@\n
unsigned int eta_range
eta range as a binary coding of covered cells
Definition geom_2d.h:143
\n
static double eta_max
maximal value for eta
Definition geom_2d.h:150
\n
int add_particle(const double eta, const double phi)
add a particle to the range
Definition geom_2d.cpp:111
\n
static double eta_min
minimal value for eta
Definition geom_2d.h:149
\n
Ceta_phi_range & operator=(const Ceta_phi_range &r)
assignment of range
Definition geom_2d.cpp:99
\n
Ceta_phi_range()
default ctor
Definition geom_2d.cpp:52
\n
unsigned int phi_range
phi range as a binary coding of covered cells
Definition geom_2d.h:146
\n-
a circulator that is foreseen to take as template member either a pointer or an iterator;
Definition circulator.h:36
\n \n \n
\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -59,53 +59,53 @@\n 56\n 57// ctor with initialisation\n 58// we initialise with a centre (in eta,phi) and a radius\n 59// - c_eta eta coordinate of the centre\n 60// - c_phi phi coordinate of the centre\n 61// - R radius\n 62//-------------------------------------------------------\n-_\b6_\b3_\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be_\b:_\b:_\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be(double _\bc_\b__\be_\bt_\ba, double _\bc_\b__\bp_\bh_\bi, double R){\n+_\b6_\b3_\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be_\b:_\b:_\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be(double c_eta, double c_phi, double R){\n 64 // determination of the eta range\n 65 //-------------------------------\n-66 double _\bx_\bm_\bi_\bn = _\bm_\ba_\bx(_\bc_\b__\be_\bt_\ba-R,_\be_\bt_\ba_\b__\bm_\bi_\bn+0.0001);\n-67 double _\bx_\bm_\ba_\bx = _\bm_\bi_\bn(_\bc_\b__\be_\bt_\ba+R,_\be_\bt_\ba_\b__\bm_\ba_\bx-0.0001);\n+66 double xmin = max(c_eta-R,_\be_\bt_\ba_\b__\bm_\bi_\bn+0.0001);\n+67 double xmax = min(c_eta+R,_\be_\bt_\ba_\b__\bm_\ba_\bx-0.0001);\n 68\n-69 unsigned int _\bc_\be_\bl_\bl_\b__\bm_\bi_\bn = get_eta_cell(_\bx_\bm_\bi_\bn);\n-70 unsigned int _\bc_\be_\bl_\bl_\b__\bm_\ba_\bx = get_eta_cell(_\bx_\bm_\ba_\bx);\n+69 unsigned int cell_min = get_eta_cell(xmin);\n+70 unsigned int cell_max = get_eta_cell(xmax);\n 71\n 72 // warning: if cell_max==2^31, 2*cell_max==0 hence,\n 73 // even if the next formula is formally (2*cell_max-cell_min),\n 74 // expressing it as (cell_max-cell_min)+cell_max is safe.\n-75 _\be_\bt_\ba_\b__\br_\ba_\bn_\bg_\be = (_\bc_\be_\bl_\bl_\b__\bm_\ba_\bx-_\bc_\be_\bl_\bl_\b__\bm_\bi_\bn)+_\bc_\be_\bl_\bl_\b__\bm_\ba_\bx;\n+75 _\be_\bt_\ba_\b__\br_\ba_\bn_\bg_\be = (cell_max-cell_min)+cell_max;\n 76\n 77 // determination of the phi range\n 78 // !! taking care of periodicity !!\n 79 //---------------------------------\n-80 _\bx_\bm_\bi_\bn = phi_in_range(_\bc_\b__\bp_\bh_\bi-R);\n-81 _\bx_\bm_\ba_\bx = phi_in_range(_\bc_\b__\bp_\bh_\bi+R);\n+80 xmin = phi_in_range(c_phi-R);\n+81 xmax = phi_in_range(c_phi+R);\n 82\n-83 _\bc_\be_\bl_\bl_\b__\bm_\bi_\bn = get_phi_cell(_\bx_\bm_\bi_\bn);\n-84 _\bc_\be_\bl_\bl_\b__\bm_\ba_\bx = get_phi_cell(_\bx_\bm_\ba_\bx);\n+83 cell_min = get_phi_cell(xmin);\n+84 cell_max = get_phi_cell(xmax);\n 85\n 86 // Also, if the interval goes through pi, inversion is needed\n-87 if (_\bx_\bm_\ba_\bx>_\bx_\bm_\bi_\bn)\n-88 _\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be = (_\bc_\be_\bl_\bl_\b__\bm_\ba_\bx-_\bc_\be_\bl_\bl_\b__\bm_\bi_\bn)+_\bc_\be_\bl_\bl_\b__\bm_\ba_\bx;\n+87 if (xmax>xmin)\n+88 _\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be = (cell_max-cell_min)+cell_max;\n 89 else {\n-90 _\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be = (_\bc_\be_\bl_\bl_\b__\bm_\bi_\bn==_\bc_\be_\bl_\bl_\b__\bm_\ba_\bx)\n+90 _\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be = (cell_min==cell_max)\n 91 ? PHI_RANGE_MASK\n-92 : ((PHI_RANGE_MASK^(_\bc_\be_\bl_\bl_\b__\bm_\bi_\bn-_\bc_\be_\bl_\bl_\b__\bm_\ba_\bx)) + _\bc_\be_\bl_\bl_\b__\bm_\ba_\bx);\n+92 : ((PHI_RANGE_MASK^(cell_min-cell_max)) + cell_max);\n 93 }\n 94}\n 95\n 96// assignment of range\n 97// - r range to assign to current one\n 98//---------------------------------------\n-_\b9_\b9_\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be& _\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b=_\b (const _\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be &_\br){\n-100 _\be_\bt_\ba_\b__\br_\ba_\bn_\bg_\be = _\br.eta_range;\n-101 _\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be = _\br.phi_range;\n+_\b9_\b9_\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be& _\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b=_\b (const _\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be &r){\n+100 _\be_\bt_\ba_\b__\br_\ba_\bn_\bg_\be = r._\be_\bt_\ba_\b__\br_\ba_\bn_\bg_\be;\n+101 _\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be = r._\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be;\n 102\n 103 return *this;\n 104}\n 105\n 106// add a particle to the range\n 107// - eta eta coordinate of the particle\n 108// - phi phi coordinate of the particle\n@@ -123,31 +123,31 @@\n 120\n 121\n 122// test overlap\n 123// - r1 first range\n 124// - r2 second range\n 125// return true if overlap, false otherwise.\n 126//------------------------------------------\n-127bool is_range_overlap(const _\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be &_\br_\b1, const _\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be &_\br_\b2){\n+127bool is_range_overlap(const _\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be &r1, const _\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be &r2){\n 128 // check overlap in eta AND phi\n-129 return ((_\br_\b1.eta_range & _\br_\b2.eta_range) && (_\br_\b1.phi_range & _\br_\b2.phi_range));\n+129 return ((r1._\be_\bt_\ba_\b__\br_\ba_\bn_\bg_\be & r2._\be_\bt_\ba_\b__\br_\ba_\bn_\bg_\be) && (r1._\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be & r2._\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be));\n 130}\n 131\n 132// compute union\n 133// Note: we assume that the two intervals overlap\n 134// - r1 first range\n 135// - r2 second range\n 136// \\return union of the two ranges\n 137//------------------------------------------\n 138const Ceta_phi_range range_union (const Ceta_phi_range &r1, const\n Ceta_phi_range &r2){\n 139 Ceta_phi_range tmp;\n 140\n 141 // compute union in eta\n-142 tmp.eta_range = r1.eta_range | r2.eta_range;\n+142 tmp._\be_\bt_\ba_\b__\br_\ba_\bn_\bg_\be = r1.eta_range | r2.eta_range;\n 143\n 144 // compute union in phi\n 145 tmp.phi_range = r1.phi_range | r2.phi_range;\n 146\n 147 return tmp;\n 148}\n 149\n@@ -179,13 +179,9 @@\n Ceta_phi_range()\n default ctor\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bg_\be_\bo_\bm_\b__\b2_\bd_\b._\bc_\bp_\bp_\b:_\b5_\b2\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be_\b:_\b:_\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be\n unsigned int phi_range\n phi range as a binary coding of covered cells\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bg_\be_\bo_\bm_\b__\b2_\bd_\b._\bh_\b:_\b1_\b4_\b6\n-_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bc_\bi_\br_\bc_\bu_\bl_\ba_\bt_\bo_\br\n-a circulator that is foreseen to take as template member either a pointer or an\n-iterator;\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bc_\bi_\br_\bc_\bu_\bl_\ba_\bt_\bo_\br_\b._\bh_\b:_\b3_\b6\n ===============================================================================\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/siscone-doc-html/html/devel/hash_8cpp_source.html", "source2": "./usr/share/doc/siscone-doc-html/html/devel/hash_8cpp_source.html", "unified_diff": "@@ -93,55 +93,55 @@\n
41 **************************************************************/
\n
42
\n
43// constructor with initialisation
\n
44// - _Np number of particles
\n
45// - _R2 cone radius (squared)
\n
46//-----------------------------------
\n
\n-\n+
47hash_cones::hash_cones(int _Np, double _R2){
\n
48 int i;
\n
49
\n
50 n_cones = 0;
\n
51#ifdef DEBUG_STABLE_CONES
\n-\n+
52 n_occupied_cells = 0;
\n
53#endif
\n
54
\n
55 // determine hash size
\n
56 // for a ymax=5 and R=0.7, we observed an occupancy around 1/8 N^2 ~ N2 R2/4
\n
57 //mask = 1 << (int) (2*log(double(_Np))/log(2.0));
\n
58 //if (mask<=1) mask=2;
\n-
59 int nbits = (int) (log(_Np*_R2*_Np/4.0)/log(2.0));
\n-
60 if (nbits<1) nbits=1;
\n-
61 mask = 1 << nbits;
\n+
59 int nbits = (int) (log(_Np*_R2*_Np/4.0)/log(2.0));
\n+
60 if (nbits<1) nbits=1;
\n+
61 mask = 1 << nbits;
\n
62
\n
63 // create hash
\n \n
65 mask--;
\n
66
\n
67 // set the array to 0
\n
68 //? needed ?
\n
69 for (i=0;i<mask+1;i++)
\n-
70 hash_array[i] = NULL;
\n+
70 hash_array[i] = NULL;
\n
71
\n-
72 R2 = _R2;
\n+
72 R2 = _R2;
\n
73}
\n
\n
74
\n
75// destructor
\n
76//------------
\n
\n \n
78 int i;
\n-\n+
79 hash_element *elm;
\n
80
\n
81 for (i=0;i<mask+1;i++){
\n-
82 while (hash_array[i]!=NULL){
\n-
83 elm = hash_array[i];
\n+
82 while (hash_array[i]!=NULL){
\n+
83 elm = hash_array[i];
\n
84 hash_array[i] = hash_array[i]->next;
\n-
85 delete elm;
\n+
85 delete elm;
\n
86 }
\n
87 }
\n
88
\n
89 delete[] hash_array;
\n
90}
\n
\n
91
\n@@ -152,71 +152,71 @@\n
96 * - parent parent particle defining the cone
\n
97 * - child child particle defining the cone
\n
98 * - p_io whether the parent has to belong to the cone or not
\n
99 * - c_io whether the child has to belong to the cone or not
\n
100 * return 0 on success, 1 on error
\n
101 ***********************************************************************/
\n
\n-
102int hash_cones::insert(Cmomentum *v, Cmomentum *parent, Cmomentum *child, bool p_io, bool c_io){
\n-\n+
102int hash_cones::insert(Cmomentum *v, Cmomentum *parent, Cmomentum *child, bool p_io, bool c_io){
\n+
103 hash_element *elm;
\n
104 int index = (v->ref.ref[0]) & mask;
\n
105
\n
106 // check the array cell corresponding to our reference
\n-
107 elm = hash_array[index];
\n+
107 elm = hash_array[index];
\n
108
\n
109#ifdef DEBUG_STABLE_CONES
\n-
110 if (elm==NULL)
\n-\n+
110 if (elm==NULL)
\n+
111 n_occupied_cells++;
\n
112#endif
\n
113
\n
114 do{
\n
115 // if it is not present, add it
\n-
116 if (elm==NULL){
\n+
116 if (elm==NULL){
\n
117 // create element
\n-
118 elm = new hash_element;
\n+
118 elm = new hash_element;
\n
119
\n
120 // set its varibles
\n
121 // Note: at this level, eta and phi have already been computed
\n
122 // through Cmomentum::build_etaphi.
\n-
123 elm->ref = v->ref;
\n+
123 elm->ref = v->ref;
\n
124
\n
125 //compute vectors centre
\n
126 v->build_etaphi();
\n-
127 elm->eta = v->eta;
\n-
128 elm->phi = v->phi;
\n+
127 elm->eta = v->eta;
\n+
128 elm->phi = v->phi;
\n
129 // if at least one of the two is_inside tests gives a result != from the expected,
\n
130 // the || will be true hence !(...) false as wanted
\n-
131 elm->is_stable = !((is_inside(v, parent)^p_io)||(is_inside(v, child)^c_io));
\n+
131 elm->is_stable = !((is_inside(v, parent)^p_io)||(is_inside(v, child)^c_io));
\n
132 //cout << "-- new status of " << v->ref[0] << ":" << elm->is_stable << endl;
\n
133
\n
134 // update hash
\n-
135 elm->next = hash_array[index];
\n-
136 hash_array[index] = elm;
\n+
135 elm->next = hash_array[index];
\n+
136 hash_array[index] = elm;
\n
137
\n
138 n_cones++;
\n
139 return 0;
\n
140 }
\n
141
\n
142 // if the cone is already there, simply update stability status
\n-
143 if (v->ref == elm->ref){
\n+
143 if (v->ref == elm->ref){
\n
144 // there is only an update to perform to see if the cone is still stable
\n-
145 if (elm->is_stable){
\n+
145 if (elm->is_stable){
\n
146 v->build_etaphi();
\n-
147 elm->is_stable = !((is_inside(v, parent)^p_io)||(is_inside(v, child)^c_io));
\n+
147 elm->is_stable = !((is_inside(v, parent)^p_io)||(is_inside(v, child)^c_io));
\n
148 //cout << " parent/child: "
\n
149 // << parent->ref[0] << ":" << is_inside(v, parent) << ":" << p_io << " "
\n
150 // << child->ref[0] << ":" << is_inside(v, child) << ":" << c_io << endl;
\n
151 //cout << "-- rep status of " << v->ref[0] << ":" << elm->is_stable << endl;
\n
152 //cout << v->eta << " " << v->phi << endl;
\n
153 //cout << (child->eta) << " " << child->phi << endl;
\n
154 }
\n
155 return 0;
\n
156 }
\n
157
\n-
158 elm = elm->next;
\n+
158 elm = elm->next;
\n
159 } while (1);
\n
160
\n
161 return 1;
\n
162}
\n
\n
163
\n
164/*
\n@@ -224,48 +224,48 @@\n
166 * - v 4-momentum of te cone to add
\n
167 * Note, in this case, we assume stability. We also assume
\n
168 * that eta and phi are computed for v
\n
169 * return 0 on success, 1 on error
\n
170 ***********************************************************************/
\n
\n \n-\n+
172 hash_element *elm;
\n
173 int index = (v->ref.ref[0]) & mask;
\n
174 //cout << "-- stable candidate: " << v->ref[0] << ":" << endl;
\n
175
\n
176 // check the array cell corresponding to our reference
\n-
177 elm = hash_array[index];
\n+
177 elm = hash_array[index];
\n
178 do{
\n
179 // if it is not present, add it
\n-
180 if (elm==NULL){
\n+
180 if (elm==NULL){
\n
181 // create element
\n-
182 elm = new hash_element;
\n+
182 elm = new hash_element;
\n
183
\n
184 // set its varibles
\n
185 // Note: at this level, eta and phi have already been computed
\n
186 // through Cmomentum::build_etaphi.
\n-
187 elm->ref = v->ref;
\n-
188 elm->eta = v->eta;
\n-
189 elm->phi = v->phi;
\n-
190 elm->is_stable = true;
\n+
187 elm->ref = v->ref;
\n+
188 elm->eta = v->eta;
\n+
189 elm->phi = v->phi;
\n+
190 elm->is_stable = true;
\n
191
\n
192 // update hash
\n-
193 elm->next = hash_array[index];
\n-
194 hash_array[index] = elm;
\n+
193 elm->next = hash_array[index];
\n+
194 hash_array[index] = elm;
\n
195
\n
196 n_cones++;
\n
197 return 0;
\n
198 }
\n
199
\n
200 // if the cone is already there, we have nothing to do
\n-
201 if (v->ref == elm->ref){
\n+
201 if (v->ref == elm->ref){
\n
202 return 0;
\n
203 }
\n
204
\n-
205 elm = elm->next;
\n+
205 elm = elm->next;
\n
206 } while (1);
\n
207
\n
208 return 1;
\n
209}
\n
\n
210
\n
211/*
\n@@ -274,43 +274,46 @@\n
214 * centered at 'centre'.
\n
215 * - centre centre of the circle
\n
216 * - v particle to test
\n
217 * return true if inside, false if outside
\n
218 ******************************************************************************/
\n
\n \n-
220 double dx, dy;
\n+
220 double dx, dy;
\n
221
\n-
222 dx = centre->eta - v->eta;
\n-
223 dy = fabs(centre->phi - v->phi);
\n-
224 if (dy>M_PI)
\n-
225 dy -= 2.0*M_PI;
\n+
222 dx = centre->eta - v->eta;
\n+
223 dy = fabs(centre->phi - v->phi);
\n+
224 if (dy>M_PI)
\n+
225 dy -= 2.0*M_PI;
\n
226
\n-
227 return dx*dx+dy*dy<R2;
\n+
227 return dx*dx+dy*dy<R2;
\n
228}
\n
\n
229
\n
230}
\n
base class for dynamic coordinates management
Definition momentum.h:49
\n
Creference ref
reference number for the vector
Definition momentum.h:122
\n
double eta
particle pseudo-rapidity
Definition momentum.h:114
\n
void build_etaphi()
build eta-phi from 4-momentum info !!! WARNING !!! !!! computing eta and phi is time-consuming !...
Definition momentum.cpp:134
\n
double phi
particle azimuthal angle
Definition momentum.h:115
\n
unsigned int ref[3]
actual data for the reference
Definition reference.h:72
\n-
a circulator that is foreseen to take as template member either a pointer or an iterator;
Definition circulator.h:36
\n
int mask
number of occupied cells
Definition hash.h:104
\n
hash_element ** hash_array
the cone data itself
Definition hash.h:93
\n
int insert(Cmomentum *v, Cmomentum *parent, Cmomentum *child, bool p_io, bool c_io)
insert a new candidate into the hash.
Definition hash.cpp:102
\n
double R2
circle radius (squared) NOTE: need to be set before any call to 'insert'
Definition hash.h:108
\n
int n_cones
number of elements
Definition hash.h:96
\n
bool is_inside(Cmomentum *centre, Cmomentum *v)
test if a particle is inside a cone of given centre.
Definition hash.cpp:219
\n
hash_cones(int _Np, double _R2)
constructor with initialisation
Definition hash.cpp:47
\n
~hash_cones()
destructor
Definition hash.cpp:77
\n
information on store cones candidates.
Definition hash.h:45
\n
hash_element * next
pointer to the next element
Definition hash.h:52
\n+
bool is_stable
true if stable w.r.t. "border particles"
Definition hash.h:50
\n+
double eta
centre: eta coordinate
Definition hash.h:48
\n+
Creference ref
reference
Definition hash.h:47
\n+
double phi
centre: phi coordinate
Definition hash.h:49
\n \n \n
\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -43,53 +43,53 @@\n 40 * functions to manipulate them. *\n 41 **************************************************************/\n 42\n 43// constructor with initialisation\n 44// - _Np number of particles\n 45// - _R2 cone radius (squared)\n 46//-----------------------------------\n-_\b4_\b7_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs(int _\b__\bN_\bp, double _\b__\bR_\b2){\n+_\b4_\b7_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs(int _Np, double _R2){\n 48 int i;\n 49\n 50 _\bn_\b__\bc_\bo_\bn_\be_\bs = 0;\n 51#ifdef DEBUG_STABLE_CONES\n-52 _\bn_\b__\bo_\bc_\bc_\bu_\bp_\bi_\be_\bd_\b__\bc_\be_\bl_\bl_\bs = 0;\n+52 n_occupied_cells = 0;\n 53#endif\n 54\n 55 // determine hash size\n 56 // for a ymax=5 and R=0.7, we observed an occupancy around 1/8 N^2 ~ N2 R2/4\n 57 //mask = 1 << (int) (2*log(double(_Np))/log(2.0));\n 58 //if (mask<=1) mask=2;\n-59 int _\bn_\bb_\bi_\bt_\bs = (_\bi_\bn_\bt) (_\bl_\bo_\bg(_\b__\bN_\bp*_\b__\bR_\b2*_\b__\bN_\bp/4.0)/_\bl_\bo_\bg(2.0));\n-60 if (_\bn_\bb_\bi_\bt_\bs<1) _\bn_\bb_\bi_\bt_\bs=1;\n-61 _\bm_\ba_\bs_\bk = 1 << _\bn_\bb_\bi_\bt_\bs;\n+59 int nbits = (int) (log(_Np*_R2*_Np/4.0)/log(2.0));\n+60 if (nbits<1) nbits=1;\n+61 _\bm_\ba_\bs_\bk = 1 << nbits;\n 62\n 63 // create hash\n 64 _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by = new _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt*[_\bm_\ba_\bs_\bk];\n 65 _\bm_\ba_\bs_\bk--;\n 66\n 67 // set the array to 0\n 68 //? needed ?\n 69 for (i=0;i<_\bm_\ba_\bs_\bk+1;i++)\n-70 _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[i] = _\bN_\bU_\bL_\bL;\n+70 _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[i] = NULL;\n 71\n-72 _\bR_\b2 = _\b__\bR_\b2;\n+72 _\bR_\b2 = _R2;\n 73}\n 74\n 75// destructor\n 76//------------\n _\b7_\b7_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\b~_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs(){\n 78 int i;\n-79 _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt *_\be_\bl_\bm;\n+79 _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt *elm;\n 80\n 81 for (i=0;i<_\bm_\ba_\bs_\bk+1;i++){\n-82 while (_\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[i]!=_\bN_\bU_\bL_\bL){\n-83 _\be_\bl_\bm = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[i];\n+82 while (_\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[i]!=NULL){\n+83 elm = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[i];\n 84 _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[i] = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[i]->_\bn_\be_\bx_\bt;\n-85 delete _\be_\bl_\bm;\n+85 delete elm;\n 86 }\n 87 }\n 88\n 89 delete[] _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by;\n 90}\n 91\n 92\n@@ -99,123 +99,123 @@\n 96 * - parent parent particle defining the cone\n 97 * - child child particle defining the cone\n 98 * - p_io whether the parent has to belong to the cone or not\n 99 * - c_io whether the child has to belong to the cone or not\n 100 * return 0 on success, 1 on error\n 101 ***********************************************************************/\n _\b1_\b0_\b2int _\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *v, _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *parent, _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *child,\n-bool _\bp_\b__\bi_\bo, bool _\bc_\b__\bi_\bo){\n-103 _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt *_\be_\bl_\bm;\n+bool p_io, bool c_io){\n+103 _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt *elm;\n 104 int index = (v->_\br_\be_\bf._\br_\be_\bf[0]) & _\bm_\ba_\bs_\bk;\n 105\n 106 // check the array cell corresponding to our reference\n-107 _\be_\bl_\bm = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index];\n+107 elm = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index];\n 108\n 109#ifdef DEBUG_STABLE_CONES\n-110 if (_\be_\bl_\bm==_\bN_\bU_\bL_\bL)\n-111 _\bn_\b__\bo_\bc_\bc_\bu_\bp_\bi_\be_\bd_\b__\bc_\be_\bl_\bl_\bs++;\n+110 if (elm==NULL)\n+111 n_occupied_cells++;\n 112#endif\n 113\n 114 do{\n 115 // if it is not present, add it\n-116 if (_\be_\bl_\bm==_\bN_\bU_\bL_\bL){\n+116 if (elm==NULL){\n 117 // create element\n-118 _\be_\bl_\bm = new _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt;\n+118 elm = new _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt;\n 119\n 120 // set its varibles\n 121 // Note: at this level, eta and phi have already been computed\n 122 // through Cmomentum::build_etaphi.\n-123 _\be_\bl_\bm->ref = v->_\br_\be_\bf;\n+123 elm->_\br_\be_\bf = v->_\br_\be_\bf;\n 124\n 125 //compute vectors centre\n 126 v->_\bb_\bu_\bi_\bl_\bd_\b__\be_\bt_\ba_\bp_\bh_\bi();\n-127 _\be_\bl_\bm->eta = v->_\be_\bt_\ba;\n-128 _\be_\bl_\bm->phi = v->_\bp_\bh_\bi;\n+127 elm->_\be_\bt_\ba = v->_\be_\bt_\ba;\n+128 elm->_\bp_\bh_\bi = v->_\bp_\bh_\bi;\n 129 // if at least one of the two is_inside tests gives a result != from the\n expected,\n 130 // the || will be true hence !(...) false as wanted\n-131 _\be_\bl_\bm->is_stable = !((_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(v, parent)^_\bp_\b__\bi_\bo)||(_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(v,\n-child)^_\bc_\b__\bi_\bo));\n+131 elm->_\bi_\bs_\b__\bs_\bt_\ba_\bb_\bl_\be = !((_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(v, parent)^p_io)||(_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(v,\n+child)^c_io));\n 132 //cout << \"-- new status of \" << v->ref[0] << \":\" << elm->is_stable <<\n endl;\n 133\n 134 // update hash\n-135 _\be_\bl_\bm->next = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index];\n-136 _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index] = _\be_\bl_\bm;\n+135 elm->_\bn_\be_\bx_\bt = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index];\n+136 _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index] = elm;\n 137\n 138 _\bn_\b__\bc_\bo_\bn_\be_\bs++;\n 139 return 0;\n 140 }\n 141\n 142 // if the cone is already there, simply update stability status\n-143 if (v->_\br_\be_\bf == _\be_\bl_\bm->ref){\n+143 if (v->_\br_\be_\bf == elm->_\br_\be_\bf){\n 144 // there is only an update to perform to see if the cone is still stable\n-145 if (_\be_\bl_\bm->is_stable){\n+145 if (elm->_\bi_\bs_\b__\bs_\bt_\ba_\bb_\bl_\be){\n 146 v->_\bb_\bu_\bi_\bl_\bd_\b__\be_\bt_\ba_\bp_\bh_\bi();\n-147 _\be_\bl_\bm->is_stable = !((_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(v, parent)^_\bp_\b__\bi_\bo)||(_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(v,\n-child)^_\bc_\b__\bi_\bo));\n+147 elm->_\bi_\bs_\b__\bs_\bt_\ba_\bb_\bl_\be = !((_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(v, parent)^p_io)||(_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(v,\n+child)^c_io));\n 148 //cout << \" parent/child: \"\n 149 // << parent->ref[0] << \":\" << is_inside(v, parent) << \":\" << p_io << \" \"\n 150 // << child->ref[0] << \":\" << is_inside(v, child) << \":\" << c_io << endl;\n 151 //cout << \"-- rep status of \" << v->ref[0] << \":\" << elm->is_stable <<\n endl;\n 152 //cout << v->eta << \" \" << v->phi << endl;\n 153 //cout << (child->eta) << \" \" << child->phi << endl;\n 154 }\n 155 return 0;\n 156 }\n 157\n-158 _\be_\bl_\bm = _\be_\bl_\bm->next;\n+158 elm = elm->_\bn_\be_\bx_\bt;\n 159 } while (1);\n 160\n 161 return 1;\n 162}\n 163\n 164/*\n 165 * insert a new candidate into the hash.\n 166 * - v 4-momentum of te cone to add\n 167 * Note, in this case, we assume stability. We also assume\n 168 * that eta and phi are computed for v\n 169 * return 0 on success, 1 on error\n 170 ***********************************************************************/\n _\b1_\b7_\b1int _\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *v){\n-172 _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt *_\be_\bl_\bm;\n+172 _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt *elm;\n 173 int index = (v->_\br_\be_\bf._\br_\be_\bf[0]) & _\bm_\ba_\bs_\bk;\n 174 //cout << \"-- stable candidate: \" << v->ref[0] << \":\" << endl;\n 175\n 176 // check the array cell corresponding to our reference\n-177 _\be_\bl_\bm = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index];\n+177 elm = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index];\n 178 do{\n 179 // if it is not present, add it\n-180 if (_\be_\bl_\bm==_\bN_\bU_\bL_\bL){\n+180 if (elm==NULL){\n 181 // create element\n-182 _\be_\bl_\bm = new _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt;\n+182 elm = new _\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt;\n 183\n 184 // set its varibles\n 185 // Note: at this level, eta and phi have already been computed\n 186 // through Cmomentum::build_etaphi.\n-187 _\be_\bl_\bm->ref = v->_\br_\be_\bf;\n-188 _\be_\bl_\bm->eta = v->_\be_\bt_\ba;\n-189 _\be_\bl_\bm->phi = v->_\bp_\bh_\bi;\n-190 _\be_\bl_\bm->is_stable = true;\n+187 elm->_\br_\be_\bf = v->_\br_\be_\bf;\n+188 elm->_\be_\bt_\ba = v->_\be_\bt_\ba;\n+189 elm->_\bp_\bh_\bi = v->_\bp_\bh_\bi;\n+190 elm->_\bi_\bs_\b__\bs_\bt_\ba_\bb_\bl_\be = true;\n 191\n 192 // update hash\n-193 _\be_\bl_\bm->next = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index];\n-194 _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index] = _\be_\bl_\bm;\n+193 elm->_\bn_\be_\bx_\bt = _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index];\n+194 _\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by[index] = elm;\n 195\n 196 _\bn_\b__\bc_\bo_\bn_\be_\bs++;\n 197 return 0;\n 198 }\n 199\n 200 // if the cone is already there, we have nothing to do\n-201 if (v->_\br_\be_\bf == _\be_\bl_\bm->ref){\n+201 if (v->_\br_\be_\bf == elm->_\br_\be_\bf){\n 202 return 0;\n 203 }\n 204\n-205 _\be_\bl_\bm = _\be_\bl_\bm->next;\n+205 elm = elm->_\bn_\be_\bx_\bt;\n 206 } while (1);\n 207\n 208 return 1;\n 209}\n 210\n 211/*\n 212 * test if a particle is inside a cone of given centre.\n@@ -223,22 +223,22 @@\n 214 * centered at 'centre'.\n 215 * - centre centre of the circle\n 216 * - v particle to test\n 217 * return true if inside, false if outside\n 218\n ******************************************************************************/\n _\b2_\b1_\b9inline bool _\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bi_\bs_\b__\bi_\bn_\bs_\bi_\bd_\be(_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *centre, _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm *v){\n-220 double _\bd_\bx, _\bd_\by;\n+220 double dx, dy;\n 221\n-222 _\bd_\bx = centre->_\be_\bt_\ba - v->_\be_\bt_\ba;\n-223 _\bd_\by = _\bf_\ba_\bb_\bs(centre->_\bp_\bh_\bi - v->_\bp_\bh_\bi);\n-224 if (_\bd_\by>M_PI)\n-225 _\bd_\by -= 2.0*M_PI;\n+222 dx = centre->_\be_\bt_\ba - v->_\be_\bt_\ba;\n+223 dy = fabs(centre->_\bp_\bh_\bi - v->_\bp_\bh_\bi);\n+224 if (dy>M_PI)\n+225 dy -= 2.0*M_PI;\n 226\n-227 return _\bd_\bx*_\bd_\bx+_\bd_\by*_\bd_\by<_\bR_\b2;\n+227 return dx*dx+dy*dy<_\bR_\b2;\n 228}\n 229\n 230}\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm\n base class for dynamic coordinates management\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b._\bh_\b:_\b4_\b9\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\br_\be_\bf\n@@ -258,18 +258,14 @@\n double phi\n particle azimuthal angle\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b._\bh_\b:_\b1_\b1_\b5\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b:_\b:_\br_\be_\bf\n unsigned int ref[3]\n actual data for the reference\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b._\bh_\b:_\b7_\b2\n-_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bc_\bi_\br_\bc_\bu_\bl_\ba_\bt_\bo_\br\n-a circulator that is foreseen to take as template member either a pointer or an\n-iterator;\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bc_\bi_\br_\bc_\bu_\bl_\ba_\bt_\bo_\br_\b._\bh_\b:_\b3_\b6\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bm_\ba_\bs_\bk\n int mask\n number of occupied cells\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bh_\ba_\bs_\bh_\b._\bh_\b:_\b1_\b0_\b4\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bn_\be_\bs_\b:_\b:_\bh_\ba_\bs_\bh_\b__\ba_\br_\br_\ba_\by\n hash_element ** hash_array\n the cone data itself\n@@ -302,9 +298,25 @@\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt\n information on store cones candidates.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bh_\ba_\bs_\bh_\b._\bh_\b:_\b4_\b5\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bn_\be_\bx_\bt\n hash_element * next\n pointer to the next element\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bh_\ba_\bs_\bh_\b._\bh_\b:_\b5_\b2\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bi_\bs_\b__\bs_\bt_\ba_\bb_\bl_\be\n+bool is_stable\n+true if stable w.r.t. \"border particles\"\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bh_\ba_\bs_\bh_\b._\bh_\b:_\b5_\b0\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\be_\bt_\ba\n+double eta\n+centre: eta coordinate\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bh_\ba_\bs_\bh_\b._\bh_\b:_\b4_\b8\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\br_\be_\bf\n+Creference ref\n+reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bh_\ba_\bs_\bh_\b._\bh_\b:_\b4_\b7\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bp_\bh_\bi\n+double phi\n+centre: phi coordinate\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bh_\ba_\bs_\bh_\b._\bh_\b:_\b4_\b9\n ===============================================================================\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/siscone-doc-html/html/devel/momentum_8cpp_source.html", "source2": "./usr/share/doc/siscone-doc-html/html/devel/momentum_8cpp_source.html", "unified_diff": "@@ -100,34 +100,34 @@\n
47 index = -1;
\n
48}
\n \n
49
\n
50// ctor with initialisation
\n
51//--------------------------
\n
\n-
52Cmomentum::Cmomentum(double _px, double _py, double _pz, double _E){
\n-
53 px = _px;
\n-
54 py = _py;
\n-
55 pz = _pz;
\n-
56 E = _E;
\n+
52Cmomentum::Cmomentum(double _px, double _py, double _pz, double _E){
\n+
53 px = _px;
\n+
54 py = _py;
\n+
55 pz = _pz;
\n+
56 E = _E;
\n
57
\n
58 // compute eta and phi
\n \n
60 ref = Creference();
\n
61}
\n
\n
62
\n
63// ctor with detailed initialisation
\n
64//-----------------------------------
\n
\n-\n-
66 eta = _eta;
\n+
65Cmomentum::Cmomentum(double _eta, double _phi, Creference _ref){
\n+
66 eta = _eta;
\n
67 phi = _phi;
\n
68
\n-
69 ref = _ref;
\n+
69 ref = _ref;
\n
70}
\n
\n
71
\n
72// default dtor
\n
73//--------------
\n
\n \n@@ -153,16 +153,16 @@\n
\n
92
\n
93// addition of vectors
\n
94// !!! WARNING !!! no updating of eta and phi !!!
\n
95//------------------------------------------------
\n
\n \n-
97 Cmomentum tmp = *this;
\n-
98 return tmp+=v;
\n+
97 Cmomentum tmp = *this;
\n+
98 return tmp+=v;
\n
99}
\n
\n
100
\n
101// incrementation of vectors
\n
102// !!! WARNING !!! no updating of eta and phi !!!
\n
103//------------------------------------------------
\n
\n@@ -198,25 +198,25 @@\n
130// !!! computing eta and phi is time-consuming !!!
\n
131// !!! use this whenever you need eta or phi !!!
\n
132// !!! automatically called for single-particle !!!
\n
133//--------------------------------------------------
\n
\n \n
135 // note: the factor n (ref.nb) cancels in all expressions !!
\n-
136 eta = 0.5*log((E+pz)/(E-pz));
\n-
137 phi = atan2(py,px);
\n+
136 eta = 0.5*log((E+pz)/(E-pz));
\n+
137 phi = atan2(py,px);
\n
138}
\n
\n
139
\n
140
\n
141// ordering of two vectors
\n
142// the default ordering is w.r.t. their references
\n
143//-------------------------------------------------
\n-
144bool operator < (const Cmomentum &v1, const Cmomentum &v2){
\n-
145 return v1.ref < v2.ref;
\n+
144bool operator < (const Cmomentum &v1, const Cmomentum &v2){
\n+
145 return v1.ref < v2.ref;
\n
146}
\n
147
\n
148// ordering of vectors in eta (e.g. used in collinear tests)
\n
149//-----------------------------------------------------------
\n
150bool momentum_eta_less(const Cmomentum &v1, const Cmomentum &v2){
\n
151 return v1.eta < v2.eta;
\n
152}
\n@@ -242,15 +242,14 @@\n
double px
x-momentum
Definition momentum.h:109
\n
Cmomentum & operator=(const Cmomentum &v)
assignment of vectors
Definition momentum.cpp:80
\n
double E
energy
Definition momentum.h:112
\n
double pz
z-momentum
Definition momentum.h:111
\n
Cmomentum()
default ctor
Definition momentum.cpp:42
\n
double phi
particle azimuthal angle
Definition momentum.h:115
\n
references used for checksums.
Definition reference.h:43
\n-
a circulator that is foreseen to take as template member either a pointer or an iterator;
Definition circulator.h:36
\n
\n \n
\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -48,32 +48,32 @@\n 45 _\bp_\bx = _\bp_\by = _\bp_\bz = _\bE = 0.0;\n 46 _\br_\be_\bf = _\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be();\n 47 _\bi_\bn_\bd_\be_\bx = -1;\n 48}\n 49\n 50// ctor with initialisation\n 51//--------------------------\n-_\b5_\b2_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm(double _\b__\bp_\bx, double _\b__\bp_\by, double _\b__\bp_\bz, double _\b__\bE){\n-53 _\bp_\bx = _\b__\bp_\bx;\n-54 _\bp_\by = _\b__\bp_\by;\n-55 _\bp_\bz = _\b__\bp_\bz;\n-56 _\bE = _\b__\bE;\n+_\b5_\b2_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm(double _px, double _py, double _pz, double _E){\n+53 _\bp_\bx = _px;\n+54 _\bp_\by = _py;\n+55 _\bp_\bz = _pz;\n+56 _\bE = _E;\n 57\n 58 // compute eta and phi\n 59 _\bb_\bu_\bi_\bl_\bd_\b__\be_\bt_\ba_\bp_\bh_\bi();\n 60 _\br_\be_\bf = _\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be();\n 61}\n 62\n 63// ctor with detailed initialisation\n 64//-----------------------------------\n-_\b6_\b5_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm(double _\b__\be_\bt_\ba, double _phi, _\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\b__\br_\be_\bf){\n-66 _\be_\bt_\ba = _\b__\be_\bt_\ba;\n+_\b6_\b5_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm(double _eta, double _phi, _\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _ref){\n+66 _\be_\bt_\ba = _eta;\n 67 _\bp_\bh_\bi = _phi;\n 68\n-69 _\br_\be_\bf = _\b__\br_\be_\bf;\n+69 _\br_\be_\bf = _ref;\n 70}\n 71\n 72// default dtor\n 73//--------------\n _\b7_\b4_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\b~_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm(){\n 75\n 76}\n@@ -93,16 +93,16 @@\n 90 return *this;\n 91}\n 92\n 93// addition of vectors\n 94// !!! WARNING !!! no updating of eta and phi !!!\n 95//------------------------------------------------\n _\b9_\b6const _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b+_\b (const _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm &v){\n-97 _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm _\bt_\bm_\bp = *this;\n-98 return _\bt_\bm_\bp+=v;\n+97 _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm tmp = *this;\n+98 return tmp+=v;\n 99}\n 100\n 101// incrementation of vectors\n 102// !!! WARNING !!! no updating of eta and phi !!!\n 103//------------------------------------------------\n _\b1_\b0_\b4_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm& _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b+_\b=_\b (const _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm &v){\n 105 _\bp_\bx+=v._\bp_\bx;\n@@ -132,24 +132,24 @@\n 129// !!! WARNING !!!\n 130// !!! computing eta and phi is time-consuming !!!\n 131// !!! use this whenever you need eta or phi !!!\n 132// !!! automatically called for single-particle !!!\n 133//--------------------------------------------------\n _\b1_\b3_\b4void _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\b__\be_\bt_\ba_\bp_\bh_\bi(){\n 135 // note: the factor n (ref.nb) cancels in all expressions !!\n-136 _\be_\bt_\ba = 0.5*_\bl_\bo_\bg((_\bE+_\bp_\bz)/(_\bE-_\bp_\bz));\n-137 _\bp_\bh_\bi = _\ba_\bt_\ba_\bn_\b2(_\bp_\by,_\bp_\bx);\n+136 _\be_\bt_\ba = 0.5*log((_\bE+_\bp_\bz)/(_\bE-_\bp_\bz));\n+137 _\bp_\bh_\bi = atan2(_\bp_\by,_\bp_\bx);\n 138}\n 139\n 140\n 141// ordering of two vectors\n 142// the default ordering is w.r.t. their references\n 143//-------------------------------------------------\n-144bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b<_\b (const _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm &_\bv_\b1, const _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm &_\bv_\b2){\n-145 return _\bv_\b1.ref < _\bv_\b2.ref;\n+144bool operator < (const _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm &v1, const _\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm &v2){\n+145 return v1._\br_\be_\bf < v2._\br_\be_\bf;\n 146}\n 147\n 148// ordering of vectors in eta (e.g. used in collinear tests)\n 149//-----------------------------------------------------------\n 150bool momentum_eta_less(const Cmomentum &v1, const Cmomentum &v2){\n 151 return v1.eta < v2.eta;\n 152}\n@@ -225,13 +225,9 @@\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b:_\b:_\bp_\bh_\bi\n double phi\n particle azimuthal angle\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bm_\bo_\bm_\be_\bn_\bt_\bu_\bm_\b._\bh_\b:_\b1_\b1_\b5\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n references used for checksums.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b._\bh_\b:_\b4_\b3\n-_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bc_\bi_\br_\bc_\bu_\bl_\ba_\bt_\bo_\br\n-a circulator that is foreseen to take as template member either a pointer or an\n-iterator;\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bc_\bi_\br_\bc_\bu_\bl_\ba_\bt_\bo_\br_\b._\bh_\b:_\b3_\b6\n ===============================================================================\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/siscone-doc-html/html/devel/spherical_2geom__2d_8cpp_source.html", "source2": "./usr/share/doc/siscone-doc-html/html/devel/spherical_2geom__2d_8cpp_source.html", "unified_diff": "@@ -226,20 +226,21 @@\n
166const CSphtheta_phi_range range_union (const CSphtheta_phi_range &r1, const CSphtheta_phi_range &r2){
\n
167 CSphtheta_phi_range tmp;
\n
168
\n
169 // compute union in eta
\n
170 tmp.theta_range = r1.theta_range | r2.theta_range;
\n
171
\n
172 // compute union in phi
\n-
173 tmp.phi_range = r1.phi_range | r2.phi_range;
\n+
173 tmp.phi_range = r1.phi_range | r2.phi_range;
\n
174
\n
175 return tmp;
\n
176}
\n
177
\n
178}
\n+
unsigned int phi_range
phi range as a binary coding of covered cells
Definition geom_2d.h:146
\n
class for holding a covering range in eta-phi
Definition geom_2d.h:52
\n
int add_particle(const double theta, const double phi)
add a particle to the range
Definition geom_2d.cpp:130
\n
CSphtheta_phi_range & operator=(const CSphtheta_phi_range &r)
assignment of range
Definition geom_2d.cpp:118
\n
static double theta_max
maximal value for theta (set to pi)
Definition geom_2d.h:82
\n
unsigned int theta_range
theta range as a binary coding of covered cells
Definition geom_2d.h:75
\n
static double theta_min
extremal value for theta
Definition geom_2d.h:81
\n
CSphtheta_phi_range()
default ctor
Definition geom_2d.cpp:54
\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -175,20 +175,24 @@\n CSphtheta_phi_range &r2){\n 167 CSphtheta_phi_range tmp;\n 168\n 169 // compute union in eta\n 170 tmp.theta_range = r1.theta_range | r2.theta_range;\n 171\n 172 // compute union in phi\n-173 tmp.phi_range = r1.phi_range | r2.phi_range;\n+173 tmp._\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be = r1.phi_range | r2.phi_range;\n 174\n 175 return tmp;\n 176}\n 177\n 178}\n+_\bs_\bi_\bs_\bc_\bo_\bn_\be_\b:_\b:_\bC_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be_\b:_\b:_\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be\n+unsigned int phi_range\n+phi range as a binary coding of covered cells\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bg_\be_\bo_\bm_\b__\b2_\bd_\b._\bh_\b:_\b1_\b4_\b6\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b__\bs_\bp_\bh_\be_\br_\bi_\bc_\ba_\bl_\b:_\b:_\bC_\bS_\bp_\bh_\bt_\bh_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be\n class for holding a covering range in eta-phi\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bg_\be_\bo_\bm_\b__\b2_\bd_\b._\bh_\b:_\b5_\b2\n _\bs_\bi_\bs_\bc_\bo_\bn_\be_\b__\bs_\bp_\bh_\be_\br_\bi_\bc_\ba_\bl_\b:_\b:_\bC_\bS_\bp_\bh_\bt_\bh_\be_\bt_\ba_\b__\bp_\bh_\bi_\b__\br_\ba_\bn_\bg_\be_\b:_\b:_\ba_\bd_\bd_\b__\bp_\ba_\br_\bt_\bi_\bc_\bl_\be\n int add_particle(const double theta, const double phi)\n add a particle to the range\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn _\bg_\be_\bo_\bm_\b__\b2_\bd_\b._\bc_\bp_\bp_\b:_\b1_\b3_\b0\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 1586556 2023-01-10 17:32:40.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 1588424 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: 1566\n+Installed-Size: 1567\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) 1571985 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) 1573548 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": "@@ -1709,66 +1709,66 @@\n 5.14.1.4 PT_TSHOLD\n \n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197\n \n 5.14.2 Variable Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197\n 5.14.2.1 twopi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197\n 5.15 defines.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197\n-5.16 geom_2d.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198\n-5.17 geom_2d.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200\n-5.18 hash.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200\n-5.19 hash.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201\n-5.20 momentum.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202\n-5.21 momentum.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204\n-5.22 protocones.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206\n-5.23 protocones.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215\n-5.24 quadtree.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225\n-5.25 quadtree.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229\n-5.26 ranlux.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229\n-5.27 siscone/ranlux.h File Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232\n-5.27.1 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232\n-5.27.1.1 ranlux_get() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232\n-5.27.1.2 ranlux_init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232\n-5.27.1.3 ranlux_print_state() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232\n-5.28 ranlux.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233\n-5.29 reference.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233\n-5.30 reference.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235\n-5.31 siscone_error.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236\n-5.32 siscone_error.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236\n-5.33 geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237\n-5.34 geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239\n-5.35 hash.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241\n-5.36 hash.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243\n-5.37 momentum.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246\n-5.38 momentum.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248\n-5.39 protocones.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251\n-5.40 protocones.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253\n-5.41 siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255\n-5.42 siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259\n+5.16 geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198\n+5.17 geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200\n+5.18 geom_2d.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202\n+5.19 geom_2d.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203\n+5.20 hash.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204\n+5.21 hash.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207\n+5.22 hash.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210\n+5.23 hash.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210\n+5.24 momentum.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211\n+5.25 momentum.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213\n+5.26 momentum.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217\n+5.27 momentum.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218\n+5.28 protocones.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220\n+5.29 protocones.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230\n+5.30 protocones.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239\n+5.31 protocones.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241\n+5.32 quadtree.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243\n+5.33 quadtree.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247\n+5.34 ranlux.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248\n+5.35 siscone/ranlux.h File Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250\n+5.35.1 Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250\n+5.35.1.1 ranlux_get() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250\n+5.35.1.2 ranlux_init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250\n+5.35.1.3 ranlux_print_state() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251\n+5.36 ranlux.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251\n+5.37 reference.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251\n+5.38 reference.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253\n+5.39 siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254\n+5.40 siscone.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257\n+5.41 siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261\n+5.42 siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262\n \n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n \fxvi\n \n-5.43 siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262\n-5.44 siscone.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263\n+5.43 siscone_error.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263\n+5.44 siscone_error.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263\n 5.45 split_merge.cpp\n \n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264\n \n 5.46 split_merge.cpp\n \n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278\n \n-5.47 vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291\n-5.48 vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295\n-5.49 vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298\n-5.50 vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300\n-5.51 split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301\n-5.52 split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304\n+5.47 split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291\n+5.48 split_merge.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294\n+5.49 vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297\n+5.50 vicinity.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300\n+5.51 vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304\n+5.52 vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305\n Index\n \n 307\n \n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n \fChapter 1\n@@ -2040,35 +2040,35 @@\n 184\n 187\n 191\n 192\n 193\n 194\n 195\n-237\n 198\n-241\n-200\n-246\n 202\n-206\n+204\n+210\n+211\n+217\n+220\n+239\n+243\n+247\n+248\n+250\n 251\n-225\n-229\n-229\n-232\n-233\n-235\n-255\n-262\n-236\n-236\n+253\n+254\n+261\n+263\n+263\n 278\n-304\n-295\n+294\n+300\n \n \f6\n \n File Index\n \n siscone/vicinity.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n siscone/spherical/geom_2d.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n@@ -2082,29 +2082,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-300\n-239\n+305\n 200\n-243\n-201\n-248\n-204\n-215\n-253\n-259\n-263\n+203\n+207\n+210\n+213\n+218\n+230\n+241\n+257\n+262\n 264\n-301\n 291\n-298\n+297\n+304\n \n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n \fChapter 4\n \n Class Documentation\n \n@@ -10449,16 +10449,17 @@\n 4-momentum of te cone to add Note, in this case, we assume stability. We also assume that eta and phi are\n computed for v\n \n Returns\n 0 on success, 1 on error\n \n Definition at line 171 of file hash.cpp.\n-References siscone::Cmomentum::eta, hash_array, mask, n_cones, siscone::Cmomentum::phi, siscone::Cmomentum::ref,\n-and siscone::Creference::ref.\n+References siscone::hash_element::eta, siscone::Cmomentum::eta, hash_array, siscone::hash_element::is_stable,\n+mask, n_cones, siscone::hash_element::next, siscone::hash_element::phi, siscone::Cmomentum::phi, siscone::hash_element::ref,\n+siscone::Cmomentum::ref, and siscone::Creference::ref.\n \n 4.33.3.2 insert() [2/2]\n \n int siscone::hash_cones::insert (\n Cmomentum \u2217 v,\n Cmomentum \u2217 parent,\n Cmomentum \u2217 child,\n@@ -10484,23 +10485,25 @@\n c_io\n \n whether the child has to belong to the cone or not\n \n Returns\n 0 on success, 1 on error\n Definition at line 102 of file hash.cpp.\n-References siscone::Cmomentum::build_etaphi(), siscone::Cmomentum::eta, hash_array, is_inside(), mask,\n-n_cones, siscone::Cmomentum::phi, siscone::Cmomentum::ref, and siscone::Creference::ref.\n+References siscone::Cmomentum::build_etaphi(),\n+siscone::hash_element::eta,\n+siscone::Cmomentum::eta,\n+hash_array, is_inside(), siscone::hash_element::is_stable, mask, n_cones, siscone::hash_element::next,\n+siscone::hash_element::phi, siscone::Cmomentum::phi, siscone::hash_element::ref, siscone::Cmomentum::ref,\n+and siscone::Creference::ref.\n \n 4.33.3.3 is_inside()\n bool siscone::hash_cones::is_inside (\n Cmomentum \u2217 centre,\n-Cmomentum \u2217 v )\n-\n-[inline]\n+Cmomentum \u2217 v ) [inline]\n \n test if a particle is inside a cone of given centre.\n check if the particle of coordinates 'v' is inside the circle of radius R centered at 'centre'.\n \n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n \f4.33 siscone::hash_cones Class Reference\n@@ -10607,51 +10610,53 @@\n 4.34.2 Member Data Documentation\n 4.34.2.1 eta\n \n double siscone::hash_element::eta\n \n centre: eta coordinate\n Definition at line 48 of file hash.h.\n+Referenced by siscone::hash_cones::insert(), and siscone::hash_cones::insert().\n \n 4.34.2.2 is_stable\n \n bool siscone::hash_element::is_stable\n \n true if stable w.r.t. \"border particles\"\n Definition at line 50 of file hash.h.\n+Referenced by siscone::hash_cones::insert(), and siscone::hash_cones::insert().\n \n 4.34.2.3 next\n \n hash_element\u2217 siscone::hash_element::next\n \n pointer to the next element\n Definition at line 52 of file hash.h.\n-Referenced by siscone::hash_cones::\u223chash_cones().\n+Referenced by siscone::hash_cones::insert(), siscone::hash_cones::insert(), and siscone::hash_cones::\u223chash_cones().\n \n 4.34.2.4 phi\n \n double siscone::hash_element::phi\n \n centre: phi coordinate\n Definition at line 49 of file hash.h.\n-\n+Referenced by siscone::hash_cones::insert(), and siscone::hash_cones::insert().\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n \f168\n \n Class Documentation\n \n 4.34.2.5 ref\n \n Creference siscone::hash_element::ref\n \n reference\n Definition at line 47 of file hash.h.\n+Referenced by siscone::hash_cones::insert(), and siscone::hash_cones::insert().\n The documentation for this class was generated from the following file:\n-\n \u2022 siscone/hash.h\n \n 4.35 siscone::ranlux_state_t Struct Reference\n Public Attributes\n \u2022 unsigned int i\n \u2022 unsigned int j\n \u2022 unsigned int n\n@@ -14182,15 +14187,531 @@\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.h\n+5.16 geom_2d.cpp\n+00001\n+00002 // File: geom_2d.cpp\n+//\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+00024 // $Date:: 2007-06-19 16:26:05 +0200 (Tue, 19 Jun 2007)\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.16 geom_2d.cpp\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+// Also, if the interval goes through pi, inversion is needed\n+00086\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+// 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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+199\n+\n+\f200\n+\n+File Documentation\n+\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+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+// compute union in eta\n+00141\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.17 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 // 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+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+\n+//\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.17 geom_2d.cpp\n+\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+// determination of the eta range\n+00066\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+00072\n+unsigned int cell_max = get_theta_cell(xmax);\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+00084\n+double extra = asin(R/M_PI);\n+// if the theta range comes too close to the endpoints (theta=0 or\n+00085\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+while (ymin> M_PI) ymin-=twopi;\n+00097\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+00105\n+// Also, if the interval goes through pi, inversion is needed\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+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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+201\n+\n+\f202\n+\n+File Documentation\n+\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+// compute union in eta\n+00169\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+return tmp;\n+00175\n+00176 }\n+00177\n+00178 }\n+\n+5.18 geom_2d.h\n 00001 // -*- C++ -*00003 // File: geom_2d.h\n //\n 00004 // Description: header file for two-dimensional geometry tools\n //\n 00005 // This file is part of the SISCone project.\n //\n 00006 // For more details, see http://projects.hepforge.org/siscone\n@@ -14239,32 +14760,34 @@\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.16 geom_2d.h\n-\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-00044\n-00045\n else if (phi >\n M_PI) phi -= twopi;\n+00045\n return phi;\n 00046\n 00047 }\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.19 geom_2d.h\n+\n+203\n+\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@@ -14285,31 +14808,31 @@\n 00077\n 00081\n Ctwovect(double _x, double _y) : x(_x), y(_y) {}\n 00082\n double x, y;\n 00084\n 00085\n-inline double mod2() const {return pow2(x)+pow2(y);}\n 00087\n+inline double mod2() const {return pow2(x)+pow2(y);}\n 00088\n inline double modulus() const {return sqrt(mod2());}\n 00090\n 00091 };\n 00092\n 00093\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+return a.x*b.x + a.y*b.y;\n 00100 }\n 00101\n 00102\n 00107 inline double cross_product(const Ctwovect & a, const Ctwovect & b) {\n-return a.x*b.y - a.y*b.x;\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@@ -14319,73 +14842,73 @@\n 00131\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+unsigned int eta_range;\n 00144\n unsigned int phi_range;\n 00146\n 00147\n-00148\n // extremal value for eta\n+00148\n 00149\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+inline unsigned int get_eta_cell(double eta){\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+return (unsigned int) (1u \u00ab ((int) (32*phi/twopi+16)%32));\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-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-199\n-\n-\f200\n-\n-File Documentation\n-\n-5.17 geom_2d.h\n+5.19 geom_2d.h\n 00001 // -*- C++ -*00003 // File: geom_2d.h\n-//\n 00004 // Description: header file for two-dimensional geometry tools\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+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+//\n+//\n //\n+//\n+//\n+\n+\f204\n+\n+File Documentation\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@@ -14450,56 +14973,812 @@\n 00073\n unsigned int theta_range;\n 00075\n 00076\n unsigned int phi_range;\n 00078\n 00079\n-static double theta_min;\n 00081\n-00082\n+static double theta_min;\n static double theta_max;\n+00082\n 00083\n 00084 private:\n 00086\n inline unsigned int get_theta_cell(double theta){\n if (theta>=theta_max) return 1u\u00ab31;\n 00087\n 00088\n return (unsigned int) (1u \u00ab ((int) (32*((theta-theta_min)/(theta_max-theta_min)))));\n 00089\n }\n 00090\n-inline unsigned int get_phi_cell(double phi){\n 00092\n-00093\n+inline unsigned int get_phi_cell(double phi){\n return (unsigned int) (1u \u00ab ((int) (32*phi/twopi+16)%32));\n+00093\n 00094\n }\n 00095 };\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 \n-5.18 hash.h\n-00001 // -*- C++ -*00003 // File: hash.h\n+5.20 hash.cpp\n+00001\n+00002 // File: hash.cpp\n+00003 // Description: source file for classes hash_element and hash_cones\n+00004 // This file is part of the SISCone project.\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 \n //\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n \n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n-\f5.19 hash.h\n+\f5.20 hash.cpp\n \n-201\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:: 225\n+$//\n+00024 // $Date:: 2008-05-20 16:59:47 +0200 (Tue, 20 May 2008)\n+$//\n+00026\n+00027 #include \n+00028 #include \n+00029 #include \"hash.h\"\n+00030 #include \n+00031\n+00032 namespace siscone{\n+00033\n+00034 using namespace std;\n+00035\n+00036 /**************************************************************\n+00037 * implementation of hash_cones\n+*\n+00038 * list of cones candidates.\n+*\n+00039 * We store in this class all the hash_elements and give\n+*\n+00040 * functions to manipulate them.\n+*\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+00049\n+00050\n+n_cones = 0;\n+00051 #ifdef DEBUG_STABLE_CONES\n+00052\n+n_occupied_cells = 0;\n+00053 #endif\n+00054\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+int nbits = (int) (log(_Np*_R2*_Np/4.0)/log(2.0));\n+00060\n+if (nbits<1) nbits=1;\n+00061\n+mask = 1 \u00ab nbits;\n+00062\n+00063\n+// create hash\n+00064\n+hash_array = new hash_element*[mask];\n+00065\n+mask--;\n+00066\n+00067\n+// set the array to 0\n+00068\n+//? needed ?\n+00069\n+for (i=0;inext;\n+delete elm;\n+00085\n+00086\n+}\n+00087\n+}\n+00088\n+00089\n+delete[] hash_array;\n+00090 }\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+child particle defining the cone\n+00097 * - child\n+00098 * - p_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+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+205\n+\n+\f206\n+\n+File Documentation\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+00105\n+// check the array cell corresponding to our reference\n+00106\n+00107\n+elm = hash_array[index];\n+00108\n+00109 #ifdef DEBUG_STABLE_CONES\n+00110\n+if (elm==NULL)\n+00111\n+n_occupied_cells++;\n+00112 #endif\n+00113\n+00114\n+do{\n+00115\n+// if it is not present, add it\n+00116\n+if (elm==NULL){\n+00117\n+// create element\n+00118\n+elm = new hash_element;\n+00119\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+00124\n+//compute vectors centre\n+00125\n+00126\n+v->build_etaphi();\n+00127\n+elm->eta = v->eta;\n+00128\n+elm->phi = v->phi;\n+00129\n+// if at least one of the two is_inside tests gives a result != from the expected,\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+00135\n+elm->next = hash_array[index];\n+00136\n+hash_array[index] = elm;\n+00137\n+00138\n+n_cones++;\n+return 0;\n+00139\n+00140\n+}\n+00141\n+00142\n+// if the cone is already there, simply update stability status\n+00143\n+if (v->ref == elm->ref){\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+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+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+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+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+// if it is not present, add it\n+00179\n+00180\n+if (elm==NULL){\n+00181\n+// create element\n+00182\n+elm = new hash_element;\n+00183\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 on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.21 hash.cpp\n+\n+207\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+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+// 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+00203\n+}\n+00204\n+00205\n+elm = elm->next;\n+00206\n+} while (1);\n+00207\n+return 1;\n+00208\n+00209 }\n+00210\n+00211 /*\n+00212 * test if a particle is inside a cone of given centre.\n+00213 * check if the particle of coordinates \u2019v\u2019 is inside the circle of radius R\n+00214 * centered at \u2019centre\u2019.\n+00215 * - centre\n+centre of the circle\n+particle to test\n+00216 * - v\n+00217 * return true if inside, false if outside\n+00218 ******************************************************************************/\n+00219 inline bool hash_cones::is_inside(Cmomentum *centre, Cmomentum *v){\n+00220\n+double dx, dy;\n+00221\n+00222\n+dx = centre->eta - v->eta;\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+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+00035\n+00036 using namespace std;\n+00037\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+\n+\f208\n+\n+File Documentation\n+\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+00051\n+00052\n+n_cones = 0;\n+00053 #ifdef DEBUG_STABLE_CONES\n+00054\n+n_occupied_cells = 0;\n+00055 #endif\n+00056\n+00057\n+// determine hash size\n+00058\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+00063\n+mask = 1 \u00ab nbits;\n+00064\n+// create hash\n+00065\n+00066\n+hash_array = new sph_hash_element*[mask];\n+00067\n+mask--;\n+00068\n+// set the array to 0\n+00069\n+00070\n+//? needed ?\n+00071\n+for (i=0;inext;\n+00088\n+delete elm;\n+00089\n+}\n+00090\n+}\n+00091\n+delete[] hash_array;\n+00092\n+00093 }\n+00094\n+00095\n+00096 /*\n+00097 * insert a new candidate into the hash.\n+4-momentum of the cone to add\n+00098 * - v\n+00099 * - parent parent particle defining the cone\n+child particle defining the cone\n+00100 * - child\n+00101 * - p_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+00102 * - c_io\n+00103 * return 0 on success, 1 on error\n+00104 ***********************************************************************/\n+00105 int sph_hash_cones::insert(CSphmomentum *v, CSphmomentum *parent, CSphmomentum *child, bool p_io, bool\n+c_io){\n+00106\n+sph_hash_element *elm;\n+int index = (v->ref.ref[0]) & mask;\n+00107\n+00108\n+// check the array cell corresponding to our reference\n+00109\n+00110\n+elm = hash_array[index];\n+00111\n+00112 #ifdef DEBUG_STABLE_CONES\n+00113\n+if (elm==NULL)\n+00114\n+n_occupied_cells++;\n+00115 #endif\n+00116\n+00117\n+do{\n+00118\n+// if it is not present, add it\n+00119\n+if (elm==NULL){\n+00120\n+// create element\n+00121\n+elm = new sph_hash_element;\n+00122\n+00123\n+// set its varibles\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.21 hash.cpp\n+\n+00124\n+// Note: at this level, eta and phi have already been computed\n+00125\n+//\n+through CSphmomentum::build_thetaphi.\n+00126\n+elm->centre = *v;\n+00127\n+// if at least one of the two is_closer tests gives a result != from the expected,\n+00128\n+00129\n+// the || will be true hence !(...) false as wanted\n+00130\n+elm->is_stable = !((is_closer(v, parent, tan2R)^p_io)||(is_closer(v, child, tan2R)^c_io));\n+00131\n+//cout \u00ab \"-- new status of \" \u00ab v->ref[0] \u00ab \":\" \u00ab elm->is_stable \u00ab endl;\n+00132\n+00133\n+// update hash\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+00139\n+}\n+00140\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+elm->is_stable = !((is_closer(v, parent, tan2R)^p_io)||(is_closer(v, child, tan2R)^c_io));\n+00146\n+//cout \u00ab \" parent/child: \"\n+00147\n+//\n+\u00ab parent->ref[0] \u00ab \":\" \u00ab is_closer(v, parent) \u00ab \":\" \u00ab p_io \u00ab \" \"\n+00148\n+//\n+\u00ab child->ref[0] \u00ab \":\" \u00ab is_closer(v, child) \u00ab \":\" \u00ab c_io \u00ab endl;\n+00149\n+//cout \u00ab \"-- rep status of \" \u00ab v->ref[0] \u00ab \":\" \u00ab elm->is_stable \u00ab endl;\n+00150\n+//cout \u00ab v->eta \u00ab \" \" \u00ab v->phi \u00ab endl;\n+00151\n+//cout \u00ab (child->eta) \u00ab \" \" \u00ab child->phi \u00ab endl;\n+00152\n+}\n+00153\n+return 0;\n+00154\n+}\n+00155\n+00156\n+elm = elm->next;\n+00157\n+} while (1);\n+00158\n+return 1;\n+00159\n+00160 }\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+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+int index = (v->ref.ref[0]) & mask;\n+00171\n+00172\n+//cout \u00ab \"-- stable candidate: \" \u00ab v->ref[0] \u00ab \":\" \u00ab endl;\n+00173\n+00174\n+// check the array cell corresponding to our reference\n+00175\n+elm = hash_array[index];\n+00176\n+do{\n+// if it is not present, add it\n+00177\n+00178\n+if (elm==NULL){\n+00179\n+// create element\n+00180\n+elm = new sph_hash_element;\n+00181\n+// set its varibles\n+00182\n+00183\n+// Note: at this level, eta and phi have already been computed\n+00184\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+00189\n+elm->next = hash_array[index];\n+00190\n+hash_array[index] = elm;\n+00191\n+00192\n+n_cones++;\n+00193\n+return 0;\n+00194\n+}\n+00195\n+// if the cone is already there, we have nothing to do\n+00196\n+00197\n+if (v->ref == elm->centre.ref){\n+00198\n+return 0;\n+00199\n+}\n+00200\n+00201\n+elm = elm->next;\n+00202\n+} while (1);\n+00203\n+return 1;\n+00204\n+00205 }\n+00206\n+00207 }\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+209\n \n+\f210\n+\n+File Documentation\n+\n+5.22 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 00006 // For more details, see http://projects.hepforge.org/siscone\n //\n 00007 //\n@@ -14548,35 +15827,35 @@\n 00033\n 00034 namespace siscone{\n 00035\n 00045 class hash_element{\n 00046 public:\n 00047\n Creference ref;\n-00048\n double eta;\n-double phi;\n+00048\n 00049\n-00050\n+double phi;\n bool is_stable;\n+00050\n 00051\n 00052\n hash_element *next;\n 00053 };\n 00054\n 00062 class hash_cones{\n 00063 public:\n 00067\n hash_cones(int _Np, double _R2);\n 00068\n 00070\n ~hash_cones();\n 00071\n-int insert(Cmomentum *v, Cmomentum *parent, Cmomentum *child, bool p_io, bool c_io);\n 00081\n+int insert(Cmomentum *v, Cmomentum *parent, Cmomentum *child, bool p_io, bool c_io);\n 00082\n int insert(Cmomentum *v);\n 00090\n 00091\n 00093\n hash_element **hash_array;\n 00094\n@@ -14597,46 +15876,46 @@\n inline bool is_inside(Cmomentum *centre, Cmomentum *v);\n 00118\n 00119 };\n 00120\n 00121 }\n 00122 #endif\n \n-5.19 hash.h\n+5.23 hash.h\n 00001 // -*- C++ -*00003 // File: hash.h\n 00004 // Description: header file for classes hash_element and hash_cones\n 00005 // This file is part of the SISCone project.\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-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n //\n //\n //\n //\n //\n //\n //\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.24 momentum.cpp\n+\n+211\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-\n-\f202\n-\n-File Documentation\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@@ -14668,40 +15947,40 @@\n 00034\n 00035 namespace siscone_spherical{\n 00036\n 00046 class sph_hash_element{\n 00047 public:\n 00048\n CSph3vector centre;\n-bool is_stable;\n 00049\n+bool is_stable;\n 00050\n 00051\n sph_hash_element *next;\n 00052 };\n 00053\n 00061 class sph_hash_cones{\n 00062 public:\n 00065\n sph_hash_cones(int _Np, double _radius);\n 00066\n 00068\n ~sph_hash_cones();\n 00069\n-00079\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 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 00102\n@@ -14713,15 +15992,683 @@\n double tan2R;\n 00109\n 00110 };\n 00111\n 00112 }\n 00113 #endif\n \n-5.20 momentum.h\n+5.24 momentum.cpp\n+00001\n+00002 // File: momentum.cpp\n+00003 // Description: source file for 4-momentum class Cmomentum\n+00004 // This file is part of the SISCone project.\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+00013 //\n+00014 // This program is distributed in the hope that it will be useful,\n+00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n+00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+00017 // GNU General Public License for more details.\n+00018 //\n+00019 // You should have received a copy of the GNU General Public License\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+\f212\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:: 123\n+$//\n+00024 // $Date:: 2007-03-01 02:52:16 +0100 (Thu, 01 Mar 2007)\n+$//\n+00026\n+00027 #include \"momentum.h\"\n+00028 #include \n+00029 #include \n+00030\n+00031 namespace siscone{\n+00032\n+00033 /*************************************************************************\n+00034 * class Cmomentum\n+*\n+00035 * This class contains the information for particle or group of\n+*\n+00036 * particles management.\n+*\n+00037 * It includes all Lorentz properties as well as tools for summing them. *\n+00038 *************************************************************************/\n+00039\n+00040 // default ctor\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+00046\n+ref = Creference();\n+00047\n+index = -1;\n+00048 }\n+00049\n+00050 // ctor with initialisation\n+00051 //-------------------------00052 Cmomentum::Cmomentum(double _px, double _py, double _pz, double _E){\n+00053\n+px = _px;\n+00054\n+py = _py;\n+00055\n+pz = _pz;\n+00056\n+E = _E;\n+00057\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+00064 //----------------------------------00065 Cmomentum::Cmomentum(double _eta, double _phi, Creference _ref){\n+00066\n+eta = _eta;\n+00067\n+phi = _phi;\n+00068\n+00069\n+ref = _ref;\n+00070 }\n+00071\n+00072 // default dtor\n+00073 //-------------00074 Cmomentum::~Cmomentum(){\n+00075\n+00076 }\n+00077\n+00078 // assignment of vectors\n+00079 //----------------------00080 Cmomentum& Cmomentum::operator = (const Cmomentum &v){\n+00081\n+px = v.px;\n+00082\n+py = v.py;\n+00083\n+pz = v.pz;\n+00084\n+E = v.E;\n+00085\n+00086\n+eta = v.eta;\n+00087\n+phi = v.phi;\n+00088\n+00089\n+ref = v.ref;\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+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+00106\n+py+=v.py;\n+00107\n+pz+=v.pz;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.25 momentum.cpp\n+\n+213\n+\n+00108\n+E +=v.E;\n+00109\n+00110\n+ref+=v.ref;\n+00111\n+return *this;\n+00112\n+00113 }\n+00114\n+00115 // incrementation of vectors\n+00116 // !!! WARNING !!! no updating of eta and phi !!!\n+00117 //-----------------------------------------------00118 Cmomentum& Cmomentum::operator -= (const Cmomentum &v){\n+00119\n+px-=v.px;\n+00120\n+py-=v.py;\n+00121\n+pz-=v.pz;\n+00122\n+E -=v.E;\n+00123\n+00124\n+ref-=v.ref;\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+00133 //-------------------------------------------------00134 void Cmomentum::build_etaphi(){\n+// note: the factor n (ref.nb) cancels in all expressions !!\n+00135\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+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+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+return v1.perp2() < v2.perp2();\n+00157\n+00158 }\n+00159\n+00160 }\n+00161\n+\n+5.25 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+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:: 255\n+$//\n+00026 // $Date:: 2008-07-12 17:40:35 +0200 (Sat, 12 Jul 2008)\n+$//\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+\n+\f214\n+\n+File Documentation\n+\n+00028\n+00029 #include \"momentum.h\"\n+00030 #include \n+00031 #include \n+00032\n+00033 namespace siscone_spherical{\n+00034\n+00035 /*************************************************************************\n+00036 * class CSph3vector\n+*\n+00037 * This class contains the information for particle or group of\n+*\n+00038 * particles management.\n+*\n+00039 *************************************************************************/\n+00040\n+00041 // default ctor\n+00042 //-------------00043 CSph3vector::CSph3vector(){\n+00044\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+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+pz = _pz;\n+00055\n+00056\n+// compute the norm\n+00057\n+build_norm();\n+00058\n+00059\n+ref = siscone::Creference();\n+00060 }\n+00061\n+00062 // default dtor\n+00063 //-------------00064 CSph3vector::~CSph3vector(){\n+00065\n+00066 }\n+00067\n+00068\n+00069 // assignment of vectors\n+00070 //----------------------00071 CSph3vector& CSph3vector::operator = (const CSph3vector &v){\n+00072\n+px = v.px;\n+00073\n+py = v.py;\n+00074\n+pz = v.pz;\n+00075\n+00076\n+_norm = v._norm;\n+00077\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+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+return tmp+=v;\n+00089 }\n+00090\n+00091 // subtraction of vectors\n+00092 //-----------------------------------------------00093 const CSph3vector CSph3vector::operator - (const CSph3vector &v){\n+00094\n+CSph3vector tmp = *this;\n+00095\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+00102\n+return tmp/=r;\n+00103 }\n+00104\n+00105 // incrementation\n+00106 //-----------------------------------------------00107 CSph3vector& CSph3vector::operator += (const CSph3vector &v){\n+00108\n+px+=v.px;\n+00109\n+py+=v.py;\n+00110\n+pz+=v.pz;\n+00111\n+00112\n+return *this;\n+00113 }\n+00114\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.25 momentum.cpp\n+\n+00115 // decrementation\n+00116 //-----------------------------------------------00117 CSph3vector& CSph3vector::operator -= (const CSph3vector &v){\n+00118\n+px-=v.px;\n+00119\n+py-=v.py;\n+00120\n+pz-=v.pz;\n+00121\n+00122\n+return *this;\n+00123 }\n+00124\n+00125 // multiplication by a constant\n+00126 //-----------------------------------------------00127 CSph3vector& CSph3vector::operator *= (const double &r){\n+00128\n+px*=r;\n+00129\n+py*=r;\n+00130\n+pz*=r;\n+00131\n+00132\n+return *this;\n+00133 }\n+00134\n+00135 // division by a constant\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+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+00151\n+00152 // build norm from 3-momentum info\n+00153 void CSph3vector::build_thetaphi(){\n+00154\n+_theta = theta();\n+00155\n+_phi = phi();\n+00156 }\n+00157\n+00158\n+00159 // for this direction, compute the two reference directions\n+00160 // used to measure angles\n+00161 void CSph3vector::get_angular_directions(CSph3vector &angular_dir1, CSph3vector &angular_dir2){\n+00162\n+if (px < py){\n+00163\n+if (pz < px){\n+// z smallest\n+00164\n+00165\n+angular_dir1 = CSph3vector(-py, px, 0.0);\n+00166\n+} else {\n+00167\n+// x smallest\n+00168\n+angular_dir1 = CSph3vector(0.0, -pz, py);\n+00169\n+}\n+00170\n+} else {\n+if (pz < py){\n+00171\n+00172\n+// z smallest\n+00173\n+angular_dir1 = CSph3vector(-py, px, 0.0);\n+00174\n+} else {\n+00175\n+// y smallest\n+00176\n+angular_dir1 = CSph3vector(-pz, 0.0, px);\n+00177\n+}\n+00178\n+}\n+00179\n+angular_dir2 = cross_product3(*this, angular_dir1);\n+00180\n+// We\u2019ll simply take x & y so the reflection symmetry is not broken\n+00181\n+//angular_dir1 = CSph3vector(0.0, -pz, py);\n+00182\n+//angular_dir2 = CSph3vector(-pz, 0.0, -px);\n+00183 }\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+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+E=0.0;\n+00196\n+index = -1;\n+00197 }\n+00198\n+00199 // ctor with initialisation\n+00200 //-------------------------00201 CSphmomentum::CSphmomentum(double _px, double _py, double _pz, double _E)\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+215\n+\n+\f216\n+\n+File Documentation\n+\n+00202\n+: CSph3vector(_px, _py, _pz) {\n+00203\n+E = _E;\n+00204\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+: CSph3vector(_v.px, _v.py, _v.pz) {\n+00213\n+E = _E;\n+00214 }\n+00215\n+00216 // default dtor\n+00217 //-------------00218 CSphmomentum::~CSphmomentum(){\n+00219\n+00220 }\n+00221\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+pz = v.pz;\n+00228\n+E = v.E;\n+00229\n+00230\n+_norm = v._norm;\n+00231\n+_theta = v._theta;\n+00232\n+_phi\n+= v._phi;\n+00233\n+00234\n+ref = v.ref;\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+00243\n+return tmp+=v;\n+00244 }\n+00245\n+00246 // incrementation of vectors\n+00247 // !!! WARNING !!! no updating of eta and phi !!!\n+00248 //-----------------------------------------------00249 CSphmomentum& CSphmomentum::operator += (const CSphmomentum &v){\n+00250\n+px+=v.px;\n+00251\n+py+=v.py;\n+00252\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+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+00265\n+py-=v.py;\n+00266\n+pz-=v.pz;\n+00267\n+E -=v.E;\n+00268\n+00269\n+ref-=v.ref;\n+00270\n+return *this;\n+00271 }\n+00272\n+00273\n+00274 // ordering of two vectors\n+00275 // the default ordering is w.r.t. their references\n+00276 //------------------------------------------------00277 bool operator < (const CSphmomentum &v1, const CSphmomentum &v2){\n+00278\n+return v1.ref < v2.ref;\n+00279 }\n+00280\n+00281 // ordering of vectors in eta (e.g. used in collinear tests)\n+00282 //----------------------------------------------------------00283 bool momentum_theta_less(const CSphmomentum &v1, const CSphmomentum &v2){\n+return v1._theta < v2._theta;\n+00284\n+00285 }\n+00286\n+00287 // ordering of vectors in pt\n+00288 //---------------------------\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.26 momentum.h\n+\n+00289 bool momentum_pt_less(const CSphmomentum &v1, const CSphmomentum &v2){\n+return v1.perp2() < v2.perp2();\n+00290\n+00291 }\n+00292\n+00293 }\n+00294\n+\n+5.26 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@@ -14757,20 +16704,16 @@\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.20 momentum.h\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@@ -14789,16 +16732,16 @@\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+inline double perp() const {return sqrt(perp2());}\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@@ -14830,29 +16773,38 @@\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+00110\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+217\n+\n+\f218\n+\n+File Documentation\n+\n 00111\n-00112\n+double pz;\n double E;\n+00112\n 00113\n-double eta;\n 00114\n-00115\n+double eta;\n double phi;\n-int parent_index;\n+00115\n 00116\n-00117\n+int parent_index;\n int index;\n+00117\n 00118\n // the following part is used for checksums //\n 00120\n 00122\n Creference ref;\n 00123 };\n 00124\n@@ -14882,25 +16834,15 @@\n return dx*dx+dy*dy;\n 00153 }\n 00154\n 00155 }\n 00156\n 00157 #endif\n \n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-203\n-\n-$//\n-\n-\f204\n-\n-File Documentation\n-\n-5.21 momentum.h\n+5.27 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@@ -14965,26 +16907,31 @@\n CSph3vector();\n 00058\n 00060\n CSph3vector(double _px, double _py, double _pz);\n 00061\n 00063\n ~CSph3vector();\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.27 momentum.h\n+\n 00064\n 00066\n CSph3vector& operator = (const CSph3vector &v);\n 00067\n-const CSph3vector operator + (const CSph3vector &v);\n 00070\n+const CSph3vector operator + (const CSph3vector &v);\n 00071\n const CSph3vector operator - (const CSph3vector &v);\n 00074\n 00075\n-00078\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@@ -14996,58 +16943,51 @@\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-00103\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+void build_norm();\n 00121\n void build_thetaphi();\n 00125\n 00126\n-00129\n void get_angular_directions(CSph3vector &angular_dir1, CSph3vector &angular_dir2);\n+00129\n 00130\n double px;\n 00131\n-double py;\n 00132\n+double py;\n double pz;\n 00133\n 00134\n-00135\n double _norm;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.21 momentum.h\n-\n-205\n-\n+00135\n 00136\n double _theta;\n-double _phi;\n 00137\n+double _phi;\n 00138\n-00140\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@@ -15073,19 +17013,19 @@\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+inline double Et() const {return E/sqrt(1.0+pz*pz/perp2());}\n 00189\n-00191\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 const CSphmomentum operator + (const CSphmomentum &v);\n 00198\n 00199\n@@ -15102,14 +17042,23 @@\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+219\n+\n+\f220\n+\n+File Documentation\n+\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@@ -15162,24 +17111,17 @@\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f206\n-\n-File Documentation\n-\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+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 00290\n double dot = dot_product3(*v1,*v2);\n return (dot>=0) && (norm2_cross_product3(*v1,*v2)<=tan2R*dot*dot);\n 00291\n@@ -15199,52 +17141,58 @@\n CSph3vector tmp = v;\n return tmp*=r;\n 00309\n 00310 }\n 00311 }\n 00312 #endif\n \n-5.22 protocones.cpp\n+5.28 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 // 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+//\n+//\n+//\n+//\n+//\n+//\n //\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.28 protocones.cpp\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:: 322\n $//\n@@ -15309,19 +17257,14 @@\n *\n 00056 * - abs_dangle()\n *\n 00057 *******************************************************/\n 00058\n 00059 #include \"protocones.h\"\n 00060 #include \"siscone_error.h\"\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.22 protocones.cpp\n-\n 00061 #include \"defines.h\"\n 00062 #include \n 00063 #include \n 00064 #include \"circulator.h\"\n 00065 #include \n 00066\n 00067 namespace siscone{\n@@ -15374,14 +17317,23 @@\n 00103 // default dtor\n 00104 //-------------00105 Cstable_cones::~Cstable_cones(){\n 00106\n if (hc!=NULL) delete hc;\n 00107 }\n 00108\n 00109 /*\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+221\n+\n+\f222\n+\n+File Documentation\n+\n 00110 * initialisation\n 00111 * - _particle_list list of particles\n 00112 * - _n\n number of particles\n 00113 *********************************************************************/\n 00114 void Cstable_cones::init(vector &_particle_list){\n 00115\n@@ -15433,30 +17385,21 @@\n }\n 00148\n 00149\n R = _radius;\n 00150\n R2 = R*R;\n 00151\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-207\n-\n-\f208\n-\n-File Documentation\n-\n-00152\n // allow hash for cones candidates\n+00152\n 00153\n hc = new hash_cones(n_part, R2);\n 00154\n-00155\n // browse all particles\n+00155\n 00156\n for (p_idx=0;p_idxside){\n 00247\n@@ -15666,16 +17609,25 @@\n 00283\n centre_idx=0;\n if (centre_idx==first_cone)\n 00284\n return 1;\n 00285\n 00286\n-// update the cone w.r.t. the old child\n 00287\n+// update the cone w.r.t. the old child\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+223\n+\n+\f224\n+\n+File Documentation\n+\n 00288\n // only required if the old child is entering inside in which\n 00289\n // case we need to add it. We also know that the child is\n 00290\n // inside iff its side is -.\n 00291\n@@ -15686,16 +17638,16 @@\n cone += (*child);\n 00294\n // update info on particles inside\n 00295\n 00296\n centre->is_inside->cone = true;\n 00297\n-// update stability check quantities\n 00298\n+// update stability check quantities\n 00299\n dpt += fabs(child->px)+fabs(child->py);\n 00300\n }\n 00301\n 00302\n // update centre and child to correspond to the new position\n@@ -15716,16 +17668,16 @@\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@@ -15740,23 +17692,14 @@\n 00324\n centre->is_inside->cone = false;\n 00325\n // update stability check quantities\n 00326\n 00327\n dpt += fabs(child->px)+fabs(child->py); //child->perp2();\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-209\n-\n-\f210\n-\n-File Documentation\n-\n 00328\n }\n 00329\n // check that the addition and subtraction of vectors does\n 00330\n 00331\n // not lead to too much rounding error\n@@ -15827,14 +17770,19 @@\n 00371\n if (circle_intersect(elm->eta, elm->phi)==elm->ref){\n 00372 #endif\n 00373\n // add it to the list of protocones\n 00374\n // note that in its present form, we do not allocate the\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.28 protocones.cpp\n+\n 00375\n // 4-vector components of the momentum. There\u2019s no need to\n 00376\n // do it here as it will be recomputed in\n 00377\n //\n Csplit_merge::add_protocones\n@@ -15850,39 +17798,39 @@\n 00383\n elm = elm->next;\n 00384\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@@ -15893,19 +17841,14 @@\n 00412 bool cocircular_pt_less(Cmomentum *v1, Cmomentum *v2){\n return v1->perp2() < v2->perp2();\n 00413\n 00414 }\n 00415\n 00416 /*\n 00417 * run through the vicinity of the current parent and for each child\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.22 protocones.cpp\n-\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 00422 * later on...\n 00423 **********************************************************************/\n 00424 void Cstable_cones::prepare_cocircular_lists() {\n@@ -15922,16 +17865,16 @@\n do {\n 00431\n 00432\n Cvicinity_elm* here_pntr = *here();\n 00433\n search.set_position(here);\n 00434\n-// search forwards for things that should have \"here\" included in\n 00435\n+// search forwards for things that should have \"here\" included in\n 00436\n // their cocircularity list\n 00437\n while (true) {\n 00438\n ++search;\n if ( abs_dphi((*search())->angle, here_pntr->angle) <\n@@ -15978,14 +17921,23 @@\n 00460\n 00461\n ++here;\n 00462\n } while (here() != vicinity.begin());\n 00463\n 00464 }\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+225\n+\n+\f226\n+\n+File Documentation\n+\n 00465\n 00466 /*\n 00467 * Testing cocircular configurations in p^3 time,\n 00468 * rather than 2^p time; we will test all contiguous subsets of points\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@@ -16003,32 +17955,32 @@\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-// get them into order of angle\n 00483\n+// get them into order of angle\n 00484\n sort(border_vect.begin(), border_vect.end());\n 00485\n-00486\n // set up some circulators, since these will help us go around the\n+00486\n 00487\n // circle easily\n 00488\n circulator::iterator >\n 00489\n start(border_vect.begin(), border_vect.begin(),border_vect.end());\n 00490\n circulator::iterator > mid(start), end(start);\n 00491\n-00492\n // test the borderless cone\n+00492\n 00493\n Cmomentum candidate = borderless_cone;\n 00494\n candidate.build_etaphi();\n if (candidate.ref.not_empty())\n 00495\n 00496\n@@ -16043,29 +17995,20 @@\n 00501\n do {\n 00502\n mid()->is_in = false;\n 00503\n } while (++mid != start);\n 00504\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-211\n-\n-\f212\n-\n-File Documentation\n-\n-00505\n // now run over all inclusion possibilities with this starting point\n+00505\n 00506\n candidate = borderless_cone;\n-00507\n while (++mid != start) {\n+00507\n 00508\n // will begin with start+1 and go up to start-1\n 00509\n mid()->is_in = true;\n 00510\n candidate += *(mid()->mom);\n 00511\n@@ -16100,16 +18043,16 @@\n 00535\n for (unsigned i = 0; i < border_vect.size(); i++) {\n 00536\n 00537\n if (is_inside(&candidate, border_vect[i].mom) ^ (border_vect[i].is_in)) {\n 00538\n stable = false;\n-00539\n break; // it\u2019s unstable so there\u2019s no point continuing\n+00539\n 00540\n }\n 00541\n }\n 00542\n if (stable) hc->insert(&candidate);\n 00543\n@@ -16127,178 +18070,190 @@\n // check if many configurations have the same centre.\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.28 protocones.cpp\n+\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 00562\n-// first get cone into status required at end...\n 00563\n 00564\n-if ((centre->side) && (cone.ref.not_empty())){\n 00565\n-// update cone\n 00566\n-cone -= (*child);\n 00567\n-// update info on particles inside\n 00568\n 00569\n-centre->is_inside->cone = false;\n 00570\n 00571\n-// update stability check quantities\n 00572\n-dpt += fabs(child->px)+fabs(child->py); //child->perp2();\n 00573\n-}\n 00574\n 00575\n-// now establish the list of unique children in the list\n 00576\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-// now establish the full contents of the cone minus the cocircular\n 00590\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-if ((*it)->is_inside->cone) {\n 00595\n 00596\n-cone_removal\n-+= *((*it)->v);\n 00597\n-(*it)->is_inside->cone = false;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.22 protocones.cpp\n-\n 00598\n-removed_from_cone.push_back((*it)->is_inside);\n 00599\n-}\n 00600\n 00601\n-// if a point appears twice (i.e. with + and - sign) in the list of\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-bool consider = true;\n 00617\n-for (unsigned int i=0;i(borderless_cone.ref,\n 00628\n-border.ref));\n 00629\n-// first figure out whether our cone momentum is good\n 00630\n 00631\n-double local_dpt = fabs(cone_removal.px) + fabs(cone_removal.py);\n 00632\n-double total_dpt = dpt + local_dpt;\n 00633\n 00634\n-recompute_cone_contents_if_needed(borderless_cone, total_dpt);\n-if (total_dpt == 0) {\n 00635\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+\n+// test_cone_multiple, must only be considered here if all\n+// angles are on the same side (this avoid multiple counting)\n+if (centre->cocircular.empty()) return false;\n+// first get cone into status required at end...\n+if ((centre->side) && (cone.ref.not_empty())){\n+// update cone\n+cone -= (*child);\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+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+227\n+\n+\f228\n+\n+File Documentation\n+\n 00645\n-00646\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@@ -16311,16 +18266,16 @@\n 00654\n is_in != put_in_border.end(); is_in++) {\n 00655\n (*is_in)->cocirc = false;\n 00656\n }\n 00657\n-00658\n // we\u2019re done with everything -- return true to signal to user that we\u2019ve\n+00658\n 00659\n // been through the co-circularity rigmarole\n 00660\n return true;\n 00661 }\n 00662\n 00663\n@@ -16338,16 +18293,16 @@\n circulator::iterator >\n 00681\n start(vicinity.begin()+first_cone, vicinity.begin(), vicinity.end());\n 00682\n 00683\n circulator::iterator > here(start);\n 00684\n-// note that in the following algorithm, the cone contents never includes\n 00685\n+// note that in the following algorithm, the cone contents never includes\n 00686\n // the child. Indeed, if it has positive sign, then it will be set as\n 00687\n // outside at the last step in the loop. If it has negative sign, then the\n 00688\n // loop will at some point go to the corresponding situation with positive\n 00689\n@@ -16357,23 +18312,14 @@\n do {\n // as we leave this position a particle enters if its side is\n 00692\n 00693\n // negative (i.e. the centre is the one at -ve angle wrt to the\n 00694\n // parent-child line\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-213\n-\n-\f214\n-\n-File Documentation\n-\n 00695\n if (!(*here())->side) ((*here())->is_inside->cone) = 1;\n 00696\n // move on to the next position\n 00697\n 00698\n ++here;\n@@ -16409,16 +18355,16 @@\n unsigned int i;\n 00720\n // set momentum to 0\n 00721\n 00722\n cone = Cmomentum();\n 00723\n-00724\n // Important note: we can browse only the particles\n+00724\n 00725\n // in vicinity since all particles in the cone are\n 00726\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@@ -16439,49 +18385,54 @@\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.28 protocones.cpp\n+\n 00742 * the cone momentum from particle list. in this version, we use the\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 00747\n double & this_dpt){\n 00748\n if (this_dpt > PT_TSHOLD*(fabs(this_cone.px)+fabs(this_cone.py))) {\n 00749\n-00750\n if (cone.ref.is_empty()) {\n+00750\n 00751\n this_cone = Cmomentum();\n 00752\n } else {\n // set momentum to 0\n 00753\n 00754\n this_cone = Cmomentum();\n 00755\n-00756\n // Important note: we can browse only the particles\n+00756\n 00757\n // in vicinity since all particles in the this_cone are\n 00758\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@@ -16504,21 +18455,14 @@\n 00778 // - is_inside()\n //\n 00779 // - abs_dangle()\n //\n 00781\n 00782\n 00783 /*\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.23 protocones.cpp\n-\n-215\n-\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 y coordinate\n@@ -16537,16 +18481,16 @@\n // compute the distance of the i-th particle with the parent\n 00797\n 00798\n dx = plist[i].eta - cx;\n 00799\n dy = fabs(plist[i].phi - cy);\n 00800\n-// pay attention to the periodicity in phi !\n 00801\n+// pay attention to the periodicity in phi !\n 00802\n if (dy>M_PI)\n 00803\n dy -= twopi;\n 00804\n 00805\n // really check if the distance is less than VR\n@@ -16561,100 +18505,101 @@\n 00810\n 00811 }\n 00812\n 00813 /*\n 00814 * test if a particle is inside a cone of given centre.\n 00815 * check if the particle of coordinates \u2019v\u2019 is inside the circle of radius R\n 00816 * centered at \u2019centre\u2019.\n-centre of the circle\n 00817 * - centre\n+centre of the circle\n particle to test\n 00818 * - v\n 00819 * return true if inside, false if outside\n 00820 *****************************************************************************/\n 00821 inline bool Cstable_cones::is_inside(Cmomentum *centre_in, Cmomentum *v){\n 00822\n double dx, dy;\n 00823\n 00824\n dx = centre_in->eta - v->eta;\n 00825\n dy = fabs(centre_in->phi - v->phi);\n-if (dy>M_PI)\n 00826\n+if (dy>M_PI)\n 00827\n dy -= twopi;\n 00828\n-return dx*dx+dy*dyM_PI)\n 00844\n dphi = dphi-twopi;\n 00845\n 00846\n return dphi;\n 00847 }\n 00848\n 00849 }\n \n-5.23 protocones.cpp\n+5.29 protocones.cpp\n 00001\n+//\n 00002 // File: protocones.cpp\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-00007 // For more details, see http://projects.hepforge.org/siscone\n-00008 //\n-00009 // Copyright (c) 2006-2008 Gavin Salam and Gregory Soyez\n-00010 //\n-00011 // This program is free software; you can redistribute it and/or modify\n-00012 // it under the terms of the GNU General Public License as published by\n-00013 // the Free Software Foundation; either version 2 of the License, or\n-00014 // (at your option) any later version.\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-//\n-//\n-//\n-//\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-\n-\f216\n-\n-File Documentation\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@@ -16733,14 +18678,19 @@\n *\n 00058 * - abs_dangle()\n *\n 00059 *******************************************************/\n 00060\n 00061 #include \n 00062 #include \n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.29 protocones.cpp\n+\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@@ -16786,19 +18736,14 @@\n 00100\n 00101\n nb_tot = 0;\n 00102\n hc = NULL;\n 00103 }\n 00104\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.23 protocones.cpp\n-\n 00105 // default dtor\n 00106 //-------------00107 CSphstable_cones::~CSphstable_cones(){\n 00108\n if (hc!=NULL) delete hc;\n 00109 }\n 00110\n 00111 /*\n@@ -16858,14 +18803,23 @@\n 00150\n 00151\n R = _radius;\n 00152\n R2 = R*R;\n 00153\n tan2R = tan(R);\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+231\n+\n+\f232\n+\n+File Documentation\n+\n 00154\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@@ -16909,16 +18863,16 @@\n 00177 #endif\n 00178\n // step 1: initialise with the first cone candidate\n 00179\n 00180\n init_cone();\n 00181\n-00182\n do{\n+00182\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@@ -16928,25 +18882,16 @@\n }\n 00189\n 00190\n return proceed_with_stability();\n 00191 }\n 00192\n 00193\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-217\n-\n-\f218\n-\n-File Documentation\n-\n-00195 // ALGORITHM MAIN STEPS\n //\n+00195 // ALGORITHM MAIN STEPS\n 00196 // - init_cone()\n //\n 00197 // - test_cone()\n //\n 00198 // - update_cone()\n //\n 00199 // - proceed_with_stability()\n@@ -16971,25 +18916,25 @@\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-00218\n //TODO? deal with a configuration with only degeneracies ?\n+00218\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-// init set child C\n 00223\n+// init set child C\n 00224\n centre = vicinity[first_cone];\n 00225\n child = centre->v;\n 00226\n centre_idx = first_cone;\n 00227\n@@ -17008,14 +18953,19 @@\n 00236\n 00237 /*\n 00238 * test cones.\n 00239 * We check if the cone(s) built with the present parent and child\n 00240 * are stable\n 00241 * return 0 on success 1 on error\n 00242 *********************************************************************/\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.29 protocones.cpp\n+\n 00243 int CSphstable_cones::test_cone(){\n 00244\n siscone::Creference weighted_cone_ref;\n 00245\n 00246\n // depending on the side we are taking the child particle,\n 00247\n@@ -17032,16 +18982,16 @@\n 00253\n // here are the tests entering the first series:\n 00254\n // 1. check if the cone is already inserted\n 00255\n // 2. check cone stability for the parent and child particles\n 00256\n-//UPDATED(see below): if (centre->side){\n 00257\n+//UPDATED(see below): if (centre->side){\n 00258\n //UPDATED(see below):\n // test when both particles are not in the cone\n 00259\n //UPDATED(see below):\n // or when both are in.\n 00260\n@@ -17098,19 +19048,14 @@\n 00279\n // instead of testing 2 inclusion/exclusion states for every pair, we test the 4 of them\n 00280\n 00281\n // when the parent has an energy bigger than the child\n 00282\n if (parent->E >= child->E){\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.23 protocones.cpp\n-\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 00286\n@@ -17143,16 +19088,16 @@\n 00301\n 00302\n nb_tot += 4;\n 00303\n }\n 00304\n 00305\n-return 0;\n 00306\n+return 0;\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@@ -17176,16 +19121,25 @@\n 00325\n centre_idx=0;\n if (centre_idx==first_cone)\n 00326\n return 1;\n 00327\n 00328\n-// update the cone w.r.t. the old child\n 00329\n+// update the cone w.r.t. the old child\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+233\n+\n+\f234\n+\n+File Documentation\n+\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@@ -17195,28 +19149,28 @@\n cout \u00ab \" old_enter\";\n 00336 #endif\n 00337\n // update cone\n 00338\n cone += (*child);\n 00339\n-// update info on particles inside\n 00340\n+// update info on particles inside\n 00341\n centre->is_inside->cone = true;\n 00342\n-00343\n // update stability check quantities\n+00343\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+00347\n 00348\n centre = vicinity[centre_idx];\n 00349\n child = centre->v;\n 00350\n 00351\n // check cocircularity\n@@ -17248,37 +19202,28 @@\n 00366\n // inside iff its side is +.\n 00367\n if ((centre->side) && (cone.ref.not_empty())){\n 00368 #ifdef DEBUG_STABLE_CONES\n 00369\n cout \u00ab \" new exit\";\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-219\n-\n-\f220\n-\n-File Documentation\n-\n 00370 #endif\n 00371\n-00372\n // update cone\n+00372\n 00373\n cone -= (*child);\n 00374\n // update info on particles inside\n 00375\n 00376\n centre->is_inside->cone = false;\n 00377\n-// update stability check quantities\n 00378\n+// update stability check quantities\n 00379\n dpt += fabs(child->px)+fabs(child->py)+fabs(child->pz); //child->perp2();\n 00380\n }\n 00381\n // check that the addition and subtraction of vectors does\n 00382\n@@ -17292,16 +19237,16 @@\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-if (cone.ref.is_empty()){\n 00390\n+if (cone.ref.is_empty()){\n 00391\n cone = CSphmomentum();\n 00392\n dpt=0.0;\n 00393\n }\n 00394\n@@ -17329,20 +19274,25 @@\n 00412\n for (i=0;i<=hc->mask;i++){\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+// browse elements therein\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.29 protocones.cpp\n+\n 00417\n while (elm!=NULL){\n-00418\n // test stability\n+00418\n 00419\n if (elm->is_stable){\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@@ -17377,21 +19327,21 @@\n 00439 #ifdef DEBUG_STABLE_CONES\n 00440\n nb_hash_cones = hc->n_cones;\n 00441\n nb_hash_occupied = hc->n_occupied_cells;\n 00442 #endif\n 00443\n-00444\n delete hc;\n+00444\n 00445\n hc=NULL;\n 00446\n-return protocones.size();\n 00447\n+return protocones.size();\n 00448 }\n 00449\n 00450\n 00452 // ALGORITHM MAIN STEPS FOR COCIRCULAR SITUATIONS\n //\n 00453 // - cocircular_pt_less(v1, v2)\n //\n@@ -17399,19 +19349,14 @@\n //\n 00455 // - test_cone_cocircular()\n //\n 00456 // - test_stability(candidate, border_vect)\n //\n 00457 // - updat_cone_cocircular()\n //\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.23 protocones.cpp\n-\n 00459\n 00461 //NEVER USED\n 00462 //bool cocircular_pt_less(CSphmomentum *v1, CSphmomentum *v2){\n 00463 // return v1->perp2() < v2->perp2();\n 00464 //}\n 00465\n 00466 /*\n@@ -17444,16 +19389,16 @@\n 00485\n 00486\n // their cocircularity list\n 00487\n while (true) {\n 00488\n ++search;\n-00489\n if ( siscone::abs_dphi((*search())->angle, here_pntr->angle) <\n+00489\n 00490\n here_pntr->cocircular_range\n 00491\n && search() != here()) {\n 00492\n (*search())->cocircular.push_back(here_pntr);\n 00493\n@@ -17479,14 +19424,23 @@\n here_pntr->cocircular_range\n 00504\n && search() != here()) {\n 00505\n (*search())->cocircular.push_back(here_pntr);\n 00506\n } else {\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+235\n+\n+\f236\n+\n+File Documentation\n+\n 00507\n break;\n 00508\n }\n 00509\n }\n 00510\n@@ -17517,22 +19471,22 @@\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-// now we have te reference axis, create the CSphborder_store structure\n 00532\n+// now we have te reference axis, create the CSphborder_store structure\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+00535\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@@ -17545,23 +19499,14 @@\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-221\n-\n-\f222\n-\n-File Documentation\n-\n 00547\n siscone::circulator::iterator > mid(start), end(start);\n 00548\n // test the borderless cone\n 00549\n 00550\n CSphmomentum candidate = borderless_cone;\n@@ -17570,16 +19515,16 @@\n 00552\n if (candidate.ref.not_empty())\n 00553\n test_stability(candidate, border_vect);\n 00554\n 00555\n do {\n-00556\n // reset status wrt inclusion in the cone\n+00556\n 00557\n mid = start;\n do {\n 00558\n 00559\n mid()->is_in = false;\n 00560\n@@ -17636,17 +19581,24 @@\n stable = false;\n break; // it\u2019s unstable so there\u2019s no point continuing\n 00596\n 00597\n }\n 00598\n }\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.29 protocones.cpp\n+\n+237\n+\n 00599\n-00600\n if (stable) hc->insert(&candidate);\n+00600\n 00601 }\n 00602\n 00603 /*\n 00604 * check if we are in a situation of cocircularity.\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@@ -17679,16 +19631,16 @@\n cone -= (*child);\n 00624\n // update info on particles inside\n 00625\n 00626\n centre->is_inside->cone = false;\n 00627\n-// update stability check quantities\n 00628\n+// update stability check quantities\n 00629\n dpt += fabs(child->px)+fabs(child->py)+fabs(child->pz); //child->perp2();\n 00630\n }\n 00631\n 00632\n 00633\n@@ -17698,76 +19650,67 @@\n 00635\n 00636\n list removed_from_cone;\n 00637\n list put_in_border;\n 00638\n list border_list;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.23 protocones.cpp\n-\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 00647\n+// now establish the full contents of the cone minus the cocircular\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+if ((*it)->is_inside->cone) {\n 00652\n 00653\n-00654\n-00655\n-00656\n-00657\n-00658\n-00659\n-00660\n-00661\n-00662\n-00663\n-00664\n-00665\n-00666\n-00667\n-\n-223\n-\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+00654\n (*it)->is_inside->cone = false;\n+00655\n removed_from_cone.push_back((*it)->is_inside);\n+00656\n }\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 //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@@ -17791,34 +19734,41 @@\n 00680\n }\n 00681\n // now prepare the hard work\n 00682\n 00683\n if (consider) {\n-// record the fact that we\u2019ve now seen this combination\n 00684\n+// record the fact that we\u2019ve now seen this combination\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f238\n+\n+File Documentation\n+\n 00685\n multiple_centre_done.push_back(pair(borderless_cone.ref,\n 00686\n border.ref));\n 00687\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 00691\n 00692\n recompute_cone_contents_if_needed(borderless_cone, total_dpt);\n-00693\n if (total_dpt == 0) {\n-// a recomputation has taken place -- so take advantage of this\n+00693\n 00694\n+// a recomputation has taken place -- so take advantage of this\n 00695\n // and update the member cone momentum\n 00696\n cone = borderless_cone + cone_removal;\n 00697\n dpt = local_dpt;\n 00698\n@@ -17848,36 +19798,29 @@\n 00712\n is_in != put_in_border.end(); is_in++) {\n 00713\n (*is_in)->cocirc = false;\n 00714\n }\n 00715\n-00716\n // we\u2019re done with everything -- return true to signal to user that we\u2019ve\n+00716\n 00717\n // been through the co-circularity rigmarole\n 00718\n return true;\n 00719 }\n 00720\n 00721\n //\n 00723 // RECOMPUTATION OF CONE CONTENTS\n 00724 // - compute_cone_contents()\n //\n 00725 // - recompute_cone_contents()\n //\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f224\n-\n-File Documentation\n-\n 00726 // - recompute_cone_contents_if_needed()\n //\n 00728\n 00737 void CSphstable_cones::compute_cone_contents() {\n 00738\n siscone::circulator::iterator >\n 00739\n@@ -17904,28 +19847,28 @@\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-// move on to the next position\n 00755\n+// move on to the next position\n 00756\n ++here;\n 00757\n // as we arrive at this position a particle leaves if its side is positive\n 00758\n 00759\n if ((*here())->side) ((*here())->is_inside->cone) = 0;\n 00760\n } while (here != start);\n 00761\n-// once we\u2019ve reached the start the \u2019is_inside\u2019 information should be\n 00762\n+// once we\u2019ve reached the start the \u2019is_inside\u2019 information should be\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 00766\n@@ -17939,21 +19882,26 @@\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 unsigned int i;\n 00777\n 00778\n-// set momentum to 0\n 00779\n+// set momentum to 0\n 00780\n cone = CSphmomentum();\n 00781\n-// Important note: we can browse only the particles\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.30 protocones.h\n+\n 00782\n+// Important note: we can browse only the particles\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@@ -18007,42 +19955,37 @@\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.24 quadtree.cpp\n-\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 00832\n-00834 // VARIOUS TOOLS\n //\n+00834 // VARIOUS TOOLS\n 00835 // - circle_intersect()\n //\n 00836 // - is_inside()\n //\n 00837 // - abs_dangle()\n //\n 00839\n@@ -18056,62 +19999,607 @@\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+int i;\n 00852\n-00853\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+00063\n+bool\n+is_in;\n+00064 };\n+00065\n+00066\n+00069 inline bool operator<(const Cborder_store & a, const Cborder_store & b) {\n+00070\n+return a.angle < b.angle;\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+void init(std::vector &_particle_list);\n+00097\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.31 protocones.h\n+\n+241\n+\n+00136\n+Cvicinity_elm *centre;\n+00137\n+unsigned int centre_idx;\n+00139\n+00140\n+unsigned int first_cone;\n+00142\n+00143\n+int init_cone();\n+00149\n+00150\n+int test_cone();\n+00157\n+00158\n+00164\n+int update_cone();\n+00165\n+/*\n+00166\n+00167\n+* run through the vicinity of the current parent and for each child\n+00168\n+* indicate which members are cocircular...\n+00169\n+*/\n+00170\n+void prepare_cocircular_lists();\n+00171\n+bool cocircular_check();\n+00179\n+00180\n+void test_cone_cocircular(Cmomentum & borderless_cone,\n+00185\n+00186\n+std::list & border_list);\n+00187\n+00194\n+void test_stability(Cmomentum & candidate,\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\n+* if we have gone beyond the acceptable threshold of change, compute\n+00214\n+* the cone momentum from particle list. in this version, we use the\n+00215\n+* \u2019pincluded\u2019 information from the Cvicinity class, but we don\u2019t\n+00216\n+* change the member cone, only the locally supplied one\n+00217\n+*/\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\n+* circle intersection.\n+00229\n+* computes the intersection with a circle of given centre and radius.\n+00230\n+* The output takes the form of a checkxor of the intersection\u2019s particles\n+00231\n+circle centre x coordinate\n+* - cx\n+circle centre y coordinate\n+00232\n+* - cy\n+00233\n+* return the checkxor for the intersection\n+00234\n+******************************************************************/\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+00264 * \\param angle1\n+first angle\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.31 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+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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+\f242\n+\n+File Documentation\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+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 on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.32 quadtree.cpp\n+\n+243\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\n+* run through the vicinity of the current parent and for each child\n+00178\n+* indicate which members are cocircular...\n+00179\n+*/\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+00222\n+/*\n+00223\n+* if we have gone beyond the acceptable threshold of change, compute\n+00224\n+* the cone momentum from particle list. in this version, we use the\n+00225\n+* \u2019pincluded\u2019 information from the CSphvicinity class, but we don\u2019t\n+00226\n+* change the member cone, only the locally supplied one\n+00227\n+*/\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\n+* circle intersection.\n+00239\n+* computes the intersection with a circle of given centre and radius.\n+00240\n+* The output takes the form of a checkxor of the intersection\u2019s particles\n+circle centre x coordinate\n+00241\n+* - cx\n+00242\n+circle centre y coordinate\n+* - cy\n+00243\n+* return the checkxor for the intersection\n+00244\n+******************************************************************/\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.32 quadtree.cpp\n+00001\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-//\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+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n //\n+//\n+\n+\f244\n+\n+File Documentation\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@@ -18143,23 +20631,14 @@\n 00038 * Implementation of a 2D quadtree.\n *\n 00039 * This class implements the traditional two-dimensional quadtree. *\n 00040 * The elements at each node are of \u2019Cmomentum\u2019 type.\n *\n 00041 *******************************************************************/\n 00042\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-225\n-\n-\f226\n-\n-File Documentation\n-\n 00043 // default ctor\n 00044 //-------------00045 Cquadtree::Cquadtree(){\n 00046\n v = NULL;\n 00047\n 00048\n children[0][0] = children[0][1] = children[1][0] = children[1][1] = NULL;\n@@ -18183,71 +20662,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-if (has_child){\n 00070\n+if (has_child){\n 00071\n if (v!=NULL) delete v;\n-00072\n delete children[0][0];\n-delete children[0][1];\n+00072\n 00073\n-00074\n+delete children[0][1];\n delete children[1][0];\n-delete children[1][1];\n+00074\n 00075\n+delete children[1][1];\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 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-00093\n+if (v!=NULL)\n return 1;\n+00093\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-return 0;\n 00100\n+return 0;\n 00101 }\n 00102\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.32 quadtree.cpp\n+\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+00108 * - v\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 00113\n // -------------------------00114\n@@ -18272,43 +20756,38 @@\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.24 quadtree.cpp\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-// create children\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 children[0][1] = new Cquadtree(centre_x-new_half_size_x, centre_y+new_half_size_y,\n 00140\n@@ -18337,39 +20816,39 @@\n // copy physical params\n 00153\n 00154\n v = new Cmomentum(*v);\n 00155\n }\n 00156\n-// step 3: add new particle\n 00157\n+// step 3: add new particle\n 00158\n // Note: v_add being a single particle, eta and phi are correct\n 00159\n children[v_add->eta>centre_x][v_add->phi>centre_y]->add(v_add);\n 00160\n *v+=*v_add;\n 00161\n-return 0;\n 00162\n+return 0;\n 00163 }\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-circle radius SQUARED\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 00177\n // Description of the method:\n 00178\n // -------------------------00179\n@@ -18385,128 +20864,128 @@\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-00187\n // step 1: if there is no particle inside te square, no reason to go further\n+00187\n 00188\n if (v==NULL)\n 00189\n return Creference();\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+245\n+\n+\f246\n+\n+File Documentation\n+\n 00190\n double dx, dy;\n 00191\n 00192\n-// step 2: if there is only one particle inside the square, test if it is in\n 00193\n+// step 2: if there is only one particle inside the square, test if it is in\n 00194\n //\n the circle, in which case return associated reference\n 00195\n if (!has_child){\n-00196\n // compute the distance\n+00196\n 00197\n // Note: v has only one particle => eta and phi are defined\n 00198\n dx = cx - v->eta;\n 00199\n dy = fabs(cy - v->phi);\n-if (dy>M_PI)\n 00200\n+if (dy>M_PI)\n 00201\n dy -= 2.0*M_PI;\n 00202\n-00203\n // test distance\n+00203\n 00204\n if (dx*dx+dy*dyref;\n 00205\n+return v->ref;\n 00206\n }\n 00207\n-00208\n return Creference();\n+00208\n 00209\n }\n 00210\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 00216\n dx_c = fabs(cx-centre_x);\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-227\n-\n-\f228\n-\n-File Documentation\n-\n 00217\n dy_c = fabs(cy-centre_y);\n if (dy_c>M_PI) dy_c = 2.0*M_PI-dy_c;\n 00218\n 00219\n-00220\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-// no intersection\n 00228\n+// no intersection\n 00229\n return Creference();\n 00230\n }\n 00231\n 00232\n // step 4: check if included\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-00239\n // compute the distance\n+00239\n 00240\n if (dx*dx+dy*dyref;\n+00241\n 00242\n }\n 00243\n-// step 5: the square is not fully in. Recurse to children\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 00246\n + children[0][1]->circle_intersect(cx, cy, cR2)\n 00247\n + children[1][0]->circle_intersect(cx, cy, cR2)\n 00248\n@@ -18541,64 +21020,64 @@\n 00270\n children[1][0]->save(flux);\n 00271\n children[1][1]->save(flux);\n 00272\n }\n 00273\n-return 0;\n 00274\n+return 0;\n 00275 }\n 00276\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.33 quadtree.h\n+\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 00282 * first and second columns give center of the cell, the third\n 00283 * gives the size.\n 00284 * - flux opened stream to write to\n 00285 * return 0 on success, 1 on error\n 00286 ******************************************************************/\n 00287 int Cquadtree::save_leaves(FILE *flux){\n 00288\n if (flux==NULL)\n 00289\n-00290\n return 1;\n+00290\n 00291\n-if (has_child){\n 00292\n-00293\n+if (has_child){\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+00293\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-if (children[1][1]!=NULL) children[1][1]->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 00302 }\n 00303\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.25 quadtree.h\n-\n 00304 }\n \n-5.25 quadtree.h\n+5.33 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@@ -18656,31 +21135,40 @@\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-int init(double _x, double _y, double _half_size_x, double _half_size_y);\n 00067\n+int init(double _x, double _y, double _half_size_x, double _half_size_y);\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 00089\n int save(FILE *flux);\n 00099\n 00100\n-int save_leaves(FILE *flux);\n 00110\n+int save_leaves(FILE *flux);\n 00111\n double centre_x;\n 00112\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+247\n+\n+\f248\n+\n+File Documentation\n+\n 00113\n double centre_y;\n double half_size_x;\n 00114\n 00115\n double half_size_y;\n 00116\n@@ -18692,33 +21180,24 @@\n 00120\n bool has_child;\n 00121 };\n 00122\n 00123 }\n 00124 #endif\n \n-5.26 ranlux.cpp\n+5.34 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\n The sequence is a series of 24-bit integers, x_n,\n 00008\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-229\n-\n-\f230\n-\n-File Documentation\n-\n 00009\n x_n = d_n + b_n\n 00010\n 00011\n where d_n = x_{n-10} - x_{n-24} - c_{n-1}, b_n = 0 if d_n >= 0 and\n 00012\n b_n = 2^24 if d_n < 0, c_n = 0 if d_n >= 0 and c_n = 1 if d_n < 0,\n@@ -18728,36 +21207,36 @@\n reduce correlations. By default p = 199, but can be increased to\n 00015\n 365.\n 00016\n The period of the generator is around 10^171.\n 00017\n 00018\n-00019\n From: M. Luescher, \"A portable high-quality random number generator\n+00019\n 00020\n for lattice field theory calculations\", Computer Physics\n 00021\n Communications, 79 (1994) 100-110.\n 00022\n 00023\n Available on the net as hep-lat/9309020 at http://xxx.lanl.gov/\n 00024\n-See also,\n 00025\n+See also,\n 00026\n-F. James, \"RANLUX: A Fortran implementation of the high-quality\n 00027\n+F. James, \"RANLUX: A Fortran implementation of the high-quality\n 00028\n pseudo-random number generator of Luscher\", Computer Physics\n 00029\n Communications, 79 (1994) 111-114\n 00030\n-00031\n Kenneth G. Hamilton, F. James, \"Acceleration of RANLUX\", Computer\n+00031\n 00032\n Physics Communications, 101 (1997) 241-248\n 00033\n Kenneth G. Hamilton, \"Assembler RANLUX for PCs\", Computer Physics\n 00034\n 00035\n Communications, 101 (1997) 249-253 */\n@@ -18774,38 +21253,43 @@\n 00045 //-----------------------------00046 typedef struct {\n 00047\n unsigned int i;\n unsigned int j;\n 00048\n 00049\n unsigned int n;\n-00050\n unsigned int skip;\n-unsigned int carry;\n+00050\n 00051\n-00052\n+unsigned int carry;\n unsigned long int u[24];\n+00052\n 00053 } ranlux_state_t;\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 //--------------------------------------00063 static inline unsigned long int increment_state(){\n-00064\n unsigned int i = local_ranlux_state.i;\n-unsigned int j = local_ranlux_state.j;\n+00064\n 00065\n-00066\n+unsigned int j = local_ranlux_state.j;\n long int delta = local_ranlux_state.u[j] - local_ranlux_state.u[i]\n+00066\n 00067\n - local_ranlux_state.carry;\n 00068\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.34 ranlux.cpp\n+\n 00069\n if (delta & mask_hi){\n 00070\n local_ranlux_state.carry = 1;\n 00071\n delta &= mask_lo;\n 00072\n@@ -18826,61 +21310,56 @@\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 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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.26 ranlux.cpp\n-\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-00107\n /* This is the initialization algorithm of F. James, widely in use\n+00107\n 00108\n 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@@ -18910,78 +21389,79 @@\n 00128\n }\n 00129 }\n 00130\n 00131\n 00132 // generator initialization\n 00133 //-------------------------00134 void ranlux_init(){\n-// seed the generator\n 00135\n+// seed the generator\n 00136\n ranlux_set(0);\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-unsigned int i;\n 00149\n+unsigned int i;\n 00150\n local_ranlux_state.n = 0;\n-00151\n for (i = 0; i < skip; i++)\n+00151\n 00152\n increment_state();\n 00153\n }\n 00154\n-return r;\n 00155\n+return r;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+249\n+\n+\f250\n+\n+File Documentation\n+\n 00156 }\n 00157\n 00158 // print generator state\n 00159 //----------------------00160 void ranlux_print_state(){\n-size_t i;\n 00161\n-00162\n+size_t i;\n unsigned char *p = (unsigned char *) (&local_ranlux_state);\n-00163\n+00162\n const size_t n = sizeof (ranlux_state_t);\n+00163\n 00164\n for (i=0;i= 0 and\n 00011\n+where d_n = x_{n-10} - x_{n-24} - c_{n-1}, b_n = 0 if d_n >= 0 and\n 00012\n b_n = 2^24 if d_n < 0, c_n = 0 if d_n >= 0 and c_n = 1 if d_n < 0,\n 00013\n where after 24 samples a group of p integers are \"skipped\", to\n 00014\n reduce correlations. By default p = 199, but can be increased to\n 00015\n 365.\n 00016\n 00017\n The period of the generator is around 10^171.\n 00018\n-00019\n From: M. Luescher, \"A portable high-quality random number generator\n+00019\n 00020\n for lattice field theory calculations\", Computer Physics\n 00021\n Communications, 79 (1994) 100-110.\n 00022\n Available on the net as hep-lat/9309020 at http://xxx.lanl.gov/\n 00023\n@@ -19069,16 +21550,16 @@\n 00027\n F. James, \"RANLUX: A Fortran implementation of the high-quality\n 00028\n pseudo-random number generator of Luscher\", Computer Physics\n 00029\n Communications, 79 (1994) 111-114\n 00030\n-00031\n Kenneth G. Hamilton, F. James, \"Acceleration of RANLUX\", Computer\n+00031\n 00032\n Physics Communications, 101 (1997) 241-248\n 00033\n 00034\n Kenneth G. Hamilton, \"Assembler RANLUX for PCs\", Computer Physics\n 00035\n Communications, 101 (1997) 249-253 */\n@@ -19090,40 +21571,48 @@\n 00043 unsigned long int ranlux_get();\n 00044\n 00046 void ranlux_print_state();\n 00047\n 00048 }\n 00049 #endif\n \n-5.29 reference.cpp\n+5.37 reference.cpp\n 00001\n 00002 // File: reference.cpp\n-//\n 00003 // Description: source file for checkxor management (Creference 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+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n //\n+\n+\f252\n+\n+File Documentation\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@@ -19142,23 +21631,14 @@\n 00024 // $Date:: 2011-10-05 23:27:09 +0200 (Wed, 05 Oct 2011)\n $//\n 00026\n 00027 #include \"reference.h\"\n 00028 #include \"ranlux.h\"\n 00029 #include \n 00030\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-233\n-\n-\f234\n-\n-File Documentation\n-\n 00031 namespace siscone{\n 00032\n 00033 /*******************************************************\n 00034 * Creference implementation\n *\n 00035 * references used for checksums.\n *\n@@ -19177,34 +21657,34 @@\n 00043\n 00044 // default constructor\n 00046 Creference::Creference(){\n 00047\n ref[0] = ref[1] = ref[2] = 0;\n 00048 }\n 00049\n-//static unsigned int reference_bit = 1;\n 00050\n+//static unsigned int reference_bit = 1;\n 00051\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-00060\n unsigned int r1 = ranlux_get();\n+00060\n 00061\n unsigned int r2 = ranlux_get();\n unsigned int r3 = ranlux_get();\n 00062\n 00063\n unsigned int r4 = ranlux_get();\n-// since ranlux only produces 24 bits, take r4 and add 8 bits\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@@ -19212,16 +21692,16 @@\n 00069\n if (is_empty()) randomize();\n 00070\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 00082\n return (ref[0]!=0) || (ref[1]!=0) || (ref[2]!=0);\n 00083 }\n@@ -19230,59 +21710,60 @@\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 return tmp+=r;\n 00099 }\n 00100\n 00101 // incrementation of reference\n-00102 //----------------------------00103 Creference& Creference::operator += (const Creference &r){\n+00102 //-----------------------------\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.38 reference.h\n+\n+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 00116\n 00117 }\n 00118\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.30 reference.h\n-\n 00119 }\n 00120\n \n-5.30 reference.h\n+5.38 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@@ -19368,14 +21849,23 @@\n 00079 bool operator == (const Creference &r1, const Creference &r2);\n 00080\n 00082 bool operator != (const Creference &r1, const Creference &r2);\n 00083\n 00085 bool operator < (const Creference &r1, const Creference &r2);\n 00086\n 00087\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+253\n+\n+\f254\n+\n+File Documentation\n+\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 00094 }\n@@ -19383,190 +21873,32 @@\n 00096 // difference test for two references\n 00097 //---------------------------------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 //----------------------------------\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-235\n-\n-\f236\n-\n-File Documentation\n-\n-00104 inline bool operator < (const Creference &r1, const Creference &r2){\n-return (r1.ref[0]\n-00032 #include\n-00033\n-00034 namespace siscone{\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.33 geom_2d.cpp\n-\n-00035\n-00038 class Csiscone_error {\n-00039 public:\n-00041\n-Csiscone_error() {;};\n-00042\n-00045\n-Csiscone_error(const std::string & message_in) {\n-00046\n-m_message = message_in;\n-if (m_print_errors) std::cerr \u00ab \"siscone::Csiscone_error: \"\u00ab message_in \u00ab std::endl;\n-00047\n-00048\n-};\n-00049\n-00051\n-std::string message() const {return m_message;};\n-00052\n-static void setm_print_errors(bool print_errors) {\n-00055\n-00056\n-m_print_errors = print_errors;};\n-00057\n-00058 private:\n-00059\n-std::string m_message;\n-static bool m_print_errors;\n-00060\n-00061 };\n-00062\n-00063 }\n-00064 #endif\n-\n-5.33 geom_2d.cpp\n+5.39 siscone.cpp\n 00001\n //\n-00002 // File: geom_2d.cpp\n-00003 // Description: source file for two-dimensional geometry tools\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 // For more details, see http://projects.hepforge.org/siscone\n //\n 00006 //\n //\n@@ -19597,2699 +21929,227 @@\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+00023 // $Revision:: 403\n $//\n-00024 // $Date:: 2007-06-19 16:26:05 +0200 (Tue, 19 Jun 2007)\n+00024 // $Date:: 2016-05-19 16:52:05 +0200 (Thu, 19 May 2016)\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+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+00033 #include \n+00034 #include \n+00035 #include \n+00036\n+00037 namespace siscone{\n+00038 using namespace std;\n+00039\n+00040 /***************************************************************\n+00041 * Csiscone implementation\n *\n-00036 * class for holding a covering range in eta-phi\n+00042 * final class: gather everything to compute the jet contents. *\n+00043 *\n *\n-00037 *\n+00044 * This is the class user should use.\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+00045 * It computes the jet contents of a list of particles\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+00046 * given a cone radius and a threshold for splitting/merging. *\n+00047 ***************************************************************/\n+00048\n+00049 // default ctor\n+00050 //-------------00051 Csiscone::Csiscone(){\n+00052\n+rerun_allowed = false;\n+00053 }\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+00055 // default dtor\n+00056 //--------------\n \n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n-237\n-\n-\f238\n-\n-File Documentation\n+\f5.39 siscone.cpp\n \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-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-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+00057 Csiscone::~Csiscone(){\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+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+minimum pT of the protojets\n+00072 * - _ptmin\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+00078 **********************************************************************/\n+00079 int Csiscone::compute_jets(vector &_particles, double _radius, double _f,\n+int _n_pass_max, double _ptmin,\n+00080\n 00081\n-xmax = phi_in_range(c_phi+R);\n+Esplit_merge_scale _split_merge_scale){\n 00082\n+_initialise_if_needed();\n 00083\n-cell_min = get_phi_cell(xmin);\n+// run some general safety tests (NB: f will be checked in split-merge)\n 00084\n-cell_max = get_phi_cell(xmax);\n 00085\n-// Also, if the interval goes through pi, inversion is needed\n+if (_radius <= 0.0 || _radius >= 0.5*M_PI) {\n 00086\n+ostringstream message;\n 00087\n-if (xmax>xmin)\n+message \u00ab \"Illegal value for cone radius, R = \" \u00ab _radius\n 00088\n-phi_range = (cell_max-cell_min)+cell_max;\n+\u00ab \" (legal values are 00) && (_n_pass_max!=0));\n+00136\n+00137\n+rerun_allowed = true;\n+00138\n+// split & merge\n 00139\n-Ceta_phi_range tmp;\n 00140\n-00141\n-// compute union in eta\n+return perform(_f, _ptmin);\n+00141 }\n 00142\n-tmp.eta_range = r1.eta_range | r2.eta_range;\n 00143\n-00144\n-// compute union in phi\n-00145\n-tmp.phi_range = r1.phi_range | r2.phi_range;\n-00146\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.34 geom_2d.cpp\n-\n-00147\n-return tmp;\n-00148 }\n-00149\n-00150 }\n-\n-5.34 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 // 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-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-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-// determination of the eta range\n-00066\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-unsigned int cell_min = get_theta_cell(xmin);\n-00071\n-00072\n-unsigned int cell_max = get_theta_cell(xmax);\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-239\n-\n-\f240\n-\n-File Documentation\n-\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-while (ymin<-M_PI) ymin+=twopi;\n-00096\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-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-00146\n-return 0;\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.35 hash.cpp\n-\n-241\n-\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.35 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-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:: 225\n-$//\n-00024 // $Date:: 2008-05-20 16:59:47 +0200 (Tue, 20 May 2008)\n-$//\n-00026\n-00027 #include \n-00028 #include \n-00029 #include \"hash.h\"\n-00030 #include \n-00031\n-00032 namespace siscone{\n-00033\n-00034 using namespace std;\n-00035\n-00036 /**************************************************************\n-00037 * implementation of hash_cones\n-*\n-00038 * list of cones candidates.\n-*\n-00039 * We store in this class all the hash_elements and give\n-*\n-00040 * functions to manipulate them.\n-*\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-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-00053 #endif\n-00054\n-00055\n-// determine hash size\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-int nbits = (int) (log(_Np*_R2*_Np/4.0)/log(2.0));\n-00060\n-if (nbits<1) nbits=1;\n-00061\n-mask = 1 \u00ab nbits;\n-00062\n-00063\n-// create hash\n-00064\n-hash_array = new hash_element*[mask];\n-00065\n-mask--;\n-00066\n-// set the array to 0\n-00067\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f242\n-\n-File Documentation\n-\n-00068\n-//? needed ?\n-00069\n-for (i=0;inext;\n-delete elm;\n-00085\n-00086\n-}\n-00087\n-}\n-00088\n-delete[] hash_array;\n-00089\n-00090 }\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-child particle defining the cone\n-00097 * - child\n-00098 * - p_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-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-00105\n-// check the array cell corresponding to our reference\n-00106\n-00107\n-elm = hash_array[index];\n-00108\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-// if it is not present, add it\n-00116\n-if (elm==NULL){\n-// create element\n-00117\n-00118\n-elm = new hash_element;\n-00119\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-00124\n-//compute vectors centre\n-00125\n-00126\n-v->build_etaphi();\n-00127\n-elm->eta = v->eta;\n-00128\n-elm->phi = v->phi;\n-00129\n-// if at least one of the two is_inside tests gives a result != from the expected,\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-00132\n-//cout \u00ab \"-- new status of \" \u00ab v->ref[0] \u00ab \":\" \u00ab elm->is_stable \u00ab endl;\n-00133\n-00134\n-// update hash\n-00135\n-elm->next = hash_array[index];\n-00136\n-hash_array[index] = elm;\n-00137\n-00138\n-n_cones++;\n-return 0;\n-00139\n-00140\n-}\n-00141\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-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-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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.36 hash.cpp\n-\n-243\n-\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-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-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-do{\n-00178\n-00179\n-// if it is not present, add it\n-00180\n-if (elm==NULL){\n-00181\n-// create element\n-00182\n-elm = new hash_element;\n-00183\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-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-00193\n-elm->next = hash_array[index];\n-00194\n-hash_array[index] = elm;\n-00195\n-00196\n-n_cones++;\n-return 0;\n-00197\n-00198\n-}\n-00199\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-00203\n-}\n-00204\n-00205\n-elm = elm->next;\n-00206\n-} while (1);\n-00207\n-return 1;\n-00208\n-00209 }\n-00210\n-00211 /*\n-00212 * test if a particle is inside a cone of given centre.\n-00213 * check if the particle of coordinates \u2019v\u2019 is inside the circle of radius R\n-00214 * centered at \u2019centre\u2019.\n-centre of the circle\n-00215 * - centre\n-00216 * - v\n-particle to test\n-00217 * return true if inside, false if outside\n-00218 ******************************************************************************/\n-00219 inline bool hash_cones::is_inside(Cmomentum *centre, Cmomentum *v){\n-double dx, dy;\n-00220\n-00221\n-00222\n-dx = centre->eta - v->eta;\n-00223\n-dy = fabs(centre->phi - v->phi);\n-00224\n-if (dy>M_PI)\n-00225\n-dy -= 2.0*M_PI;\n-00226\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-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-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-00056\n-// determine hash size\n-00057\n-00058\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-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-// set the array to 0\n-00069\n-00070\n-//? needed ?\n-00071\n-for (i=0;inext;\n-00088\n-delete elm;\n-00089\n-}\n-00090\n-}\n-00091\n-00092\n-delete[] hash_array;\n-\n-//\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.36 hash.cpp\n-\n-245\n-\n-00093 }\n-00094\n-00095\n-00096 /*\n-00097 * insert a new candidate into the hash.\n-4-momentum of the cone to add\n-00098 * - v\n-00099 * - parent parent particle defining the cone\n-child particle defining the cone\n-00100 * - child\n-00101 * - p_io\n-whether the parent has to belong to the cone or not\n-00102 * - c_io\n-whether the child has to belong to the cone or not\n-00103 * return 0 on success, 1 on error\n-00104 ***********************************************************************/\n-00105 int sph_hash_cones::insert(CSphmomentum *v, CSphmomentum *parent, CSphmomentum *child, bool p_io, bool\n-c_io){\n-00106\n-sph_hash_element *elm;\n-00107\n-int index = (v->ref.ref[0]) & mask;\n-00108\n-// check the array cell corresponding to our reference\n-00109\n-00110\n-elm = hash_array[index];\n-00111\n-00112 #ifdef DEBUG_STABLE_CONES\n-00113\n-if (elm==NULL)\n-00114\n-n_occupied_cells++;\n-00115 #endif\n-00116\n-do{\n-00117\n-00118\n-// if it is not present, add it\n-00119\n-if (elm==NULL){\n-00120\n-// create element\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-00125\n-//\n-through CSphmomentum::build_thetaphi.\n-00126\n-elm->centre = *v;\n-00127\n-// if at least one of the two is_closer tests gives a result != from the expected,\n-00128\n-00129\n-// the || will be true hence !(...) false as wanted\n-00130\n-elm->is_stable = !((is_closer(v, parent, tan2R)^p_io)||(is_closer(v, child, tan2R)^c_io));\n-//cout \u00ab \"-- new status of \" \u00ab v->ref[0] \u00ab \":\" \u00ab elm->is_stable \u00ab endl;\n-00131\n-00132\n-00133\n-// update hash\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-00139\n-}\n-00140\n-00141\n-// if the cone is already there, simply update stability status\n-00142\n-if (v->ref == elm->centre.ref){\n-// there is only an update to perform to see if the cone is still stable\n-00143\n-00144\n-if (elm->is_stable){\n-00145\n-elm->is_stable = !((is_closer(v, parent, tan2R)^p_io)||(is_closer(v, child, tan2R)^c_io));\n-//cout \u00ab \" parent/child: \"\n-00146\n-00147\n-//\n-\u00ab parent->ref[0] \u00ab \":\" \u00ab is_closer(v, parent) \u00ab \":\" \u00ab p_io \u00ab \" \"\n-00148\n-//\n-\u00ab child->ref[0] \u00ab \":\" \u00ab is_closer(v, child) \u00ab \":\" \u00ab c_io \u00ab endl;\n-00149\n-//cout \u00ab \"-- rep status of \" \u00ab v->ref[0] \u00ab \":\" \u00ab elm->is_stable \u00ab endl;\n-00150\n-//cout \u00ab v->eta \u00ab \" \" \u00ab v->phi \u00ab endl;\n-00151\n-//cout \u00ab (child->eta) \u00ab \" \" \u00ab child->phi \u00ab endl;\n-00152\n-}\n-return 0;\n-00153\n-00154\n-}\n-00155\n-00156\n-elm = elm->next;\n-00157\n-} while (1);\n-00158\n-00159\n-return 1;\n-00160 }\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-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-int index = (v->ref.ref[0]) & mask;\n-00171\n-00172\n-//cout \u00ab \"-- stable candidate: \" \u00ab v->ref[0] \u00ab \":\" \u00ab endl;\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-// if it is not present, add it\n-00177\n-00178\n-if (elm==NULL){\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f246\n-\n-File Documentation\n-\n-00179\n-// create element\n-00180\n-elm = new sph_hash_element;\n-00181\n-00182\n-// set its varibles\n-00183\n-// Note: at this level, eta and phi have already been computed\n-00184\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-00189\n-elm->next = hash_array[index];\n-00190\n-hash_array[index] = elm;\n-00191\n-00192\n-n_cones++;\n-return 0;\n-00193\n-00194\n-}\n-00195\n-// if the cone is already there, we have nothing to do\n-00196\n-00197\n-if (v->ref == elm->centre.ref){\n-00198\n-return 0;\n-00199\n-}\n-00200\n-00201\n-elm = elm->next;\n-00202\n-} while (1);\n-00203\n-return 1;\n-00204\n-00205 }\n-00206\n-00207 }\n-\n-5.37 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-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:: 123\n-$//\n-00024 // $Date:: 2007-03-01 02:52:16 +0100 (Thu, 01 Mar 2007)\n-$//\n-00026\n-00027 #include \"momentum.h\"\n-00028 #include \n-00029 #include \n-00030\n-00031 namespace siscone{\n-00032\n-00033 /*************************************************************************\n-00034 * class Cmomentum\n-*\n-00035 * This class contains the information for particle or group of\n-*\n-00036 * particles management.\n-*\n-00037 * It includes all Lorentz properties as well as tools for summing them. *\n-00038 *************************************************************************/\n-00039\n-00040 // default ctor\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-00046\n-ref = Creference();\n-00047\n-index = -1;\n-00048 }\n-00049\n-00050 // ctor with initialisation\n-00051 //-------------------------00052 Cmomentum::Cmomentum(double _px, double _py, double _pz, double _E){\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.37 momentum.cpp\n-\n-00053\n-px = _px;\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-00059\n-build_etaphi();\n-00060\n-ref = Creference();\n-00061 }\n-00062\n-00063 // ctor with detailed initialisation\n-00064 //----------------------------------00065 Cmomentum::Cmomentum(double _eta, double _phi, Creference _ref){\n-00066\n-eta = _eta;\n-00067\n-phi = _phi;\n-00068\n-00069\n-ref = _ref;\n-00070 }\n-00071\n-00072 // default dtor\n-00073 //-------------00074 Cmomentum::~Cmomentum(){\n-00075\n-00076 }\n-00077\n-00078 // assignment of vectors\n-00079 //----------------------00080 Cmomentum& Cmomentum::operator = (const Cmomentum &v){\n-00081\n-px = v.px;\n-00082\n-py = v.py;\n-00083\n-pz = v.pz;\n-00084\n-E = v.E;\n-00085\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-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-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-00106\n-py+=v.py;\n-00107\n-pz+=v.pz;\n-00108\n-E +=v.E;\n-00109\n-00110\n-ref+=v.ref;\n-00111\n-00112\n-return *this;\n-00113 }\n-00114\n-00115 // incrementation of vectors\n-00116 // !!! WARNING !!! no updating of eta and phi !!!\n-00117 //-----------------------------------------------00118 Cmomentum& Cmomentum::operator -= (const Cmomentum &v){\n-00119\n-px-=v.px;\n-00120\n-py-=v.py;\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-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-00133 //-------------------------------------------------00134 void Cmomentum::build_etaphi(){\n-// note: the factor n (ref.nb) cancels in all expressions !!\n-00135\n-00136\n-eta = 0.5*log((E+pz)/(E-pz));\n-00137\n-phi = atan2(py,px);\n-00138 }\n-00139\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-247\n-\n-\f248\n-\n-File Documentation\n-\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-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-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-00158 }\n-00159\n-00160 }\n-00161\n-\n-5.38 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-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:: 255\n-$//\n-00026 // $Date:: 2008-07-12 17:40:35 +0200 (Sat, 12 Jul 2008)\n-$//\n-00028\n-00029 #include \"momentum.h\"\n-00030 #include \n-00031 #include \n-00032\n-00033 namespace siscone_spherical{\n-00034\n-00035 /*************************************************************************\n-00036 * class CSph3vector\n-*\n-00037 * This class contains the information for particle or group of\n-*\n-00038 * particles management.\n-*\n-00039 *************************************************************************/\n-00040\n-00041 // default ctor\n-00042 //-------------00043 CSph3vector::CSph3vector(){\n-00044\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-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-pz = _pz;\n-00055\n-00056\n-// compute the norm\n-00057\n-build_norm();\n-00058\n-00059\n-ref = siscone::Creference();\n-\n-//\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.38 momentum.cpp\n-\n-00060 }\n-00061\n-00062 // default dtor\n-00063 //-------------00064 CSph3vector::~CSph3vector(){\n-00065\n-00066 }\n-00067\n-00068\n-00069 // assignment of vectors\n-00070 //----------------------00071 CSph3vector& CSph3vector::operator = (const CSph3vector &v){\n-00072\n-px = v.px;\n-00073\n-py = v.py;\n-00074\n-pz = v.pz;\n-00075\n-00076\n-_norm = v._norm;\n-00077\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-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-return tmp+=v;\n-00089 }\n-00090\n-00091 // subtraction of vectors\n-00092 //-----------------------------------------------00093 const CSph3vector CSph3vector::operator - (const CSph3vector &v){\n-00094\n-CSph3vector tmp = *this;\n-00095\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-00102\n-return tmp/=r;\n-00103 }\n-00104\n-00105 // incrementation\n-00106 //-----------------------------------------------00107 CSph3vector& CSph3vector::operator += (const CSph3vector &v){\n-00108\n-px+=v.px;\n-00109\n-py+=v.py;\n-00110\n-pz+=v.pz;\n-00111\n-return *this;\n-00112\n-00113 }\n-00114\n-00115 // decrementation\n-00116 //-----------------------------------------------00117 CSph3vector& CSph3vector::operator -= (const CSph3vector &v){\n-00118\n-px-=v.px;\n-00119\n-py-=v.py;\n-00120\n-pz-=v.pz;\n-00121\n-00122\n-return *this;\n-00123 }\n-00124\n-00125 // multiplication by a constant\n-00126 //-----------------------------------------------00127 CSph3vector& CSph3vector::operator *= (const double &r){\n-00128\n-px*=r;\n-00129\n-py*=r;\n-00130\n-pz*=r;\n-00131\n-return *this;\n-00132\n-00133 }\n-00134\n-00135 // division by a constant\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-00145 }\n-00146\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-249\n-\n-\f250\n-\n-File Documentation\n-\n-00147 // build norm from 3-momentum info\n-00148 void CSph3vector::build_norm(){\n-00149\n-_norm = norm();\n-00150 }\n-00151\n-00152 // build norm from 3-momentum info\n-00153 void CSph3vector::build_thetaphi(){\n-00154\n-_theta = theta();\n-00155\n-_phi = phi();\n-00156 }\n-00157\n-00158\n-00159 // for this direction, compute the two reference directions\n-00160 // used to measure angles\n-00161 void CSph3vector::get_angular_directions(CSph3vector &angular_dir1, CSph3vector &angular_dir2){\n-00162\n-if (px < py){\n-if (pz < px){\n-00163\n-00164\n-// z smallest\n-00165\n-angular_dir1 = CSph3vector(-py, px, 0.0);\n-00166\n-} else {\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-// z smallest\n-00172\n-00173\n-angular_dir1 = CSph3vector(-py, px, 0.0);\n-00174\n-} else {\n-00175\n-// y smallest\n-00176\n-angular_dir1 = CSph3vector(-pz, 0.0, px);\n-00177\n-}\n-00178\n-}\n-00179\n-angular_dir2 = cross_product3(*this, angular_dir1);\n-00180\n-// We\u2019ll simply take x & y so the reflection symmetry is not broken\n-00181\n-//angular_dir1 = CSph3vector(0.0, -pz, py);\n-00182\n-//angular_dir2 = CSph3vector(-pz, 0.0, -px);\n-00183 }\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-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-E=0.0;\n-00196\n-index = -1;\n-00197 }\n-00198\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-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-: CSph3vector(_v.px, _v.py, _v.pz) {\n-00213\n-E = _E;\n-00214 }\n-00215\n-00216 // default dtor\n-00217 //-------------00218 CSphmomentum::~CSphmomentum(){\n-00219\n-00220 }\n-00221\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-pz = v.pz;\n-00228\n-E = v.E;\n-00229\n-00230\n-_norm = v._norm;\n-00231\n-_theta = v._theta;\n-00232\n-_phi\n-= v._phi;\n-00233\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.39 protocones.h\n-\n-251\n-\n-00234\n-ref = v.ref;\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-00243\n-return tmp+=v;\n-00244 }\n-00245\n-00246 // incrementation of vectors\n-00247 // !!! WARNING !!! no updating of eta and phi !!!\n-00248 //-----------------------------------------------00249 CSphmomentum& CSphmomentum::operator += (const CSphmomentum &v){\n-00250\n-px+=v.px;\n-00251\n-py+=v.py;\n-00252\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-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-00265\n-py-=v.py;\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-00271 }\n-00272\n-00273\n-00274 // ordering of two vectors\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-00282 //----------------------------------------------------------00283 bool momentum_theta_less(const CSphmomentum &v1, const CSphmomentum &v2){\n-00284\n-return v1._theta < v2._theta;\n-00285 }\n-00286\n-00287 // ordering of vectors in pt\n-00288 //--------------------------00289 bool momentum_pt_less(const CSphmomentum &v1, const CSphmomentum &v2){\n-return v1.perp2() < v2.perp2();\n-00290\n-00291 }\n-00292\n-00293 }\n-00294\n-\n-5.39 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-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-00014 //\n-00015 // This program is distributed in the hope that it will be useful,\n-00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of\n-00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n-00018 // GNU General Public License for more details.\n-00019 //\n-00020 // You should have received a copy of the GNU General Public License\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-//\n-\n-\f252\n-\n-File Documentation\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:: 224\n-$//\n-00025 // $Date:: 2008-05-16 19:58:30 +0200 (Fri, 16 May 2008)\n-$//\n-00027\n-00028 #ifndef __PROTOCONES_H__\n-00029 #define __PROTOCONES_H__\n-00030\n-00031 #include \"momentum.h\"\n-00032 #include \"vicinity.h\"\n-00033 #include \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-00063\n-bool\n-is_in;\n-00064 };\n-00065\n-00066\n-00069 inline bool operator<(const Cborder_store & a, const Cborder_store & b) {\n-00070\n-return a.angle < b.angle;\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-void init(std::vector &_particle_list);\n-00097\n-00098\n-00106\n-int get_stable_cones(double _radius);\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-unsigned int centre_idx;\n-00139\n-00140\n-unsigned int first_cone;\n-00142\n-00143\n-int init_cone();\n-00149\n-00150\n-int test_cone();\n-00157\n-00158\n-int update_cone();\n-00164\n-00165\n-00166\n-/*\n-00167\n-* run through the vicinity of the current parent and for each child\n-00168\n-* indicate which members are cocircular...\n-00169\n-*/\n-00170\n-void prepare_cocircular_lists();\n-00171\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.40 protocones.h\n-\n-253\n-\n-00179\n-bool cocircular_check();\n-00180\n-void test_cone_cocircular(Cmomentum & borderless_cone,\n-00185\n-00186\n-std::list & border_list);\n-00187\n-00194\n-void test_stability(Cmomentum & candidate,\n-const std::vector & border_vect);\n-00195\n-00196\n-void compute_cone_contents();\n-00203\n-00204\n-00210\n-void recompute_cone_contents();\n-00211\n-/*\n-00212\n-00213\n-* if we have gone beyond the acceptable threshold of change, compute\n-00214\n-* the cone momentum from particle list. in this version, we use the\n-00215\n-* \u2019pincluded\u2019 information from the Cvicinity class, but we don\u2019t\n-00216\n-* change the member cone, only the locally supplied one\n-00217\n-*/\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-00227\n-/*\n-00228\n-* circle intersection.\n-00229\n-* computes the intersection with a circle of given centre and radius.\n-00230\n-* The output takes the form of a checkxor of the intersection\u2019s particles\n-circle centre x coordinate\n-00231\n-* - cx\n-00232\n-circle centre y coordinate\n-* - cy\n-00233\n-* return the checkxor for the intersection\n-00234\n-******************************************************************/\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-00247\n-// information for updating cone contents to avoid rounding errors\n-00248\n-double dpt;\n-00249\n-00258\n-inline bool is_inside(Cmomentum *centre, Cmomentum *v);\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.40 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-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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-//\n-\n-\f254\n-\n-File Documentation\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-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-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-00122\n-int nb_tot;\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-unsigned int centre_idx;\n-00149\n-00150\n-unsigned int first_cone;\n-00152\n-00153\n-int init_cone();\n-00159\n-00160\n-00167\n-int test_cone();\n-00168\n-int update_cone();\n-00174\n-00175\n-/*\n-00176\n-00177\n-* run through the vicinity of the current parent and for each child\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.41 siscone.cpp\n-\n-00178\n-* indicate which members are cocircular...\n-00179\n-*/\n-00180\n-void prepare_cocircular_lists();\n-00181\n-bool cocircular_check();\n-00189\n-00190\n-void test_cone_cocircular(CSphmomentum & borderless_cone,\n-00195\n-00196\n-std::list & border_list);\n-00197\n-00204\n-void test_stability(CSphmomentum & candidate,\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\n-* if we have gone beyond the acceptable threshold of change, compute\n-00224\n-* the cone momentum from particle list. in this version, we use the\n-00225\n-* \u2019pincluded\u2019 information from the CSphvicinity class, but we don\u2019t\n-00226\n-* change the member cone, only the locally supplied one\n-00227\n-*/\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\n-* circle intersection.\n-00239\n-* computes the intersection with a circle of given centre and radius.\n-00240\n-* The output takes the form of a checkxor of the intersection\u2019s particles\n-00241\n-circle centre x coordinate\n-* - cx\n-circle centre y coordinate\n-00242\n-* - cy\n-00243\n-return\n-the\n-checkxor for the intersection\n-*\n-00244\n-******************************************************************/\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.41 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 // 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:: 403\n-$//\n-00024 // $Date:: 2016-05-19 16:52:05 +0200 (Thu, 19 May 2016)\n-$//\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-00033 #include \n \n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n 255\n \n \f256\n \n File Documentation\n \n-00034 #include \n-00035 #include \n-00036\n-00037 namespace siscone{\n-00038 using namespace std;\n-00039\n-00040 /***************************************************************\n-00041 * Csiscone implementation\n-*\n-00042 * final class: gather everything to compute the jet contents. *\n-00043 *\n-*\n-00044 * This is the class user should use.\n-*\n-00045 * It computes the jet contents of a list of particles\n-*\n-00046 * given a cone radius and a threshold for splitting/merging. *\n-00047 ***************************************************************/\n-00048\n-00049 // default ctor\n-00050 //-------------00051 Csiscone::Csiscone(){\n-00052\n-rerun_allowed = false;\n-00053 }\n-00054\n-00055 // default dtor\n-00056 //-------------00057 Csiscone::~Csiscone(){\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-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-list of particles\n-00068 * - _particles\n-00069 * - _radius\n-cone radius\n-shared energy threshold for splitting&merging\n-00070 * - _f\n-00071 * - _n_pass_max maximum number of runs\n-minimum pT of the protojets\n-00072 * - _ptmin\n-00073 * - _split_merge_scale\n-the scale choice for the split-merge procedure\n-00074 *\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-00075 *\n-00076 *\n-value.\n-00077 * return the number of jets found.\n-00078 **********************************************************************/\n-00079 int Csiscone::compute_jets(vector &_particles, double _radius, double _f,\n-int _n_pass_max, double _ptmin,\n-00080\n-00081\n-Esplit_merge_scale _split_merge_scale){\n-00082\n-_initialise_if_needed();\n-00083\n-00084\n-// run some general safety tests (NB: f will be checked in split-merge)\n-00085\n-if (_radius <= 0.0 || _radius >= 0.5*M_PI) {\n-00086\n-ostringstream message;\n-00087\n-message \u00ab \"Illegal value for cone radius, R = \" \u00ab _radius\n-00088\n-\u00ab \" (legal values are 00) && (_n_pass_max!=0));\n-00136\n-00137\n-rerun_allowed = true;\n-00138\n-// split & merge\n-00139\n-00140\n-return perform(_f, _ptmin);\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-00149 * - _radius\n cone radius\n+00149 * - _radius\n 00150 * - _n_pass_max maximum number of runs\n-00151 * - _ptmin\n minimum pT of the protojets\n-the ordering scale to decide which stable\n+00151 * - _ptmin\n 00152 * - _ordering_scale\n+the ordering scale to decide which stable\n 00153 *\n cone is removed\n 00154 * return the number of jets found.\n 00155 **********************************************************************/\n 00156 int Csiscone::compute_jets_progressive_removal(vector &_particles, double _radius,\n-00157\n int _n_pass_max, double _ptmin,\n+00157\n 00158\n Esplit_merge_scale _ordering_scale){\n 00159\n _initialise_if_needed();\n 00160\n // run some general safety tests (NB: f will be checked in split-merge)\n 00161\n@@ -22307,38 +22167,38 @@\n }\n 00168\n 00169\n ptcomparison.split_merge_scale = _ordering_scale;\n 00170\n partial_clear(); // make sure some things are initialised properly\n 00171\n-// init the split_merge algorithm with the initial list of particles\n 00172\n+// init the split_merge algorithm with the initial list of particles\n 00173\n // this initialises particle list p_left of remaining particles to deal with\n 00174\n //\n 00175\n // this stores the \"processed\" particles in p_uncol_hard\n 00176\n init_particles(_particles);\n 00177\n jets.clear();\n 00178\n-bool unclustered_left;\n 00179\n+bool unclustered_left;\n 00180\n rerun_allowed = false;\n 00181\n protocones_list.clear();\n 00182\n-00183\n do{\n-//cout \u00ab n_left \u00ab \" particle left\" \u00ab endl;\n+00183\n 00184\n+//cout \u00ab n_left \u00ab \" particle left\" \u00ab endl;\n 00185\n // initialise stable_cone finder\n 00186\n 00187\n // here we use the list of remaining particles\n 00188\n // AFTER COLLINEAR CLUSTERING !!!!!!\n@@ -22366,23 +22226,14 @@\n return jets.size();\n 00202 }\n 00203\n 00204\n 00205 /*\n 00206 * recompute the jets with a different overlap parameter.\n 00207 * we use the same particles and R as in the preceeding call.\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-257\n-\n-\f258\n-\n-File Documentation\n-\n shared energy threshold for splitting&merging\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 NOTE: using pt leads to IR unsafety for some events with momentum\n@@ -22411,34 +22262,41 @@\n 00225\n init_pleft();\n 00226\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-SISCone\n-version \" \u00ab setw(28) \u00ab left \u00ab siscone_version()\n 00252\n (*_banner_ostr) \u00ab \"#\n+SISCone\n+version \" \u00ab setw(28) \u00ab left \u00ab siscone_version()\n \u00ab \"o\" \u00ab endl;\n http://projects.hepforge.org/siscone\n o\" \u00ab endl;\n 00253\n (*_banner_ostr) \u00ab \"#\n 00254\n (*_banner_ostr) \u00ab \"#\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-o\" \u00ab endl;\n-o\" \u00ab endl;\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-o\" \u00ab endl;\n 00258\n (*_banner_ostr) \u00ab \"#\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 o\" \u00ab endl;\n 00260\n (*_banner_ostr) \u00ab \"# JHEP 05 (2007) 086 [arXiv:0704.0292 (hep-ph)].\n 00261\n@@ -22504,67 +22362,70 @@\n 00275 * return SISCone package name.\n 00276 * This is nothing but \"SISCone\", it is a replacement to the\n 00277 * SISCONE_PACKAGE_NAME string defined in config.h and which is not\n 00278 * guaranteed to be public.\n 00279 * return the SISCone name as a string\n 00280 */\n 00281 string siscone_package_name(){\n-return SISCONE_PACKAGE_NAME;\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 return SISCONE_VERSION;\n 00291\n 00292 }\n 00293\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.42 siscone.cpp\n-\n 00294 }\n \n-5.42 siscone.cpp\n+5.40 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+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n //\n+//\n+//\n+//\n+//\n+//\n+\n+\f258\n+\n+File Documentation\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@@ -22626,40 +22487,31 @@\n 00065\n 00066 /*\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-00072 * - _f\n+cone radius\n shared energy threshold for splitting&merging\n+00072 * - _f\n 00073 * - _n_pass_max maximum number of runs\n-00074 * - _Emin\n minimum energy of the protojets\n-the scale choice for the split-merge procedure\n+00074 * - _Emin\n 00075 * - _split_merge_scale\n+the scale choice for the split-merge procedure\n 00076 *\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 00077 *\n-value.\n 00078 *\n+value.\n 00079 * return the number of jets found.\n 00080 **********************************************************************/\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-259\n-\n-\f260\n-\n-File Documentation\n-\n 00081 int CSphsiscone::compute_jets(vector &_particles, double _radius, double _f,\n int _n_pass_max, double _Emin,\n 00082\n 00083\n Esplit_merge_scale _split_merge_scale){\n 00084\n // make sure things are initialised\n@@ -22691,16 +22543,23 @@\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-bool finished = false;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.40 siscone.cpp\n+\n+259\n+\n 00104\n+bool finished = false;\n 00105\n 00106\n rerun_allowed = false;\n 00107\n protocones_list.clear();\n 00108\n 00109 #ifdef DEBUG_STABLE_CONES\n@@ -22708,45 +22567,45 @@\n nb_hash_cones_total = 0;\n 00111\n nb_hash_occupied_total = 0;\n 00112 #endif\n 00113\n 00114\n do{\n-00115\n // initialise stable_cone finder\n+00115\n 00116\n // here we use the list of remaining particles\n 00117\n // AFTER COLLINEAR CLUSTERING !!!!!!\n 00118\n CSphstable_cones::init(p_uncol_hard);\n 00119\n // get stable cones\n 00120\n 00121\n if (get_stable_cones(_radius)){\n-00122\n // we have some new protocones.\n+00122\n 00123\n // add them to candidates\n 00124\n protocones_list.push_back(protocones);\n 00125\n add_protocones(&protocones, R2, _Emin);\n 00126 #ifdef DEBUG_STABLE_CONES\n 00127\n nb_hash_cones_total += nb_hash_cones;\n 00128\n nb_hash_occupied_total += nb_hash_occupied;\n 00129 #endif\n 00130\n } else {\n-00131\n // no new protocone: leave\n+00131\n 00132\n finished=true;\n 00133\n }\n 00134\n 00135\n _n_pass_max--;\n@@ -22762,56 +22621,49 @@\n return perform(_f, _Emin);\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-list of particles\n 00148 * - _particles\n-00149 * - _radius\n+list of particles\n cone radius\n+00149 * - _radius\n 00150 * - _n_pass_max maximum number of runs\n 00151 * - _Emin\n minimum energy of the protojets\n the ordering scale to decide which stable\n 00152 * - _ordering_scale\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-00157\n int _n_pass_max, double _Emin,\n+00157\n 00158\n Esplit_merge_scale _ordering_scale){\n-// make sure things are initialised\n 00159\n+// make sure things are initialised\n 00160\n _initialise_if_needed();\n 00161\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 00) && (_n_pass_max!=0));\n 00200\n-// split & merge\n 00201\n+// split & merge\n 00202\n return jets.size();\n 00203 }\n 00204 /*\n 00205 * recompute the jets with a different overlap parameter.\n 00206 * we use the same particles and R as in the preceeding call.\n 00207 * - _f\n shared energy threshold for splitting&merging\n-00208 * - _Emin\n minimum Energy of the protojets\n-the scale choice for the split-merge procedure\n+00208 * - _Emin\n 00209 * - _split_merge_scale\n-00210 *\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+00210 *\n 00211 *\n+conservation. So we strongly advise not to change the default\n 00212 *\n value.\n 00213 * return the number of jets found, -1 if recomputation not allowed.\n 00214 ********************************************************************/\n 00215 int CSphsiscone::recompute_jets(double _f, double _Emin,\n 00216\n Esplit_merge_scale _split_merge_scale){\n if (!rerun_allowed)\n 00217\n-00218\n return -1;\n+00218\n 00219\n 00220\n ptcomparison.split_merge_scale = _split_merge_scale;\n 00221\n-// restore particle list\n 00222\n+// restore particle list\n 00223\n partial_clear();\n 00224\n init_pleft();\n 00225\n-// initialise split/merge algorithm\n 00226\n+// initialise split/merge algorithm\n 00227\n unsigned int i;\n-00228\n for (i=0;i &_particles, double _radius, double _f,\n int _n_pass_max=0, double _ptmin=0.0,\n 00077\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 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@@ -23138,25 +22988,34 @@\n static bool init_done;\n 00121\n 00122 #ifdef DEBUG_STABLE_CONES\n 00123\n int nb_hash_cones_total, nb_hash_occupied_total;\n 00124 #endif\n 00125\n-static void set_banner_stream(std::ostream * ostr) {_banner_ostr = ostr;}\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+261\n+\n+\f262\n+\n+File Documentation\n+\n 00137\n+static void set_banner_stream(std::ostream * ostr) {_banner_ostr = ostr;}\n 00138\n static std::ostream * banner_stream() {return _banner_ostr;}\n 00143\n 00144\n 00145 private:\n 00146\n bool rerun_allowed;\n-00147\n static std::ostream * _banner_ostr;\n+00147\n 00148\n void _initialise_if_needed();\n 00150\n 00151\n 00152 };\n 00153\n 00154\n@@ -23166,15 +23025,15 @@\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.44 siscone.h\n+5.42 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@@ -23183,14 +23042,15 @@\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@@ -23224,41 +23084,32 @@\n 00030 #ifndef __SPH_SISCONE_H__\n 00031 #define __SPH_SISCONE_H__\n 00032\n 00033 #include \"protocones.h\"\n 00034 #include \"split_merge.h\"\n 00035\n 00036 namespace siscone_spherical{\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-//\n-\n-\f264\n-\n-File Documentation\n-\n 00037\n 00050 class CSphsiscone : public CSphstable_cones, public CSphsplit_merge{\n 00051 public:\n 00053\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+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@@ -23269,28 +23120,35 @@\n std::vector > protocones_list;\n 00115\n // random number initialisation\n 00116\n 00117\n static bool init_done;\n 00118\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.43 siscone_error.cpp\n+\n+263\n+\n 00119 #ifdef DEBUG_STABLE_CONES\n 00120\n int nb_hash_cones_total, nb_hash_occupied_total;\n 00121 #endif\n 00122\n static void set_banner_stream(std::ostream * ostr) {_banner_ostr = ostr;}\n 00134\n 00135\n-00140\n static std::ostream * banner_stream() {return _banner_ostr;}\n+00140\n 00141\n 00142 private:\n-bool rerun_allowed;\n 00143\n+bool rerun_allowed;\n 00144\n static std::ostream * _banner_ostr;\n 00145\n void _initialise_if_needed();\n 00147\n 00148\n 00149 };\n@@ -23302,14 +23160,165 @@\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.43 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+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:: 123\n+$//\n+00024 // $Date:: 2007-03-01 02:52:16 +0100 (Thu, 01 Mar 2007)\n+$//\n+00026\n+00027 #include \"siscone_error.h\"\n+00028\n+00029 namespace siscone{\n+00030\n+00031 bool Csiscone_error::m_print_errors = true;\n+00032\n+00033 }\n+\n+5.44 siscone_error.h\n+00001 // -*- C++ -*00003 // File: siscone_error.h\n+00004 // Description: header file for SISCone error messages (Csiscone_error)\n+00005 // This file is part of the SISCone project.\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+00014 //\n+00015 // This program is distributed in the hope that it will be useful,\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+\n+\f264\n+\n+File Documentation\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:: 327\n+$//\n+00025 // $Date:: 2011-11-25 15:19:39 +0100 (Fri, 25 Nov 2011)\n+$//\n+00027\n+00028 #ifndef __SISCONE_ERROR_H__\n+00029 #define __SISCONE_ERROR_H__\n+00030\n+00031 #include\n+00032 #include\n+00033\n+00034 namespace siscone{\n+00035\n+00038 class Csiscone_error {\n+00039 public:\n+00041\n+Csiscone_error() {;};\n+00042\n+00045\n+Csiscone_error(const std::string & message_in) {\n+00046\n+m_message = message_in;\n+if (m_print_errors) std::cerr \u00ab \"siscone::Csiscone_error: \"\u00ab message_in \u00ab std::endl;\n+00047\n+00048\n+};\n+00049\n+00051\n+std::string message() const {return m_message;};\n+00052\n+static void setm_print_errors(bool print_errors) {\n+00055\n+00056\n+m_print_errors = print_errors;};\n+00057\n+00058 private:\n+00059\n+std::string m_message;\n+static bool m_print_errors;\n+00060\n+00061 };\n+00062\n+00063 }\n+00064 #endif\n+\n 5.45 split_merge.cpp\n 00001\n 00002 // File: split_merge.cpp\n //\n 00003 // Description: source file for splitting/merging (contains the CJet class) //\n 00004 // This file is part of the SISCone project.\n //\n@@ -23357,30 +23366,30 @@\n $//\n 00026 // $Date:: 2016-03-03 11:06:52 +0100 (Thu, 03 Mar 2016)\n $//\n 00028\n 00029 #include \n 00030 #include \"split_merge.h\"\n 00031 #include \"momentum.h\"\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n 00032 #include \n // for max\n 00033 #include \n 00034 #include \n 00035 #include \n 00036 #include \n 00037 #include \n 00038\n 00039 namespace siscone_spherical{\n 00040\n 00041 using namespace std;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n 00042\n 00043 /********************************************************\n 00044 * class CSphjet implementation\n *\n 00045 * real Jet information.\n *\n 00046 * This class contains information for one single jet. *\n@@ -23410,16 +23419,16 @@\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@@ -23437,31 +23446,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-00099\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@@ -23475,41 +23484,41 @@\n // get the momentum of the difference\n 00116\n CSphmomentum difference;\n double E_tilde_difference;\n 00117\n 00118\n get_difference(jet1,jet2,&difference,&E_tilde_difference);\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-265\n-\n-\f266\n-\n-File Documentation\n-\n 00119\n-// use the following relation: pt1^2 - pt2^2 = (pt1+pt2)*(pt1-pt2)\n 00120\n+// use the following relation: pt1^2 - pt2^2 = (pt1+pt2)*(pt1-pt2)\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+// depending on the choice of ordering variable, set the result\n 00127\n switch (split_merge_scale){\n 00128\n case SM_Etilde:\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+265\n+\n+\f266\n+\n+File Documentation\n+\n 00129\n qdiff = E_tilde_sum*E_tilde_difference;\n break;\n 00130\n 00131\n case SM_E:\n 00132\n@@ -23532,26 +23541,26 @@\n 00141\n return res;\n 00142\n 00143 }\n 00144\n 00145\n 00148 std::string split_merge_scale_name(Esplit_merge_scale sms) {\n-00149\n switch(sms) {\n+00149\n 00150\n case SM_E:\n return \"E (IR unsafe for pairs of identical decayed heavy particles)\";\n 00151\n 00152\n case SM_Etilde:\n-return \"Etilde (sum of E.[1+sin^2(theta_{i,jet})])\";\n 00153\n-00154\n+return \"Etilde (sum of E.[1+sin^2(theta_{i,jet})])\";\n default:\n+00154\n 00155\n return \"[SM scale without a name]\";\n 00156\n }\n 00157 }\n 00158\n 00159\n@@ -23578,16 +23587,16 @@\n 00173\n *v = CSphmomentum();\n 00174\n *E_tilde = 0.0;\n 00175\n 00176\n CSph3vector jet1_axis = j1.v;\n-00177\n //jet1_axis /= j1.v._norm;\n+00177\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 00181\n@@ -23597,39 +23606,39 @@\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 if (j1.contents[i1]==j2.contents[i2]) {\n+00187\n 00188\n const CSphmomentum & p = (*particles)[j1.contents[i1]];\n 00189\n (*E_tilde) +=\n p.E*((norm2_cross_product3(p,jet1_axis)-norm2_cross_product3(p,jet2_axis))/(*particles_norm2)[j1.contents[i1]]);\n 00190\n i1++;\n 00191\n i2++;\n 00192\n } else if (j1.contents[i1]j2.contents[i2]){\n-00198\n const CSphmomentum &p = (*particles)[j2.contents[i2]];\n+00198\n 00199\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@@ -23637,48 +23646,48 @@\n 00203\n throw siscone::Csiscone_error(\"get_non_overlap reached part it should never have seen...\");\n 00204\n }\n 00205\n } while ((i1E;\n 00223 }\n 00224\n 00225\n 00226 /********************************************************\n 00227 * class CSphsplit_merge implementation\n@@ -23697,16 +23706,16 @@\n 00237 #endif\n 00238 #endif\n 00239\n _user_scale = NULL;\n 00240\n indices = NULL;\n 00241\n-00242\n // ensure that ptcomparison points to our set of particles (though params not correct)\n+00242\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@@ -23739,29 +23748,29 @@\n 00267 // - protocones list of protocones (initial jet candidates)\n 00268 // - R2\n cone radius (squared)\n 00269 // - Emin\n minimal energy allowed for jets\n 00270 //------------------------------------------------------------00271 int CSphsplit_merge::init(vector & /*_particles*/, vector *protocones,\n double R2, double Emin){\n-00272\n // browse protocones\n+00272\n 00273\n return add_protocones(protocones, R2, Emin);\n 00274 }\n 00275\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@@ -23771,40 +23780,40 @@\n // store the particle norm^2\n 00290\n particles_norm2.resize(n);\n for (int i=0;i(ptcomparison));\n 00368\n@@ -23926,33 +23935,33 @@\n 00375\n cand_refs.clear();\n 00376 #endif\n 00377\n 00378\n p_remain.clear();\n 00379\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n-269\n-\n-00380\n return 0;\n+00380\n 00381 }\n 00382\n 00383\n 00384 // full clearance\n 00385 //---------------00386 int CSphsplit_merge::full_clear(){\n 00387\n partial_clear();\n 00388\n 00389\n // clear previously allocated memory\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n+269\n+\n 00390\n if (indices != NULL){\n delete[] indices;\n 00391\n 00392\n }\n 00393\n@@ -23969,31 +23978,31 @@\n 00402 //------------------------------------------------------------------------00403 int CSphsplit_merge::merge_collinear_and_remove_soft(){\n 00404\n int i,j;\n 00405\n vector p_sorted;\n bool collinear;\n 00406\n-double dphi;\n 00407\n+double dphi;\n 00408\n 00409\n p_uncol_hard.clear();\n 00410\n // we first sort the particles according to their theta angle\n 00411\n 00412\n for (i=0;iM_PI) dphi = twopi-dphi;\n+00433\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f270\n-\n-File Documentation\n-\n-00466\n double tan2R;\n+00466\n 00467\n CSphjet jet;\n 00468\n 00469\n if (protocones->size()==0)\n-return 1;\n 00470\n+return 1;\n 00471\n 00472\n E_min = Emin;\n-00473\n double R = sqrt(R2);\n+00473\n 00474\n tan2R = tan(R);\n 00475\n tan2R *= tan2R;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f270\n+\n+File Documentation\n+\n 00476\n 00477 #ifdef DEBUG_SPLIT_MERGE\n 00478\n cout \u00ab \"particle list: \";\n-for (int i2=0;i2::iterator p_it = protocones->begin();p_it != protocones->end();p_it++){\n // initialise variables\n 00489\n 00490\n@@ -24137,16 +24146,16 @@\n jet.v = CSphmomentum();\n 00495\n jet.contents.clear();\n for (i=0;iparent_index);\n 00500\n jet.v+= *v;\n 00501\n v->index=0;\n 00502\n@@ -24185,16 +24194,16 @@\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 00524\n fprintf(stdout, \"\\t\");\n-00525\n unsigned int thetarange=jet.range.theta_range;\n+00525\n 00526\n for (unsigned int i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (thetarange&(1\u00abi2)) \u00bb i2);\n 00527\n fprintf(stdout, \"\\t\");\n 00528\n for (int i2=0;i2::iterator p_it = protocones->begin();p_it != protocones->end();p_it++){\n 00600\n // initialise variables\n 00601\n c = &(*p_it);\n 00602\n-// browse particles to create cone contents\n 00603\n+// browse particles to create cone contents\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@@ -24356,52 +24365,45 @@\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-// set the momentum in protocones\n 00622\n+// set the momentum in protocones\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 00631\n if (jet_candidate.v.Eis_larger(jet_candidate, jet)\n 00647\n : ptcomparison(jet_candidate, jet))){\n 00648\n jet = jet_candidate;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f272\n+\n+File Documentation\n+\n 00649\n found_jet = true;\n 00650\n }\n 00651\n }\n 00652\n@@ -24439,20 +24448,20 @@\n jets[jets.size()-1].v.build_norm();\n 00660\n 00661 #ifdef DEBUG_SPLIT_MERGE\n 00662\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+00665\n 00666\n int p_remain_index = 0;\n-00667\n int contents_index = 0;\n+00667\n 00668\n //sort(next_jet.contents.begin(),next_jet.contents.end());\n 00669\n for (int index=0;indexsize()==0)\n-return 0;\n 00723\n+return 0;\n 00724\n-00725\n if (overlap_tshold>=1.0 || overlap_tshold <= 0) {\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n+00725\n 00726\n ostringstream message;\n 00727\n message \u00ab \"Illegal value for overlap_tshold, f = \" \u00ab overlap_tshold;\n 00728\n message \u00ab \" (legal values are 0 merge\" \u00ab endl\u00abendl;\n 00782 #endif\n 00783\n // merge jets\n 00784\n merge(j1, j2);\n 00785\n-00786\n // update iterators\n+00786\n 00787\n j2 = j1 = candidates->begin();\n 00788\n j2_relindex = 0;\n 00789\n }\n 00790\n }\n-// watch out: split/merge might have caused new jets with E <\n 00791\n+// watch out: split/merge might have caused new jets with E <\n 00792\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+00799\n 00800\n // all \"second jet\" passed without overlapping\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 jets[jets.size()-1].v.build_thetaphi();\n 00805\n jets[jets.size()-1].v.build_norm();\n-00806\n // a bug where the contents has non-zero size has been cropping\n+00806\n 00807\n // up in many contexts -- so catch it!\n 00808\n assert(j1->contents.size() > 0);\n 00809\n jets[jets.size()-1].pass = particles[j1->contents[0]].index;\n 00810 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 00811\n cand_refs.erase(j1->v.ref);\n 00812 #endif\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-273\n-\n-\f274\n-\n-File Documentation\n-\n 00813\n candidates->erase(j1);\n 00814\n }\n 00815\n }\n 00816\n@@ -24726,14 +24726,23 @@\n 00818\n 00819\n sort(jets.begin(), jets.end(), jets_E_less);\n 00820 #ifdef DEBUG_SPLIT_MERGE\n 00821\n show();\n 00822 #endif\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+273\n+\n+\f274\n+\n+File Documentation\n+\n 00823\n return jets.size();\n 00824\n 00825 }\n 00826\n 00827\n 00828\n@@ -24748,16 +24757,16 @@\n 00835\n int i1, i2;\n 00836\n 00837\n fprintf(flux, \"# %d jets found\\n\", (int) jets.size());\n 00838\n fprintf(flux, \"# columns are: px, py, pz, E and number of particles for each jet\\n\");\n-00839\n for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n+00839\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 00843\n@@ -24793,115 +24802,115 @@\n 00861 //-----------------------------------00862 int CSphsplit_merge::show(){\n 00863\n jet_iterator it_j;\n 00864\n cjet_iterator it_c;\n 00865\n CSphjet *j;\n-const CSphjet *c;\n 00866\n-00867\n+const CSphjet *c;\n int i1, i2;\n+00867\n 00868\n for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n 00869\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+00874\n 00875\n for (i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (phirange&(1\u00abi2)) \u00bb i2 );\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 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 00883\n fprintf(stdout, \"\\n\");\n 00884\n }\n 00885\n-00886\n for (it_c = candidates->begin(), i1=0 ; it_c != candidates->end() ; it_c++, i1++){\n+00886\n 00887\n c = &(*it_c);\n 00888\n fprintf(stdout, \"cdt %2d: %e\\t%e\\t%e\\t%e\\t%e\\t\", i1+1,\n 00889\n c->v.px, c->v.py, c->v.pz, c->v.E, sqrt(c->sm_var2));\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+for (i2=0;i2<32;i2++) fprintf(stdout, \"%d\", (phirange&(1\u00abi2)) \u00bb i2 );\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 00895\n 00896\n fprintf(stdout, \"\\t\");\n 00897\n for (i2=0;i2n;i2++)\n 00898\n 00899\n fprintf(stdout, \"%d \", c->contents[i2]);\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n 00900\n fprintf(stdout, \"\\n\");\n 00901\n }\n 00902\n 00903\n fprintf(stdout, \"\\n\");\n-return 0;\n 00904\n+return 0;\n 00905 }\n 00906\n 00907\n 00908 // get the overlap between 2 jets\n 00909 // - j1\n first jet\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\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 //--------------------------------------------------------------------00914 bool CSphsplit_merge::get_overlap(const CSphjet &j1, const CSphjet &j2, double *overlap2){\n-00915\n // check if ranges overlap\n+00915\n 00916\n if (!is_range_overlap(j1.range,j2.range))\n 00917\n return false;\n 00918\n int i1,i2;\n 00919\n-bool is_overlap;\n 00920\n+bool is_overlap;\n 00921\n-00922\n // initialise\n+00922\n 00923\n i1=i2=idx_size=0;\n 00924\n is_overlap = false;\n 00925\n CSphmomentum v;\n 00926\n@@ -24954,29 +24963,29 @@\n indices[idx_size] = j1.contents[i1];\n 00951\n i1++;\n 00952\n idx_size++;\n 00953\n }\n-while (i2\" all over the place\n 00986\n 00987\n const CSphjet & j1 = * it_j1;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-275\n-\n-\f276\n-\n+const CSphjet & j2 = * it_j2;\n 00988\n 00989\n 00990\n+i1=i2=0;\n 00991\n+jet2.v = jet1.v = CSphmomentum();\n 00992\n 00993\n+// compute centroids\n 00994\n+// When use_E_weighted_splitting is activated, the\n 00995\n+// \"geometrical\" distance is weighted by the inverse\n 00996\n+// of the E of the protojet\n 00997\n+// This is stored in E{1,2}_weight\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+275\n+\n+\f276\n+\n+File Documentation\n+\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 01002\n+do{\n 01003\n+if (j1.contents[i1]_theta,v->_phi);\n 01011\n+} else if (j1.contents[i1]>j2.contents[i2]){\n 01012\n+// particle i2 belong only to jet 2\n 01013\n+v = &(particles[j2.contents[i2]]);\n 01014\n+jet2.contents.push_back(j2.contents[i2]);\n 01015\n+jet2.v += *v;\n+//jet2.pt_tilde += pt[j2.contents[i2]];\n 01016\n 01017\n+i2++;\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 01024\n+//? what when == ?\n 01025\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+double d2 = get_distance(&(j2.v), v)*E2_weight;\n 01030\n 01031\n+// do bookkeeping on most ambiguous split\n 01032\n+if (fabs(d1-d2) < most_ambiguous_split)\n 01033\n+most_ambiguous_split = fabs(d1-d2);\n 01034\n+if (d1_theta,v->_phi);\n 01041\n+} else {\n+// particle i2 belong only to jet 2\n 01042\n 01043\n+jet2.contents.push_back(j2.contents[i2]);\n 01044\n+jet2.v += *v;\n+//jet2.pt_tilde += pt[j2.contents[i2]];\n 01045\n 01046\n+jet2.range.add_particle(v->_theta,v->_phi);\n 01047\n+}\n 01048\n 01049\n+i1++;\n 01050\n+i2++;\n 01051\n+}\n 01052\n+} while ((i1_theta,v->_phi);\n 01061\n+}\n 01062\n+while (i2_theta,v->_phi);\n 01069\n+}\n 01070\n+// finalise jets\n 01071\n 01072\n-01073\n-01074\n-\n-File Documentation\n-\n-const CSphjet & j2 = * it_j2;\n-i1=i2=0;\n-jet2.v = jet1.v = CSphmomentum();\n-// compute centroids\n-// When use_E_weighted_splitting is activated, the\n-// \"geometrical\" distance is weighted by the inverse\n-// of the E of the protojet\n-// This is stored in E{1,2}_weight\n-E1_weight = (use_E_weighted_splitting) ? 1.0/j1.v.E/j1.v.E : 1.0;\n-E2_weight = (use_E_weighted_splitting) ? 1.0/j2.v.E/j2.v.E : 1.0;\n-// compute jet splitting\n-do{\n-if (j1.contents[i1]_theta,v->_phi);\n-} else if (j1.contents[i1]>j2.contents[i2]){\n-// particle i2 belong only to jet 2\n-v = &(particles[j2.contents[i2]]);\n-jet2.contents.push_back(j2.contents[i2]);\n-jet2.v += *v;\n-//jet2.pt_tilde += pt[j2.contents[i2]];\n-i2++;\n-jet2.range.add_particle(v->_theta,v->_phi);\n-} else { // (j1.contents[i1]==j2.contents[i2])\n-// common particle, decide which is the closest centre\n-v = &(particles[j1.contents[i1]]);\n-//TODO: improve this brutal use of atan2 and sqrt !!!!\n-//? what when == ?\n-// When use_E_weighted_splitting is activated, the\n-// \"geometrical\" distance is weighted by the inverse\n-// of the E of the protojet\n-double d1 = get_distance(&(j1.v), v)*E1_weight;\n-double d2 = get_distance(&(j2.v), v)*E2_weight;\n-// do bookkeeping on most ambiguous split\n-if (fabs(d1-d2) < most_ambiguous_split)\n-most_ambiguous_split = fabs(d1-d2);\n-if (d1_theta,v->_phi);\n-} else {\n-// particle i2 belong only to jet 2\n-jet2.contents.push_back(j2.contents[i2]);\n-jet2.v += *v;\n-//jet2.pt_tilde += pt[j2.contents[i2]];\n-jet2.range.add_particle(v->_theta,v->_phi);\n-}\n-i1++;\n-i2++;\n-}\n-} while ((i1_theta,v->_phi);\n-}\n-while (i2_theta,v->_phi);\n-}\n-// finalise jets\n jet1.n = jet1.contents.size();\n+01073\n jet2.n = jet2.contents.size();\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.45 split_merge.cpp\n-\n-01075\n+01074\n // now the jet axis is known, we can compute Etilde\n+01075\n 01076\n compute_Etilde(jet1);\n 01077\n compute_Etilde(jet2);\n 01078\n 01079\n // remove previous jets\n@@ -25201,62 +25204,67 @@\n 01081\n cand_refs.erase(j1.v.ref);\n 01082\n cand_refs.erase(j2.v.ref);\n 01083 #endif\n 01084\n candidates->erase(it_j1);\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.45 split_merge.cpp\n+\n 01085\n candidates->erase(it_j2);\n 01086\n-01087\n // reinsert new ones\n+01087\n 01088\n insert(jet1);\n 01089\n insert(jet2);\n 01090\n-01091\n return true;\n+01091\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 01104\n-01105\n // build new jet\n+01105\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 // remove old candidates\n 01119\n 01120 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 01121\n@@ -25269,16 +25277,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@@ -25289,24 +25297,24 @@\n 01143\n // same cone contents. We recall that this automatic merging of\n 01144\n // identical protocones can lead to infrared-unsafe situations.\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+01147\n 01148 #endif\n 01149\n 01150\n // check that the protojet has large enough energy\n 01151\n if (jet.v.E::iterator cont_it=jet.contents.begin(); cont_it!=jet.contents.end(); cont_it++){\n-01196\n const CSphmomentum &p = particles[*cont_it];\n+01196\n 01197\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 5.46 split_merge.cpp\n 00001\n-//\n 00002 // File: split_merge.cpp\n+//\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 // For more details, see http://projects.hepforge.org/siscone\n //\n 00006 //\n //\n@@ -25462,36 +25470,36 @@\n 00050 //-------------00051 Cjet::Cjet(){\n 00052\n n = 0;\n 00053\n v = Cmomentum();\n 00054\n pt_tilde = 0.0;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.46 split_merge.cpp\n-\n 00055\n sm_var2 = 0.0;\n 00056\n pass = CJET_INEXISTENT_PASS; // initialised to a value that should\n 00057\n // notappear in the end (after clustering)\n 00058 }\n 00059\n 00060 // default dtor\n 00061 //-------------00062 Cjet::~Cjet(){\n 00063\n 00064 }\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n 00065\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-00069\n return j1.v.perp2() > j2.v.perp2();\n+00069\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@@ -25509,42 +25517,42 @@\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 00100\n q2 = jet2.sm_var2;\n 00101\n-00102\n bool res = q1 > q2;\n+00102\n 00103\n // if we enable the refined version of the comparison (see defines.h),\n 00104\n 00105\n // we compute the difference more precisely when the two jets are very\n 00106\n // close in the ordering variable.\n 00107 #ifdef EPSILON_SPLITMERGE\n 00108\n if ( (fabs(q1-q2) < EPSILON_SPLITMERGE*max(q1,q2)) &&\n 00109\n (jet1.v.ref != jet2.v.ref) ) {\n-00110\n // get the momentum of the difference\n+00110\n 00111\n Cmomentum difference;\n 00112\n double pt_tilde_difference;\n 00113\n get_difference(jet1,jet2,&difference,&pt_tilde_difference);\n 00114\n@@ -25563,32 +25571,32 @@\n 00121\n 00122\n switch (split_merge_scale){\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 00129\n case SM_pttilde:\n 00130\n qdiff = pt_tilde_sum*pt_tilde_difference;\n break;\n 00131\n-case SM_Et:\n 00132\n-00133\n+case SM_Et:\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@@ -25598,61 +25606,61 @@\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 00141\n break;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-279\n-\n-\f280\n-\n-File Documentation\n-\n-00142\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 00151 }\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+279\n+\n+\f280\n+\n+File Documentation\n+\n 00152\n 00153\n 00156 std::string split_merge_scale_name(Esplit_merge_scale sms) {\n 00157\n switch(sms) {\n-00158\n case SM_pt:\n+00158\n 00159\n return \"pt (IR unsafe)\";\n case SM_Et:\n 00160\n 00161\n return \"Et (boost dep.)\";\n case SM_mt:\n 00162\n 00163\n return \"mt (IR safe except for pairs of identical decayed heavy particles)\";\n-case SM_pttilde:\n 00164\n-00165\n+case SM_pttilde:\n return \"pttilde (scalar sum of pt\u2019s)\";\n+00165\n 00166\n default:\n return \"[SM scale without a name]\";\n 00167\n 00168\n }\n 00169 }\n@@ -25669,31 +25677,31 @@\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 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+// compute overlap\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n+281\n+\n 00240\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@@ -25823,27 +25831,27 @@\n 00270\n 00271 // initialisation function for particle list\n 00272 // - _particles list of particles\n 00273 //------------------------------------------------------------00274 int Csplit_merge::init_particles(vector &_particles){\n 00275\n full_clear();\n 00276\n-00277\n // compute the list of particles\n+00277\n 00278\n // here, we do not need to throw away particles\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 for (int i=0;i(ptcomparison));\n 00371\n@@ -26025,83 +26033,83 @@\n 00390\n partial_clear();\n 00391\n 00392\n // clear previously allocated memory\n 00393\n if (indices != NULL){\n-00394\n delete[] indices;\n+00394\n 00395\n }\n 00396\n particles.clear();\n 00397\n-00398\n return 0;\n+00398\n 00399 }\n 00400\n 00401\n 00402 // build the list \u2019p_uncol_hard\u2019 from p_remain by clustering collinear particles\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.46 split_merge.cpp\n-\n-283\n-\n 00403 // note that thins in only used for stable-cone detection\n 00404 // so the parent_index field is unnecessary\n 00405 //------------------------------------------------------------------------00406 int Csplit_merge::merge_collinear_and_remove_soft(){\n-int i,j;\n 00407\n+int i,j;\n 00408\n vector p_sorted;\n bool collinear;\n 00409\n-00410\n double dphi;\n+00410\n 00411\n 00412\n p_uncol_hard.clear();\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n+283\n+\n 00413\n // we first sort the particles according to their rapidity\n 00414\n 00415\n for (i=0;i *protocones, double R2, double ptmin){\n-int i;\n 00461\n+int i;\n 00462\n Cmomentum *c;\n 00463\n Cmomentum *v;\n-00464\n double eta, phi;\n+00464\n 00465\n double dx, dy;\n double R;\n 00466\n 00467\n Cjet jet;\n 00468\n@@ -26168,16 +26176,16 @@\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 // initialise variables\n 00478\n 00479\n@@ -26186,51 +26194,51 @@\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f284\n-\n-File Documentation\n-\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+if (dy>M_PI)\n 00498\n dy -= twopi;\n-if (dx*dx+dy*dyparent_index);\n 00501\n jet.v+= *v;\n 00502\n jet.pt_tilde+= pt[v->parent_index];\n 00503\n@@ -26272,31 +26280,31 @@\n 00524\n // add it to the list of jets\n 00525\n insert(jet);\n 00526\n }\n 00527\n-// update list of included particles\n 00528\n+// update list of included particles\n 00529\n n_pass++;\n 00530\n 00531 #ifdef DEBUG_SPLIT_MERGE\n 00532\n cout \u00ab \"remaining particles: \";\n 00533 #endif\n 00534\n int j=0;\n-00535\n for (i=0;isize()==0)\n 00582\n-00583\n return 1;\n+00583\n 00584\n 00585\n pt_min2 = ptmin*ptmin;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n 00586\n R = sqrt(R2);\n 00587\n-00588\n // browse protocones\n+00588\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@@ -26451,28 +26459,28 @@\n 00625\n *c = jet_candidate.v;\n 00626\n c->eta = 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@@ -26499,54 +26507,54 @@\n 00651\n found_jet = true;\n 00652\n }\n 00653\n }\n 00654\n-// make sure at least one of the jets has passed the selection\n 00655\n+// make sure at least one of the jets has passed the selection\n 00656\n if (!found_jet) return 1;\n 00657\n // add the jet to the list of jets\n 00658\n 00659\n jets.push_back(jet);\n 00660\n jets[jets.size()-1].v.build_etaphi();\n 00661\n 00662 #ifdef DEBUG_SPLIT_MERGE\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-285\n-\n-\f286\n-\n-File Documentation\n-\n 00663\n cout \u00ab \"PR-Jet \" \u00ab jets.size() \u00ab \" [size \" \u00ab jet.contents.size() \u00ab \"]:\";\n 00664 #endif\n 00665\n 00666\n // update the list of what particles are left\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 00723\n+if (candidates->size()==0)\n return 0;\n 00724\n 00725\n if (overlap_tshold>=1.0 || overlap_tshold <= 0) {\n 00726\n 00727\n ostringstream message;\n@@ -26637,66 +26645,66 @@\n 00729\n message \u00ab \" (legal values are 0size()>0){\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 00748\n if (j1->sm_var2end()){\n+00755\n 00756 #ifdef DEBUG_SPLIT_MERGE\n 00757\n show();\n 00758 #endif\n 00759\n // check overlapping\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.46 split_merge.cpp\n+\n 00760\n if (get_overlap(*j1, *j2, &overlap2)){\n // check if overlapping energy passes threshold\n 00761\n 00762\n // Note that this depends on the ordering variable\n 00763 #ifdef DEBUG_SPLIT_MERGE\n@@ -26716,16 +26724,16 @@\n 00771\n 00772\n j2 = j1 = candidates->begin();\n 00773\n j2_relindex = 0;\n 00774\n } else {\n-// merge jets\n 00775\n+// merge jets\n 00776\n merge(j1, j2);\n 00777\n // update iterators\n 00778\n 00779\n j2 = j1 = candidates->begin();\n@@ -26798,16 +26806,16 @@\n 00816\n sort(jets.begin(), jets.end(), jets_pt_less);\n 00817 #ifdef DEBUG_SPLIT_MERGE\n 00818\n show();\n 00819 #endif\n 00820\n-return jets.size();\n 00821\n+return jets.size();\n 00822 }\n 00823\n 00824\n 00825\n 00826 // save the event on disk\n 00827 // - flux\n stream used to save jet contents\n@@ -26823,42 +26831,42 @@\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 for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n 00836\n 00837\n j1 = &(*it_j);\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-287\n-\n-\f288\n-\n-File Documentation\n-\n 00838\n j1->v.build_etaphi();\n 00839\n fprintf(flux, \"%f\\t%f\\t%e\\t%d\\n\",\n 00840\n j1->v.eta, j1->v.phi, j1->v.perp(), j1->n);\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+287\n+\n+\f288\n+\n+File Documentation\n+\n 00848\n fprintf(flux, \"%f\\t%f\\t%e\\t%d\\t%d\\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@@ -26873,29 +26881,29 @@\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-00864\n+const Cjet *c;\n int i1, i2;\n+00864\n 00865\n for (it_j = jets.begin(), i1=0 ; it_j != jets.end() ; it_j++, i1++){\n 00866\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 00870\n+for (i2=0;i2n;i2++)\n 00871\n fprintf(stdout, \"%d \", j->contents[i2]);\n 00872\n fprintf(stdout, \"\\n\");\n 00873\n }\n 00874\n@@ -26903,52 +26911,52 @@\n 00875\n 00876\n c = &(*it_c);\n 00877\n fprintf(stdout, \"cdt %2d: %e\\t%e\\t%e\\t%e\\t%e\\t\", i1+1,\n 00878\n c->v.px, c->v.py, c->v.pz, c->v.E, sqrt(c->sm_var2));\n-00879\n for (i2=0;i2n;i2++)\n+00879\n 00880\n fprintf(stdout, \"%d \", c->contents[i2]);\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 00898\n return false;\n 00899\n int i1,i2;\n 00900\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@@ -26982,62 +26990,62 @@\n indices[idx_size] = j1.contents[i1];\n 00922\n i1++;\n 00923\n i2++;\n 00924\n is_overlap = true;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.46 split_merge.cpp\n-\n 00925\n }\n 00926\n idx_size++;\n 00927\n } while ((i1\" all over the place\n 00970\n 00971\n const Cjet & j1 = * it_j1;\n-const Cjet & j2 = * it_j2;\n 00972\n+const Cjet & j2 = * it_j2;\n 00973\n 00974\n i1=i2=0;\n 00975\n jet2.v = jet1.v = Cmomentum();\n 00976\n jet2.pt_tilde = jet1.pt_tilde = 0.0;\n@@ -27112,16 +27120,16 @@\n 00995\n jet1.v = jet2.v = Cmomentum();\n 00996\n 00997\n // compute jet splitting\n 00998\n do{\n-00999\n if (j1.contents[i1]eta,v->phi);\n 01015\n } else { // (j1.contents[i1]==j2.contents[i2])\n 01016\n@@ -27166,32 +27165,41 @@\n 01018\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+289\n+\n+\f290\n+\n+File Documentation\n+\n 01023\n dy1 -= twopi;\n 01024\n-01025\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-01028\n if (dy2>M_PI)\n+01028\n 01029\n dy2 -= twopi;\n 01030\n-//? what when == ?\n 01031\n+//? what when == ?\n 01032\n // When use_pt_weighted_splitting is activated, the\n 01033\n // \"geometrical\" distance is weighted by the inverse\n 01034\n // of the pt of the protojet\n 01035\n@@ -27201,16 +27209,16 @@\n 01037\n // do bookkeeping on most ambiguous split\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 (d1sqerase(it_j1);\n 01090\n candidates->erase(it_j2);\n 01091\n-// reinsert new ones\n 01092\n+// reinsert new ones\n 01093\n insert(jet1);\n 01094\n insert(jet2);\n 01095\n 01096\n return true;\n 01097 }\n 01098\n 01099 // merge the two given jet.\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.47 vicinity.cpp\n-\n-291\n-\n 01100 // during this procedure, the jets j1 & j2 are replaced\n 01101 // by 1 single jets containing both of them.\n 01102 // - it_j1 iterator of the first jet in \u2019candidates\u2019\n 01103 // - it_j2 iterator of the second jet in \u2019candidates\u2019\n 01104 // return true on success, false on error\n 01106 bool Csplit_merge::merge(cjet_iterator &it_j1, cjet_iterator &it_j2){\n 01107\n Cjet jet;\n-int i;\n 01108\n+int i;\n 01109\n-// build new jet\n 01110\n+// build new jet\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.47 split_merge.h\n+\n+291\n+\n 01111\n // note: particles within j1 & j2 have already been stored in indices\n 01112\n for (i=0;irange, it_j2->range);\n 01121\n // remove old candidates\n 01122\n 01123 #ifdef ALLOW_MERGE_IDENTICAL_PROTOCONES\n 01124\n@@ -27364,47 +27372,47 @@\n }\n 01128 #endif\n 01129\n candidates->erase(it_j1);\n 01130\n candidates->erase(it_j2);\n 01131\n-// reinsert new candidate\n 01132\n+// reinsert new candidate\n 01133\n insert(jet);\n 01134\n-01135\n return true;\n+01135\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-return false;\n 01150\n+return false;\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@@ -27420,50 +27428,756 @@\n case SM_pt:\n return v.perp2();\n case SM_mt:\n return v.perpmass2();\n 01175\n 01176\n case SM_pttilde: return pt_tilde*pt_tilde;\n+01177\n case SM_Et:\n return v.Et2();\n-01177\n-01178\n default:\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 vicinity.cpp\n-00001\n-00002 // File: vicinity.cpp\n-00003 // Description: source file for particle vicinity (Cvicinity class)\n-00004 // This file is part of the SISCone project.\n-00005 // WARNING: this is not the main SISCone trunk but\n+5.47 split_merge.h\n+00001 // -*- C++ -*00003 // File: split_merge.h\n+00004 // Description: header file for splitting/merging (contains the CJet class)\n+00005 // This file is part of the SISCone project.\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+00014 // the Free Software Foundation; either version 2 of the License, or\n+00015 // (at your option) any later version.\n+00016 //\n \n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n //\n //\n //\n //\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n+//\n \n \f292\n \n File Documentation\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:: 404\n+$//\n+00027 // $Date:: 2016-05-22 12:14:42 +0200 (Sun, 22 May 2016)\n+$//\n+00029\n+00030 #ifndef __SPH_SPLIT_MERGE_H__\n+00031 #define __SPH_SPLIT_MERGE_H__\n+00032\n+00033 #include \n+00034 #include \n+00035 #include \"geom_2d.h\"\n+00036 #include \"momentum.h\"\n+00037 #include \n+00038 #include \n+00039 #include \n+00040 #include \n+00041 #include \n+00042\n+00043 namespace siscone_spherical{\n+00044\n+00045 const int CJET_INEXISTENT_PASS = -2;\n+00046\n+00056 class CSphjet{\n+00057 public:\n+00059\n+CSphjet();\n+00060\n+00062\n+~CSphjet();\n+00063\n+00064\n+CSphmomentum v;\n+00065\n+double E_tilde;\n+int n;\n+00066\n+00067\n+std::vector contents;\n+00068\n+00080\n+double sm_var2;\n+00081\n+00083\n+CSphtheta_phi_range range;\n+00084\n+int pass;\n+00089\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+00107\n+SM_E,\n+00108\n+SM_Etilde\n+00109 };\n+00110\n+00112 std::string split_merge_scale_name(Esplit_merge_scale sms);\n+00113\n+00119 class CSphsplit_merge_ptcomparison{\n+00120 public:\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+00128\n+00129\n+std::vector * particles;\n+00130\n+std::vector * particles_norm2;\n+00131\n+00133\n+bool operator()(const CSphjet &jet1, const CSphjet &jet2) const;\n+00134\n+void get_difference(const CSphjet &j1, const CSphjet &j2, CSphmomentum *v, double *E_tilde) const;\n+00146\n+00147\n+00158\n+Esplit_merge_scale split_merge_scale;\n+00159 };\n+00160\n+00161\n+00162 // iterator types\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+00175 class CSphsplit_merge{\n+00176 public:\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.47 split_merge.h\n+\n+00178\n+00179\n+00181\n+00182\n+00183\n+00185\n+00187\n+00196\n+00197\n+00203\n+00204\n+00208\n+00209\n+00221\n+00222\n+00223\n+00224\n+00225\n+00227\n+00229\n+00231\n+00232\n+00234\n+00235\n+00237\n+00239\n+00245\n+00246\n+00248\n+00249\n+00254\n+00255\n+00266\n+00267\n+00268\n+00269\n+00270\n+00275\n+00276\n+00277\n+00278\n+00280\n+00281\n+00282\n+00284\n+00286\n+00296\n+00297\n+00305\n+00306\n+00317\n+00318\n+00328\n+00329\n+00330\n+00332\n+00334\n+00337\n+00338\n+00340\n+00341\n+00342\n+00343\n+00344\n+00345\n+00346\n+00347\n+00348\n+00349\n+00350\n+00354\n+00355\n+00356\n+00357\n+00358\n+00359\n+00360\n+00361\n+00362\n+00371\n+00372\n+00374\n+00375\n+00382\n+00383\n+\n+293\n+\n+CSphsplit_merge();\n+~CSphsplit_merge();\n+\n+// initialisation functions //\n+int init(std::vector &_particles, std::vector *protocones, double R2,\n+double Emin=0.0);\n+int init_particles(std::vector &_particles);\n+int init_pleft();\n+inline int set_E_weighted_splitting(bool _use_E_weighted_splitting){\n+use_E_weighted_splitting = _use_E_weighted_splitting;\n+return 0;\n+}\n+// cleaning functions //\n+int partial_clear();\n+int full_clear();\n+// user-defined stable-cone ordering //\n+class Cuser_scale_base{\n+public:\n+virtual ~Cuser_scale_base(){}\n+virtual double operator()(const CSphjet & jet) const = 0;\n+virtual bool is_larger(const CSphjet & a, const CSphjet & b) const{\n+return (a.sm_var2 > b.sm_var2);\n+}\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+int perform(double overlap_tshold, double Emin=0.0);\n+\n+// save and debug functions //\n+int save_contents(FILE *flux);\n+int show();\n+// particle information\n+int n;\n+std::vector particles;\n+std::vector particles_norm2;\n+int n_left;\n+std::vector p_remain;\n+std::vector p_uncol_hard;\n+int n_pass;\n+double most_ambiguous_split;\n+// jets information\n+std::vector jets;\n+// working entries\n+int *indices;\n+int idx_size;\n+bool merge_identical_protocones;\n+CSphsplit_merge_ptcomparison ptcomparison;\n+double SM_var2_hardest_cut_off;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f294\n+\n+File Documentation\n+\n+00391\n+double stable_cone_soft_E2_cutoff;\n+00392\n+00393 private:\n+00401\n+bool get_overlap(const CSphjet &j1, const CSphjet &j2, double *v);\n+00402\n+00403\n+bool split(cjet_iterator &it_j1, cjet_iterator &it_j2);\n+00415\n+00416\n+bool merge(cjet_iterator &it_j1, cjet_iterator &it_j2);\n+00425\n+00426\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+// 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+double E_min;\n+00455\n+00456\n+bool use_E_weighted_splitting;\n+00462\n+00463\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+00477 #endif\n+\n+5.48 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+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:: 405\n+$//\n+00025 // $Date:: 2016-05-23 20:15:02 +0200 (Mon, 23 May 2016)\n+$//\n+00027\n+00028 #ifndef __SPLIT_MERGE_H__\n+00029 #define __SPLIT_MERGE_H__\n+00030\n+00031 #include \n+00032 #include \"defines.h\"\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+00040\n+00041 namespace siscone{\n+00042\n+00043 const int CJET_INEXISTENT_PASS = -2;\n+00044\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.48 split_merge.h\n+\n+295\n+\n+00054 class Cjet{\n+00055 public:\n+00057\n+Cjet();\n+00058\n+00060\n+~Cjet();\n+00061\n+00062\n+Cmomentum v;\n+00063\n+double pt_tilde;\n+int n;\n+00064\n+00065\n+std::vector contents;\n+00066\n+00073\n+double sm_var2;\n+00074\n+00076\n+Ceta_phi_range range;\n+00077\n+00082\n+int pass;\n+00083 };\n+00084\n+00086 bool jets_pt_less(const Cjet &j1, const Cjet &j2);\n+00087\n+00088\n+00096 enum Esplit_merge_scale {\n+00097\n+SM_pt,\n+00098\n+SM_Et,\n+00100\n+SM_mt,\n+00102\n+SM_pttilde\n+00104 };\n+00105\n+00107 std::string split_merge_scale_name(Esplit_merge_scale sms);\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+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+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+00169 typedef std::multiset::iterator cjet_iterator;\n+00170\n+00172 typedef std::vector::iterator jet_iterator;\n+00173\n+00174\n+00175\n+00180 class Csplit_merge{\n+00181 public:\n+00183\n+Csplit_merge();\n+00184\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+ptmin=0.0);\n+00202\n+int init_particles(std::vector &_particles);\n+00208\n+00209\n+int init_pleft();\n+00213\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+00228\n+return 0;\n+00229\n+}\n+00230\n+// cleaning functions //\n+00232\n+00234\n+int partial_clear();\n+00236\n+00237\n+00239\n+int full_clear();\n+00240\n+// user-defined stable-cone ordering //\n+00242\n+00244\n+class Cuser_scale_base{\n+00250\n+00251\n+public:\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f296\n+\n+File Documentation\n+\n+00253\n+virtual ~Cuser_scale_base(){}\n+00254\n+virtual double operator()(const Cjet & jet) const = 0;\n+00259\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+00273\n+}\n+00274\n+};\n+00275\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+00300\n+int add_protocones(std::vector *protocones, double R2, double ptmin=0.0);\n+00308\n+00309\n+00320\n+int add_hardest_protocone_to_jets(std::vector *protocones, double R2, double ptmin=0.0);\n+00321\n+int perform(double overlap_tshold, double ptmin=0.0);\n+00331\n+00332\n+00333\n+// save and debug functions //\n+00335\n+00337\n+00340\n+int save_contents(FILE *flux);\n+00341\n+int show();\n+00343\n+00344\n+// particle information\n+00345\n+00346\n+int n;\n+00347\n+std::vector particles;\n+00348\n+std::vector pt;\n+int n_left;\n+00349\n+00350\n+std::vector p_remain;\n+00351\n+std::vector p_uncol_hard;\n+00352\n+int n_pass;\n+00353\n+double most_ambiguous_split;\n+00357\n+00358\n+// jets information\n+00359\n+00360\n+std::vector jets;\n+00361\n+// working entries\n+00362\n+00363\n+int *indices;\n+00364\n+int idx_size;\n+00365\n+bool merge_identical_protocones;\n+00374\n+00375\n+00377\n+Csplit_merge_ptcomparison ptcomparison;\n+00378\n+00385\n+double SM_var2_hardest_cut_off;\n+00386\n+double stable_cone_soft_pt2_cutoff;\n+00394\n+00395\n+00396 private:\n+00404\n+bool get_overlap(const Cjet &j1, const Cjet &j2, double *v);\n+00405\n+00406\n+bool split(cjet_iterator &it_j1, cjet_iterator &it_j2);\n+00418\n+00419\n+bool merge(cjet_iterator &it_j1, cjet_iterator &it_j2);\n+00428\n+00429\n+00436\n+bool insert(Cjet &jet);\n+00437\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+00456\n+bool use_pt_weighted_splitting;\n+00462\n+00463\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.49 vicinity.cpp\n+\n+297\n+\n+00472 };\n+00473\n+00474 }\n+00475\n+00476\n+00477 #endif\n+\n+5.49 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@@ -27520,16 +28234,16 @@\n *\n 00042 * of a parent point.\n *\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@@ -27557,14 +28271,23 @@\n parent = NULL;\n 00071\n VR2 = VR = 0.0;\n 00072\n 00073 }\n 00074\n 00075 // constructor with initialisation\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+//\n+\n+\f298\n+\n+File Documentation\n+\n 00076 //--------------------------------00077 CSphvicinity::CSphvicinity(vector &_particle_list){\n 00078\n parent = NULL;\n 00079\n ve_list = NULL;\n 00080 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00081\n@@ -27575,94 +28298,87 @@\n 00084\n 00085\n set_particle_list(_particle_list);\n 00086 }\n 00087\n 00088 // default destructor\n 00089 //-------------------00090 CSphvicinity::~CSphvicinity(){\n-if (ve_list!=NULL)\n 00091\n+if (ve_list!=NULL)\n delete[] ve_list;\n 00092\n 00093\n-\n-//\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.47 vicinity.cpp\n-\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 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+00113\n 00114\n }\n 00115\n vicinity.clear();\n 00116 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00117\n if (quadtree!=NULL)\n-00118\n delete quadtree;\n+00118\n 00119 #endif\n 00120\n-// allocate memory array for particles\n 00121\n+// allocate memory array for particles\n 00122\n // Note: - we compute max for |eta|\n 00123\n //\n - we allocate indices to particles\n 00124\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+00127\n 00128\n // if a particle is colinear with the beam (infinite rapidity)\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 pincluded.push_back(siscone::Cvicinity_inclusion()); // zero inclusion status\n 00133\n-00134\n // the parent_index is handled in the split_merge because\n+00134\n 00135\n // of our multiple-pass procedure.\n 00136\n // Hence, it is not required here any longer.\n 00137\n // plist[n_part].parent_index = i;\n 00138\n@@ -27675,41 +28391,46 @@\n 00142\n 00143 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00144\n if (fabs(plist[n_part].eta)>eta_max) eta_max=fabs(plist[n_part].eta);\n 00145 #endif\n 00146\n n_part++;\n-//}\n 00147\n+//}\n 00148\n }\n 00149\n-// allocate quadtree and vicinity_elm list\n 00150\n+// allocate quadtree and vicinity_elm list\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 00155\n quadtree = new siscone::Cquadtree(0.0, 0.0, eta_max, M_PI);\n 00156 #endif\n 00157\n-00158\n // append particle to the vicinity_elm list\n+00158\n 00159\n j = 0;\n-00160\n for (i=0;iadd(&plist[i]);\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.49 vicinity.cpp\n+\n 00163 #endif\n 00164\n ve_list[j].v = ve_list[j+1].v = &plist[i];\n 00165\n ve_list[j].is_inside = ve_list[j+1].is_inside = &(pincluded[i]);\n 00166\n j+=2;\n@@ -27723,51 +28444,42 @@\n 00173 * build the vicinity list from a list of points.\n 00174 * - _parent\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+int i;\n 00179\n-00180\n // set parent and radius\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-293\n-\n-\f294\n-\n-File Documentation\n-\n+00180\n 00181\n parent = _parent;\n 00182\n 00183\n VR = _VR;\n 00184\n VR2 = VR*VR;\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+//tmp = sqrt(D2_R);\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 00195\n 00196\n // clear vicinity\n@@ -27796,44 +28508,44 @@\n 00209\n for (i=0;i0) ? 0.0 : 2.0;\n-double t=c/s;\n 00224\n-00225\n+double t=c/s;\n return (s>0) ? 1-t/(1+fabs(t)) : 3-t/(1+fabs(t));\n+00225\n 00226 }\n 00227\n 00228\n 00229 /*\n 00230 * append a particle to the \u2019vicinity\u2019 list after\n 00231 * having computed the angular-ordering quantities\n-vector to test\n 00232 * - v\n+vector to test\n 00233 **********************************************************/\n 00234 void CSphvicinity::append_to_vicinity(CSphmomentum *v){\n-// skip the particle itself)\n 00235\n+// skip the particle itself)\n 00236\n if (v==parent)\n 00237\n return;\n 00238\n int i=2*(v->index);\n 00239\n@@ -27845,79 +28557,84 @@\n 00243\n CSph3vector vnormal = *v;\n 00244\n vnormal/=v->_norm;\n 00245\n dot/=v->_norm;\n 00246\n-// really check if the distance is less than VR\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+299\n+\n+\f300\n+\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-ve_list[i+1].centre = median - transverse;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.48 vicinity.cpp\n-\n 00269\n 00270\n 00271\n 00272\n \n+File Documentation\n+\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 ve_list[i+1].centre.build_norm();\n ve_list[i+1].centre/=ve_list[i+1].centre._norm;\n diff = ve_list[i+1].centre - parent_centre;\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-00277\n // now work out the cocircularity range for the two points (range\n+00277\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@@ -27937,34 +28654,34 @@\n // CCN29] [NB2: write things so as to avoid zero denominators and\n 00289\n // to minimize the multiplications, divisions and above all sqrts\n 00290\n // -- that means that c & s are defined including a factor of VR2]\n 00291\n double inv_err1 = cross_product3(OP,OC)._norm * inv_R_EPS_COCIRC;\n-00292\n double inv_err2_sq = (D2_R-dot_product3(OP,OC)) * inv_R_2EPS_COCIRC;\n+00292\n 00293\n ve_list[i].cocircular_range = siscone::pow2(inv_err1) > inv_err2_sq ?\n 00294\n 1.0/inv_err1 :\n 00295\n sqrt(1.0/inv_err2_sq);\n 00296\n ve_list[i+1].cocircular_range = ve_list[i].cocircular_range;\n 00297\n }\n 00298 }\n 00299\n 00300 }\n \n-5.48 vicinity.cpp\n+5.50 vicinity.cpp\n 00001\n-00002 // File: vicinity.cpp\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@@ -28005,14 +28722,19 @@\n 00024 // $Date:: 2016-03-03 10:42:25 +0100 (Thu, 03 Mar 2016)\n $//\n 00026\n 00027 #include \"vicinity.h\"\n 00028 #include \n 00029 #include \n 00030 #include \n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.50 vicinity.cpp\n+\n 00031\n 00032 namespace siscone{\n 00033\n 00034 using namespace std;\n 00035\n 00036 /*************************************************************\n 00037 * Cvicinity_elm implementation\n@@ -28023,27 +28745,18 @@\n *\n 00040 * of a parent point.\n *\n 00041 *************************************************************/\n 00042\n 00043 // ordering pointers to Cvicinity_elm\n 00044 //-----------------------------------00045 bool ve_less(Cvicinity_elm *ve1, Cvicinity_elm *ve2){\n-return ve1->angle < ve2->angle;\n 00046\n+return ve1->angle < ve2->angle;\n 00047 }\n 00048\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-295\n-\n-\f296\n-\n-File Documentation\n-\n 00049\n 00050 /*************************************************************\n 00051 * Cvicinity implementation\n *\n 00052 * list of element in the vicinity of a parent.\n *\n 00053 * class used to manage the points which are in the vicinity *\n@@ -28087,33 +28800,33 @@\n ve_list = NULL;\n 00083\n set_particle_list(_particle_list);\n 00084 }\n 00085\n 00086 // default destructor\n 00087 //-------------------00088 Cvicinity::~Cvicinity(){\n-00089\n if (ve_list!=NULL)\n+00089\n 00090\n delete[] ve_list;\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-number of particles in the list\n+00100 * - particle_list\n 00101 * - n\n+number of particles in the list\n 00102 ************************************************************/\n 00103 void Cvicinity::set_particle_list(vector &_particle_list){\n 00104\n int i,j;\n 00105 #ifdef USE_QUADTREE_FOR_STABILITY_TEST\n 00106\n double eta_max=0.0;\n@@ -28128,17 +28841,26 @@\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+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+301\n+\n+\f302\n+\n+File Documentation\n+\n 00118\n // allocate memory array for particles\n 00119\n 00120\n // Note: - we compute max for |eta|\n 00121\n //\n@@ -28166,19 +28888,14 @@\n // the parent_index is handled in the split_merge because\n 00133\n // of our multiple-pass procedure.\n 00134\n // Hence, it is not required here any longer.\n 00135\n // plist[n_part].parent_index = i;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.48 vicinity.cpp\n-\n 00136\n plist[n_part].index = n_part;\n 00137\n // make sure the reference is randomly created\n 00138\n 00139\n plist[n_part].ref.randomize();\n@@ -28191,33 +28908,33 @@\n 00145\n n_part++;\n 00146\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 00154\n quadtree = new Cquadtree(0.0, 0.0, eta_max, M_PI);\n 00155 #endif\n 00156\n-00157\n // append particle to the vicinity_elm list\n+00157\n 00158\n j = 0;\n-for (i=0;iadd(&plist[i]);\n 00162 #endif\n 00163\n ve_list[j].v = ve_list[j+1].v = &plist[i];\n 00164\n@@ -28228,18 +28945,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 00177\n int i;\n 00178\n // set parent and radius\n 00179\n@@ -28260,88 +28977,84 @@\n inv_R_2EPS_COCIRC = 0.5 / R / EPSILON_COCIRCULAR;\n 00187\n // clear vicinity\n 00188\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 00194\n-00195\n // really browse the particle list\n+00195\n 00196\n for (i=0;i0) ? 0.0 : 2.0;\n 00209\n-00210\n+if (s==0) return (c>0) ? 0.0 : 2.0;\n double t=c/s;\n+00210\n 00211\n return (s>0) ? 1-t/(1+fabs(t)) : 3-t/(1+fabs(t));\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 vector to test\n 00218 * - v\n 00219 **********************************************************/\n 00220 void Cvicinity::append_to_vicinity(Cmomentum *v){\n-double dx, dy, d2;\n 00221\n+double dx, dy, d2;\n 00222\n-00223\n // skip the particle itself)\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-297\n-\n-\f298\n-\n-File Documentation\n-\n+00223\n 00224\n if (v==parent)\n-return;\n 00225\n+return;\n 00226\n-00227\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 00230\n dx = v->eta - pcx;\n 00231\n dy = v->phi - pcy;\n 00232\n-00233\n // pay attention to the periodicity in phi !\n+00233\n 00234\n if (dy>M_PI)\n 00235\n dy -= twopi;\n else if (dy<-M_PI)\n 00236\n 00237\n@@ -28350,16 +29063,16 @@\n 00239\n d2 = dx*dx+dy*dy;\n 00240\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 sqrt(1.0/inv_err2_sq);\n 00292\n ve_list[i+1].cocircular_range = ve_list[i].cocircular_range;\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+303\n+\n+\f304\n+\n+File Documentation\n+\n 00293\n }\n 00294 }\n 00295\n 00296 }\n \n-5.49 vicinity.h\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-00008 // For more details, see http://projects.hepforge.org/siscone\n-\n-//\n-//\n-//\n-//\n //\n+00008 // For more details, see http://projects.hepforge.org/siscone\n //\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.49 vicinity.h\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@@ -28534,24 +29250,24 @@\n 00053 public:\n 00055\n CSphmomentum *v;\n 00056\n 00058\n siscone::Cvicinity_inclusion *is_inside;\n 00059\n-// centre variables\n 00060\n+// centre variables\n 00061\n CSph3vector centre;\n-00062\n double angle;\n-bool side;\n+00062\n 00063\n-00064\n+bool side;\n double cocircular_range;\n+00064\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@@ -28573,28 +29289,35 @@\n void build(CSphmomentum *_parent, double _VR);\n 00105\n 00106\n // cone kinematical information\n 00107\n 00108\n CSphmomentum *parent;\n-00109\n double VR;\n+00109\n double VR2;\n 00110\n+\n+//\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+\f5.52 vicinity.h\n+\n 00111\n double cosVR;\n double R;\n 00112\n 00113\n double R2;\n-double tan2R;\n 00114\n-00115\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@@ -28609,33 +29332,22 @@\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-299\n-\n-//\n-\n-\f300\n-\n-File Documentation\n-\n 00130\n std::vector vicinity;\n-unsigned int vicinity_size;\n 00131\n+unsigned int vicinity_size;\n 00132\n 00133 protected:\n-void append_to_vicinity(CSphmomentum *v);\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@@ -28643,15 +29355,15 @@\n CSph3vector angular_dir2;\n 00145 };\n 00146\n 00147 }\n 00148\n 00149 #endif\n \n-5.50 vicinity.h\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@@ -28708,833 +29420,130 @@\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+00051\n 00052\n bool cocirc;\n 00053 };\n 00054\n 00055\n+\n+Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n+\n+305\n+\n+\f306\n+\n+File Documentation\n+\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-00073\n double phi;\n-double angle;\n+00073\n 00074\n+double angle;\n 00075\n bool side;\n double cocircular_range;\n 00076\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-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.51 split_merge.h\n-\n-301\n-\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+00110\n 00111\n-void build(Cmomentum *_parent, double _VR);\n 00117\n+void build(Cmomentum *_parent, double _VR);\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 VR2;\n double R;\n-double R2;\n+00123\n 00124\n-00125\n+double R2;\n double inv_R_EPS_COCIRC;\n-double inv_R_2EPS_COCIRC;\n+00125\n 00126\n+double inv_R_2EPS_COCIRC;\n 00127\n-00128\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+00137\n 00138\n std::vector vicinity;\n-00139\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-00151\n double pcy;\n+00151\n 00152 };\n 00153\n 00154 }\n 00155\n 00156 #endif\n \n-5.51 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-//\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:: 404\n-$//\n-00027 // $Date:: 2016-05-22 12:14:42 +0200 (Sun, 22 May 2016)\n-$//\n-00029\n-00030 #ifndef __SPH_SPLIT_MERGE_H__\n-00031 #define __SPH_SPLIT_MERGE_H__\n-00032\n-00033 #include \n-00034 #include \n-00035 #include \"geom_2d.h\"\n-00036 #include \"momentum.h\"\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-//\n-\n-\f302\n-\n-File Documentation\n-\n-00037 #include \n-00038 #include \n-00039 #include \n-00040 #include \n-00041 #include \n-00042\n-00043 namespace siscone_spherical{\n-00044\n-00045 const int CJET_INEXISTENT_PASS = -2;\n-00046\n-00056 class CSphjet{\n-00057 public:\n-00059\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-00066\n-00067\n-std::vector contents;\n-00068\n-00080\n-double sm_var2;\n-00081\n-00083\n-CSphtheta_phi_range range;\n-00084\n-int pass;\n-00089\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-00107\n-SM_E,\n-00108\n-SM_Etilde\n-00109 };\n-00110\n-00112 std::string split_merge_scale_name(Esplit_merge_scale sms);\n-00113\n-00119 class CSphsplit_merge_ptcomparison{\n-00120 public:\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-00128\n-00129\n-std::vector * particles;\n-00130\n-std::vector * particles_norm2;\n-00131\n-00133\n-bool operator()(const CSphjet &jet1, const CSphjet &jet2) const;\n-00134\n-void get_difference(const CSphjet &j1, const CSphjet &j2, CSphmomentum *v, double *E_tilde) const;\n-00146\n-00147\n-00158\n-Esplit_merge_scale split_merge_scale;\n-00159 };\n-00160\n-00161\n-00162 // iterator types\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-00175 class CSphsplit_merge{\n-00176 public:\n-00178\n-CSphsplit_merge();\n-00179\n-00181\n-~CSphsplit_merge();\n-00182\n-00183\n-// initialisation functions //\n-00185\n-00187\n-int init(std::vector &_particles, std::vector *protocones, double R2,\n-00196\n-double Emin=0.0);\n-00197\n-int init_particles(std::vector &_particles);\n-00203\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-use_E_weighted_splitting = _use_E_weighted_splitting;\n-00223\n-return 0;\n-00224\n-}\n-00225\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.51 split_merge.h\n-\n-00227\n-00229\n-00231\n-00232\n-00234\n-00235\n-00237\n-00239\n-00245\n-00246\n-00248\n-00249\n-00254\n-00255\n-00266\n-00267\n-00268\n-00269\n-00270\n-00275\n-00276\n-00277\n-00278\n-00280\n-00281\n-00282\n-00284\n-00286\n-00296\n-00297\n-00305\n-00306\n-00317\n-\n-// cleaning functions //\n-int partial_clear();\n-int full_clear();\n-// user-defined stable-cone ordering //\n-class Cuser_scale_base{\n-public:\n-virtual ~Cuser_scale_base(){}\n-virtual double operator()(const CSphjet & jet) const = 0;\n-virtual bool is_larger(const CSphjet & a, const CSphjet & b) const{\n-return (a.sm_var2 > b.sm_var2);\n-}\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-00329\n-00330\n-// save and debug functions //\n-00332\n-00334\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-int n;\n-00344\n-std::vector particles;\n-00345\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-00350\n-double most_ambiguous_split;\n-00354\n-00355\n-00356\n-// jets information\n-00357\n-std::vector jets;\n-00358\n-// working entries\n-00359\n-00360\n-int *indices;\n-00361\n-int idx_size;\n-00362\n-bool merge_identical_protocones;\n-00371\n-00372\n-00374\n-CSphsplit_merge_ptcomparison ptcomparison;\n-00375\n-double SM_var2_hardest_cut_off;\n-00382\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-00402\n-00403\n-00415\n-bool split(cjet_iterator &it_j1, cjet_iterator &it_j2);\n-00416\n-bool merge(cjet_iterator &it_j1, cjet_iterator &it_j2);\n-00425\n-00426\n-bool insert(CSphjet &jet);\n-00433\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-00446\n-// jet information\n-00448 #ifdef SISCONE_USES_UNIQUE_PTR_AS_AUTO_PTR\n-00449\n-std::unique_ptr > candidates;\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-303\n-\n-\f304\n-\n-File Documentation\n-\n-00450 #else\n-00451\n-std::auto_ptr > candidates;\n-00452 #endif\n-00453\n-double E_min;\n-00455\n-00456\n-bool use_E_weighted_splitting;\n-00462\n-00463\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-00477 #endif\n-\n-5.52 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-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:: 405\n-$//\n-00025 // $Date:: 2016-05-23 20:15:02 +0200 (Mon, 23 May 2016)\n-$//\n-00027\n-00028 #ifndef __SPLIT_MERGE_H__\n-00029 #define __SPLIT_MERGE_H__\n-00030\n-00031 #include \n-00032 #include \"defines.h\"\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-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-00057\n-Cjet();\n-00058\n-00060\n-~Cjet();\n-00061\n-00062\n-Cmomentum v;\n-00063\n-double pt_tilde;\n-00064\n-int n;\n-00065\n-std::vector contents;\n-00066\n-00073\n-double sm_var2;\n-00074\n-00076\n-Ceta_phi_range range;\n-00077\n-00082\n-int pass;\n-00083 };\n-00084\n-00086 bool jets_pt_less(const Cjet &j1, const Cjet &j2);\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f5.52 split_merge.h\n-\n-305\n-\n-00087\n-00088\n-00096 enum Esplit_merge_scale {\n-00097\n-SM_pt,\n-00098\n-SM_Et,\n-00100\n-SM_mt,\n-00102\n-SM_pttilde\n-00104 };\n-00105\n-00107 std::string split_merge_scale_name(Esplit_merge_scale sms);\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-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-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-00169 typedef std::multiset::iterator cjet_iterator;\n-00170\n-00172 typedef std::vector::iterator jet_iterator;\n-00173\n-00174\n-00175\n-00180 class Csplit_merge{\n-00181 public:\n-00183\n-Csplit_merge();\n-00184\n-00186\n-~Csplit_merge();\n-00187\n-00188\n-// initialisation functions //\n-00190\n-00192\n-int init(std::vector &_particles, std::vector *protocones, double R2, double\n-00201\n-ptmin=0.0);\n-00202\n-int init_particles(std::vector &_particles);\n-00208\n-00209\n-int init_pleft();\n-00213\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-00228\n-return 0;\n-00229\n-}\n-00230\n-// cleaning functions //\n-00232\n-00234\n-00236\n-int partial_clear();\n-00237\n-int full_clear();\n-00239\n-00240\n-// user-defined stable-cone ordering //\n-00242\n-00244\n-00250\n-class Cuser_scale_base{\n-00251\n-public:\n-virtual ~Cuser_scale_base(){}\n-00253\n-00254\n-virtual double operator()(const Cjet & jet) const = 0;\n-00259\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-00273\n-}\n-00274\n-};\n-00275\n-void set_user_scale(const Cuser_scale_base * user_scale_in){\n-00280\n-00281\n-_user_scale = user_scale_in;\n-00282\n-}\n-00283\n-00285\n-const Cuser_scale_base * user_scale() const { return _user_scale; }\n-00286\n-00287\n-// main parts of the algorithm //\n-00289\n-00291\n-00299\n-int merge_collinear_and_remove_soft();\n-\n-Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n-\n-\f306\n-\n-File Documentation\n-\n-00300\n-int add_protocones(std::vector *protocones, double R2, double ptmin=0.0);\n-00308\n-00309\n-00320\n-int add_hardest_protocone_to_jets(std::vector *protocones, double R2, double ptmin=0.0);\n-00321\n-int perform(double overlap_tshold, double ptmin=0.0);\n-00331\n-00332\n-00333\n-00335\n-// save and debug functions //\n-00337\n-00340\n-int save_contents(FILE *flux);\n-00341\n-int show();\n-00343\n-00344\n-// particle information\n-00345\n-00346\n-int n;\n-00347\n-std::vector particles;\n-00348\n-std::vector pt;\n-int n_left;\n-00349\n-00350\n-std::vector p_remain;\n-00351\n-std::vector p_uncol_hard;\n-00352\n-int n_pass;\n-00353\n-double most_ambiguous_split;\n-00357\n-00358\n-// jets information\n-00359\n-00360\n-std::vector jets;\n-00361\n-// working entries\n-00362\n-00363\n-int *indices;\n-00364\n-int idx_size;\n-00365\n-bool merge_identical_protocones;\n-00374\n-00375\n-00377\n-Csplit_merge_ptcomparison ptcomparison;\n-00378\n-00385\n-double SM_var2_hardest_cut_off;\n-00386\n-double stable_cone_soft_pt2_cutoff;\n-00394\n-00395\n-00396 private:\n-00404\n-bool get_overlap(const Cjet &j1, const Cjet &j2, double *v);\n-00405\n-00406\n-bool split(cjet_iterator &it_j1, cjet_iterator &it_j2);\n-00418\n-00419\n-bool merge(cjet_iterator &it_j1, cjet_iterator &it_j2);\n-00428\n-00429\n-00436\n-bool insert(Cjet &jet);\n-00437\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-00456\n-bool use_pt_weighted_splitting;\n-00462\n-00463\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-00477 #endif\n-\n Generated on Tue Jan 10 2023 17:32:40 for SISCone by Doxygen\n \n \fIndex\n siscone::Cjet_area, 31\n _norm\n add\n siscone_spherical::CSph3vector, 69\n@@ -30129,23 +30138,23 @@\n siscone_spherical::sph_hash_cones, 172\n randomize\n siscone::Creference, 51\n range\n siscone::Cjet, 27\n siscone_spherical::CSphjet, 75\n ranlux.h\n-ranlux_get, 232\n-ranlux_init, 232\n-ranlux_print_state, 232\n+ranlux_get, 250\n+ranlux_init, 250\n+ranlux_print_state, 250\n ranlux_get\n-ranlux.h, 232\n+ranlux.h, 250\n ranlux_init\n-ranlux.h, 232\n+ranlux.h, 250\n ranlux_print_state\n-ranlux.h, 232\n+ranlux.h, 250\n recompute_jets\n siscone::Csiscone, 59\n siscone_spherical::CSphsiscone, 90\n ref\n siscone::Cmomentum, 38\n siscone::Creference, 52\n siscone::hash_element, 167\n@@ -30185,50 +30194,50 @@\n \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, 195, 197\n-siscone/geom_2d.cpp, 237\n-siscone/geom_2d.h, 198\n-siscone/hash.cpp, 241\n-siscone/hash.h, 200\n-siscone/momentum.cpp, 246\n-siscone/momentum.h, 202\n-siscone/protocones.cpp, 206\n-siscone/protocones.h, 251\n-siscone/quadtree.cpp, 225\n-siscone/quadtree.h, 229\n-siscone/ranlux.cpp, 229\n-siscone/ranlux.h, 232, 233\n-siscone/reference.cpp, 233\n-siscone/reference.h, 235\n-siscone/siscone.cpp, 255\n-siscone/siscone.h, 262\n-siscone/siscone_error.cpp, 236\n-siscone/siscone_error.h, 236\n-siscone/spherical/geom_2d.cpp, 239\n-siscone/spherical/geom_2d.h, 200\n-siscone/spherical/hash.cpp, 243\n-siscone/spherical/hash.h, 201\n-siscone/spherical/momentum.cpp, 248\n-siscone/spherical/momentum.h, 204\n-siscone/spherical/protocones.cpp, 215\n-siscone/spherical/protocones.h, 253\n-siscone/spherical/siscone.cpp, 259\n-siscone/spherical/siscone.h, 263\n+siscone/geom_2d.cpp, 198\n+siscone/geom_2d.h, 202\n+siscone/hash.cpp, 204\n+siscone/hash.h, 210\n+siscone/momentum.cpp, 211\n+siscone/momentum.h, 217\n+siscone/protocones.cpp, 220\n+siscone/protocones.h, 239\n+siscone/quadtree.cpp, 243\n+siscone/quadtree.h, 247\n+siscone/ranlux.cpp, 248\n+siscone/ranlux.h, 250, 251\n+siscone/reference.cpp, 251\n+siscone/reference.h, 253\n+siscone/siscone.cpp, 254\n+siscone/siscone.h, 261\n+siscone/siscone_error.cpp, 263\n+siscone/siscone_error.h, 263\n+siscone/spherical/geom_2d.cpp, 200\n+siscone/spherical/geom_2d.h, 203\n+siscone/spherical/hash.cpp, 207\n+siscone/spherical/hash.h, 210\n+siscone/spherical/momentum.cpp, 213\n+siscone/spherical/momentum.h, 218\n+siscone/spherical/protocones.cpp, 230\n+siscone/spherical/protocones.h, 241\n+siscone/spherical/siscone.cpp, 257\n+siscone/spherical/siscone.h, 262\n siscone/spherical/split_merge.cpp, 264\n-siscone/spherical/split_merge.h, 301\n-siscone/spherical/vicinity.cpp, 291\n-siscone/spherical/vicinity.h, 298\n+siscone/spherical/split_merge.h, 291\n+siscone/spherical/vicinity.cpp, 297\n+siscone/spherical/vicinity.h, 304\n siscone/split_merge.cpp, 278\n-siscone/split_merge.h, 304\n-siscone/vicinity.cpp, 295\n-siscone/vicinity.h, 300\n+siscone/split_merge.h, 294\n+siscone/vicinity.cpp, 300\n+siscone/vicinity.h, 305\n siscone::Carea, 7\n \u223cCarea, 13\n Carea, 13\n compute_active_areas, 13\n compute_areas, 13\n compute_passive_areas, 14\n grid_eta_max, 15\n"}]}]}]}]}]}]}