--- DarthVader/CalorimeterLevel2/src/direction.for 2006/05/19 13:15:50 1.1.1.1 +++ DarthVader/CalorimeterLevel2/src/direction.for 2007/11/22 13:53:28 1.7 @@ -19,20 +19,27 @@ INCLUDE 'INTEST.TXT' + REAL FLIMIT, FLIMIT2 INTEGER NVAR,NPAR PARAMETER (NVAR=1,NPAR=2) - - REAL X(NPLA),Y(NPLA),W(NPLA) +c PARAMETER (FLIMIT=10000) +c PARAMETER (FLIMIT2=2000) +c PARAMETER (FLIMIT=500) + PARAMETER (FLIMIT=2000) + PARAMETER (FLIMIT2=500) + REAL X(NPLAV),Y(NPLAV),W(NPLAV) REAL DEVIA(2),TG(2) - REAL BAR(2,NPLA) + REAL BAR(2,NPLAV) REAL A, B, VAR - REAL PIANO(22) + REAL SA, SB, SVAR + REAL SSA, SSB, SSVAR + REAL PIANO(NPLAV) REAL VARFIT(2) - INTEGER ICONT, M, I - INTEGER NPFIT(2) + INTEGER ICONT, M, I, SNPFIT,SSNPFIT + INTEGER NPFIT(2), CHTRACK,IWPL(2) - INTEGER IBAR(2,NPLA) + INTEGER IBAR(2,NPLAV) COMMON/ANGOLO/BAR,IBAR SAVE /ANGOLO/ @@ -40,7 +47,7 @@ COMMON/WHERE/CX,CY,PIANO SAVE /WHERE/ - COMMON/CALOFIT/VARFIT,NPFIT + COMMON/CALOFIT/VARFIT,NPFIT,IWPL,CHTRACK SAVE/CALOFIT/ C ICONT = 0 @@ -59,38 +66,138 @@ 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) + CALL VZERO(X,NPLAV) + CALL VZERO(Y,NPLAV) + CALL VZERO(W,NPLAV) DO I = 1,NPLA C IF (MOD(M,2).EQ.0) THEN - X(I) = PIANO(I) - 5.81 + X(I) = PIANO(I) +C X(I) = PIANO(I) - 5.81 ELSE - X(I) = PIANO(I) + X(I) = PIANO(I) - 5.81 +C X(I) = PIANO(I) ENDIF -C X(I) = -(I-1) * PIANO Y(I) = 0. - 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.) W(I) = 2000. +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 - if (Y(I).eq.0.or.W(I).eq.2000.) NPFIT(M) = NPFIT(M) - 1 +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) + W(I) = ((CLUS(M,I,1+NCHA/2)**0.29))**2. +c 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) + W(I) = ((CLUS(M,I,1+NCHA/2)**0.79))**2. +c 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. - IF (ICONT.GE.2) CALL LFITW(X,Y,W,NPLA,0,A,B,VAR) + 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 -C DEVIA(M) = A TG(M) = A +C ENDDO C