1 #ifndef __FASTJET_NNH_HH__
2 #define __FASTJET_NNH_HH__
32 #include<fastjet/ClusterSequence.hh>
35 FASTJET_BEGIN_NAMESPACE
48 NNHInfo(I * info) : _info(info) {}
49 template<
class NNBJ>
void init_jet(NNBJ * briefjet,
const fastjet::PseudoJet & jet,
int index) { briefjet->init(jet, index, _info);}
60 template<
class NNBJ>
void init_jet(NNBJ * briefjet,
const fastjet::PseudoJet & jet,
int index) { briefjet->init(jet, index);}
111 template<
class BJ,
class I = _NoInfo>
class NNH :
public NNHInfo<I> {
116 NNH(
const std::vector<PseudoJet> & jets) {start(jets);}
117 NNH(
const std::vector<PseudoJet> & jets, I * info) :
NNHInfo<I>(info) {start(jets);}
119 void start(
const std::vector<PseudoJet> & jets);
123 double dij_min(
int & iA,
int & iB);
126 void remove_jet(
int iA);
130 void merge_jets(
int iA,
int iB,
const PseudoJet & jet,
int jet_index);
143 void set_NN_crosscheck(NNBJ * jet, NNBJ * begin, NNBJ * end);
147 void set_NN_nocross (NNBJ * jet, NNBJ * begin, NNBJ * end);
159 std::vector<NNBJ *> where_is;
163 class NNBJ :
public BJ {
165 void init(
const PseudoJet & jet,
int index_in) {
167 other_init(index_in);
169 void init(
const PseudoJet & jet,
int index_in, I * info) {
171 other_init(index_in);
173 void other_init(
int index_in) {
175 NN_dist = BJ::beam_distance();
178 int index()
const {
return _index;}
192 template<
class BJ,
class I>
void NNH<BJ,I>::start(
const std::vector<PseudoJet> & jets) {
194 briefjets =
new NNBJ[n];
195 where_is.resize(2*n);
197 NNBJ * jetA = briefjets;
200 for (
int i = 0; i< n; i++) {
202 this->init_jet(jetA, jets[i], i);
211 for (jetA = head + 1; jetA != tail; jetA++) {
215 set_NN_crosscheck(jetA, head, jetA);
224 double diJ_min = briefjets[0].NN_dist;
226 for (
int i = 1; i < n; i++) {
227 if (briefjets[i].NN_dist < diJ_min) {
229 diJ_min = briefjets[i].NN_dist;
234 NNBJ * jetA = & briefjets[diJ_min_jet];
237 iB = jetA->NN ? jetA->NN->index() : -1;
245 NNBJ * jetA = where_is[iA];
252 where_is[jetA->index()] = jetA;
254 for (NNBJ * jetI = head; jetI != tail; jetI++) {
256 if (jetI->NN == jetA) set_NN_nocross(jetI, head, tail);
259 if (jetI->NN == tail) {jetI->NN = jetA;}
268 NNBJ * jetA = where_is[iA];
269 NNBJ * jetB = where_is[iB];
275 if (jetA < jetB) std::swap(jetA,jetB);
279 this->init_jet(jetB, jet, index);
281 if (index >=
int(where_is.size())) where_is.resize(2*index);
282 where_is[jetB->index()] = jetB;
290 where_is[jetA->index()] = jetA;
292 for (NNBJ * jetI = head; jetI != tail; jetI++) {
294 if (jetI->NN == jetA || jetI->NN == jetB) {
295 set_NN_nocross(jetI, head, tail);
300 double dist = jetI->distance(jetB);
301 if (dist < jetI->NN_dist) {
303 jetI->NN_dist = dist;
307 if (dist < jetB->NN_dist) {
309 jetB->NN_dist = dist;
315 if (jetI->NN == tail) {jetI->NN = jetA;}
323 NNBJ * begin, NNBJ * end) {
324 double NN_dist = jet->beam_distance();
326 for (NNBJ * jetB = begin; jetB != end; jetB++) {
327 double dist = jet->distance(jetB);
328 if (dist < NN_dist) {
332 if (dist < jetB->NN_dist) {
333 jetB->NN_dist = dist;
338 jet->NN_dist = NN_dist;
345 template <
class BJ,
class I>
void NNH<BJ,I>::set_NN_nocross(
346 NNBJ * jet, NNBJ * begin, NNBJ * end) {
347 double NN_dist = jet->beam_distance();
352 for (NNBJ * jetB = begin; jetB != jet; jetB++) {
353 double dist = jet->distance(jetB);
354 if (dist < NN_dist) {
363 for (NNBJ * jetB = jet+1; jetB != end; jetB++) {
364 double dist = jet->distance (jetB);
365 if (dist < NN_dist) {
372 jet->NN_dist = NN_dist;
378 FASTJET_END_NAMESPACE
381 #endif // __FASTJET_NNH_HH__
NNH(const std::vector< PseudoJet > &jets)
constructor with an initial set of jets (which will be assigned indices 0 ...
Help solve closest pair problems with generic interparticle and beam distance.
template that will help initialise a BJ with a PseudoJet and extra information
dummy class, used as a default template argument
Class to contain pseudojets, including minimal information of use to jet-clustering routines...