Skip to content

Commit

Permalink
Refs #7449 struct for sorting peaks
Browse files Browse the repository at this point in the history
  • Loading branch information
Vickie Lynch committed Aug 19, 2013
1 parent 808795a commit 405d13c
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,19 @@ namespace Algorithms
/// Implement abstract Algorithm methods
void exec();
double moment(MantidVec& X, size_t n, double mean, int k);
struct cont_peak
{
size_t start;
size_t stop;
double maxY;
};
struct by_len
{
bool operator()(cont_peak const &a, cont_peak const &b)
{
return a.maxY > b.maxY;
}
};

};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,54 +147,58 @@ namespace Algorithms
}
while (std::abs(Ymean-Yvariance) > k * Ysigma);

// remove single outliers

if (mask[1] == mask[2] && mask[2] == mask[3])
mask[0] = mask[1];
if (mask[0] == mask[2] && mask[2] == mask[3])
mask[1] = mask[2];
for (size_t l = 2; l < n-2; ++l)
{
if (mask[l-1] == mask[l+1] && (mask[l-1] == mask[l-2] || mask[l+1] == mask[l+2]))
{
mask[l] = mask[l+1];
}
}
if (mask[n-2] == mask[n-3] && mask[n-3] == mask[n-4])
mask[n-1] = mask[n-2];
if (mask[n-1] == mask[n-3] && mask[n-3] == mask[n-4])
mask[n-2] = mask[n-1];

// mask regions not connected to largest region
vector<size_t> cont_start;
vector<size_t> cont_stop;
for (size_t l = 1; l < n-1; ++l)
{
if (mask[l] != mask[l-1] && mask[l] == 1)
if(n > 5)
{
// remove single outliers
if (mask[1] == mask[2] && mask[2] == mask[3])
mask[0] = mask[1];
if (mask[0] == mask[2] && mask[2] == mask[3])
mask[1] = mask[2];
for (size_t l = 2; l < n-3; ++l)
{
cont_start.push_back(l);
if (mask[l-1] == mask[l+1] && (mask[l-1] == mask[l-2] || mask[l+1] == mask[l+2]))
{
mask[l] = mask[l+1];
}
}
if (mask[l] != mask[l-1] && mask[l] == 0)
if (mask[n-2] == mask[n-3] && mask[n-3] == mask[n-4])
mask[n-1] = mask[n-2];
if (mask[n-1] == mask[n-3] && mask[n-3] == mask[n-4])
mask[n-2] = mask[n-1];

// mask regions not connected to largest region
// for loop can start > 1 for multiple peaks
vector<cont_peak> peaks;
for (size_t l = 1; l < n; ++l)
{
cont_stop.push_back(l-1);
if (mask[l] != mask[l-1] && mask[l] == 1)
{
peaks.push_back(cont_peak());
peaks[peaks.size()-1].start = l;
}
if (peaks.size() > 0)
{
size_t ipeak = peaks.size()-1;
if (mask[l] != mask[l-1] && mask[l] == 0)
{
peaks[ipeak].stop = l-1;
}
if (inpY[l] > peaks[ipeak].maxY) peaks[ipeak].maxY = inpY[l];
}
}
}
if(cont_start.size() > cont_stop.size()) cont_stop.push_back(n-1);
vector<size_t> cont_len;
for (size_t l = 0; l < cont_start.size(); ++l)
{
cont_len.push_back(cont_stop[l] - cont_start[l] + 1);
}
std::vector<size_t>::iterator ic = std::max_element(cont_len.begin(), cont_len.end());
const size_t c = ic - cont_len.begin();
for (size_t l = 0; l < cont_len.size(); ++l)
{
if (l != c) for (size_t j = cont_start[l]; j <= cont_stop[l]; ++j)
if(peaks.size()> 0)
{
mask[j] = 0;
if(peaks[peaks.size()-1].stop == 0) peaks[peaks.size()-1].stop = n-1;
std::sort(peaks.begin(), peaks.end(), by_len());
for (size_t l = 1; l < peaks.size(); ++l)
{
for (size_t j = peaks[l].start; j <= peaks[l].stop; ++j)
{
mask[j] = 0;
}
}
}
}

}
// save output of mask * Y
vecX = inpX;
std::transform(mask.begin(), mask.end(), inpY.begin(), vecY.begin(), std::multiplies<double>());
Expand Down

0 comments on commit 405d13c

Please sign in to comment.