!+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! !.COPYRIGHT (C) 1989 European Southern Observatory !.IDENT copy.prg !.AUTHOR Klaus Banse, ESO - Garching !.KEYWORDS data conversion, copying !.PURPOSE copy images (and convert data formats) !.VERSION 1.0 Creation 890414 ! !------------------------------------------------------- ! DEFINE/PARAM P1 ? IMA "Enter source frame: " DEFINE/PARAM P2 ? IMA "Enter destination frame: " DEFINE/PARAM P3 R4 C "Enter destination format: " DEFINE/PARAM P5 20000 N "Enter mapping buffer size: " WRITE/KEYWORD IN_A {P1} WRITE/KEYWORD OUT_A {P2} WRITE/KEYWORD INPUTI/I/20/1 {P5} RUN MID_EXE:copymiTo run the application execute the procedure via
/* @(#)copymi.c 6.4 (ESO-IPG) 10/19/93 16:56:29 */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .COPYRIGHT (c) 1988 European Southern Observatory .IDENT copymi.c .LANGUAGE C .AUTHOR K. Banse ESO/IPG .KEYWORDS Format Conversion .PURPOSE Read data frame in input format, convert it to output format and store in output frame .COMMENT Formats supported are the MIDAS formats: I1, I2, R4 .VERSION 1.00 890414: Creation (adapted from COPYMI.FOR) KB .VERSION 1.10 890512: use SCFGET, SCFPUT to make it faster .VERSION 1.20 890628: use SCKGETC and add "delete option" .VERSION 1.30 910228: copy also LHCUTS .VERSION 1.40 910417: use SCDCOP to copy all descriptors in one go .VERSION 1.50 911004: take care of over/underflow .VERSION 2.00 930929: long int -> int, unit -> *int ---------------------------------------------------------------------*/ #include <midas_def.h> main() { char infile[64], outfile[64], cbuf[12]; char *pntra, *pntrb; char dely[4]; int unit; int maxdim, naxis, npix[6], imnoa, imnob, imnow1, imnow2; int felm, nochunk, mapsize, size; int info[5], null, nval; int i, n, stat, fmtin, fmtout; int uflow, oflow; float cuts[4]; double start[6], step[6]; SCSPRO("copymi"); stat = SCKGETC("IN_A",1,60,&nval,infile); /* get input frame */ stat = SCKGETC("OUT_A",1,60,&nval,outfile); /* get output frame */ stat = SCKGETC("P3",1,10,&nval,cbuf); /* get output format */ stat = SCKGETC("P4",1,4,&nval,dely); /* get delete flag */ stat = SCKRDI("INPUTI",20,1,&nval,&mapsize,&unit,&null); /* mapping size */ stat = SCFINF(infile,2,info); /* get source format */ fmtin = info[1]; fmtout = check_fmt(cbuf); if (fmtout < 0) SCETER(2,"invalid data format..."); stat = SCFOPN(infile,info[1],0,F_IMA_TYPE,&imnoa); stat = SCDRDI(imnoa,"NAXIS",1,1,&nval,&naxis,&unit,&null); maxdim = 6; /* current limit */ if (naxis > maxdim) SCETER(3,"Too many dimensions..."); stat = SCDRDI(imnoa,"NPIX",1,naxis,&nval,npix,&unit,&null); stat = SCDRDD(imnoa,"START",1,naxis,&nval,start,&unit,&null); stat = SCDRDD(imnoa,"STEP",1,naxis,&nval,step,&unit,&null); stat = SCDRDR(imnoa,"LHCUTS",1,4,&nval,cuts,&unit,&null); size = 1; /* get total size of frame */ for (n=0; n< naxis; n++) size *= npix[n]; stat = SCFCRE(outfile,fmtout,F_O_MODE,F_IMA_TYPE,size,&imnob); stat = SCDWRI(imnob,"NAXIS",&naxis,1,1,&unit); stat = SCDWRI(imnob,"NPIX",npix,1,naxis,&unit); stat = SCDWRD(imnob,"START",start,1,naxis,&unit); stat = SCDWRD(imnob,"STEP",step,1,naxis,&unit); uflow = 0; oflow = 0; /* calculate no. of chunks needed */ if (size <= mapsize) { mapsize = size; nochunk = 1; } else nochunk = ((size-1) / mapsize) + 1; /* allocate virtual memory for in/out frame buffers */ stat = SCFCRE("work1",fmtin,F_X_MODE,F_IMA_TYPE,mapsize,&imnow1); stat = SCFMAP(imnow1,F_X_MODE,1,mapsize,&nval,&pntra); if (fmtin != fmtout) { stat = SCFCRE("work2",fmtout,F_X_MODE,F_IMA_TYPE,mapsize,&imnow2); stat = SCFMAP(imnow2,F_X_MODE,1,mapsize,&nval,&pntrb); } else pntrb = pntra; /* now we do the conversion */ felm = 1; for (i=0; i<nochunk; i++) { stat = SCFGET(imnoa,felm,mapsize,&nval,pntra); if (fmtin != fmtout) conv_pix(pntrb,pntra,fmtout,fmtin,nval); stat = SCFPUT(imnob,felm,nval,pntrb); felm += nval; } /* handle over, underflow */ if (fmtout == D_I1_FORMAT) { if (cuts[2] < 0) uflow = 1; if (cuts[3] > 255) oflow = 1; } else if (fmtout == D_I2_FORMAT) { if (cuts[2] < -32768) uflow = 1; if (cuts[3] > 32767) oflow = 1; } else if (fmtout == D_UI2_FORMAT) { if (cuts[2] < 0) uflow = 1; if (cuts[3] > 65534) oflow = 1; } if (uflow == 1) SCTPUT("Warning: Format conversion results in underflow..."); if (oflow == 1) SCTPUT("Warning: Format conversion results in overflow..."); stat = SCDCOP(imnoa,imnob,1,cbuf); /* copy all descriptors */ /* if delete flag set, delete the input frame */ if ((dely[0] == 'D') || (dely[0] == 'd')) SCFDEL(infile); SCSEPI(); } ------------------------------ The code of the functions called by the main program is omitted. The interested reader is referred to the actual MIDAS code. ------------------------------