19 #include "ioda/ObsDataVector.h"
20 #include "oops/util/IntSetParser.h"
21 #include "oops/util/missingValues.h"
28 static ObsFunctionMaker<InterChannelConsistencyCheck>
40 std::copy(channelset.begin(), channelset.end(), std::back_inserter(
channels_));
60 std::string inst, sat;
64 const size_t nlocs = in.
nlocs();
77 std::vector<int> qcflagdata(nlocs);
78 std::vector<float> obserrdata(nlocs);
79 std::vector<std::vector<float>> varinv(nchans, std::vector<float>(nlocs, 0.0));
80 for (
size_t ichan = 0; ichan < nchans; ++ichan) {
83 for (
size_t iloc = 0; iloc < nlocs; ++iloc) {
84 if (flaggrp ==
"PreQC") obserrdata[iloc] ==
missing ? qcflagdata[iloc] = 100
85 : qcflagdata[iloc] = 0;
86 (qcflagdata[iloc] == 0) ? (varinv[ichan][iloc] = 1.0 / pow(obserrdata[iloc], 2))
87 : (varinv[ichan][iloc] = 0.0);
93 if (inst ==
"atms") ncheck = 7;
94 for (
size_t iloc = 0; iloc < nlocs; ++iloc) {
95 for (
int ichan = 0; ichan < nchans; ++ichan) out[ichan][iloc] = 0;
97 for (
int ichan = 1; ichan < ncheck; ++ichan) {
98 int channel = ichan + 1;
99 if (varinv[ichan][iloc] <= 0.0 && use_flag[ichan] >= 1) {
100 kval = std::max(channel-1, kval);
101 if ((inst ==
"amsua" || inst ==
"atms") && channel <= 3) kval = 0;
105 for (
int ichan = 0; ichan < kval; ++ichan) out[ichan][iloc] = 1;
106 if (inst ==
"amsua") {
108 out[channel-1][iloc] = 1;
110 if (inst ==
"atms") {
112 out[channel-1][iloc] = 1;
114 out[channel-1][iloc] = 1;
116 out[channel-1][iloc] = 1;