source: trunk/src/Detection/sorting.cc @ 349

Last change on this file since 349 was 301, checked in by Matthew Whiting, 17 years ago

Mostly adding the distribution text to the start of files, with a few additional comments added too.

File size: 4.7 KB
Line 
1// -----------------------------------------------------------------------
2// sorting.cc: Sort the list of Detections by channel or velocity.
3// -----------------------------------------------------------------------
4// Copyright (C) 2006, Matthew Whiting, ATNF
5//
6// This program is free software; you can redistribute it and/or modify it
7// under the terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2 of the License, or (at your
9// option) any later version.
10//
11// Duchamp is distributed in the hope that it will be useful, but WITHOUT
12// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14// for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with Duchamp; if not, write to the Free Software Foundation,
18// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
19//
20// Correspondence concerning Duchamp may be directed to:
21//    Internet email: Matthew.Whiting [at] atnf.csiro.au
22//    Postal address: Dr. Matthew Whiting
23//                    Australia Telescope National Facility, CSIRO
24//                    PO Box 76
25//                    Epping NSW 1710
26//                    AUSTRALIA
27// -----------------------------------------------------------------------
28#include <vector>
29#include <algorithm>
30#include <Detection/detection.hh>
31
32using std::vector;
33
34/**
35 * A class to match things pair-wise (useful for sorting).
36 *
37 * This class is deigned to match two quantities to each other.  It
38 * was devised to find a way of taking a pair of lists that are
39 * matched, and sorting one list while keeping the second matched
40 * pair-wise.
41 *
42 * The elements are currently just assumed to be floats. This could be
43 * extended by templating, but at this stage we don't need to...
44 */
45class Pair
46{
47public:
48  Pair(){};
49  virtual ~Pair(){};
50  friend bool operator< (const Pair& lhs, const Pair& rhs){
51    /**
52     *  A comparison operator for pairs.  Compare the primary elements
53     *  of the two pairs, using the basic < operator.
54     */
55    return (lhs.primary < rhs.primary);
56  };
57  void define(float p, float m){
58    /** Basic assignment function. */
59    primary=p; matching=m;
60  };
61  float get1(){return primary;};
62  float get2(){return matching;};
63private:
64  float primary;  ///< The main element -- this will be the one that
65                  ///can be compared.
66  float matching; ///< The secondary element -- this cannot be
67                  ///compared with other objects, it just tracks the
68                  ///primary.
69};
70
71//======================================================================
72
73
74void SortByZ(vector <Detection> &inputList)
75{
76  /**
77   * A Function that takes a list of Detections and sorts them in
78   * order of increasing z-pixel value.  Upon return, the inputList
79   * is sorted.
80   *
81   * We use the std::stable_sort function, so that the order of
82   * objects with the same z-value is preserved.
83   * \param inputList List of Detections to be sorted.
84   * \return The inputList is returned with the elements sorted.
85   */
86
87  long size = inputList.size();
88  Pair *info = new Pair[size];
89 
90  for(int i=0;i<size;i++) info[i].define(inputList[i].getZcentre(), float(i));
91
92  std::stable_sort(info,info+size);
93 
94  vector <Detection> sorted;
95  for(int i=0;i<size;i++) sorted.push_back( inputList[int(info[i].get2())] );
96
97  delete [] info;
98
99  inputList.clear();
100  for(int i=0;i<size;i++) inputList.push_back( sorted[i] );
101  sorted.clear();
102 
103}
104
105//======================================================================
106
107void SortByVel(vector <Detection> &inputList)
108{
109  /**
110   * A Function that takes a list of Detections and sorts them in
111   *  order of increasing velocity.
112   * Every member of the vector needs to have WCS defined, (and if so,
113   *   then vel is assumed to be defined for all), otherwise no sorting
114   *   is done.
115   *
116   * We use the std::stable_sort function, so that the order of
117   * objects with the same z-value is preserved.
118   *
119   * \param inputList List of Detections to be sorted.
120   * \return The inputList is returned with the elements sorted,
121   * unless the WCS is not good for at least one element, in which
122   * case it is returned unaltered.
123   */
124
125  bool isGood = true;
126  for(int i=0;i<inputList.size();i++) isGood = isGood && inputList[i].isWCS();
127
128  if(isGood){
129
130    long size = inputList.size();
131    Pair *info = new Pair[size];
132   
133    for(int i=0;i<size;i++) info[i].define(inputList[i].getVel(), float(i));
134
135    std::stable_sort(info, info+size);
136 
137    vector <Detection> sorted;
138    for(int i=0;i<size;i++) sorted.push_back( inputList[int(info[i].get2())] );
139
140    delete [] info;
141
142    inputList.clear();
143    for(int i=0;i<size;i++) inputList.push_back( sorted[i] );
144    sorted.clear();
145 
146  }
147
148
Note: See TracBrowser for help on using the repository browser.