| 149 | } |
| 150 | |
| 151 | PointViewSet PMFFilter::run(PointViewPtr input) |
| 152 | { |
| 153 | PointViewSet viewSet{input}; |
| 154 | // Segment input view into ignored/kept views. |
| 155 | PointViewPtr ignoredView = input->makeNew(); |
| 156 | PointViewPtr keptView = input->makeNew(); |
| 157 | |
| 158 | if (m_args->m_ignored.empty()) |
| 159 | keptView->append(*input); |
| 160 | else |
| 161 | Segmentation::ignoreDimRanges(m_args->m_ignored, input, keptView, |
| 162 | ignoredView); |
| 163 | |
| 164 | // Check for 0's in ReturnNumber and NumberOfReturns |
| 165 | bool nrOneZero(false); |
| 166 | bool rnOneZero(false); |
| 167 | bool nrAllZero(true); |
| 168 | bool rnAllZero(true); |
| 169 | for (PointRef p : *keptView) |
| 170 | { |
| 171 | uint8_t nr = p.getFieldAs<uint8_t>(Id::NumberOfReturns); |
| 172 | uint8_t rn = p.getFieldAs<uint8_t>(Id::ReturnNumber); |
| 173 | if ((nr == 0) && !nrOneZero) |
| 174 | nrOneZero = true; |
| 175 | if ((rn == 0) && !rnOneZero) |
| 176 | rnOneZero = true; |
| 177 | if (nr != 0) |
| 178 | nrAllZero = false; |
| 179 | if (rn != 0) |
| 180 | rnAllZero = false; |
| 181 | } |
| 182 | |
| 183 | if ((nrOneZero || rnOneZero) && !(nrAllZero && rnAllZero)) |
| 184 | throwError("Some NumberOfReturns or ReturnNumber values were 0, but " |
| 185 | "not all. Check that all values in the input file are >= " |
| 186 | "1."); |
| 187 | |
| 188 | // Segment kept view into two views |
| 189 | PointViewPtr inlierView = keptView->makeNew(); |
| 190 | PointViewPtr outlierView = keptView->makeNew(); |
| 191 | if (nrAllZero && rnAllZero) |
| 192 | { |
| 193 | log()->get(LogLevel::Warning) |
| 194 | << "Both NumberOfReturns and ReturnNumber are filled with 0's. " |
| 195 | "Proceeding without any further return filtering.\n"; |
| 196 | inlierView->append(*keptView); |
| 197 | } |
| 198 | else |
| 199 | { |
| 200 | Segmentation::segmentReturns(keptView, inlierView, outlierView, |
| 201 | m_args->m_returns); |
| 202 | } |
| 203 | |
| 204 | if (!inlierView->size()) |
| 205 | throwError("No returns to process."); |
| 206 | |
| 207 | if (!m_onlyGround) |
| 208 | { |
nothing calls this directly
no test coverage detected