00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include<iostream>
00037 #include<vector>
00038 #include<cmath>
00039 #include<algorithm>
00040 #include "fastjet/PseudoJet.hh"
00041 #include "fastjet/ClusterSequence.hh"
00042 #include "fastjet/internal/MinHeap.hh"
00043
00044 FASTJET_BEGIN_NAMESPACE
00045
00046 using namespace std;
00047
00048
00049
00050 void ClusterSequence::_bj_remove_from_tiles(TiledJet * const jet) {
00051 Tile * tile = & _tiles[jet->tile_index];
00052
00053 if (jet->previous == NULL) {
00054
00055
00056 tile->head = jet->next;
00057 } else {
00058
00059 jet->previous->next = jet->next;
00060 }
00061 if (jet->next != NULL) {
00062
00063 jet->next->previous = jet->previous;
00064 }
00065 }
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 void ClusterSequence::_initialise_tiles() {
00087
00088
00089
00090 double default_size = max(0.1,_Rparam);
00091 _tile_size_eta = default_size;
00092
00093
00094
00095 _n_tiles_phi = max(3,int(floor(twopi/default_size)));
00096 _tile_size_phi = twopi / _n_tiles_phi;
00097
00098
00099 _tiles_eta_min = 0.0;
00100 _tiles_eta_max = 0.0;
00101
00102 const double maxrap = 7.0;
00103
00104
00105 for(unsigned int i = 0; i < _jets.size(); i++) {
00106 double eta = _jets[i].rap();
00107
00108
00109 if (abs(eta) < maxrap) {
00110 if (eta < _tiles_eta_min) {_tiles_eta_min = eta;}
00111 if (eta > _tiles_eta_max) {_tiles_eta_max = eta;}
00112 }
00113 }
00114
00115
00116 _tiles_ieta_min = int(floor(_tiles_eta_min/_tile_size_eta));
00117 _tiles_ieta_max = int(floor( _tiles_eta_max/_tile_size_eta));
00118 _tiles_eta_min = _tiles_ieta_min * _tile_size_eta;
00119 _tiles_eta_max = _tiles_ieta_max * _tile_size_eta;
00120
00121
00122 _tiles.resize((_tiles_ieta_max-_tiles_ieta_min+1)*_n_tiles_phi);
00123
00124
00125 for (int ieta = _tiles_ieta_min; ieta <= _tiles_ieta_max; ieta++) {
00126 for (int iphi = 0; iphi < _n_tiles_phi; iphi++) {
00127 Tile * tile = & _tiles[_tile_index(ieta,iphi)];
00128
00129 tile->head = NULL;
00130 tile->begin_tiles[0] = tile;
00131 Tile ** pptile = & (tile->begin_tiles[0]);
00132 pptile++;
00133
00134
00135 tile->surrounding_tiles = pptile;
00136 if (ieta > _tiles_ieta_min) {
00137
00138
00139
00140 for (int idphi = -1; idphi <=+1; idphi++) {
00141 *pptile = & _tiles[_tile_index(ieta-1,iphi+idphi)];
00142 pptile++;
00143 }
00144 }
00145
00146 *pptile = & _tiles[_tile_index(ieta,iphi-1)];
00147 pptile++;
00148
00149 tile->RH_tiles = pptile;
00150 *pptile = & _tiles[_tile_index(ieta,iphi+1)];
00151 pptile++;
00152
00153 if (ieta < _tiles_ieta_max) {
00154 for (int idphi = -1; idphi <= +1; idphi++) {
00155 *pptile = & _tiles[_tile_index(ieta+1,iphi+idphi)];
00156 pptile++;
00157 }
00158 }
00159
00160 tile->end_tiles = pptile;
00161
00162 tile->tagged = false;
00163 }
00164 }
00165
00166 }
00167
00168
00169
00170
00171 int ClusterSequence::_tile_index(const double & eta, const double & phi) const {
00172 int ieta, iphi;
00173 if (eta <= _tiles_eta_min) {ieta = 0;}
00174 else if (eta >= _tiles_eta_max) {ieta = _tiles_ieta_max-_tiles_ieta_min;}
00175 else {
00176
00177 ieta = int(((eta - _tiles_eta_min) / _tile_size_eta));
00178
00179 if (ieta > _tiles_ieta_max-_tiles_ieta_min) {
00180 ieta = _tiles_ieta_max-_tiles_ieta_min;}
00181 }
00182
00183
00184
00185
00186 iphi = int((phi+twopi)/_tile_size_phi) % _n_tiles_phi;
00187 return (iphi + ieta * _n_tiles_phi);
00188 }
00189
00190
00191
00192
00193
00194 inline void ClusterSequence::_tj_set_jetinfo( TiledJet * const jet,
00195 const int _jets_index) {
00196
00197 _bj_set_jetinfo<>(jet, _jets_index);
00198
00199
00200
00201
00202 jet->tile_index = _tile_index(jet->eta, jet->phi);
00203
00204
00205 Tile * tile = &_tiles[jet->tile_index];
00206 jet->previous = NULL;
00207 jet->next = tile->head;
00208 if (jet->next != NULL) {jet->next->previous = jet;}
00209 tile->head = jet;
00210 }
00211
00212
00213
00214
00215 void ClusterSequence::_print_tiles(TiledJet * briefjets ) const {
00216 for (vector<Tile>::const_iterator tile = _tiles.begin();
00217 tile < _tiles.end(); tile++) {
00218 cout << "Tile " << tile - _tiles.begin()<<" = ";
00219 vector<int> list;
00220 for (TiledJet * jetI = tile->head; jetI != NULL; jetI = jetI->next) {
00221 list.push_back(jetI-briefjets);
00222
00223 }
00224 sort(list.begin(),list.end());
00225 for (unsigned int i = 0; i < list.size(); i++) {cout <<" "<<list[i];}
00226 cout <<"\n";
00227 }
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238 void ClusterSequence::_add_neighbours_to_tile_union(const int tile_index,
00239 vector<int> & tile_union, int & n_near_tiles) const {
00240 for (Tile * const * near_tile = _tiles[tile_index].begin_tiles;
00241 near_tile != _tiles[tile_index].end_tiles; near_tile++){
00242
00243 tile_union[n_near_tiles] = *near_tile - & _tiles[0];
00244 n_near_tiles++;
00245 }
00246 }
00247
00248
00249
00250
00251
00252
00253 inline void ClusterSequence::_add_untagged_neighbours_to_tile_union(
00254 const int tile_index,
00255 vector<int> & tile_union, int & n_near_tiles) {
00256 for (Tile ** near_tile = _tiles[tile_index].begin_tiles;
00257 near_tile != _tiles[tile_index].end_tiles; near_tile++){
00258 if (! (*near_tile)->tagged) {
00259 (*near_tile)->tagged = true;
00260
00261 tile_union[n_near_tiles] = *near_tile - & _tiles[0];
00262 n_near_tiles++;
00263 }
00264 }
00265 }
00266
00267
00268
00269
00270 void ClusterSequence::_tiled_N2_cluster() {
00271
00272 _initialise_tiles();
00273
00274 int n = _jets.size();
00275 TiledJet * briefjets = new TiledJet[n];
00276 TiledJet * jetA = briefjets, * jetB;
00277 TiledJet oldB;
00278
00279
00280
00281
00282 vector<int> tile_union(3*n_tile_neighbours);
00283
00284
00285 for (int i = 0; i< n; i++) {
00286 _tj_set_jetinfo(jetA, i);
00287
00288 jetA++;
00289 }
00290 TiledJet * tail = jetA;
00291 TiledJet * head = briefjets;
00292
00293
00294 vector<Tile>::const_iterator tile;
00295 for (tile = _tiles.begin(); tile != _tiles.end(); tile++) {
00296
00297 for (jetA = tile->head; jetA != NULL; jetA = jetA->next) {
00298 for (jetB = tile->head; jetB != jetA; jetB = jetB->next) {
00299 double dist = _bj_dist(jetA,jetB);
00300 if (dist < jetA->NN_dist) {jetA->NN_dist = dist; jetA->NN = jetB;}
00301 if (dist < jetB->NN_dist) {jetB->NN_dist = dist; jetB->NN = jetA;}
00302 }
00303 }
00304
00305 for (Tile ** RTile = tile->RH_tiles; RTile != tile->end_tiles; RTile++) {
00306 for (jetA = tile->head; jetA != NULL; jetA = jetA->next) {
00307 for (jetB = (*RTile)->head; jetB != NULL; jetB = jetB->next) {
00308 double dist = _bj_dist(jetA,jetB);
00309 if (dist < jetA->NN_dist) {jetA->NN_dist = dist; jetA->NN = jetB;}
00310 if (dist < jetB->NN_dist) {jetB->NN_dist = dist; jetB->NN = jetA;}
00311 }
00312 }
00313 }
00314 }
00315
00316
00317
00318 double * diJ = new double[n];
00319 jetA = head;
00320 for (int i = 0; i < n; i++) {
00321 diJ[i] = _bj_diJ(jetA);
00322 jetA++;
00323 }
00324
00325
00326 int history_location = n-1;
00327 while (tail != head) {
00328
00329
00330 double diJ_min = diJ[0];
00331 int diJ_min_jet = 0;
00332 for (int i = 1; i < n; i++) {
00333 if (diJ[i] < diJ_min) {diJ_min_jet = i; diJ_min = diJ[i];}
00334 }
00335
00336
00337 history_location++;
00338 jetA = & briefjets[diJ_min_jet];
00339 jetB = jetA->NN;
00340
00341 diJ_min *= _invR2;
00342
00343
00344
00345
00346
00347 if (jetB != NULL) {
00348
00349
00350
00351
00352
00353 if (jetA < jetB) {std::swap(jetA,jetB);}
00354
00355 int nn;
00356 _do_ij_recombination_step(jetA->_jets_index, jetB->_jets_index, diJ_min, nn);
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372 _bj_remove_from_tiles(jetA);
00373 oldB = * jetB;
00374 _bj_remove_from_tiles(jetB);
00375 _tj_set_jetinfo(jetB, nn);
00376 } else {
00377
00378 _do_iB_recombination_step(jetA->_jets_index, diJ_min);
00379
00380
00381
00382
00383
00384 _bj_remove_from_tiles(jetA);
00385 }
00386
00387
00388
00389 int n_near_tiles = 0;
00390 _add_neighbours_to_tile_union(jetA->tile_index, tile_union, n_near_tiles);
00391 if (jetB != NULL) {
00392 bool sort_it = false;
00393 if (jetB->tile_index != jetA->tile_index) {
00394 sort_it = true;
00395 _add_neighbours_to_tile_union(jetB->tile_index,tile_union,n_near_tiles);
00396 }
00397 if (oldB.tile_index != jetA->tile_index &&
00398 oldB.tile_index != jetB->tile_index) {
00399 sort_it = true;
00400 _add_neighbours_to_tile_union(oldB.tile_index,tile_union,n_near_tiles);
00401 }
00402
00403 if (sort_it) {
00404
00405 sort(tile_union.begin(), tile_union.begin()+n_near_tiles);
00406
00407 int nnn = 1;
00408 for (int i = 1; i < n_near_tiles; i++) {
00409 if (tile_union[i] != tile_union[nnn-1]) {
00410 tile_union[nnn] = tile_union[i];
00411 nnn++;
00412 }
00413 }
00414 n_near_tiles = nnn;
00415 }
00416 }
00417
00418
00419
00420 tail--; n--;
00421 if (jetA == tail) {
00422
00423 } else {
00424
00425 *jetA = *tail;
00426 diJ[jetA - head] = diJ[tail-head];
00427
00428
00429
00430 if (jetA->previous == NULL) {
00431 _tiles[jetA->tile_index].head = jetA;
00432 } else {
00433 jetA->previous->next = jetA;
00434 }
00435 if (jetA->next != NULL) {jetA->next->previous = jetA;}
00436 }
00437
00438
00439
00440 for (int itile = 0; itile < n_near_tiles; itile++) {
00441 Tile * tile = &_tiles[tile_union[itile]];
00442 for (TiledJet * jetI = tile->head; jetI != NULL; jetI = jetI->next) {
00443
00444 if (jetI->NN == jetA || (jetI->NN == jetB && jetB != NULL)) {
00445 jetI->NN_dist = _R2;
00446 jetI->NN = NULL;
00447
00448 for (Tile ** near_tile = tile->begin_tiles;
00449 near_tile != tile->end_tiles; near_tile++) {
00450
00451 for (TiledJet * jetJ = (*near_tile)->head;
00452 jetJ != NULL; jetJ = jetJ->next) {
00453 double dist = _bj_dist(jetI,jetJ);
00454 if (dist < jetI->NN_dist && jetJ != jetI) {
00455 jetI->NN_dist = dist; jetI->NN = jetJ;
00456 }
00457 }
00458 }
00459 diJ[jetI-head] = _bj_diJ(jetI);
00460 }
00461
00462
00463 if (jetB != NULL) {
00464 double dist = _bj_dist(jetI,jetB);
00465 if (dist < jetI->NN_dist) {
00466 if (jetI != jetB) {
00467 jetI->NN_dist = dist;
00468 jetI->NN = jetB;
00469 diJ[jetI-head] = _bj_diJ(jetI);
00470 }
00471 }
00472 if (dist < jetB->NN_dist) {
00473 if (jetI != jetB) {
00474 jetB->NN_dist = dist;
00475 jetB->NN = jetI;}
00476 }
00477 }
00478 }
00479 }
00480
00481
00482 if (jetB != NULL) {diJ[jetB-head] = _bj_diJ(jetB);}
00483
00484
00485
00486 for (Tile ** near_tile = _tiles[tail->tile_index].begin_tiles;
00487 near_tile!= _tiles[tail->tile_index].end_tiles; near_tile++){
00488
00489 for (TiledJet * jetJ = (*near_tile)->head;
00490 jetJ != NULL; jetJ = jetJ->next) {
00491 if (jetJ->NN == tail) {jetJ->NN = jetA;}
00492 }
00493 }
00494
00495
00496
00497
00498
00499
00500 if (jetB != NULL) {diJ[jetB-head] = _bj_diJ(jetB);}
00501
00502
00503 }
00504
00505
00506 delete[] diJ;
00507 delete[] briefjets;
00508 }
00509
00510
00511
00512
00513 void ClusterSequence::_faster_tiled_N2_cluster() {
00514
00515 _initialise_tiles();
00516
00517 int n = _jets.size();
00518 TiledJet * briefjets = new TiledJet[n];
00519 TiledJet * jetA = briefjets, * jetB;
00520 TiledJet oldB;
00521
00522
00523
00524
00525 vector<int> tile_union(3*n_tile_neighbours);
00526
00527
00528 for (int i = 0; i< n; i++) {
00529 _tj_set_jetinfo(jetA, i);
00530
00531 jetA++;
00532 }
00533 TiledJet * head = briefjets;
00534
00535
00536 vector<Tile>::const_iterator tile;
00537 for (tile = _tiles.begin(); tile != _tiles.end(); tile++) {
00538
00539 for (jetA = tile->head; jetA != NULL; jetA = jetA->next) {
00540 for (jetB = tile->head; jetB != jetA; jetB = jetB->next) {
00541 double dist = _bj_dist(jetA,jetB);
00542 if (dist < jetA->NN_dist) {jetA->NN_dist = dist; jetA->NN = jetB;}
00543 if (dist < jetB->NN_dist) {jetB->NN_dist = dist; jetB->NN = jetA;}
00544 }
00545 }
00546
00547 for (Tile ** RTile = tile->RH_tiles; RTile != tile->end_tiles; RTile++) {
00548 for (jetA = tile->head; jetA != NULL; jetA = jetA->next) {
00549 for (jetB = (*RTile)->head; jetB != NULL; jetB = jetB->next) {
00550 double dist = _bj_dist(jetA,jetB);
00551 if (dist < jetA->NN_dist) {jetA->NN_dist = dist; jetA->NN = jetB;}
00552 if (dist < jetB->NN_dist) {jetB->NN_dist = dist; jetB->NN = jetA;}
00553 }
00554 }
00555 }
00556
00557
00558 }
00559
00560
00561
00562
00563
00564 struct diJ_plus_link {
00565 double diJ;
00566 TiledJet * jet;
00567
00568 };
00569 diJ_plus_link * diJ = new diJ_plus_link[n];
00570 jetA = head;
00571 for (int i = 0; i < n; i++) {
00572 diJ[i].diJ = _bj_diJ(jetA);
00573 diJ[i].jet = jetA;
00574 jetA->diJ_posn = i;
00575
00576 jetA++;
00577 }
00578
00579
00580 int history_location = n-1;
00581 while (n > 0) {
00582
00583
00584 diJ_plus_link * best, *stop;
00585
00586
00587
00588 double diJ_min = diJ[0].diJ;
00589 best = diJ;
00590 stop = diJ+n;
00591 for (diJ_plus_link * here = diJ+1; here != stop; here++) {
00592 if (here->diJ < diJ_min) {best = here; diJ_min = here->diJ;}
00593 }
00594
00595
00596 history_location++;
00597 jetA = best->jet;
00598 jetB = jetA->NN;
00599
00600 diJ_min *= _invR2;
00601
00602 if (jetB != NULL) {
00603
00604
00605
00606
00607
00608 if (jetA < jetB) {std::swap(jetA,jetB);}
00609
00610 int nn;
00611 _do_ij_recombination_step(jetA->_jets_index, jetB->_jets_index, diJ_min, nn);
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626 _bj_remove_from_tiles(jetA);
00627 oldB = * jetB;
00628 _bj_remove_from_tiles(jetB);
00629 _tj_set_jetinfo(jetB, nn);
00630
00631 } else {
00632
00633
00634 _do_iB_recombination_step(jetA->_jets_index, diJ_min);
00635
00636
00637
00638 _bj_remove_from_tiles(jetA);
00639 }
00640
00641
00642
00643
00644
00645 int n_near_tiles = 0;
00646 _add_untagged_neighbours_to_tile_union(jetA->tile_index,
00647 tile_union, n_near_tiles);
00648 if (jetB != NULL) {
00649 if (jetB->tile_index != jetA->tile_index) {
00650 _add_untagged_neighbours_to_tile_union(jetB->tile_index,
00651 tile_union,n_near_tiles);
00652 }
00653 if (oldB.tile_index != jetA->tile_index &&
00654 oldB.tile_index != jetB->tile_index) {
00655 _add_untagged_neighbours_to_tile_union(oldB.tile_index,
00656 tile_union,n_near_tiles);
00657 }
00658 }
00659
00660
00661
00662 n--;
00663
00664
00665 diJ[n].jet->diJ_posn = jetA->diJ_posn;
00666 diJ[jetA->diJ_posn] = diJ[n];
00667
00668
00669
00670
00671 for (int itile = 0; itile < n_near_tiles; itile++) {
00672 Tile * tile = &_tiles[tile_union[itile]];
00673 tile->tagged = false;
00674
00675 for (TiledJet * jetI = tile->head; jetI != NULL; jetI = jetI->next) {
00676
00677 if (jetI->NN == jetA || (jetI->NN == jetB && jetB != NULL)) {
00678 jetI->NN_dist = _R2;
00679 jetI->NN = NULL;
00680
00681 for (Tile ** near_tile = tile->begin_tiles;
00682 near_tile != tile->end_tiles; near_tile++) {
00683
00684 for (TiledJet * jetJ = (*near_tile)->head;
00685 jetJ != NULL; jetJ = jetJ->next) {
00686 double dist = _bj_dist(jetI,jetJ);
00687 if (dist < jetI->NN_dist && jetJ != jetI) {
00688 jetI->NN_dist = dist; jetI->NN = jetJ;
00689 }
00690 }
00691 }
00692 diJ[jetI->diJ_posn].diJ = _bj_diJ(jetI);
00693 }
00694
00695
00696
00697 if (jetB != NULL) {
00698 double dist = _bj_dist(jetI,jetB);
00699 if (dist < jetI->NN_dist) {
00700 if (jetI != jetB) {
00701 jetI->NN_dist = dist;
00702 jetI->NN = jetB;
00703 diJ[jetI->diJ_posn].diJ = _bj_diJ(jetI);
00704 }
00705 }
00706 if (dist < jetB->NN_dist) {
00707 if (jetI != jetB) {
00708 jetB->NN_dist = dist;
00709 jetB->NN = jetI;}
00710 }
00711 }
00712 }
00713 }
00714
00715
00716 if (jetB != NULL) {diJ[jetB->diJ_posn].diJ = _bj_diJ(jetB);}
00717
00718 }
00719
00720
00721 delete[] diJ;
00722 delete[] briefjets;
00723 }
00724
00725
00726
00727
00728
00729
00730 void ClusterSequence::_minheap_faster_tiled_N2_cluster() {
00731
00732 _initialise_tiles();
00733
00734 int n = _jets.size();
00735 TiledJet * briefjets = new TiledJet[n];
00736 TiledJet * jetA = briefjets, * jetB;
00737 TiledJet oldB;
00738
00739
00740
00741
00742 vector<int> tile_union(3*n_tile_neighbours);
00743
00744
00745 for (int i = 0; i< n; i++) {
00746 _tj_set_jetinfo(jetA, i);
00747
00748 jetA++;
00749 }
00750 TiledJet * head = briefjets;
00751
00752
00753 vector<Tile>::const_iterator tile;
00754 for (tile = _tiles.begin(); tile != _tiles.end(); tile++) {
00755
00756 for (jetA = tile->head; jetA != NULL; jetA = jetA->next) {
00757 for (jetB = tile->head; jetB != jetA; jetB = jetB->next) {
00758 double dist = _bj_dist(jetA,jetB);
00759 if (dist < jetA->NN_dist) {jetA->NN_dist = dist; jetA->NN = jetB;}
00760 if (dist < jetB->NN_dist) {jetB->NN_dist = dist; jetB->NN = jetA;}
00761 }
00762 }
00763
00764 for (Tile ** RTile = tile->RH_tiles; RTile != tile->end_tiles; RTile++) {
00765 for (jetA = tile->head; jetA != NULL; jetA = jetA->next) {
00766 for (jetB = (*RTile)->head; jetB != NULL; jetB = jetB->next) {
00767 double dist = _bj_dist(jetA,jetB);
00768 if (dist < jetA->NN_dist) {jetA->NN_dist = dist; jetA->NN = jetB;}
00769 if (dist < jetB->NN_dist) {jetB->NN_dist = dist; jetB->NN = jetA;}
00770 }
00771 }
00772 }
00773
00774
00775 }
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796 vector<double> diJs(n);
00797 for (int i = 0; i < n; i++) {
00798 diJs[i] = _bj_diJ(&briefjets[i]);
00799 briefjets[i].label_minheap_update_done();
00800 }
00801 MinHeap minheap(diJs);
00802
00803 vector<TiledJet *> jets_for_minheap;
00804 jets_for_minheap.reserve(n);
00805
00806
00807 int history_location = n-1;
00808 while (n > 0) {
00809
00810 double diJ_min = minheap.minval() *_invR2;
00811 jetA = head + minheap.minloc();
00812
00813
00814 history_location++;
00815 jetB = jetA->NN;
00816
00817 if (jetB != NULL) {
00818
00819
00820
00821
00822
00823 if (jetA < jetB) {std::swap(jetA,jetB);}
00824
00825 int nn;
00826 _do_ij_recombination_step(jetA->_jets_index, jetB->_jets_index, diJ_min, nn);
00827
00828
00829 _bj_remove_from_tiles(jetA);
00830 oldB = * jetB;
00831 _bj_remove_from_tiles(jetB);
00832 _tj_set_jetinfo(jetB, nn);
00833
00834 } else {
00835
00836
00837 _do_iB_recombination_step(jetA->_jets_index, diJ_min);
00838 _bj_remove_from_tiles(jetA);
00839 }
00840
00841
00842 minheap.remove(jetA-head);
00843
00844
00845
00846
00847
00848 int n_near_tiles = 0;
00849 _add_untagged_neighbours_to_tile_union(jetA->tile_index,
00850 tile_union, n_near_tiles);
00851 if (jetB != NULL) {
00852 if (jetB->tile_index != jetA->tile_index) {
00853 _add_untagged_neighbours_to_tile_union(jetB->tile_index,
00854 tile_union,n_near_tiles);
00855 }
00856 if (oldB.tile_index != jetA->tile_index &&
00857 oldB.tile_index != jetB->tile_index) {
00858 _add_untagged_neighbours_to_tile_union(oldB.tile_index,
00859 tile_union,n_near_tiles);
00860 }
00861
00862 jetB->label_minheap_update_needed();
00863 jets_for_minheap.push_back(jetB);
00864 }
00865
00866
00867
00868
00869
00870 for (int itile = 0; itile < n_near_tiles; itile++) {
00871 Tile * tile = &_tiles[tile_union[itile]];
00872 tile->tagged = false;
00873
00874 for (TiledJet * jetI = tile->head; jetI != NULL; jetI = jetI->next) {
00875
00876 if (jetI->NN == jetA || (jetI->NN == jetB && jetB != NULL)) {
00877 jetI->NN_dist = _R2;
00878 jetI->NN = NULL;
00879
00880 if (!jetI->minheap_update_needed()) {
00881 jetI->label_minheap_update_needed();
00882 jets_for_minheap.push_back(jetI);}
00883
00884 for (Tile ** near_tile = tile->begin_tiles;
00885 near_tile != tile->end_tiles; near_tile++) {
00886
00887 for (TiledJet * jetJ = (*near_tile)->head;
00888 jetJ != NULL; jetJ = jetJ->next) {
00889 double dist = _bj_dist(jetI,jetJ);
00890 if (dist < jetI->NN_dist && jetJ != jetI) {
00891 jetI->NN_dist = dist; jetI->NN = jetJ;
00892 }
00893 }
00894 }
00895 }
00896
00897
00898
00899 if (jetB != NULL) {
00900 double dist = _bj_dist(jetI,jetB);
00901 if (dist < jetI->NN_dist) {
00902 if (jetI != jetB) {
00903 jetI->NN_dist = dist;
00904 jetI->NN = jetB;
00905
00906 if (!jetI->minheap_update_needed()) {
00907 jetI->label_minheap_update_needed();
00908 jets_for_minheap.push_back(jetI);}
00909 }
00910 }
00911 if (dist < jetB->NN_dist) {
00912 if (jetI != jetB) {
00913 jetB->NN_dist = dist;
00914 jetB->NN = jetI;}
00915 }
00916 }
00917 }
00918 }
00919
00920
00921 while (jets_for_minheap.size() > 0) {
00922 TiledJet * jetI = jets_for_minheap.back();
00923 jets_for_minheap.pop_back();
00924 minheap.update(jetI-head, _bj_diJ(jetI));
00925 jetI->label_minheap_update_done();
00926 }
00927 n--;
00928 }
00929
00930
00931 delete[] briefjets;
00932 }
00933
00934
00935 FASTJET_END_NAMESPACE
00936