source: trunk/src/RasterEdgeDetector.cpp @ 2613

Last change on this file since 2613 was 2613, checked in by Takeshi Nakazato, 12 years ago

New Development: Yes

JIRA Issue: Yes CAS-2825

Ready for Test: No

Interface Changes: Yes

What Interface Changed: added new python module sd.edgemarker

Test Programs: not available

Put in Release Notes: Yes

Module(s): Module Names change impacts.

Description: Describe your changes here...

New python module edgemarker is available. The edgemarker is a tool to
detect edge of observed area and mark data near edge as OFF. It can be
used to calibrate OTF data without explicit OFF scan.


File size: 3.7 KB
Line 
1//
2// C++ Implimentation: RasterEdgeDetector
3//
4// Description:
5//
6//
7// Author: Takeshi Nakazato <takeshi.nakazato@nao.ac.jp>, (C) 2012
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12#include <casa/Arrays/Vector.h>
13#include <casa/Arrays/ArrayMath.h>
14#include <casa/Arrays/ArrayIO.h>
15#include <casa/Containers/Record.h>
16//#include <casa/Utilities/GenSort.h>
17
18#include "RasterEdgeDetector.h"
19
20using namespace std ;
21using namespace casa ;
22
23namespace asap {
24
25RasterEdgeDetector::RasterEdgeDetector()
26  : EdgeDetector()
27{}
28
29RasterEdgeDetector::~RasterEdgeDetector()
30{}
31
32Vector<uInt> RasterEdgeDetector::detect()
33{
34  initDetect() ;
35
36  detectGap() ;
37  selection() ;
38 
39  return off_ ;
40}
41
42void RasterEdgeDetector::parseOption( const Record &option )
43{
44  os_.origin(LogOrigin( "RasterEdgeDetector", "parseOption", WHERE )) ;
45
46  String name = "fraction" ;
47  if ( option.isDefined( name ) ) {
48    if ( option.dataType( name ) == TpString ) {
49      String fstr = option.asString( name ) ;
50      if ( fstr == "auto" ) {
51        fraction_ = -1.0 ; // indicates "auto"
52      }
53      else {
54        // should be "xx%" format
55        fstr.rtrim( '%' ) ;
56        fraction_ = String::toFloat( fstr ) * 0.01 ;
57      }
58    }
59    else {
60      fraction_ = option.asFloat( name ) ;
61    }
62  }
63  else {
64    fraction_ = 0.1 ; // default is 10%
65  }
66  name = "npts" ;
67  if ( option.isDefined( name ) ) {
68    npts_ = option.asInt( name ) ;
69  }
70  else {
71    npts_ = -1 ; // default is -1 (use fraction_)
72  }
73
74  os_ << "OPTION SUMMARY: " << endl
75      << "   fraction=" << fraction_ << endl
76      << "   npts=" << npts_ << LogIO::POST ;
77}
78
79void RasterEdgeDetector::detectGap()
80{
81  os_.origin(LogOrigin( "RasterEdgeDetector", "detectGap", WHERE )) ;
82
83  uInt n = time_.nelements() ;
84  Vector<Double> tdiff( n-1 ) ;
85  for ( uInt i = 0 ; i < n-1 ; i++ ) {
86    tdiff[i] = time_[i+1] - time_[i] ;
87  }
88  Double tmed = median( tdiff, False, True, False ) ;
89  Double threshold = tmed * 5.0 ;
90  uInt idx = 0 ;
91  tempuInt_[idx++] = 0 ;
92  for ( uInt i = 0 ; i < n-1 ; i++ ) {
93    if ( tdiff[i] > threshold ) {
94      tempuInt_[idx++] = i+1 ;
95    }
96  }
97  if ( tempuInt_[idx-1] != n ) {
98    tempuInt_[idx++] = n ;
99  }
100  gaplist_ = vectorFromTempStorage( idx ) ;
101}
102
103void RasterEdgeDetector::selection()
104{
105  os_.origin(LogOrigin( "RasterEdgeDetector", "selection", WHERE )) ;
106
107  uInt n = gaplist_.nelements() - 1 ;
108  uInt idx = 0 ;
109  for ( uInt i = 0 ; i < n ; i++ ) {
110    uInt start = gaplist_[i] ;
111    uInt end = gaplist_[i+1] ;
112    selectionPerRow( idx, start, end ) ;
113  }
114  off_ = vectorFromTempStorage( idx ) ;
115  //sort( off_, Sort::Ascending, Sort::QuickSort | Sort::NoDuplicates ) ;
116}
117
118void RasterEdgeDetector::selectionPerRow( uInt &idx,
119                                          const uInt &start,
120                                          const uint &end )
121{
122  os_.origin(LogOrigin( "RasterEdgeDetector", "selectionPerRow", WHERE )) ;
123
124  uInt len = end - start ;
125  uInt noff = numOff( len ) ;
126
127  if ( len >  noff * 2 ) {
128    uInt n = start + noff ;
129    for ( uInt i = start ; i < n ; i++ ) {
130      tempuInt_[idx++] = i ;
131    }
132    n = end - noff ;
133    for ( uInt i = n ; i < end ; i++ ) {
134      tempuInt_[idx++] = i ;
135    }
136  }
137  else {
138    // add all elements to off position list
139    for ( uInt i = start ; i < end ; i++ ) {
140      tempuInt_[idx++] = i ;
141    }
142  }
143}
144                                         
145uInt RasterEdgeDetector::numOff( const uInt &n )
146{
147  uInt ret = 0 ;
148  if ( npts_ > 0 ) {
149    ret = min( (uInt)npts_, n ) ;
150  }
151  else if ( fraction_ < 0 ) {
152    ret = optimumNumber( n ) ;
153  }
154  else {
155    ret = int( n * fraction_ ) ;
156  }
157  return ((ret > 0) ? ret : 1) ;
158}
159
160uInt RasterEdgeDetector::optimumNumber( const uInt &n )
161{
162  return uInt( sqrt( n + 1 ) ) - 1 ;
163}
164
165} // namespace asap
Note: See TracBrowser for help on using the repository browser.