Custom LAi script returning all nulls

Hey everyone,
I’m running a custom LAI script,
with multiple timestamps in same tif but it’s returning only null values.

When I check B04 instead of LAI, it’s also coming up as null.

Any ideas on what might be causing this?

Thanks in advance!

### LAI normal process api

# Configuration
config = SHConfig()

# Define evalscript to calculate LAI
evalscript = """
//VERSION=3
var degToRad = Math.PI / 180;

function evaluatePixelOrig(samples) {
  var sample = samples[0];
  var b03_norm = normalize(sample.B03, 0, 0.253061520471542);
  var b04_norm = normalize(sample.B04, 0, 0.290393577911328);
  var b05_norm = normalize(sample.B05, 0, 0.305398915248555);
  var b06_norm = normalize(sample.B06, 0.006637972542253, 0.608900395797889);
  var b07_norm = normalize(sample.B07, 0.013972727018939, 0.753827384322927);
  var b8a_norm = normalize(sample.B8A, 0.026690138082061, 0.782011770669178);
  var b11_norm = normalize(sample.B11, 0.016388074192258, 0.493761397883092);
  var b12_norm = normalize(sample.B12, 0, 0.493025984460231);
  var viewZen_norm = normalize(Math.cos(sample.viewZenithMean * degToRad), 0.918595400582046, 1);
  var sunZen_norm  = normalize(Math.cos(sample.sunZenithAngles * degToRad), 0.342022871159208, 0.936206429175402);
  var relAzim_norm = Math.cos((sample.sunAzimuthAngles - sample.viewAzimuthMean) * degToRad)

  var n1 = neuron1(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm);
  var n2 = neuron2(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm);
  var n3 = neuron3(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm);
  var n4 = neuron4(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm);
  var n5 = neuron5(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm);

  var l2 = layer2(n1, n2, n3, n4, n5);

  var lai = denormalize(l2, 0.000319182538301, 14.4675094548151);
  return {
    default: [lai]
  }
}

function neuron1(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm) {
  var sum =
	+ 4.96238030555279
	- 0.023406878966470 * b03_norm
	+ 0.921655164636366 * b04_norm
	+ 0.135576544080099 * b05_norm
	- 1.938331472397950 * b06_norm
	- 3.342495816122680 * b07_norm
	+ 0.902277648009576 * b8a_norm
	+ 0.205363538258614 * b11_norm
	- 0.040607844721716 * b12_norm
	- 0.083196409727092 * viewZen_norm
	+ 0.260029270773809 * sunZen_norm
	+ 0.284761567218845 * relAzim_norm;

  return tansig(sum);
}

function neuron2(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm) {
  var sum =
	+ 1.416008443981500
	- 0.132555480856684 * b03_norm
	- 0.139574837333540 * b04_norm
	- 1.014606016898920 * b05_norm
	- 1.330890038649270 * b06_norm
	+ 0.031730624503341 * b07_norm
	- 1.433583541317050 * b8a_norm
	- 0.959637898574699 * b11_norm
	+ 1.133115706551000 * b12_norm
	+ 0.216603876541632 * viewZen_norm
	+ 0.410652303762839 * sunZen_norm
	+ 0.064760155543506 * relAzim_norm;

  return tansig(sum);
}

function neuron3(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm) {
  var sum =
	+ 1.075897047213310
	+ 0.086015977724868 * b03_norm
	+ 0.616648776881434 * b04_norm
	+ 0.678003876446556 * b05_norm
	+ 0.141102398644968 * b06_norm
	- 0.096682206883546 * b07_norm
	- 1.128832638862200 * b8a_norm
	+ 0.302189102741375 * b11_norm
	+ 0.434494937299725 * b12_norm
	- 0.021903699490589 * viewZen_norm
	- 0.228492476802263 * sunZen_norm
	- 0.039460537589826 * relAzim_norm;

  return tansig(sum);
}

function neuron4(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm) {
  var sum =
	+ 1.533988264655420
	- 0.109366593670404 * b03_norm
	- 0.071046262972729 * b04_norm
	+ 0.064582411478320 * b05_norm
	+ 2.906325236823160 * b06_norm
	- 0.673873108979163 * b07_norm
	- 3.838051868280840 * b8a_norm
	+ 1.695979344531530 * b11_norm
	+ 0.046950296081713 * b12_norm
	- 0.049709652688365 * viewZen_norm
	+ 0.021829545430994 * sunZen_norm
	+ 0.057483827104091 * relAzim_norm;

  return tansig(sum);
}

function neuron5(b03_norm,b04_norm,b05_norm,b06_norm,b07_norm,b8a_norm,b11_norm,b12_norm, viewZen_norm,sunZen_norm,relAzim_norm) {
  var sum =
	+ 3.024115930757230
	- 0.089939416159969 * b03_norm
	+ 0.175395483106147 * b04_norm
	- 0.081847329172620 * b05_norm
	+ 2.219895367487790 * b06_norm
	+ 1.713873975136850 * b07_norm
	+ 0.713069186099534 * b8a_norm
	+ 0.138970813499201 * b11_norm
	- 0.060771761518025 * b12_norm
	+ 0.124263341255473 * viewZen_norm
	+ 0.210086140404351 * sunZen_norm
	- 0.183878138700341 * relAzim_norm;

  return tansig(sum);
}

function layer2(neuron1, neuron2, neuron3, neuron4, neuron5) {
  var sum =
	+ 1.096963107077220
	- 1.500135489728730 * neuron1
	- 0.096283269121503 * neuron2
	- 0.194935930577094 * neuron3
	- 0.352305895755591 * neuron4
	+ 0.075107415847473 * neuron5;

  return sum;
}

function normalize(unnormalized, min, max) {
  return 2 * (unnormalized - min) / (max - min) - 1;
}
function denormalize(normalized, min, max) {
  return 0.5 * (normalized + 1) * (max - min) + min;
}
function tansig(input) {
  return 2 / (1 + Math.exp(-2 * input)) - 1; 
}

// The following function is designed to update the number of
// output bands without knowing beforehand how many there are
function updateOutput(outputs, collection) {
    Object.values(outputs).forEach((output) => {
        output.bands = collection.scenes.length;
    });
}
  
// function to generate a json file with a list of the LAI
// dates used in the analysis. 
function updateOutputMetadata(scenes, inputMetadata, outputMetadata) {
        var dds = [];
        for (i=0; i<scenes.length; i++){
            dds.push(scenes[i].date)
        }
        outputMetadata.userData = { "acquisition_dates":  JSON.stringify(dds) }
    }

function setup() {
  return {
    input: [{
      bands: [
          "B03", "B04", "B05", "B06", "B07", "B8A", "B11", "B12",
          "viewZenithMean", "viewAzimuthMean", "sunZenithAngles", "sunAzimuthAngles"
      ]
    }],
        output: [
        {id: "default", bands: 1, sampleType: SampleType.FLOAT32},
      ],
      mosaicking: Mosaicking.ORBIT
  }
}

function evaluatePixel(samples) {
    // Precompute an array to contain LAI observations
    var n_observations = samples.length;
    let default_band = new Array(n_observations).fill(0);
    
    // Fill the array with LAI values
    samples.forEach((sample, index) => {
      var laiResult = evaluatePixelOrig([sample]);
      default_band[index] = laiResult.default[0];
    });
                       
    return [default_band]
  }


"""


# Set up the request
request = SentinelHubRequest(
    evalscript=evalscript,
    input_data=[
        SentinelHubRequest.input_data(
            data_collection=DataCollection.SENTINEL2_L2A,
            time_interval=('2020-03-01', '2020-03-10'),
        ),
    ],
    responses=[
        SentinelHubRequest.output_response("default", MimeType.TIFF),
        SentinelHubRequest.output_response('userdata', MimeType.JSON),
    ],
    config=config,
    bbox=aoi_bbox,
    size=(s2_ds.sizes["x"], s2_ds.sizes["y"]),
    data_folder="data",
)


I wonder if the bbox needs to be in a particular CRS


Hi there! Can you share the specific area of interest and time range. Might not be the case, but before we go any further let’s check there is some imagery for this time period and area of interest :slight_smile: