File: msgridderdata.cpp

package info (click to toggle)
wsclean 3.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,968 kB
  • sloc: cpp: 85,742; python: 3,526; sh: 245; makefile: 21
file content (85 lines) | stat: -rw-r--r-- 3,095 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "msgridderdata.h"

#include "msprovidercollection.h"

namespace wsclean {

MsGridderData::MsGridderData(const Settings& settings)
    : settings_(settings),
      visibility_weighting_mode_(settings.visibilityWeightingMode) {
#ifdef HAVE_EVERYBEAM
  visibility_modifier_.SetBeamInfo(settings.beamMode,
                                   settings.beamNormalisationMode);
#endif
}

void MsGridderData::StartMeasurementSet(
    size_t ms_count, const MsProviderCollection::MsData& ms_data,
    bool is_predict) {
  visibility_modifier_.InitializeBda(ms_data.ms_provider->HasFrequencyBda());
  InitializePointResponse(ms_data);
  if (settings_.applyTimeFrequencySmearing) {
    visibility_modifier_.InitializeTimeFrequencySmearing(
        ms_data.ms_provider->GetObservationInfo(),
        ms_data.ms_provider->Interval());
  }
  if (visibility_modifier_.HasH5Parm()) {
    visibility_modifier_.InitializeCacheParmResponse(
        ms_data.antenna_names, ms_data.ms_provider->SelectedBands(),
        ms_data.original_ms_index);
  }
  original_ms_index_ = ms_data.original_ms_index;
  writer_lock_index_ =
      facet_group_index_ * ms_count + ms_data.original_ms_index;
  n_vis_polarizations_ = ms_data.ms_provider->NPolarizations();
  gain_mode_ = SelectGainMode(Polarization(), n_vis_polarizations_);
  const size_t n_channels = ms_data.ms_provider->NMaxChannels();
  scratch_image_weights_.resize(n_channels);
  if (is_predict) {
    scratch_model_data_.resize(n_channels *
                               ms_data.ms_provider->NPolarizations());
    predict_reader_ = ms_data.ms_provider->MakeReader();
  }
}

void MsGridderData::ReadPredictMetaData(MSProvider::MetaData& metadata) {
  predict_reader_->ReadMeta(metadata);
  predict_reader_->NextInputRow();
}

void MsGridderData::ResetVisibilityModifierCache(size_t ms_count) {
  visibility_modifier_.ResetCache(ms_count);
  visibility_modifier_.ResetSums();
}

void MsGridderData::InitializePointResponse(
    const MsProviderCollection::MsData& ms_data) {
#ifdef HAVE_EVERYBEAM
  if (settings_.applyFacetBeam || settings_.gridWithBeam) {
    const std::string element_response_string =
        !settings_.beamModel.empty() ? settings_.beamModel : "DEFAULT";
    std::optional<SynchronizedMS> optional_ms =
        ms_data.ms_provider->MsIfAvailable();
    if (!optional_ms) {
      throw std::runtime_error(
          "Can not compute the beam without an on-disk measurement set");
    }
    visibility_modifier_.InitializePointResponse(
        std::move(*optional_ms), settings_.facetBeamUpdateTime,
        element_response_string, ms_data.ms_provider->SelectedBands(),
        settings_.dataColumnName, settings_.mwaPath);
  } else {
    visibility_modifier_.SetNoPointResponse();
  }
#else
  if (settings_.applyFacetBeam || settings_.gridWithBeam) {
    throw std::runtime_error(
        "-apply-facet-beam or -grid-with-beam was set, but wsclean was not "
        "compiled "
        "with EveryBeam. Please compile wsclean with EveryBeam to "
        "use the Facet Beam functionality");
  }
#endif
}

}  // namespace wsclean