Skip to content
Snippets Groups Projects
Select Git revision
  • 32b476fca6d08b96c1a04b95958fbb9ec8e88609
  • master default protected
  • L2SDP-LIFT
  • L2SDP-1113
  • HPR-158
5 results

setup_radiohdl.sh

  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    applybandpass.h 2.72 KiB
    #ifndef APPLY_BANDPASS_H
    #define APPLY_BANDPASS_H
    
    #include "../structures/timefrequencydata.h"
    
    #include "bandpassfile.h"
    
    #include <string>
    
    namespace algorithms {
    
    class ApplyBandpass {
     public:
      static void Apply(TimeFrequencyData& data, BandpassFile& file,
                        const std::string& antenna1, const std::string& antenna2) {
        for (size_t i = 0; i != data.PolarizationCount(); ++i) {
          TimeFrequencyData polData = data.MakeFromPolarizationIndex(i);
          char pol1, pol2;
          switch (polData.GetPolarization(0)) {
            case aocommon::Polarization::XX:
              pol1 = 'X';
              pol2 = 'X';
              break;
            case aocommon::Polarization::XY:
              pol1 = 'X';
              pol2 = 'Y';
              break;
            case aocommon::Polarization::YX:
              pol1 = 'Y';
              pol2 = 'X';
              break;
            case aocommon::Polarization::YY:
              pol1 = 'Y';
              pol2 = 'Y';
              break;
            case aocommon::Polarization::LL:
              pol1 = 'L';
              pol2 = 'L';
              break;
            case aocommon::Polarization::LR:
              pol1 = 'L';
              pol2 = 'R';
              break;
            case aocommon::Polarization::RL:
              pol1 = 'R';
              pol2 = 'L';
              break;
            case aocommon::Polarization::RR:
              pol1 = 'R';
              pol2 = 'R';
              break;
            default:
              throw std::runtime_error("Can't apply a bandpass for polarization " +
                                       aocommon::Polarization::TypeToShortString(
                                           polData.GetPolarization(0)));
          }
    
          for (size_t imageIndex = 0; imageIndex != polData.ImageCount();
               ++imageIndex) {
            Image2DCPtr uncorrected = polData.GetImage(imageIndex);
            Image2DPtr newImage =
                apply(uncorrected, file, antenna1, antenna2, pol1, pol2);
            polData.SetImage(imageIndex, std::move(newImage));
          }
          data.SetPolarizationData(i, std::move(polData));
        }
      }
    
     private:
      static Image2DPtr apply(Image2DCPtr& uncorrected, BandpassFile& file,
                              const std::string& antenna1,
                              const std::string& antenna2, char pol1, char pol2) {
        Image2DPtr corrected =
            Image2D::MakePtr(uncorrected->Width(), uncorrected->Height());
        for (size_t ch = 0; ch != uncorrected->Height(); ++ch) {
          float val = 1.0 / (file.GetValue(antenna1, pol1, ch) *
                             file.GetValue(antenna2, pol2, ch));
          const num_t* ptrUncor = uncorrected->ValuePtr(0, ch);
          num_t* ptrCor = corrected->ValuePtr(0, ch);
          for (size_t x = 0; x != uncorrected->Width(); ++x) {
            ptrCor[x] = ptrUncor[x] * val;
          }
        }
        return corrected;
      }
    };
    
    }  // namespace algorithms
    
    #endif