class RayleighCorrAlgorithm {

    double[] getFourierSeries(double rayleighOpticalThickness, double massAir, double cosOZARad,
                              double cosSZARad, List<double[]> interpolateValues, double[] fourierSeriesCof) {
        double[] rhoRm = new double[fourierSeriesCof.length];
        for (int i = 0; i < fourierSeriesCof.length; i++) {
            double[] interpolatedValueABCD = interpolateValues.get(i);
            double a = interpolatedValueABCD[0];
            double b = interpolatedValueABCD[1];
            double c = interpolatedValueABCD[2];
            double d = interpolatedValueABCD[3];

            double rayPrimaryScatters = (fourierSeriesCof[i] / (4.0 * (cosSZARad + cosOZARad))) * (1.0 - Math.exp(-massAir * rayleighOpticalThickness));
            double rayMultiCorr = a + b * rayleighOpticalThickness + c * Math.pow(rayleighOpticalThickness, 2) + d * Math.pow(rayleighOpticalThickness, 3);
            rhoRm[i] = rayMultiCorr * rayPrimaryScatters;
        }
        return rhoRm;
    }

    public  RayleighCorrAlgorithm(String bandPattern, int numBands);
    public  RayleighCorrAlgorithm(Sensor sensor);

}