Unwrap2stage - Ionospheric correction -topsApp-

Added by Alejandra . about 1 month ago

Hello everyone,

I am trying to get some interferograms using topsApp.py. I inspected the file 'filt_topophase.conncomp' and I found connected component 0 and connected component 1 (only these values). I understand that those pixels with connected component=0 should be masked out. Now, I want to understand when the use of 'unwrap2stage' is useful and under which conditions/circumstances I should use it as an optimizer of my results. Could 'unwrap2stage' help, if the only other value different to zero in my file 'filt_topophase.conncomp' is one? Unfortunately, I didn't find much information about that.

Attached are my topsApp.xml and the results filt_topophase.conncomp.geo and filt_topophase.unw.geo.

I would appreciate your help!

Aleja


Replies (10)

RE: Unwrap2stage - Added by Heresh Fattahi about 1 month ago

2stage unwrapping won't make a difference in this case because you have one non-zero component. If multiple non-zero components exists, the unwrapped phase within each component is self-consistent and most likely correctly unwrapped. But there might be wrong integer number of 2PI among different components. 2 stage unwrapping tries to minimize those jumps and find a global solution among different components.

Heresh

RE: Unwrap2stage - Added by Alejandra . 28 days ago

Hello Heresh,

thank you for your explanation. I would appreciate if you could help me to understand some points. I want to generate interferograms to observe long-term (5 years) ground deformation in a volcanic region with dense vegetation. Since I don't have any access to L-band data (e.g. ALOS-2), I am working with Sentinel 1A and 1B data. Then I want to do a time series analysis using MintPy. So, I began to carry out some tests to understand the different parameters of 'topsApp.py' in order to get acceptable/decent results (for that reason I wanted to understand how useful 2stage unwrapping could be).

In one of my test-interferograms (1) I saw a notable burst boundary. This interferogram was calculated without ionospheric correction. Then I applied this correction (which appears in examples/input_files/topsApp.xml) and the boundary disappeared. It was great! (I thought). But in another interferogram (2), same region, different lapse, calculated also without ionospheric correction, I saw the same burst boundary. I calculated this interferogram again, but this time I included the ionospheric correction (hoping that the boundary would disappear as in the last interferogram). It was a surprise for me that the application of this correction did not eliminate this boundary but what I got was a completely fringed interferogram. I inspected the file 'filt_topophase.conncomp' and I found connected component 0 and connected component 1 when the ionospheric correction was not included. But when I included this correction the file 'filt_topophase.conncomp' shows multiple non-zero components.

To summarize: one interferogram (1) processed with topsApp without ionospheric correction shows a burst boundary and with only one non-zero component. After applying the correction the boundary disappeared. In another interferogram (2), I saw the same boundary, I applied the ionospheric correction and I got multiple fringes and multiple non-zero components.

I clarify that in these two interferograms, or rather in these two periods of time, there is no visible deformation. Nevertheless, I would like to understand how this ionospheric correction really works.

I would appreciate, if you took a look at the attached files:

  • Results (interferogram 1) with and without ionospheric correction: the one where the burst boundary disappeared after ionospheric correction.
  • Results (interferogram 2) with and without ionospheric correction: the one where the burst boundary did not disappear after ionospheric correction, but multiple fringes appeared.
  • topsApp.xml file with enabled ionospheric correction.

Thanks a lot!

Best regards,
Aleja

RE: Unwrap2stage - Added by Eric Fielding 28 days ago

Hi Aleja,

Your interferogram 2 has a bad ionospheric correction. The ionospheric corrections are calculated by splitting the range spectrum into two separate wavelengths, forming two interferograms (upper and lower frequencies), unwrapping them, and taking the phase difference between them. In an area with low coherence, like you have, one or both of those interferograms can have phase unwrapping errors and this will cause an incorrect ionospheric estimate. I suspect this is what happened for your interferogram 2.

You might want to read Cunren Liang's paper on the ionospheric corrections of Sentinel-1 data:
Liang, C., P. Agram, M. Simons, and E. J. Fielding (2019), Ionospheric Correction of InSAR Time Series Analysis of C-band Sentinel-1 TOPS Data, IEEE Transactions on Geoscience and Remote Sensing, 57(9), 6755-6773, doi:10.1109/TGRS.2019.2908494.

As you saw in your topsApp.xml file, there are many parameters for adjusting the ionospheric processing. I have not tried to adjust any of those myself. Maybe @Cunren can comment.

++Eric

RE: Unwrap2stage - Added by Alejandra . 27 days ago

Hi Eric,

thanks a lot for your explanation! It was helpful to understand how this correction works. However, precisely because of the many parameters for adjusting the ionospheric processing (and their default values) I am not sure about this correction. I see that it could work but for me it is also important to understand why to choose one value and not another one (e.g. the values for maximum window size or total number of r-a-looks). Unfortunately, I did not find much information about these parameters.

I also calculated interferograms with ESD=true and with ESD=false but I did not see any difference.

The paper is really useful- Thanks a lot!

Best regards,
Aleja

RE: Unwrap2stage - Ionospheric correction -topsApp- - Added by Cunren Liang 26 days ago

Eric is right. There should be phase unwrapping errors in ionospheric correction. I can see your interferogram has poor coherence at top left corner, so there might be phase unwrapping errors here.

Ionospheric correction for C-band data is very challenging because of lower coherence, and phase unwrapping errors as a result of denser fringes and low coherence. So normally we should apply this correction in relatively high coherence areas.

Cunren

RE: Unwrap2stage - Ionospheric correction -topsApp- - Added by Alejandra . 24 days ago

Thanks Cunren!

So far I have processed 110 interferograms and 26 of them have phase unwrapping errors (denser fringes). I could compare 70 interferograms, which I calculated once with ionospheric correction and once without this correction. When I processed the interferograms without ionospheric correction I got 18 interferograms with burst boundaries artifacts. When I calculated the same interferograms, this time with ionospheric correction, for 11 of these 18 interferograms with artifacts the correction worked very well. In all of the interferograms the baseline is not more than 90m and 48 days. Unfortunately, the dense vegetation of the region is the big problem for me.

So, I will process the rest of my interferograms with the ionospheric correction and if I get some of them with phase unwrapping errors I will recalculate them without the correction.

  • Could 2stage unwrapping be useful for those interferograms with phase unwrapping errors?
  • Where can I find information or an explanation about the parameters of the ionospheric correction?

Best regards,
Aleja

RE: Unwrap2stage - Ionospheric correction -topsApp- - Added by Cunren Liang 19 days ago

Hi Aleja,

First of all, 2stage unwrapping is not used in ionospheric phase computation.

You can try different parameters as follows:

1) set the following paramters:
<property name="start ionosphere step">rawion</property>
<property name="end ionosphere step">filt_gaussian</property>

2) use larger values for the following parameters, so that you can get lower and upper band interferorams with lower-level noise, which might help with phase unwrapping. The following are default number of looks used by the program.
<property name="number of azimuth looks at first stage for ionosphere phase unwrapping">10</property>
<property name="number of range looks at first stage for ionosphere phase unwrapping">40</property>

When you do this, you need to be careful:
a) very large values may also cause phase aliasing when there are dense tropospheric phase fringes, which is bad for phase unwrapping. If you are not sure about it, you can check the interferogams after processing in ion/lower or ion/upper, under which you can find similar directory structures as main InSAR processing directory.

b) the total number of looks used in ionsopheric phase computation are (again these are default values):
<property name="total number of azimuth looks in the ionosphere processing">50</property>
<property name="total number of range looks in the ionosphere processing">200</property>

so you need to make sure that this set of number of looks should be integer multiples of the first set of number of looks. You can find all these parameters in the example input file.

After you are done with the parameters, run topsApp.py --dostep=ion

Then you can check the results. The computed ionospheric phase is here ion/ion_cal/filt.ion. This result does not consider the TOPS burst properties, but is enough for checking if there are phase unwrapping caused problems, that is, dense fringes.

After you have checked the results, if you feel it is OK, you can do the rest of ionospheric processing by setting the parameters in 1) accordingly, and run topsApp.py --dostep=ion again.

subtraction of ionospheric phase is done in the next step of topsApp.py

Cunren

RE: Unwrap2stage - Ionospheric correction -topsApp- - Added by Alejandra . 16 days ago

Hi Cunren,

thanks a lot for your clearly explanation. I will test with "rawion" and "filt_gaussian", as you suggest. So far, I have tried with "subband" and "esd" (like the example input file).

Best regards,
Aleja

RE: Unwrap2stage - Ionospheric correction -topsApp- - Added by Alejandra . 7 days ago

Hi Cunren,

I just tried to calculate a Sentinel1A-Sentinel1B interferogram with ionospheric correction, following your recommendations (<property name="start ionosphere step">rawion</property>; <property name="end ionosphere step">filt_gaussian</property>) and I got this message:

computing ionosphere swath by swath
Traceback (most recent call last):
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/applications/topsApp.py", line 1048, in <module>
    insar.run()
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/iscesys/Component/Application.py", line 144, in run
    exitStatus = self.main()
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/applications/topsApp.py", line 1000, in main
    self.runIon()
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/isceobj/TopsProc/Factories.py", line 40, in __call__
    return self.method(self.other, *args, **kwargs)
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/isceobj/TopsProc/runIon.py", line 2635, in runIon
    rawion(self, ionParam)
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/isceobj/TopsProc/runIon.py", line 2613, in rawion
    ionSwathBySwath(self, ionParam)
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/isceobj/TopsProc/runIon.py", line 1398, in ionSwathBySwath
    with open(os.path.join(ionParam.ionDirname, ionParam.warning), 'a') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'ion/warning.txt'

In another case, also a Sentinel1A(master)-Sentinel1B(slave) interferogram, I got this:

computing ionosphere swath by swath
Traceback (most recent call last):
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/applications/topsApp.py", line 1048, in <module>
    insar.run()
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/iscesys/Component/Application.py", line 144, in run
    exitStatus = self.main()
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/applications/topsApp.py", line 1000, in main
    self.runIon()
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/isceobj/TopsProc/Factories.py", line 40, in __call__
    return self.method(self.other, *args, **kwargs)
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/isceobj/TopsProc/runIon.py", line 2635, in runIon
    rawion(self, ionParam)
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/isceobj/TopsProc/runIon.py", line 2613, in rawion
    ionSwathBySwath(self, ionParam)
  File "/scratch/local1/u300850/isce/isce_env/lib/python3.6/site-packages/isce/components/isceobj/TopsProc/runIon.py", line 1412, in ionSwathBySwath
    raise Exception('There are less than one subswaths, no need to use swath-by-swath method to compute ionosphere!')
Exception: There are less than one subswaths, no need to use swath-by-swath method to compute ionosphere!

However, it works without any problem when I set S1A not as master but as slave and S1B as master.

I would appreciate your help with this issue.

Best regards,
Aleja

RE: Unwrap2stage - Ionospheric correction -topsApp- - Added by Cunren Liang 2 days ago

I could not reproduce your first error. For the second error, I have updated the code, but the change is not merged into ISCE yet:
https://github.com/CunrenLiang/isce2/commit/47552f611e971b5b0e328784721b8a407139ca71#diff-995f701b41cfbd7b431b1ea072af9459

You can change your own code by following this update in your install directory. Note that in the latest version of ISCE, we have removed the following offensive words:
MASTER-->REFERENCE
master-->reference
Master-->Reference

SLAVE-->SECONDARY
slave-->secondary
Slave-->Secondary

You need to follow this accordingly when update your code.

Cunren

(1-10/10)