#!/opt/perl/bin/perl
use warnings;
use strict;
use GPS::Defaults;
use Fortran::F90Format;
use GOA::StaId;
use GOA::StaPos;
use GOA::StaSvec;
use GOA::PCenter;
use GOA::StaRcvr;
use GOA::Util;
use GPS::DATES qw(get_date sec2cal cal2doy);
use File::Basename;
use Getopt::Long;
use POSIX qw(strftime);
#use STACOV;

my $progname = basename ($0);
my $now =strftime "%Y %m %d %H %M %S", localtime;
my ($y,$m,$d,$hr,$mn,$sec) = split(' ',$now);
my $tc ; #wrtime($y,$m,$d,$hr,$mn,$sec);
my $ti ; # wrtime('0000',0,0,0,0,0);
my $tf = $ti ;
my $usage= qq {
  $progname
};
my $help='';
my $args = @ARGV;
my $dbase ='';
my $out = '';
my $fstacov;
my $tpl = ''; #"cwu_snx_2.01.tpl";
our $FlatFc = 1.00673950181947;     # $Flat    = 1/298.257 = 0.00335281317789691; 
                                    # $FlatFc  = 1.0 / ((1.0-$Flat)*(1.0-$Flat));
our $r2d = 45/atan2(1,1);
our $a_e = 6378136.3;               # km IERS Tech Note 13 pg 5
our $f_e = 1/298.257;               # km IERS Tech Note 13 pg 5
our $e2 = $f_e *(2 - $f_e);
				# 
GetOptions( "dbase:s"   => \$dbase,
            "stacov:s"  => \$fstacov,
            "out=s"     => \$out,
    	    "tpl:s"     => \$tpl,
            "help"      => \$help
           ) || die "error in options";


if ( $help ) { die "$usage\n" };
my %par  = get_defaults( env => \%ENV );
my $rcvr = GOA::StaRcvr->new( file => "$par{STA_INFO_DIR}/sta_rcvr" );
my $pos  = GOA::StaPos->new( file => "$par{STA_INFO_DIR}/sta_pos" );
my $id   = GOA::StaId->new( file => "$par{STA_INFO_DIR}/sta_id" );
my $pc   = GOA::PCenter->new( file => "$par{STA_INFO_DIR}/pcenter" );
#my $apc  = GPS::AntennaPhaseCenter->new();
#my $apc  = GPS::APC->new();
my $svec = GOA::StaSvec->new( file => "$par{STA_INFO_DIR}/sta_svec" );
my $list = $svec->apc->list();
my %goa2igs = reverse $svec->apc->goa_names;
#print map { "$_ $goa2igs{$_}\n"} sort keys %goa2igs;
#foreach my $c ( @$list ) {
# $goa2igs{trim($apc->{$c}{goa_name})} = $c;
#}
my $blocks = read_snx_tpl($tpl);
my $npar = 0;
my $today = get_date('today','snx');
my @ct = split /:/,$today;  #get_date('today'); #wrtime('today');
my @st = (0)x3;
my @et = (0)x3;
my %fmt = ();
my ($name,$name_prev)=('')x2;
foreach my $bk ( @$blocks ) {
   #if ( ! $name ) { $name = $bk->{name}; }
   if ( $bk->{name} ne $name ) { 
      if ( $bk->{name} !~ /^(HEADER_LINE|FOOTER_LINE)$/ ) {
        print "-$name\n" if $name;
        print "+$bk->{name}\n";
        $name = $bk->{name}; 
      }
   }
   #next if $bk->{name} !~ /ECC/ ;
   if ( ! exists $fmt{$bk->{name}} ) { 
     $fmt{$bk->{name}} = Fortran::F90Format->new( fmt => $bk->{fmt} );
   }
   if ( $bk->{name} eq 'HEADER_LINE' ) {
      @{$bk->{val}}{ qw/ct_yy ct_doy ct_sec/} = @ct; 
      @{$bk->{val}}{ qw/st_yy st_doy st_sec/} = @st; 
      @{$bk->{val}}{ qw/et_yy et_doy et_sec/} = @et; 
      $bk->{num_est} = $npar; 
      print $fmt{$bk->{name}}->write( get_val($bk) ); 
   }
   if ( $bk->{name} eq 'FILE/REFERENCE' ) {
      print $fmt{$bk->{name}}->write( get_val($bk) ); 
   }
   if ( $bk->{name} eq 'FILE/COMMENT' ) {
      print $fmt{$bk->{name}}->write( get_val($bk) ); 
   }
   if ( $bk->{name} eq 'SITE/ID' ) {
     my ($p,$psec,$h);
     my $hsta = $id->get;
     foreach my $s ( sort keys %{$hsta} ) {
       $p=$pos->get($s);
       next if ! $p ;
       my @kp = keys %$p;
       ($psec) = sort {$b <=>$a} @kp;
       $p=$pos->get($s,$psec);
       foreach my $xx ( qw/x y z/ ) {
         if ( ! defined $p->{$xx} ) { 
          print "$s $psec |@kp|$p->{$xx}| pos error\n"; exit; 
         }
       }

       $h=$id->get($s,0);
       $bk->{val}{site_code} = lc $s;
       $bk->{val}{sta_desc}  = sprintf("%-22s",$h->{location});
       $bk->{val}{mnt_id}    = $h->{iers_domes};
       @{$bk->{val}}{ qw/ lat_deg lat_min lat_sec
                         lon_deg lon_min lon_sec
                         height    /
                    } =  xyz2llh($p->{x}, $p->{y},$p->{z});
      print $fmt{$bk->{name}}->write( get_val($bk) ); 
     } 
   }
   if ( $bk->{name} eq 'SITE/RECEIVER' ) {
     my ($p,$hsecs,$h);
     my %seen;
     foreach my $s ( sort keys %{$rcvr->get} ) {
       $bk->{val}{site_code} =  lc $s;
       $hsecs=$rcvr->get($s);
       my (@lines,$l);
       foreach my $sec ( sort { $b <=> $a } keys %$hsecs ) {
          $h = $rcvr->get($s,$sec);
          $bk->{val}{recv_type} = $h->{receiver}; 
          $bk->{val}{recv_sn} = $h->{sn};
          $bk->{val}{recv_fw} = $h->{firmware};
          my @cal_time = sec2cal($sec);
          @{$bk->{val}}{ qw/st_yy st_doy st_sec/} = snx_time ( @cal_time );
          my $d = $h->{duration};
          my @et = $d == 946080000.00 ? (0)x3 : snx_time(sec2cal($sec+$d)); 
          @{$bk->{val}}{ qw/et_yy et_doy et_sec/} = @et;
          print  $fmt{$bk->{name}}->write( get_val($bk) ); 
       } 
     }      
 
   }
   if ( $bk->{name} eq 'SITE/GPS_PHASE_CENTER' ) {
     my ($gant);
     my ($p,$a);
     my %seen;
     my $hga = $pc->get;
     foreach my $ga ( sort keys %$hga ) {
         $bk->{val}{ant_type} = $goa2igs{$ga};    
         next if ! $bk->{val}{ant_type};
         $a = $pc->get($ga,'L1');
         $bk->{val}{l1_u} = $a->{up};
         $bk->{val}{l1_n} = $a->{north};
         $bk->{val}{l1_e} = $a->{east};
         $a = $pc->get($ga,'L2');
         $bk->{val}{l2_u} = $a->{up};
         $bk->{val}{l2_n} = $a->{north};
         $bk->{val}{l2_e} = $a->{east};
         $bk->{val}{ant_cal_mdl} = ' ';
         print $fmt{$bk->{name}}->write( get_val($bk) ); 
     } 
   } 
   if ( $bk->{name} eq 'SITE/ANTENNA' ) {
     my ($p,$h,$hsecs,$secs);
     my (@st,@et,$d,@val,$gant);
     my %seen;
     foreach my $s ( sort keys %{$svec->get} ) {
       $bk->{val}{site_code} =  lc $s;
       $hsecs=$svec->get($s,$s);
       foreach my $secs ( sort { $b <=> $a } keys %$hsecs ) {
          $h=$svec->get($s,$s,$secs);
          $gant = $h->{pc_ant};
          next if ! exists $goa2igs{$gant};
          $bk->{val}{ant_type} = $goa2igs{$gant};
          $d = $h->{duration};
          @st = snx_time(sec2cal($secs)); 
          @et = $d == 946080000.00 ? (0)x3 : snx_time(sec2cal($secs+$d)); 
          @{$bk->{val}}{ qw/st_yy st_doy st_sec/} = @st; 
          @{$bk->{val}}{ qw/et_yy et_doy et_sec/} = @et; 
          print $fmt{$bk->{name}}->write( get_val($bk) ); 
       }
     }
     
   }

   if ( $bk->{name} eq 'SITE/ECCENTRICITY' ) {
     my ($p,$h,$hpc,$hsecs,$secs);
     my ($ga,$d,$ecc);
     foreach my $s ( sort keys %{$svec->get} ) {
       $bk->{val}{site_code} =  lc $s;
       $hsecs=$svec->get($s,$s);
       foreach my $secs ( sort { $b <=> $a } keys %$hsecs ) {
          $h=$svec->get($s,$s,$secs);
          $ga = $h->{pc_ant};
          $ecc = $pc->get( $ga,'LC');
          $d = $h->{duration};
          @st = snx_time(sec2cal($secs)); 
          @et = $d == 946080000.00 ? (0)x3 : snx_time(sec2cal($secs+$d)); 
          @{$bk->{val}}{ qw/st_yy st_doy st_sec/} = @st; 
          @{$bk->{val}}{ qw/et_yy et_doy et_sec/} = @et; 
          $bk->{val}{u_x} = $h->{height} + $h->{z};
          $bk->{val}{n_y} = $h->{y};
          $bk->{val}{e_z} = $h->{x};
          print $fmt{$bk->{name}}->write( get_val($bk) ); 
       }
     }
   }
   
   if ( $bk->{name} eq 'FOOTER_LINE' ) {
      print $fmt{$bk->{name}}->write( get_val($bk) ); 
   }
   
}

sub get_val {
   my $h = shift;
   return map { $h->{val}{$_} } @{$h->{var}} 
}
sub snx_time {
   my ($y,$m,$d,$hr,$mn,$sec) = @_;
   my $yy=unpack("x2a2",$y);
   my $doy=cal2doy($y,$m,$d);
   return ($yy,$doy,int($hr*3600+$mn*60+$sec))
}
sub wrtime {
  my $date = shift;
  return ( 0,0,0 ) if ! $date;
  $date=~ s/\s+//g;
  $date = get_date($date,'sta');
  print "Date: $date\n";
  return snx_time( split(' ',$date) ); 
}


sub read_snx_tpl {
   my $tpl = shift ||'';	
   my $sections = shift || [qw(HEADER_LINE
                               FILE/REFERENCE 
                               FILE/COMMENT
                               SITE/ID
                               SITE/RECEIVER
                               SITE/ANTENNA
                               SITE/GPS_PHASE_CENTER
                               SITE/ECCENTRICITY
                               FOOTER_LINE
                               )];
   #no strict 'subs';                               
   my $fh = \*DATA; 
   if ( $tpl ) {
     $fh = undef;
     open($fh,"< $tpl") or die "Couldn't open $tpl $!\n";
   }
   my $blocks=[];
   my  @f;
   my  $fmt = [];
   my  $var = [];
   my  $val = [];
   my $bname='';
   while ( <$fh> ) {
      chomp;                  # no newline
      s/#.*//;                # no comments
      s/^\s+//;               # no leading white
      s/\s+$//;               # no trailing white
      next unless length;     # anything left? 
      if ( /^\+[A-Z]/ ) {
          ($bname = $_) =~ s/^\+//; 
      } elsif ( /^\+\+[A-Z]/ ) {
         next;
      } elsif ( /^-/ ) {
         my $m=escape($bname);
         #next if ! ( grep { /$m/i } @$sections );
         my $h = {};	   
         @$h{@$var}=@$val;
         my $f = join(',',@$fmt) ||'';
         push @$blocks, { name => $bname ,
                         fmt  => $f,
                         var  => $var,
                         val  => $h 
                       } if grep /$m/,@$sections;
        #print "+$bname\n","$f ", join"\n",@$var, @$val,"\n-$bname\n";
        ($bname)='' if $_ =~ /^-[A-Z]/ ;
         $fmt = [];
         $var = [];
         $val = [];
      } elsif ($bname) {  
        #@f = split(' ',$_); 
        @f=unpack("a29a22a29",$_);
        push @$fmt ,trim($f[0]) ; 
        push @$var ,trim($f[1]); 
        $f[2]=trim($f[2]);
        if ( $f[2] eq "'...'" ) {
            $f[2] = <$fh>;
        } 
        if ( $f[2] =~ /'(.*)'/ ) {
            $f[2] = $1;
        }
        push @$val ,$f[2]; 
        #print "@$fmt @$var @$val\n";  
        #printf ("%-25s     %-20s   %-35s\n",$fmt,$var,$val);
     }
   }
   close($fh);
   return $blocks
}


sub xyz2llh {  
  #my $xyz = shift;
  my ($x,$y,$z)=@_;
  my ($z2, $p2, $p, $r, $mu, $phi, $lat, $lon, $h,$n);
  ($x, $y, $z) = ($x/$a_e, $y/$a_e, $z/$a_e);
  $z2 = $z**2;
  $p2 = $x**2 + $y**2;
  $p = sqrt($p2);
  $r = sqrt($p2 + $z2);
  $mu = atan2($z * (1 - $f_e + $e2 / $r), $p);
  $phi = atan2($z * (1 - $f_e) + $e2 * (sin($mu))**3,
               (1 - $f_e) * ($p - $e2 * (cos($mu))**3));
  $lat = $phi * $r2d;
  $lon = atan2($y, $x) * $r2d;
  $n = $a_e/sqrt((1.0 - $e2*sin($lat)**2));
  $h = $a_e * ($p * cos($phi) + $z * sin($phi)
                     - sqrt(1 - $e2 * (sin($phi))**2));
	     #$h = $p/cos($lat) - $n;
  $lon = $lon + 360 if $lon < 0;  
  $h = sprintf("%7.1f",$h);
  return ( dd2deg($lat) , dd2deg($lon) , $h )
  #return { "lat" => dd2deg($lat) , "lon" => dd2deg($lon) , "height" => [$h] }
  
}
sub dd2deg {
   my $dd = shift;
   my $deg = int($dd);
   #my $min = int(frac($dd)*60);
   my $min = int(($dd - $deg)*60);
   my $sec = sprintf("%4.1f",($dd - $deg - $min/60.0 )*60);
   return ($deg ,abs($min),abs($sec))
}

__DATA__
# SINEX 2.01   Template
# Marcelo Santillan Jun 2005
# Central Washington University
# 
# Format:
# +BLOCK_NAME
# FORTRAN_FORMAT     VARIABLE_NAME    VALUE     
# -BLOCK_NAME 

# VALUE : 


 

+HEADER_LINE

#         1         2         3         4         5         6         7         8
#12345678901234567890123456789012345678901234567890123456789012345678901234567890
# all fields in 1 line

A1                            c1                     %                                  
A1                            c2                     =                                  
A3                            doc_type               SNX                                
1X,F4.2                       fmt_ver                2.01                               
1X,A3                         f_a_code               CWU                                
1X,I2.2                       ct_yy                  {yy}                               
1H:,I3.3                      ct_doy                 {doy}                               
1H:,I5.5                      ct_sec                 {sec}                               
1X,A3                         agency_code            CWU                                
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,I2.2                       et_yy                  {yy}                               
1H:,I3.3                      et_doy                 {doy}                               
1H:,I5.5                      et_sec                 {sec}                               
1X,A1                         obs_tech_code          P                                  
1X,I5.5                       num_est                {npar}                             
1X,A1                         const_code             1                                  
5(1X,A1)                      sol_content            S                                  

-HEADER_LINE


+FILE/REFERENCE

#         1         2         3         4         5         6         7         8
#12345678901234567890123456789012345678901234567890123456789012345678901234567890

# info_type_???? + info_type = 1 line
# 
++DESCRIPTION
1X,A18                        info_type_desc         'DESCRIPTION       '                        
1X,A60                        info_type              '...'                             
'PBO Analysis Center, Central Washington University'
--DESCRIPTION
++OUTPUT
1X,A18                        info_type_out          'OUTPUT            '                             
1X,A60                        info_type              '...'                             
'SINEX header file                                           '
--OUTPUT

++CONTACT
1X,A18                        info_type_cont         'CONTACT           '                  
1X,A60                        info_type              '...'                           
'marcelo@geology.cwu.edu, tim@geology.cwu.edu                                  ' 
--CONTACT

++SOFTWARE
1X,A18                        info_type_soft         'SOFTWARE          '                  
1X,A60                        info_type              '...'                     
'goa_snx                                                                     '
--SOFTWARE

++HARDWARE
1X,A18                        info_type_hard         'HARDWARE          '       
1X,A60                        info_type              '...'
'i686-Linux                                                                    '                             
--HARDWARE

++INPUT
1X,A18                        info_type_inp          'INPUT             '           
1X,A60                        info_type              '...'
'site logs,sta_svec,pcenter,ant_goa,igs05.atx,ant_info.003 '  
--INPUT

-FILE/REFERENCE

+FILE/COMMENT 
#         1         2         3         4         5         6         7         8
#12345678901234567890123456789012345678901234567890123456789012345678901234567890
++COMMENT
1X,A79                        comment                '...'
'This file was made from snx_tpl                                               '   
--COMMENT

++COMMENT
1X,A79                        comment                '...'
'goa_snx                                                                       '                          
--COMMENT

-FILE/COMMENT 

+INPUT/HISTORY
1X,A1                         file_code              {pm}                               
A3                            doc_type               SNX                                
1X,F4.2                       fmt_ver                2.01                               
1X,A3                         f_a_code               {f_a_code}                         
1X,I2.2                       ct_yy                  {yy}                               
1H:,I3.3                      ct_doy                 {doy}                               
1H:,I5.5                      ct_sec                 {sec}                               
1X,A3                         agency_code            {agency_code}                      
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,I2.2                       et_yy                  {yy}                               
1H:,I3.3                      et_doy                 {doy}                               
1H:,I5.5                      et_sec                 {sec}                               
1X,A1                         obs_tech_code          {obs_tech_code}                    
1X,I5.5                       num_est                {npar}                             
1X,A1                         const_code             {const_code}                       
5(1X,A1)                      sol_content            {sol_content}                      
-INPUT/HISTORY


+INPUT/FILES
1X,A3                         agency_code            {agency_code}                      
1X,I2.2                       ct_yy                  {yy}                               
1H:,I3.3                      ct_doy                 {doy}                               
1H:,I5.5                      ct_sec                 {sec}                               
1X,A29                        file_name              {fname}                            
1X,A32                        file_desc              {fdesc}                            
-INPUT/FILES

+INPUT/ACKNOWLEDGEMENTS
#         1         2         3         4         5         6         7         8
#12345678901234567890123456789012345678901234567890123456789012345678901234567890
1X,A3                         agency_code            {agency_code}                      
1X,A75                        agency_desc            {agency_desc}                      
-INPUT/ACKNOWLEDGEMENTS

+NUTATION/DATA
1X,A8                         nut_code               {nut_code}                         
1X,A70                        comment                {comment}                          
-NUTATION/DATA

+PRECESSION/DATA
1X,A8                         precess_code           {precess_code}                     
1X,A70                        comment                {comment}                          
-PRECESSION/DATA

+SOURCE/ID
1X,A4                         source_code            {cssource}                         
1X,A8                         iers_des               {iers_des}                         
1X,A16                        icrf_des               {icrf_des}                         
1X,A68                        comment                {comment}                          
-SOURCE/ID

+SITE/ID
1X,A4                         site_code              {site}                             
1X,A2                         point_code             A                                  
1X,A9                         mnt_id                 {mnt_id}                           
1X,A1                         obs_tech_code          P                                  
1X,A22                        sta_desc               {sta_desc}                         
1X,I3                         lon_deg                {deg}                             
1X,I2                         lon_min                {min}                             
1X,F4.1                       lon_sec                {sec}                             
1X,I3                         lat_deg                {deg}                             
1X,I2                         lat_min                {min}                             
1X,F4.1                       lat_sec                {sec}                             
1X,F7.1                       height                 {height}                           
-SITE/ID

+SITE/DATA
1X,A4                         site_code              {site}                             
1X,A2                         point_code             {pnt}                              
1X,A4                         sol_id                 {sid}                              
1X,A4                         site_code              {site_snx}                         
1X,A2                         point_code             {pnt_snx}                          
1X,A4                         sol_id                 {sid_snx}                          
1X,A1                         obs_code               {obs_code_snx}                     
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,I2.2                       et_yy                  {yy}                               
1H:,I3.3                      et_doy                 {doy}                               
1H:,I5.5                      et_sec                 {sec}                               
1X,A3                         create_ag_code         {cac_snx}                          
1X,I2.2                       ct_yy                  {yy}                               
1H:,I3.3                      ct_doy                 {doy}                               
1H:,I5.5                      ct_sec                 {sec}                               
-SITE/DATA


+SITE/RECEIVER
1X,A4                         site_code              {site}                             
1X,A2                         point_code             A                                  
1X,A4                         sol_id                 ----                               
1X,A1                         obs_tech_code          P                                  
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,I2.2                       et_yy                  {yy}                               
1H:,I3.3                      et_doy                 {doy}                               
1H:,I5.5                      et_sec                 {sec}                               
1X,A20                        recv_type              {rcv_type}                         
1X,A5                         recv_sn                {rcv_sn}                           
1X,A11                        recv_fw                {rcv_fw}                           
-SITE/RECEIVER

+SITE/ANTENNA
1X,A4                         site_code              {site}                             
1X,A2                         point_code             A                              
1X,A4                         sol_id                 ----                               
1X,A1                         obs_tech_code          P                                  
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,I2.2                       et_yy                  {yy}                               
1H:,I3.3                      et_doy                 {doy}                               
1H:,I5.5                      et_sec                 {sec}                               
1X,A20                        ant_type               {ant_type}                         
1X,A5                         ant_sn                 -----                              
-SITE/ANTENNA

+SITE/GPS_PHASE_CENTER
1X,A20                        ant_type               {ant_type}                         
1X,A5                         ant_sn                 -----                              
1X,F6.4                       l1_u                   {l1_u}                             
1X,F6.4                       l1_n                   {l1_n}                             
1X,F6.4                       l1_e                   {l1_e}                             
1X,F6.4                       l2_u                   {l2_u}                             
1X,F6.4                       l2_n                   {l2_n}                             
1X,F6.4                       l2_e                   {l2_e}                             
1X,A10                        ant_cal_mdl            {ant_cal_mdl}                      
-SITE/GPS_PHASE_CENTER

+SITE/ECCENTRICITY
1X,A4                         site_code              {site}                             
1X,A2                         point_code             A                                  
1X,A4                         sol_id                 ----                               
1X,A1                         obs_tech_code          P                                  
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,I2.2                       et_yy                  {yy}                               
1H:,I3.3                      et_doy                 {doy}                               
1H:,I5.5                      et_sec                 {sec}                               
1X,A3                         ecc_ref                UNE                                
1X,F8.4                       u_x                    {u_x}                              
1X,F8.4                       n_y                    {n_y}                              
1X,F8.4                       e_z                    {e_z}                              
-SITE/ECCENTRICITY

+SATELLITE/ID
1X,A4                         site_code              {site_code}                        
1X,A2                         prn                    {prn}                              
1X,A9                         cospar_id              {cospar_id}                        
1X,A1                         obs_tech_code          {obs_tech_code}                    
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,I2.2                       et_yy                  {yy}                               
1H:,I3.3                      et_doy                 {doy}                               
1H:,I5.5                      et_sec                 {sec}                               
1X,A20                        ant_type               {ant_type}                         
-SATELLITE/ID

+SATELLITE/PHASE_CENTER
1X,A4                         site_code              {site_code}                        
1X,A1                         freq_code              {freq_code}                        
1X,F6.4                       sat_pc_z               {sat_pc_z}                          
1X,F6.4                       sat_pc_x               {sat_pc_x}                          
1X,F6.4                       sat_pc_y               {sat_pc_y}                          
1X,A1                         freq_code              {freq_code}                        
1X,F6.4                       sat_pc_z               {sat_pc_z}                         
1X,F6.4                       sat_pc_x               {sat_pc_x}                         
1X,F6.4                       sat_pc_y               {sat_pc_y}                         
1X,A10                        ant_cal                {sat_ant_cal}                      
1X,A1                         pcv_type               {pcv_type}                         
1X,A1                         pcv_model              {pcv_model}                        
-SATELLITE/PHASE_CENTER


+SOLUTION/EPOCHS
1X,A4                         site_code              {site}                             
1X,A2                         point_code             {pnt}                              
1X,A4                         sol_id                 {sid}                              
1X,A1                         obs_tech_code          {obs_tech_code}                    
1X,I2.2,1H:,I3.3,1H:,I5.5     start_time             {ti}                               
1X,I2.2,1H:,I3.3,1H:,I5.5     end_time               {tf}                               
1X,I2.2,1H:,I3.3,1H:,I5.5     mean_time              {tm}                               
-SOLUTION/EPOCHS

+BIAS/EPOCHS
1X,A4                         site_code              {site}                             
1X,A2                         point_code             {pnt}                              
1X,A4                         sol_id                 {sid}                              
1X,A1                         bias_type              {bias_type}                        
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,I2.2                       et_yy                  {yy}                               
1H:,I3.3                      et_doy                 {doy}                               
1H:,I5.5                      et_sec                 {sec}                               
1X,I2.2                       wmt_yy                 {yy}                               
1H:,I3.3                      wmt_doy                {doy}                               
1H:,I5.5                      wmt_sec                {sec}                               
-BIAS/EPOCHS

+SOLUTION/STATISTICS
1X,A30                        info_type              {info_type}                        
1X,F22.15                     info_field             {info_field}                       
-SOLUTION/STATISTICS

+SOLUTION/ESTIMATE
1X,I5                         est_par_index          {est_par_index}                    
1X,A6                         par_type               {par_id}                           
1X,A4                         site_code              {site}                             
1X,A2                         point_code             {pnt}                              
1X,A4                         sol_id                 {sid}                              
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,A4                         par_units              {par_units}                        
1X,A1                         const_code             {const_code}                       
1X,E21.15                     par_estimate           {par_value}                        
1X,E11.6                      par_stdv               {par_stdv}                         
-SOLUTION/ESTIMATE

+SOLUTION/APRIORI
1X,I5                         est_par_index          {est_par_index}                    
1X,A6                         par_type               {par_id}                           
1X,A4                         site_code              {site}                             
1X,A2                         point_code             {pnt}                              
1X,A4                         sol_id                 {sid}                              
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,A4                         par_units              {par_units}                        
1X,A4                         par_units              {par_units}                        
1X,A1                         const_code             {const_code}                       
1X,E21.15                     par_estimate           {par_value}                        
1X,E11.6                      par_stdv               {par_stdv}                         
-SOLUTION/APRIORI

+SOLUTION/MATRIX_ESTIMATE L COVA
1X,I5                         mat_est_row            {mat_est_row}                      
1X,I5                         mat_est_col            {mat_est_col}                      
1X,E21.14                     mat_est_1              {mat_est_1}                        
1X,E21.14                     mat_est_2              {mat_est_2}                        
1X,E21.14                     mat_est_3              {mat_est_3}                        
-SOLUTION/MATRIX_ESTIMATE L COVA

+SOLUTION/MATRIX_APRIORI {p} {type}
1X,I5                         mat_est_row            {mat_est_row}                      
1X,I5                         mat_est_col            {mat_est_col}                      
1X,E21.14                     mat_est_1              {mat_est_1}                        
1X,E21.14                     mat_est_2              {mat_est_2}                        
1X,E21.14                     mat_est_3              {mat_est_3}                        
-SOLUTION/MATRIX_APRIORI {p} {type}

+SOLUTION/NORMAL_EQUATION_VECTOR
1X,I5                         est_par_index          {est_par_index}                    
1X,A6                         par_type               {par_id}                           
1X,A4                         site_code              {site}                             
1X,A2                         point_code             {pnt}                              
1X,A4                         sol_id                 {sid}                              
1X,I2.2                       st_yy                  {yy}                               
1H:,I3.3                      st_doy                 {doy}                               
1H:,I5.5                      st_sec                 {sec}                               
1X,A4                         par_units              {par_units}                        
1X,A1                         const_code             {const_code}                       
1X,E21.15                     right_hand_side        {right_hand_side}                  
-SOLUTION/NORMAL_EQUATION_VECTOR

+SOLUTION/NORMAL_EQUATION_MATRIX {p}
1X,I5                         neq_row                {neq_row}                          
1X,I5                         neq_col                {neq_row}                          
1X,E21.14                     mat_el_1               {mat_el_1}                         
1X,E21.14                     mat_el_2               {mat_el_2}                         
1X,E21.14                     mat_el_3               {mat_el_3}                         
-SOLUTION/NORMAL_EQUATION_MATRIX {p}

+FOOTER_LINE
A7                            end_sinex              %ENDSNX                            
-FOOTER_LINE
