[GRASS-dev] [GRASS GIS] #3891: t.rast.algebra: if clause with two conditions does not work properly

#3891: t.rast.algebra: if clause with two conditions does not work properly
---------------------------------------+-------------------------
Reporter: veroandreo | Owner: grass-dev@…
     Type: defect | Status: new
Priority: normal | Milestone: 7.8.0
Component: Temporal | Version: unspecified
Keywords: t.rast.algebra, r.mapcalc | CPU: Unspecified
Platform: Unspecified |
---------------------------------------+-------------------------
I have a daily lst time series that I converted to celsius degrees. I want
to count how many days per year have LST >= 20 and <= 30. So, I first do
the following:

{{{
t.rast.algebra expression="tmean_higher20_lower30 = if(lst_daily_celsius
>= 20.0 && lst_daily_celsius <= 30.0, lst_daily_celsius, null())"
basename=tmean_higher20_lower30 suffix=gran nprocs=7
}}}

with the intention of using t.rast.aggregate afterwards.

However, without any error, the `t.rast.algebra` command produces either
an empty STRDS or one full of null maps if I use the -n flag.

If I run the corresponding `r.mapcalc` command for a single date, it works
as expected. Region is properly set, input maps have values in the proper
range. No idea what's wrong. I have used this command before and it worked
just fine. It is indeed something very simple for t.rast.algebra.

The only odd thing I see when I do a dry run is how it builds the
r.mapcalc command, that in the second part of the condition it puts
parenthesis, but I don't know much python as to judge that.

{{{
['EQUAL'] False False False True && & False False False
lst_2014_01_01@italy_LST_1km_daily_reconstructed_daily >=
20.0&&(lst_2014_01_01@italy_LST_1km_daily_reconstructed_daily <= 30.0)
lst_2014_01_02@italy_LST_1km_daily_reconstructed_daily >=
20.0&&(lst_2014_01_02@italy_LST_1km_daily_reconstructed_daily <= 30.0)

[rest skipped]

lst_2018_12_31@italy_LST_1km_daily_reconstructed_daily >=
20.0&&(lst_2018_12_31@italy_LST_1km_daily_reconstructed_daily <= 30.0)
build_condition_cmd_list ['EQUAL']
['EQUAL'] False False False False None None False False False
{'STDS': {'name': 'tmean_higher20_lower30',
           'stdstype': 'strds',
           'temporal_type': 'absolute'},
  'processes': [{'flags': ['overwrite'],
                 'inputs': [('expression',
'tmean_higher20_lower30_2014_01_01=if(lst_2014_01_01@italy_LST_1km_daily_reconstructed_daily
'
                             '>= '
'20.0&&(lst_2014_01_01@italy_LST_1km_daily_reconstructed_daily '
                             '<= 30.0), '
'lst_2014_01_01@italy_LST_1km_daily_reconstructed_daily, '
                             'null())'),
                            ('region', 'current')],
                 'name': 'r.mapcalc',
                 'outputs': },

[rest skipped]

  'register': [('tmean_higher20_lower30_2014_01_01',
                '2014-01-01 00:00:00',
                '2014-01-02 00:00:00'),
               ('tmean_higher20_lower30_2014_01_02',
                '2014-01-02 00:00:00',
                '2014-01-03 00:00:00'),

[rest skipped]

               ('tmean_higher20_lower30_2018_12_31',
                '2018-12-31 00:00:00',
                '2019-01-01 00:00:00')],
  'remove': }
}}}

I attach the full output of the dry run.

I tested with python2 and python3, same behavior. I use grass-dev in
Fedora 30.

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3891&gt;
GRASS GIS <https://grass.osgeo.org>

#3891: t.rast.algebra: if clause with two conditions does not work properly
--------------------------+---------------------------------------
  Reporter: veroandreo | Owner: grass-dev@…
      Type: defect | Status: new
  Priority: normal | Milestone: 7.8.0
Component: Temporal | Version: unspecified
Resolution: | Keywords: t.rast.algebra, r.mapcalc
       CPU: Unspecified | Platform: Unspecified
--------------------------+---------------------------------------

Comment (by veroandreo):

full dry run output is bigger than allowed... I hope the snippets copied
above are enough...

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3891#comment:1&gt;
GRASS GIS <https://grass.osgeo.org>

#3891: t.rast.algebra: if clause with two conditions does not work properly
--------------------------+---------------------------------------
  Reporter: veroandreo | Owner: grass-dev@…
      Type: defect | Status: new
  Priority: normal | Milestone: 7.8.0
Component: Temporal | Version: unspecified
Resolution: | Keywords: t.rast.algebra, r.mapcalc
       CPU: Unspecified | Platform: Unspecified
--------------------------+---------------------------------------

Comment (by veroandreo):

Ok, this is odd... If I replace the former command, with the following:

{{{
t.rast.algebra -n expression="tmean_higher20_lower30 =
if(lst_daily_celsius >= 20.0 && lst_daily_celsius <= 30.0, 1, null())"
basename=tmean_higher20_lower30 suffix=gran nprocs=7 --o
}}}

i.e., putting 1 instead of leaving the value that the map has, all works
fine... why does it fail to keep the value that was there originally if it
meets the condition???

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3891#comment:2&gt;
GRASS GIS <https://grass.osgeo.org>