The CPLEAR calibration database consists of a single Zebra RZ file containing a number of directories corresponding to the long term, medium term and short term calibration constants of the various subdetectors.
Information is stored in these directories as individual Zebra banks, identified by the directory name and four keys. These keys contain the following information:
This corresponds to a HEPDB database with one validity range pair. The detector and pointer information are stored as user keys.
The first thing that must be performed is the creation of a new HEPDB database file. This is performed by the following program.
Creating a new HEPDB database for CPLEAR
*CMZ : 23/10/92 10.16.19 by Jamie Shiers *-- Author : PROGRAM CDEXA1 * ============== * * Create a new, empty database * PARAMETER (NWPAW=100000) COMMON/PAWC/PAW(NWPAW) * * Initialise Zebra, HBOOK and HEPDB * CALL CDPAW(NWPAW,NHBOOK,IDIV,'USR-DIV',5000,50000,'ZPHU',IRC) * * Unit for database access * LUNCD = 1 * * Database parameters * NPAIR = 1 NREC = 20000 NPRE = 200 NTOP = 1 NQUO = 65000 * * Accept default record length (1024 words) * LRECL = 0 CALL CDNEW(LUNCD,'HEPDB','RZKAL.DBS',IDIV,NPAIR,NQUO,NREC,NPRE,NTOP, + LRECL,'F',IRC) * * Set the log level * CALL CDLOGL(' ',3,'A',IRC) * * Terminate * CALL CDEND(' ','A',IRC) END
The following program shows how the directory structure is created in the HEPDB database. Note that the directory structure is somewhat simplified in the conversion, but this is of course optional.
Creating the directory structure in the HEPDB database
CDECK ID>, KALCONV. PROGRAM KALCONV * * Program to convert CPLEAR calibration database * to HEPDB format * * RZKAL keys: VAL_STAR (I) * VAL_STOP (I) * DETECTOR (H) * BANK ID (H) * insertion time = RZ date/time * * HEPDB keys: NPAIR = 1 * VAL_STAR = KEYS(11) (I) * VAL_STOP = KEYS(12) (I) * NUSER = 2 * DETECTOR = KEYS(13) (H) * BANK ID = KEYS(14) (H) * insertion time = KEYS(IDHINS) * * Output pathnames: * * //CDCD/CALIBRATION/DC_ST * //CDCD/CALIBRATION/DC_LT * //CDCD/CALIBRATION/DC_MT * * //CDCD/CALIBRATION/PC_ST * //CDCD/CALIBRATION/PC_LT * //CDCD/CALIBRATION/PC_MT * * //CDCD/CALIBRATION/PID_ST * //CDCD/CALIBRATION/PID_LT * //CDCD/CALIBRATION/PID_MT * * //CDCD/CALIBRATION/ST_MT * * //CDCD/CALIBRATION/CALO_LT * PARAMETER (NWPAW=100000) COMMON/PAWC/ PAW(NWPAW) COMMON/USRLNK/IDIV,LADDR CHARACTER*4 CHTOP CHARACTER*80 CHFILE EXTERNAL CPKALC * * Initialise Zebra, HBOOK and HEPDB * CALL CDPAW(NWPAW,NHBOOK,IDIV,'USR-DIV',5000,50000,'ZPHU',IRC) * * Link area of banks retrieved from database * CALL MZLINK(IDIV,'/USRLNK/',LADDR,LADDR,LADDR) * * Unit for database access * LUNCD = 1 * * Unit for database update (via journal files) * LUNFZ = 2 * * Unit for RZKAL file * LUNRZ = 3 * * Open CPLEAR calibration database (RZKAL.DATA) * LRECL = 0 CALL RZOPEN(LUNRZ,'RZKAL','rzkal.data',' ',LRECL,IRC) CALL RZFILE(LUNRZ,'RZKAL',' ') * * Find the database file and construct the top directory name * CALL CDPREF(10,'CD',CHTOP,CHFILE,IRC) * * Open the database file * LRECL = 0 CALL CDOPEN(LUNCD,LUNFZ,CHTOP,CHFILE,LRECL,IDIV,' ',IRC) * * Loop over directories in RZKAL.DATA * CALL RZSCAN('//RZKAL',CPKALC) * * Terminate * CALL CDEND(' ','A',IRC) CALL RZCLOS(' ','A') END CDECK ID>, CPKALC. SUBROUTINE CPKALC(CHDIR) CHARACTER*(*) CHDIR PARAMETER (NKEYS=2) PARAMETER (MAXOBJ=1000) CHARACTER*8 CHTAG(NKEYS) CHARACTER*2 CHFOR CHARACTER*255 CHPATH,CHSAVE DATA NENTRY/0/ SAVE NENTRY IF(NENTRY.EQ.0) THEN NENTRY = 1 RETURN ENDIF * * Must save directory in local variable: calls to RZ * overwrite it! * LDIR = LENOCC(CHDIR) CHSAVE = CHDIR(1:LDIR) * * Make directories in HEPDB database * DELTA = 0.0 IPREC = 0 CHFOR = 'HH' CHTAG(1) = 'DETECTOR' CHTAG(2) = 'POINTER ' * * Construct directory name for HEPDB file * LSLASH = INDEXB(CHSAVE(1:LDIR),'/') + 1 IF(INDEX(CHSAVE(1:LDIR),'MONTE').EQ.0) THEN CHPATH = '//CDCD/CALIBRATION/'//CHSAVE(LSLASH:LDIR) LPATH = LDIR - LSLASH + 20 ELSE CHPATH = '//CDCD/'//CHSAVE(LSLASH:LDIR) LPATH = LDIR - LSLASH + 8 ENDIF CALL CDMDIR(CHPATH(1:LPATH),NKEYS,CHFOR,CHTAG,MAXOBJ, + IPREC,DELTA,'CP',IRC) 99 CONTINUE CALL RZCDIR(CHSAVE(1:LDIR),' ') END
The data is then entered using a program that is very similar to the above.
Entering the data into the HEPDB database
CDECK ID>, KALCONV. PROGRAM KALCONV * * Program to convert CPLEAR calibration database * to HEPDB format * * RZKAL keys: VAL_STAR (I) * VAL_STOP (I) * DETECTOR (H) * BANK ID (H) * insertion time = RZ date/time * * HEPDB keys: NPAIR = 1 * VAL_STAR = KEYS(11) (I) * VAL_STOP = KEYS(12) (I) * NUSER = 2 * DETECTOR = KEYS(13) (H) * BANK ID = LEYS(14) (H) * insertion time = KEYS(IDHINS) * * Output pathnames: * * //CDCD/CALIBRATION/DC_ST * //CDCD/CALIBRATION/DC_LT * //CDCD/CALIBRATION/DC_MT * * //CDCD/CALIBRATION/PC_ST * //CDCD/CALIBRATION/PC_LT * //CDCD/CALIBRATION/PC_MT * * //CDCD/CALIBRATION/PID_ST * //CDCD/CALIBRATION/PID_LT * //CDCD/CALIBRATION/PID_MT * * //CDCD/CALIBRATION/ST_MT * * //CDCD/CALIBRATION/CALO_LT * PARAMETER (NWPAW=100000) COMMON/PAWC/ PAW(NWPAW) COMMON/USRLNK/IDIV,LADDR CHARACTER*4 CHTOP CHARACTER*80 CHFILE EXTERNAL CPKALC * * Initialise Zebra, HBOOK and HEPDB * CALL CDPAW(NWPAW,NHBOOK,IDIV,'USR-DIV',5000,50000,'ZPHU',IRC) * * Link area of banks retrieved from database * CALL MZLINK(IDIV,'/USRLNK/',LADDR,LADDR,LADDR) * * Unit for database access * LUNCD = 1 * * Unit for database update (via journal files) * LUNFZ = 2 * * Unit for RZKAL file * LUNRZ = 3 * * Open CPLEAR calibration database (RZKAL.DATA) * LRECL = 0 CALL RZOPEN(LUNRZ,'RZKAL','rzkal.data',' ',LRECL,IRC) CALL RZFILE(LUNRZ,'RZKAL',' ') * * Find the database file and construct the top directory name * CALL CDPREF(10,'CD',CHTOP,CHFILE,IRC) * * Open the database file * LRECL = 0 CALL CDOPEN(LUNCD,LUNFZ,CHTOP,CHFILE,LRECL,IDIV,' ',IRC) * * Loop over directories in RZKAL.DATA * CALL RZSCAN('//RZKAL',CPKALC) * * Terminate * CALL CDEND(' ','A',IRC) CALL RZCLOS(' ','A') END CDECK ID>, CPKALC. SUBROUTINE CPKALC(CHDIR) CHARACTER*(*) CHDIR COMMON/USRLNK/IDIV,LADDR PARAMETER (NKEYS=2) PARAMETER (MAXOBJ=1000) DIMENSION KEYS(13) DIMENSION KEYZ(4) CHARACTER*8 CHTAG(NKEYS) CHARACTER*2 CHFOR CHARACTER*255 CHPATH,CHSAVE PARAMETER (IQDROP=25, IQMARK=26, IQCRIT=27, IQSYSX=28) COMMON /QUEST/ IQUEST(100) COMMON /ZVFAUT/IQVID(2),IQVSTA,IQVLOG,IQVTHR(2),IQVREM(2,6) COMMON /ZEBQ/ IQFENC(4), LQ(100) DIMENSION IQ(92), Q(92) EQUIVALENCE (IQ(1),LQ(9)), (Q(1),IQ(1)) COMMON /MZCA/ NQSTOR,NQOFFT(16),NQOFFS(16),NQALLO(16), NQIAM +, LQATAB,LQASTO,LQBTIS, LQWKTB,NQWKTB,LQWKFZ +, MQKEYS(3),NQINIT,NQTSYS,NQM99,NQPERM,NQFATA,NQCASE +, NQTRAC,MQTRAC(48) EQUIVALENCE (KQSP,NQOFFS(1)) COMMON /MZCB/ JQSTOR,KQT,KQS, JQDIVI,JQDIVR +, JQKIND,JQMODE,JQDIVN,JQSHAR,JQSHR1,JQSHR2,NQRESV +, LQSTOR,NQFEND,NQSTRU,NQREF,NQLINK,NQMINR,LQ2END +, JQDVLL,JQDVSY,NQLOGL,NQSNAM(6) DIMENSION IQCUR(16) EQUIVALENCE (IQCUR(1),LQSTOR) COMMON /MZCC/ LQPSTO,NQPFEN,NQPSTR,NQPREF,NQPLK,NQPMIN,LQP2E +, JQPDVL,JQPDVS,NQPLOG,NQPNAM(6) +, LQSYSS(10), LQSYSR(10), IQTDUM(22) +, LQSTA(21), LQEND(20), NQDMAX(20),IQMODE(20) +, IQKIND(20),IQRCU(20), IQRTO(20), IQRNO(20) +, NQDINI(20),NQDWIP(20),NQDGAU(20),NQDGAF(20) +, NQDPSH(20),NQDRED(20),NQDSIZ(20) +, IQDN1(20), IQDN2(20), KQFT, LQFSTA(21) DIMENSION IQTABV(16) EQUIVALENCE (IQTABV(1),LQPSTO) C COMMON /RZCL/ LTOP,LRZ0,LCDIR,LRIN,LROUT,LFREE,LUSED,LPURG +, LTEMP,LCORD,LFROM EQUIVALENCE (LQRS,LQSYSS(7)) C PARAMETER (KUP=5,KPW1=7,KNCH=9,KDATEC=10,KDATEM=11,KQUOTA=12, + KRUSED=13,KWUSED=14,KMEGA=15,KIRIN=17,KIROUT=18, + KRLOUT=19,KIP1=20,KNFREE=22,KNSD=23,KLD=24,KLB=25, + KLS=26,KLK=27,KLF=28,KLC=29,KLE=30,KNKEYS=31, + KNWKEY=32,KKDES=33,KNSIZE=253,KEX=6,KNMAX=100) C DATA NENTRY/0/ SAVE NENTRY IF(NENTRY.EQ.0) THEN NENTRY = 1 RETURN ENDIF * * Must save directory in local variable: calls to RZ * overwrite it! * LDIR = LENOCC(CHDIR) CHSAVE = CHDIR(1:LDIR) * * Retrieve the keys in this directory * IF(LQRS.EQ.0) GOTO 99 IF(LCDIR.EQ.0) GOTO 99 LS = IQ(KQSP+LCDIR+KLS) LK = IQ(KQSP+LCDIR+KLK) NK = IQ(KQSP+LCDIR+KNKEYS) NWK= IQ(KQSP+LCDIR+KNWKEY) DO 10 I=1,NK K=LK+(NWK+1)*(I-1) DO 20 J=1,NWK IKDES=(J-1)/10 IKBIT1=3*J-30*IKDES-2 IF(JBYT(IQ(KQSP+LCDIR+KKDES+IKDES),IKBIT1,3).LT.3)THEN KEYZ(J)=IQ(KQSP+LCDIR+K+J) ELSE CALL ZITOH(IQ(KQSP+LCDIR+K+J),KEYZ(J),1) ENDIF 20 CONTINUE CALL VZERO(KEYS,10) CALL UCOPY(KEYZ(1),KEYS(11),4) * * Retrieve the highest cycle of this object * (will need modification if all cycles are to be converted) * ICYCLE = 9999 JBIAS = 2 CALL RZIN(IDIV,LADDR,JBIAS,KEYZ,ICYCLE,' ') IF(IQUEST(1).NE.0) THEN PRINT *,'CPKALC. error ',IQUEST(1),' from RZIN for ',KEYZ GOTO 10 ENDIF * * Date/time of insertion * CALL RZDATE(IQUEST(14),IDATE,ITIME,1) CALL CDPKTM(IDATE,ITIME,IPACK,IRC) KEYS(4) = IPACK * * Store objects in HEPDB with appropriate keys * Option H: honour insertion time in KEYS(IDHINS) * CALL CDSTOR(CHPATH(1:LPATH),LADDR,LKYBK,IDIV,KEYS,'H',IRC) * * Reset directory * CALL RZCDIR(CHSAVE(1:LDIR),' ') * * Drop this bank * CALL MZDROP(IDIV,LADDR,' ') LADDR = 0 10 CONTINUE 99 CONTINUE * * Send updates to server one directory at a time * CALL CDSTSV(' ',0,IRC) CALL RZCDIR(CHSAVE(1:LDIR),' ') END