SUBROUTINE PHCORK(MODCOR) implicit none C.---------------------------------------------------------------------- C. C. PHCORK: corrects kinmatics of subbranch needed if host program C. produces events with the shaky momentum conservation C C. Input Parameters: Common /PHOEVT/, MODCOR C. MODCOR >0 type of action C. =1 no action C. =2 corrects energy from mass C. =3 corrects mass from energy C. =4 corrects energy from mass for C. particles up to .4 GeV mass, C. for heavier ones corrects mass, C. =0 execution mode C. C. Output Parameters: corrected /PHOEVT/ C. C. Author(s): P.Golonka, Z. Was Created at: 01/02/99 C. Modified : 08/02/99 C.---------------------------------------------------------------------- INTEGER NMXPHO PARAMETER (NMXPHO=10000) REAL*8 M,P2,PX,PY,PZ,E,EN,MCUT INTEGER MODCOR,MODOP,I,IEV,IPRINT INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO REAL*8 PPHO,VPHO COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO), &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO) INTEGER PHLUN COMMON/PHOLUN/PHLUN COMMON /PHNUM/ IEV SAVE MODOP DATA MODOP /0/ SAVE IPRINT DATA IPRINT /0/ SAVE MCUT IF (MODCOR.NE.0) THEN C INITIALIZATION MODOP=MODCOR WRITE(PHLUN,*) 'Message from PHCORK(MODCOR):: initialization' IF (MODOP.EQ.1) THEN WRITE(PHLUN,*) 'MODOP=1 -- no corrections on event: DEFAULT' ELSEIF (MODOP.EQ.2) THEN WRITE(PHLUN,*) 'MODOP=2 -- corrects Energy from mass' ELSEIF (MODOP.EQ.3) THEN WRITE(PHLUN,*) 'MODOP=3 -- corrects mass from Energy' ELSEIF (MODOP.EQ.4) THEN WRITE(PHLUN,*) 'MODOP=4 -- corrects Energy from mass to Mcut' WRITE(PHLUN,*) ' and mass from energy above Mcut ' MCUT=0.4 WRITE(PHLUN,*) 'Mcut=',MCUT,'GeV' ELSE WRITE(PHLUN,*) 'PHCORK wrong MODCOR=',MODCOR STOP ENDIF RETURN ENDIF IF (MODOP.EQ.0.AND.MODCOR.EQ.0) THEN WRITE(PHLUN,*) 'PHCORK lack of initialization' STOP ENDIF C execution mode C ============== C ============== PX=0 PY=0 PZ=0 E =0 IF (MODOP.EQ.1) THEN C ----------------------- C In this case we do nothing RETURN ELSEIF(MODOP.EQ.2) THEN C ----------------------- CC lets loop thru all daughters and correct their energies CC according to E^2=p^2+m^2 DO I=3,NPHO PX=PX+PPHO(1,I) PY=PY+PPHO(2,I) PZ=PZ+PPHO(3,I) P2=PPHO(1,I)**2+PPHO(2,I)**2+PPHO(3,I)**2 EN=SQRT( PPHO(5,I)**2 + P2) IF (IPRINT.EQ.1) & WRITE(PHLUN,*) 'CORRECTING ENERGY OF ',I,':', & PPHO(4,I),'=>',EN PPHO(4,I)=EN E = E+PPHO(4,I) ENDDO ELSEIF(MODOP.EQ.3) THEN C ----------------------- CC lets loop thru all daughters and correct their masses CC according to E^2=p^2+m^2 DO I=3,NPHO PX=PX+PPHO(1,I) PY=PY+PPHO(2,I) PZ=PZ+PPHO(3,I) E = E+PPHO(4,I) P2=PPHO(1,I)**2+PPHO(2,I)**2+PPHO(3,I)**2 M=SQRT(ABS( PPHO(4,I)**2 - P2)) IF (IPRINT.EQ.1) & WRITE(PHLUN,*) 'CORRECTING MASS OF ',I,':', & PPHO(5,I),'=>',M PPHO(5,I)=M ENDDO ELSEIF(MODOP.EQ.4) THEN C ----------------------- CC lets loop thru all daughters and correct their masses CC or energies according to E^2=p^2+m^2 DO I=3,NPHO PX=PX+PPHO(1,I) PY=PY+PPHO(2,I) PZ=PZ+PPHO(3,I) P2=PPHO(1,I)**2+PPHO(2,I)**2+PPHO(3,I)**2 M=SQRT(ABS( PPHO(4,I)**2 - P2)) IF (M.GT.MCUT) THEN IF (IPRINT.EQ.1) & WRITE(PHLUN,*) 'CORRECTING MASS OF ',I,':', & PPHO(5,I),'=>',M PPHO(5,I)=M E = E+PPHO(4,I) ELSE EN=SQRT( PPHO(5,I)**2 + P2) IF (IPRINT.EQ.1) & WRITE(PHLUN,*) 'CORRECTING ENERGY OF ',I,':', & PPHO(4,I),'=>',EN PPHO(4,I)=EN E = E+PPHO(4,I) ENDIF ENDDO ENDIF C ----- IF (IPRINT.EQ.1) THEN WRITE(PHLUN,*) 'CORRECTING MOTHER' WRITE(PHLUN,*) 'PX:',PPHO(1,1),'=>',PX-PPHO(1,2) WRITE(PHLUN,*) 'PY:',PPHO(2,1),'=>',PY-PPHO(2,2) WRITE(PHLUN,*) 'PZ:',PPHO(3,1),'=>',PZ-PPHO(3,2) WRITE(PHLUN,*) ' E:',PPHO(4,1),'=>',E-PPHO(4,2) ENDIF PPHO(1,1)=PX-PPHO(1,2) PPHO(2,1)=PY-PPHO(2,2) PPHO(3,1)=PZ-PPHO(3,2) PPHO(4,1)=E -PPHO(4,2) P2=PPHO(1,1)**2+PPHO(2,1)**2+PPHO(3,1)**2 IF (PPHO(4,1)**2.GT.P2) THEN M=SQRT( PPHO(4,1)**2 - P2 ) IF (IPRINT.EQ.1) & WRITE(PHLUN,*) ' M:',PPHO(5,1),'=>',M PPHO(5,1)=M ENDIF CALL PHLUPA(25) END