It's been a while since I
built the CERNLIB libraries on my laptop. Since then the old laptop has finally failed and I've installed CERNLIB from the Ubuntu repositories, so I thought it was time to try and load my old data files again.
The data are saved as binary ntuples packaged as .rz files. So, to begin I tested opening them in PAW (Physics Analysis Workstation).
To load, simply run paw, take the default workstation type and enter:
hi/file 1 mc96_2.rz
jonathan@jonathan-Inspiron-5759:~/Development/Physics$ paw
******************************************************
* *
* W E L C O M E to P A W *
* *
* Version 2.14/04 12 January 2004 *
* *
******************************************************
Workstation type (?=HELP) <CR>=1 :
Version 1.29/04 of HIGZ started
PAW > hi/file 1 mc96_2.rz 4096
PAW >
The arguments are:
- '1' is the 'logical unit' of the file
- The filename, 'mc96_2.rz'
- Record length in words (I saved the data back in the day with 4096) It's important this is included or a segmentation error is returned:
PAW > hi/file 1 mc96_2.rz
*** Break *** Segmentation violation
Traceq lun = 0, level = 99
TRACEQ. In-line trace-back still not available.
Longjump
PAW >
The structure of the ntuple currently loaded in memory can be seen with
nt/print 10
(10 is the ntuple identifier. Again, I originally saved it with this value)
PAW > nt/print 10
******************************************************************
* Ntuple ID = 10 Entries = 5882 ntuple
******************************************************************
* Var numb * Type * Packing * Range * Block * Name *
******************************************************************
* 1 * R*4 * * * FLT * TrigDat(15)
* 1 * I*4 * * * TLT * TLT(15)
* 1 * R*4 * * * TRK * VCT_XVC
* 2 * R*4 * * * TRK * VCT_YVC
* 3 * R*4 * * * TRK * VCT_ZVC
* 4 * I*4 * * * TRK * NVTRKC
* 5 * I*4 * * * TRK * NTRKC
* 6 * R*4 * * * TRK * CHVCC
...
******************************************************************
* Block * Entries * Unpacked * Packed * Packing Factor *
******************************************************************
* FLT * 5882 * 60 * 60 * 1.000 *
* TLT * 5882 * 60 * 60 * 1.000 *
* TRK * 5882 * 40 * 40 * 1.000 *
* CAL * 5882 * 60 * 60 * 1.000 *
* ELEC * 5882 * 144 * 144 * 1.000 *
* ZUFOS1 * 5882 * 16 * 16 * 1.000 *
* ZUFOS2 * 5882 * 4 * 4 * 1.000 *
* ZUFOS3 * 5882 * 12 * 12 * 1.000 *
* ZUFOS4 * 5882 * 96 * 96 * 1.000 *
* ZUFOS5 * 5882 * 16 * 16 * 1.000 *
* TEMP * 5882 * 8 * 8 * 1.000 *
* TAG1 * 5882 * 4 * 4 * 1.000 *
* TAG2 * 5882 * 4 * 4 * 1.000 *
* LUMI1 * 5882 * 12 * 12 * 1.000 *
* LUMI2 * 5882 * 12 * 12 * 1.000 *
* GEN * 5882 * 32 * 29 * 1.103 *
* MCTRUE * 5882 * 88 * 88 * 1.000 *
* BGDTUP * 5882 * 28 * 28 * 1.000 *
* Total * --- * 696 * 693 * 1.004 *
******************************************************************
* Blocks = 18 Variables = 126 Columns = 174 *
******************************************************************
And to page through the data use
nt/scan 10
PAW > nt/scan 10
/NTUPLE/SCAN: Only showing first 30 of expressions
+-------+--------------+-------------+--------------+--------------+--------------+-------------+-------------+--------------+-----
| Event | TrigDat | TLT | VCT_XVC | VCT_YVC | VCT_ZVC | NVTRKC | NTRKC | CHVCC | FC
+-------+--------------+-------------+--------------+--------------+--------------+-------------+-------------+--------------+-----
| 1 | | | -1.43087 | 1.24444 | 18.4673 | 2 | 3 | 3.27624 | 0.
| * 1 | 0. | 0 | | | | | | |
| * 2 | 0. | 0 | | | | | | |
| * 3 | 0. | 0 | | | | | | |
I've got 174 columns in this particular ntuple. To restrict the selection use:
nt/scan 10 varlis=[Comma separated list of columns]
PAW > nt/scan 10 varlis=ENE44M:ZufoPz
+-------+-------------+--------------+--------------+--------------+
| Event | ENE44M | TEMPLUME | TEMPLUMG | ZufoPz |
+-------+-------------+--------------+--------------+--------------+
| 1 | 1000 | -500. | -500. | 2.55895 |
| 2 | 1000 | -500. | -500. | 11.4667 |
| 3 | 1000 | -500. | -500. | -1.63046 |
| 4 | 1000 | -500. | -500. | 1.37581 |
| 5 | 1000 | -500. | -500. | -2.54238 |
| 6 | 1000 | -500. | -500. | -1.91473 |
| 7 | 1000 | -500. | -500. | 1.51911 |
| 8 | 1000 | -500. | -500. | 0. |
| 9 | 1000 | -500. | -500. | 12.3712 |
| 10 | 1000 | -500. | -500. | -4.4222 |
| 11 | 1000 | -500. | -500. | 0.0533053 |
| 12 | 1000 | -500. | -500. | -0.0746093 |
| 13 | 1000 | -500. | -500. | 33.6832 |
| 14 | 1000 | -500. | -500. | 0.223857 |
| 15 | 1000 | -500. | -500. | 8.72115 |
| 16 | 1000 | -500. | -500. | 10.5479 |
| 17 | 1000 | -500. | -500. | 2.4528 |
| 18 | 1000 | -500. | -500. | -1.17858 |
| 19 | 1000 | -500. | -500. | 1.03199 |
+-------+-------------+--------------+--------------+--------------+
After this, I knew I could load the data but I really wanted to run the files through my old analysis code in FORTRAN.
Rather than try to compile the old project, I created a simple FORTRAN program to try and load the ntuple:
jonathan@jonathan-Inspiron-5759:~/Development/Physics/New Stuff/Development$ more Zeus1.f
program main
print *, "Test loading ntuple files"
call hlimit(2000000)
call hropen(80,'ntuple','nommc_1033.rz','',4096,istat)
if (istat.ne.0) then
print *, "Failed to open input file"
stop
endif
print *, "Loaded nommc_1033.rz"
end program main
(I'll talk about these commands in the next blog)
Compilation is easy with the official repository, we just need to link against
packlib:
gfotrtran Zeus1.f -lpacklib
And with no problems it created the default executable a.out (that takes me back!)
So with huge anticipation I ran it and, oh...
jonathan@jonathan-Inspiron-5759:~/Development/Physics/New Stuff/Development$ ./a.out
Test loading ntuple files
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LOCB/LOCF: address 0x7f57832df7a0 exceeds the 32 bit address space
or is not in the data segments
This may result in program crash or incorrect results
Therefore we will stop here
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
The reason was to be found in the readme file in the same location as the libraries:
/usr/share/doc/libpacklib1-dev/README.64-bit
CERNLIB was never designed to run on machines where the size of a pointer
is 64 bits. The code implicitly assumes that
sizeof(void *) == sizeof(int) == 4
in many different places. The biggest culprits are the ZEBRA and COMIS sets
of routines in the packlib and pawlib libraries, respectively. This would be
difficult to fix without rewriting megabytes of FORTRAN source code.
My old 2002 laptop was of course 32bit so this wasn't a problem before. My next blog will describe how I got this working.