#!/bin/csh -bf # # gp.driver # # Major subroutine calls: # gp.data - calls CreateGetLog # GetLocalData # GetRemoteData # CreateTPNML # ConvertSP3toECI # gp.addstaid # gp.addstasvec # gp.addstapos # gp.ninja # # --- # | gp.solve - calls gp.qregres # | gp.preprefilter # | gp.prefilter # | gp.filter # | gp.smapper # | gp.postfit # | gp.postbreak # --- Repeat loop while postbreak finds new phase breaks # # --- # | gp.solve - calls edtpnt2 # | gp.smapper # | gp.postfit # --- Repeat loop while CheckForOutliers finds outliers # # N.E. King # April 1994 # July 1994: modified to handle pseudorange and phase outliers together # August 1994: changed name of script bard.filter to bard.solve # March 1995: modified to run GIPSY R3 on swave. # 25 June 1995, whp: Added a call to bard.www # to update WWW version of Bard data # Further Mods: # 1995/10/10 whp: Converted bard.driver to gp.driver # Changes planned: # Done Use new GetRemoteData and GetLocalData routines # Done Use IGS orbits ala runall # Done Update DataList with DataToAttic automatically # Done Enable Runall style control over processing, # so script will handle both auto and manual processing. # 1996/04/09 whp Split gp.results into two subroutines so that # lnev files can be easily updated from a separate call. # 1996/04/09 whp Look for a StationsToExclude file. If it exists, # delete qm files for all stations in it. # 1997/05/02 whp Added a flag to gp.results call to enable web update # 1997/05/08 whp Added a flag to gp.results call to suppress inclusion of # reference stations. # 1998/02/12 whp Added call to FixQMs to check and fix erroneous Block I # satellite SVNs in qm files. # 1998/02/12 whp Minor reorganization of code in vicinity of merg_qm call. # 1998/02/12 whp Added case to gp.CheckForOutliers switch. # 1998/02/12 whp Eliminated $UseTrackStas from call to gp.results. # 1998/02/26 jls If BiasCutoff is 0 jump around ambigon. # 1998/02/28 jls Added call to ps_plots after gp.qmSplit. # 1998/04/11 jls/whp Added point positioning. Major mods with this. # When things are saved # Loop on stations # 1998/04/30 whp Removed $WebUpdate flag from call to gp.results # Web updating is now done in gp.queue # instead of in gp.results. # 1999/04/12 jls Added ability to delete pseudorange from a specified station. # By changing the flag in /attic/RemovePrange to DO_NOT_USE # pseudorange will be deweighted. Default is USE. # 2001/06/05 whp Use gp.SaveQMs.pl instead of gp.SaveQMS # The perl version will run sgid # # Set some variables for later # ---------------------------- set yyyymmdd = `grep datelong SaveObsDate | awk '{print $2}'` set IntPath = `ap in $yyyymmdd` set SolPath = `ap so $yyyymmdd` set point_position = `grep PointPosition ProcessFlags | awk '{print $2}'` set Verbose = `grep Verbose ProcessFlags | awk '{print $2}'` set StopOnErrors = `grep StopOnErrors ProcessFlags | awk '{print $2}'` # # Check number of arguments (and save to ProcessFlags) # ---------------------------------------------------- gp.CommandLine $argv if ($status != 0) then echo "gp.driver: gp.CommandLine failed" echo "gp.driver: Terminating" exit 1 endif echo "gp.driver: Processing started: " echo "gp.driver: Processing started: " >& ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo gp.driver: `date` echo gp.driver: `date` >& ../`grep datelong SaveObsDate | awk '{print $2}'`.log cat ProcessFlags cat ProcessFlags >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log # # Check for rerun option # If set, skip data retrieval # and cleaning steps. # ------------------- set Rerun = `grep Rerun ProcessFlags | awk '{print $2}'` if ($Rerun == 0) then # # Get local copy of sta_pos # ------------------------------------------- gp.handleStaPos.pl -r # Get data, run data cleaning, set up orbits. # ------------------------------------------- gp.data if ($status != 0) then echo " " echo gp.driver: gp.data returned non-zero status echo gp.driver: stops exit 2 endif endif # Rerun # # Delete qm files for requested exclude stations # ---------------------------------------------- DeleteStations # # If you are doing a network solution Merge qm files # Else count number of qmfiles and loop thru one at a # time # -------------------------------------------------- if ($point_position == "yes") then set qmNames = `ls *.qm` else echo "gp.driver: Running MERG_QM (Network solution)" merg_qm *.qm qmfile echo "gp.driver: QM files are" ls *.qm echo gp.driver: merg_qm finished set qmNames = `ls qmfile` echo "qmNames = "$qmNames endif @ qmCounter = 1 while ($qmCounter <= $#qmNames) set ExitFlag = "no" set Outliers = "false" # # Copy current qmfile to generic qmfile name # ------------------------------------------ if ($point_position == "yes") then cp -f $qmNames[$qmCounter] qmfile set StaName1 = `qm_sta qmfile | tr '[A-Z]' '[a-z]'` echo " ----------------------------------" echo "gp.driver: Running -----> $StaName1 < -------" echo " ----------------------------------" echo " ----------------------------------" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "gp.driver: Running -----> $StaName1 < -------" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " ----------------------------------" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log endif # # Begin loop that takes processing from # qregres through postbreak repeatedly # (until no new slips are found or limit reached) # ----------------------------------------------- set SolveLimit = `grep SolveLimit ProcessFlags | awk '{print $2}'` set SolveCounter = 0 set NewSlips = "true" while ($SolveCounter < $SolveLimit && $NewSlips == "true") @ SolveCounter++ echo "gp.driver: Solve loop iter = $SolveCounter" gp.solve if ($status != 0) then echo " " echo gp.driver: gp.solve returned non-zero status set ExitFlag = "yes" goto StartOfProblemExit endif if ($SolveLimit != 1) then gp.CheckForNewSlips switch ($status) case 1: set NewSlips = "true" breaksw case 0: set NewSlips = "false" breaksw case 2: echo gp.driver: gp.CheckForNewSlips found more than 200 slips. set NewSlips = "200+" set ExitFlag = "yes" goto StartOfProblemExit breaksw default: echo gp.driver: gp.CheckForNewSlips returned non-normal status set ExitFlag = "yes" goto StartOfProblemExit breaksw endsw endif end # while (SolveCounter < $SolveLimit) # # If requested terminate processing # --------------------------------- set OutliersOnly = `grep OutliersOnly ProcessFlags | awk '{print $2}'` if ($OutliersOnly == 1) then gp.CheckForOutliers echo "gp.driver: Process stopped after Solve by user request" exit endif cp -f qmfile $qmNames[$qmCounter] # # Remove outliers - loop through # qmDeletePts, edtpnt2, smapper, postfit # (until no new points are rejected or n=EditLimit) # ------------------------------------------------- set EditLimit = `grep EditLimit ProcessFlags | awk '{print $2}'` set EditCounter = 0 gp.CheckForOutliers switch ($status) case 1: set Outliers = "true" breaksw case 0: set Outliers = "false" breaksw case 2: echo gp.driver: gp.CheckForOutliers found more than 200 slips. set Outliers = "true" set ExitFlag = "yes" goto StartOfProblemExit breaksw case 3: echo gp.driver: gp.CheckForOutliers could not find OutlierList. set Outliers = "true" set ExitFlag = "yes" goto StartOfProblemExit breaksw default: echo gp.driver: gp.CheckForNewSlips returned non-normal status set Outliers = "true" set ExitFlag = "yes" goto StartOfProblemExit breaksw endsw while ($EditCounter < $EditLimit && $Outliers == "true") @ EditCounter++ gp.edit $qmNames[$qmCounter] if ($status > 1) then echo " " echo gp.driver: gp.edit returned non-zero status set EditFailure = "yes" set ExitFlag = "yes" goto SkipToProblemExit endif gp.CheckForOutliers switch ($status) case 1: set Outliers = "true" breaksw case 0: set Outliers = "false" breaksw case 2: echo gp.driver: gp.CheckForOutliers found more than 200 outliers. set Outliers = "true" set ExitFlag = "yes" goto SkipToProblemExit breaksw default: echo gp.driver: gp.CheckForOutliers returned non-normal status set Outliers = "true" set ExitFlag = "yes" goto StartOfProblemExit breaksw endsw end # while (EditCounter < $EditLimit) echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log grep APPROXIMATE smapper.log >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log # # Create bias-free stacov file # ---------------------------- if (-e bias_free.stacov) rm -f bias_free.stacov stacov -i smcov.nio -o bias_free.stacov -q qregres.nml if ($point_position == "yes") then # # Check filter position against initial # position found in /goa/sta_info/sta_pos # --------------------------------------- gp.filter_check >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log if (-e filter_warning) then cat filter_warning >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log rm -f filter_warning endif # # Run smap4fix to create proper smcov file for bias fixing # -------------------------------------------------------- if (-e SMCOV) rm -f SMCOV if (-e APVALSOUT) rm -f APVALSOUT smap4fix accume.nio smooth.nio SMCOV >& smap4fix.log # # Relabel log files (qregres, prepre, pre, filter, postbreak, postfit) # with station name if doing point positioning # -------------------------------------------- mv -f qregres.log $StaName1.qregres.log mv -f preprefilter.log $StaName1.preprefilter.log mv -f prefilter.log $StaName1.prefilter.log mv -f filter.log $StaName1.filter.log mv -f postbreak.log $StaName1.postbreak.log mv -f postfit.log $StaName1.postfit.log mv -f smapper.log $StaName1.smapper.log mv -f postfit.nio $StaName1.postfit.nio mv -f qregres.nml $StaName1.qregres.nml mv -f wash.nml $StaName1.wash.nml mv -f bias_free.stacov $StaName1.bias_free.stacov mv -f SMCOV $StaName1.smcov mv -f TDPTABLE $StaName1.TDPTABLE endif # # Save individual qm files # ------------------------ if ($point_position != "yes") then echo " " echo gp.driver: gp.qmSplit started gp.qmSplit set qmList = `ls *.qm` foreach qm ($qmList) gp.SaveQMs.pl $qm end else cp -f qmfile $qmNames[$qmCounter] gp.SaveQMs.pl $qmNames[$qmCounter] endif # # RUN AMBIGON, STACOV, STATISTICS. # -------------------------------- if ($point_position != "yes") then set Ambigonflag = `grep BiasCutoff ProcessFlags | awk '{print $2}'` if ($Ambigonflag != "0") then echo Script gp.amb started `date` gp.amb if ($status != 0) then echo gp.driver: gp.amb returned non-zero status. echo gp.driver: stops. exit 9 endif else echo " " echo "gp.driver: This will be a bias free solution" echo " BiasCutoff = "$Ambigonflag echo " " endif endif # point_position StartOfProblemExit: # ------------------- # This code handles cases with problems # (too may outliers, too many slips, etc.) # Procedure jumps to here to save partially # cleaned qm files, # then either exits or goes on to next file. if ($ExitFlag == "yes") then if ($Outliers == "true") then echo gp.driver: Outliers remain if ($point_position == "yes" && $StopOnErrors == "no") then echo "gp.driver:" set Actiondate = `grep datelong SaveObsDate | awk '{print $2}'` echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "Action--$StaName1.$Actiondate failed" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log grep APPROXIMATE smapper.log >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo gp.driver: Go on to next station mv -f $qmNames[$qmCounter] $qmNames[$qmCounter].problem mv -f qregres.log $StaName1.qregres.log mv -f postbreak.log $StaName1.postbreak.log mv -f postfit.log $StaName1.postfit.log mv -f smapper.log $StaName1.smapper.log mv -f postbreak.nml $StaName1.postbreak.nml mv -f postfit.nio $StaName1.postfit.nio mv -f qregres.nml $StaName1.qregres.nml mv -f wash.nml $StaName1.wash.nml # replace "$StaName1 DO_NOT_USE" \ # "$StaName1 USE" /attic/RemovePrange @ qmCounter++ continue else echo "gp.driver:" echo "Action--$yyyymmdd (not point) failed" echo gp.driver: Stops exit 7 endif endif if ($NewSlips == "200+" && $StopOnErrors == "no") then echo gp.driver: More than 200 slips if ($point_position == "yes") then echo "gp.driver:" set Actiondate = `grep datelong SaveObsDate | awk '{print $2}'` echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "Action--$StaName1.$Actiondate failed" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log grep APPROXIMATE smapper.log >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo gp.driver: Go on to next station mv -f $qmNames[$qmCounter] $qmNames[$qmCounter].problem mv -f qregres.log $StaName1.qregres.log mv -f postbreak.log $StaName1.postbreak.log mv -f postfit.log $StaName1.postfit.log mv -f smapper.log $StaName1.smapper.log mv -f postbreak.nml $StaName1.postbreak.nml mv -f postfit.nio $StaName1.postfit.nio mv -f qregres.nml $StaName1.qregres.nml mv -f wash.nml $StaName1.wash.nml @ qmCounter++ continue else echo "gp.driver:" echo "Action--$yyyymmdd (not point) failed" echo gp.driver: Stops exit 7 endif endif if ($EditFailure == "yes" && $StopOnErrors == "no") then echo gp.driver: Edit failed remain if ($point_position == "yes") then echo "gp.driver:" set Actiondate = `grep datelong SaveObsDate | awk '{print $2}'` echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "Action--$StaName1.$Actiondate failed" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log grep APPROXIMATE smapper.log >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo gp.driver: Go on to next station mv -f $qmNames[$qmCounter] $qmNames[$qmCounter].problem mv -f qregres.log $StaName1.qregres.log mv -f postbreak.log $StaName1.postbreak.log mv -f postfit.log $StaName1.postfit.log mv -f smapper.log $StaName1.smapper.log mv -f postbreak.nml $StaName1.postbreak.nml mv -f postfit.nio $StaName1.postfit.nio mv -f qregres.nml $StaName1.qregres.nml mv -f wash.nml $StaName1.wash.nml @ qmCounter++ continue else echo "gp.driver:" echo "Action--$yyyymmdd (not point) failed" echo gp.driver: Stops exit 7 endif endif endif # # Create & save stacov file # ------------------------- gp.CreateStacov StacovName.$$ set StacovFileName = `cat StacovName.$$` rm -f StacovName.$$ if ($status != 0) then echo gp.driver: gp.SaveStacov returned non-zero status. if (point_position != "yes") then echo gp.driver: stops. exit 9 endif else echo "Action--$StacovFileName created" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log endif # # Update Station position in /goa/sta_info/sta_pos # ------------------------------------------------ set adjust_flag = `cat filter_adjust` if ($adjust_flag <= 2) then gp.update_sta_pos $StacovFileName else echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "WARNING: initial station position from /goa/sta_info/sta_pos" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " is incorrect by more than 2 meters" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " /goa/sta_info/sta_pos will not be updated" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log endif @ qmCounter++ end # while qmCounter # # Return local copy of sta_pos # ------------------------------------------- gp.handleStaPos.pl -w # # If dealing with stations from Track campaign # move them to a temp directory so they do not interfere # with bias fixing. # This is kind of messy, but it works # ------------------------------------------------------ set Campaign_Name = `gp.CreateCampaignPrefix` if ($Campaign_Name == "Track" && $point_position == "yes") then gp.MergePointStacovs StacovName.$$ set StacovFileName = `cat StacovName.$$` mkdir log_files qm_files nml_files nio_files smcov_files bias_free_stacovs mkdir rnx_files mv -f *.log log_files mv -f *.qm qm_files mv -f *.nml nml_files mv -f *.smcov smcov_files mv -f *.nio nio_files mv -f *.bias_free.stacov bias_free_stacovs mv -f *.rnx rnx_files else if ($point_position == "yes") then set num_qm_files = `ls *.qm | wc -l` if ($num_qm_files >= 2) then merg_qm *.qm qmfile catcov *.stacov > free_STACOV if (! -e POINT.TXT) cp -f /goa/local/templates/POINT.TXT . if ($Campaign_Name == "Helens") then echo "Now running ambigon for campaign "$Campaign_Name ambigon_p1 qmfile fix.stacov JRO1 NONE free_STACOV POINT.TXT `ls *.smcov` >& ambigon.log else if ($Campaign_Name == "PacificNorthwest") then echo "Now running ambigon for campaign "$Campaign_Name ambigon_p1 qmfile fix.stacov STAA NONE free_STACOV POINT.TXT `ls *.smcov` >& ambigon.log else ambigon_p1 qmfile fix.stacov `qm_sta qmfile | head -1` \ NONE free_STACOV POINT.TXT `ls *.smcov` >& ambigon.log endif # Check stacov file for proper 2 character year # --------------------------------------------- set yeartest = `grep longyr SaveObsDate | awk '{print $2}'` if ($yeartest > 1999) then gp.fix_stacov_2000_year fix.stacov endif # Create map from stacov file # --------------------------- map_stacov fix.stacov # Write information about ambigon run to log file # ----------------------------------------------- echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo ambigon.nml >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log gp.chk_bias_flags >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log amb_sum ambigon.log > fix.stacov_ambsum.log # Write information about ambigon run to log file # ----------------------------------------------- set verb_flag = `grep Verbose ProcessFlags | awk '{print $2}'` if ($verb_flag == "yes") then cat ambigon.log | grep conf= | sort -g +6 >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log else grep WIDELANE fix.stacov_ambsum.log >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log grep "NARROWLANE SUMMARY" fix.stacov_ambsum.log >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log grep STA fix.stacov_ambsum.log >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log endif set astat = $status if (! $astat) then grep -i antenna *stacov.point | sed 's/^.*://' >> fix.stacov # set frame = itrf97 # if (-e XFILE) then # set frame = `tail -1 XFILE | awk '{print $(NF-2)}'` # apply -x XFILE -i fix.stacov -o fix.$frame.stacov -r -t -s >>& ambigon.log # endif endif else echo "Number of qm files is less than 2 - No bias fixing done" endif endif # Update positions in /goa/sta_info/sta_pos # ----------------------------------------- # # If point positioning, merge stacov files # Note: If not point positioning, there # is already only a single properly # named file. # ----------- gp.MergePointStacovs StacovName.$$ set StacovFileName = `cat StacovName.$$` echo "gp.driver:" echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "Action--$StacovFileName created" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log rm -r StacovName.$$ StacovDir.$$ endif # Create xyz files # ---------------- echo " " echo "---------------------------------------------------------" echo gp.driver: gp.results started `date` set LogFileName = ../`grep datelong SaveObsDate | awk '{print $2}'`.log gp.results $StacovFileName $LogFileName if ($status != 0) then echo gp.driver: gp.results returned non-zero status. echo gp.driver: stops. exit 8 endif # Print message to log file specifying orbit used # ----------------------------------------------- set OrbitType = `grep OrbitType ProcessFlags | awk '{print $2}'` echo "-------------------------------" switch ($OrbitType) case F: echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "Action--Final Orbits used" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log breaksw case P: echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "Action--Preliminary Orbits used" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log breaksw case default: echo " " >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log echo "Action--Orbit type unknown" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log breaksw endsw echo "-------------------------------" # Save merged stacov, ProcessFlags, and CampaignsToInclude # -------------------------------------------------------- echo " " echo "---------------------------------------------------------" echo gp.driver: gp.save.pl started echo "gp.driver: before call to gp_save" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log gp.save.pl echo "gp.driver: after call to gp_save" >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log if ($status != 0) then echo gp.driver: gp.save.pl returned non-zero status. echo gp.driver: stops. exit 9 endif echo gp.driver: Finished at `date` echo gp.driver: Finished at `date` >> ../`grep datelong SaveObsDate | awk '{print $2}'`.log