C ++******************************************************************** C * C * C * C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2005 Health Research Inc. * C=* * C=* HEALTH RESEARCH INCORPORATED (HRI), * C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455. * C=* * C=* Email: spider@wadsworth.org * C=* * C=* This program is free software; you can redistribute it and/or * C=* modify it under the terms of the GNU General Public License as * C=* published by the Free Software Foundation; either version 2 of the * C=* License, or (at your option) any later version. * C=* * C=* This program is distributed in the hope that it will be useful, * C=* but WITHOUT ANY WARRANTY; without even the implied warranty of * C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * C=* General Public License for more details. * C=* * C=* You should have received a copy of the GNU General Public License * C=* along with this program; if not, write to the * C=* Free Software Foundation, Inc., * C=* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * C=* * C ********************************************************************** C * C MRGETINFO * C * C PURPOSE: * C * C PARAMETERS: * C * C GETS INFORMATION NEEDED TO ALIGN IMAGES. C C INPUT: C NOUT= OUTPUT DEVICE # (SCREEN) C NDAT= FIXED DEVICE # (DRIVE) C OUTPUT: C XYPTS(LV,LS,3)= ARRAY HOLDING COORDS OF MARKERS IN EACH PROJECTION C IREF= INDEX OF REFERENCE IMAGE IN NUMBER, XYPTS, ETC. C NUMBER(LV)= ARRAY WITH INDEXES MATCHING THOSE OF XYPTS, ANGLE, C NUMPTS, PTACTIVE, AND SCALE HOLDING FILE NUMBERS C ANGLE(3,LV)= EULER ANGLES FOR A VIEW (PSI,THETA,PHI) C SCALE(LV)= SCALE FOR EACH IMAGE. SET TO 1.0 IF NEW. C TSHIFT(2,LV)= SHIFT FOR EACH IMAGE. SET TO 0.0 IF NEW. C FIRST= LOGICAL; .T.=START FROM SCRATCH, .F.=USE OLD OUTPUT TO C BEGIN REFINEMENT C NTTVL= TOTAL NUMBER OF POINTS FOUND IN THE ALL IMAGES COMBINED C COMMON VARIABLES PASSED OUT: C PTACTIVE(LS,LV)= BOOLEAN ARRAY TELLING IF A POINT IS BEING USED IN C ALIGNMENT OR NOT FOR A VIEW C NUMPTS(LV)= HIGHEST NUMBERED MARKER TO BE FOUND IN AN IMAGE C NTVW= TOTAL NUMBER OF VIEWS. ALSO HIGHEST VALID INDEX OF XYPTS, C ANGLE, ETC. C NTPT= HIGHEST NUMBER OF MARKERS USED C CIR(2)= COORDS OF CENTER OF VIEW. NSAM/2+1, NROW/2+1 C C23456789012345678901234567890123456789012345678901234567890123456789012 C*********************************************************************** SUBROUTINE MRGETINFO(XYPTS, IREF, NUMBER, ANGLE, SCALE, TSHIFT, & FIRST,NTTVL) INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' PARAMETER (LV=300) PARAMETER (LS=256) PARAMETER (MAXREG=7) PARAMETER (MAXKEY=256) CHARACTER(LEN=MAXNAM) :: SERNAME COMMON /FILEN/SERNAME LOGICAL*1 PTACTIVE(LS,LV),PARAMQ(4) COMMON /GENERAL/PTACTIVE,NUMPTS(LV),NTVW,NTPT,CIR(2),PARAMQ CHARACTER(LEN=MAXNAM) :: XYIN,XYIN1,XYIN2,CORFIL,CORIN,DOCTIT DIMENSION XYPTS(2,LS,LV),ANGLE(3,LV),SCALE(LV) DIMENSION TSHIFT(2,LV) DIMENSION DBUF(MAXREG,MAXKEY),PLIST(MAXREG) INTEGER NUMBER(LV),MXY(2) CHARACTER * 1 NULL,ANSW LOGICAL FAKE,FIRST DATA DTOR/0.017453292/ DATA LUNDOC,LUN1/10,79/ NULL = CHAR(0) C ASK FOR DATA FILE NMAX = LV CALL FILELIST(.TRUE.,LUNDOC,XYIN1,NA,NUMBER,NMAX,NVW, & 'ENTER PREFIX OF MARKER DOC FILES',IRTFLG) IF (IRTFLG .NE. 0) RETURN C NVW - total number of images NLETP = NA SERNAME = XYIN1 CALL RDPRMI(IRFR,IDUM,NOT_USED,'ENTER REFERENCE FILE NUMBER') C GET CENTER OF IMAGE CALL RDPRIS(MXY(1),MXY(2),NOT_USED, & 'ENTER X,Y IMAGE DIMENSIONS',IRTFLG) IF (IRTFLG .NE. 0) RETURN CIR(1) = MXY(1)/2+1 CIR(2) = MXY(2)/2+1 C ARE ANGLES GIVEN BY -1 KEY IN ORDER PSI(COR),THETA,PHI C OR IN NORMAL SPIDER ; PSI THETA PHI CC CALL RDPRMC(ANSW,NC,.TRUE., CC & '.ARE ANGLES IN PICK MARKER FORMAT? (Y/N)', NULL, IRTFLG) CALL RDPRMC(ANSW,NC,.TRUE.,'REFINE SCALE (VS REFERENCE)? (Y/N)', & NULL,IRTFLG) PARAMQ(3) = (ANSW(:1) .EQ. 'Y') CALL RDPRMC(ANSW,NC,.TRUE., & 'REFINE TILT ANGLE (VS REFERENCE)? (Y/N)', NULL,IRTFLG) PARAMQ(2) = (ANSW(:1) .EQ. 'Y') CALL RDPRMC(ANSW,NC,.TRUE.,'REFINE IN-PLANE ROTATION? (Y/N)', & NULL,IRTFLG) PARAMQ(1) = (ANSW(:1) .EQ. 'Y') CALL RDPRMC(ANSW,NC,.TRUE., & 'REFINE SHIFT (VS REFERENCE)? (Y/N)',NULL,IRTFLG) PARAMQ(4) = (ANSW(:1) .EQ. 'Y') CALL RDPRMC(ANSW,NC,.TRUE.,'USE PREVIOUS CORRECTIONS? (Y/N)', & NULL,IRTFLG) FIRST = (ANSW(:1) .EQ. 'Y') IF (FIRST) THEN CALL FILERD(CORFIL,NLTC,NULL,'ENTER CORRECTIONS INPUT DOC', & IRTFLG) IF (IRTFLG.NE.0) RETURN ENDIF NTPT = 0 IVIEW = 0 NTVW = 0 NTTVL = 0 DO 503 IVIEWT=1,NVW C GO THROUGH AND PULL ALL X,Y COORDS FROM DOC FILES C NULL IS RESET EACH TIME BECAUSE CORRUPTION HAPPENS???? why all NULL = CHAR(0) NLETP = NA CALL FILGET(XYIN1,XYIN2,NLETP,NUMBER(IVIEWT),IRT2) IF (NUMBER(IVIEWT) .EQ. IRFR) IREF=IVIEWT XYIN2(NLETP+1:NLETP+1) = CHAR(0) C IRT2=0 MEANS ALL OKAY IF (IRT2 .NE. 0) GOTO 503 IOPEN = 0 IKEY = 1 CALL FILNAMANDEXT(XYIN2,DATEXC,XYIN,NLET,.TRUE.,IER) CALL UNSDAL(XYIN,IOPEN,LUN1,IKEY,PLIST,3,DBUF, & MAXKEY,MAXREG,NKEY2,IRT2) C UNSDAL CLOSES THE FILE C IRT2 WILL BE 1 IF KEY 1 IS MISSING, SO OK IF IRT2=0 OR 1 IF (IRT2 .NE. 0 .AND. IRT2 .NE. 1) GOTO 503 IVIEW = IVIEW + 1 NTVW = NTVW + 1 IF (NTVW .GT. LV) THEN CALL ERRT(102,'NUMBER OF VIEWS CAN NOT EXCEED',LV) RETURN ENDIF C GET X,Y COORDS OF EACH MARKER FROM ALL VIEWS. A VIEW C CAN LACK SOME MARKERS NUMPTS(IVIEWT)=0 NUSED = 0 DO I=1,NKEY2 C IF COORD OUTSIDE RANGE, THE POINT IS FAKE AND NOT USED FAKE=DBUF(2,I).LT.0 .OR. DBUF(2,I).GT.(2*CIR(1)) .OR. & DBUF(3,I).LT.0 .OR. DBUF(3,I).GT.(2*CIR(2)) C OR when the key is missing ... & .OR. DBUF(1,I).EQ.0.0 IF (FAKE) THEN WRITE(NOUT,*) ' FAKE POINT !! ',IVIEWT,I PTACTIVE(I,IVIEWT)=.FALSE. XYPTS(1,I,IVIEWT)=0.0 XYPTS(2,I,IVIEWT)=0.0 ELSE PTACTIVE(I,IVIEWT)=.TRUE. NTTVL=NTTVL+1 XYPTS(1,I,IVIEWT)=DBUF(2,I)-CIR(1) XYPTS(2,I,IVIEWT)=DBUF(3,I)-CIR(2) IF (I .GT. NUMPTS(IVIEW)) NUMPTS(IVIEW)=I ENDIF END DO IF (NUMPTS(IVIEW) .GT. NTPT) NTPT=NUMPTS(IVIEW) C GET INITIAL ANGLES FROM DOC FILE IOPEN = 0 IKEY = -1 CALL UNSDAL(XYIN,IOPEN,LUN1,IKEY,PLIST,3,DBUF, & MAXKEY,MAXREG,NKEY2,IRT2) c UNSDAL CLOSES THE FILE ANGLE(1,IVIEWT)=PLIST(1)*DTOR ANGLE(2,IVIEWT)=PLIST(2)*DTOR ANGLE(3,IVIEWT)=PLIST(3)*DTOR SCALE(IVIEWT)=1.000000 TSHIFT(1,IVIEWT)=0.0 TSHIFT(2,IVIEWT)=0.0 503 CONTINUE IF (.NOT.FIRST) GOTO 999 IOPEN = 0 IKEY = 1 IC=1 CALL FILNAMANDEXT(CORFIL,DATEXC,CORIN,NLET,.TRUE.,IER) CALL UNSDAL(CORIN,IOPEN,LUN1,IKEY,PLIST,3,DBUF, & MAXKEY,MAXREG,NKEY2,IRT2) C IRT2 WILL BE 1 IF KEY 1 IS MISSING, SO OK IF IRT2=0 OR 1 IF (IRT2 .NE. 0 .AND. IRT2 .NE. 1) THEN WRITE(NOUT)' NO CORRECTIONS FILE. CONTINUING AS FIRST RUN' FIRST = .FALSE. GOTO 999 ENDIF C COMMENTS TEMP MODIFIED TO READ IN MARKER ANGLES FILE DO J=1,NKEY2 IVIEW=DBUF(1,J) SCALE(IVIEW)=DBUF(2,J) ANGLE(2,IVIEW)=DBUF(3,J)*DTOR ANGLE(1,IVIEW)=DBUF(4,J)*DTOR TSHIFT(1,IVIEW)=DBUF(5,J) TSHIFT(2,IVIEW)=DBUF(6,J) C SCALE(IVIEW)=DBUF(2,J)**-1 C ANGLE(1,IVIEW)=-DBUF(3,J)*DTOR C ANGLE(2,IVIEW)=DBUF(5,J)*DTOR C TSHIFT(1,IVIEW)=-DBUF(7,J) C TSHIFT(2,IVIEW)=-DBUF(6,J) ENDDO 999 RETURN END