Having created a database and the required directory structure, we now procede to add the data.
As we already know in our example the data is held in RZ files in the form of ZEBRA banks. As the object type used by HEPDB is the ZEBRA bank the conversion of the old CPLEAR database is fairly simple. The only modification to the original data will be the addition of the new special user key 10 as discussed above.
The code below shows the conversion of the original RZ geometric database to HEPDB format. After the code follows a brief explanation although the comments within the code tell of its operation.
Conversion of GEOMETRY database
PROGRAM GEOCONV c =============== c+---------------------------------------------------------+ c| Program to convert RZ geo database -> HEPDB | c|------------------------------+--------------------------| c| RZGEO keys: VAL_STAR (I) | For all directories | c| VAL_STOP (I) +--------------------------| c| DETECTOR (H) | c| POINTER (H) | c| insertion time = RZ date/time | c|----------------------------------------+----------------| c| HEPDB keys: NPAIR = 1 | | c| VAL_STAR = KEYS(11) (I) | For all | c| VAL_STOP = KEYS(12) (I) | geometry | c| NUSER = 2 | directories | c| DETECTOR = KEYS(13) (H) | | c| POINTER = KEYS(14) (H) | | c| insertion time = KEYS(IDHINS) | c|---------------------------------------------------------| c| Output pathnames: | c| //CDGE/GEOMETRY | c| //CDGE/GEOMETRY/PC | c| //CDGE/GEOMETRY/DC | c| //CDGE/GEOMETRY/ST | c| //CDGE/GEOMETRY/PID | c| //CDGE/GEOMETRY/CAL_WIRE | c| //CDGE/GEOMETRY/CAL_STRI | c+---------------------------------------------------------+ c PARAMETER (NWPAW=200000) COMMON/PAWC/ PAW(NWPAW) COMMON/USRLNK/ IDIV,LADDR CHARACTER*4 CHTOP CHARACTER*80 CHFILE EXTERNAL CPGEOC c| c| Initialise Zebra, HBOOK and HEPDB c| CALL CDPAW(NWPAW,NHBOOK,IDIV,'USR-DIV',10000,150000,'ZPU',IRC) CALL MZLINK(IDIV,'/USRLNK/',LADDR,LADDR,LADDR) LUNCD = 1 LUNFZ = 2 LUNRZ = 3 c| c| Open RZ geometry database (RZGEO.DATA) c| LRECL = 0 CALL RZOPEN(LUNRZ,'RZGEO','rzgeo.data',' ',LRECL,IRC) CALL RZFILE(LUNRZ,'RZGEO',' ') c| c| Find the database file and construct the top directory name c| Open the database file c| CALL CDPREF(10,'GE',CHTOP,CHFILE,IRC) LRECL = 0 CALL CDOPEN(LUNCD,LUNFZ,CHTOP,CHFILE,LRECL,IDIV,' ',IRC) c| c| Loop over all sub-directories in RZGEO.DATA c| CALL RZSCAN('//RZGEO',CPGEOC) c| c| Terminate c| CALL CDEND(' ','A',IRC) CALL RZCLOS(' ','A') END SUBROUTINE CPGEOC(CHDIR) c c+---------------------------------------------------------+ c| Routine to retrieve,convert and store old RZ objects | c| under HEPDB | c+---------------------------------------------------------+ c COMMON /USRLNK/ IDIV,LADDR COMMON /QUEST/ IQUEST(100) PARAMETER (NRZKS=5) PARAMETER (MAXKEY=1000) PARAMETER (IOBJECTS=18) INTEGER HDBKEYS(15),RZKYTOGET(NRZKS) INTEGER NKEYRET,KEYSARR(NRZKS,MAXKEY) CHARACTER*(*) CHDIR CHARACTER*255 CHSAVE,DEST CHARACTER*(NRZKS) CHFORM CHARACTER*8 CHTAG(NRZKS) CHARACTER*4 CTEMP(3) DATA NENTRY/0/ SAVE NENTRY c| c| Check for exit from RZSCAN loop c| LADDR=0 IF (NENTRY.EQ.0) THEN NENTRY=1 RETURN ENDIF c| c| Set Current RZ directory c| LDIR = LENOCC(CHDIR) CHSAVE = CHDIR(1:LDIR) CALL RZCDIR(CHSAVE(1:LDIR),' ') PRINT *,'-- RZ Directory Change -----------------------' PRINT *,' ', CHSAVE(1:30) PRINT *,'----------------------------------------------' c| c| Get CWD key definitions c| CALL RZKEYS(NRZKS,MAXKEY,KEYSARR,NKEYRET) PRINT *,' No of objects in CWD :',NKEYRET CALL RZKEYD (NWKEY,CHFORM,CHTAG) PRINT *,' Key Format for this directory :',CHFORM c| c| Now loop over all objects in CWD, display and convert c| DO I=1,NKEYRET PRINT*,' - OBJECT No. ',I,' ------------------' PRINT*,' ',CHTAG(1),':',KEYSARR(1,I),' ' + ,' ',CHTAG(2),':',KEYSARR(2,I),' ' CALL UHTOC(KEYSARR(3,I),4,CTEMP(1),4) CALL UHTOC(KEYSARR(4,I),4,CTEMP(2),4) CALL UHTOC(KEYSARR(5,I),4,CTEMP(3),4) PRINT*,' ',CHTAG(3),':',CTEMP(1),' ' + ,' ',CHTAG(4),':',CTEMP(2),' ' PRINT*,' ',CHTAG(5),':',CTEMP(3),' ' c| c| Load object ,I, into zebra store c| ICYCLE=9999 JBIAS=2 DO J=1,NRZKS RZKYTOGET(J)=KEYSARR(J,I) ENDDO CALL RZIN(IDIV,LADDR,JBIAS,RZKYTOGET,ICYCLE,' ') c| c| Now set HEPDB keys, and pack time stamp c| CALL RZDATE(IQUEST(14),IDATE,ITIME,1) CALL CDPKTM(IDATE,ITIME,IPACK,IRC) HDBKEYS(4)=IPACK c| DO J=1,5 HDBKEYS(10+J)=RZKYTOGET(J) ENDDO c| c| Set key 10 to 0 (Our new key!) c| HDBKEYS(10)=0 c| c| Now store object at LADDR under HEPDB c| DEST='//CDGE/GEOMETRY/'//CHDIR(9:LDIR) PRINT*,' Destination path :',DEST CALL CDSTOR(DEST,LADDR,LKYBK,IDIV,HDBKEYS,'H',IRC) IF (IRC.NE.0) THEN PRINT*,' Error! CDSTOR IRC=',IRC STOP ENDIF CALL RZCDIR(CHSAVE(1:LDIR),' ') CALL MZDROP(IDIV,LADDR,' ') LADDR=0 PRINT*,' Object ',I,' Stored under HDB' PRINT *,' ' ENDDO CALL CDSTSV(' ',0,IRC) CALL RZCDIR(CHSAVE(1:LDIR),' ') PRINT *,' ' END
The flow of the above program starts by opening both the source RZ file and the destination HEPDB database file. It then makes a call to the RZ routine RZSCAN which visits each directory of the RZ file in turn passing execution to subroutine CPGEOC.
Once inside this routine the current RZ directory is set by the routine RZCDIR. The RZ key definitions and their values are retrieved via calls to RZKEYS respectively. The objects within the directory are then looped over one at a time , each being brought into ZEBRA store and then output to HEPDB via the CDSTOR routine. Note that the special user key 10 we now wish to add is simply given a 0 value in this case as we assume all current data to be from the off-line source. (This is for our example although other code could be introduced to set this key accordingly) Once all objects in the RZ directory have been processed the update file is sent to the HEPDB database server. This procedure is then repeated for each subdirectory of the RZ file.
An important point to be noted at this time is the manipulation of a system key. This is key 4 insertion time (IDHINS). As we would like to keep the information regarding the original insertion time of the RZ objects we suppress HEPDB from re-writing this key and force it to honor the original RZ insertion time by the option `H' in our call to CDSTOR. This is the only legitimate way in which a system key should be altered.