*CMZ : 08/11/96 16.07.32 by T. Oest *-- Author : T. Oest 20/03/96 SUBROUTINE V0K0S ************************************************************************ * * Description: K0s reconstruction, only one solution is stored * new : cut on B0 mass (50 MeV) * * Called from: * * External references: * * Argument in/out description * * * Modifications * -- check tracks for common segments 29/02/2000 T.Oest * ************************************************************************ IMPLICIT NONE #include "arte/Arte.fi" #include "arte/ArteFlag.fi" #include "auto/EV.fi" #include "auto/CON.fi" #include "auto/GEO.fi" INTEGER IT1, IT2, ITERA1, ITERA2, IRET1, IRET2, I INTEGER NTRACK, FLAG, IRET3 INTEGER TOPP0, TOPP1, TOPP2 DOUBLE PRECISION PAR(9), WPAR(9,9), VPAR(9,9), CH1, CHT1 DOUBLE PRECISION PAR2(9), WPAR2(9,9),VPAR2(9,9), CH2, CHT2 DOUBLE PRECISION E1, E2, MV0, PTRK(7), VTRK(7,7), EPSI DOUBLE PRECISION PI1(4), PI2(4), PV0(4), MPI, MK0S, PSI(4) DOUBLE PRECISION PTRK5(5), VTRK5(5,5), ZOUT LOGICAL SELECT REAL*4 CHIMAX, PMIN, DMASS, DMASSM, TX, TY,ZMIN,ZMAX INTEGER IPSI1, IPSI2, IRTRA, IRET, TEST INTEGER IK0S INTEGER TPNAME #include "arte/Arte.ff" #include "auto/EV.ff" #include "auto/CON.ff" #include "auto/GEO.ff" DATA MK0S /0.497672D0/, MPI/0.13956995D0/ DATA CHIMAX /1000000./, PMIN /5./ DATA DMASS /0.030/, DMASSM /0.030/ ************************************************************************ C C CALL V0MATCH() C----------------------------------------------------------------- C loop over track pairs C----------------------------------------------------------------- NTRACK = NRTRA() DO IT1=1,NTRACK DO IT2=IT1+1,NTRACK C----------------------------------------------------------------- C test histos C----------------------------------------------------------------- C TEST = 0 C IF (IRTRA_HRI(IT1) .EQ. IRTRA_HRI(IT2) .AND. C + IRTRA_HRI(IT1) .NE. 0) THEN C IK0S = IRTRA_HRI(IT1) C IQ(IQMTRA_FLAG(IK0S)) = max(1,IMTRA_FLAG(IK0S)) C print*,' k0s tracks found ', IT1,IT2 C TEST = 1 C ENDIF C------------------------------------------------------- end CALL V0SELT(IT1,IRET1) c IF (TEST .EQ. 1) print*,' iret1 ',iret1 IF (IRET1.EQ.0) THEN C IF (TEST .EQ. 1) IQ(IQMTRA_FLAG(IK0S))=max(2,IMTRA_FLAG(IK0S)) CALL V0SELT(IT2,IRET2) CALL V0SELT2(IT1,IT2,IRET3) c IF (TEST .EQ. 1) print*,' iret2 ',iret2 IF (IRET2.EQ.0 .AND. IRET3.EQ.0) THEN C IF (TEST .EQ. 1) IQ(IQMTRA_FLAG(IK0S))=max(3,IMTRA_FLAG(IK0S)) IF (FRTRA_PF(IT1)*FRTRA_PF(IT2).LT.0.0) THEN C IF (TEST .EQ. 1) IQ(IQMTRA_FLAG(IK0S))=max(4,IMTRA_FLAG(IK0S)) c IF (TEST .EQ. 1) print*,' charge ok' C----------------------------------------------------------------- C track momenta in front of magnet C ZMIN > FRTRA_ZF C----------------------------------------------------------------- IF (FRTRA_ZF(IT1).GT.200. .AND. FRTRA_ZF(IT2).GT.200.) THEN IF (FRTRA_TYF(IT1).NE.FRTRA_TYF(IT2)) THEN ZMIN = DBLE((FRTRA_YF(IT1)-FRTRA_TYF(IT1)*FRTRA_ZF(IT1) + -FRTRA_YF(IT2)+FRTRA_TYF(IT2)*FRTRA_ZF(IT2))/ + (FRTRA_TYF(IT2)-FRTRA_TYF(IT1))) ELSE ZMIN = 0.0D0 ENDIF ELSE ZMIN = DBLE(MIN(FRTRA_ZF(IT1),FRTRA_ZF(IT2))) ENDIF ZMAX = DBLE(MAX(FRTRA_ZF(IT1),FRTRA_ZF(IT2))) ZOUT = DBLE(ZMIN) c PRINT*,' zmin ',ZMIN,FRTRA_ZF(IT1),FRTRA_ZF(IT2) IF (ZMIN.LE.FRTRA_ZF(IT1) .AND. ZMIN.LE.FRTRA_ZF(IT2)) THEN IF (FRTRA_ZF(IT1).GE.200.) THEN CALL V0SWIM(.FALSE.,IT1 , ZOUT, PTRK5, VTRK5, IRET) PI1(4) = 1./ABS(PTRK5(5)) PI1(3) = PI1(4)/SQRT(1.+PTRK5(3)**2+PTRK5(4)**2) PI1(1) = PTRK5(3)*PI1(3) PI1(2) = PTRK5(4)*PI1(3) ELSE PI1(4) = DBLE(1./ABS(FRTRA_PF(IT1))) PI1(3) = PI1(4)/SQRT(1.+FRTRA_TXF(IT1)**2+FRTRA_TYF(IT1)**2) PI1(1) = FRTRA_TXF(IT1)*PI1(3) PI1(2) = FRTRA_TYF(IT1)*PI1(3) ENDIF IF (FRTRA_ZF(IT2).GE.200.) THEN CALL V0SWIM(.FALSE.,IT2 , ZOUT, PTRK5, VTRK5, IRET) PI2(4) = 1./ABS(PTRK5(5)) PI2(3) = PI2(4)/SQRT(1.+PTRK5(3)**2+PTRK5(4)**2) PI2(1) = PTRK5(3)*PI2(3) PI2(2) = PTRK5(4)*PI2(3) ELSE PI2(4) = DBLE(1./ABS(FRTRA_PF(IT2))) PI2(3) = PI2(4)/SQRT(1.+FRTRA_TXF(IT2)**2+FRTRA_TYF(IT2)**2) PI2(1) = FRTRA_TXF(IT2)*PI2(3) PI2(2) = FRTRA_TYF(IT2)*PI2(3) ENDIF E1 = SQRT(PI1(4)**2+0.1396**2) E2 = SQRT(PI2(4)**2+0.1396**2) C----------------------------------------------------------------- C check for B0 candidate C----------------------------------------------------------------- SELECT = .FALSE. IPSI1 = 0 IPSI2 = 0 DO IRTRA=1,NRTRA() IF (IRTRA_FIT(IRTRA).EQ.110) THEN IF (IPSI1.EQ.0) THEN IPSI1 = IRTRA ENDIF IPSI2 = IRTRA ENDIF ENDDO IF (IPSI2.NE.0) THEN DO IRTRA=IPSI1,IPSI2 IF (.NOT.SELECT) THEN PSI(4) = DBLE(1./ABS(FRTRA_PF(IRTRA))) PSI(3) = PSI(4)/SQRT(1.+FRTRA_TXF(IRTRA)**2 + +FRTRA_TYF(IRTRA)**2) PSI(1) = FRTRA_TXF(IRTRA)*PSI(3) PSI(2) = FRTRA_TYF(IRTRA)*PSI(3) EPSI = SQRT(PSI(4)**2+3.09688**2) DO I=1,3 PV0(I) = PI1(I) + PI2(I) + PSI(I) ENDDO PV0(4) = SQRT(PV0(1)**2+PV0(2)**2+PV0(3)**2) MV0 = SQRT(MAX(0.0,(E1+E2+EPSI)**2 - PV0(4)**2)) IF ( ABS(MV0-5.279).LE.0.05 ) SELECT = .TRUE. ENDIF c PRINT*,' MASS ',IT1,IT2,IRTRA,SNGL(MV0) ENDDO ENDIF C----------------------------------------------------------------- C momentum, angle cuts for tracks in front of magnet C----------------------------------------------------------------- IF (.NOT.SELECT) THEN c print*,' z position ',FRTRA_ZF(IT1),FRTRA_ZF(IT2) c IF (FRTRA_ZF(IT1).GT.200. .AND. FRTRA_ZF(IT2).GT.200.) THEN c SELECT = .TRUE. c ELSE DO I=1,3 PV0(I) = PI1(I) + PI2(I) ENDDO PV0(4) = SQRT(PV0(1)**2+PV0(2)**2+PV0(3)**2) IF (PV0(3) .NE. 0.0) THEN TX = SNGL(PV0(1)/PV0(3)) TY = SNGL(PV0(2)/PV0(3)) ELSE TX = 10. TY = 10. ENDIF MV0 = SQRT(MAX(0.0,2.*0.1396**2 + 2.*(E1*E2 - PI1(1)*PI2(1) + - PI1(2)*PI2(2)- PI1(3)*PI2(3)))) c print*,' p1 ', e1,PI1(1),PI1(2),PI1(3) c print*,' p2 ', e2,PI2(1),PI2(2),PI2(3) c print*,' mass ', MV0 IF (PV0(4).GT.PMIN .AND. ABS(TX).LT.0.2 .AND. ABS(TY).LT.0.2 + .AND. ((ABS(MV0-MK0S).LT.DMASS .AND. ZMAX.LE.200.).OR. + (ABS(MV0-MK0S).LT.DMASSM.AND. ZMAX.GT.200.))) THEN SELECT = .TRUE. ELSE SELECT = .FALSE. ENDIF c IF (TEST .EQ. 1) print*,' mass',MV0,PV0(4), select ENDIF c ENDIF 1122 continue IF (SELECT) THEN C IF (TEST .EQ. 1) IQ(IQMTRA_FLAG(IK0S))=max(5,IMTRA_FLAG(IK0S)) C----------------------------------------------------------------- C V0 fit C----------------------------------------------------------------- c print*,' call v0fit ',it1, it2 CALL V0FIT (IT1, IT2, PAR, VPAR, WPAR, CH1, CHT1, + PAR2, VPAR2, WPAR2, CH2, CHT2, + ITERA1, ITERA2, IRET) c print*,' v0fit ',iret,ch1 C IF (TEST .EQ. 1) print*,' fit', iret, ch1 IF (IRET.GE.0 .AND. CH1.LT.CHIMAX) THEN C IF (TEST .EQ. 1) IQ(IQMTRA_FLAG(IK0S))=max(6,IMTRA_FLAG(IK0S)) C----------------------------------------------------------------- C select and store K0s (first solution) C cuts applied: chi < chimax C |mv0-mks| < dmass C----------------------------------------------------------------- CALL V0TRK(MPI, MPI, PAR, VPAR, PTRK, VTRK) C----------------------------------------------------------------- C mass constraint C----------------------------------------------------------------- CALL V0MASS(MK0S, PTRK, VTRK, IRET) IF (IRET.EQ.0) THEN IF ((ABS(PTRK(7)-MK0S).LT.DMASS .AND. PTRK(1).LT.200.) .OR. + (ABS(PTRK(7)-MK0S).LT.DMASSM.AND. PTRK(1).GE.200.)) THEN c print*,' store a K0s ',IT1,IT2 C----------------------------------------------------------------- C store K0s vertex C----------------------------------------------------------------- TOPP0 = TPNAME('K_S ') IF (FRTRA_PF(IT1).LT.0.0) THEN TOPP1 = TPNAME('pi- ') TOPP2 = TPNAME('pi+ ') ELSE TOPP1 = TPNAME('pi+ ') TOPP2 = TPNAME('pi- ') ENDIF FLAG = 100 C IF (TEST .EQ. 1) IQ(IQMTRA_FLAG(IK0S))=max(7,IMTRA_FLAG(IK0S)) CALL V0STOR(FLAG, IT1, IT2, CH1, PTRK, VTRK, TOPP0, + TOPP1, TOPP2) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDDO ENDDO 9000 END ************************************************************************ * End ************************************************************************