[Difx-users] difx2fits_pcal_20200619.patch

Leonid Petrov Leonid.Petrov at lpetrov.net
Sun Jun 21 23:17:52 EDT 2020


Dear collagues,
  
  Please find below a patch to difx2fits wrt trunk version of 
2020.06.12.

  Difs2fits did not put phase-cal signal for NS station in IVS 
experiment r1948. The experiment had 16 IFs: 10 at X band and 6
at S-band. NS station recorded two datastreams: one for X-band
and another for S-band. The first datastream had 16 IFs, the second
ahd 8 IFs, but only low 10 IFs in the first datastream and 
upper 6 IFs in the second datastream had data.

  The full DiFX output for that experiment can be found in
ftp://ftp.mpifr-bonn.mpg.de/outgoing/ykchoi/leonid/r1948_difxout.tgz

Here is the exerpt from r1948_0001.difx/PCAL_58995_061200_NS

NS 58995.7083381 0.0000095 4 16 32 8213 R  3.15575e-05  4.98256e-05 8214 R  9.30544e-05 -1.21763e-04 8215 R 
NS 58995.7083381 0.0000095 5  8 32 2226 R -2.60000e-04 -1.42326e-04 2227 R -1.73795e-04 -2.58253e-04 2228 R 

The old logic appended the record of the second datastream to the prior
datastream. This did not work. The total number of extracted phase-cal tones
was 31 and the output arrays were sized to 16*31=496, equal to the number
of phase-cal tones found in the 1st datasteam, and as a result, the second 
datastream was ignored.

 I made a minor step: I forced the offset of the second datastreeam to be set 
to zero if the total number of phase-calibration tones in the 1st 
datastream is equal to total number of tones. I am confident that this fix will 
not cause regressions, but I am less confident whether this is sufficient to cover
other cases when phase cal is split between multiple datasets.

Sincerely
Leonid
2020.06.21_23:12:07

=================================== Patch: =====================================

--- applications/difx2fits/trunk/src/fitsPH.c~	2020-06-19 19:56:45.423005154 -0400
+++ applications/difx2fits/trunk/src/fitsPH.c	2020-06-19 21:39:16.109417054 -0400
@@ -981,6 +981,7 @@
 	float pulseCalDeltaT[2][array_MAX_TONES];
 	float stateCount[2][array_MAX_STATES*array_MAX_BANDS];
 	float pulseCalRate[2][array_MAX_TONES];
+	double pulseCalFrAcc[2][array_MAX_TONES];
 	int configId = -1;
 	int sourceId = -1;
 	int scanId;
@@ -1224,6 +1225,9 @@
 
 					exit(EXIT_FAILURE);
 				}
+                                if ( d > 0 && startTones[d] == nTone*nBand ){
+				     startTones[d] = 0 ;
+                                }
 			}
 
 			if(nt > maxDifxTones)
@@ -1251,6 +1255,7 @@
 		{
 			for(t = 0; t < array_MAX_TONES; ++t)
 			{
+				pulseCalFrAcc[k][t] = 0.0;
 				pulseCalReAcc[k][t] = 0.0;
 				pulseCalImAcc[k][t] = 0.0;
 				pulseCalDeltaT[k][t] = 0.0;
@@ -1667,7 +1672,7 @@
 							{
 								if(pulseCalReAcc[k][l] == 0.0 && pulseCalImAcc[k][l] == 0.0)
 								{
-									freqs[k][l] = nan.d;
+									pulseCalFrAcc[k][l] = nan.d;
 									pulseCalReAcc[k][l] = nan.f;
 									pulseCalImAcc[k][l] = nan.f;
 									pulseCalRate[k][l] = nan.f;
@@ -1677,7 +1682,7 @@
 							FITS_WRITE_ARRAY(stateCount[k], p_fitsbuf, 4*nBand);
 							if(nTone > 0)
 							{
-								FITS_WRITE_ARRAY(freqs[k], p_fitsbuf, nTone*nBand);
+								FITS_WRITE_ARRAY(pulseCalFrAcc[k], p_fitsbuf, nTone*nBand);
 								FITS_WRITE_ARRAY(pulseCalReAcc[k], p_fitsbuf, nTone*nBand);
 								FITS_WRITE_ARRAY(pulseCalImAcc[k], p_fitsbuf, nTone*nBand);
 								FITS_WRITE_ARRAY(pulseCalRate[k], p_fitsbuf, nTone*nBand);
@@ -1718,6 +1723,7 @@
 					{
 						for(t = 0; t < nTone*D->datastream[currentDsId].nRecFreq; ++t)
 						{
+						        if ( freqs[k][t] > 0.0 ) pulseCalFrAcc[k][t] = freqs[k][t];
 							pulseCalReAcc[k][t+startTone] += pulseCalRe[k][t];
 							pulseCalImAcc[k][t+startTone] += pulseCalIm[k][t];
 							pulseCalDeltaT[k][t] += D->config[configId].tInt;



More information about the Difx-users mailing list