source: tags/release-1.1.7/src/Detection/sorting.cc

Last change on this file was 536, checked in by MatthewWhiting, 15 years ago

Including the recent minor changes to 1.1.7.

File size: 4.9 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 <duchamp/Detection/detection.hh>
31
32using std::vector;
33
34/// @brief
35/// A class to match things pair-wise (useful for sorting).
36///
37/// @details This class is deigned to match two quantities to each
38/// other.  It was devised to find a way of taking a pair of lists
39/// that are matched, and sorting one list while keeping the second
40/// matched 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...
44class Pair
45{
46public:
47  Pair(){};
48  virtual ~Pair(){};
49  friend bool operator< (const Pair& lhs, const Pair& rhs){
50    ///  A comparison operator for pairs.  Compare the primary elements
51    ///  of the two pairs, using the basic < operator.
52    return (lhs.primary < rhs.primary);
53  };
54  void define(float p, float m){
55    /// Basic assignment function.
56    primary=p; matching=m;
57  };
58  float get1(){return primary;};
59  float get2(){return matching;};
60private:
61  float primary;  ///< The main element -- this will be the one that
62                  ///can be compared.
63  float matching; ///< The secondary element -- this cannot be
64                  ///compared with other objects, it just tracks the
65                  ///primary.
66};
67
68//======================================================================
69
70namespace duchamp
71{
72
73  void SortByZ(vector <Detection> &inputList)
74  {
75    /// A Function that takes a list of Detections and sorts them in
76    /// order of increasing z-pixel value.  Upon return, the inputList
77    /// is sorted.
78    ///
79    /// We use the std::stable_sort function, so that the order of
80    /// objects with the same z-value is preserved.
81    /// \param inputList List of Detections to be sorted.
82    /// \return The inputList is returned with the elements sorted.
83
84    long size = inputList.size();
85    Pair *info = new Pair[size];
86 
87    for(int i=0;i<size;i++) info[i].define(inputList[i].getZcentre(), float(i));
88
89    std::stable_sort(info,info+size);
90 
91    vector <Detection> sorted;
92    for(int i=0;i<size;i++) sorted.push_back( inputList[int(info[i].get2())] );
93
94    delete [] info;
95
96    inputList.clear();
97    for(int i=0;i<size;i++) inputList.push_back( sorted[i] );
98    sorted.clear();
99 
100  }
101
102  //======================================================================
103
104  void SortByVel(vector <Detection> &inputList)
105  {
106    /// @details
107    /// A Function that takes a list of Detections and sorts them in
108    ///  order of increasing velocity.
109    /// Every member of the vector needs to have WCS defined, (and if so,
110    ///   then vel is assumed to be defined for all), otherwise no sorting
111    ///   is done.
112    ///
113    /// We use the std::stable_sort function, so that the order of
114    /// objects with the same z-value is preserved.
115    ///
116    /// \param inputList List of Detections to be sorted.
117    /// \return The inputList is returned with the elements sorted,
118    /// unless the WCS is not good for at least one element, in which
119    /// case it is returned unaltered.
120
121    bool isGood = true;
122    for(uint i=0;i<inputList.size();i++) isGood = isGood && inputList[i].isWCS();
123
124    if(isGood){
125
126      long size = inputList.size();
127      Pair *info = new Pair[size];
128   
129      for(int i=0;i<size;i++) info[i].define(inputList[i].getVel(), float(i));
130
131      std::stable_sort(info, info+size);
132 
133      vector <Detection> sorted;
134      for(int i=0;i<size;i++) sorted.push_back( inputList[int(info[i].get2())] );
135
136      delete [] info;
137
138      inputList.clear();
139      for(int i=0;i<size;i++) inputList.push_back( sorted[i] );
140      sorted.clear();
141 
142    }
143
144  } 
145
146}
Note: See TracBrowser for help on using the repository browser.