SUBROUTINE DIRECTION(DEVIA) C----------------------------------------------------- C- C- Purpose and Methods : PROGRAM THAT DETERMINES THE C- TRACK PROJECTIONS ON THE PLANE XZ AND YZ USING C- ONLY CALORIMETER INFORMATION . C- C- Inputs : C- Outputs : C- Controls: C- C- Created 9-FEB-1994 MIRKO BOEZIO C- Modified 21-FEB-2003 MIRKO BOEZIO . ADAPTED TO C- BE USED FOR PAMELA CALORIMETER . C- C------------------------------------------------------ IMPLICIT NONE INCLUDE 'INTEST.TXT' REAL FLIMIT, FLIMIT2 INTEGER NVAR,NPAR PARAMETER (NVAR=1,NPAR=2) c PARAMETER (FLIMIT=10000) c PARAMETER (FLIMIT2=2000) PARAMETER (FLIMIT=500) PARAMETER (FLIMIT2=500) REAL X(NPLA),Y(NPLA),W(NPLA) REAL DEVIA(2),TG(2) REAL BAR(2,NPLA) REAL A, B, VAR REAL SA, SB, SVAR REAL SSA, SSB, SSVAR REAL PIANO(22) REAL VARFIT(2) INTEGER ICONT, M, I, SNPFIT,SSNPFIT INTEGER NPFIT(2), CHTRACK,IWPL(2) INTEGER IBAR(2,NPLA) COMMON/ANGOLO/BAR,IBAR SAVE /ANGOLO/ REAL CX, CY COMMON/WHERE/CX,CY,PIANO SAVE /WHERE/ COMMON/CALOFIT/VARFIT,NPFIT,IWPL,CHTRACK SAVE/CALOFIT/ C ICONT = 0 DEVIA(1) = 0. DEVIA(2) = 0. CX = 0. CY = 0. C NPFIT(1) = NPLA NPFIT(2) = NPLA VARFIT(1) = 0. VARFIT(2) = 0. C C THE FIT IS PERFORMED WHEN THERE ARE AT LEAST TWO C LAYERS WITH SIGNAL . FOR THE FIT THE CLUSTER WITH THE C HIGHEST DETECTED ENERGY IS USED . C DO M = 1,2 SA = 0 SB = 0 SVAR = 0 FMODE(M) = 0 10 CONTINUE ICONT = 0 CALL VZERO(X,NPLA) CALL VZERO(Y,NPLA) CALL VZERO(W,NPLA) DO I = 1,NPLA C IF (MOD(M,2).EQ.0) THEN X(I) = PIANO(I) - 5.81 ELSE X(I) = PIANO(I) ENDIF Y(I) = 0. C C C IF (FMODE(M).EQ.0) THEN IF (NCL(M,I).GE.1) THEN ICONT = ICONT + 1 Y(I) = CLUS(M,I,1) W(I) = ((CLUS(M,I,1+NCHA/2)**0.79))**2. IF (W(I).GT.2000.) THEN W(I) = 2000. C Y(I) = 0. C ICONT = ICONT -1 ENDIF ENDIF ENDIF C C No weigth and less cluster per plane C IF(FMODE(M).EQ.1) THEN IF (NCL(M,I).GE.1.AND.NCL(M,I).LE.2) THEN ICONT = ICONT + 1 Y(I) = CLUS(M,I,1) c W(I) = ((CLUS(M,I,1+NCHA/2)**0.29))**2. W(I) = 1. ENDIF c IF (W(I).GT.2000.) THEN cx W(I) = 2000. cc Y(I) = 0. cc ICONT = ICONT -1 c ENDIF ENDIF c c One cluster per plane c IF(FMODE(M).EQ.2) THEN IF (NCL(M,I).EQ.1) THEN ICONT = ICONT + 1 Y(I) = CLUS(M,I,1) c W(I) = ((CLUS(M,I,1+NCHA/2)**0.79))**2. W(I) = 1. ENDIF ENDIF c if (Y(I).eq.0.or.W(I).eq.2000.) NPFIT(M) = NPFIT(M) - 1 if (Y(I).eq.0.) NPFIT(M) = NPFIT(M) - 1 ENDDO C A = 0. B = 0. VAR = 0. c print *,' icont = ',icont IF (ICONT.GE.2) THEN CALL LFITW(X,Y,W,NPLA,0,A,B,VAR) ELSE NPFIT(M) = 0 ENDIF C C TRY A BETTER FIT IF VAR IS BIG ON THE FIRST TRY C IF ((ABS(VAR).GT.FLIMIT.OR.VAR.EQ.0.).AND.FMODE(M).EQ.0) THEN SVAR = VAR SB = B SA = A SNPFIT = NPFIT(M) NPFIT(M) = NPLA FMODE(M) = 1 GOTO 10 ENDIF C C TRY AGAIN IF STILL BAD AND WE HAVE AT LEAST 10 POINT TO MAKE THE FIT C IF ((ABS(VAR).GT.FLIMIT2.OR.VAR.EQ.0.).AND.FMODE(M).EQ.1 & .AND.SNPFIT.GT.5) THEN SSVAR = VAR SSB = B SSA = A SSNPFIT = NPFIT(M) NPFIT(M) = NPLA FMODE(M) = 2 GOTO 10 ENDIF C C IF WE ARE AT THE THIRD TRY AND THE FIT IS WORST THAN THE SECOND TRY TAKE THE FIRST TRY C IF (FMODE(M).EQ.2) THEN IF (ABS(VAR).GT.ABS(SSVAR).OR.ABS(VAR).EQ.0. & .OR.NPFIT(M).LE.4) THEN FMODE(M) = 1 VAR=SSVAR B = SSB A = SSA NPFIT(M) = SSNPFIT ENDIF ENDIF C C IF THE SECOND TRY AND THE FIT IS WORST THAN THE FIRST TRY TAKE THE FIRST TRY C IF (FMODE(M).EQ.1) THEN IF (ABS(VAR).GT.ABS(SVAR).OR.ABS(VAR).EQ.0.) THEN FMODE(M) = 0 VAR=SVAR B = SB A = SA NPFIT(M) = SNPFIT ENDIF ENDIF C VARFIT(M) = VAR IF (M.EQ.1) CX = B IF (M.EQ.2) CY = B DEVIA(M) = A TG(M) = A C ENDDO C 500 CONTINUE RETURN END