Difference between revisions of "CSV software"

From HallCWiki
Jump to navigationJump to search
 
(38 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
{{Template:SIDIS Run Group Navigation}}
 +
 +
== git ==
 +
 +
=== Repositories ===
 +
==== Gitlab repos ====
 +
* [https://gitlab.com/hallc gitlab group]
 +
** [https://gitlab.com/hallc/exp/csv CSV subgroup]
 +
 +
==== github repos ====
 +
All the repos on github can be found on gitlab (which is better in my opinion). If you are familiar with github and don't want to use gitlab, that is OK.
 +
 +
* https://github.com/JeffersonLab/hallc_replay_sidis_fall18 (Main online repository)
 +
* https://github.com/whit2333/online_csv (CSV specific run lists, database, online/offline scripts)
 +
* https://github.com/whit2333/hallc_tools (Generic Hall-C toolkit)
 +
* https://github.com/whit2333/hcana (cmake_demangled)
 +
* https://github.com/whit2333/analyzer (cmake_demangled)
 +
* https://github.com/whit2333/cool_halls (superbuild of evio/analyzer/hcana)
 +
* https://github.com/whit2333/hallc_epics_run_info ( epics run info stuff)
 +
* https://github.com/whit2333/spectrometer_angles (WIP to automatically determine the angle from the camera image.)
 +
 +
Other notables:
 +
 +
* https://github.com/shroffk/phoebus
 +
 +
=== Doing pull requests ===
 +
 +
0. You forked "JeffersonLab/working_repo" (on github or gitlab)
 +
 +
1. Setup your local repo by cloning '''your fork''' then add the  upstream remote.
 +
<pre>
 +
git clone https://github.com/USER/working_repo.git
 +
cd working_repo
 +
git remote add jlab https://github.com/JeffersonLab/working_repo.git
 +
</pre>
 +
2. Time passes... You do work and make commits. Use only master for now. (Once you understand this process, branches are easy to use)
 +
 +
3. '''Update your fork'''.
 +
<pre>
 +
git pull jlab master
 +
# note experts would likely "rebase" against the jlab remote instead of "pull". Don't worry about this for now.
 +
</pre>
 +
4. '''Fix all conflicts'''.
 +
 +
5. Push to your fork
 +
<pre>
 +
git push origin master
 +
</pre>
 +
6. Submit pull request
 +
<pre>
 +
"JeffersonLab/working_repo master"  <---  "USER/working_repo master"
 +
</pre>
 +
7. Bug maintainer (with emails, texts, whatever) to merge your request.
 +
 +
== hallc_replay ==
 +
 +
=== Run Database ===
 +
Please use the run database when updating dbase/param/calibration files.
 +
See [https://github.com/JeffersonLab/hallc_replay_sidis_fall18/blob/master/DBASE/COIN/standard.database standard.database] as an example to follow. Note the new files created for each run range.
 +
 +
==== Explanation ====
 +
As an example let's look at this snippet of <code>standard.database</code> for two different run ranges:
 +
<pre>
 +
...
 +
# CSV experiment
 +
6009-6999
 +
g_ctp_parm_filename      = "DBASE/COIN/general.param"
 +
g_ctp_kinematics_filename = "db2/auto_standard_coin.kinematics"
 +
g_ctp_map_filename        = "MAPS/COIN/DETEC/coin_fall18.map"
 +
g_ctp_trigdet_filename    = "PARAM/TRIG/tcoin_fall18.param"
 +
 +
# jpsi experiment
 +
# phase 1 kinematics
 +
7000-7273
 +
g_ctp_parm_filename      = "DBASE/COIN/general_7000.param"
 +
g_ctp_kinematics_filename = "db2/auto_standard_coin.kinematics"
 +
g_ctp_map_filename        = "MAPS/COIN/DETEC/coin_spring19.map"
 +
g_ctp_trigdet_filename = "PARAM/TRIG/tcoin_spring19.param"
 +
...
 +
</pre>
 +
Note  only the <code>g_ctp_parm_filename</code> has changed but a new run-range block was created. This makes it human readable, thus, less error prone.
 +
The new param file, <code>DBASE/COIN/general_7000.param</code>, starts as a copy of the previous file following the convention where its (unique) name is defined by either the first run it applies to, or the run used to calibrate (if it is a calibration change).
 +
 
 +
<pre>
 +
diff general.param general_7274.param
 +
43c43
 +
< #include "PARAM/HMS/CAL/hcal_calib.param"
 +
---
 +
> #include "PARAM/HMS/CAL/hcal_calib_phase1_2.param"
 +
78c78
 +
< #include "PARAM/SHMS/CAL/pcal_calib.param"
 +
---
 +
> #include "PARAM/SHMS/CAL/pcal_calib_7109.param"
 +
</pre>
 +
 +
This shows that <code>general.param</code> and <code>general_7000.param</param> point to different HMS and SHMS calibrations calibrations.
  
 
== Working on the farm ==
 
== Working on the farm ==
 +
 +
=== File System ===
 +
 +
==== Large File Output: /volatile ====
 +
 +
That is what /volatile and /cache are designed for large file output.
 +
 +
CSV has a tape volume /mss/hallc/E12-09-002/ allocated to it.
 +
 +
Your workflow should be
 +
# writing to /volatile for tests (followed by pushing those files to tape if the results are useful).
 +
# or if you have 'known good' replay scripts, then you can actually 'write' directly to /cache (which is automagically backed to tape) and cut out the /volatile middleman.
 +
[https://scicomp.jlab.org/docs/write-through-cache See the write-through cache docs here for details].
 +
 +
==== Analysis Code: /group ====
 +
 +
The <code>/group</code> disks are backed up like home directories. Here we have limited space 60GB and only code scripts and small data files should be kept here.
 +
 +
The CSV software is installed under <code>/group/c-csv/local</code>.
 +
 +
=== modules files ===
  
 
CSV software can be found in <code>/group/c-csv/local</code> and is setup to use <code>environment-modules</code> (modulefiles).
 
CSV software can be found in <code>/group/c-csv/local</code> and is setup to use <code>environment-modules</code> (modulefiles).
  
=== modules files ===
 
 
If <code>module avail</code> doesn't work then you must add <code>source /etc/profile.d/modules.sh</code> to your <code>.bashrc</code>.
 
If <code>module avail</code> doesn't work then you must add <code>source /etc/profile.d/modules.sh</code> to your <code>.bashrc</code>.
 
group disk: /group/c-csv
 
group disk: /group/c-csv
Line 29: Line 145:
 
</pre>
 
</pre>
  
 +
=== Batch Jobs ===
 +
 +
==== Auger XML Example ====
 +
 +
Note the numerous places you need to fix with your own information below.
 +
 +
<pre>
 +
<Request>
 +
  <Email email="you@jlab.org" request="false" job="false"/>
 +
  <Project name="c-comm2017"/>
 +
  <Track  name="reconstruction"/>
 +
  <Name  name="sidis_2018"/>
 +
  <OS    name="centos7"/>
 +
  <Memory space="3024" unit="MB"/>
 +
  <List name="runs">
 +
6000
 +
6001
 +
etc...
 +
  </List>
 +
  <ForEach list="runs">
 +
    <Job>
 +
      <Input src="mss:/mss/hallc/spring17/raw/coin_all_0${runs}.dat" dest="coin_all_0${runs}.dat"/>
 +
      <Output src="ROOTfiles/coin_replay_production_${runs}_-1.root"
 +
        dest="/volatile/hallc/your_volatile/ROOTfiles/coin_replay_production_${runs}_-1.root"/>
 +
      <Output src="REPORT_OUTPUT/COIN/PRODUCTION/replay_coin_production_${runs}_-1.report"
 +
        dest="/volatile/hallc/your_work/REPORT_OUTPUT/COIN/PRODUCTION/replay_coin_production_${runs}_-1.report"/>
 +
      <Output src="REPORT_OUTPUT/COIN/PRODUCTION/summary_production_${runs}_-1.report"
 +
        dest="/volatile/hallc/your_volatile/REPORT_OUTPUT/COIN/PRODUCTION/summary_production_${runs}_-1.report"/>
 +
      <Command><![CDATA[
 +
/bin/bash <<EOF
 +
echo " YOU SHOULD CHANGE THIS "
 +
#source /home/whit/.bashrc
 +
#make_hallc_replay_symlinks -c
 +
#make_hallc_replay -c
 +
#mkdir ROOTfiles
 +
#ls -lrth
 +
#./bin/hc_coin -n -1 -r ${runs}
 +
#ls -lrth ROOTfiles
 +
#ls -lrth
 +
EOF
 +
        ]]></Command>
 +
    </Job>
 +
  </ForEach>
 +
</Request>
 +
 +
</pre>
 +
 +
Submit your job with the command
 +
<pre>
 +
jsub -xml your_file.xml
 +
</pre>
 +
 +
== Online ==
 +
=== Working on cdaq machines ===
 +
 +
For details on how to load different environments run:
 +
<pre>
 +
bash_csv help
 +
</pre>
 +
 +
=== replay ===
 +
 +
Online replay directory was the same as the pt sidis.
 +
 +
To get to a good bash environment run
 +
<pre>
 +
bash_csv counter
 +
</pre>
 +
 +
=== Run Information Monitor (blue screen) ===
 +
 +
The bulk of the work is done by the EPICS software IOC [https://github.com/whit2333/hallc_epics_run_info found here].
 +
 +
Some new process variables
 +
<pre>
 +
hcHMSAngleEncoderOffset      -- HMS offset used to calculate corrected angle: CorrectedAngle = Encoder + EncoderOffset
 +
hcSHMSAngleEncoderOffset      -- SHMS offset.
 +
hcRunSettingHMSAngle          -- not used
 +
hcRunSettingSHMSAngle        -- not used
 +
hcRunPlanChargeGoal          --
 +
hcRunPlanTimeRemainingEst
 +
hcCOINIntRunNumber            -- Mirrors hcCOINRunNumber (not supplied by this IOC)
 +
hcSHMSIntRunNumber            -- Mirrors hcCOINRunNumber (not supplied by this IOC)
 +
hcHMSIntRunNumber            -- Mirrors hcCOINRunNumber (not supplied by this IOC)
 +
hcDAQ_ps1
 +
hcDAQ_ps2
 +
hcDAQ_ps3
 +
hcDAQ_ps4
 +
hcDAQ_ps5
 +
hcDAQ_ps6
 +
hcRunSettingNumber        -- A count that is incremented at the start of a new run when hcRunSettingReconfigured is non-zero.
 +
hcRunSettingReconfigured  -- becomes nonzero when the spectrometer angle, momentum, or target is changed. Resets "RunSetting" counters
 +
hcKinematicSettingNumber  -- user supplied
 +
hcKinematicSettingGroup    -- user supplied
 +
hcKinematicSettingID      -- user supplied
 +
hcRunPlanCountGoal       
 +
hcRunPlanNTrigEventsGoal
 +
hcCOINRunAccumulatedCharge  -- Latest/current run charge while beam > 1uA
 +
hcCOINRunTime                -- Latest/current run time while beam > 1uA
 +
hcCOINRunAverageBeamCurrent  -- Average beam current while beam > 1uA
 +
hcSHMSRunAccumulatedCharge
 +
hcSHMSRunTime
 +
hcSHMSRunAverageBeamCurrent
 +
hcHMSRunAccumulatedCharge
 +
hcHMSRunTime
 +
hcHMSRunAverageBeamCurrent
 +
hcHMSCorrectedAngle
 +
hcSHMSCorrectedAngle
 +
hcHMSMomentum            -- mirrored set momentum value
 +
hcSHMSMomentum            -- mirrored set momentum value
 +
hcHMSAngleChanged        --
 +
hcBDSSELECT_mirror        -- mirrors target selected
 +
hcCreateNewRunSetting
 +
hcRunSettingAccumulatedCharge
 +
hcRunSettingTime
 +
hcRunSettingAverageBeamCurrent
 +
hcStartNewRunSetting
 +
hcCOINRunChargeReset
 +
hcCOINResetRunTime
 +
hcSHMSRunChargeReset
 +
hcSHMSResetRunTime
 +
hcHMSRunChargeReset
 +
hcHMSResetRunTime
 +
hcHMSSettingChange
 +
hcSHMSSettingChange
 +
hcSHMSAngleChanged
 +
hcTargetChange
 +
hcRunSettingIncrement
 +
hcResetRunSetting
 +
hcRunSettingChargeReset
 +
hcResetRunSettingTime
 +
</pre>
 +
 +
== Tips and Tricks ==
 +
 +
=== <code>userweb</code> ===
 +
Want a <code>userweb.jlab.org/~USER</code> account?
 +
* [https://misportal.jlab.org/railsForms/user_web_requests/new Fill out this form].
 +
* More information [https://cc.jlab.org/webservices/userweb here].
 +
 +
Note: <code>/userweb/USER/public_html</code> is not mounted on the farm nodes. You just be on <code>labl4</code> or a similar node.
 +
 +
How to effectively use userweb:
 +
 +
# On the farm, you write a script that outputs <code>myplot.pdf</code>
 +
# <code>ssh jlabl4 'mkdir -p /userweb/USER/public_html/hallc/my_analysis/'</code>
 +
# <code>scp myplot.pdf jlabl4:/userweb/USER/public_html/hallc/my_analysis/.</code>
 +
 +
Or better yet, inside your root script.
 +
 +
<pre>
 +
...
 +
TCanvas* c = ...
 +
...
 +
c->SaveAs("myplot.png");
 +
c->SaveAs("myplot.pdf");
 +
std::system("ssh jlabl4 'mkdir -p /userweb/USER/public_html/hallc/my_analysis/");
 +
std::system("scp myplot.pdf jlabl4:/userweb/USER/public_html/hallc/my_analysis/.");</pre>
 +
Where we assume that passwordless ssh (see below) has been setup.
 +
 +
Now you can get your plots at https://userweb.jlab.org/~USER/hallc/my_analysis/. It helps to save a png and pdf for plots because a png is easily viewed in the browser while a pdf is generally better.
 +
 +
=== ssh ===
 +
 +
Looking at online web server (running on cdaql1 for example) by forwarding ssh
 +
<pre>
 +
# step 1. On local machine:
 +
ssh -L 8888:localhost:8888 hallc
 +
 +
# step 2 from the login server run
 +
ssh -L 8888:cdaql1.jlab.org:8888 cdaq@cdaql1
 +
</pre>
  
== Repositories ==
 
  
[https://github.com/whit2333/hallc_tools hallc_tools]
+
* [http://www.linuxproblem.org/art_9.html Setup passwordless ssh inside of jlab]

Latest revision as of 16:43, 27 March 2019

Run Group | ELOG | PT Scan Experiment | CSV Experiment | Software/Computing | CSV Analysis | SIDIS pages | This Navigation

git

Repositories

Gitlab repos

github repos

All the repos on github can be found on gitlab (which is better in my opinion). If you are familiar with github and don't want to use gitlab, that is OK.

Other notables:

Doing pull requests

0. You forked "JeffersonLab/working_repo" (on github or gitlab)

1. Setup your local repo by cloning your fork then add the upstream remote.

git clone https://github.com/USER/working_repo.git
cd working_repo
git remote add jlab https://github.com/JeffersonLab/working_repo.git

2. Time passes... You do work and make commits. Use only master for now. (Once you understand this process, branches are easy to use)

3. Update your fork.

git pull jlab master
# note experts would likely "rebase" against the jlab remote instead of "pull". Don't worry about this for now. 

4. Fix all conflicts.

5. Push to your fork

git push origin master

6. Submit pull request

"JeffersonLab/working_repo master"  <---  "USER/working_repo master"

7. Bug maintainer (with emails, texts, whatever) to merge your request.

hallc_replay

Run Database

Please use the run database when updating dbase/param/calibration files. See standard.database as an example to follow. Note the new files created for each run range.

Explanation

As an example let's look at this snippet of standard.database for two different run ranges:

...
# CSV experiment
6009-6999
g_ctp_parm_filename       = "DBASE/COIN/general.param"
g_ctp_kinematics_filename = "db2/auto_standard_coin.kinematics"
g_ctp_map_filename        = "MAPS/COIN/DETEC/coin_fall18.map"
g_ctp_trigdet_filename    = "PARAM/TRIG/tcoin_fall18.param"

# jpsi experiment
# phase 1 kinematics
7000-7273
g_ctp_parm_filename       = "DBASE/COIN/general_7000.param"
g_ctp_kinematics_filename = "db2/auto_standard_coin.kinematics"
g_ctp_map_filename        = "MAPS/COIN/DETEC/coin_spring19.map"
g_ctp_trigdet_filename = "PARAM/TRIG/tcoin_spring19.param"
...

Note only the g_ctp_parm_filename has changed but a new run-range block was created. This makes it human readable, thus, less error prone. The new param file, DBASE/COIN/general_7000.param, starts as a copy of the previous file following the convention where its (unique) name is defined by either the first run it applies to, or the run used to calibrate (if it is a calibration change).

diff general.param general_7274.param 
43c43
< #include "PARAM/HMS/CAL/hcal_calib.param"
---
> #include "PARAM/HMS/CAL/hcal_calib_phase1_2.param"
78c78
< #include "PARAM/SHMS/CAL/pcal_calib.param"
---
> #include "PARAM/SHMS/CAL/pcal_calib_7109.param"

This shows that general.param and general_7000.param</param> point to different HMS and SHMS calibrations calibrations.

Working on the farm

File System

Large File Output: /volatile

That is what /volatile and /cache are designed for large file output.

CSV has a tape volume /mss/hallc/E12-09-002/ allocated to it.

Your workflow should be

  1. writing to /volatile for tests (followed by pushing those files to tape if the results are useful).
  2. or if you have 'known good' replay scripts, then you can actually 'write' directly to /cache (which is automagically backed to tape) and cut out the /volatile middleman.

See the write-through cache docs here for details.

Analysis Code: /group

The /group disks are backed up like home directories. Here we have limited space 60GB and only code scripts and small data files should be kept here.

The CSV software is installed under /group/c-csv/local.

modules files

CSV software can be found in /group/c-csv/local and is setup to use environment-modules (modulefiles).

If module avail doesn't work then you must add source /etc/profile.d/modules.sh to your .bashrc. group disk: /group/c-csv

Running module avail should produce something like following.

--------------------------------------- /group/c-csv/local/etc/modulefiles ----------------------------------------
cmake/3.10.3                epics/latest                hcana/1.0                   root/6.14.04
cmake/3.12.2                experimental/imgui_dm/0.0.1 hcana/latest                root/6.15.0x
cmake/latest                gcc/8.1.0                   llvm/6.0.1                  root/dev
csv/1.0                     gcc/8.2.0                   llvm/latest                 root/latest
csv/latest                  gcc/latest                  ncurses/6.1                 tmux/2.7
curl/7.61.1                 git/2.18.0                  ncurses/latest              tmux/latest
curl/latest                 git/latest                  python/2.7.15
eigen3/3.3.5                hallc_tools/0.1             python/3.7.1
epics/base_7.0.1            hallc_tools/latest          root/6.14.0

Run the following to setup your environment

source /group/c-csv/local/setup.sh
module load csv/latest

Batch Jobs

Auger XML Example

Note the numerous places you need to fix with your own information below.

<Request>
  <Email email="you@jlab.org" request="false" job="false"/>
  <Project name="c-comm2017"/>
  <Track  name="reconstruction"/>
  <Name   name="sidis_2018"/>
  <OS     name="centos7"/>
  <Memory space="3024" unit="MB"/>
  <List name="runs">
6000
6001
etc...
  </List>
  <ForEach list="runs">
    <Job>
      <Input src="mss:/mss/hallc/spring17/raw/coin_all_0${runs}.dat" dest="coin_all_0${runs}.dat"/>
      <Output src="ROOTfiles/coin_replay_production_${runs}_-1.root" 
        dest="/volatile/hallc/your_volatile/ROOTfiles/coin_replay_production_${runs}_-1.root"/>
      <Output src="REPORT_OUTPUT/COIN/PRODUCTION/replay_coin_production_${runs}_-1.report" 
        dest="/volatile/hallc/your_work/REPORT_OUTPUT/COIN/PRODUCTION/replay_coin_production_${runs}_-1.report"/>
      <Output src="REPORT_OUTPUT/COIN/PRODUCTION/summary_production_${runs}_-1.report" 
        dest="/volatile/hallc/your_volatile/REPORT_OUTPUT/COIN/PRODUCTION/summary_production_${runs}_-1.report"/>
      <Command><![CDATA[
/bin/bash <<EOF
echo " YOU SHOULD CHANGE THIS "
#source /home/whit/.bashrc
#make_hallc_replay_symlinks -c
#make_hallc_replay -c
#mkdir ROOTfiles
#ls -lrth
#./bin/hc_coin -n -1 -r ${runs}
#ls -lrth ROOTfiles
#ls -lrth 
EOF
        ]]></Command>
    </Job>
  </ForEach> 
</Request>

Submit your job with the command

jsub -xml your_file.xml

Online

Working on cdaq machines

For details on how to load different environments run:

bash_csv help

replay

Online replay directory was the same as the pt sidis.

To get to a good bash environment run

bash_csv counter

Run Information Monitor (blue screen)

The bulk of the work is done by the EPICS software IOC found here.

Some new process variables

hcHMSAngleEncoderOffset       -- HMS offset used to calculate corrected angle: CorrectedAngle = Encoder + EncoderOffset
hcSHMSAngleEncoderOffset      -- SHMS offset.
hcRunSettingHMSAngle          -- not used
hcRunSettingSHMSAngle         -- not used
hcRunPlanChargeGoal           -- 
hcRunPlanTimeRemainingEst
hcCOINIntRunNumber            -- Mirrors hcCOINRunNumber (not supplied by this IOC)
hcSHMSIntRunNumber            -- Mirrors hcCOINRunNumber (not supplied by this IOC)
hcHMSIntRunNumber             -- Mirrors hcCOINRunNumber (not supplied by this IOC)
hcDAQ_ps1
hcDAQ_ps2
hcDAQ_ps3
hcDAQ_ps4
hcDAQ_ps5
hcDAQ_ps6
hcRunSettingNumber         -- A count that is incremented at the start of a new run when hcRunSettingReconfigured is non-zero.
hcRunSettingReconfigured   -- becomes nonzero when the spectrometer angle, momentum, or target is changed. Resets "RunSetting" counters
hcKinematicSettingNumber   -- user supplied
hcKinematicSettingGroup    -- user supplied
hcKinematicSettingID       -- user supplied
hcRunPlanCountGoal        
hcRunPlanNTrigEventsGoal
hcCOINRunAccumulatedCharge   -- Latest/current run charge while beam > 1uA 
hcCOINRunTime                -- Latest/current run time while beam > 1uA
hcCOINRunAverageBeamCurrent  -- Average beam current while beam > 1uA
hcSHMSRunAccumulatedCharge
hcSHMSRunTime
hcSHMSRunAverageBeamCurrent
hcHMSRunAccumulatedCharge
hcHMSRunTime
hcHMSRunAverageBeamCurrent
hcHMSCorrectedAngle
hcSHMSCorrectedAngle
hcHMSMomentum             -- mirrored set momentum value
hcSHMSMomentum            -- mirrored set momentum value
hcHMSAngleChanged         -- 
hcBDSSELECT_mirror        -- mirrors target selected
hcCreateNewRunSetting 
hcRunSettingAccumulatedCharge
hcRunSettingTime
hcRunSettingAverageBeamCurrent
hcStartNewRunSetting
hcCOINRunChargeReset
hcCOINResetRunTime
hcSHMSRunChargeReset
hcSHMSResetRunTime
hcHMSRunChargeReset
hcHMSResetRunTime
hcHMSSettingChange
hcSHMSSettingChange
hcSHMSAngleChanged
hcTargetChange
hcRunSettingIncrement
hcResetRunSetting
hcRunSettingChargeReset
hcResetRunSettingTime

Tips and Tricks

userweb

Want a userweb.jlab.org/~USER account?

Note: /userweb/USER/public_html is not mounted on the farm nodes. You just be on labl4 or a similar node.

How to effectively use userweb:

  1. On the farm, you write a script that outputs myplot.pdf
  2. ssh jlabl4 'mkdir -p /userweb/USER/public_html/hallc/my_analysis/'
  3. scp myplot.pdf jlabl4:/userweb/USER/public_html/hallc/my_analysis/.

Or better yet, inside your root script.

...
TCanvas* c = ...
...
c->SaveAs("myplot.png");
c->SaveAs("myplot.pdf");
std::system("ssh jlabl4 'mkdir -p /userweb/USER/public_html/hallc/my_analysis/");
std::system("scp myplot.pdf jlabl4:/userweb/USER/public_html/hallc/my_analysis/.");

Where we assume that passwordless ssh (see below) has been setup.

Now you can get your plots at https://userweb.jlab.org/~USER/hallc/my_analysis/. It helps to save a png and pdf for plots because a png is easily viewed in the browser while a pdf is generally better.

ssh

Looking at online web server (running on cdaql1 for example) by forwarding ssh

# step 1. On local machine:
ssh -L 8888:localhost:8888 hallc

# step 2 from the login server run 
ssh -L 8888:cdaql1.jlab.org:8888 cdaq@cdaql1