SuperKEKB XRM system, all entries  Not logged in ELOG logo
ID Date Author Type Subject
  1   Tue Apr 19 19:09:25 2016 James BynesInstructionsObtaining data from XRM development boardstack
Here are the instructions to obtain data from XRM boardstack. This has currently been tested with 1 carrier board, but little modifications will allow multiple boards. Currently the data
taken is raw data, a pedestal extractor is currently under works.
The current firmware and software branch can be accessible from the svn repo at: https://www.phys.hawaii.edu/repos/belle2/itop/electronics/branches/XRM
**note** The firmware and software bundle can also be temporarily downloaded from Google Drive: https://drive.google.com/file/d/0B7Z8jduXUZ-LbFdUTFdEMkctUnc/view?usp=sharing
**note** Software bundle does not include XRM parser, please download from this ELOG.
**note** The following instructions are written using the directory for the test setup at IDLAB. Please modify the upcoming directories to match your system.

If any questions, please email James (bynes@hawaii.edu) or Luca (lucam@hawaii.edu)

Preliminary Step (setting up the network):

The firmware has been setup to communicate with a workstation using point-to-point topologies.
First, connect a SFP module from the SCROD to a media converter, then connect the Ethernet cable to your workstation.
Workstation IP
Next, we setup the test workstation (at IDLAB) using a static IP address, this machine ran Scientific Linux (red hat variant)
From red hat linux this can be done like so...
Menu System >> Administration >> Network
Statically set IP address:
Address 192.168.10.200
Subnet mask 255.255.255.0
SCROD firmware IP
The firmware is currently set to use IP address 192.168.10.***
where the last 3 digits is the ID of the SCROD. This IP will come in handy when launching the communication GUI.

Step 1 (program FPGA):
First need to source Xilinx settings, if your .bashrc doesn’t already do so.
Directory: /opt/Xilinx/Vivado/2014.4/
Change to c shell, type ‘csh’ in terminal
Source settings64.csh
Directory: /home/idlab/svn-02-18-2016/gigE
Upload bitfiles to FPGAs on chain ‘xmd -tcl program-bit-and-elf-and-go.xmd.tcl’

Step 2 (run GUI):
Directory: /home/idlab/svn-02-18-2016/gigE/software/gigE/
Source setup_env_template.csh
Now run GUI: ‘bin/develTest 192.168.10.101’
**Note** 101 is the SCROD board ID, this should be on the SCROD itself on a whitish label.
To test whether or not link to SCROD is up, from configuration tab on GUI, click “Read Configuration” button on the bottom

Step 3 (configuration):
Next, the configuration script will need to be ran
Directory: /home/idlab/svn-02-18-2016/gigE/software/gigE/pnnl
Run configuration script: './configure_boardstack.csh'
...
In the GUI, will also need to manually configure some settings.
From the Configuration tab, change the following fields to the parameters:
trigMask -> 0xe
featureExtractionMode -> Passthrough
After these two parameters are changed, hit the “Write Configuration” button on the bottom.

Step 4 (pull data):
This current script will take data from carrier 0 (includes all 4 ASICs).
Directory: /home/idlab/svn-02-18-2016/gigE/software/gigE/pnnl/
Run current test script: ‘./runtest.csh’
The binary file will be outputted to data/test_c0_1.bin

Step 5 (parse data):
XRMdataExtractor.c will convert binary data pulled from previous step and output to a readable format. It is attached to this elog
Use: ./XRMdataExtractor <binary_file>
Output files: XRM_header_from_binary_file.txt, XRM_data_from_binary_file.txt
The header file shows format of data file which is as follows:
carrier# | ASIC# | Sample# | CH0 | CH1 | CH2 | CH3 | CH4 | CH5 | CH6 | CH7

Upcoming additions:
XRMpedExtractor
XRMdataVisualizer
Attachment 1: XRMdataExtractor.c
/******************************************************************
 * Author: James Bynes
 * Date: 04-19-2016
 * XRMdataExtractor.c
 * Description: Extracts data taken from ASIC and outputs to
 *		readable format.
 ******************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int data_ch[8][64];
int mm = 0;
int carrier = 0;
int asic = 0;
void initialize_data(void){
    int m,n;
    for(n=0;n<8;n++){
	for(m=0;m<64;m++)
	    data_ch[n][m]=0;
    }
}

unsigned int createMask(unsigned int a, unsigned int b){
    unsigned int r=0;
    unsigned int i=0;
    for (i=a; i<=b; i++)
	r |= 1 << i;
    return r;
}

void fprint_data(FILE *fp){
    int m,n;
    
    for(m=0;m<64;m++)
	fprintf(fp,"%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", carrier, asic, m, data_ch[0][m], data_ch[1][m], data_ch[2][m], data_ch[3][m], data_ch[4][m], data_ch[5][m], data_ch[6][m], data_ch[7][m]);
}

void get_eventInfo(FILE *headerFile, unsigned int wordsInPacket,int mm, int k){
    unsigned int r, result;
    fprintf(headerFile,"line %d\n", mm);
    fprintf(headerFile,"k: %d\n", k);
    r = createMask(30,31);
    result = (r & wordsInPacket)>>30;
    carrier = result;
    fprintf(headerFile,"Carrier: 0x%01x\n", result);
    r = createMask(28,29);
    result = (r & wordsInPacket)>>28;
    asic = result;
    fprintf(headerFile,"IRSX: 0x%01x\n", result);
    r = createMask(27,27);
    result = (r & wordsInPacket)>>27;
    fprintf(headerFile,"0: 0x%01x\n", result);
    r = createMask(24,26);
    result = (r & wordsInPacket)>>24;
    fprintf(headerFile,"Channel: 0x%01x\n", result);
    r = createMask(16,23);
    result = (r & wordsInPacket)>>16;
    fprintf(headerFile,"LastWriteAddress: 0x%02x\n", result);
    r = createMask(9,15);
    result = (r & wordsInPacket)>>9;
    fprintf(headerFile,"SCROD ID: 0x%03x\n", result);
    r = createMask(0,8);
    result = (r & wordsInPacket);
    fprintf(headerFile,"Converted Addr: 0x%03x\n", result);
}

main(int argc, char *argv[]){
    if(argc < 2){
	printf("You must enter a binary filename\n");
	goto INVALID_ARGS;
    }

    char headerName[80];
    char dataName[80];
    strcpy(headerName, "XRM_header_");
    strcat(headerName, argv[1]);
    strcat(headerName, ".txt");
    strcpy(dataName, "XRM_data_");
    strcat(dataName, argv[1]);
    strcat(dataName, ".txt");

    FILE *fileName = fopen(argv[1], "r");
    FILE *headerFile = fopen(headerName, "w");
    FILE *dataFile = fopen(dataName, "w");

    fputs("DATA FORMAT\n", headerFile);
    fputs("carrier# | ASIC# | Sample# | CH0 | CH1 | CH2 | CH3 | CH4 | CH5 | CH6 | CH7\n\n", headerFile);

    if(!fileName){
	printf("File doesn't exist\n");
	INVALID_ARGS:
	printf("Usage:\n");
	printf("XRMdataExtractor <binary file>\n");
	return;
    }
    
    unsigned int wordsInPacket, packet_hdr, result, r, num_windows, footer;
    int i = 0;
    int j = 0;
    int k = 0;

    initialize_data();

    printf("_________HEADER__________\n");

    while(!feof(fileName)){
	NEW_EVENT:
	fread(&packet_hdr, sizeof(packet_hdr),1,fileName);
	if(feof(fileName))
	    break;
	wordsInPacket = packet_hdr;
	if (mm < 3){
	    if (mm == 0){
		fprintf(headerFile,"Event size: %d\n", wordsInPacket);
	    }
	    if (mm == 1){
		r = createMask(28,31);
		result = (r & wordsInPacket)>>28;
		fprintf(headerFile,"Trig Pattern: 0x%01x\n", result);
		r = createMask(19,27);
		result = (r & wordsInPacket)>>19;
		num_windows = result+1;
		fprintf(headerFile,"# of windows: 0x%03x\n", result);
		r = createMask(0,18);
		result = r & wordsInPacket;
		fprintf(headerFile,"Timestamp: 0x%05x\n", result);
	    }
	    if (mm == 2){
		get_eventInfo(headerFile,wordsInPacket,mm,k);
	    }
	}
	else{
	    if((j < 8) && (i < 64)){
		r = createMask(0,11);
		result = (r & wordsInPacket);
		data_ch[j][i] = result;
		i++;
		r = createMask(16,27);
		result = (r & wordsInPacket)>>16;
		data_ch[j][i] = result;
		i++;
		    
	    }
	    else{
		if((j==7)){ //on to next event
		    j = 0;
		    i = 0;
		    k = k + 1;
		    fprint_data(dataFile);
		    if(k<4)
			get_eventInfo(headerFile,wordsInPacket,mm,k);
		    else{
			footer = wordsInPacket;
			printf("Footer %08x\n",footer);
			mm = 0;
			k = 0;
			goto NEW_EVENT;
		    }
		}
		else{//on to next channel (same event)
		    i = 0;
		    j++;
		    r = createMask(0,11);
		    result = (r & wordsInPacket);
		    data_ch[j][i] = result;
		    i++;
		    r = createMask(16,27);
		    result = (r & wordsInPacket)>>16;
		    data_ch[j][i] = result;
		    i++;
		}
	    }
	}
	mm++;
    }
    printf("\n");
}

  2   Sun May 1 01:45:45 2016 James BynesInstructionsSetting up Ubuntu 14.04 to take data from XRM boardstack
This ELOG shows how to obtain data from XRM boardstack from a fresh install of Ubuntu 14.04

i) Freshly install Ubuntu 14.04

Once installation is finished, update all packages:
'sudo apt-get update'
'sudo apt-get upgrade'
'sudo apt-get update'


ii) Add a softlink so that gmake points to make:

'sudo ln -s /usr/bin/make /usr/bin/gmake'

iii) Install the following via 'sudo apt-get install <package>'

libxml2-dev
g++
libbz2-dev
libqt4-dev
python-dev
lib32z1-dev
vim
subversion
tsch


iv) Download software package and make:
Directory: /home/
'svn co https://www.phys.hawaii.edu/repos/belle2/itop/electronics/branches/XRM'
Directory: ~/XRM/software/gigE/
'source setup_env_template.sh'
'make clean'
'make'
(should make with no errors)

v) Install Vivado 2014.4 using web pack (used Design edition since limited in space)
'chmod +x Xilinx_installation_file.bin'
'sudo ./Xilinx_installation_file.bin'

install to /opt/Xilinx/...
allow write permissions to Xilinx folder:
'sudo chmod 777 -R /opt/Xilinx/'
'sudo chmod 777 -R ~/.Xilinx'

Open ~/.bashrc in your favorite text editor and add the following:
____________________________________________________
XILINXD_LICENSE_FILE=<your_license>
LM_LICENSE_FILE=<your_license>
export XILINXD_LICENSE_FILE
export LM_LICENSE_FILE
source /opt/Xilinx/Vivado/2014.4/settings64.sh
____________________________________________________
Now show be able to run vivado by typing vivado from xterm

vi) Setting up network for communication with boardstack:
The firmware has been setup to communicate with a workstation using point-to-point topologies.
First, connect a SFP module from the SCROD to a media converter, then connect the Ethernet cable to your workstation.
Workstation IP
From Network Connections, add a new Ethernet connection
From the Ethernet tab, select your network adapter Device MAC Address
Statically set IP address:
On IPv4 tab, select Manual from drop-down list
Click on Add and add the following:
Address: 192.168.10.200
Subnet mask: 255.255.255.0
Gateway: 0.0.0.0
SCROD firmware IP
The firmware is currently set to use IP address 192.168.10.***
where the last 3 digits is the ID of the SCROD. This IP will come in handy when launching the communication GUI.

vii) Program FPGA

Directory: ~/XRM/
Upload bitfiles to FPGAs on chain ‘xmd -tcl program-bit-and-elf-and-go.xmd.tcl’

viii) Run GUI
Directory: ~/XRM/software/gigE/
'Source setup_env_template.sh'
Now run GUI: ‘bin/develTest 192.168.10.101’
**Note** 101 is the SCROD board ID, this should be on the SCROD itself on a whitish label.
To test whether or not link to SCROD is up, from configuration tab on GUI, click “Read Configuration” button on the bottom

ix) Configure boardstack
Open a new terminal window and source setup_env_template.sh again
Directory: ~/XRM/software/gigE/pnnl/
Open configure_boardstack.csh with your favorite text editor
On the line 'foreach carrier(...)', starting from 0, sequential add numbers for the amount of carriers on the boardstack
Example: 'foreach carrier(0 1 2)' is used for 3 carriers on the boardstack
Save and run the file: './configure_boardstack.csh'
On the GUI from the configuration tab, change the following parameters:
trigMask -> 0xe (for 1 carrier), 0xc (for 2 carriers), 0x8 (for 3 carriers)
featureExtractionMode -> Passthrough


x) Pull Data
Directory: ~/XRM/software/gigE/pnnl/
'/.runtest.csh'

xi) Parse Data
Directory: ~/XRM/software/gigE/pnnl/data
Download file attached to this ELOG to directory
Compile: 'gcc -o XRMdataExtractor XRMdataExtractor.c'
Parse data: 'XRMdataExtractor test_c0_1.bin'
Open XRM_data_test_c0_1.bin.txt using your favorite text editor to look at the data

xii) Future Additions

XRMpedExtractor - This program will determine pedestals
Attachment 1: XRMdataExtractor.c
/******************************************************************
 * Author: James Bynes
 * Date: 04-19-2016
 * XRMdataExtractor.c
 * Description: Extracts data taken from ASIC and outputs to
 *		readable format.
 ******************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int data_ch[8][64];
int mm = 0;
int carrier = 0;
int asic = 0;

void initialize_data(void){
    int m,n;
    for(n=0;n<8;n++){
	for(m=0;m<64;m++)
	    data_ch[n][m]=0;
    }
}

unsigned int createMask(unsigned int a, unsigned int b){
    unsigned int r=0;
    unsigned int i=0;
    for (i=a; i<=b; i++)
	r |= 1 << i;
    return r;
}

void fprint_data(FILE *fp){
    int m,n;
    
    for(m=0;m<64;m++)
	fprintf(fp,"%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", carrier, asic, m, data_ch[0][m], data_ch[1][m], data_ch[2][m], data_ch[3][m], data_ch[4][m], data_ch[5][m], data_ch[6][m], data_ch[7][m]);
}

void get_eventInfo(FILE *headerFile, unsigned int wordsInPacket,int mm, int k){
    unsigned int r, result;
    fprintf(headerFile,"line %d\n", mm);
    fprintf(headerFile,"k: %d\n", k);
    r = createMask(30,31);
    result = (r & wordsInPacket)>>30;
    carrier = result;
    fprintf(headerFile,"Carrier: 0x%01x\n", result);
    r = createMask(28,29);
    result = (r & wordsInPacket)>>28;
    asic = result;
    fprintf(headerFile,"IRSX: 0x%01x\n", result);
    r = createMask(27,27);
    result = (r & wordsInPacket)>>27;
    fprintf(headerFile,"0: 0x%01x\n", result);
    r = createMask(24,26);
    result = (r & wordsInPacket)>>24;
    fprintf(headerFile,"Channel: 0x%01x\n", result);
    r = createMask(16,23);
    result = (r & wordsInPacket)>>16;
    fprintf(headerFile,"LastWriteAddress: 0x%02x\n", result);
    r = createMask(9,15);
    result = (r & wordsInPacket)>>9;
    fprintf(headerFile,"SCROD ID: 0x%03x\n", result);
    r = createMask(0,8);
    result = (r & wordsInPacket);
    fprintf(headerFile,"Converted Addr: 0x%03x\n", result);
}

main(int argc, char *argv[]){
    if(argc < 2){
	printf("You must enter a binary filename\n");
	goto INVALID_ARGS;
    }

    char headerName[80];
    char dataName[80];
    strcpy(headerName, "XRM_header_");
    strcat(headerName, argv[1]);
    strcat(headerName, ".txt");
    strcpy(dataName, "XRM_data_");
    strcat(dataName, argv[1]);
    strcat(dataName, ".txt");

    FILE *fileName = fopen(argv[1], "r");
    FILE *headerFile = fopen(headerName, "w");
    FILE *dataFile = fopen(dataName, "w");

    fputs("DATA FORMAT\n", headerFile);
    fputs("carrier# | ASIC# | Sample# | CH0 | CH1 | CH2 | CH3 | CH4 | CH5 | CH6 | CH7\n\n", headerFile);

    if(!fileName){
	printf("File doesn't exist\n");
	INVALID_ARGS:
	printf("Usage:\n");
	printf("XRMdataExtractor <binary file>\n");
	return;
    }
    
    unsigned int wordsInPacket, packet_hdr, result, r, num_windows, footer;
    int i = 0;
    int j = 0;
    int k = 0;

    initialize_data();

    printf("_________HEADER__________\n");

    while(!feof(fileName)){
	NEW_EVENT:
	fread(&packet_hdr, sizeof(packet_hdr),1,fileName);
	if(feof(fileName))
	    break;
	wordsInPacket = packet_hdr;
	if (mm < 3){
	    if (mm == 0){
		fprintf(headerFile,"Event size: %d\n", wordsInPacket);
	    }
	    if (mm == 1){
		r = createMask(28,31);
		result = (r & wordsInPacket)>>28;
		fprintf(headerFile,"Trig Pattern: 0x%01x\n", result);
		r = createMask(19,27);
		result = (r & wordsInPacket)>>19;
		num_windows = result+1;
		fprintf(headerFile,"# of windows: 0x%03x\n", result);
		r = createMask(0,18);
		result = r & wordsInPacket;
		fprintf(headerFile,"Timestamp: 0x%05x\n", result);
	    }
	    if (mm == 2){
		get_eventInfo(headerFile,wordsInPacket,mm,k);
	    }
	}
	else{
	    if((j < 8) && (i < 64)){
		r = createMask(0,11);
		result = (r & wordsInPacket);
		data_ch[j][i] = result;
		i++;
		r = createMask(16,27);
		result = (r & wordsInPacket)>>16;
		data_ch[j][i] = result;
		i++;
		    
	    }
	    else{
		if((j==7)){ //on to next event
		    j = 0;
		    i = 0;
		    k = k + 1;
		    fprint_data(dataFile);
		    if(k<4)
			get_eventInfo(headerFile,wordsInPacket,mm,k);
		    else{
			footer = wordsInPacket;
			printf("Footer %08x\n",footer);
			mm = 0;
			k = 0;
			goto NEW_EVENT;
		    }
		}
		else{//on to next channel (same event)
		    i = 0;
		    j++;
		    r = createMask(0,11);
		    result = (r & wordsInPacket);
		    data_ch[j][i] = result;
		    i++;
		    r = createMask(16,27);
		    result = (r & wordsInPacket)>>16;
		    data_ch[j][i] = result;
		    i++;
		}
	    }
	}
	mm++;
    }
    printf("\n");
}

  3   Tue May 3 08:11:06 2016 M. Andrewdocumentationwhat was done in January 2016

Here is a data dump of everything that happened on the asus laptop while getting the laste 2015 / early 2016 incarnation of the XRM tested before being delivered to KEK on the weekend of January 24th.  Everything was done in bash and the firmware only addressed one carrier at a time, so the purpose of this elog entry is simply to archive the information.

Attachment 1: howtogetdata.mza
gige2
cd ..
source setup_env_template.sh
cd ScriptsWithCarrierAddressing/
car=0
asic=3
FB=110
python ../scripts_mod/irsxSetCarrierOn_Cal.py $car 0
./set_all_thresholds.sh $car $asic 0
./set_all_thresholds.sh $car $asic 0
./setupAsic_CA.sh $car $asic $FB

rm data.bin myEvent_sub.txt ccc?
../bin/MyConvertData_fullArray data.bin pedfile_0.txt > myEvent_sub.txt 
./generate_all_channels.sh 
vim ccc7
gnuplot 

Attachment 2: 2016-01-24.XRM-history
  375  ls -lart data
  376  ls -lart data
  377  ls -lart data.first-board-stack/
  378  ls -lart data.first-board-stack/
  379  ls -lart data
  380  ls -lart data
  381  ls -lart data
  382  ls -lart data
  383  ls -lart data
  384  ls -lart data
  385  ls -lart data
  386  gnuplot ~/bin/mza.gnuplot 
  387  ls -lart data
  388  gnuplot ~/bin/mza.gnuplot 
  389  ls -lart data
  390  gnuplot ~/bin/mza.gnuplot 
  391  vim data/carrier0.asic1.pedestals 
  392  ls -lart data
  393  gnuplot ~/bin/mza.gnuplot 
  394  less data/carrier0.asic3.pedestals 
  395  less data/carrier0.asic2.pedestals 
  396  ls -lart data
  397  rm data/carrier1.asic3.pedestals data/carrier0.asic0.pedestals 
  398  ls -lart data
  399  gnuplot ~/bin/mza.gnuplot 
  400  gnuplot ~/bin/mza.gnuplot 
  401  gnuplot ~/bin/mza.gnuplot 
  402  gnuplot ~/bin/mza.gnuplot 
  403  mv data data.after-getting-the-script-to-work
  404  mkdir data
  405  cd data
  406  ls -lart
  407  rm carrier0.asic0.pedestals 
  408  ls -lart
  409  ls -lart
  410  ls -lart
  411  ls -lart ../data.after-getting-the-script-to-work/
  412  ls -lart
  413  ls -lart
  414  ls -lart
  415  ls -lart
  416  ls -lart
  417  ls -lart
  418  ls -lart
  419  ls -lart
  420  ls -lart
  421  ls -lart
  422  cd ..
  423  gnuplot ~/bin/mza.gnuplot 
  424  ls -lart
  425  ls -lart data
  426  ls -lart data
  427  ls -lart data
  428  gnuplot ~/bin/mza.gnuplot 
  429  mv data data.after-fixing-some-shorts
  430  mkdir data
  431  cd data
  432  ls
  433  ls -lart
  434  rm *
  435  ls -lart
  436  ls -lart
  437  ls -lart
  438  cd ..
  439  gnuplot ~/bin/mza.gnuplot 
  440  ssh --help
  441  20start
  442  fpga2
  443  arp
  444  vim ~/.bashrc
  445  . ~/.bashrc
  446  arp
  447  arp
  448  cd ../build/uh-svn-repo/trunk/
  449  svn update
  450  ls
  451  cd ../branches/gigE/
  452  cat program-bit-and-elf-and-go
  453  head program-bit-and-elf-and-go.xmd.tcl 
  454  grep freq program-bit-and-elf-and-go.xmd.tcl 
  455  gige2
  456  ls data -lart
  457  cd ~/build/uh-svn-repo
  458  svn update --revision 1041
  459  svn status
  460  svn diff branches/gigE/program-bit-and-elf-and-go.xmd.tcl 
  461  cd ..
  462  rm -rf uh-svn-repo
  463  vim checkout 
  464  ./checkout 
  465  cd uh-svn-repo/trunk/software/PS7/CarrierRevE/
  466  cd s
  467  cd src/
  468  vim CarrierRevE_main.c 
  469  vim CarrierRevE_main.c 
  470  svn dif
  471  svn diff
  472  cd ..
  473  cd ..
  474  cd ..
  475  cd ..
  476  cd firmware
  477  mkdir build
  478  cd targets/ScrodRevB_b2tt
  479  make sdk_gui
  480  make sdk
  481  make
  482  ls -lart
  483  ssh xtd2
  484  ssh xtd2
  485  vim ~/.ssh/config
  486  ssh xtd2
  487  vim ~/.ssh/config
  488  vim ~/.ssh/config
  489  ssh xtd2
  490  vim ~/.ssh/config
  491  ssh xtd2
  492  ssh xtd2
  493  ssh xtd2
  494  ssh xtd2
  495  cd build/
  496  vim checkout 
  497  ./checkout 
  498  cd uh-svn-repo.1143/trunk/software/PS7/Scrod/src/
  499  vim main.c 
  500  ls -lart
  501  du LaserBranch/
  502  tar cf 2016-01-24.XRM.tar bin/mza.gnuplot bin/grab_all_peds LaserBranch/
  503  ls -lart
  504  du LaserBranch/
  505  du --ma=1 LaserBranch/
  506  du --ma=1 LaserBranch/software/
  507  du --ma=1 LaserBranch/software/gigE/
  508  du --ma=1 LaserBranch/software/gigE/ScriptsWithCarrierAddressing/
  509  rm 2016-01-24.XRM.tar 
  510  tar cf 2016-01-24.XRM.tar bin/mza.gnuplot bin/grab_all_peds LaserBranch/
  511  ls -lart
  512  du --ma=1 LaserBranch/software/gigE/ScriptsWithCarrierAddressing/
  513  ls -larS LaserBranch/software/gigE/ScriptsWithCarrierAddressing/
  514  mkdir ~/data/XRM/ccc
  515  mv ccc* ~/data/XRM/ccc/
  516  cd LaserBranch/software/gigE/ScriptsWithCarrierAddressing/
  517  mv ccc* ~/data/XRM/ccc/
  518  ls -larS
  519  mv myEvent_sub.txt myData_2000.bin sine_2000.bin myDat_2000.bin ~/data/XRM/ccc/
  520  ls -larS
  521  cd ..
  522  du
  523  ls -larS
  524  du --ma=1
  525  cd ScriptsWithCarrierAddressing/
  526  du
  527  mv powerDisCon/ firstRF/ pwrSigDisCon/ ~/data/XRM/ccc/
  528  ls -larS
  529  du
  530  cd ..
  531  cd ..
  532  du
  533  cd ..
  534  du bitfiles/
  535  cd bitfiles/
  536  mkdir ~/bitfiles
  537  ls -lart
  538  head ../program-bit-and-elf-and-go.xmd.tcl 
  539  head ../program-bit-and-elf-and-go.xmd.tcl  -n 20
  540  ls -lart
  541  ls -lart
  542  du
  543  cd ..
  544  du
  545  cd ..
  546  rm 2016-01-24.XRM.tar 
  547  history | grep tar
  548  tar cf 2016-01-24.XRM.tar bin/mza.gnuplot bin/grab_all_peds LaserBranch/
  549  ls -lart
  550  cd LaserBranch/
  551  find | grep elf$
  552  cd ps_files/
  553  du
  554  cd
  555  scp 2016-01-24.XRM.tar idlab:
  556  rm 2016-01-24.XRM.tar 
  557  tar cf 2016-01-24.XRM.tar bin/mza.gnuplot bin/grab_all_peds LaserBranch/ howtogetdata.txt 
  558  scp 2016-01-24.XRM.tar idlab:
  559  find /opt/Xilinx/SDK/ | grep settings64
  560  rm 2016-01-24.XRM.tar 
  561  tar cf 2016-01-24.XRM.tar bin/mza.gnuplot bin/grab_all_peds LaserBranch/ howtogetdata.txt 
  562  scp 2016-01-24.XRM.tar idlab:
  563  fpga2
  564  gige2
  565  ls myDat_2000.bin 
  566  ls -lart
  567  ls -lart
  568  ls -lart
  569  less myDat_2000.bin 
  570  less myDat_2000.bin 
  571  ls -lart
  572  rm myDat_2000.bin 
  573  ls -lart
  574  ls -lart
  575  ls -lart
  576  ls -lart
  577  ls -lart
  578  ls -lart
  579  ls -lart
  580  ls -lart
  581  ls -lart
  582  cat howtogetdata.txt 
  583  grab_all_peds 
  584  cd data
  585  ls
  586  ls -lart
  587  cd ..
  588  mv data data.junk
  589  vim ~/bin/grab_all_peds 
  590  mkdir ~/data/XRM
  591  mkdir ~/data/XRM/data
  592  vim ~/bin/grab_all_peds 
  593  mv data.junk/ data.boardstack-installed-in-box/ ~/data/XRM/
  594  du
  595  grab_all_peds 
  596  grab_all_peds 
  597  ls -lart
  598  ls -lart
  599  ls -lart ~/data/XRM/data
  600  ls -lart
  601  ls -lart
  602  ls -lart
  603  ../bin/MyConvertData_fullArray data.bin pedfile_0.txt > myEvent_sub.txt
  604  ./generate_all_channels.sh 
  605  ls -lart
  606  gnuplot 
  607  less ccc0
  608  less myPed_2000.bin 
  609  vim ../bin/MyConvertData_fullArray
  610  less data.bin 
  611  hexdump data.bin | less
  612  cp ~/data/XRM/data/carrier0.asic3.pedestals peds
  613  ../bin/MyConvertData_fullArray data.bin peds > myEvent_sub.txt 
  614  ./generate_all_channels.sh 
  615  ls -lart
  616  gnuplot 
  617  less ccc7
  618  gnuplot 
  619  less ccc7
  620  gnuplot 
  621  less ccc7
  622  vim ccc7
  623  gnuplot 
  624  vim ccc6
  625  vim ccc5
  626  vim ccc6
  627  mv data.txt data7.txt
  628  gnuplot 
  629  vim ccc5
  630  gnuplot 
  631  cd ~/data/XRM/data
  632  ls -lart
  633  cd ../ccc/
  634  ls -lart
  635  gnuplot 
  636  cd -
  637  ls -lart
  638  cd -
  639  gige@
  640  gige2
  641  ls
  642  cat ~/bin/grab_all_peds 
  643  source setup_env_template.sh
  644  cd ..
  645  source setup_env_template.sh
  646  cat ~/bin/grab_all_peds 
  647  cd ScriptsWithCarrierAddressing/
  648  car=0
  649  asic=3
  650  FB=110
  651  python ../scripts_mod/irsxSetCarrierOn_Cal.py $car 0
  652  ./set_all_thresholds.sh $car $asic 0
  653  ./set_all_thresholds.sh $car $asic 0
  654  ./setupAsic_CA.sh $car $asic $FB
  655  ls -lart
  656  ../bin/MyConvertData_fullArray data.bin pedfile_0.txto > myEvent_sub.txt 
  657  ../bin/MyConvertData_fullArray data.bin pedfile_0.txt > myEvent_sub.txt 
  658  ./generate_all_channels.sh generate_all_channels.sh 
  659  ./generate_all_channels.sh 
  660  ls -lart
  661  gnuplot 
  662  gnuplot 
  663  mv ccc6 ccc6.sine
  664  mv ccc7 ccc7.sine
  665  history 
  666  ../bin/MyConvertData_fullArray data.bin pedfile_0.txt > myEvent_sub.txt 
  667  ./generate_all_channels.sh 
  668  ls -lart
  669  gnuplot 
  670  ls -lart
  671  rm data.bin 
  672  rm ccc?
  673  ls -lart
  674  rm myEvent_sub.txt 
... 201 more lines ...
Attachment 3: 2016-01-24.XRM-code-chanes.patch
Index: CarrierRevE/images/CarrierRevE_PS_app_E0000001.elf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: CarrierRevE/src/CarrierRevE.h
===================================================================
--- CarrierRevE/src/CarrierRevE.h	(revision 1143)
+++ CarrierRevE/src/CarrierRevE.h	(working copy)
@@ -13,6 +13,10 @@
 #define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
 
 //#define CLK_FAN_RST_N_PIN 48
+#define XRM_ARP_SELECT_ST1 16 // gain stage 1
+#define XRM_ARP_SELECT_ST2 19 // gain stage 2
+#define XRM_ARP_SELECT_ST3 18 // gain stage 3
+#define XRM_ARP_SELECT_ST4 43 // attenuator
 #define SPI_CLOCK0_PIN    16 //MIO16 FOR SPI CLOCK
 #define SPI_MOSI0_PIN    21 //MIO17 FOR SPI MOSI
 #define SPI_CS0_PIN        18 //MIO18 FOR SPI CS0 (fanout clock)
Index: CarrierRevE/src/CarrierRevE_main.c
===================================================================
--- CarrierRevE/src/CarrierRevE_main.c	(revision 1143)
+++ CarrierRevE/src/CarrierRevE_main.c	(working copy)
@@ -83,10 +83,10 @@
       //bool temperatureAlert = regThermStatus & 0x1;
       
       // Debug pins
-      XGpioPs_WritePin(&Gpio, 46, (carrierId & 0x1) >> 0);
-      XGpioPs_WritePin(&Gpio, 47, (carrierId & 0x2) >> 1);
-      XGpioPs_WritePin(&Gpio, 48, (carrierId & 0x4) >> 2);
-      XGpioPs_WritePin(&Gpio, 49, (carrierId & 0x8) >> 3);
+      //XGpioPs_WritePin(&Gpio, 46, (carrierId & 0x1) >> 0);
+      //XGpioPs_WritePin(&Gpio, 47, (carrierId & 0x2) >> 1);
+      //XGpioPs_WritePin(&Gpio, 48, (carrierId & 0x4) >> 2);
+      //XGpioPs_WritePin(&Gpio, 49, (carrierId & 0x8) >> 3);
       // Check control signals in from PL
       // If they've changed then write out new values to devices
       u32 AsicRegEnNew = Xil_In32(AXI_ASIC_REG_EN_ADDR);
@@ -163,17 +163,23 @@
 
 /***********************FUNCTION DEFINITIONS*****************************/
 void GPIO_init(u16 DeviceId){
-
     XGpioPs_Config *ConfigPtr;
-
     //Initialize the GPIO driver.
     ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
     XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
-
 }
 
 void GPIO_pins(void){
+    XGpioPs_SetDirectionPin(&Gpio,    XRM_ARP_SELECT_ST1, 1); // set as output direction
+    XGpioPs_SetOutputEnablePin(&Gpio, XRM_ARP_SELECT_ST1, 1); // enables the output driver
+    XGpioPs_SetDirectionPin(&Gpio,    XRM_ARP_SELECT_ST2, 1); // set as output direction
+    XGpioPs_SetOutputEnablePin(&Gpio, XRM_ARP_SELECT_ST2, 1); // enables the output driver
+    XGpioPs_SetDirectionPin(&Gpio,    XRM_ARP_SELECT_ST3, 1); // set as output direction
+    XGpioPs_SetOutputEnablePin(&Gpio, XRM_ARP_SELECT_ST3, 1); // enables the output driver
+    XGpioPs_SetDirectionPin(&Gpio,    XRM_ARP_SELECT_ST4, 1); // set as output direction
+    XGpioPs_SetOutputEnablePin(&Gpio, XRM_ARP_SELECT_ST4, 1); // enables the output driver
 
+
     XGpioPs_SetDirectionPin(&Gpio, SPI_CLOCK0_PIN, 1); //set SPI0 as output direction
     XGpioPs_SetOutputEnablePin(&Gpio, SPI_CLOCK0_PIN, 1); //enables the output for the SPI0
     XGpioPs_SetDirectionPin(&Gpio, SPI_MOSI0_PIN, 1); //set MOSI as output direction
@@ -193,6 +199,7 @@
     XGpioPs_SetDirectionPin(&Gpio, 51, 0);
     XGpioPs_SetOutputEnablePin(&Gpio, 51, 0);
 
+/*
     //Debugging (using JTAG as GPIO)
     XGpioPs_SetDirectionPin(&Gpio, 46, 1);
     XGpioPs_SetOutputEnablePin(&Gpio, 46, 1);
@@ -202,6 +209,7 @@
     XGpioPs_SetOutputEnablePin(&Gpio, 48, 1);
     XGpioPs_SetDirectionPin(&Gpio, 49, 1);
     XGpioPs_SetOutputEnablePin(&Gpio, 49, 1);
+*/
 
     //Set direction and output enables for ASIC amp enables
     XGpioPs_SetDirectionPin(&Gpio, AMP_ASIC0_PIN, 1);
@@ -280,6 +288,11 @@
 void GPIO_defaults(void){
 	int cal_channel = 0;
 
+    XGpioPs_WritePin(&Gpio, XRM_ARP_SELECT_ST1, 0x0);
+    XGpioPs_WritePin(&Gpio, XRM_ARP_SELECT_ST2, 0x0);
+    XGpioPs_WritePin(&Gpio, XRM_ARP_SELECT_ST3, 0x0);
+    XGpioPs_WritePin(&Gpio, XRM_ARP_SELECT_ST4, 0x0);
+
     // Leave these disabed by default
     AMP_ASIC1_LO;
     AMP_ASIC2_LO;
Index: Scrod/src/main.c
===================================================================
--- Scrod/src/main.c	(revision 1143)
+++ Scrod/src/main.c	(working copy)
@@ -11,9 +11,15 @@
 #include "feature_extraction.h"
 #include "PL_AXI_REG.h"
 #include "i2c.h"
+#include "xgpiops.h" //PS GPIO
+#include "xil_io.h"
 
 #define RAW_DATAFORMAT_CARRIER 1 	// assumes carrier format for raw data
 
+#define XRM_ARP_SELECT_ST1 16 // gain stage 1
+#define XRM_ARP_SELECT_ST2 19 // gain stage 2
+#define XRM_ARP_SELECT_ST3 18 // gain stage 3
+#define XRM_ARP_SELECT_ST4 43 // attenuator
 
 #ifdef RAW_DATAFORMAT_CARRIER
 
@@ -28,8 +34,18 @@
 int dataTransferOn = 0;
 #define WAVE_BUFFER_SIZE 600  // Needs to stay below 6-7 MB
 
+#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
+XGpioPs Gpio; //driver instance for GPIO device
+
+/***********************FUNCTION DEFINITIONS*****************************/
+void GPIO_init(u16 DeviceId){
+    XGpioPs_Config *ConfigPtr;
+    //Initialize the GPIO driver.
+    ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
+    XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
+}
+
 int main() {
-
     u32 returnval;
     volatile u32 featureExtractionMode;
 
@@ -38,6 +54,24 @@
     init_platform();
     print("Hello World\n\r");
 
+    GPIO_init(GPIO_DEVICE_ID);
+    //GPIO_pins();
+    //GPIO_defaults();
+
+    XGpioPs_SetDirectionPin(&Gpio,    XRM_ARP_SELECT_ST1, 1); // set as output direction
+    XGpioPs_SetOutputEnablePin(&Gpio, XRM_ARP_SELECT_ST1, 1); // enables the output driver
+    XGpioPs_SetDirectionPin(&Gpio,    XRM_ARP_SELECT_ST2, 1); // set as output direction
+    XGpioPs_SetOutputEnablePin(&Gpio, XRM_ARP_SELECT_ST2, 1); // enables the output driver
+    XGpioPs_SetDirectionPin(&Gpio,    XRM_ARP_SELECT_ST3, 1); // set as output direction
+    XGpioPs_SetOutputEnablePin(&Gpio, XRM_ARP_SELECT_ST3, 1); // enables the output driver
+    XGpioPs_SetDirectionPin(&Gpio,    XRM_ARP_SELECT_ST4, 1); // set as output direction
+    XGpioPs_SetOutputEnablePin(&Gpio, XRM_ARP_SELECT_ST4, 1); // enables the output driver
+ 
+    XGpioPs_WritePin(&Gpio, XRM_ARP_SELECT_ST1, 0x0);
+    XGpioPs_WritePin(&Gpio, XRM_ARP_SELECT_ST2, 0x0);
+    XGpioPs_WritePin(&Gpio, XRM_ARP_SELECT_ST3, 0x0);
+    XGpioPs_WritePin(&Gpio, XRM_ARP_SELECT_ST4, 0x0);
+
     // Circular Waveform Buffer Init
     RawWaveformCarrier_t *g_waveBuffer = (RawWaveformCarrier_t*) memalign(4096,sizeof(RawWaveformCarrier_t) * WAVE_BUFFER_SIZE); // compiler has issues with large static arrays (~8MB), so dynamically just to be safe
     if(g_waveBuffer == NULL){
Attachment 4: XRM-fpga2-alias-output
****** Xilinx Microprocessor Debugger (XMD) EngineExecuting user script : program-bit-and-elf-and-go.xmd.tcl
last device in programming chain is number 2 
It appears that you have 0 carriers connected.

****** XMD v2014.4
  **** SW Build 1071353 on Tue Nov 18 16:34:53 MST 2014
    ** Copyright 1986-2014 Xilinx, Inc. All Rights Reserved.

Configuring Device 2 (xc7z045) with Bitstream -- bitfiles/ScrodRevB_b2tt_gigE_B000000E.bit
....................10...................20...................30....................40...................50...................60....................70...................80...................90....................Done
Successfully downloaded bit file.

JTAG chain configuration
--------------------------------------------------
Device   ID Code        IR Length    Part Name
 1       4ba00477           4        arm_dap
 2       23731093           6        xc7z045

Processor Reset .... DONE
Downloading Program -- ps_files/Scrod_PS_app_B0000007.elf
	section, .text: 0x00100000-0x00106c97
	section, .init: 0x00106c98-0x00106caf
	section, .fini: 0x00106cb0-0x00106cc7
	section, .rodata: 0x00106cc8-0x00106e83
	section, .data: 0x00106e88-0x00107abb
	section, .eh_frame: 0x00107abc-0x00107abf
	section, .mmu_tbl: 0x00108000-0x0010bfff
	section, .init_array: 0x0010c000-0x0010c007
	section, .fini_array: 0x0010c008-0x0010c00b
	section, .bss: 0x0010c00c-0x0010c0cf
	section, .heap: 0x0010c0d0-0x0110c0cf
	section, .stack: 0x0110c0d0-0x0112d8cf
Download Progress..10.20.30.40.50.60.70.80.90.Done
Setting PC with Program Start Address 0x00100000

RUNNING> Processor started. Type "stop" to stop processor
Attachment 5: grab_all_peds
#!/bin/bash -e
# 2016-01-23 mza for XRM

declare destination="${HOME}/data/XRM/data"

#. ${HOME}/.bashrc
cd /home/idlab/LaserBranch/software/gigE/
source setup_env_template.sh
cd ScriptsWithCarrierAddressing
#gige2
car=0
asic=1
FB=110

#for car in $(seq 0 2); do
#	for asic in $(seq 0 3); do
		filename="${destination}/carrier${car}.asic${asic}.pedestals"
		echo -n "${filename}"
		if [ -e "${filename}" ]; then
			echo " - found"
			continue
		else
			#touch "${filename}"
			echo
		fi
		python ../scripts_mod/irsxSetCarrierOn_Cal.py $car 0
		./set_all_thresholds.sh $car $asic 0
		./set_all_thresholds.sh $car $asic 0
		./setupAsic_CA.sh $car $asic $FB
		mv pedfile_RMS_0.txt "${filename}"
		ls -lart "${filename}"
#	done
#done

Attachment 6: mza.gnuplot
# 2016-01-23 mza for XRM

plot "data/carrier0.asic0.pedestals" using ($0):($4)
pause -1
plot "data/carrier0.asic1.pedestals" using ($0):($4)
pause -1
plot "data/carrier0.asic2.pedestals" using ($0):($4)
pause -1
plot "data/carrier0.asic3.pedestals" using ($0):($4)
pause -1

plot "data/carrier1.asic0.pedestals" using ($0):($4)
pause -1
plot "data/carrier1.asic1.pedestals" using ($0):($4)
pause -1
plot "data/carrier1.asic2.pedestals" using ($0):($4)
pause -1
plot "data/carrier1.asic3.pedestals" using ($0):($4)
pause -1

plot "data/carrier2.asic0.pedestals" using ($0):($4)
pause -1
plot "data/carrier2.asic1.pedestals" using ($0):($4)
pause -1
plot "data/carrier2.asic2.pedestals" using ($0):($4)
pause -1
plot "data/carrier2.asic3.pedestals" using ($0):($4)
pause -1

Attachment 7: IMG_1025.JPG
IMG_1025.JPG
Attachment 8: IMG_1027.JPG
IMG_1027.JPG
Attachment 9: IMG_1028.JPG
IMG_1028.JPG
Attachment 10: 2016-01-24.LASER5.png
2016-01-24.LASER5.png
Attachment 11: 2016-01-24.LASER.png
2016-01-24.LASER.png
Attachment 12: 2016-01-24.LASER14.png
2016-01-24.LASER14.png
Attachment 13: 2016-01-24.LASER13.png
2016-01-24.LASER13.png
Attachment 14: 2016-01-24.LASER12.png
2016-01-24.LASER12.png
Attachment 15: 2016-01-24.LASER11.png
2016-01-24.LASER11.png
Attachment 16: 2016-01-24.LASER9.png
2016-01-24.LASER9.png
Attachment 17: program-bit-and-elf-and-go.xmd.tcl
# Set for local JTAG access
# Modify for remote access via hw_server or vcse_server
set TCP "127.0.0.1:3121"
#set freq 3000000
set freq 10000000
#set TCP "ppa-linuxtest3.slac.stanford.edu:3121"

# Set current version numbers of firmware
set SCROD_FW_VERSION    "B000000E"
#set SCROD_FW_VERSION    "B0000009"
#Laser Test Golden File below!!!
set CARRIER_FW_VERSION  "E000000B"
#Lynn's speedup improvements
#set CARRIER_FW_VERSION  "E000000C_3"
#set CARRIER_FW_VERSION  "E0000008"
# Set current version numbers of elf files
#set SCROD_ELF_VERSION   "B0000003"
set SCROD_ELF_VERSION   "B0000007"
#set CARRIER_ELF_VERSION "E0000000"
set CARRIER_ELF_VERSION "E0000001"

# Devices on the chain should enumerate as:
#
#JTAG chain configuration
#--------------------------------------------------
#Device   ID Code        IR Length    Part Name
# 1       4ba00477           4        arm_dap
# 2       23731093           6        xc7z045
# 3       4ba00477           4        arm_dap
# 4       1372c093           6        xc7z030
# ...
# 9       4ba00477           4        arm_dap
# 10      1372c093           6        xc7z030
#

# Scan the device chain to see how many carriers we have
set deviceChain [readjtagchain -cable url TCP:$TCP]
set lastDevice [string range $deviceChain [string last devicenr $deviceChain]+9 [string last devicenr $deviceChain]+10]
puts "last device in programming chain is number $lastDevice"
set nCarriers [expr ($lastDevice-2)/2]
puts "It appears that you have $nCarriers carriers connected."

# Program bit files
fpga -f bitfiles/ScrodRevB_b2tt_gigE_${SCROD_FW_VERSION}.bit -debugdevice deviceNr 2 -cable type xilinx_tcf url TCP:$TCP frequency $freq
for {set i 4} {$i <= $lastDevice} {incr i 2} {
#Lynn's speedup improvements
#   fpga -f bitfiles/CarrierRevE_${CARRIER_FW_VERSION}.bit -debugdevice deviceNr $i -cable url TCP:$TCP frequency $freq
#   fpga -f bitfiles/CarrierRevE_newGUI_PS_LaserTest_debug.bit -debugdevice deviceNr $i -cable url TCP:$TCP  frequency $freq
#Laser Test Golden File below!!!
   fpga -f bitfiles/CarrierRevE_newGUI_PS_LaserTest_nodebug.bit -debugdevice deviceNr $i -cable type xilinx_tcf url TCP:$TCP frequency $freq
}

# Program PS for SCROD
xload hw bitfiles/ScrodRevB_b2tt_gigE_${SCROD_FW_VERSION}.hdf
source bitfiles/ps7_init_SCROD.tcl
xconnect arm hw -cable type xilinx_tcf url TCP:$TCP frequency $freq -debugdevice devicenr 1 cpunr 1
set_cur_target 64
set_cur_system
xzynqresetstatus 64
ps7_init
ps7_post_config
xclearzynqresetstatus 64
xreset 64 0x80
dow ps_files/Scrod_PS_app_${SCROD_ELF_VERSION}.elf
xsafemode 64 off
con

# Program PS for carriers
for {set i 3} {$i < $lastDevice} {incr i 2} {
#Lynn's speedup improvements
#   xload hw bitfiles/CarrierRevE_${CARRIER_FW_VERSION}.hdf
#Laser Test Golden File below!!!
   xload hw bitfiles/CarrierRevE_newGUI_PS_LaserTest_debug.hdf 
   source bitfiles/ps7_init_CARRIER.tcl
   xconnect arm hw -cable type xilinx_tcf url TCP:$TCP frequency $freq -debugdevice devicenr $i cpunr 1
   set_cur_target 64
   set_cur_system
   xzynqresetstatus 64
   ps7_init
   ps7_post_config
   xclearzynqresetstatus 64
   xreset 64 0x80
   dow ps_files/CarrierRevE_PS_app_${CARRIER_ELF_VERSION}.elf
   xsafemode 64 off
   con
}

Attachment 18: setup_env_template.sh
#!/bin/bash -e
# written 2014-12-30 by mza
# last updated 2014-12-30

declare scriptdir=$(dirname "$BASH_SOURCE")
cd "${scriptdir}"
scriptdir="$(pwd -P)"
cd - >/dev/null

# Moved this script to a local dir
#declare otherscriptdir="${scriptdir}/../../../tags/2015-01.gigE-carrier-pre-screen"
. "detect_linux_variant" >/dev/null

function delete_boogers {
	local string="${1}"
	string=$(echo "${string}" | sed -e "s,^:,,")
	string=$(echo "${string}" | sed -e "s,:$,,")
	string=$(echo "${string}" | sed -e "s,::,:,g")
	echo ${string}
}

function delete_repeats {
	string=$(echo "${1}" | sed -e "s,:, ,g")
	#echo ${string}
	newstring=$( (for each in ${string}; do echo "${each}"; done; ) | sort -u)
	newstring=$(echo $(echo "${newstring}") | sed -e "s, ,:,g")
	echo ${newstring}
}

declare -i errors=0
declare BASE QTDIR PYTHONPATH

BASE="${PWD}"

if [ "$OS" = "Ubuntu" ]; then
	if   [ ${BITS} -eq 32 ] && [ -e "/usr/lib/i386-linux-gnu/qt4" ]; then
		QTDIR="/usr/lib/i386-linux-gnu/qt4"
	elif [ ${BITS} -eq 64 ] && [ -e "/usr/lib/x86_64-linux-gnu/qt4" ]; then
		QTDIR="/usr/lib/x86_64-linux-gnu/qt4"
	fi
elif [ "$OS" = "Linux" ]; then
	if   [ ${BITS} -eq 32 ] && [ -e "/usr/lib/qt4" ]; then
		QTDIR="/usr/lib/qt4"
	elif [ ${BITS} -eq 32 ] && [ -e "/usr/lib/i386-linux-gnu/qt4" ]; then
		QTDIR="/usr/lib/i386-linux-gnu/qt4"
	elif [ ${BITS} -eq 64 ] && [ -e "/usr/lib64/qt4" ]; then
		QTDIR="/usr/lib64/qt4"
	elif [ -e "/usr/local/Trolltech/Qt-4.6.4" ]; then
		QTDIR="/usr/local/Trolltech/Qt-4.6.4"
	elif [ -e "/usr/local/Trolltech/Qt-4.4.3" ]; then
		QTDIR="/usr/local/Trolltech/Qt-4.4.3"
	elif [ -e "/usr/local/Trolltech/Qt-4.8.5" ]; then
		QTDIR="/usr/local/Trolltech/Qt-4.8.5"
	fi
else
	:
fi
#for each in "/usr/lib/qt4" "/usr/lib64/qt4" "/usr/lib/x86_64-linux-gnu/qt4" "/usr/lib/i386-linux-gnu/qt4"; do
if [ -z "${QTDIR}" ] || [ ! -e "${QTDIR}/bin/qmake" ]; then echo "error:  is libqt4-dev installed?" > /dev/stderr; errors=$((errors+1)); fi
#  || [ ! -e "${QTDIR}/lib" ]

#PATH="${QTDIR}/bin:${PATH}"
PATH="${BASE}/bin:${QTDIR}/bin:${PATH}"
#export PATH="${ROOTSYS}/bin:${PATH}"
PATH=$(delete_repeats ${PATH})
PATH=$(delete_boogers ${PATH})

PYTHONPATH="${BASE}/python/lib/python"
#PYTHONPATH="${BASE}/python/lib64/python"

# a xilinx-related entry in the original LD_LIBRARY_PATH causes problems with the QT build
if [ "$OS" = "Ubuntu" ]; then
	if   [ ${BITS} -eq 32 ] && [ -e "/usr/lib/i386-linux-gnu" ]; then
		LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu"
	elif [ ${BITS} -eq 64 ] && [ -e "/usr/lib/x86_64-linux-gnu" ]; then
		LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu"
	fi
elif [ "$OS" = "Linux" ]; then
	if [ ${BITS} -eq 32 ]; then
		LD_LIBRARY_PATH="/usr/lib:${QTDIR}/lib"
	else
		LD_LIBRARY_PATH="/usr/lib64:${QTDIR}/lib"
	fi
elif [ "${OS:0:6}" = "CYGWIN" ]; then
	LD_LIBRARY_PATH="/lib:${QTDIR}/lib:${LD_LIBRARY_PATH}"
else
	:
fi
#for each in "/lib" "/usr/lib" "/lib64" "/usr/lib64" "/usr/lib/x86_64" "/usr/lib/i386-linux-gnu" "/lib/i386-linux-gnu"; do
#export setenv LD_LIBRARY_PATH="${ROOTSYS}/lib:${LD_LIBRARY_PATH}"
LD_LIBRARY_PATH=$(delete_repeats ${LD_LIBRARY_PATH})
LD_LIBRARY_PATH=$(delete_boogers ${LD_LIBRARY_PATH})
echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}"

function check_for {
	#cygwin is /lib/libxml2.dll.a
	if [ "${OS:0:6}" = "CYGWIN" ]; then
		suffix="dll.a"
		name="$1.$suffix"
	else
		suffix="so"
		name="$1.$suffix"
	fi
	#echo $name
	installable=$2
	string=$(echo "${LD_LIBRARY_PATH}" | sed -e "s,:, ,g")
	#lib=$(find ${string} 2>/dev/null | grep ${name} | grep $suffix$ | head -n 1)
	#echo "${string}"
	lib=$(find ${string} 2>/dev/null | grep ${name})
	if [ ! -z "${lib}" ]; then
		libdir=$(dirname "${lib}")
		if [ -z "${libdir}" ]; then echo "error:  is ${installable} installed?" > /dev/stderr; errors=$((errors+1)); fi
	else
		echo "error:  is ${installable} installed?" > /dev/stderr
		errors=$((errors+1))
	fi
}

check_for "libxml2" "libxml2-dev" 
check_for "libbz2"  "libbz2-dev" 
check_for "libz"    "libz"
#echo "as root, do the following if not already done:"
#echo "cd /lib/i386-linux-gnu"
#echo "ln -s libz.so.1 libz.so"

#echo "BASE ${BASE}"
#echo "PYTHONPATH ${PYTHONPATH}"
echo "           PATH=${PATH}"            | tee    ${scriptdir}/makeenv
echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" | tee -a ${scriptdir}/makeenv
echo "          QTDIR=${QTDIR}"           | tee -a ${scriptdir}/makeenv
echo                                      | tee -a ${scriptdir}/makeenv

export BASE QTDIR PYTHONPATH PATH LD_LIBRARY_PATH

if [ ${errors} -ne 0 ]; then
	(echo; echo "errors encountered"; echo;) > /dev/stderr
	# this trick from http://stackoverflow.com/questions/2683279/how-to-detect-if-a-script-is-being-sourced :
	return 2>/dev/null || exit 17
fi

Attachment 19: XRM.bashrc
# System-wide .bashrc file for interactive bash(1) shells.

# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default.
# If this is an xterm set the title to user@host:dir
#case "$TERM" in
#xterm*|rxvt*)
#    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
#    ;;
#*)
#    ;;
#esac

# enable bash completion in interactive shells
#if ! shopt -oq posix; then
#  if [ -f /usr/share/bash-completion/bash_completion ]; then
#    . /usr/share/bash-completion/bash_completion
#  elif [ -f /etc/bash_completion ]; then
#    . /etc/bash_completion
#  fi
#fi

# sudo hint
if [ ! -e "$HOME/.sudo_as_admin_successful" ] && [ ! -e "$HOME/.hushlogin" ] ; then
    case " $(groups) " in *\ admin\ *)
    if [ -x /usr/bin/sudo ]; then
	cat <<-EOF
	To run a command as administrator (user "root"), use "sudo <command>".
	See "man sudo_root" for details.
	
	EOF
    fi
    esac
fi

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
	function command_not_found_handle {
	        # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
		   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
		   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
		else
		   printf "%s: command not found\n" "$1" >&2
		   return 127
		fi
	}
fi


export XILINXD_LICENSE_FILE="${HOME}/Xilinx.lic"

. /opt/Xilinx/Vivado/2014.4/settings64.sh
. /opt/Xilinx/SDK/2014.4/settings64.sh

export targetIP="192.168.10.61"
#export targetIP="192.168.10.82"
#export targetIP="192.168.10.101"
alias gige="cd ${HOME}/build/uh-svn-repo/branches/gigE/software/gigE/"
#alias spi="cd ${HOME}/build/uh-svn-repo/branches/gigE/firmware/targets/CarrierPSCheckNew/CarrierPSCheckNew.sdk/spiTest"
alias fpga="cd ${HOME}/build/uh-svn-repo/branches/gigE; xmd -tcl program-bit-and-elf-and-go.xmd.tcl"
#alias xil_pp="cd ${HOME}/build/uh-svn-repo/branches/gigE/firmware/targets/CarrierPSCheckNew; vivado CarrierPSCheckNew.xpr"
alias develTest="cd ${HOME}/build/uh-svn-repo/branches/gigE/software/gigE; . setup_env_template.sh; ./bin/develTest "'${targetIP}'
alias max="cd ${HOME}/build/uh-svn-repo/branches/gigE/software/gigE; . setup_env_template.sh; python ${HOME}/build/uh-svn-repo/branches/gigE/software/gigE/scripts/max_power.py"
alias min="cd ${HOME}/build/uh-svn-repo/branches/gigE/software/gigE; . setup_env_template.sh; python ${HOME}/build/uh-svn-repo/branches/gigE/software/gigE/scripts/min_power.py"
alias amp="cd ${HOME}/build/uh-svn-repo/branches/gigE/software/gigE; . setup_env_template.sh; python ${HOME}/build/uh-svn-repo/branches/gigE/software/gigE/scripts/amps_powered_but_disabled.py"
alias arp="arping -I eth4 "'${targetIP}'

alias develTest2="cd /home/idlab/LaserBranch/software/gigE/; source setup_env_template.sh; bin/develTest 192.168.10.61"
#alias develTest2="cd /home/idlab/LaserBranch/software/gigE/; source setup_env_template.sh; bin/develTest 192.168.10.89"
alias fpga2="cd /home/idlab/LaserBranch; xmd -tcl program-bit-and-elf-and-go.xmd.tcl"
alias gige2="cd /home/idlab/LaserBranch/software/gigE/; source setup_env_template.sh; cd ScriptsWithCarrierAddressing"

#export LD_PRELOAD="/home/idlab/build/usb-driver/libusb-driver.so"
export PATH

  4   Sat May 7 20:52:24 2016 James Bynes IIIInstructionsPlotting data from XRM boardstack

The following package will allow you to parse binary data from TargetX and output pedestal subtracted plots as well as a separate pedestal subtract text file in tabbed column format.

You will need python, numpy, scipy, and matplotlib packages installed. If you don't have them already, they can be installed through terminal with the following line (in Debian or Ubuntu):
sudo apt-get install python-numpy python-scipy python-matplotlib


Extract package to $PWD/pnnl/data/ directory

After taking data from XRM boardstack run the following command:
*note* binfile must be in the same directory
python XRM_script.py <binfile> <# of carriers> <# of windows> <plot 1 or 0 (yes or no?)>

The script will automatically compile c code and take pedestals if needed

example: (2 carriers) (4 windows) (yes plot)
python XRM_script.py test_2.bin 2 4 1
test_2.bin in included in download package for testing

Outputs:
Folder plots/ -- All plots will be stored here
XRMdataExtractor -- Data extractor program
XRMpedExtractor -- Pedestal extractor program
XRM_dataheader_<filename>.txt -- Raw data header
XRM_data_<filename>.txt -- Raw data in tab column format
XRM_pedHeader_<filename>.txt -- Pedestal only data header
XRM_ped_<filename>.txt -- Pedestal only data in tab column format
XRM_<filename>_ped_subtracted.txt -- Pedestal subtracted data in tab column format
Attachment 1: XRMdataExtractor.tar.gz
  5   Tue May 17 16:03:12 2016 Gary Varnerreportcompilation log

Following up on James` suggestion, have posted transcript of compilation log below.

Not sure if there is anything should worry about here.

Strangely, the ton of warnings saw the first time I tried went away...

 

Attachment 1: compile.txt
running build
running build_ext
building 'pythonDaq' extension
creating build
creating build/temp.linux-x86_64-2.7
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I../generic/ -I/usr/include/python2.7 -c pythonDaq.cpp -o build/temp.linux-x86_64-2.7/pythonDaq.o
creating build/lib.linux-x86_64-2.7
c++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/pythonDaq.o -lz -lm -lrt -o build/lib.linux-x86_64-2.7/pythonDaq.so
running install
running build
running build_ext
running install_lib
creating lib
creating lib/python
copying build/lib.linux-x86_64-2.7/pythonDaq.so -> ./lib/python
running install_egg_info
Writing ./lib/python/PackageName-1.0.egg-info
-rwxrwxr-x 1 xrm xrm 817014 May 18 10:59 bin/develTest
  6   Wed May 18 01:13:55 2016 Chris Ketter, Gary Varneranalysisfirst data sets

After getting data logging earlier in the day, Chris installed the detector and we took a look at data.

The amp board gain is set to lowest setting.  Still, when looking at pedestal subtracted data, the preamps were picking up clear noise.

This may have impacted the pedestals, which were still noisy with preamps off, but long cables/detector connected.

Therefore cables disconnected, and noise demonstrated to be expected (Attachment 1).  In this and subsequent plots, the x-axis sample number (approx 0.36ns/sample) and y-axis is ADC (roughly 1mV/count).

As a training exercise, Chris configured and logged these data sets.

Detector was reconnected and powered, with reference plots for ch0, ch1 in subsequent 2 attachments.

The noise is clearly correlated between channel pairs, as they are interleaved/looking at same signal.

Looking at a different channel (ch6), the noise isn't so clearly correlated.

Because each trace is 4k samples, it is easy to focus on outliers, so a less biased approach is to look at the ensemble distributions.

An example of the two conditions for ch. 1 is posted as the last 2 plots, where the RMS spread is seen to increase from about 2 to 7 ADC counts RMS.

Interesting to compare values in the tunnel.

 

Attachment 1: ch0_baseline.png
ch0_baseline.png
Attachment 2: ch0_detAmp.png
ch0_detAmp.png
Attachment 3: ch1_detAmp.png
ch1_detAmp.png
Attachment 4: ch6_detAmp.png
ch6_detAmp.png
Attachment 5: ch1_distrib.png
ch1_distrib.png
Attachment 6: ch1_distrib.png
ch1_distrib.png
  7   Wed May 18 21:32:21 2016 Gary Varnernoise during RF conditioning(?)carrier 0, asic 0

There is bursts of noise seen in the longer record lengths (1).

Some channels are quieter (2), though all see hints of 500MHz (3).

Channels 6&7 have pick-up that looks very much like 500MHz. (4).

Anyway, there is potentially good news here:

1) we aren`t completely deafened

2) a concurrent EMI baseline subtraction may be possible (use nominally unilluminated channel)

Key will be to see how large signal is.

 

Attachment 1: ch4_RFon.png
ch4_RFon.png
Attachment 2: ch4_RFon_4k.png
ch4_RFon_4k.png
Attachment 3: ch4_RFon_zoom.png
ch4_RFon_zoom.png
Attachment 4: ch7_RFon_zoom.png
ch7_RFon_zoom.png
  8   Thu May 19 02:08:09 2016 Gary Varneranalysisstatistics during RF on run

Summary statistics for short [1 run @ 64 windows] (1) and longer [100x] (2) show rather similar responses, where channels 6&7 are clearly noisier, while all others are in decent agreement.

It becomes clearer in the larger statistics that the distribution looks bimodal.  This could be due to amplifier chain instability/oscillation.

As a check of trying a common mode subtraction, did ch1-ch0 (3) and ch2-ch0 (4).  In the first case this perhaps makes sense, if the signal is 500MHz, the phase difference leads to the difference seen.  Should try to plot this modulo period and see if forms a periodogram.  For channels that should be in phase, the improvement isn't as much as would think, so this needs further investigation.

Attachment 1: RFon_noiseSummary.png
RFon_noiseSummary.png
Attachment 2: RFon_noiseSummary.gif
RFon_noiseSummary.gif
Attachment 3: InterleaveCMdiff.png
InterleaveCMdiff.png
Attachment 4: 2-0_CMdiff.png
2-0_CMdiff.png
  9   Thu May 19 13:49:23 2016 Gary Varnerdata taking problem reportmorning 20-MAY-2016 JST

After beam came back on overnight, wanted to get a background reference data set.

However when trying to log data via GUI, the trigger number wasn't incrementing, nor a non-zero .bin file being created.

Restarted the GUI and confirmed that registers could be read, but still no response to triggers. 

Tried selecting anoher ASIC and reconfig.  Bricked the GUI.  (Single Event Upset?)

Don't think bit file only FW reflash will work, but can try if unable to get power cycle of APC to work relatively soon.

Otherwise we are dead in the water.

  10   Thu May 19 19:48:14 2016 John Flanagan, Gary Varnernetwork documentationAPC network configuration
host name  : psxrd08
IP address : 172.19.62.89
MAC address: 00:c0:b7:b8:94:f9


> SuperKEKB ネットワーク 登録申請を受け付けました。
> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
>  申請日         : 2016-05-19 15:49:00
>  申請内容       : 新規
>  登録者名       : フラナガン
>  登録者の所属   : Beam Monitor
>  電子メール     : john.flanagan@kek.jp
>  機器の種類     : ネットワーク電源
>  使用OS         : 
>  設置場所       : D4,D8,トンネル内
>  Host name      : psxrd08
>  DHCP server    : Yes
>  MAC address    : 00-c0-b7-b8-94-f9
>  VLAN           : KEKB_CA_1
>  機器の使用用途 : x線モニター用
>  その他         : 
> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
> 

  11   Thu May 19 23:01:35 2016 Gary Varneranalysisfirst try

Started a 1Hz run and let it run, the tail end of which might have had the detector in the xray beam.

Stopped run, but the GUI crashed when trying to close the very large (>1.5k event) run.

Large files bit unwieldy to work with, but first time series plot for channel 0 attached (1).

And even more clearly, on log plot, can see nothing going on, so either had already crashed or was never in beam (2).

APC not making DHCP requests, so kinda stuck.

Attachment 1: ch0_timeseries.png
ch0_timeseries.png
Attachment 2: ch0_logPeds.png
ch0_logPeds.png
  12   Fri May 20 16:08:46 2016 John Flanagan, Gary Varnerhardware documentationAPC and PDU AC-power settings

Controlling remotely via separate laptop, with connections on the 2 subnets .0  and  .1

APC is currently Default IP  192.168.1.201

apc/apc


LER PDU MAC:
00-06-18-75-4f-57
HER PDU MAC:
00-06-18-75-4f-10

Default IP:
192.168.0.216

user:  snmp
pass:  1234
 

  13   Fri May 20 23:30:23 2016 Chris KetterinformationConfiguration of XRM

Attachment 1 is a block diagram of the XRM setup for the Low Energy Ring (LER). Physically, this is located underneath the right wing of Fuji Hall, tens of meters away from the crossing point of the beams (180deg around ring from interaction point). Directly upstairs is the optics hut where the readout PC is located. 

Attachment 2 details the physical location of all the components around the fermionics detector.

Attachment 3 is picture of the fermionics detector area from farther back.

Attachment 4 shows (somewhat) the source of the X-Rays and the positron beam pipe from which they originate. 

 

Attachment 1: XRM_connection_diagram.png
XRM_connection_diagram.png
Attachment 2: XRM_detector.png
XRM_detector.png
Attachment 3: Xray_beamline.png
Xray_beamline.png
Attachment 4: Xray_source.png
Xray_source.png
  14   Sat May 21 01:02:13 2016 John Flanagan, Gary Varnerrun reportFirst Light!

After a battle to sort out the networking issues with the APC (on loan) and PDU, able to get all working fine, and logged in separate Elog.

The ability to power cycle XRM proved essential as periodically something is happening in the tunnel which causes the network connections (both for XRM and APC) to get cycled.

While the APC can simply be logged into again, XRM requires a reprogram/reconfig cycle.  Interestingly, the link comes back and registers can be read back.

But data taking/writes either are ignored or cause the link to become bricked.  It could be an ARM stop, where some type of soft reset might work.

Anyway, without proper alignment fiducials, were scanning blind.  To try and see something, the mask was removed. hitting the detector with ribbon of x-rays.

Clearly seen in the first attachment.

A zoom in for the 4 pixels being read is shown in the second attachment. 

Obviously some signal processing is going to be needed to deal with the AC-coupled nature of this signal, and possibly induced ringing. 

However the Signal-to-Noise is encouraging, as the amp board is running at minimal gain.

Attachment 1: firstLight_ch0.pdf
firstLight_ch0.pdf
Attachment 2: firstSamples.png
firstSamples.png
  15   Tue Jan 22 07:56:56 2019 M. Andrewdocumentationinstructions for setup, compiling and data acquisition

File XRM.instructions.txt gives the 2019-era details on running the XRM.

Attachment 1: XRM.instructions.txt
----------------------------- initial setup ---------------------------------

Put the following in ~/.bashrc:

export XILINXD_LICENSE_FILE="..."
. /opt/Xilinx/Vivado/2014.4/settings64.sh > /dev/null
export url="https://www.phys.hawaii.edu/repos/belle2/itop/electronics"
alias repo="cd ${HOME}/build/uh-svn-repo"
alias scrod="cd ${HOME}/build/uh-svn-repo/trunk/firmware/targets/ScrodRevB_b2tt"
alias carrier="cd ${HOME}/build/uh-svn-repo/trunk/firmware/targets/CarrierRevE"
alias mza="cd ${HOME}/build/uh-svn-repo/branches/mza/gigE"
alias sdev="cd ${HOME}/build/uh-svn-repo/trunk/software/b2l/scripts_dev"

then, do work in ~/build:

~/build$ svn checkout $url uh-svn-repo

the url for websvn (to do easy side-by-side comparisons of repo changes):
https://www.phys.hawaii.edu/websvn/wsvn/belle2/itop/electronics/

make the hostname of the data acquisition computer end in 3 digits (i.e. debian017; this is a workaround to be compatible with the belle2/TOP network setup)

And with the aliases above:
can go to the base of the repo with "repo"
can go to the location to compile the scrod firmware with "scrod"
can go to the location to compile the carrier firmware with "carrier"
can go to the location to program boardstack with "mza"
can go to the location to do configuration and readouts with "sdev"

------------------------------- compiling -----------------------------------

To compile firmware, you'll need to install xilinx vivado 2014.4

The changes needed right now for XRM (relative to a fresh checkout of the HEAD of the trunk of the TOP firmware) are:

changing three generics in the top scrod vhdl file:
trunk/firmware/targets/ScrodRevB_b2tt/hdl/ScrodRevB_b2tt.vhd
-        IMPLEMENT_TRIGGER_STREAM_OUT_G : string := "Y";    -- "Y" or "N"
+        IMPLEMENT_TRIGGER_STREAM_OUT_G : string := "N";    -- "Y" or "N"
-        DAQ_INTERFACE_G                : string := "B2L";  -- "ETH" or "B2L"
+        DAQ_INTERFACE_G                : string := "ETH";  -- "ETH" or "B2L"
-        TT_LINK_TYPE_G                 : string := "B2TT"; -- "B2TT" or "XTDD"
+        TT_LINK_TYPE_G                 : string := "XTDD"; -- "B2TT" or "XTDD"

The bitfile version numbers should change to have a 0x0001 as the high 16 bits for XRM compiles, although so far not XRM bitfiles have been committed:
trunk/firmware/targets/ScrodRevB_b2tt/Version.vhd
-constant FPGA_VERSION_C : std_logic_vector(31 downto 0) := x"00000046"; -- MAKE_VERSION
+constant FPGA_VERSION_C : std_logic_vector(31 downto 0) := x"00010057"; -- MAKE_VERSION

To compile a new version of scrod or carrier firmware, do:

scrod
make # takes ~45 minutes
make elf # takes ~1 minute

carrier
make # takes ~25 minutes
make elf # takes ~1 minute

as a sidenote, you may have to issue "make gui" for each project at least once after a fresh checkout in order to get the "make elf" to successfully compile.

---------------------------- data acquisition -------------------------------

To program boardstacks, you'll need to install openocd-0.10 (compiled from source - the ubuntu package is not recent enough).  There is a script to install openocd posted here:
https://raw.githubusercontent.com/mzandrew/bin/master/setup/as_you_like_it.openocd.sh

To do a check on collected pedestals, we use ROOT in our scripts, so make sure that is installed via:
sudo apt install root-system
alternately, can disable use of ROOT by setting use_gnuplot=1 in the file "trunk/software/b2l/scripts_rel/configure_boardstack_then_acquire_and_check_pedestals.sh"

So a typical flow is (after checkout):

repo
svn update
mza
./xrm.testing.sh # takes ~1 minute
sdev
./get_status.py # should report boardstack status
../scripts_rel/configure_boardstack_then_acquire_and_check_pedestals.sh a

  16   Tue Jun 18 11:29:30 2019 M. Andrewdocumentationraspberry pi

to install:

cd
mkdir -p build
cd ~/build
git clone https://github.com/mzandrew/XRM.git

to run:

cd ~/build/XRM/predator
./get_temperatures.py # reads temps from SPI thermocouple
27.9 26.3
./read_serial.py # reads temp + ADC values from microcontroller for ammeter function
24.8 1.368 1.406
./take_pic.sh 
./lights_on.sh 
./lights_off.sh 
./temperatures.sh # grabs snapshot of KEKB status and plots temperatures on it
./make_video.sh # makes video from individual images
./upload_to_samd21.sh # programs microcontroller (ADC for amplifier's ammeter)
./daemon.sh # started in /etc/rc.local upon bootup - runs in a loop once a minute: get_temperatures.py, read_serial.py and take_pic.sh

notes:

logfile for temperatures and voltages (for ammeter) is in logs/temperatures.log

latest picture is stored in pictures/picture.jpg; then archived with a date/time stamp in the filename (pictures/2019-06-13.105227.jpg)
 

  17   Mon Sep 30 09:36:16 2019 M. Andrewdocumentationmeasurements of accelerator clock and revolution marker

Following Nuclear Instruments and Methods in Physics Research A 499 (2003) 138–166, we know that the distributed accelerator clock is 508.8875 MHz (508.91 MHz measured) and that there are 5120 RF buckets.  So the revolution marker should come at 99.3921 kHz (99.39 kHz measured).

Furthermore, it should be noted that the revolution marker is a 50% duty cycle NIM signal and the accelerator clock is about 600 mVpp.  The RMS of the delay between an edge of the accelerator clock and the revolution marker is about 67 ps.  These measurements were done in the D8 XRM optics hut (Oho) after the addition of cabling and RF/NIM fanout modules were inserted (but before the long cables down to the tunnel).

The scope used for the measurements was a Rhode & Schwartz RTO 1044.

Attachment 1: superkekb-accelerator-clock-frequency.png
superkekb-accelerator-clock-frequency.png
Attachment 2: superkekb-revolution-marker-frequency.png
superkekb-revolution-marker-frequency.png
Attachment 3: delay-stability-of-accelerator-clock-edge-to-revolution-marker-edge.png
delay-stability-of-accelerator-clock-edge-to-revolution-marker-edge.png
  18   Mon Sep 30 10:59:35 2019 M. AndrewdocumentationAlthea/RAFFERTY

The firmware running on Althea/RAFFERTY https://github.com/mzandrew/hdl/blob/master/verilog/src/mza-test032.pll_509divider_and_revo_encoder_plus_calibration_serdes.althea.v takes a 508.8875 MHz clock input, and uses a PLL to generate 4 phases of a 127.221875 MHz clock (input/4).  Then it uses a 4-bit iserdes on the input clock to register the phase of the revolution marker on the output clock.  It takes about 1 second worth of these and populates a histogram.  Then it uses the most popular choice and outputs the corresponding phase of the 127 MHz so that the boardstack gets a revolution marker on that 127 MHz clock and the "bunch-0" happens during the first quarter of whichever 127 MHz clock the boardstack sees.  This scheme *should* avoid having bunch-0 show up in a different quarter of the 127 MHz clock upon every power cycle.

The measured difference between revolution marker in from accelerator to revolution marker out to boardstack is 93.64 ns.  This is measured on Althea/RAFFERTY in the D8 HER optics hut, but should be similar when in the tunnel because Althea/RAFFERTY has since been moved down there and the cable lengths after that are on the order of ~1 m.  Overall delay from the accelerator revolution marker (in optics hut) to what Althea/RAFFERTY gets is still yet to be measured (and moreover what the phase of that is to when the synchrotron radiation from "bunch-0" goes through the HER He box).

Attachment 1: delay-from-revolution-marker-in-to-revo-out-to-boardstack.png
delay-from-revolution-marker-in-to-revo-out-to-boardstack.png
  19   Fri Oct 4 08:55:23 2019 M. Andrewdocumentationinstructions for pdu control
Control of the power distribution unit (pdu) is done from xrd04rp2.  The script pdu.sh is in the $PATH.

to get pdu status:
xrm@xrd04rp2:~$ pdu.sh 
  [on] He box pwr
 [off] Boardstack
0 W total

to power the boardstack on:
xrm@xrd04rp2:~$ pdu.sh on
  [on] He box pwr
  [on] Boardstack
50.0 W total

to turn the boardstack off:
xrm@xrd04rp2:~$ pdu.sh off
  [on] He box pwr
 [off] Boardstack
0 W total
  20   Fri Oct 4 10:04:12 2019 M. Andrewdocumentationinstructions for programming boardstack
Programming the boardstack is done from xrd04rp2.  The script boardstack.sh is in the $PATH.

To make sure the svn repo is up to date, run svnup.sh (also in $PATH) before programming:
xrm@xrd04rp2:~$ svnup.sh 
Updating '.':
At revision 2869.

Program the boardstack:
xrm@xrd04rp2:~$ boardstack.sh 
Open On-Chip Debugger 0.10.0+dev-00930-g09eb941c (2019-09-17-03:49)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : clock speed 6000 kHz
Info : JTAG tap: carrier3.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier3.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier2.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier2.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier1.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier1.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier0.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier0.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: SCROD.pl tap/device found: 0x23731093 (mfg: 0x049 (Xilinx), part: 0x3731, ver: 0x2)
Info : JTAG tap: SCROD.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : carrier3.cpu.0: hardware has 6 breakpoints, 4 watchpoints
Info : carrier3.cpu.1: hardware has 6 breakpoints, 4 watchpoints
Info : carrier2.cpu.0: hardware has 6 breakpoints, 4 watchpoints
Info : carrier2.cpu.1: hardware has 6 breakpoints, 4 watchpoints
Info : carrier1.cpu.0: hardware has 6 breakpoints, 4 watchpoints
Info : carrier1.cpu.1: hardware has 6 breakpoints, 4 watchpoints
Info : carrier0.cpu.0: hardware has 6 breakpoints, 4 watchpoints
Info : carrier0.cpu.1: hardware has 6 breakpoints, 4 watchpoints
Info : SCROD.cpu.0: hardware has 6 breakpoints, 4 watchpoints
Info : SCROD.cpu.1: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Info : Listening on port 3334 for gdb connections
Info : Listening on port 3335 for gdb connections
Info : Listening on port 3336 for gdb connections
Info : Listening on port 3337 for gdb connections

-rw-r----- 1 xrm idlab 8695644 Oct  4  2019 SCROD.bitfiles/ScrodRevB_b2tt_00010095.bit
-rw-r----- 1 xrm idlab 3828341 Oct  1 07:35 carrier.bitfiles/CarrierRevE_00000062.bit
-rwxr-x--- 1 xrm idlab 239907 Sep 20 12:54 carrier.elffiles/CarrierRevE_PS_app_00000021.elf
-rwxr-x--- 1 xrm idlab 360637 Sep 17 05:56 SCROD.elffiles/Scrod_PS_app_0000006e.elf
-rw-r----- 1 xrm idlab 20597 Sep 17 05:58 carrier.bitfiles/ps7_init.tcl
-rw-r----- 1 xrm idlab 36137 Sep 17 05:57 SCROD.bitfiles/ps7_init.tcl

-rw-r----- 1 xrm idlab 8695644 Oct  4  2019 SCROD.bitfiles/ScrodRevB_b2tt_00010095.bit
-rw-r----- 1 xrm idlab 3828341 Oct  1 07:35 carrier.bitfiles/CarrierRevE_00000062.bit
programming bit file on SCROD...
programming bit file on carrier 0...
programming bit file on carrier 1...
programming bit file on carrier 2...
programming bit file on carrier 3...

-rwxr-x--- 1 xrm idlab 239907 Sep 20 12:54 carrier.elffiles/CarrierRevE_PS_app_00000021.elf
-rwxr-x--- 1 xrm idlab 360637 Sep 17 05:56 SCROD.elffiles/Scrod_PS_app_0000006e.elf
-rw-r----- 1 xrm idlab 20597 Sep 17 05:58 carrier.bitfiles/ps7_init.tcl
-rw-r----- 1 xrm idlab 36137 Sep 17 05:57 SCROD.bitfiles/ps7_init.tcl

halting all the ARMs...
Error: Can't assert SRST: nSRST signal is not defined
Info : JTAG tap: carrier3.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier3.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier2.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier2.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier1.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier1.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier0.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier0.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: SCROD.pl tap/device found: 0x23731093 (mfg: 0x049 (Xilinx), part: 0x3731, ver: 0x2)
Info : JTAG tap: SCROD.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Warn : carrier3.cpu.0: ran after reset and before halt ...
Warn : carrier3.cpu.1: ran after reset and before halt ...
Warn : carrier2.cpu.0: ran after reset and before halt ...
Warn : carrier2.cpu.1: ran after reset and before halt ...
Warn : carrier1.cpu.0: ran after reset and before halt ...
Warn : carrier1.cpu.1: ran after reset and before halt ...
Warn : carrier0.cpu.0: ran after reset and before halt ...
Warn : carrier0.cpu.1: ran after reset and before halt ...
Warn : SCROD.cpu.0: ran after reset and before halt ...
Warn : SCROD.cpu.1: ran after reset and before halt ...
Info : carrier3.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier3.cpu.0: MPIDR level2 0, cluster 0, core 0, multi core, no SMT
Info : carrier3.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier3.cpu.1: MPIDR level2 0, cluster 0, core 1, multi core, no SMT
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x000001d3 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x200001df pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Info : carrier2.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier2.cpu.0: MPIDR level2 0, cluster 0, core 0, multi core, no SMT
Info : carrier2.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier2.cpu.1: MPIDR level2 0, cluster 0, core 1, multi core, no SMT
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x000001d3 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x200001df pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Info : carrier1.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier1.cpu.0: MPIDR level2 0, cluster 0, core 0, multi core, no SMT
Info : carrier1.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier1.cpu.1: MPIDR level2 0, cluster 0, core 1, multi core, no SMT
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x000001d3 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x200001df pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Info : carrier0.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier0.cpu.0: MPIDR level2 0, cluster 0, core 0, multi core, no SMT
Info : carrier0.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier0.cpu.1: MPIDR level2 0, cluster 0, core 1, multi core, no SMT
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x000001d3 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x200001df pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Info : SCROD.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : SCROD.cpu.0: MPIDR level2 0, cluster 0, core 0, multi core, no SMT
Info : SCROD.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : SCROD.cpu.1: MPIDR level2 0, cluster 0, core 1, multi core, no SMT
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x000001d3 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x200001df pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Error: Can't assert SRST: nSRST signal is not defined
Info : JTAG tap: carrier3.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier3.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier2.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier2.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier1.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier1.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: carrier0.pl tap/device found: 0x1372c093 (mfg: 0x049 (Xilinx), part: 0x372c, ver: 0x1)
Info : JTAG tap: carrier0.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: SCROD.pl tap/device found: 0x23731093 (mfg: 0x049 (Xilinx), part: 0x3731, ver: 0x2)
Info : JTAG tap: SCROD.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : carrier3.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier3.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x00000193 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x2000019f pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Info : carrier2.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier2.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x00000193 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x2000019f pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Info : carrier1.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier1.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x00000193 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x2000019f pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Info : carrier0.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : carrier0.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x00000193 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x2000019f pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Info : SCROD.cpu.0 rev 0, partnum c09, arch f, variant 3, implementor 41
Info : SCROD.cpu.1 rev 0, partnum c09, arch f, variant 3, implementor 41
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x00000193 pc: 0xffffff34
MMU: disabled, D-Cache: disabled, I-Cache: disabled
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x2000019f pc: 0xffffff28
MMU: disabled, D-Cache: disabled, I-Cache: disabled
successful!
programming elf file on carrier0...
programming elf file on carrier1...
programming elf file on carrier2...
programming elf file on carrier3...
programming elf file on SCROD...

Note:  If the boardstack is not powered, you will get many "Error: Invalid ACK (0) in DAP response" messages.

[optional] Then check how much power is being drawn:
xrm@xrd04rp2:~$ pdu.sh 
  [on] He box pwr
  [on] Boardstack
80.0 W total
  21   Fri Oct 4 10:18:44 2019 M. Andrewdocumentationinstructions for checking boardstack status and temperature
This is done from sixrmlaptop02 (a.k.a. balrog017).  These scripts are not in the $PATH, so you must cd to ~/build/uh-svn-repo/trunk/software/b2l/scripts_dev before running them.

To check basic status (whether you can talk to a boardstack, which firmware is programmed on it, what the temperature is, etc):
idlab@balrog017:~/build/uh-svn-repo/trunk/software/b2l/scripts_dev$ ./get_status.py 0
Writing output from ./get_status.py to logfile: logs/2019-10-05.051508.s17a.SCROD004.get_status.log
SCROD #4 RawVoltages: 1.880 V 3.861 V 4.807 V
 WARNING: RAW2 voltage unnecessarily high (by 0.762 V)
 WARNING: RAW3 voltage unnecessarily high (by 0.383 V)
         FPGA_ver ARM_ver  trigMask DieTemp WallTemp -----other------ ARM_stat
   SCROD 00010095 0000006e 0000000f  52.7 C  34.5 C  31.1 C  13.2 %RH Running
carrier0 00000062 00000021 00000000  61.1 C  43.8 C  39.0 C  41.8 C   Running
carrier1 00000062 00000021 00000000  60.2 C  46.0 C  41.2 C  44.2 C   Running
carrier2 00000062 00000021 00000000  59.9 C  46.0 C  42.2 C  44.8 C   Running
carrier3 00000062 00000021 00000000  60.7 C  44.2 C  41.5 C  43.2 C   Running
readoutBitSlip (IRSX config?) = [0, 0, 0, 0]
readoutWindows (prep done?)   = [0, 0, 0, 0]
Feature extraction mode       = 0 Normal
SCROD_AxiCommon_asicTimeoutMask: 0
ProcessPacketProblemCounter = 0
nSamplesWrongCounter = 0
SCROD_PS_EXTENDED_STATUS_ADDR = 0x1
SCROD_PS_pendingWaves = 0
SCROD_PS_procEventCnt = 0
SCROD_PS_totalWaves = 0
SCROD_AxiCommon_eventCnt = 0
SCROD_AxiCommon_pendingEventCount = 0
SCROD_AxiCommon_maxPendingEventCount = 0
SCROD_PS_AXI_FAULT_STATUS_ADDR = 0x0
SCROD_PS_AXI_FAULT_ADDRESS_ADDR = 0x0
SCROD_PS_OFFENDING_ADDRESS0_ADDR = 0x0
SCROD_PS_OFFENDING_ADDRESS1_ADDR = 0x0

Note:  Before configuration, the warning messages about the raw voltages being too high should be ignored.

To check detailed temperature, humidity and power draw:
idlab@balrog017:~/build/uh-svn-repo/trunk/software/b2l/scripts_dev$ ./log_temps.py 0
Writing output from ./log_temps.py to logfile: logs/2019-10-05.052200.s17a.SCROD004.log_temps.log

------------------------------------------------------------
s17a.SCROD004  DATE 2019-10-05 05:22:00.661181
Parameter          SCROD carrier0 carrier1 carrier2 carrier3
----------         ----- -------- -------- -------- --------
fwVersion       00010095 00000062 00000062 00000062 00000062
elfVersion      0000006e 00000021 00000021 00000021 00000021
------------------------------------------------------------
tempFPGA          53.6 C   61.4 C   60.8 C   60.5 C   60.7 C
tempFPGAMAX       55.6 C   63.7 C   62.8 C   62.9 C   63.5 C
tempWall          35.0 C   44.2 C   46.5 C   46.5 C   44.8 C
tempWallMAX       35.0 C   44.2 C   46.8 C   46.5 C   45.0 C
tADC0                                                       
tADC0MAX                                                    
tADC1                                                       
tADC1MAX                                                    
tempASIC01                 39.5 C   41.8 C   42.8 C   42.0 C
tempASIC23                 42.2 C   45.0 C   45.5 C   43.8 C
tempASIC01MAX              39.5 C   42.0 C   42.8 C   42.0 C
tempASIC23MAX              42.2 C   45.0 C   45.5 C   43.8 C
humidityTemp      31.3 C                                    
humidityTempMAX   31.3 C                                    
trigTranTemp                                                
trigTranTempMAX                                             
dataTranTemp       0.0 C                                    
dataTranTempMAX    0.0 C                                    
tempMAX           55.6 C   63.7 C   62.8 C   62.9 C   63.5 C
maximum temperature measured on this boardstack is:   63.7 C
------------------------------------------------------------
humidity         12.9 %RH                                    
------------------------------------------------------------
vRAW1            1.875 V                                    
vRAW2            3.860 V                                    
 WARNING: RAW2 voltage unnecessarily high (by 0.761 V)
vRAW3            4.803 V                                    
 WARNING: RAW3 voltage unnecessarily high (by 0.379 V)
vPINT1p0         0.990 V  1.014 V  1.004 V  0.997 V  1.004 V
vINT1p0          0.994 V  1.012 V  1.004 V  0.998 V  1.003 V
vBRAM1p0         0.994 V  1.012 V  1.004 V  0.998 V  1.004 V
vGTX1p0          0.998 V                                    
vGTX1p2          1.194 V                                    
vDDR1p2          1.193 V                                    
vPLLPAUX1p8      1.800 V  1.805 V  1.807 V  1.801 V  1.802 V
vAUXIO1p8        1.795 V                                    
vAUX1p8          1.792 V  1.813 V  1.795 V  1.795 V  1.796 V
vVCCO1p8         1.795 V                                    
v2p5             2.494 V                                    
vMIO2p5          2.492 V                                    
vVCCO2p5         2.492 V                                    
v3p3             3.266 V                                    
vASIC0                                                      
vASIC1                                                      
vASIC2                                                      
vASIC3                                                      
vRAW1            1.875 V                                    
vRAW2            3.860 V                                    
 WARNING: RAW2 voltage unnecessarily high (by 0.761 V)
vRAW3            4.803 V                                    
 WARNING: RAW3 voltage unnecessarily high (by 0.379 V)
------------------------------------------------------------
iPINT1p0                                                    
iINT1p0           921 mA                                    
iBRAM1p0           17 mA                                    
iGTX1p0           679 mA                                    
iGTX1p2           468 mA                                    
iDDR1p2            52 mA                                    
iPLLPAUX1p8        84 mA                                    
iAUXIO1p8          29 mA                                    
iAUX1p8           157 mA                                    
iVCCO1p8           83 mA                                    
i2p5              107 mA                                    
iMIO2p5            22 mA                                    
iVCCO2p5           42 mA                                    
i3p3              174 mA                                    
iPINT1p0MAX                                                 
iINT1p0MAX        924 mA                                    
iBRAM1p0MAX        21 mA                                    
iGTX1p0MAX        678 mA                                    
iGTX1p2MAX        471 mA                                    
iDDR1p2MAX         66 mA                                    
iPLLPAUX1p8MAX     91 mA                                    
iAUXIO1p8MAX       32 mA                                    
iAUX1p8MAX        160 mA                                    
iVCCO1p8MAX        87 mA                                    
i2p5MAX           110 mA                                    
iMIO2p5MAX         25 mA                                    
iVCCO2p5MAX        44 mA                                    
i3p3MAX           181 mA                                    
iASIC0                                                      
iASIC1                                                      
iASIC2                                                      
iASIC3                                                      
iASIC0MAX                                                   
iASIC1MAX                                                   
iASIC2MAX                                                   
iASIC3MAX                                                   
------------------------------------------------------------
pASIC0                                                      
pASIC1                                                      
pASIC2                                                      
pASIC3                                                      
pAMPs                                                       
pASICs                                                      
------------------------------------------------------------

Note:  There are no entries for some items above because those features are not present on the "carrier revE2 (special XRM edition)"

Other various scripts are available, some of which have functionality you can guess from the name:
idlab@balrog017:~/build/uh-svn-repo/trunk/software/b2l/scripts_dev$ ls -lart *.py *.sh
-rwxr-x--- 1 idlab idlab  1925 Sep 30  2017 get_n_events.sh
-rwxr-x--- 1 idlab idlab   994 Dec 28  2017 ADC_threshold_scan.sh
-rwxr-x--- 1 idlab idlab   677 Dec 20  2018 b2lreg.py
-rwxr-x--- 1 idlab idlab   609 Jan 15  2019 getReady.sh
-rwxr-x--- 1 idlab idlab  3514 Jan 15  2019 dumpregisters.sh
-rwxr-x--- 1 idlab idlab    95 Feb  9  2019 run_all_gnuplots.sh
-rw-r----- 1 idlab idlab  1163 Feb 14  2019 irsx.py
-rwxr-x--- 1 idlab idlab   694 Mar  2  2019 watchVirtualTTYs.py
-rwxr-x--- 1 idlab idlab   612 Mar  9  2019 setTimeout.py
-rwxr-x--- 1 idlab idlab  3890 Mar  9  2019 scrod_currents.py
-rw-r----- 1 idlab idlab   627 Mar  9  2019 ReadThreshold.py
-rw-r----- 1 idlab idlab   563 Mar  9  2019 ReadFB.py
-rwxr-x--- 1 idlab idlab   777 Mar  9  2019 prep1carrier_data_trueROI.py
-rwxr-x--- 1 idlab idlab  3721 Mar  9  2019 prep1asic_data_trueROI.py
-rwxr-x--- 1 idlab idlab  4155 Mar  9  2019 monitor_temp.py
-rwxr-x--- 1 idlab idlab  1583 Mar  9  2019 live_voltage_readout.py
-rwxr-x--- 1 idlab idlab  9860 Mar  9  2019 juice.py
-rw-r----- 1 idlab idlab 25619 Mar  9  2019 irsxSetFunction.py
-rw-r----- 1 idlab idlab  2356 Mar  9  2019 DebugInfoWarningError24.py
-rwxr-x--- 1 idlab idlab  1100 Mar  9  2019 config1carrier_trueROI.py
-rwxr-x--- 1 idlab idlab  1192 Mar  9  2019 config1carrier_fast.py
-rwxr-x--- 1 idlab idlab 21683 Mar  9  2019 config1asic_trueROI.py
-rwxr-x--- 1 idlab idlab  3323 Mar  9  2019 config1asic_fast.py
-rwxr-x--- 1 idlab idlab  7904 Mar  9  2019 measure_iASIC_as_a_function_of_vbias_and_vbias2.py
-rwxr-x--- 1 idlab idlab 21195 Mar  9  2019 ethudp.py
-rwxr-x--- 1 idlab idlab  4768 Mar 12  2019 scanLoadLatch.py
-rwxr-x--- 1 idlab idlab 34947 Mar 15  2019 threshScan1boardstack.py
-rw-r----- 1 idlab idlab  3686 Mar 16  2019 B2L_errorstats.py
-rwxr-x--- 1 idlab idlab  3388 Mar 21  2019 get_fe_ped.py
-rwxr-x--- 1 idlab idlab   862 Mar 21  2019 config1boardstack_trueROI.py
-rwxr-x--- 1 idlab idlab  6997 Mar 26  2019 get_status.py
-rwxr-x--- 1 idlab idlab 25247 Mar 30  2019 testPollableMemory.py
-rwxr-x--- 1 idlab idlab  6305 Apr  6 08:54 log_temps.py
-rwxr-x--- 1 idlab idlab    68 May 18 09:23 edit.sh
-rwxr-x--- 1 idlab idlab   171 May 23 10:56 what_I_am_doing_right_now.sh
-rw-r----- 1 idlab idlab  1021 May 23 10:56 SCROD_PS_defs.py
-rwxr-x--- 1 idlab idlab  4119 May 23 10:56 prep1boardstack_fe.py
-rwxr-x--- 1 idlab idlab  3816 Jun 22 03:17 config1boardstack_fast.py
-rwxr-x--- 1 idlab idlab  1111 Jun 22 03:18 prep1boardstack_data_trueROI.py
-rwxr-x--- 1 idlab idlab   278 Jun 27 03:49 push_peds.sh
-rwxr-x--- 1 idlab idlab 10903 Sep 18 05:17 xrm.py
  22   Fri Oct 4 10:33:53 2019 M. Andrewdocumentationinstructions for boardstack configuration
This is done from sixrmlaptop02 (a.k.a. balrog017).  These scripts are not in the $PATH, so you must cd to ~/build/uh-svn-repo/trunk/software/b2l/scripts_dev before running them.

To configure the ASICs, set desired modes in the PL/PS (programmable logic/processing system) for operation, and then acquire pedestals:
idlab@balrog017:~/build/uh-svn-repo/trunk/software/b2l/scripts_dev$ ../scripts_rel/configure_boardstack_then_acquire_and_check_pedestals.sh a
/home/idlab/build/uh-svn-repo/trunk/software/b2l/scripts_rel/../scripts_dev/.config
$hslb_list = " a"

running in _fast mode from /home/idlab/build/uh-svn-repo/trunk/software/b2l/scripts_dev

xrm trigger enabled (4ad) = 00000000
number of carriers detected = 4
set up all registers on hslb a (boardstack 0)...
Writing output from ./config1boardstack_fast.py to logfile: logs/2019-10-05.053059.s17a.SCROD004.config1boardstack_fast.log
reg24b2 = 00000000 CARRIER_AxiCommon_heapEnabled
reg44b2 = 00000000 CARRIER_AxiCommon_heapEnabled
reg64b2 = 00000000 CARRIER_AxiCommon_heapEnabled
reg84b2 = 00000000 CARRIER_AxiCommon_heapEnabled
[ 0.000] ##########################################################
[ 0.000] ## Starting configuration of BS 0 / carrier 0 
[ 0.002] Writing trigger thresholds to PS registers
[ 0.020] Writing sstFB values (110, 109, 110, 110) to PS registers
[ 0.022] Starting asic fast autoconfiguration on carrier PS
[ 0.000] ##########################################################
[ 0.000] ## Starting configuration of BS 0 / carrier 1 
[ 0.003] Writing trigger thresholds to PS registers
[ 0.021] Writing sstFB values (110, 110, 110, 109) to PS registers
[ 0.023] Starting asic fast autoconfiguration on carrier PS
[ 0.000] ##########################################################
[ 0.000] ## Starting configuration of BS 0 / carrier 2 
[ 0.005] Writing trigger thresholds to PS registers
[ 0.023] Writing sstFB values (110, 110, 109, 109) to PS registers
[ 0.026] Starting asic fast autoconfiguration on carrier PS
[ 0.000] ##########################################################
[ 0.000] ## Starting configuration of BS 0 / carrier 3 
[ 0.007] Writing trigger thresholds to PS registers
[ 0.026] Writing sstFB values (110, 110, 110, 110) to PS registers
[ 0.028] Starting asic fast autoconfiguration on carrier PS
Wait until all ASICs are configured...
00 0001[1] 0001[1] 0001[1] 0001[1] 
00 0001[7] 0001[7] 0001[7] 0001[7] 
01 0001[7] 0001[7] 0001[7] 0001[7] 
01 0001[7] 0001[7] 0001[7] 0001[7] 
02 0001[7] 0001[7] 0001[7] 0001[7] 
02 fff2[e] 0001[7] fff2[e] 0001[7] 
03 fff2[e] fff2[e] fff2[e] 0001[7] 
03 fff2[e] fff2[e] fff2[e] fff2[e] 
03 fff2[e] fff2[e] fff2[e] fff2[e] 
*****************************************************
carrier 0 configuration SUCCESS for all ASICS
carrier 1 configuration SUCCESS for all ASICS
carrier 2 configuration SUCCESS for all ASICS
carrier 3 configuration SUCCESS for all ASICS
*****************************************************
return value = 0
prepare boardstack to take data...
Writing output from ./prep1boardstack_data_trueROI.py to logfile: logs/2019-10-05.053103.s17a.SCROD004.prep1boardstack_data_trueROI.log
Found 4 carriers
BS 0, carrier 0, asic 0 [ phase: 1 0 ] ready for data
BS 0, carrier 0, asic 1 [ phase: 1 0 ] ready for data
BS 0, carrier 0, asic 2 [ phase: 0 ] ready for data
BS 0, carrier 0, asic 3 [ phase: 0 ] ready for data
BS 0, carrier 1, asic 0 [ phase: 1 1 0 ] ready for data
BS 0, carrier 1, asic 1 [ phase: 1 0 ] ready for data
BS 0, carrier 1, asic 2 [ phase: 0 ] ready for data
BS 0, carrier 1, asic 3 [ phase: 0 ] ready for data
BS 0, carrier 2, asic 0 [ phase: 0 ] ready for data
BS 0, carrier 2, asic 1 [ phase: 0 ] ready for data
BS 0, carrier 2, asic 2 [ phase: 0 ] ready for data
BS 0, carrier 2, asic 3 [ phase: 0 ] ready for data
BS 0, carrier 3, asic 0 [ phase: 1 0 ] ready for data
BS 0, carrier 3, asic 1 [ phase: 1 0 ] ready for data
BS 0, carrier 3, asic 2 [ phase: 1 0 ] ready for data
BS 0, carrier 3, asic 3 [ phase: 0 ] ready for data
return value = 0
ask PS to acquire pedestals...
Writing output from ./prep1boardstack_fe.py to logfile: logs/2019-10-05.053103.s17a.SCROD004.prep1boardstack_fe.log
Taking pedestals...
remaining triggers = 54785
remaining triggers = 54273
remaining triggers = 53505
remaining triggers = 52993
remaining triggers = 52481
remaining triggers = 51713
remaining triggers = 51201
remaining triggers = 50433
remaining triggers = 49921
remaining triggers = 49409
remaining triggers = 48641
remaining triggers = 48129
remaining triggers = 47361
remaining triggers = 46849
remaining triggers = 46337
remaining triggers = 45569
remaining triggers = 45057
remaining triggers = 44289
remaining triggers = 43777
remaining triggers = 43265
remaining triggers = 42497
remaining triggers = 41985
remaining triggers = 41217
remaining triggers = 40705
remaining triggers = 40193
remaining triggers = 39425
remaining triggers = 38913
remaining triggers = 38145
remaining triggers = 37633
remaining triggers = 36865
remaining triggers = 36353
remaining triggers = 35841
remaining triggers = 35073
remaining triggers = 34561
remaining triggers = 33793
remaining triggers = 33281
remaining triggers = 32769
remaining triggers = 32001
remaining triggers = 31489
remaining triggers = 30721
remaining triggers = 30209
remaining triggers = 29697
remaining triggers = 28929
remaining triggers = 28417
remaining triggers = 27649
remaining triggers = 27137
remaining triggers = 26625
remaining triggers = 25857
remaining triggers = 25345
remaining triggers = 24577
remaining triggers = 24065
remaining triggers = 23553
remaining triggers = 22785
remaining triggers = 22273
remaining triggers = 21505
remaining triggers = 20993
remaining triggers = 20481
remaining triggers = 19713
remaining triggers = 19201
remaining triggers = 18433
remaining triggers = 17921
remaining triggers = 17409
remaining triggers = 16641
remaining triggers = 16129
remaining triggers = 15361
remaining triggers = 14849
remaining triggers = 14337
remaining triggers = 13569
remaining triggers = 13057
remaining triggers = 12289
remaining triggers = 11777
remaining triggers = 11265
remaining triggers = 10497
remaining triggers = 9985
remaining triggers = 9217
remaining triggers = 8705
remaining triggers = 8193
remaining triggers = 7425
remaining triggers = 6913
remaining triggers = 6145
remaining triggers = 5633
remaining triggers = 4865
remaining triggers = 4353
remaining triggers = 3841
remaining triggers = 3073
remaining triggers = 2561
remaining triggers = 1793
remaining triggers = 1281
remaining triggers = 769
remaining triggers = 0
Pedestal Calc Success
Feature extraction mode = Passthru
write pedestals to disk...
collecting data in background thread (file peds/ped_hslb_s17a.dat)...
starting to collect data...
triggering readout of pedestals...
0/0
0/1
0/2
0/3
0/4
0/5
0/6
0/7
collected 8192 packets
-rw-r----- 1 idlab idlab 17072128 Oct  5 05:32 peds/ped_hslb_s17a.dat

Correctly read out 8192.0 packets

Splitting peds/ped_hslb_s17a.dat into peds/ped_hslb_s17a.ped.dat and peds/ped_hslb_s17a.RMS.dat
4096+0 records in
4096+0 records out
8536064 bytes (8.5 MB, 8.1 MiB) copied, 0.0356023 s, 240 MB/s
4096+0 records in
4096+0 records out
8536064 bytes (8.5 MB, 8.1 MiB) copied, 0.0414147 s, 206 MB/s
-rw-r----- 1 idlab idlab 8536064 Oct  5 05:32 peds/ped_hslb_s17a.ped.dat
-rw-r----- 1 idlab idlab 8536064 Oct  5 05:32 peds/ped_hslb_s17a.RMS.dat
use 'peddump' to read the files peds/ped_hslb_s17a.ped.dat and peds/ped_hslb_s17a.RMS.dat
convert pedestal/RMS files from dat to txt...
-rw-r----- 1 idlab idlab 17044537 Oct  5 05:32 peds/ped_hslb_s17a.ped.txt
-rw-r----- 1 idlab idlab 10069140 Oct  5 05:32 peds/ped_hslb_s17a.RMS.txt
generating pedestal/RMS png files...

run these commands on the appropriate machine:
root -l -b -q '../../fe/FEpedsSummary.C+("peds/ped_hslb_s17a")'
eog peds/ped_hslb_s17a*.png

-rw-r----- 1 idlab idlab 17072128 Oct  5 05:32 peds/ped_hslb_s17a.dat
-rw-r----- 1 idlab idlab  8536064 Oct  5 05:32 peds/ped_hslb_s17a.ped.dat
-rw-r----- 1 idlab idlab  8536064 Oct  5 05:32 peds/ped_hslb_s17a.RMS.dat
-rw-r----- 1 idlab idlab 17044537 Oct  5 05:32 peds/ped_hslb_s17a.ped.txt
-rw-r----- 1 idlab idlab 10069140 Oct  5 05:32 peds/ped_hslb_s17a.RMS.txt

[optional] Then to plot summaries of the pedestal data (frequently useful for diagnosing problems):
idlab@balrog017:~/build/uh-svn-repo/trunk/software/b2l/scripts_dev$ root -l -b -q '../../fe/FEpedsSummary.C+("peds/ped_hslb_s17a")'
root [0] 
Processing ../../fe/FEpedsSummary.C+("peds/ped_hslb_s17a")...
ch =   0   ped =  1792   RMS =   94
ch =   8   ped =  1163   RMS =   46
ch =  16   ped =  1128   RMS =   39
ch =  24   ped =  1086   RMS =   34
ch =  32   ped =   310   RMS =    6
ch =  40   ped =   356   RMS =    8
ch =  48   ped =   322   RMS =    6
ch =  56   ped =   280   RMS =    3
ch =  64   ped =  1075   RMS =   34
ch =  72   ped =  1096   RMS =   73
ch =  80   ped =  1138   RMS =   45
ch =  88   ped =  1052   RMS =   36
ch =  96   ped =   320   RMS =    7
ch = 104   ped =   329   RMS =    9
ch = 112   ped =   388   RMS =    9
ch = 120   ped =   325   RMS =    7
processed 4194304 entries

Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.PedSummary.png has been created
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.PedSummary_Logy.png has been created
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.PedVsSample.png has been created
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.PedVsChannel.png has been created
 FCN=2.10161e+06 FROM MIGRAD    STATUS=CONVERGED     155 CALLS         156 TOTAL
                     EDM=2.30771e-08    STRATEGY= 1  ERROR MATRIX UNCERTAINTY   1.3 per cent
  EXT PARAMETER                                   STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  Constant     2.49118e+05   2.95976e+02  -1.60874e-01   1.32447e-06
   2  Mean         3.09614e+01   5.25673e-03  -1.14622e-06  -1.04896e-02
   3  Sigma        4.73722e+00   4.23697e-03  -6.36022e-08   2.33082e+00
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.RMS_Summary.png has been created
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.RMS_Summary_Logy.png has been created
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.PedRMSvsChannel.png has been created
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.PedRMSvsSample.png has been created
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.PedRMSvsReadOutPos.png has been created
Info in <TCanvas::Print>: png file peds/ped_hslb_s17a.RMS_ped_depend.png has been created

Note:  If you get a lot of messages like "ERROR:  wrong virtual channel number in data (packet1); DEBUG3:  01 00 00 00" during pedestal readout, it will try again a few times and as long as the script says "Correctly read out 8192.0 packets" before quitting, then all is okay.  It is unknown why this virtual channel problem occurs (it's a bug but I don't know where).

[optional] To view the pedestal summary plots:
eog peds/ped_hslb_s17a*.png

[optional] If you want to save the pedestals for future reference (because they mark the first or last time a particular situation is being exercised):
idlab@balrog017:~/build/uh-svn-repo/trunk/software/b2l/scripts_dev$ ./push_peds.sh 2019-10-04.these-look-nice.c0c2only
2019-10-05+05:32     10069140 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.RMS.txt
2019-10-05+05:32     17044537 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.ped.txt
2019-10-05+05:32     17072128 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.dat
2019-10-05+05:32      8536064 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.ped.dat
2019-10-05+05:32      8536064 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.RMS.dat
2019-10-05+05:35        16009 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.PedSummary.png
2019-10-05+05:35        16983 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.PedSummary_Logy.png
2019-10-05+05:35        19455 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.RMS_Summary_Logy.png
2019-10-05+05:35        21818 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.RMS_Summary.png
2019-10-05+05:35        25792 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.RMS_ped_depend.png
2019-10-05+05:35        31859 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.PedRMSvsChannel.png
2019-10-05+05:35        33339 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.PedRMSvsSample.png
2019-10-05+05:35        34725 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.PedVsChannel.png
2019-10-05+05:35        45609 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.PedRMSvsReadOutPos.png
2019-10-05+05:35        59214 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only/ped_hslb_s17a.PedVsSample.png
2019-10-05+05:37         4096 peds/2019-10-05.2019-10-04.these-look-nice.c0c2only

Note:  If you don't run push_peds.sh to archive the pedestal data and summary plots, the next pedestal acquisition will overwrite them.  Usually they are not needed, as pedestal subtraction is done online before data comes out.

[optional]  To check again on the boardstack temperatures and raw voltages:
idlab@balrog017:~/build/uh-svn-repo/trunk/software/b2l/scripts_dev$ ./get_status.py 0
Writing output from ./get_status.py to logfile: logs/2019-10-05.054118.s17a.SCROD004.get_status.log
SCROD #4 RawVoltages: 1.800 V 3.475 V 4.623 V
 WARNING: RAW2 voltage unnecessarily high (by 0.376 V)
         FPGA_ver ARM_ver  trigMask DieTemp WallTemp -----other------ ARM_stat
   SCROD 00010095 0000006e 00000000  58.0 C  38.8 C  34.5 C   9.4 %RH Running
carrier0 00000062 00000021 00000000  73.2 C  59.5 C  51.8 C  58.5 C   Running
carrier1 00000062 00000021 00000000  73.3 C  60.5 C  53.0 C  59.0 C   Running
carrier2 00000062 00000021 00000000  78.8 C  65.8 C  61.2 C  67.0 C   Running
carrier3 00000062 00000021 00000000  72.9 C  56.8 C  52.0 C  56.2 C   Running
readoutBitSlip (IRSX config?) = [3, 3, 3, 3]
readoutWindows (prep done?)   = [1, 1, 1, 1]
Feature extraction mode       = 2 Passthru
SCROD_AxiCommon_asicTimeoutMask: 0
ProcessPacketProblemCounter = 0
nSamplesWrongCounter = 0
SCROD_PS_EXTENDED_STATUS_ADDR = 0x1
SCROD_PS_pendingWaves = 0
SCROD_PS_procEventCnt = 0
SCROD_PS_totalWaves = 0
SCROD_AxiCommon_eventCnt = 54784
SCROD_AxiCommon_pendingEventCount = 255
SCROD_AxiCommon_maxPendingEventCount = 255
SCROD_PS_AXI_FAULT_STATUS_ADDR = 0x0
SCROD_PS_AXI_FAULT_ADDRESS_ADDR = 0x0
SCROD_PS_OFFENDING_ADDRESS0_ADDR = 0x0
SCROD_PS_OFFENDING_ADDRESS1_ADDR = 0x0

Note:  After configuration, the warnings about raw voltages being too *low* should be heeded (requires a tunnel access with a slotted screwdriver to fix).
  23   Thu Oct 17 08:06:01 2019 M. Andrewdocumentationwhat was brought to KEK (2019-09)

photographic record of equipment delivered to KEK in September

Attachment 1: nim-bin.joestrummer-rafferty-raspberry-pi.jpeg
nim-bin.joestrummer-rafferty-raspberry-pi.jpeg
Attachment 2: boardstack-preamps-sensor-adjustable-slit.jpeg
boardstack-preamps-sensor-adjustable-slit.jpeg
Attachment 3: keithley-connections.jpeg
keithley-connections.jpeg
Attachment 4: entire-setup.jpeg
entire-setup.jpeg
  Draft   Thu Oct 17 09:28:32 2019 M. Andrewdocumentation what was installed for HER (2019-09)
  25   Tue Oct 29 09:27:14 2019 M. Andrewdocumentationinstructions on taking a full revolution of waveforms
This may be useful when steering the sensor into x-ray beam for instance.

First, ensure the boardstack is powered, programmed and configured.

Then, make sure the ".config" file in ~/build/uh-svn-repo/trunk/software/b2l/scripts_dev/ has a line declaring the xrm_mode is "sweep" and plot_continuous is set to 1 and xrm_run_continuous is set to 1:

xrm_run_continuous=1
plot_continuous=1
be_verbose_when_collecting_data=1
xrm_mode="sweep"

After that, to acquire data, simply run ./xrm.py from ~/build/uh-svn-repo/trunk/software/b2l/scripts_dev/ (see attachment for example output).
Attachment 1: 2019-10-30.062954.s17a.SCROD004.xrm.log
Writing output from ./xrm.py to logfile: logs/2019-10-30.062954.s17a.SCROD004.xrm.log

datafile name: data/2019-10-30.062954.datafile
Taking pedestals...
remaining triggers = 6273
remaining triggers = 5441
remaining triggers = 4577
remaining triggers = 3745
remaining triggers = 2881
remaining triggers = 2049
remaining triggers = 1185
remaining triggers = 353
remaining triggers = 0
   ERROR:  Ped calc generic fail 8
   SCROD:acquiring/calculating pedestals...
   SCROD:  DEBUG:maxwin=428
   SCROD:  DEBUG:waiting for data from the software trigger we just sent (n=0)...
   SCROD:  DEBUG:waiting for data from the software trigger we just sent (n=0)...
   SCROD:  DEBUG:waiting for data from the software trigger we just sent (n=0)...
   SCROD:  DEBUG:waiting for data from the software trigger we just sent (n=0)...
   SCROD:  DEBUG:carrier 1 asic 0 received 0 triggers (out of 109568)
   SCROD:  DEBUG:carrier 1 asic 1 received 0 triggers (out of 109568)
   SCROD:  DEBUG:carrier 1 asic 2 received 0 triggers (out of 109568)
   SCROD:  DEBUG:carrier 1 asic 3 received 0 triggers (out of 109568)
   SCROD:  DEBUG:carrier 3 asic 0 received 0 triggers (out of 109568)
   SCROD:  DEBUG:carrier 3 asic 1 received 0 triggers (out of 109568)
   SCROD:  DEBUG:carrier 3 asic 2 received 0 triggers (out of 109568)
   SCROD:  DEBUG:carrier 3 asic 3 received 0 triggers (out of 109568)
   SCROD:pedestal acquisition took 9.595 seconds
   SCROD:  ERROR:ProcessPacketProblemCounter=540992
   SCROD:finished acquiring/calculating pedestals; returnval = 00000008
setting bunch_marker_a to RF_bucket # 4
setting bunch_marker_a to RF_bucket # 16
setting bunch_marker_a to RF_bucket # 28
setting bunch_marker_a to RF_bucket # 40
setting bunch_marker_a to RF_bucket # 52
setting bunch_marker_a to RF_bucket # 64
setting bunch_marker_a to RF_bucket # 76
setting bunch_marker_a to RF_bucket # 88
setting bunch_marker_a to RF_bucket # 100
setting bunch_marker_a to RF_bucket # 112
setting bunch_marker_a to RF_bucket # 124
setting bunch_marker_a to RF_bucket # 136
setting bunch_marker_a to RF_bucket # 148
setting bunch_marker_a to RF_bucket # 160
setting bunch_marker_a to RF_bucket # 172
setting bunch_marker_a to RF_bucket # 184
setting bunch_marker_a to RF_bucket # 196
setting bunch_marker_a to RF_bucket # 208
setting bunch_marker_a to RF_bucket # 220
setting bunch_marker_a to RF_bucket # 232
setting bunch_marker_a to RF_bucket # 244
setting bunch_marker_a to RF_bucket # 256
setting bunch_marker_a to RF_bucket # 268
setting bunch_marker_a to RF_bucket # 280
setting bunch_marker_a to RF_bucket # 292
setting bunch_marker_a to RF_bucket # 304
setting bunch_marker_a to RF_bucket # 316
setting bunch_marker_a to RF_bucket # 328
setting bunch_marker_a to RF_bucket # 340
setting bunch_marker_a to RF_bucket # 352
setting bunch_marker_a to RF_bucket # 364
setting bunch_marker_a to RF_bucket # 376
setting bunch_marker_a to RF_bucket # 388
setting bunch_marker_a to RF_bucket # 400
setting bunch_marker_a to RF_bucket # 412
setting bunch_marker_a to RF_bucket # 424
setting bunch_marker_a to RF_bucket # 436
setting bunch_marker_a to RF_bucket # 448
setting bunch_marker_a to RF_bucket # 460
setting bunch_marker_a to RF_bucket # 472
setting bunch_marker_a to RF_bucket # 484
setting bunch_marker_a to RF_bucket # 496
setting bunch_marker_a to RF_bucket # 508
setting bunch_marker_a to RF_bucket # 520
setting bunch_marker_a to RF_bucket # 532
setting bunch_marker_a to RF_bucket # 544
setting bunch_marker_a to RF_bucket # 556
setting bunch_marker_a to RF_bucket # 568
setting bunch_marker_a to RF_bucket # 580
setting bunch_marker_a to RF_bucket # 592
setting bunch_marker_a to RF_bucket # 604
setting bunch_marker_a to RF_bucket # 616
setting bunch_marker_a to RF_bucket # 628
setting bunch_marker_a to RF_bucket # 640
setting bunch_marker_a to RF_bucket # 652
setting bunch_marker_a to RF_bucket # 664
setting bunch_marker_a to RF_bucket # 676
setting bunch_marker_a to RF_bucket # 688
setting bunch_marker_a to RF_bucket # 700
setting bunch_marker_a to RF_bucket # 712
setting bunch_marker_a to RF_bucket # 724
setting bunch_marker_a to RF_bucket # 736
setting bunch_marker_a to RF_bucket # 748
setting bunch_marker_a to RF_bucket # 760
setting bunch_marker_a to RF_bucket # 772
setting bunch_marker_a to RF_bucket # 784
setting bunch_marker_a to RF_bucket # 796
setting bunch_marker_a to RF_bucket # 808
setting bunch_marker_a to RF_bucket # 820
setting bunch_marker_a to RF_bucket # 832
setting bunch_marker_a to RF_bucket # 844
setting bunch_marker_a to RF_bucket # 856
setting bunch_marker_a to RF_bucket # 868
setting bunch_marker_a to RF_bucket # 880
setting bunch_marker_a to RF_bucket # 892
setting bunch_marker_a to RF_bucket # 904
setting bunch_marker_a to RF_bucket # 916
setting bunch_marker_a to RF_bucket # 928
setting bunch_marker_a to RF_bucket # 940
setting bunch_marker_a to RF_bucket # 952
setting bunch_marker_a to RF_bucket # 964
setting bunch_marker_a to RF_bucket # 976
setting bunch_marker_a to RF_bucket # 988
setting bunch_marker_a to RF_bucket # 1000
setting bunch_marker_a to RF_bucket # 1012
setting bunch_marker_a to RF_bucket # 1024
setting bunch_marker_a to RF_bucket # 1036
setting bunch_marker_a to RF_bucket # 1048
setting bunch_marker_a to RF_bucket # 1060
setting bunch_marker_a to RF_bucket # 1072
setting bunch_marker_a to RF_bucket # 1084
setting bunch_marker_a to RF_bucket # 1096
setting bunch_marker_a to RF_bucket # 1108
setting bunch_marker_a to RF_bucket # 1120
setting bunch_marker_a to RF_bucket # 1132
setting bunch_marker_a to RF_bucket # 1144
setting bunch_marker_a to RF_bucket # 1156
setting bunch_marker_a to RF_bucket # 1168
setting bunch_marker_a to RF_bucket # 1180
setting bunch_marker_a to RF_bucket # 1192
setting bunch_marker_a to RF_bucket # 1204
setting bunch_marker_a to RF_bucket # 1216
setting bunch_marker_a to RF_bucket # 1228
setting bunch_marker_a to RF_bucket # 1240
setting bunch_marker_a to RF_bucket # 1252
setting bunch_marker_a to RF_bucket # 1264
setting bunch_marker_a to RF_bucket # 1276
setting bunch_marker_a to RF_bucket # 1288
setting bunch_marker_a to RF_bucket # 1300
setting bunch_marker_a to RF_bucket # 1312
setting bunch_marker_a to RF_bucket # 1324
setting bunch_marker_a to RF_bucket # 1336
setting bunch_marker_a to RF_bucket # 1348
setting bunch_marker_a to RF_bucket # 1360
setting bunch_marker_a to RF_bucket # 1372
setting bunch_marker_a to RF_bucket # 1384
setting bunch_marker_a to RF_bucket # 1396
setting bunch_marker_a to RF_bucket # 1408
setting bunch_marker_a to RF_bucket # 1420
setting bunch_marker_a to RF_bucket # 1432
setting bunch_marker_a to RF_bucket # 1444
setting bunch_marker_a to RF_bucket # 1456
setting bunch_marker_a to RF_bucket # 1468
setting bunch_marker_a to RF_bucket # 1480
setting bunch_marker_a to RF_bucket # 1492
setting bunch_marker_a to RF_bucket # 1504
setting bunch_marker_a to RF_bucket # 1516
setting bunch_marker_a to RF_bucket # 1528
setting bunch_marker_a to RF_bucket # 1540
setting bunch_marker_a to RF_bucket # 1552
setting bunch_marker_a to RF_bucket # 1564
setting bunch_marker_a to RF_bucket # 1576
setting bunch_marker_a to RF_bucket # 1588
setting bunch_marker_a to RF_bucket # 1600
setting bunch_marker_a to RF_bucket # 1612
setting bunch_marker_a to RF_bucket # 1624
setting bunch_marker_a to RF_bucket # 1636
setting bunch_marker_a to RF_bucket # 1648
setting bunch_marker_a to RF_bucket # 1660
setting bunch_marker_a to RF_bucket # 1672
setting bunch_marker_a to RF_bucket # 1684
setting bunch_marker_a to RF_bucket # 1696
setting bunch_marker_a to RF_bucket # 1708
setting bunch_marker_a to RF_bucket # 1720
setting bunch_marker_a to RF_bucket # 1732
setting bunch_marker_a to RF_bucket # 1744
setting bunch_marker_a to RF_bucket # 1756
setting bunch_marker_a to RF_bucket # 1768
setting bunch_marker_a to RF_bucket # 1780
setting bunch_marker_a to RF_bucket # 1792
setting bunch_marker_a to RF_bucket # 1804
setting bunch_marker_a to RF_bucket # 1816
setting bunch_marker_a to RF_bucket # 1828
setting bunch_marker_a to RF_bucket # 1840
setting bunch_marker_a to RF_bucket # 1852
setting bunch_marker_a to RF_bucket # 1864
setting bunch_marker_a to RF_bucket # 1876
setting bunch_marker_a to RF_bucket # 1888
setting bunch_marker_a to RF_bucket # 1900
setting bunch_marker_a to RF_bucket # 1912
setting bunch_marker_a to RF_bucket # 1924
setting bunch_marker_a to RF_bucket # 1936
setting bunch_marker_a to RF_bucket # 1948
setting bunch_marker_a to RF_bucket # 1960
setting bunch_marker_a to RF_bucket # 1972
setting bunch_marker_a to RF_bucket # 1984
setting bunch_marker_a to RF_bucket # 1996
setting bunch_marker_a to RF_bucket # 2008
setting bunch_marker_a to RF_bucket # 2020
setting bunch_marker_a to RF_bucket # 2032
setting bunch_marker_a to RF_bucket # 2044
setting bunch_marker_a to RF_bucket # 2056
setting bunch_marker_a to RF_bucket # 2068
setting bunch_marker_a to RF_bucket # 2080
setting bunch_marker_a to RF_bucket # 2092
setting bunch_marker_a to RF_bucket # 2104
setting bunch_marker_a to RF_bucket # 2116
setting bunch_marker_a to RF_bucket # 2128
setting bunch_marker_a to RF_bucket # 2140
setting bunch_marker_a to RF_bucket # 2152
setting bunch_marker_a to RF_bucket # 2164
setting bunch_marker_a to RF_bucket # 2176
setting bunch_marker_a to RF_bucket # 2188
setting bunch_marker_a to RF_bucket # 2200
setting bunch_marker_a to RF_bucket # 2212
setting bunch_marker_a to RF_bucket # 2224
setting bunch_marker_a to RF_bucket # 2236
setting bunch_marker_a to RF_bucket # 2248
setting bunch_marker_a to RF_bucket # 2260
setting bunch_marker_a to RF_bucket # 2272
setting bunch_marker_a to RF_bucket # 2284
setting bunch_marker_a to RF_bucket # 2296
setting bunch_marker_a to RF_bucket # 2308
setting bunch_marker_a to RF_bucket # 2320
setting bunch_marker_a to RF_bucket # 2332
setting bunch_marker_a to RF_bucket # 2344
setting bunch_marker_a to RF_bucket # 2356
setting bunch_marker_a to RF_bucket # 2368
setting bunch_marker_a to RF_bucket # 2380
setting bunch_marker_a to RF_bucket # 2392
setting bunch_marker_a to RF_bucket # 2404
setting bunch_marker_a to RF_bucket # 2416
setting bunch_marker_a to RF_bucket # 2428
setting bunch_marker_a to RF_bucket # 2440
setting bunch_marker_a to RF_bucket # 2452
setting bunch_marker_a to RF_bucket # 2464
setting bunch_marker_a to RF_bucket # 2476
setting bunch_marker_a to RF_bucket # 2488
setting bunch_marker_a to RF_bucket # 2500
setting bunch_marker_a to RF_bucket # 2512
setting bunch_marker_a to RF_bucket # 2524
setting bunch_marker_a to RF_bucket # 2536
setting bunch_marker_a to RF_bucket # 2548
setting bunch_marker_a to RF_bucket # 2560
setting bunch_marker_a to RF_bucket # 2572
setting bunch_marker_a to RF_bucket # 2584
setting bunch_marker_a to RF_bucket # 2596
setting bunch_marker_a to RF_bucket # 2608
setting bunch_marker_a to RF_bucket # 2620
setting bunch_marker_a to RF_bucket # 2632
setting bunch_marker_a to RF_bucket # 2644
setting bunch_marker_a to RF_bucket # 2656
setting bunch_marker_a to RF_bucket # 2668
setting bunch_marker_a to RF_bucket # 2680
setting bunch_marker_a to RF_bucket # 2692
setting bunch_marker_a to RF_bucket # 2704
setting bunch_marker_a to RF_bucket # 2716
setting bunch_marker_a to RF_bucket # 2728
setting bunch_marker_a to RF_bucket # 2740
setting bunch_marker_a to RF_bucket # 2752
setting bunch_marker_a to RF_bucket # 2764
setting bunch_marker_a to RF_bucket # 2776
setting bunch_marker_a to RF_bucket # 2788
setting bunch_marker_a to RF_bucket # 2800
setting bunch_marker_a to RF_bucket # 2812
setting bunch_marker_a to RF_bucket # 2824
setting bunch_marker_a to RF_bucket # 2836
setting bunch_marker_a to RF_bucket # 2848
setting bunch_marker_a to RF_bucket # 2860
setting bunch_marker_a to RF_bucket # 2872
setting bunch_marker_a to RF_bucket # 2884
setting bunch_marker_a to RF_bucket # 2896
setting bunch_marker_a to RF_bucket # 2908
setting bunch_marker_a to RF_bucket # 2920
setting bunch_marker_a to RF_bucket # 2932
setting bunch_marker_a to RF_bucket # 2944
setting bunch_marker_a to RF_bucket # 2956
setting bunch_marker_a to RF_bucket # 2968
setting bunch_marker_a to RF_bucket # 2980
setting bunch_marker_a to RF_bucket # 2992
setting bunch_marker_a to RF_bucket # 3004
setting bunch_marker_a to RF_bucket # 3016
setting bunch_marker_a to RF_bucket # 3028
setting bunch_marker_a to RF_bucket # 3040
setting bunch_marker_a to RF_bucket # 3052
setting bunch_marker_a to RF_bucket # 3064
setting bunch_marker_a to RF_bucket # 3076
setting bunch_marker_a to RF_bucket # 3088
setting bunch_marker_a to RF_bucket # 3100
setting bunch_marker_a to RF_bucket # 3112
setting bunch_marker_a to RF_bucket # 3124
setting bunch_marker_a to RF_bucket # 3136
setting bunch_marker_a to RF_bucket # 3148
[0] 0/0
[0] 0/1
[0] 0/2
[0] 0/3
[0] 0/4
[0] 0/5
... 6778 more lines ...
Attachment 2: 2019-10-30.063506.waveforms.425events.png
2019-10-30.063506.waveforms.425events.png
  26   Wed Oct 30 15:23:57 2019 M. Andrewdocumentationsample waveform files
A sample waveform file from the reference boardstack at UH and the boardstack in the HER at KEK are attached (in tar bzip2 file).

The format of the files is as in the attached spreadsheet (start from cell C29 for the waveform data).

A parser for the data (raw datafiles as well as waveform files) is committed to the UH svn repo (in scripts_dev/) and also attached here.  See the functions events_from_waveformfile() and waveforms_from_waveformfile() for details.
Attachment 1: data_format_v2_6.with-raw-waveform-details.ods
Attachment 2: 2019-11-04.140943.waveforms.422events.png
2019-11-04.140943.waveforms.422events.png
Attachment 3: 2019-11-04.140943.datafile.bz2
Attachment 4: 2019-11-04.140943.waveforms.bz2
Attachment 5: 2019-11-05.064104.waveforms.424events.png
2019-11-05.064104.waveforms.424events.png
Attachment 6: 2019-11-05.064104.datafile.bz2
Attachment 7: 2019-11-05.064104.waveforms.bz2
Attachment 8: xrm.py
#!/bin/env python

# written 2019-01-28 by mza
# last updated 2019-11-04 by mza

import threading # Thread()
from B2L_common import *
from B2L_defs import *
from get_status import get_status
import ethudp
from DebugInfoWarningError24 import debug, info, warning, error, debug2, debug3, set_verbosity
import time # sleep()

BS = 0
set_verbosity(3)
frame_mask_shift = 16
frame_mask_all = 0b111111111 << frame_mask_shift
bunch_marker_first_valid = 4
initial_bunch_marker_of_interest = 1701
bunch_marker_last_valid = 5120 - 1
#number_of_64_sample_windows_per_beam_orbit = 427

def set_trigger_mask(s, c0, c1, c2, c3):
	write_register(SCROD_AxiCommon_trigMask, s, BS)
	write_register(CARRIER_AxiCommon_trigMask, c0, BS, 0)
	write_register(CARRIER_AxiCommon_trigMask, c1, BS, 1)
	write_register(CARRIER_AxiCommon_trigMask, c2, BS, 2)
	write_register(CARRIER_AxiCommon_trigMask, c3, BS, 3)

def mask_triggers(s=0xf, c0=0xf, c1=0xf, c2=0xf, c3=0xf):
	set_trigger_mask(s, c0, c1, c2, c3)

def unmask_triggers(s=0, c0=0, c1=0, c2=0, c3=0):
	set_trigger_mask(s, c0, c1, c2, c3)

def set_trig_prescale_N_log2(N_log2):
	write_register(SCROD_AxiCommon_trig_prescale_N_log2, N_log2, BS)

def get_xrm_trigger_enable_status():
	return read_register(SCROD_AxiCommon_xrm_trigger_enabled, BS)

def enable_xrm_triggers():
	write_register(SCROD_AxiCommon_xrm_trigger_enabled, 1, BS)

def disable_xrm_triggers():
	write_register(SCROD_AxiCommon_xrm_trigger_enabled, 0, BS)

def allow_xrm_triggers_for_a_while(duration=1.0):
	if be_verbose_when_collecting_data:
		info("allowing xrm triggers for " + str(int(1000.0*duration)/1000.0) + " seconds...")
	a = get_SCROD_eventCnt()
	enable_xrm_triggers()
	time.sleep(duration)
	disable_xrm_triggers()
	b = get_SCROD_eventCnt()
	diff = b - a
	return diff

def trigger_and_wait_for_xrm_triggers(duration=1.0):
#	if be_verbose_when_collecting_data:
#		info("allowing xrm triggers for " + str(int(1000.0*duration)/1000.0) + " seconds...")
	a = get_SCROD_eventCnt()
	if should_software_trigger:
		software_trigger(BS)
	else:
		write_register_without_readback_verification(SCROD_AxiCommon_clear_count_of_triggers_for_bunch_markers, 0xf, BS)
	wait_at_least_until_next_frame9()
	time.sleep(duration)
	b = get_SCROD_eventCnt()
	diff = b - a
	return diff

expected_trigger_rate = { 0:11150.0, 1:5560.0, 2:2780.0, 3:1390.0, 4:690.0, 5:350.0, 6:170.0, 7:90.0, 8:40.0, 9:20.0, 10:10.0, 11:5.0, 12:2.0, 13:1.0, 14:1.0, 15:1.0, 16:1.0, 17:1.0, 18:1.0 }
def generate_histogram_of_trigger_rate_versus_prescale_N_log2(start, end):
	global expected_trigger_rate
	old_desired_trigger_quantities = set_desired_trigger_quantities(0, 0, 0, 0)
	mask_triggers()
	#max_rate = 151000.0
	for i in range(start, end+1):
		set_trig_prescale_N_log2(i)
		#duration = 40.0 * (2.0**i) / max_rate
		duration = 0.1
		#info(duration)
		if i > 10:
			duration = 1.0
		diff = allow_xrm_triggers_for_a_while(duration)
		#info(str(diff))
		rate = diff / duration
		expected_trigger_rate[i] = rate
		info("[" + str(i) + "]: " + str(rate))
	set_desired_trigger_quantities(old_desired_trigger_quantities[0], old_desired_trigger_quantities[1], old_desired_trigger_quantities[2], old_desired_trigger_quantities[3])

def get_SCROD_eventCnt(should_show_it=0):
	SCROD_eventCnt = read_register(SCROD_AxiCommon_eventCnt, BS)
	if should_show_it:
		info("SCROD_eventCnt: " + str(SCROD_eventCnt))
	return SCROD_eventCnt

def get_carrier_eventCnts(should_show_them=0):
	if 5==number_of_carriers[BS] or 0==number_of_carriers[BS]:
		return
	eventCnt = []
	if 1 <= number_of_carriers[BS]:
		carrier0_eventCnt = read_register(CARRIER_AxiCommon_eventCnt, BS, 0)
		eventCnt.append(carrier0_eventCnt)
		if should_show_them:
			info("carrier0_eventCnt: " + str(carrier0_eventCnt))
	if 2 <= number_of_carriers[BS]:
		carrier1_eventCnt = read_register(CARRIER_AxiCommon_eventCnt, BS, 1)
		eventCnt.append(carrier1_eventCnt)
		if should_show_them:
			info("carrier1_eventCnt: " + str(carrier1_eventCnt))
	if 3 <= number_of_carriers[BS]:
		carrier2_eventCnt = read_register(CARRIER_AxiCommon_eventCnt, BS, 2)
		eventCnt.append(carrier2_eventCnt)
		if should_show_them:
			info("carrier2_eventCnt: " + str(carrier2_eventCnt))
	if 4 <= number_of_carriers[BS]:
		carrier3_eventCnt = read_register(CARRIER_AxiCommon_eventCnt, BS, 3)
		eventCnt.append(carrier3_eventCnt)
		if should_show_them:
			info("carrier3_eventCnt: " + str(carrier3_eventCnt))
	return eventCnt

def set_readout_window_to_match_bunch(bunch):
	write_register_for_each_asic(CARRIER_IRSX_readoutLookback, int(bunch/RF_buckets_per_read_window), BS)

def set_bunch_marker(bunch_marker_number, frame_mask, value):
	set_readout_window_to_match_bunch(value)
	value &= ~frame_mask_all
	value |= frame_mask << frame_mask_shift
	#info(hex(value))
	if 0==bunch_marker_number:
		write_register(SCROD_AxiCommon_bunch_marker_a, value, BS)
	if 1==bunch_marker_number:
		write_register(SCROD_AxiCommon_bunch_marker_b, value, BS)
	if 2==bunch_marker_number:
		write_register(SCROD_AxiCommon_bunch_marker_c, value, BS)
	if 3==bunch_marker_number:
		write_register(SCROD_AxiCommon_bunch_marker_d, value, BS)

#def set_bunch_markers(a, b, c, d):
#	a |= frame_mask_all
#	b |= frame_mask_all
#	c |= frame_mask_all
#	d |= frame_mask_all
#	#a &= ~frame_mask_all
#	#b &= ~frame_mask_all
#	#c &= ~frame_mask_all
#	#d &= ~frame_mask_all
#	#a |= (1<<0)<<frame_mask_shift
#	#b |= (1<<5)<<frame_mask_shift
#	#c |= (1<<6)<<frame_mask_shift
#	#d |= (1<<7)<<frame_mask_shift
#	write_register(SCROD_AxiCommon_bunch_marker_a, a, BS)
#	write_register(SCROD_AxiCommon_bunch_marker_b, b, BS)
#	write_register(SCROD_AxiCommon_bunch_marker_c, c, BS)
#	write_register(SCROD_AxiCommon_bunch_marker_d, d, BS)
#
#def set_quadbunch_markers(a, b, c, d):
#	set_bunch_markers(4*a, 4*b, 4*c, 4*d)
#
#def set_asic_write_window_bunch_markers(a, b, c, d):
#	#calculate_parameters(4)
#	#calculate_parameters(6)
#	#calculate_parameters(8)
#	#set_bunch_markers(16*a, 16*b, 16*c, 16*d)
#	set_bunch_markers(24*a, 24*b, 24*c, 24*d)
#	#set_bunch_markers(32*a, 32*b, 32*c, 32*d)

def set_desired_trigger_quantities(a, b, c, d):
	old_a = read_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_a, BS)
	old_b = read_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_b, BS)
	old_c = read_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_c, BS)
	old_d = read_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_d, BS)
	write_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_a, a, BS)
	write_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_b, b, BS)
	write_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_c, c, BS)
	write_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_d, d, BS)
	return old_a, old_b, old_c, old_d

def calculate_parameters(SST_clock_divide_ratio=6, should_print_info=0):
	# 5120 / 4 = 1280 FTSW clocks per frame
	# 5120 buckets / 508.8875 MHz = 10.0611628307 us per frame
	#
	# 127.221875 MHz / 6 = 21.203645833 MHz
	# 128 samples per write window * 21.203645833 MHz SST = 2714.066666 MHz sampling rate
	# 1/21.203645833 MHz = 47.1617007689 ns per write window
	# 10.0611628307 us / 47.1617007689 ns = 213.333333 write windows per revolution
	# 5120 / 213.333333 = 24.0 bunches per window
	# 6.0 FTSW bunches per window
	#
	# 127.221875 MHz / 8 = 15.902734375 MHz
	# 128 samples per write window * 15.902734375 MHz SST = 2035.55 MHz sampling rate
	# 1/15.902734375 MHz = 62.882268 ns per write window
	# 10.0611628307 us / 62.882268 ns = 160 write windows per revolution
	# 5120 / 160 = 32.0 bunches per window
	# 8.0 FTSW bunches per window
	global RF_clock_Hz
	RF_clock_Hz = 508.8875e6
	global period_of_RF_clock_ns
	period_of_RF_clock_ns = 1.0e9 / RF_clock_Hz
	global RF_buckets
	RF_buckets = 5120
	global asic_samples_per_write_window
	asic_samples_per_write_window = 128
	global FTSW_clock_divide_ratio
	FTSW_clock_divide_ratio = 4
	global revolution_duration_s
	revolution_duration_s = RF_buckets / RF_clock_Hz
	global SST_clock_Hz
	SST_clock_Hz = RF_clock_Hz / FTSW_clock_divide_ratio / SST_clock_divide_ratio
	global sampling_rate_Hz
	sampling_rate_Hz = SST_clock_Hz * asic_samples_per_write_window
	global write_window_duration_s
	write_window_duration_s = 1.0 / SST_clock_Hz
	global read_window_duration_s
	read_window_duration_s = write_window_duration_s / 2.0
	global write_windows_per_revolution
	write_windows_per_revolution = revolution_duration_s / write_window_duration_s
	global read_windows_per_revolution
	read_windows_per_revolution = revolution_duration_s / read_window_duration_s
	global RF_buckets_per_write_window
	RF_buckets_per_write_window = RF_buckets / write_windows_per_revolution
	global RF_buckets_per_read_window
	RF_buckets_per_read_window = RF_buckets / read_windows_per_revolution
	global FTSW_clocks_per_write_window
	FTSW_clocks_per_write_window = RF_buckets_per_write_window / FTSW_clock_divide_ratio
	global FTSW_clocks_per_read_window
	FTSW_clocks_per_read_window = RF_buckets_per_read_window / FTSW_clock_divide_ratio
	if should_print_info:
		info("revolution_duration_us: " + str(revolution_duration_s*1.0e6))
		info("SST_clock_MHz: " + str(SST_clock_Hz/1.0e6))
		info("sampling_rate_GHz: " + str(sampling_rate_Hz/1.0e9))
		info("write_window_duration_ns : " + str(write_window_duration_s*1.0e9))
		info("read_window_duration_ns : " + str(read_window_duration_s*1.0e9))
		info("write_windows_per_revolution: " + str(write_windows_per_revolution))
		info("read_windows_per_revolution: " + str(read_windows_per_revolution))
		info("RF_buckets_per_write_window: " + str(RF_buckets_per_write_window))
		info("RF_buckets_per_read_window: " + str(RF_buckets_per_read_window))
		info("FTSW_clocks_per_write_window: " + str(FTSW_clocks_per_write_window))
		info("FTSW_clocks_per_read_window: " + str(FTSW_clocks_per_read_window))

def decode_frame_mask(frame_mask):
	frame_mask &= frame_mask_all
	frame_mask >>= frame_mask_shift
	list = []
	if frame_mask & 0x100:
		list.append(0)
	if frame_mask & 0x080:
		list.append(1)
	if frame_mask & 0x040:
		list.append(2)
	if frame_mask & 0x020:
		list.append(3)
	if frame_mask & 0x010:
		list.append(4)
	if frame_mask & 0x008:
		list.append(5)
	if frame_mask & 0x004:
		list.append(6)
	if frame_mask & 0x002:
		list.append(7)
	if frame_mask & 0x001:
		list.append(8)
	return list

def show_frame_masks():
	a = read_register(SCROD_AxiCommon_bunch_marker_a, BS)
	af = decode_frame_mask(a)
	a &= ~frame_mask_all
	info("a: " + str(af) + " " + str(a))
	b = read_register(SCROD_AxiCommon_bunch_marker_b, BS)
	bf = decode_frame_mask(b)
	b &= ~frame_mask_all
	info("b: " + str(bf) + " " + str(b))
	c = read_register(SCROD_AxiCommon_bunch_marker_c, BS)
	cf = decode_frame_mask(c)
	c &= ~frame_mask_all
	info("c: " + str(cf) + " " + str(c))
	d = read_register(SCROD_AxiCommon_bunch_marker_d, BS)
	df = decode_frame_mask(d)
	d &= ~frame_mask_all
	info("d: " + str(df) + " " + str(d))
	info("total frame masks active: " + str(count_frame_masks()))

def count_frame_masks():
	a = read_register(SCROD_AxiCommon_bunch_marker_a, BS)
	ac = len(decode_frame_mask(a))
	b = read_register(SCROD_AxiCommon_bunch_marker_b, BS)
	bc = len(decode_frame_mask(b))
	c = read_register(SCROD_AxiCommon_bunch_marker_c, BS)
	cc = len(decode_frame_mask(c))
	d = read_register(SCROD_AxiCommon_bunch_marker_d, BS)
	dc = len(decode_frame_mask(d))
	total = ac + bc + cc + dc
	return total

def show_xrm_trigger_enable_status():
	en = read_register(SCROD_AxiCommon_xrm_trigger_enabled, BS)
... 1246 more lines ...
  27   Tue Nov 5 11:47:36 2019 M. Andrewdocumentationinstructions on taking data around a desired RF bucket
This mode of operation is useful when you've located your RF bucket of interest and want to focus on taking data at that position.

First, ensure the boardstack is powered, programmed and configured.

Then, make sure the ".config" file in ~/build/uh-svn-repo/trunk/software/b2l/scripts_dev/ has a line declaring the xrm_mode is "acquire" and plot_continuous is set to 1 and xrm_run_continuous is set to 1:

xrm_run_continuous=1
plot_continuous=1
xrm_mode="acquire"

Choose your bunch marker like so (in the same .config file):

desired_RF_bucket=762
RF_bucket_sample_offset=-1

After that, to acquire data, simply run ./xrm.py from ~/build/uh-svn-repo/trunk/software/b2l/scripts_dev/ (see attachment for example output).
Attachment 1: 2019-11-05.121045.waveforms.0099.png
2019-11-05.121045.waveforms.0099.png
  28   Mon Nov 18 13:30:44 2019 M. Andrewdocumentationfirst light!
A video of a time series of waveforms for first light (recorded 2019-11-15) is posted here:

https://www.youtube.com/watch?v=IVVIYGwrBqI
  29   Mon Nov 18 14:06:31 2019 M. Andrewdocumentationconfig file
Below is a list of all possible config file options that are interpreted/used by the xrm.py code.  The filename is ".config" and it must be located in "${HOME}/build/uh-svn-repo/trunk/software/b2l/scripts_dev/"

For svn checkouts where (re)parsing & (re)plotting data is going to be the only valid operation, be sure to set fake_it="yes" and xrm_mode="parse" among other things (see below).  Please note that the config file parser can't handle spaces between the variable name and the equals sign (also between the equals sign and the value or beginning quote (for strings), so xrm_mode = "parse" won't work but xrm_mode="parse" will.

mode="eth"
local_IP=""
fake_it="yes"
remote_IP="192.168.10.16"
remote_port="8192"
ethernet_device="blah"

# for threshScan1boardstack.py:
maximum_iterations=2000
step_initial_when_reading_from_file=1
step_initial_when_from_seed_value=1
number_of_channels_to_get_before_quitting_threshold_scan=64

# for xrm.py:
xrm_run_continuous=0
plot_continuous=1
show_plot=0
datafilesize=20000000
be_verbose_when_collecting_data=0
use_pedestal_subtraction_mode=1
retake_pedestals_at_every_filechange=0
desired_pause_between_acquisitions=0
should_cycle_slowly_through_bunch_markers=0
desired_RF_bucket=4270
RF_bucket_sample_offset=0
multicast_cal_signal=1
enable_cal_signal=0
should_plot_beam_current=1

sweep_start_bucket=4
#sweep_start_bucket=772 # 64 windows
#sweep_start_bucket=2308

#sweep_end_bucket=772 # 64 windows
#sweep_end_bucket=1540 # 128 windows
#sweep_end_bucket=2308 # 192 windows
#sweep_end_bucket=3076 # 256 windows
#sweep_end_bucket=3844 # 320 windows
#sweep_end_bucket=4612 # 384 windows
sweep_end_bucket=5116 # 426 windows

#xrm_mode="sweep"
#xrm_mode="acquire"
xrm_mode="parse"
  30   Wed Nov 6 13:35:45 2024 M. Andrewdocumentationsample waveform files
Attached is a sample datafile (in raw, root and waveforms formats) showing self-pulser data taken in April 2024, along with the most recent version of the xrm.py script.
Attachment 1: 2024-04-17.135507.zip
Attachment 2: 2024-04-17.135507.waveforms.32windows.png
2024-04-17.135507.waveforms.32windows.png
Attachment 3: xrm.py
#!/bin/env python3

# written 2019-01-28 by mza
# last updated 2023-09-26 by mza

import threading # Thread()
from math import *
from B2L_common import *
from B2L_defs import *
from get_status import get_status
import ethudp
from DebugInfoWarningError import debug, info, warning, error, debug2, debug3, set_verbosity
import time # sleep()
import struct # unpack_from
import pytz # pytz - sudo apt install -y python-pip; sudo pip2 install pytz
#import datetime
import matplotlib.dates as mdates # sudo pip2 install matplotlib
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from math import ceil
# sudo apt install -y python-pip python3-pip python-tk
# python -m pip install --user -U pip
# python -m pip install --user -U matplotlib
# python -m pip install --user -U scipy
import matplotlib.pyplot as plt # sudo apt install -y python-cairocffi
import matplotlib.gridspec as gridspec
#import matplotlib.image as mpl_img
from matplotlib.ticker import (MultipleLocator, FormatStrFormatter, AutoMinorLocator)
import numpy
import tkinter # sudo apt install -y python3-tk
from PIL import Image, ImageTk # sudo apt-get install -y python3-pil.imagetk

def print_ROOT_usage():
	print("ROOT environment not setup yet")
	HOME = os.environ['HOME']
	potential_locations = [ "/usr/local/bin", HOME + "/build/root/bin" ]
	filename = "thisroot.sh"
	for location in potential_locations:
		potential_filename = location + "/" + filename
		if os.path.isfile(potential_filename):
			#print(". " + HOME + "/build/root/bin/thisroot.sh; " + str(sys.argv))
			print(". " + potential_filename)
	#info(sys.argv[0] + sys.argv[1:])
	#info(" ".join(sys.argv[0:]))
	sys.exit(1)

try:
	import ROOT # TH1F
	info("using ROOT")
	should_use_ROOT = True
except:
	should_use_ROOT = False
	info("not using ROOT")
	#print_ROOT_usage()
#ROOT.gROOT.SetBatch(True)

BS = 0
frame_mask_shift = 16
frame_mask_all = 0b111111111 << frame_mask_shift
bunch_marker_first_valid = 4
initial_bunch_marker_of_interest = 1701
desired_RF_bucket = initial_bunch_marker_of_interest
RF_buckets = 5120
bunch_marker_last_valid = RF_buckets - 1
#number_of_64_sample_windows_per_beam_orbit = 427

pedestal_subtraction_amount = 1000
stagger_amount = 50
ch_adc_min = 0 - 300
ch_adc_max = 128 * stagger_amount + 300
maximum_absolute_value_before_issuing_warning = 1000
slice_lower_limit = -250
slice_upper_limit = 300

should_plot_slice = 0
#should_plot_sweep = 1
#should_plot_zoomed_waveforms = 1
#number_of_zoomed_waveforms_to_plot = 4
should_generate_png = 1
should_generate_pdf = 0

gui_update_period_ms = 200

linewidth = 0.3
dpi = 100.0

duration_in_ns_of_64_sample_waveform = 23.58
desired_x_axis = "time"
desired_physical_window_numbers = [ w for w in range(425) ]
starting_physical_window_number = 0
ending_physical_window_number = starting_physical_window_number + 425

revolution_marker_offset_in_RF_buckets = 4370.5
bunch_current_offset = -260.0
bunch_current_scale = 350.0

current_gridstep = 200.0 # in mA
nbunches_gridstep = 400

def set_trigger_mask(s, c0, c1, c2, c3):
	write_register(SCROD_AxiCommon_trigMask, s, BS)
	write_register(CARRIER_AxiCommon_trigMask, c0, BS, 0)
	write_register(CARRIER_AxiCommon_trigMask, c1, BS, 1)
	write_register(CARRIER_AxiCommon_trigMask, c2, BS, 2)
	write_register(CARRIER_AxiCommon_trigMask, c3, BS, 3)

def mask_triggers(s=0xf, c0=0xf, c1=0xf, c2=0xf, c3=0xf):
	set_trigger_mask(s, c0, c1, c2, c3)

def unmask_triggers(s=0, c0=0, c1=0, c2=0, c3=0):
	set_trigger_mask(s, c0, c1, c2, c3)

def set_trig_prescale_N_log2(N_log2):
	write_register(SCROD_AxiCommon_trig_prescale_N_log2, N_log2, BS)

def get_xrm_trigger_enable_status():
	return read_register(SCROD_AxiCommon_xrm_trigger_enabled, BS)

def enable_xrm_triggers():
	write_register(SCROD_AxiCommon_xrm_trigger_enabled, 1, BS)

def disable_xrm_triggers():
	write_register(SCROD_AxiCommon_xrm_trigger_enabled, 0, BS)

def allow_xrm_triggers_for_a_while(duration=1.0):
	if be_verbose_when_collecting_data:
		info("allowing xrm triggers for " + str(int(1000.0*duration)/1000.0) + " seconds...")
	a = get_SCROD_eventCnt()
	enable_xrm_triggers()
	time.sleep(duration)
	disable_xrm_triggers()
	b = get_SCROD_eventCnt()
	diff = b - a
	info("eventCnt difference: " + str(diff))
	return diff

def trigger_and_wait_for_xrm_triggers(duration=1.0):
#	if be_verbose_when_collecting_data:
#		info("allowing xrm triggers for " + str(int(1000.0*duration)/1000.0) + " seconds...")
	a = get_SCROD_eventCnt()
	if should_software_trigger:
		software_trigger(BS)
	else:
		write_register_without_readback_verification(SCROD_AxiCommon_clear_count_of_triggers_for_bunch_markers, 0xf, BS)
	wait_at_least_until_next_frame9()
	time.sleep(duration)
	b = get_SCROD_eventCnt()
	diff = b - a
	info("eventCnt difference: " + str(diff))
	return diff

expected_trigger_rate = { 0:11150.0, 1:5560.0, 2:2780.0, 3:1390.0, 4:690.0, 5:350.0, 6:170.0, 7:90.0, 8:40.0, 9:20.0, 10:10.0, 11:5.0, 12:2.0, 13:1.0, 14:1.0, 15:1.0, 16:1.0, 17:1.0, 18:1.0 }
def generate_histogram_of_trigger_rate_versus_prescale_N_log2(start, end):
	global expected_trigger_rate
	old_desired_trigger_quantities = set_desired_trigger_quantities(0, 0, 0, 0)
	mask_triggers()
	#max_rate = 151000.0
	for i in range(start, end+1):
		set_trig_prescale_N_log2(i)
		#duration = 40.0 * (2.0**i) / max_rate
		duration = 0.1
		#info(duration)
		if i > 10:
			duration = 1.0
		diff = allow_xrm_triggers_for_a_while(duration)
		#info(str(diff))
		rate = diff / duration
		expected_trigger_rate[i] = rate
		info("[" + str(i) + "]: " + str(rate))
	set_desired_trigger_quantities(old_desired_trigger_quantities[0], old_desired_trigger_quantities[1], old_desired_trigger_quantities[2], old_desired_trigger_quantities[3])

def get_SCROD_eventCnt(should_show_it=0):
	SCROD_eventCnt = read_register(SCROD_AxiCommon_eventCnt, BS)
	if should_show_it:
		info("SCROD_eventCnt: " + str(SCROD_eventCnt))
	return SCROD_eventCnt

def get_carrier_eventCnts(should_show_them=0):
	if 5==number_of_carriers[BS] or 0==number_of_carriers[BS]:
		return
	eventCnt = []
	if 1 <= number_of_carriers[BS]:
		carrier0_eventCnt = read_register(CARRIER_AxiCommon_eventCnt, BS, 0)
		eventCnt.append(carrier0_eventCnt)
		if should_show_them:
			info("carrier0_eventCnt: " + str(carrier0_eventCnt))
	if 2 <= number_of_carriers[BS]:
		carrier1_eventCnt = read_register(CARRIER_AxiCommon_eventCnt, BS, 1)
		eventCnt.append(carrier1_eventCnt)
		if should_show_them:
			info("carrier1_eventCnt: " + str(carrier1_eventCnt))
	if 3 <= number_of_carriers[BS]:
		carrier2_eventCnt = read_register(CARRIER_AxiCommon_eventCnt, BS, 2)
		eventCnt.append(carrier2_eventCnt)
		if should_show_them:
			info("carrier2_eventCnt: " + str(carrier2_eventCnt))
	if 4 <= number_of_carriers[BS]:
		carrier3_eventCnt = read_register(CARRIER_AxiCommon_eventCnt, BS, 3)
		eventCnt.append(carrier3_eventCnt)
		if should_show_them:
			info("carrier3_eventCnt: " + str(carrier3_eventCnt))
	return eventCnt

def set_desired_trigger_quantities(a, b, c, d):
	old_a = read_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_a, BS)
	old_b = read_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_b, BS)
	old_c = read_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_c, BS)
	old_d = read_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_d, BS)
	write_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_a, a, BS)
	write_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_b, b, BS)
	write_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_c, c, BS)
	write_register(SCROD_AxiCommon_desired_trigger_quantity_for_bunch_marker_d, d, BS)
	return old_a, old_b, old_c, old_d

def calculate_parameters(SST_clock_divide_ratio=6, should_print_info=0):
	# 5120 / 4 = 1280 FTSW clocks per frame
	# 5120 buckets / 508.8875 MHz = 10.0611628307 us per frame
	#
	# 127.221875 MHz / 6 = 21.203645833 MHz
	# 128 samples per write window * 21.203645833 MHz SST = 2714.066666 MHz sampling rate
	# 1/21.203645833 MHz = 47.1617007689 ns per write window
	# 10.0611628307 us / 47.1617007689 ns = 213.333333 write windows per revolution
	# 5120 / 213.333333 = 24.0 bunches per window
	# 6.0 FTSW bunches per window
	#
	# 127.221875 MHz / 8 = 15.902734375 MHz
	# 128 samples per write window * 15.902734375 MHz SST = 2035.55 MHz sampling rate
	# 1/15.902734375 MHz = 62.882268 ns per write window
	# 10.0611628307 us / 62.882268 ns = 160 write windows per revolution
	# 5120 / 160 = 32.0 bunches per window
	# 8.0 FTSW bunches per window
	global RF_clock_Hz
	RF_clock_Hz = 508.8875e6
	global period_of_RF_clock_ns
	period_of_RF_clock_ns = 1.0e9 / RF_clock_Hz
	global asic_samples_per_write_window
	asic_samples_per_write_window = 128
	global asic_samples_per_read_window
	asic_samples_per_read_window = asic_samples_per_write_window // 2
	global FTSW_clock_divide_ratio
	FTSW_clock_divide_ratio = 4
	global revolution_duration_s
	revolution_duration_s = RF_buckets / RF_clock_Hz
	global SST_clock_Hz
	SST_clock_Hz = RF_clock_Hz / FTSW_clock_divide_ratio / SST_clock_divide_ratio
	global sampling_rate_Hz
	sampling_rate_Hz = SST_clock_Hz * asic_samples_per_write_window
	global write_window_duration_s
	write_window_duration_s = 1.0 / SST_clock_Hz
	global read_window_duration_s
	read_window_duration_s = write_window_duration_s / 2.0
	global write_windows_per_revolution
	write_windows_per_revolution = revolution_duration_s / write_window_duration_s
	global read_windows_per_revolution
	read_windows_per_revolution = revolution_duration_s / read_window_duration_s
	global RF_buckets_per_write_window
	RF_buckets_per_write_window = RF_buckets // write_windows_per_revolution
	global RF_buckets_per_read_window
	RF_buckets_per_read_window = RF_buckets // read_windows_per_revolution
	global FTSW_clocks_per_write_window
	FTSW_clocks_per_write_window = RF_buckets_per_write_window // FTSW_clock_divide_ratio
	global FTSW_clocks_per_read_window
	FTSW_clocks_per_read_window = RF_buckets_per_read_window // FTSW_clock_divide_ratio
	global asic_samples_per_RF_bucket
	asic_samples_per_RF_bucket = asic_samples_per_read_window // RF_buckets_per_read_window
	global total_number_of_physical_windows
	total_number_of_physical_windows = 512
	if should_print_info:
		info("revolution_duration_us: " + str(revolution_duration_s*1.0e6))
		info("SST_clock_MHz: " + str(SST_clock_Hz/1.0e6))
		info("sampling_rate_GHz: " + str(sampling_rate_Hz/1.0e9))
		info("write_window_duration_ns : " + str(write_window_duration_s*1.0e9))
		info("read_window_duration_ns : " + str(read_window_duration_s*1.0e9))
		info("write_windows_per_revolution: " + str(write_windows_per_revolution))
		info("read_windows_per_revolution: " + str(read_windows_per_revolution))
		info("RF_buckets_per_write_window: " + str(RF_buckets_per_write_window))
		info("RF_buckets_per_read_window: " + str(RF_buckets_per_read_window))
		info("FTSW_clocks_per_write_window: " + str(FTSW_clocks_per_write_window))
		info("FTSW_clocks_per_read_window: " + str(FTSW_clocks_per_read_window))

def show_xrm_trigger_enable_status():
	en = read_register(SCROD_AxiCommon_xrm_trigger_enabled, BS)
	info("xrm trigger enabled: " + str(en))

def show_relevant_registers():
	#get_SCROD_eventCnt(1)
	#get_carrier_eventCnts(1)
	show_frame_masks()
	nlog2 = read_register(SCROD_AxiCommon_trig_prescale_N_log2, BS)
	info("N_log2 prescale: " + str(nlog2))
	show_xrm_trigger_enable_status()
	show_asic_timeouts(BS)
	show_SEM_status(BS)

def show_some_info():
	info("")
	show_current_time()
	show_asic_timeouts(BS)
	get_SCROD_eventCnt(1)
	get_carrier_eventCnts(1)
	show_relevant_registers()
... 3541 more lines ...
  31   Mon Feb 3 08:22:06 2025 M. Andrewdocumentationconfig file
Attached is the updated .config file for 2025.
Attachment 1: .config
mode="eth"
local_IP=""
fake_it="no"
remote_port="8192"
#ethernet_device="eth0"
ethernet_device="enp4s0"

# good:
#remote_IP="192.168.10.4" # installed in HER
#remote_IP="192.168.10.108"
#remote_IP="192.168.10.49" # on bench in HI
#remote_IP="192.168.10.9" # revB
remote_IP="192.168.10.33" # inside laser dark box
#remote_IP="192.168.10.86"
#remote_IP="192.168.10.89"
#remote_IP="192.168.10.101"

# revB + hookup2:
#remote_IP="192.168.10.6" # scrod revB + hookup2

#remote_IP="192.168.10.27" # frankenstack

# 2023 newly minted TOP boardstacks:
#remote_IP="192.168.10.73" # 
#remote_IP="192.168.10.23" # former s16b (bad DDR)
#remote_IP="192.168.10.87" # 
#remote_IP="192.168.10.102" # 
#remote_IP="192.168.10.73" # 
#remote_IP="192.168.10.35" # 
#remote_IP="192.168.10.87" # 

# bad DDR:
#remote_IP="192.168.10.30"
#remote_IP="192.168.10.58"
#remote_IP="192.168.10.93"

# for threshScan1boardstack.py:
maximum_iterations=2000
step_initial_when_reading_from_file=2
step_initial_when_from_seed_value=2
#number_of_channels_to_get_before_quitting_threshold_scan=64
number_of_channels_to_get_before_quitting_threshold_scan=128

# for xrm.py:
xrm_run_continuous=0
plot_continuous=1
show_plot=0
datafilesize=20000000
be_verbose_when_collecting_data=0
use_pedestal_subtraction_mode=1
retake_pedestals_at_every_filechange=0
desired_pause_between_acquisitions=0
should_cycle_slowly_through_bunch_markers=0
multicast_cal_signal=1
enable_cal_signal=1
should_plot_beam_current=0
should_write_root_tree=1

oserdes_always_value=0b00000000
oserdes_triggered_value=0b11100000

carriers_to_use="0123"
#plot_width=1800
#plot_height=800
plot_width=1920
plot_height=1080

desired_RF_bucket=214
RF_bucket_sample_offset=0

sweep_start_bucket=4
#sweep_start_bucket=772 # 64 windows
#sweep_start_bucket=2308

#sweep_end_bucket=196 # 16 windows
#sweep_end_bucket=292 # 24 windows
#sweep_end_bucket=388 # 32 windows
#sweep_end_bucket=772 # 64 windows
#sweep_end_bucket=1540 # 128 windows
#sweep_end_bucket=2308 # 192 windows
#sweep_end_bucket=3076 # 256 windows
#sweep_end_bucket=3844 # 320 windows
#sweep_end_bucket=4612 # 384 windows
sweep_end_bucket=5116 # 426 windows

xrm_mode="sweep"
#xrm_mode="acquire"
#xrm_mode="parse"
#xrm_mode="reconfig"
#xrm_mode="pedestal"

ELOG V3.1.5-3a5f2f0