source: branches/pixelmap-refactor-branch/src/Detection/sorting.cc @ 1441

Last change on this file since 1441 was 541, checked in by MatthewWhiting, 15 years ago

Changing all calls of uint to unsigned int, as there are sometimes compilers that don't know about that typedef. Also added an include call for stdlib.h to fitsHeader.cc so that it knows about calloc.

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(unsigned int 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.