photos.f

00001 
00002 *///////////////////////////////////////////////////////////////////////
00003 *//                                                                     
00004 *//  !!!!!!! WARNING!!!!!   This source may be  agressive !!!!          
00005 *//                                                                     
00006 *//  Due to short common block names it may owerwrite variables in other
00007 *//  parts of the code.                                                 
00008 *//                                                                     
00009 *//  One should add suffix c_Photos_ to names of all commons as soon as 
00010 *//  possible!!  
00011 *///////////////////////////////////////////////////////////////////////
00012 
00013 C.----------------------------------------------------------------------
00014 C.
00015 C.    PHOTOS:   PHOtos CDE-s
00016 C.
00017 C.    Purpose:  Keep definitions  for PHOTOS QED correction Monte Carlo.
00018 C.
00019 C.    Input Parameters:   None
00020 C.
00021 C.    Output Parameters:  None
00022 C.
00023 C.    Author(s):  Z. Was, B. van Eijk             Created at:  29/11/89
00024 C.                                                Last Update: 10/08/93
00025 C.
00026 C. =========================================================
00027 C.    General Structure Information:                       =
00028 C. =========================================================
00029 C:   ROUTINES:
00030 C.             1) INITIALIZATION (all in C++ now)
00031 C.             2) GENERAL INTERFACE:
00032 C.                                      PHOBOS
00033 C.                                      PHOIN
00034 C.                                      PHOTWO (specific interface
00035 C.                                      PHOOUT
00036 C.                                      PHOCHK
00037 C.                                      PHTYPE (specific interface
00038 C.                                      PHOMAK (specific interface
00039 C.             3) QED PHOTON GENERATION:
00040 C.                                      PHINT
00041 C.                                      PHOBW
00042 C.                                      PHOPRE
00043 C.                                      PHOOMA
00044 C.                                      PHOENE
00045 C.                                      PHOCOR
00046 C.                                      PHOFAC
00047 C.                                      PHODO
00048 C.             4) UTILITIES:
00049 C.                                      PHOTRI
00050 C.                                      PHOAN1
00051 C.                                      PHOAN2
00052 C.                                      PHOBO3
00053 C.                                      PHORO2
00054 C.                                      PHORO3
00055 C.                                      PHOCHA
00056 C.                                      PHOSPI
00057 C.                                      PHOERR
00058 C.                                      PHOREP
00059 C.                                      PHLUPA
00060 C.                                      PHCORK
00061 C.                                      IPHQRK
00062 C.                                      IPHEKL
00063 C.   COMMONS:
00064 C.   NAME     USED IN SECT. # OF OCC.     Comment
00065 C.   PHOQED   1) 2)            3      Flags whether emisson to be gen. 
00066 C.   PHOLUN   1) 4)            6      Output device number
00067 C.   PHOCOP   1) 3)            4      photon coupling & min energy
00068 C.   PHPICO   1) 3) 4)         5      PI & 2*PI
00069 C.   PHOSTA   1) 4)            3      Status information
00070 C.   PHOKEY   1) 2) 3)         7      Keys for nonstandard application
00071 C.   PHOVER   1)               1      Version info for outside
00072 C.   HEPEVT   2)               2      PDG common
00073 C.   PH_HEPEVT2)               8      PDG common internal
00074 C.   PHOEVT   2) 3)           10      PDG branch
00075 C.   PHOIF    2) 3)            2      emission flags for PDG branch 
00076 C.   PHOMOM   3)               5      param of char-neutr system
00077 C.   PHOPHS   3)               5      photon momentum parameters
00078 C.   PHOPRO   3)               4      var. for photon rep. (in branch)
00079 C.   PHOCMS   2)               3      parameters of boost to branch CMS
00080 C.   PHNUM    4)               1      event number from outside         
00081 C.----------------------------------------------------------------------
00082       SUBROUTINE PHOBOS(IP,PBOOS1,PBOOS2,FIRST,LAST)
00083 C.----------------------------------------------------------------------
00084 C.
00085 C.    PHOBOS:   PHOton radiation in decays BOoSt routine
00086 C.
00087 C.    Purpose:  Boost particles  in  cascade decay  to parent rest frame
00088 C.              and boost back with modified boost vector.
00089 C.
00090 C.    Input Parameters:       IP:  pointer of particle starting chain
00091 C.                                 to be boosted
00092 C.                        PBOOS1:  Boost vector to rest frame,
00093 C.                        PBOOS2:  Boost vector to modified frame,
00094 C.                        FIRST:   Pointer to first particle to be boos-
00095 C.                                 ted (/PH_HEPEVT/),
00096 C.                        LAST:    Pointer to last  particle to be boos-
00097 C.                                 ted (/PH_HEPEVT/).
00098 C.
00099 C.    Output Parameters:  Common /PH_HEPEVT/.
00100 C.
00101 C.    Author(s):  B. van Eijk                     Created at:  13/02/90
00102 C.                Z. Was                          Last Update: 16/11/93
00103 C.
00104 C.----------------------------------------------------------------------
00105       IMPLICIT NONE
00106       DOUBLE PRECISION BET1(3),BET2(3),GAM1,GAM2,PB,DATA
00107       INTEGER I,J,FIRST,LAST,MAXSTA,NSTACK,IP
00108       PARAMETER (MAXSTA=10000)
00109       INTEGER STACK(MAXSTA)
00110       REAL*8 PBOOS1(5),PBOOS2(5)
00111       INTEGER NMXHEP
00112       PARAMETER (NMXHEP=10000)
00113       INTEGER IDHEP,ISTHEP,JDAHEP,JMOHEP,NEVHEP,NHEP
00114       REAL*8 PHEP,VHEP
00115       COMMON/PH_HEPEVT/NEVHEP,NHEP,ISTHEP(NMXHEP),IDHEP(NMXHEP),
00116      &JMOHEP(2,NMXHEP),JDAHEP(2,NMXHEP),PHEP(5,NMXHEP),VHEP(4,NMXHEP)
00117       IF ((LAST.EQ.0).OR.(LAST.LT.FIRST)) RETURN
00118       NSTACK=0
00119       DO 10 J=1,3
00120         BET1(J)=-PBOOS1(J)/PBOOS1(5)
00121    10 BET2(J)=PBOOS2(J)/PBOOS2(5)
00122       GAM1=PBOOS1(4)/PBOOS1(5)
00123       GAM2=PBOOS2(4)/PBOOS2(5)
00124 C--
00125 C--   Boost vector to parent rest frame...
00126    20 DO 50 I=FIRST,LAST
00127         PB=BET1(1)*PHEP(1,I)+BET1(2)*PHEP(2,I)+BET1(3)*PHEP(3,I)
00128         IF (JMOHEP(1,I).EQ.IP) THEN
00129          DO 30 J=1,3
00130    30    PHEP(J,I)=PHEP(J,I)+BET1(J)*(PHEP(4,I)+PB/(GAM1+1.D0))
00131          PHEP(4,I)=GAM1*PHEP(4,I)+PB
00132 C--
00133 C--    ...and boost back to modified parent frame.
00134          PB=BET2(1)*PHEP(1,I)+BET2(2)*PHEP(2,I)+BET2(3)*PHEP(3,I)
00135          DO 40 J=1,3
00136    40    PHEP(J,I)=PHEP(J,I)+BET2(J)*(PHEP(4,I)+PB/(GAM2+1.D0))
00137          PHEP(4,I)=GAM2*PHEP(4,I)+PB
00138          IF (JDAHEP(1,I).NE.0) THEN
00139            NSTACK=NSTACK+1
00140 C--
00141 C--    Check on stack length...
00142            IF (NSTACK.GT.MAXSTA) THEN
00143              DATA=NSTACK
00144              CALL PHOERR(7,'PHOBOS',DATA)
00145            ENDIF
00146            STACK(NSTACK)=I
00147          ENDIF
00148         ENDIF
00149    50 CONTINUE
00150       IF (NSTACK.NE.0) THEN
00151 C--
00152 C--   Now go one step further in the decay tree...
00153         FIRST=JDAHEP(1,STACK(NSTACK))
00154         LAST=JDAHEP(2,STACK(NSTACK))
00155         IP=STACK(NSTACK)
00156         NSTACK=NSTACK-1
00157         GOTO 20
00158       ENDIF
00159       RETURN
00160       END
00161       SUBROUTINE PHOIN(IP,BOOST,NHEP0)
00162 C.----------------------------------------------------------------------
00163 C.
00164 C.    PHOIN:   PHOtos INput
00165 C.
00166 C.    Purpose:  copies IP branch of the common /PH_HEPEVT/ into /PHOEVT/
00167 C.              moves branch into its CMS system.
00168 C.
00169 C.    Input Parameters:       IP:  pointer of particle starting branch
00170 C.                                 to be copied
00171 C.                        BOOST:   Flag whether boost to CMS was or was 
00172 C     .                            not performed.
00173 C.
00174 C.    Output Parameters:  Commons: /PHOEVT/, /PHOCMS/
00175 C.
00176 C.    Author(s):  Z. Was                          Created at:  24/05/93
00177 C.                                                Last Update: 16/11/93
00178 C.
00179 C.----------------------------------------------------------------------
00180       IMPLICIT NONE
00181       INTEGER NMXHEP
00182       PARAMETER (NMXHEP=10000)
00183       INTEGER IDHEP,ISTHEP,JDAHEP,JMOHEP,NEVHEP,NHEP
00184       REAL*8 PHEP,VHEP
00185       COMMON/PH_HEPEVT/NEVHEP,NHEP,ISTHEP(NMXHEP),IDHEP(NMXHEP),
00186      &JMOHEP(2,NMXHEP),JDAHEP(2,NMXHEP),PHEP(5,NMXHEP),VHEP(4,NMXHEP)
00187       INTEGER NMXPHO
00188       PARAMETER (NMXPHO=10000)
00189       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
00190       REAL*8 PPHO,VPHO
00191       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
00192      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
00193       INTEGER IP,IP2,I,FIRST,LAST,LL,NA
00194       LOGICAL BOOST
00195       INTEGER J,NHEP0
00196       DOUBLE PRECISION BET(3),GAM,PB
00197       COMMON /PHOCMS/ BET,GAM
00198       LOGICAL INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00199       REAL*8 FINT,FSEC,EXPEPS
00200       COMMON /PHOKEY/ FSEC,FINT,EXPEPS,INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00201 C--
00202 C let-s calculate size of the little common entry
00203         FIRST=JDAHEP(1,IP)
00204         LAST =JDAHEP(2,IP)
00205         NPHO=3+LAST-FIRST+NHEP-NHEP0
00206         NEVPHO=NPHO
00207 C let-s take in decaying particle
00208            IDPHO(1)=IDHEP(IP)
00209            JDAPHO(1,1)=3
00210            JDAPHO(2,1)=3+LAST-FIRST
00211            DO I=1,5
00212              PPHO(I,1)=PHEP(I,IP)
00213            ENDDO
00214 C let-s take in eventual second mother
00215          IP2=JMOHEP(2,JDAHEP(1,IP))
00216          IF((IP2.NE.0).AND.(IP2.NE.IP)) THEN 
00217            IDPHO(2)=IDHEP(IP2)
00218            JDAPHO(1,2)=3
00219            JDAPHO(2,2)=3+LAST-FIRST
00220            DO I=1,5
00221              PPHO(I,2)=PHEP(I,IP2)
00222            ENDDO
00223          ELSE
00224            IDPHO(2)=0
00225            DO I=1,5
00226              PPHO(I,2)=0.0D0
00227            ENDDO
00228          ENDIF
00229 C let-s take in daughters
00230         DO LL=0,LAST-FIRST
00231            IDPHO(3+LL)=IDHEP(FIRST+LL)
00232            JMOPHO(1,3+LL)=JMOHEP(1,FIRST+LL)
00233            IF (JMOHEP(1,FIRST+LL).EQ.IP) JMOPHO(1,3+LL)=1
00234            DO I=1,5
00235              PPHO(I,3+LL)=PHEP(I,FIRST+LL)
00236            ENDDO
00237         ENDDO
00238         IF (NHEP.GT.NHEP0) THEN
00239 C let-s take in illegitimate daughters
00240         NA=3+LAST-FIRST 
00241         DO LL=1,NHEP-NHEP0
00242            IDPHO(NA+LL)=IDHEP(NHEP0+LL)
00243            JMOPHO(1,NA+LL)=JMOHEP(1,NHEP0+LL)
00244            IF (JMOHEP(1,NHEP0+LL).EQ.IP) JMOPHO(1,NA+LL)=1
00245            DO I=1,5
00246              PPHO(I,NA+LL)=PHEP(I,NHEP0+LL)
00247            ENDDO
00248         ENDDO
00249 C--        there is NHEP-NHEP0 daugters more.
00250            JDAPHO(2,1)=3+LAST-FIRST+NHEP-NHEP0
00251         ENDIF
00252         IF(IDPHO(NPHO).EQ.22)CALL PHLUPA(100001)
00253 !        IF(IDPHO(NPHO).EQ.22) stop
00254         CALL PHCORK(0)
00255         IF(IDPHO(NPHO).EQ.22)CALL PHLUPA(100002)
00256 C special case of t tbar production process
00257         IF(IFTOP) CALL PHOTWO(0)
00258         BOOST=.FALSE.
00259 C--   Check whether parent is in its rest frame...
00260 C ZBW ND  27.07.2009:
00261 C bug reported by Vladimir Savinov localized and fixed.
00262 C protection against rounding error was back-firing if soft
00263 C momentum of mother was physical. Consequence was that PHCORK was
00264 C messing up masses of final state particles in vertex of the decay.
00265 C Only configurations with previously generated photons of energy fraction
00266 C smaller than 0.0001 were affected. Effect was numerically insignificant. 
00267 
00268 C      IF (     (ABS(PPHO(4,1)-PPHO(5,1)).GT.PPHO(5,1)*1.D-8)
00269 C     $    .AND.(PPHO(5,1).NE.0))                            THEN
00270 
00271       IF ((ABS(PPHO(1,1)+ABS(PPHO(2,1))+ABS(PPHO(3,1))).GT.
00272      $    PPHO(5,1)*1.D-8).AND.(PPHO(5,1).NE.0))    THEN
00273 
00274         BOOST=.TRUE.
00275 
00276 C--
00277 C--   Boost daughter particles to rest frame of parent...
00278 C--   Resultant neutral system already calculated in rest frame !
00279         DO 10 J=1,3
00280    10   BET(J)=-PPHO(J,1)/PPHO(5,1)
00281         GAM=PPHO(4,1)/PPHO(5,1)
00282         DO 30 I=JDAPHO(1,1),JDAPHO(2,1)
00283           PB=BET(1)*PPHO(1,I)+BET(2)*PPHO(2,I)+BET(3)*PPHO(3,I)
00284           DO 20 J=1,3
00285    20     PPHO(J,I)=PPHO(J,I)+BET(J)*(PPHO(4,I)+PB/(GAM+1.D0))
00286    30   PPHO(4,I)=GAM*PPHO(4,I)+PB
00287 C--    Finally boost mother as well
00288           I=1   
00289           PB=BET(1)*PPHO(1,I)+BET(2)*PPHO(2,I)+BET(3)*PPHO(3,I)
00290           DO J=1,3
00291             PPHO(J,I)=PPHO(J,I)+BET(J)*(PPHO(4,I)+PB/(GAM+1.D0))
00292           ENDDO
00293           PPHO(4,I)=GAM*PPHO(4,I)+PB
00294       ENDIF
00295 C special case of t tbar production process
00296         IF(IFTOP) CALL PHOTWO(1)
00297       CALL PHLUPA(2)
00298         IF(IDPHO(NPHO).EQ.22) CALL PHLUPA(10000)
00299 !        IF(IDPHO(NPHO-1).EQ.22) stop
00300       END 
00301       SUBROUTINE PHOTWO(MODE)
00302 C.----------------------------------------------------------------------
00303 C.
00304 C.    PHOTWO:   PHOtos but TWO mothers allowed
00305 C.
00306 C.    Purpose:  Combines two mothers into one in /PHOEVT/
00307 C.              necessary eg in case of g g (q qbar) --> t tbar 
00308 C.
00309 C.    Input Parameters: Common /PHOEVT/ (/PHOCMS/)
00310 C.
00311 C.    Output Parameters:  Common /PHOEVT/, (stored mothers)
00312 C.
00313 C.    Author(s):  Z. Was                          Created at:  5/08/93
00314 C.                                                Last Update:10/08/93
00315 C.
00316 C.----------------------------------------------------------------------
00317       IMPLICIT NONE
00318       INTEGER NMXPHO
00319       PARAMETER (NMXPHO=10000)
00320       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
00321       REAL*8 PPHO,VPHO
00322       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
00323      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
00324       DOUBLE PRECISION BET(3),GAM
00325       COMMON /PHOCMS/ BET,GAM
00326       INTEGER I,MODE
00327       REAL*8 MPASQR
00328       LOGICAL IFRAD
00329 C logical IFRAD is used to tag cases when two mothers may be 
00330 C merged to the sole one. 
00331 C So far used in case:
00332 C                      1) of t tbar production
00333 C
00334 C t tbar case
00335       IF(MODE.EQ.0) THEN
00336        IFRAD=(IDPHO(1).EQ.21).AND.(IDPHO(2).EQ.21)
00337        IFRAD=IFRAD.OR.(IDPHO(1).EQ.-IDPHO(2).AND.ABS(IDPHO(1)).LE.6)
00338        IFRAD=IFRAD
00339      &       .AND.(ABS(IDPHO(3)).EQ.6).AND.(ABS(IDPHO(4)).EQ.6)
00340         MPASQR= (PPHO(4,1)+PPHO(4,2))**2-(PPHO(3,1)+PPHO(3,2))**2
00341      &          -(PPHO(2,1)+PPHO(2,2))**2-(PPHO(1,1)+PPHO(1,2))**2
00342        IFRAD=IFRAD.AND.(MPASQR.GT.0.0D0)
00343        IF(IFRAD) THEN
00344 c.....combining first and second mother
00345             DO I=1,4
00346             PPHO(I,1)=PPHO(I,1)+PPHO(I,2)
00347             ENDDO
00348             PPHO(5,1)=SQRT(MPASQR)
00349 c.....removing second mother, 
00350             DO I=1,5
00351               PPHO(I,2)=0.0D0
00352             ENDDO
00353        ENDIF
00354       ELSE
00355 C boosting of the mothers to the reaction frame not implemented yet.
00356 C to do it in mode 0 original mothers have to be stored in new comon (?)
00357 C and in mode 1 boosted to cms. 
00358       ENDIF
00359       END 
00360       SUBROUTINE PHOOUT(IP,BOOST,NHEP0)
00361 C.----------------------------------------------------------------------
00362 C.
00363 C.    PHOOUT:   PHOtos OUTput
00364 C.
00365 C.    Purpose:  copies back IP branch of the common /PH_HEPEVT/ from 
00366 C.              /PHOEVT/ moves branch back from its CMS system.
00367 C.
00368 C.    Input Parameters:       IP:  pointer of particle starting branch
00369 C.                                 to be given back.
00370 C.                        BOOST:   Flag whether boost to CMS was or was 
00371 C     .                            not performed.
00372 C.
00373 C.    Output Parameters:  Common /PHOEVT/, 
00374 C.
00375 C.    Author(s):  Z. Was                          Created at:  24/05/93
00376 C.                                                Last Update:
00377 C.
00378 C.----------------------------------------------------------------------
00379       IMPLICIT NONE
00380       INTEGER NMXHEP
00381       PARAMETER (NMXHEP=10000)
00382       INTEGER IDHEP,ISTHEP,JDAHEP,JMOHEP,NEVHEP,NHEP
00383       REAL*8 PHEP,VHEP
00384       COMMON/PH_HEPEVT/NEVHEP,NHEP,ISTHEP(NMXHEP),IDHEP(NMXHEP),
00385      &JMOHEP(2,NMXHEP),JDAHEP(2,NMXHEP),PHEP(5,NMXHEP),VHEP(4,NMXHEP)
00386       INTEGER NMXPHO
00387       PARAMETER (NMXPHO=10000)
00388       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
00389       REAL*8 PPHO,VPHO
00390       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
00391      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
00392       INTEGER IP,LL,FIRST,LAST,I
00393       LOGICAL BOOST
00394       INTEGER NN,J,K,NHEP0,NA
00395       DOUBLE PRECISION BET(3),GAM,PB
00396       COMMON /PHOCMS/ BET,GAM
00397       IF(NPHO.EQ.NEVPHO) RETURN
00398 C--   When parent was not in its rest-frame, boost back...
00399       CALL PHLUPA(10)
00400       IF (BOOST) THEN
00401         DO 110 J=JDAPHO(1,1),JDAPHO(2,1)
00402           PB=-BET(1)*PPHO(1,J)-BET(2)*PPHO(2,J)-BET(3)*PPHO(3,J)
00403           DO 100 K=1,3
00404   100     PPHO(K,J)=PPHO(K,J)-BET(K)*(PPHO(4,J)+PB/(GAM+1.D0))
00405   110   PPHO(4,J)=GAM*PPHO(4,J)+PB
00406 C--   ...boost photon, or whatever else has shown up
00407         DO NN=NEVPHO+1,NPHO
00408           PB=-BET(1)*PPHO(1,NN)-BET(2)*PPHO(2,NN)-BET(3)*PPHO(3,NN)
00409           DO 120 K=1,3
00410   120     PPHO(K,NN)=PPHO(K,NN)-BET(K)*(PPHO(4,NN)+PB/(GAM+1.D0))
00411           PPHO(4,NN)=GAM*PPHO(4,NN)+PB
00412         ENDDO
00413       ENDIF
00414         CALL PHCORK(0)   ! we have to use it because it clears input 
00415                          ! for grandaughters modified in C++
00416         FIRST=JDAHEP(1,IP)
00417         LAST =JDAHEP(2,IP)
00418 C let-s take in original daughters
00419         DO LL=0,LAST-FIRST
00420          IDHEP(FIRST+LL) = IDPHO(3+LL)
00421            DO I=1,5
00422              PHEP(I,FIRST+LL) = PPHO(I,3+LL)
00423            ENDDO
00424         ENDDO
00425 C let-s take newcomers to the end of HEPEVT.
00426         NA=3+LAST-FIRST
00427         DO LL=1,NPHO-NA
00428          IDHEP(NHEP0+LL) = IDPHO(NA+LL)
00429          ISTHEP(NHEP0+LL)=ISTPHO(NA+LL)
00430          JMOHEP(1,NHEP0+LL)=IP
00431          JMOHEP(2,NHEP0+LL)=JMOHEP(2,JDAHEP(1,IP))
00432          JDAHEP(1,NHEP0+LL)=0
00433          JDAHEP(2,NHEP0+LL)=0
00434            DO I=1,5
00435              PHEP(I,NHEP0+LL) = PPHO(I,NA+LL)
00436            ENDDO
00437         ENDDO
00438         NHEP=NHEP+NPHO-NEVPHO
00439         CALL PHLUPA(20)
00440       END 
00441       SUBROUTINE PHOCHK(JFIRST)
00442 C.----------------------------------------------------------------------
00443 C.
00444 C.    PHOCHK:   checking branch.
00445 C.
00446 C.    Purpose:  checks whether particles in the common block /PHOEVT/
00447 C.              can be served by PHOMAK. 
00448 C.              JFIRST is the position in /PH_HEPEVT/ (!) of the first 
00449 C.              daughter of sub-branch under action.
00450 C.
00451 C.
00452 C.    Author(s):  Z. Was                           Created at: 22/10/92
00453 C.                                                Last Update: 11/12/00
00454 C.
00455 C.----------------------------------------------------------------------
00456 C     ********************
00457       IMPLICIT NONE
00458       INTEGER NMXPHO
00459       PARAMETER (NMXPHO=10000)
00460       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
00461       REAL*8 PPHO,VPHO
00462       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
00463      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
00464       LOGICAL CHKIF
00465       COMMON/PHOIF/CHKIF(NMXPHO)
00466       INTEGER NMXHEP
00467       PARAMETER (NMXHEP=10000)
00468       LOGICAL QEDRAD
00469       COMMON/PH_PHOQED/QEDRAD(NMXHEP)
00470       INTEGER JFIRST
00471       LOGICAL F
00472       INTEGER IDABS,NLAST,I,IPPAR
00473       LOGICAL INTERF,ISEC,ITRE,IEXP,IFTOP,IFW,IFNPI0,IFKL
00474       REAL*8 FINT,FSEC,EXPEPS
00475       COMMON /PHOKEY/ FSEC,FINT,EXPEPS,INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00476       LOGICAL IFRAD
00477       INTEGER IDENT,K,IQRK,IPHQRK,IEKL,IPHEKL
00478 C these are OK .... if you do not like somebody else, add here.
00479       F(IDABS)=
00480      &     ( ((IDABS.GT.9.OR.IQRK.NE.1).AND.(IDABS.LE.40)) 
00481      & .OR.(IDABS.GT.100) )
00482      & .AND.(IDABS.NE.21)
00483      $ .AND.(IDABS.NE.2101).AND.(IDABS.NE.3101).AND.(IDABS.NE.3201)
00484      & .AND.(IDABS.NE.1103).AND.(IDABS.NE.2103).AND.(IDABS.NE.2203)
00485      & .AND.(IDABS.NE.3103).AND.(IDABS.NE.3203).AND.(IDABS.NE.3303)
00486 C
00487       IQRK=IPHQRK(0) ! switch for emission from quark
00488       IEKL=IPHEKL(0)
00489       NLAST = NPHO
00490 C
00491       IPPAR=1
00492 C checking for good particles
00493       IFNPI0=.TRUE.
00494       IF (IEKL.GT.1) THEN ! exclude radiative corr in decay of pi0 
00495 C                         ! and Kl --> ee gamma
00496         IFNPI0= (IDPHO(1).NE.111) ! pi0
00497         IFKL  = ((IDPHO(1).EQ.130).AND.  ! Kl --> ee gamma
00498      $          ((IDPHO(3).EQ.22).OR.(IDPHO(4).EQ.22).OR.
00499      $           (IDPHO(5).EQ.22)).AND.
00500      $          ((IDPHO(3).EQ.11).OR.(IDPHO(4).EQ.11).OR.
00501      $           (IDPHO(5).EQ.11))     )
00502 
00503         IFNPI0=(IFNPI0.AND.(.NOT.IFKL))
00504       ENDIF
00505       DO 10 I=IPPAR,NLAST
00506       IDABS    = ABS(IDPHO(I))
00507 C possibly call on PHZODE is a dead (to be omitted) code. 
00508       CHKIF(I)= F(IDABS)       .AND.F(ABS(IDPHO(1)))
00509      &  .AND.   (IDPHO(2).EQ.0)
00510       IF(I.GT.2) CHKIF(I)=CHKIF(I).AND.QEDRAD(JFIRST+I-IPPAR-2)
00511      &                            .AND.IFNPI0
00512  10   CONTINUE
00513 C--
00514 C now we go to special cases, where CHKIF(I) will be overwritten
00515 C--
00516       IF(IFTOP) THEN
00517 C special case of top pair production
00518         DO  K=JDAPHO(2,1),JDAPHO(1,1),-1
00519            IF(IDPHO(K).NE.22) THEN
00520              IDENT=K
00521              GOTO 15
00522            ENDIF
00523         ENDDO
00524  15     CONTINUE
00525         IFRAD=((IDPHO(1).EQ.21).AND.(IDPHO(2).EQ.21))
00526      &  .OR. ((ABS(IDPHO(1)).LE.6).AND.((IDPHO(2)).EQ.(-IDPHO(1))))
00527         IFRAD=IFRAD
00528      &        .AND.(ABS(IDPHO(3)).EQ.6).AND.((IDPHO(4)).EQ.(-IDPHO(3)))
00529      &        .AND.(IDENT.EQ.4)   
00530         IF(IFRAD) THEN    
00531            DO 20 I=IPPAR,NLAST
00532            CHKIF(I)= .TRUE.
00533            IF(I.GT.2) CHKIF(I)=CHKIF(I).AND.QEDRAD(JFIRST+I-IPPAR-2)
00534  20        CONTINUE
00535         ENDIF
00536       ENDIF
00537 C--
00538 C--
00539       IF(IFTOP) THEN
00540 C special case of top decay
00541         DO  K=JDAPHO(2,1),JDAPHO(1,1),-1
00542            IF(IDPHO(K).NE.22) THEN
00543              IDENT=K
00544              GOTO 25
00545            ENDIF
00546         ENDDO
00547  25     CONTINUE
00548         IFRAD=((ABS(IDPHO(1)).EQ.6).AND.(IDPHO(2).EQ.0))
00549         IFRAD=IFRAD
00550      &        .AND.((ABS(IDPHO(3)).EQ.24).AND.(ABS(IDPHO(4)).EQ.5)
00551      &        .OR.(ABS(IDPHO(3)).EQ.5).AND.(ABS(IDPHO(4)).EQ.24))
00552      &        .AND.(IDENT.EQ.4)   
00553         IF(IFRAD) THEN    
00554            DO 30 I=IPPAR,NLAST
00555            CHKIF(I)= .TRUE.
00556            IF(I.GT.2) CHKIF(I)=CHKIF(I).AND.QEDRAD(JFIRST+I-IPPAR-2)
00557  30        CONTINUE
00558         ENDIF
00559       ENDIF
00560 C--
00561 C--
00562       END
00563       SUBROUTINE PHTYPE(ID)
00564 C.----------------------------------------------------------------------
00565 C.
00566 C.    PHTYPE:   Central manadgement routine.              
00567 C.
00568 C.    Purpose:   defines what kind of the 
00569 C.              actions will be performed at point ID. 
00570 C.
00571 C.    Input Parameters:       ID:  pointer of particle starting branch
00572 C.                                 in /PH_HEPEVT/ to be treated.
00573 C.
00574 C.    Output Parameters:  Common /PH_HEPEVT/.
00575 C.
00576 C.    Author(s):  Z. Was                          Created at:  24/05/93
00577 C.                P. Golonka                      Last Update: 27/06/04
00578 C.
00579 C.----------------------------------------------------------------------
00580       IMPLICIT NONE
00581       INTEGER NMXHEP
00582       PARAMETER (NMXHEP=10000)
00583       INTEGER IDHEP,ISTHEP,JDAHEP,JMOHEP,NEVHEP,NHEP
00584       REAL*8 PHEP,VHEP
00585       COMMON/PH_HEPEVT/NEVHEP,NHEP,ISTHEP(NMXHEP),IDHEP(NMXHEP),
00586      &JMOHEP(2,NMXHEP),JDAHEP(2,NMXHEP),PHEP(5,NMXHEP),VHEP(4,NMXHEP)
00587       LOGICAL INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00588       REAL*8 FINT,FSEC,EXPEPS
00589       COMMON /PHOKEY/ FSEC,FINT,EXPEPS,INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00590       LOGICAL EXPINI
00591       INTEGER NX,K,NCHAN
00592       PARAMETER (NX=10)
00593       REAL*8 PRO,PRSUM,ESU
00594       COMMON /PHOEXP/ PRO(NX),NCHAN,EXPINI
00595 
00596       INTEGER ID,NHEP0
00597       LOGICAL IPAIR
00598       REAL*8 RN,PHORANC,SUM
00599       INTEGER WTDUM
00600       LOGICAL IFOUR
00601 C--
00602       IFOUR=(.TRUE.).AND.(ITRE) ! we can make internal choice whether 
00603                                 ! we want 3 or four photons at most.
00604       IPAIR=.TRUE.
00605 C--   Check decay multiplicity..
00606       IF (JDAHEP(1,ID).EQ.0) RETURN
00607 C      IF (JDAHEP(1,ID).EQ.JDAHEP(2,ID)) RETURN
00608 C--
00609       NHEP0=NHEP
00610 C--
00611       IF    (IEXP)  THEN
00612          EXPINI=.TRUE.   ! Initialization/cleaning
00613          DO NCHAN=1,NX
00614            PRO(NCHAN)=0.D0
00615          ENDDO
00616          NCHAN=0
00617          
00618          FSEC=1.0D0
00619          CALL PHOMAK(ID,NHEP0)! Initialization/crude formfactors into 
00620                                                    ! PRO(NCHAN)
00621          EXPINI=.FALSE.
00622          RN=PHORANC(WTDUM)
00623          PRSUM=0
00624          DO K=1,NX
00625           PRSUM=PRSUM+PRO(K)
00626          ENDDO
00627          ESU=EXP(-PRSUM) ! exponent for crude Poissonian multiplicity 
00628                          ! distribution, will be later overwritten 
00629                          ! to give probability for k
00630          SUM=ESU         ! distribuant for the crude Poissonian 
00631                          ! at first for k=0
00632          DO K=1,100      ! hard coded max (photon) multiplicity is 100
00633            IF(RN.LT.SUM) GOTO 100
00634            ESU=ESU*PRSUM/K  ! we get at K ESU=EXP(-PRSUM)*PRSUM**K/K!
00635            SUM=SUM+ESU      ! thus we get distribuant at K.
00636            NCHAN=0
00637            CALL PHOMAK(ID,NHEP0) ! LOOPING
00638            IF(SUM.GT.1D0-EXPEPS) GOTO 100
00639          ENDDO
00640  100     CONTINUE
00641       ELSEIF(IFOUR) THEN
00642 C-- quatro photon emission
00643         FSEC=1.0D0
00644         RN=PHORANC(WTDUM)
00645         IF (RN.GE.23.D0/24D0) THEN
00646           CALL PHOMAK(ID,NHEP0)
00647           CALL PHOMAK(ID,NHEP0)
00648           CALL PHOMAK(ID,NHEP0)
00649           CALL PHOMAK(ID,NHEP0)
00650         ELSEIF (RN.GE.17.D0/24D0) THEN
00651           CALL PHOMAK(ID,NHEP0)
00652           CALL PHOMAK(ID,NHEP0)
00653         ELSEIF (RN.GE.9.D0/24D0) THEN
00654           CALL PHOMAK(ID,NHEP0)
00655         ENDIF
00656       ELSEIF(ITRE) THEN
00657 C-- triple photon emission
00658         FSEC=1.0D0
00659         RN=PHORANC(WTDUM)
00660         IF (RN.GE.5.D0/6D0) THEN
00661           CALL PHOMAK(ID,NHEP0)
00662           CALL PHOMAK(ID,NHEP0)
00663           CALL PHOMAK(ID,NHEP0)
00664         ELSEIF (RN.GE.2.D0/6D0) THEN
00665           CALL PHOMAK(ID,NHEP0)
00666         ENDIF
00667       ELSEIF(ISEC) THEN
00668 C-- double photon emission
00669         FSEC=1.0D0
00670         RN=PHORANC(WTDUM)
00671         IF (RN.GE.0.5D0) THEN
00672           CALL PHOMAK(ID,NHEP0)
00673           CALL PHOMAK(ID,NHEP0)
00674         ENDIF
00675       ELSE
00676 C-- single photon emission
00677         FSEC=1.0D0
00678         CALL PHOMAK(ID,NHEP0)
00679       ENDIF
00680 C--
00681 C-- electron positron pair (coomented out for a while
00682 C      IF (IPAIR) CALL PHOPAR(ID,NHEP0)
00683       END  
00684       SUBROUTINE PHOMAK(IPPAR,NHEP0)
00685 C.----------------------------------------------------------------------
00686 C.
00687 C.    PHOMAK:   PHOtos MAKe
00688 C.
00689 C.    Purpose:  Single or double bremstrahlung radiative corrections  
00690 C.              are generated in  the decay of the IPPAR-th particle in 
00691 C.              the  HEP common /PH_HEPEVT/. Example of the use of 
00692 C.              general tools.
00693 C.
00694 C.    Input Parameter:    IPPAR:  Pointer   to   decaying  particle  in
00695 C.                                /PH_HEPEVT/ and the common itself
00696 C.
00697 C.    Output Parameters:  Common  /PH_HEPEVT/, either  with  or  without
00698 C.                                particles added.
00699 C.
00700 C.    Author(s):  Z. Was,                         Created at:  26/05/93
00701 C.                                                Last Update: 29/01/05
00702 C.
00703 C.----------------------------------------------------------------------
00704       IMPLICIT NONE
00705       DOUBLE PRECISION DATA
00706       REAL*8 PHORANC
00707       INTEGER IP,IPPAR,NCHARG,IDME
00708       INTEGER WTDUM,IDUM,NHEP0
00709       INTEGER NCHARB,NEUDAU
00710       REAL*8 RN,WT,PHINT,XDUMM,PHwtNLO
00711       LOGICAL BOOST
00712       INTEGER NMXHEP
00713       PARAMETER (NMXHEP=10000)
00714       INTEGER IDHEP,ISTHEP,JDAHEP,JMOHEP,NEVHEP,NHEP
00715       REAL*8 PHEP,VHEP
00716       COMMON/PH_HEPEVT/NEVHEP,NHEP,ISTHEP(NMXHEP),IDHEP(NMXHEP),
00717      &JMOHEP(2,NMXHEP),JDAHEP(2,NMXHEP),PHEP(5,NMXHEP),VHEP(4,NMXHEP)
00718       LOGICAL INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00719       REAL*8 FINT,FSEC,EXPEPS
00720       COMMON /PHOKEY/ FSEC,FINT,EXPEPS,INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00721 C--
00722       IP=IPPAR
00723       IDUM=1
00724       NCHARG=0
00725 C--
00726         CALL PHOIN(IP,BOOST,NHEP0)
00727         CALL PHOCHK(JDAHEP(1,IP))
00728         WT=0.0D0
00729         CALL PHOPRE(1,WT,NEUDAU,NCHARB)
00730 
00731         IF (WT.EQ.0.0D0) RETURN
00732         RN=PHORANC(WTDUM)
00733 C PHODO is caling PHORANC, thus change of series if it is moved before if
00734         CALL PHODO(1,NCHARB,NEUDAU)
00735 C we eliminate /FINT in variant B.
00736 C get ID of channel dependent ME, ID=0 means no 
00737 
00738         CALL ME_CHANNEL(IDME)                 ! corrections for matrix elements
00739                                               ! controlled by IDME
00740                                               ! write(*,*) 'KANALIK IDME=',IDME
00741 
00742         IF(     IDME.EQ.0) THEN               ! default 
00743 
00744           IF (INTERF) WT=WT*PHINT(IDUM)/FINT  ! FINT must be in variant A
00745           IF (IFW) CALL PHOBW   (WT)          ! extra weight for leptonic W decay 
00746 
00747         ELSEIF (IDME.EQ.2) THEN               ! ME weight for leptonic W decay
00748 
00749           CALL PHOBWnlo(WT)
00750           WT=WT*2D0/FINT
00751 
00752         ELSEIF (IDME.EQ.1) THEN               ! ME weight for leptonic Z decay
00753 
00754          xdumm=0.5D0
00755          WT=WT*PHwtnlo(xdumm)/FINT
00756 
00757         ELSE
00758          write(*,*) 'problem with ME_CHANNEL  IDME=',IDME
00759          stop
00760         ENDIF
00761 
00762 
00763         DATA=WT 
00764         IF (WT.GT.1.0D0) CALL PHOERR(3,'WT_INT',DATA)
00765 C weighting
00766       IF (RN.LE.WT) THEN 
00767         CALL PHOOUT(IP,BOOST,NHEP0)
00768       ENDIF
00769       RETURN
00770       END
00771       FUNCTION PHINT1(IDUM)
00772 C.----------------------------------------------------------------------
00773 C.
00774 C.    PHINT:   PHotos INTerference (Old version kept for tests only.
00775 C.
00776 C.    Purpose:  Calculates interference between emission of photons from
00777 C.              different possible chaged daughters stored in
00778 C.              the  HEP common /PHOEVT/.  
00779 C.
00780 C.    Input Parameter:    commons /PHOEVT/ /PHOMOM/ /PHOPHS/
00781 C.    
00782 C.
00783 C.    Output Parameters:  
00784 C.                        
00785 C.
00786 C.    Author(s):  Z. Was,                         Created at:  10/08/93
00787 C.                                                Last Update: 15/03/99
00788 C.
00789 C.----------------------------------------------------------------------
00790 
00791       IMPLICIT NONE
00792       REAL*8 PHINT,phint1
00793       REAL*8 PHOCHA
00794       INTEGER IDUM
00795       INTEGER NMXPHO
00796       PARAMETER (NMXPHO=10000)
00797       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
00798       REAL*8 PPHO,VPHO
00799       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
00800      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
00801       DOUBLE PRECISION MCHSQR,MNESQR
00802       REAL*8 PNEUTR
00803       COMMON/PHOMOM/MCHSQR,MNESQR,PNEUTR(5)
00804       DOUBLE PRECISION COSTHG,SINTHG
00805       REAL*8 XPHMAX,XPHOTO
00806       COMMON/PHOPHS/XPHMAX,XPHOTO,COSTHG,SINTHG
00807       REAL*8 MPASQR,XX,BETA
00808       LOGICAL IFINT
00809       INTEGER K,IDENT 
00810 C
00811       DO  K=JDAPHO(2,1),JDAPHO(1,1),-1
00812          IF(IDPHO(K).NE.22) THEN
00813            IDENT=K
00814            GOTO 20
00815          ENDIF
00816       ENDDO
00817  20   CONTINUE
00818 C check if there is a photon
00819       IFINT= NPHO.GT.IDENT
00820 C check if it is two body + gammas reaction
00821       IFINT= IFINT.AND.(IDENT-JDAPHO(1,1)).EQ.1
00822 C check if two body was particle antiparticle
00823       IFINT= IFINT.AND.IDPHO(JDAPHO(1,1)).EQ.-IDPHO(IDENT)
00824 C check if particles were charged
00825       IFINT= IFINT.AND.PHOCHA(IDPHO(IDENT)).NE.0
00826 C calculates interference weight contribution
00827       IF(IFINT) THEN
00828         MPASQR = PPHO(5,1)**2
00829         XX=4.D0*MCHSQR/MPASQR*(1.D0-XPHOTO)/(1.D0-XPHOTO+(MCHSQR-MNESQR)
00830      &     /MPASQR)**2
00831          BETA=SQRT(1.D0-XX)
00832          PHINT  = 2D0/(1D0+COSTHG**2*BETA**2)
00833       ELSE
00834          PHINT  = 1D0
00835       ENDIF
00836        phint1=1
00837       END
00838 
00839       FUNCTION PHINT2(IDUM)
00840 C.----------------------------------------------------------------------
00841 C.
00842 C.    PHINT:   PHotos INTerference
00843 C.
00844 C.    Purpose:  Calculates interference between emission of photons from
00845 C.              different possible chaged daughters stored in
00846 C.              the  HEP common /PHOEVT/. 
00847 C.
00848 C.    Input Parameter:    commons /PHOEVT/ /PHOMOM/ /PHOPHS/
00849 C.    
00850 C.
00851 C.    Output Parameters:  
00852 C.                        
00853 C.
00854 C.    Author(s):  Z. Was,                         Created at:  10/08/93
00855 C.                                                Last Update: 
00856 C.
00857 C.----------------------------------------------------------------------
00858 
00859       IMPLICIT NONE
00860       REAL*8 PHINT,PHINT1,PHINT2
00861       REAL*8 PHOCHA
00862       INTEGER IDUM
00863       INTEGER NMXPHO
00864       PARAMETER (NMXPHO=10000)
00865       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
00866       REAL*8 PPHO,VPHO
00867       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
00868      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
00869       DOUBLE PRECISION MCHSQR,MNESQR
00870       REAL*8 PNEUTR
00871       COMMON/PHOMOM/MCHSQR,MNESQR,PNEUTR(5)
00872       DOUBLE PRECISION COSTHG,SINTHG
00873       REAL*8 XPHMAX,XPHOTO
00874       COMMON/PHOPHS/XPHMAX,XPHOTO,COSTHG,SINTHG
00875       REAL*8 MPASQR,XX,BETA,PQ1(4),PQ2(4),PPHOT(4)
00876       REAL*8 SS,PP2,PP,E1,E2,Q1,Q2,COSTHE
00877       LOGICAL IFINT
00878       INTEGER K,IDENT 
00879 C
00880       DO  K=JDAPHO(2,1),JDAPHO(1,1),-1
00881          IF(IDPHO(K).NE.22) THEN
00882            IDENT=K
00883            GOTO 20
00884          ENDIF
00885       ENDDO
00886  20   CONTINUE
00887 C check if there is a photon
00888       IFINT= NPHO.GT.IDENT
00889 C check if it is two body + gammas reaction
00890       IFINT= IFINT.AND.(IDENT-JDAPHO(1,1)).EQ.1
00891 C check if two body was particle antiparticle (we improve on it !
00892 C      IFINT= IFINT.AND.IDPHO(JDAPHO(1,1)).EQ.-IDPHO(IDENT)
00893 C check if particles were charged
00894       IFINT= IFINT.AND.abs(PHOCHA(IDPHO(IDENT))).GT.0.01D0
00895 C check if they have both charge
00896       IFINT= IFINT.AND.
00897      $       abs(PHOCHA(IDPHO(JDAPHO(1,1)))).gt.0.01D0
00898 C calculates interference weight contribution
00899       IF(IFINT) THEN
00900         MPASQR = PPHO(5,1)**2
00901         XX=4.D0*MCHSQR/MPASQR*(1.-XPHOTO)/(1.-XPHOTO+(MCHSQR-MNESQR)/
00902      &     MPASQR)**2
00903          BETA=SQRT(1.D0-XX)
00904          PHINT  = 2D0/(1D0+COSTHG**2*BETA**2)
00905          SS =MPASQR*(1.D0-XPHOTO)
00906          PP2=((SS-MCHSQR-MNESQR)**2-4*MCHSQR*MNESQR)/SS/4
00907          PP =SQRT(PP2)
00908          E1 =SQRT(PP2+MCHSQR)
00909          E2 =SQRT(PP2+MNESQR)
00910          PHINT= (E1+E2)**2/((E2+COSTHG*PP)**2+(E1-COSTHG*PP)**2)
00911 C
00912       q1=PHOCHA(IDPHO(JDAPHO(1,1)))
00913       q2=PHOCHA(IDPHO(IDENT))
00914       do k=1,4
00915        pq1(k)=ppho(k,JDAPHO(1,1))
00916        pq2(k)=ppho(k,JDAPHO(1,1)+1)
00917        pphot(k)=ppho(k,npho)
00918       enddo
00919        costhe=(pphot(1)*pq1(1)+pphot(2)*pq1(2)+pphot(3)*pq1(3))
00920        costhe=costhe/sqrt(pq1(1)**2+pq1(2)**2+pq1(3)**2)
00921        costhe=costhe/sqrt(pphot(1)**2+pphot(2)**2+pphot(3)**2)
00922 C
00923 ! --- this IF checks whether JDAPHO(1,1) was MCH or MNE. 
00924 ! --- COSTHG angle (and in-generation variables) may be better choice 
00925 ! --- than costhe. note that in the formulae below amplitudes were 
00926 ! --- multiplied by (E2+COSTHG*PP)*(E1-COSTHG*PP). 
00927         IF (costhg*costhe.GT.0) then
00928 
00929          PHINT= (q1*(E2+COSTHG*PP)-q2*(E1-COSTHG*PP))**2
00930      &         /(q1**2*(E2+COSTHG*PP)**2+q2**2*(E1-COSTHG*PP)**2)
00931         ELSE
00932 
00933          PHINT= (q1*(E1-COSTHG*PP)-q2*(E2+COSTHG*PP))**2
00934      &         /(q1**2*(E1-COSTHG*PP)**2+q2**2*(E2+COSTHG*PP)**2)
00935         ENDIF
00936       ELSE
00937          PHINT  = 1D0
00938       ENDIF
00939          phint1=1
00940          phint2=1
00941       END
00942 
00943 
00944       SUBROUTINE PHOPRE(IPARR,WT,NEUDAU,NCHARB)
00945 C.----------------------------------------------------------------------
00946 C.
00947 C.    PHOTOS:   Photon radiation in decays
00948 C.
00949 C.    Purpose:  Order (alpha) radiative corrections  are  generated  in
00950 C.              the decay of the IPPAR-th particle in the HEP-like
00951 C.              common /PHOEVT/.  Photon radiation takes place from one
00952 C.              of the charged daughters of the decaying particle IPPAR
00953 C.              WT is calculated, eventual rejection will be performed
00954 C.              later after inclusion of interference weight.
00955 C.
00956 C.    Input Parameter:    IPPAR:  Pointer   to   decaying  particle  in
00957 C.                                /PHOEVT/ and the common itself,
00958 C.
00959 C.    Output Parameters:  Common  /PHOEVT/, either  with  or  without a
00960 C.                                photon(s) added.
00961 C.                        WT      weight of the configuration 
00962 C.
00963 C.    Author(s):  Z. Was, B. van Eijk             Created at:  26/11/89
00964 C.                                                Last Update: 29/01/05
00965 C.
00966 C.----------------------------------------------------------------------
00967       IMPLICIT NONE
00968       DOUBLE PRECISION MINMAS,MPASQR,MCHREN
00969       DOUBLE PRECISION BETA,EPS,DEL1,DEL2,DATA,BIGLOG
00970       REAL*8 PHOCHA,PHOSPI,PHORANC,PHOCOR,PHOCORN,MASSUM
00971       INTEGER IP,IPARR,IPPAR,I,J,ME,NCHARG,NEUPOI,NLAST,THEDUM
00972       INTEGER IDABS,IDUM
00973       INTEGER NCHARB,NEUDAU
00974       REAL*8 WT,WGT
00975       INTEGER NMXPHO
00976       PARAMETER (NMXPHO=10000)
00977       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
00978       REAL*8 PPHO,VPHO
00979       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
00980      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
00981       LOGICAL CHKIF
00982       COMMON/PHOIF/CHKIF(NMXPHO)
00983       INTEGER CHAPOI(NMXPHO)
00984       DOUBLE PRECISION MCHSQR,MNESQR
00985       REAL*8 PNEUTR
00986       COMMON/PHOMOM/MCHSQR,MNESQR,PNEUTR(5)
00987       DOUBLE PRECISION COSTHG,SINTHG
00988       REAL*8 XPHMAX,XPHOTO
00989       COMMON/PHOPHS/XPHMAX,XPHOTO,COSTHG,SINTHG
00990       REAL*8 ALPHA,XPHCUT
00991       COMMON/PHOCOP/ALPHA,XPHCUT
00992       INTEGER IREP,IDME
00993       REAL*8 PROBH,CORWT,XF
00994       COMMON/PHOPRO/PROBH,CORWT,XF,IREP
00995 C may be it is not the best place, but ...
00996       LOGICAL INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00997       REAL*8 FINT,FSEC,EXPEPS
00998       COMMON /PHOKEY/ FSEC,FINT,EXPEPS,INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
00999       REAL*8             WT1,WT2,WT3
01000       COMMON /PHWT/ BETA,WT1,WT2,WT3
01001       DOUBLE PRECISION phocorWT3,phocorWT2,phocorWT1
01002       common/phocorWT/phocorWT3,phocorWT2,phocorWT1
01003       real*8 a,b
01004 C--
01005       IPPAR=IPARR
01006 C--   Store pointers for cascade treatement...
01007       IP=IPPAR
01008       NLAST=NPHO
01009       IDUM=1
01010 C--
01011 C--   Check decay multiplicity..
01012       IF (JDAPHO(1,IP).EQ.0) RETURN
01013 C--
01014 C--   Loop over daughters, determine charge multiplicity
01015    10 NCHARG=0
01016       IREP=0
01017       MINMAS=0.D0
01018       MASSUM=0.D0
01019       DO 20 I=JDAPHO(1,IP),JDAPHO(2,IP)
01020 C--
01021 C--
01022 C--   Exclude marked particles, quarks and gluons etc...
01023         IDABS=ABS(IDPHO(I))
01024         IF (CHKIF(I-JDAPHO(1,IP)+3)) THEN
01025           IF (PHOCHA(IDPHO(I)).NE.0) THEN
01026             NCHARG=NCHARG+1
01027             IF (NCHARG.GT.NMXPHO) THEN
01028               DATA=NCHARG
01029               CALL PHOERR(1,'PHOTOS',DATA)
01030             ENDIF
01031             CHAPOI(NCHARG)=I
01032           ENDIF
01033           MINMAS=MINMAS+PPHO(5,I)**2
01034         ENDIF
01035         MASSUM=MASSUM+PPHO(5,I)
01036    20 CONTINUE
01037       IF (NCHARG.NE.0) THEN
01038 C--
01039 C--   Check that sum of daughter masses does not exceed parent mass
01040         IF ((PPHO(5,IP)-MASSUM)/PPHO(5,IP).GT.2.D0*XPHCUT) THEN
01041 C--
01042    30       CONTINUE
01043             DO 70 J=1,3
01044    70       PNEUTR(J)=-PPHO(J,CHAPOI(NCHARG))
01045             PNEUTR(4)=PPHO(5,IP)-PPHO(4,CHAPOI(NCHARG))
01046 C--
01047 C--   Calculate  invariant  mass of 'neutral' etc. systems
01048           MPASQR=PPHO(5,IP)**2
01049           MCHSQR=PPHO(5,CHAPOI(NCHARG))**2
01050           IF ((JDAPHO(2,IP)-JDAPHO(1,IP)).EQ.1) THEN
01051             NEUPOI=JDAPHO(1,IP)
01052             IF (NEUPOI.EQ.CHAPOI(NCHARG)) NEUPOI=JDAPHO(2,IP)
01053             MNESQR=PPHO(5,NEUPOI)**2
01054             PNEUTR(5)=PPHO(5,NEUPOI)
01055           ELSE
01056             MNESQR=PNEUTR(4)**2-PNEUTR(1)**2-PNEUTR(2)**2-PNEUTR(3)**2
01057             MNESQR=MAX(MNESQR,MINMAS-MCHSQR)
01058             PNEUTR(5)=SQRT(MNESQR)
01059           ENDIF
01060 C--
01061 C--   Determine kinematical limit...
01062           XPHMAX=(MPASQR-(PNEUTR(5)+PPHO(5,CHAPOI(NCHARG)))**2)/MPASQR
01063 C--
01064 C--   Photon energy fraction...
01065           CALL PHOENE(MPASQR,MCHREN,BETA,BIGLOG,IDPHO(CHAPOI(NCHARG)))
01066 C--
01067          IF (XPHOTO.LT.-4D0) THEN
01068             NCHARG=0  ! we really stop trials
01069             XPHOTO=0d0! in this case !!
01070 C--   Energy fraction not too large (very seldom) ? Define angle.
01071           ELSEIF ((XPHOTO.LT.XPHCUT).OR.(XPHOTO.GT.XPHMAX)) THEN
01072 C--
01073 C--   No radiation was accepted, check  for more daughters  that may ra-
01074 C--   diate and correct radiation probability...
01075             NCHARG=NCHARG-1
01076             IF (NCHARG.GT.0) THEN
01077               IREP=IREP+1
01078               GOTO 30
01079             ENDIF
01080           ELSE
01081 C--
01082 C--   Angle is generated  in  the  frame defined  by  charged vector and
01083 C--   PNEUTR, distribution is taken in the infrared limit...
01084             EPS=MCHREN/(1.D0+BETA)
01085 C--
01086 C--   Calculate sin(theta) and cos(theta) from interval variables
01087             DEL1=(2.D0-EPS)*(EPS/(2.D0-EPS))**PHORANC(THEDUM)
01088             DEL2=2.D0-DEL1
01089 
01090 C ----------- VARIANT B ------------------
01091 CC corrections for more efiicient interference correction,
01092 CC instead of doubling crude distribution, we add flat parallel channel
01093 C           IF (PHORANC(THEDUM).LT.BIGLOG/BETA/(BIGLOG/BETA+2*FINT)) THEN
01094 C              COSTHG=(1.D0-DEL1)/BETA
01095 C              SINTHG=SQRT(DEL1*DEL2-MCHREN)/BETA
01096 C           ELSE
01097 C             COSTHG=-1D0+2*PHORANC(THEDUM)
01098 C             SINTHG= SQRT(1D0-COSTHG**2)
01099 C           ENDIF
01100 C
01101 C           IF (FINT.GT.1.0D0) THEN
01102 C
01103 C              WGT=1D0/(1D0-BETA*COSTHG)
01104 C              WGT=WGT/(WGT+FINT)
01105 C       !       WGT=1D0   ! ??
01106 C
01107 C           ELSE
01108 C              WGT=1D0
01109 C           ENDIF
01110 C
01111 C ----------- END OF VARIANT B ------------------
01112 
01113 C ----------- VARIANT A ------------------
01114               COSTHG=(1.D0-DEL1)/BETA
01115               SINTHG=SQRT(DEL1*DEL2-MCHREN)/BETA
01116               WGT=1D0
01117 C ----------- END OF VARIANT A ------------------
01118 
01119 C--
01120 C--   Determine spin of  particle and construct code  for matrix element
01121             ME=2.D0*PHOSPI(IDPHO(CHAPOI(NCHARG)))+1.D0
01122 C--
01123 C--   Weighting procedure with 'exact' matrix element, reconstruct kine-
01124 C--   matics for photon, neutral and charged system and update /PHOEVT/.
01125 C--   Find pointer to the first component of 'neutral' system
01126       DO  I=JDAPHO(1,IP),JDAPHO(2,IP)
01127         IF (I.NE.CHAPOI(NCHARG)) THEN
01128           NEUDAU=I
01129           GOTO 51
01130         ENDIF
01131       ENDDO
01132 C--
01133 C--   Pointer not found...
01134       DATA=NCHARG
01135       CALL PHOERR(5,'PHOKIN',DATA)
01136  51   CONTINUE
01137       NCHARB=CHAPOI(NCHARG)
01138       NCHARB=NCHARB-JDAPHO(1,IP)+3
01139       NEUDAU=NEUDAU-JDAPHO(1,IP)+3
01140 
01141       CALL ME_CHANNEL(IDME)  !  two options introduced temporarily. 
01142                              !  In future always PHOCOR-->PHOCORN
01143                              !  Tests and adjustment of wts for Znlo needed.
01144                              !  otherwise simple change. PHOCORN implements
01145                              !  exact ME for scalar to 2 scalar decays.
01146       IF(IDME.EQ.2) THEN
01147         b=PHOCORN(MPASQR,MCHREN,ME)
01148         WT=b*WGT
01149         WT=WT/(1-xphoto/xphmax+0.5*(xphoto/xphmax)**2)*(1-xphoto/xphmax)/2 ! factor to go to WnloWT
01150       ELSEIF(IDME.EQ.1) THEN
01151 
01152         a=PHOCOR(MPASQR,MCHREN,ME)
01153         b=PHOCORN(MPASQR,MCHREN,ME)
01154         WT=b*WGT 
01155         WT=WT*wt1*wt2*wt3/phocorwt1/phocorwt2/phocorwt3 ! factor to go to ZnloWT
01156 !        write(*,*) ' -----------'
01157 !        write(*,*)   wt1,' ',wt2,' ',wt3
01158 !        write(*,*)   phocorwt1,' ',phocorwt2,' ',phocorwt3
01159       ELSE
01160         a=PHOCOR(MPASQR,MCHREN,ME)
01161         WT=a*WGT
01162 !        WT=b*WGT!/(1-xphoto/xphmax+0.5*(xphoto/xphmax)**2)*(1-xphoto/xphmax)/2
01163       ENDIF
01164 
01165 
01166           ENDIF
01167         ELSE
01168           DATA=PPHO(5,IP)-MASSUM
01169           CALL PHOERR(10,'PHOTOS',DATA)
01170         ENDIF
01171       ENDIF
01172 C--
01173       RETURN
01174       END
01175       SUBROUTINE PHOENE(MPASQR,MCHREN,BETA,BIGLOG,IDENT)
01176 C.----------------------------------------------------------------------
01177 C.
01178 C.    PHOTOS:   PHOton radiation in decays calculation  of photon ENErgy
01179 C.              fraction
01180 C.
01181 C.    Purpose:  Subroutine  returns  photon  energy fraction (in (parent
01182 C.              mass)/2 units) for the decay bremsstrahlung.
01183 C.
01184 C.    Input Parameters:  MPASQR:  Mass of decaying system squared,
01185 C.                       XPHCUT:  Minimum energy fraction of photon,
01186 C.                       XPHMAX:  Maximum energy fraction of photon.
01187 C.
01188 C.    Output Parameter:  MCHREN:  Renormalised mass squared,
01189 C.                       BETA:    Beta factor due to renormalisation,
01190 C.                       XPHOTO:  Photon energy fraction,
01191 C.                       XF:      Correction factor for PHOFAC.
01192 C.
01193 C.    Author(s):  S. Jadach, Z. Was               Created at:  01/01/89
01194 C.                B. van Eijk, P.Golonka          Last Update: 29/01/05
01195 C.
01196 C.----------------------------------------------------------------------
01197       IMPLICIT NONE
01198       DOUBLE PRECISION MPASQR,MCHREN,BIGLOG,BETA,DATA
01199       INTEGER IWT1,IRN,IWT2
01200       REAL*8 PRSOFT,PRHARD,PHORANC,PHOFAC
01201       DOUBLE PRECISION MCHSQR,MNESQR
01202       REAL*8 PNEUTR
01203       INTEGER IDENT
01204       REAL*8 PHOCHA,PRKILL,RRR
01205       COMMON/PHOMOM/MCHSQR,MNESQR,PNEUTR(5)
01206       DOUBLE PRECISION COSTHG,SINTHG
01207       REAL*8 XPHMAX,XPHOTO
01208       COMMON/PHOPHS/XPHMAX,XPHOTO,COSTHG,SINTHG
01209       REAL*8 ALPHA,XPHCUT
01210       COMMON/PHOCOP/ALPHA,XPHCUT
01211       REAL*8 PI,TWOPI
01212       COMMON/PHPICO/PI,TWOPI
01213       INTEGER IREP
01214       REAL*8 PROBH,CORWT,XF
01215       COMMON/PHOPRO/PROBH,CORWT,XF,IREP
01216       LOGICAL INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
01217       REAL*8 FINT,FSEC,EXPEPS
01218       COMMON /PHOKEY/ FSEC,FINT,EXPEPS,INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
01219       INTEGER NX,NCHAN,K,IDME
01220       PARAMETER (NX=10)
01221       LOGICAL EXPINI
01222       REAL*8 PRO,PRSUM
01223       COMMON /PHOEXP/ PRO(NX),NCHAN,EXPINI
01224 C--
01225       IF (XPHMAX.LE.XPHCUT) THEN
01226         BETA=PHOFAC(-1)  ! to zero counter, here beta is dummy
01227         XPHOTO=0.0D0
01228         RETURN
01229       ENDIF
01230 C--   Probabilities for hard and soft bremstrahlung...
01231       MCHREN=4.D0*MCHSQR/MPASQR/(1.D0+MCHSQR/MPASQR)**2
01232       BETA=SQRT(1.D0-MCHREN)
01233 
01234 C ----------- VARIANT B ------------------
01235 CC we replace 1D0/BETA*BIGLOG with (1D0/BETA*BIGLOG+2*FINT) 
01236 CC for integral of new crude
01237 C      BIGLOG=LOG(MPASQR/MCHSQR*(1.D0+BETA)**2/4.D0*
01238 C     &          (1.D0+MCHSQR/MPASQR)**2)
01239 C      PRHARD=ALPHA/PI*(1D0/BETA*BIGLOG+2*FINT)*(LOG(XPHMAX/XPHCUT)
01240 C     &-.75D0+XPHCUT/XPHMAX-.25D0*XPHCUT**2/XPHMAX**2)
01241 C      PRHARD=PRHARD*PHOCHA(IDENT)**2*FSEC
01242 C ----------- END OF VARIANT B ------------------
01243 
01244 C ----------- VARIANT A ------------------
01245       BIGLOG=LOG(MPASQR/MCHSQR*(1.D0+BETA)**2/4.D0*
01246      &          (1.D0+MCHSQR/MPASQR)**2)
01247       PRHARD=ALPHA/PI*(1D0/BETA*BIGLOG)*
01248      &(LOG(XPHMAX/XPHCUT)-.75D0+XPHCUT/XPHMAX-.25D0*XPHCUT**2/XPHMAX**2)
01249       PRHARD=PRHARD*PHOCHA(IDENT)**2*FSEC*FINT
01250         CALL ME_CHANNEL(IDME)
01251 !        write(*,*) 'KANALIK IDME=',IDME
01252         IF (IDME.EQ.0) THEN  ! default
01253            continue
01254         ELSEIF (IDME.EQ.1) THEN
01255            PRHARD=PRHARD/(1d0+0.75*ALPHA/PI) !  NLO
01256         ELSEIF (IDME.EQ.2) THEN
01257            continue ! work on virtual crrections in W decay to be done.
01258         ELSE
01259          write(*,*) 'problem with ME_CHANNEL  IDME=',IDME
01260          stop
01261         ENDIF
01262 
01263 C ----------- END OF VARIANT A ------------------
01264       IF (IREP.EQ.0) PROBH=0.D0
01265       PRKILL=0d0
01266       IF (IEXP) THEN           ! IEXP
01267        NCHAN=NCHAN+1
01268        IF (EXPINI) THEN     ! EXPINI
01269           PRO(NCHAN)=PRHARD+0.05*(1.0+FINT) ! we store hard photon emission prob 
01270                                       !for leg NCHAN
01271           PRHARD=0D0         ! to kill emission at initialization call
01272           PROBH=PRHARD
01273        ELSE                 ! EXPINI
01274         PRSUM=0
01275         DO K=NCHAN,NX
01276          PRSUM=PRSUM+PRO(K)
01277         ENDDO
01278         PRHARD=PRHARD/PRSUM ! note that PRHARD may be smaller than 
01279                             !PRO(NCHAN) because it is calculated
01280                             ! for kinematical configuartion as is 
01281                             ! (with effects of previous photons)
01282         PRKILL=PRO(NCHAN)/PRSUM-PRHARD !
01283 
01284        ENDIF                ! EXPINI
01285         PRSOFT=1.D0-PRHARD
01286       ELSE                     ! IEXP
01287        PRHARD=PRHARD*PHOFAC(0) ! PHOFAC is used to control eikonal 
01288                                ! formfactors for non exp version only
01289                                ! here PHOFAC(0)=1 at least now.
01290        PROBH=PRHARD
01291       ENDIF                    ! IEXP
01292       PRSOFT=1.D0-PRHARD
01293 C--
01294 C--   Check on kinematical bounds
01295       IF (IEXP) THEN
01296        IF (PRSOFT.LT.-5.0D-8) THEN
01297          DATA=PRSOFT
01298          CALL PHOERR(2,'PHOENE',DATA)
01299        ENDIF
01300       ELSE
01301        IF (PRSOFT.LT.0.1D0) THEN
01302          DATA=PRSOFT
01303          CALL PHOERR(2,'PHOENE',DATA)
01304        ENDIF
01305       ENDIF
01306 
01307       RRR=PHORANC(IWT1)
01308       IF (RRR.LT.PRSOFT) THEN
01309 C--
01310 C--   No photon... (ie. photon too soft)
01311         XPHOTO=0.D0
01312         IF (RRR.LT.PRKILL) XPHOTO=-5d0 ! No photon...no further trials
01313       ELSE
01314 C--
01315 C--   Hard  photon... (ie.  photon  hard enough).
01316 C--   Calculate  Altarelli-Parisi Kernel
01317    10   XPHOTO=EXP(PHORANC(IRN)*LOG(XPHCUT/XPHMAX))
01318         XPHOTO=XPHOTO*XPHMAX
01319         IF (PHORANC(IWT2).GT.((1.D0+(1.D0-XPHOTO/XPHMAX)**2)/2.D0)) 
01320      &                            GOTO 10
01321       ENDIF
01322 C--
01323 C--   Calculate parameter for PHOFAC function
01324       XF=4.D0*MCHSQR*MPASQR/(MPASQR+MCHSQR-MNESQR)**2
01325       RETURN
01326       END
01327       FUNCTION PHOCOR(MPASQR,MCHREN,ME)
01328 C.----------------------------------------------------------------------
01329 C.
01330 C.    PHOTOS:   PHOton radiation in decays CORrection weight from
01331 C.              matrix elements
01332 C.
01333 C.    Purpose:  Calculate  photon  angle.  The reshaping functions  will
01334 C.              have  to  depend  on the spin S of the charged particle.
01335 C.              We define:  ME = 2 * S + 1 !
01336 C.
01337 C.    Input Parameters:  MPASQR:  Parent mass squared,
01338 C.                       MCHREN:  Renormalised mass of charged system,
01339 C.                       ME:      2 * spin + 1 determines matrix element
01340 C.
01341 C.    Output Parameter:  Function value.
01342 C.
01343 C.    Author(s):  Z. Was, B. van Eijk             Created at:  26/11/89
01344 C.                                                Last Update: 21/03/93
01345 C.
01346 C.----------------------------------------------------------------------
01347       IMPLICIT NONE
01348       DOUBLE PRECISION MPASQR,MCHREN,BETA,XX,YY,DATA
01349       INTEGER ME
01350       REAL*8 PHOCOR,PHOFAC,WT1,WT2,WT3,PHOCORN
01351       COMMON /PHWT/ BETA,WT1,WT2,WT3
01352       DOUBLE PRECISION MCHSQR,MNESQR
01353       REAL*8 PNEUTR
01354       COMMON/PHOMOM/MCHSQR,MNESQR,PNEUTR(5)
01355       DOUBLE PRECISION COSTHG,SINTHG
01356       REAL*8 XPHMAX,XPHOTO
01357       COMMON/PHOPHS/XPHMAX,XPHOTO,COSTHG,SINTHG
01358       INTEGER IREP
01359       REAL*8 PROBH,CORWT,XF
01360       COMMON/PHOPRO/PROBH,CORWT,XF,IREP
01361       INTEGER IscaNLO
01362 C--
01363 C--   Shaping (modified by ZW)...
01364       XX=4.D0*MCHSQR/MPASQR*(1.D0-XPHOTO)/(1.D0-XPHOTO+(MCHSQR-MNESQR)/
01365      &MPASQR)**2
01366       IF (ME.EQ.1) THEN
01367         YY=1.D0
01368         WT3=(1.D0-XPHOTO/XPHMAX)/((1.D0+(1.D0-XPHOTO/XPHMAX)**2)/2.D0)
01369       ELSEIF (ME.EQ.2) THEN
01370         YY=0.5D0*(1.D0-XPHOTO/XPHMAX+1.D0/(1.D0-XPHOTO/XPHMAX))
01371         WT3=1.D0
01372       ELSEIF ((ME.EQ.3).OR.(ME.EQ.4).OR.(ME.EQ.5)) THEN
01373         YY=1.D0
01374         WT3=(1.D0+(1.D0-XPHOTO/XPHMAX)**2-(XPHOTO/XPHMAX)**3)/
01375      &  (1.D0+(1.D0-XPHOTO/XPHMAX)** 2)
01376       ELSE
01377         DATA=(ME-1.D0)/2.D0
01378         CALL PHOERR(6,'PHOCOR',DATA)
01379         YY=1.D0
01380         WT3=1.D0
01381       ENDIF
01382       BETA=SQRT(1.D0-XX)
01383       WT1=(1.D0-COSTHG*SQRT(1.D0-MCHREN))/(1.D0-COSTHG*BETA)
01384       WT2=(1.D0-XX/YY/(1.D0-BETA**2*COSTHG**2))*(1.D0+COSTHG*BETA)/2.D0
01385       
01386       CALL ME_SCALAR(IscaNLO)
01387       IF (ME.EQ.1.AND.IscaNLO.EQ.1) THEN  ! this  switch NLO in scalar decays. 
01388                                      ! overrules default calculation.
01389                                      ! Need tests including basic ones
01390         PHOCOR=PHOCORN(MPASQR,MCHREN,ME)
01391         wt1=1.0
01392         wt2=1.0
01393         wt3=PHOCOR
01394       ELSE
01395         WT2=WT2*PHOFAC(1)
01396       ENDIF
01397       PHOCOR=WT1*WT2*WT3
01398 
01399       CORWT=PHOCOR
01400       IF (PHOCOR.GT.1.D0) THEN
01401         DATA=PHOCOR
01402         CALL PHOERR(3,'PHOCOR',DATA)
01403       ENDIF
01404       RETURN
01405       END
01406       FUNCTION PHOFAC(MODE)
01407 C.----------------------------------------------------------------------
01408 C.
01409 C.    PHOTOS:   PHOton radiation in decays control FACtor
01410 C.
01411 C.    Purpose:  This is the control function for the photon spectrum and
01412 C.              final weighting.  It is  called  from PHOENE for genera-
01413 C.              ting the raw photon energy spectrum (MODE=0) and in PHO-
01414 C.              COR to scale the final weight (MODE=1).  The factor con-
01415 C.              sists of 3 terms.  Addition of  the factor FF which mul-
01416 C.              tiplies PHOFAC for MODE=0 and divides PHOFAC for MODE=1,
01417 C.              does not affect  the results for  the MC generation.  An
01418 C.              appropriate choice  for FF can speed up the calculation.
01419 C.              Note that a too small value of FF may cause weight over-
01420 C.              flow in PHOCOR  and will generate a warning, halting the
01421 C.              execution.  PRX  should  be  included for repeated calls
01422 C.              for  the  same event, allowing more particles to radiate
01423 C.              photons.  At  the  first  call IREP=0, for  more  than 1
01424 C.              charged  decay  products, IREP >= 1.  Thus,  PRSOFT  (no
01425 C.              photon radiation  probability  in  the  previous  calls)
01426 C.              appropriately scales the strength of the bremsstrahlung.
01427 C.
01428 C.    Input Parameters:  MODE, PROBH, XF
01429 C.
01430 C.    Output Parameter:  Function value
01431 C.
01432 C.    Author(s):  S. Jadach, Z. Was               Created at:  01/01/89
01433 C.                B. van Eijk, P.Golonka          Last Update: 26/06/04
01434 C.
01435 C.----------------------------------------------------------------------
01436       IMPLICIT NONE
01437       REAL*8 PHOFAC,FF,PRX
01438       INTEGER MODE
01439       INTEGER IREP
01440       REAL*8 PROBH,CORWT,XF
01441       COMMON/PHOPRO/PROBH,CORWT,XF,IREP
01442       LOGICAL INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
01443       REAL*8 FINT,FSEC,EXPEPS
01444       COMMON /PHOKEY/ FSEC,FINT,EXPEPS,INTERF,ISEC,ITRE,IEXP,IFTOP,IFW
01445       SAVE PRX,FF
01446       DATA PRX,FF/ 0.D0, 0.D0/
01447       IF (IEXP) THEN  ! In case of exponentiation this routine is useles
01448         PHOFAC=1
01449         RETURN
01450       ENDIF
01451       IF   (MODE.EQ.-1) THEN
01452         PRX=1.D0
01453         FF=1.D0
01454         PROBH=0.0
01455       ELSEIF (MODE.EQ.0) THEN
01456         IF (IREP.EQ.0) PRX=1.D0
01457         PRX=PRX/(1.D0-PROBH)
01458         FF=1.D0
01459 C--
01460 C--   Following options are not considered for the time being...
01461 C--   (1) Good choice, but does not save very much time:
01462 C--       FF=(1.0D0-SQRT(XF)/2.0D0)/(1.0+SQRT(XF)/2.0D0)
01463 C--   (2) Taken from the blue, but works without weight overflows...
01464 C--       FF=(1.D0-XF/(1-(1-SQRT(XF))**2))*(1+(1-SQRT(XF))/SQRT(1-XF))/2
01465         PHOFAC=FF*PRX
01466       ELSE
01467         PHOFAC=1.D0/FF
01468       ENDIF
01469       END
01470       SUBROUTINE PHOBW(WT)
01471 C.----------------------------------------------------------------------
01472 C.
01473 C.    PHOTOS:   PHOtos Boson W correction weight
01474 C.
01475 C.    Purpose:  calculates correction weight due to amplitudes of 
01476 C.              emission from W boson.
01477 C.              
01478 C.              
01479 C.              
01480 C.              
01481 C.
01482 C.    Input Parameters:  Common /PHOEVT/, with photon added.
01483 C.                       wt  to be corrected
01484 C.                       
01485 C.                       
01486 C.                       
01487 C.    Output Parameters: wt
01488 C.
01489 C.    Author(s):  G. Nanava, Z. Was               Created at:  13/03/03
01490 C.                                                Last Update: 13/03/03
01491 C.
01492 C.----------------------------------------------------------------------
01493       IMPLICIT NONE
01494       DOUBLE PRECISION WT
01495       INTEGER NMXPHO
01496       PARAMETER (NMXPHO=10000)
01497       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
01498       REAL*8 PPHO,VPHO
01499       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
01500      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
01501       INTEGER I
01502       DOUBLE PRECISION EMU,MCHREN,BETA,COSTHG,MPASQR,XPH
01503 C--
01504         IF (ABS(IDPHO(1)).EQ.24.AND.
01505      $     ABS(IDPHO(JDAPHO(1,1)  )).GE.11.AND.
01506      $     ABS(IDPHO(JDAPHO(1,1)  )).LE.16.AND.
01507      $     ABS(IDPHO(JDAPHO(1,1)+1)).GE.11.AND.
01508      $     ABS(IDPHO(JDAPHO(1,1)+1)).LE.16     ) THEN
01509 
01510            IF(
01511      $      ABS(IDPHO(JDAPHO(1,1)  )).EQ.11.OR.
01512      $      ABS(IDPHO(JDAPHO(1,1)  )).EQ.13.OR.
01513      $      ABS(IDPHO(JDAPHO(1,1)  )).EQ.15    ) THEN 
01514               I=JDAPHO(1,1)
01515            ELSE
01516               I=JDAPHO(1,1)+1
01517            ENDIF
01518            EMU=PPHO(4,I)
01519            MCHREN=ABS(PPHO(4,I)**2-PPHO(3,I)**2
01520      $               -PPHO(2,I)**2-PPHO(1,I)**2)
01521            BETA=SQRT(1- MCHREN/ PPHO(4,I)**2)
01522            COSTHG=(PPHO(3,I)*PPHO(3,NPHO)+PPHO(2,I)*PPHO(2,NPHO)
01523      $                                   +PPHO(1,I)*PPHO(1,NPHO))/
01524      $            SQRT(PPHO(3,I)**2+PPHO(2,I)**2+PPHO(1,I)**2)   /
01525      $            SQRT(PPHO(3,NPHO)**2+PPHO(2,NPHO)**2+PPHO(1,NPHO)**2)
01526            MPASQR=PPHO(4,1)**2     
01527            XPH=PPHO(4,NPHO)
01528            WT=WT*(1-8*EMU*XPH*(1-COSTHG*BETA)*     
01529      $           (MCHREN+2*XPH*SQRT(MPASQR))/
01530      $            MPASQR**2/(1-MCHREN/MPASQR)/(4-MCHREN/MPASQR)) 
01531         ENDIF
01532 c        write(*,*) IDPHO(1),IDPHO(JDAPHO(1,1)),IDPHO(JDAPHO(1,1)+1)
01533 c        write(*,*) emu,xph,costhg,beta,mpasqr,mchren
01534 
01535       END
01536       SUBROUTINE PHODO(IP,NCHARB,NEUDAU)
01537 C.----------------------------------------------------------------------
01538 C.
01539 C.    PHOTOS:   PHOton radiation in  decays DOing of KINematics
01540 C.
01541 C.    Purpose:  Starting  from   the  charged  particle energy/momentum,
01542 C.              PNEUTR, photon  energy  fraction and photon  angle  with
01543 C.              respect  to  the axis formed by charged particle energy/
01544 C.              momentum  vector  and PNEUTR, scale the energy/momentum,
01545 C.              keeping the original direction of the neutral system  in
01546 C.              the lab. frame untouched.
01547 C.
01548 C.    Input Parameters:   IP:      Pointer  to   decaying  particle   in
01549 C.                                 /PHOEVT/  and   the   common   itself
01550 C.                        NCHARB:  pointer to the charged radiating
01551 C.                                 daughter in /PHOEVT/.
01552 C.                        NEUDAU:  pointer to the first neutral daughter
01553 C.    Output Parameters:  Common /PHOEVT/, with photon added.
01554 C.
01555 C.    Author(s):  Z. Was, B. van Eijk             Created at:  26/11/89
01556 C.                                                Last Update: 27/05/93
01557 C.
01558 C.----------------------------------------------------------------------
01559       IMPLICIT NONE
01560       DOUBLE PRECISION PHOAN1,PHOAN2,ANGLE,FI1,FI3,FI4,FI5,TH1,TH3,TH4
01561       DOUBLE PRECISION PARNE,QNEW,QOLD,DATA
01562       INTEGER IP,FI3DUM,I,J,NEUDAU,FIRST,LAST
01563       INTEGER NCHARB
01564       REAL*8 EPHOTO,PMAVIR,PHOTRI
01565       REAL*8 GNEUT,PHORANC,CCOSTH,SSINTH,PVEC(4)
01566       INTEGER NMXPHO
01567       PARAMETER (NMXPHO=10000)
01568       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
01569       REAL*8 PPHO,VPHO
01570       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
01571      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
01572       DOUBLE PRECISION MCHSQR,MNESQR
01573       REAL*8 PNEUTR
01574       COMMON/PHOMOM/MCHSQR,MNESQR,PNEUTR(5)
01575       DOUBLE PRECISION COSTHG,SINTHG
01576       REAL*8 XPHMAX,XPHOTO
01577       COMMON/PHOPHS/XPHMAX,XPHOTO,COSTHG,SINTHG
01578       REAL*8 PI,TWOPI
01579       COMMON/PHPICO/PI,TWOPI
01580 C fi3 orientation of photon, fi1,th1 orientation of neutral
01581       COMMON /PHOREST/ FI3,fi1,th1
01582 C--
01583       EPHOTO=XPHOTO*PPHO(5,IP)/2.D0
01584       PMAVIR=SQRT(PPHO(5,IP)*(PPHO(5,IP)-2.D0*EPHOTO))
01585 C--
01586 C--   Reconstruct  kinematics  of  charged particle  and  neutral system
01587       FI1=PHOAN1(PNEUTR(1),PNEUTR(2))
01588 C--
01589 C--   Choose axis along  z of  PNEUTR, calculate  angle  between x and y
01590 C--   components  and z  and x-y plane and  perform Lorentz transform...
01591       TH1=PHOAN2(PNEUTR(3),SQRT(PNEUTR(1)**2+PNEUTR(2)**2))
01592       CALL PHORO3(-FI1,PNEUTR(1))
01593       CALL PHORO2(-TH1,PNEUTR(1))
01594 C--
01595 C--   Take  away  photon energy from charged particle and PNEUTR !  Thus
01596 C--   the onshell charged particle  decays into virtual charged particle
01597 C--   and photon.  The virtual charged  particle mass becomes:
01598 C--   SQRT(PPHO(5,IP)*(PPHO(5,IP)-2*EPHOTO)).  Construct  new PNEUTR mo-
01599 C--   mentum in the rest frame of the parent:
01600 C--   1) Scaling parameters...
01601       QNEW=PHOTRI(PMAVIR,PNEUTR(5),PPHO(5,NCHARB))
01602       QOLD=PNEUTR(3)
01603       GNEUT=(QNEW**2+QOLD**2+MNESQR)/(QNEW*QOLD+SQRT((QNEW**2+MNESQR)*
01604      &(QOLD**2+MNESQR)))
01605       IF (GNEUT.LT.1.D0) THEN
01606         DATA=0.D0
01607         CALL PHOERR(4,'PHOKIN',DATA)
01608       ENDIF
01609       PARNE=GNEUT-SQRT(MAX(GNEUT**2-1.0D0,0.D0))
01610 C--
01611 C--   2) ...reductive boost...
01612       CALL PHOBO3(PARNE,PNEUTR)
01613 C--
01614 C--   ...calculate photon energy in the reduced system...
01615       NPHO=NPHO+1
01616       ISTPHO(NPHO)=1
01617       IDPHO(NPHO) =22
01618 C--   Photon mother and daughter pointers !
01619       JMOPHO(1,NPHO)=IP
01620       JMOPHO(2,NPHO)=0
01621       JDAPHO(1,NPHO)=0
01622       JDAPHO(2,NPHO)=0
01623       PPHO(4,NPHO)=EPHOTO*PPHO(5,IP)/PMAVIR
01624 C--
01625 C--   ...and photon momenta
01626       CCOSTH=-COSTHG
01627       SSINTH=SINTHG
01628       TH3=PHOAN2(CCOSTH,SSINTH)
01629       FI3=TWOPI*PHORANC(FI3DUM)
01630       PPHO(1,NPHO)=PPHO(4,NPHO)*SINTHG*COS(FI3)
01631       PPHO(2,NPHO)=PPHO(4,NPHO)*SINTHG*SIN(FI3)
01632 C--
01633 C--   Minus sign because axis opposite direction of charged particle !
01634       PPHO(3,NPHO)=-PPHO(4,NPHO)*COSTHG
01635       PPHO(5,NPHO)=0.D0
01636 C--
01637 C--   Rotate in order to get photon along z-axis
01638       CALL PHORO3(-FI3,PNEUTR(1))
01639       CALL PHORO3(-FI3,PPHO(1,NPHO))
01640       CALL PHORO2(-TH3,PNEUTR(1))
01641       CALL PHORO2(-TH3,PPHO(1,NPHO))
01642       ANGLE=EPHOTO/PPHO(4,NPHO)
01643 C--
01644 C--   Boost to the rest frame of decaying particle
01645       CALL PHOBO3(ANGLE,PNEUTR(1))
01646       CALL PHOBO3(ANGLE,PPHO(1,NPHO))
01647 C--
01648 C--   Back in the parent rest frame but PNEUTR not yet oriented !
01649       FI4=PHOAN1(PNEUTR(1),PNEUTR(2))
01650       TH4=PHOAN2(PNEUTR(3),SQRT(PNEUTR(1)**2+PNEUTR(2)**2))
01651       CALL PHORO3(FI4,PNEUTR(1))
01652       CALL PHORO3(FI4,PPHO(1,NPHO))
01653 C--
01654         DO 60 I=2,4
01655    60   PVEC(I)=0.D0
01656         PVEC(1)=1.D0
01657         CALL PHORO3(-FI3,PVEC)
01658         CALL PHORO2(-TH3,PVEC)
01659         CALL PHOBO3(ANGLE,PVEC)
01660         CALL PHORO3(FI4,PVEC)
01661         CALL PHORO2(-TH4,PNEUTR)
01662         CALL PHORO2(-TH4,PPHO(1,NPHO))
01663         CALL PHORO2(-TH4,PVEC)
01664         FI5=PHOAN1(PVEC(1),PVEC(2))
01665 C--
01666 C--   Charged particle restores original direction
01667         CALL PHORO3(-FI5,PNEUTR)
01668         CALL PHORO3(-FI5,PPHO(1,NPHO))
01669         CALL PHORO2(TH1,PNEUTR(1))
01670         CALL PHORO2(TH1,PPHO(1,NPHO))
01671         CALL PHORO3(FI1,PNEUTR)
01672         CALL PHORO3(FI1,PPHO(1,NPHO))
01673 C--   See whether neutral system has multiplicity larger than 1...
01674       IF ((JDAPHO(2,IP)-JDAPHO(1,IP)).GT.1) THEN
01675 C--   Find pointers to components of 'neutral' system
01676 C--
01677         FIRST=NEUDAU
01678         LAST=JDAPHO(2,IP)
01679         DO 70 I=FIRST,LAST
01680           IF (I.NE.NCHARB.AND.(JMOPHO(1,I).EQ.IP)) THEN
01681 C--
01682 C--   Reconstruct kinematics...
01683             CALL PHORO3(-FI1,PPHO(1,I))
01684             CALL PHORO2(-TH1,PPHO(1,I))
01685 C--
01686 C--   ...reductive boost
01687             CALL PHOBO3(PARNE,PPHO(1,I))
01688 C--
01689 C--   Rotate in order to get photon along z-axis
01690             CALL PHORO3(-FI3,PPHO(1,I))
01691             CALL PHORO2(-TH3,PPHO(1,I))
01692 C--
01693 C--   Boost to the rest frame of decaying particle
01694             CALL PHOBO3(ANGLE,PPHO(1,I))
01695 C--
01696 C--   Back in the parent rest-frame but PNEUTR not yet oriented.
01697             CALL PHORO3(FI4,PPHO(1,I))
01698             CALL PHORO2(-TH4,PPHO(1,I))
01699 C--
01700 C--   Charged particle restores original direction
01701             CALL PHORO3(-FI5,PPHO(1,I))
01702             CALL PHORO2(TH1,PPHO(1,I))
01703             CALL PHORO3(FI1,PPHO(1,I))
01704           ENDIF
01705    70   CONTINUE
01706       ELSE
01707 C--
01708 C--   ...only one 'neutral' particle in addition to photon!
01709         DO 80 J=1,4
01710    80   PPHO(J,NEUDAU)=PNEUTR(J)
01711       ENDIF
01712 C--
01713 C--   All 'neutrals' treated, fill /PHOEVT/ for charged particle...
01714       DO 90 J=1,3
01715    90 PPHO(J,NCHARB)=-(PPHO(J,NPHO)+PNEUTR(J))
01716       PPHO(4,NCHARB)=PPHO(5,IP)-(PPHO(4,NPHO)+PNEUTR(4))
01717 C--
01718       END
01719       FUNCTION PHOTRI(A,B,C)
01720 C.----------------------------------------------------------------------
01721 C.
01722 C.    PHOTOS:   PHOton radiation in decays calculation of TRIangle fie
01723 C.
01724 C.    Purpose:  Calculation of triangle function for phase space.
01725 C.
01726 C.    Input Parameters:  A, B, C (Virtual) particle masses.
01727 C.
01728 C.    Output Parameter:  Function value =
01729 C.                       SQRT(LAMBDA(A**2,B**2,C**2))/(2*A)
01730 C.
01731 C.    Author(s):  B. van Eijk                     Created at:  15/11/89
01732 C.                                                Last Update: 02/01/90
01733 C.
01734 C.----------------------------------------------------------------------
01735       IMPLICIT NONE
01736       DOUBLE PRECISION DA,DB,DC,DAPB,DAMB,DTRIAN
01737       REAL*8 A,B,C,PHOTRI
01738       DA=A
01739       DB=B
01740       DC=C
01741       DAPB=DA+DB
01742       DAMB=DA-DB
01743       DTRIAN=SQRT((DAMB-DC)*(DAPB+DC)*(DAMB+DC)*(DAPB-DC))
01744       PHOTRI=DTRIAN/(DA+DA)
01745       RETURN
01746       END
01747       FUNCTION PHOAN1(X,Y)
01748 C.----------------------------------------------------------------------
01749 C.
01750 C.    PHOTOS:   PHOton radiation in decays calculation of ANgle '1'
01751 C.
01752 C.    Purpose:  Calculate angle from X and Y
01753 C.
01754 C.    Input Parameters:  X, Y
01755 C.
01756 C.    Output Parameter:  Function value
01757 C.
01758 C.    Author(s):  S. Jadach                       Created at:  01/01/89
01759 C.                B. van Eijk                     Last Update: 02/01/90
01760 C.
01761 C.----------------------------------------------------------------------
01762       IMPLICIT NONE
01763       DOUBLE PRECISION PHOAN1
01764       REAL*8 X,Y
01765       REAL*8 PI,TWOPI
01766       COMMON/PHPICO/PI,TWOPI
01767       IF (ABS(Y).LT.ABS(X)) THEN
01768         PHOAN1=ATAN(ABS(Y/X))
01769         IF (X.LE.0.D0) PHOAN1=PI-PHOAN1
01770       ELSE
01771         PHOAN1=ACOS(X/SQRT(X**2+Y**2))
01772       ENDIF
01773       IF (Y.LT.0.D0) PHOAN1=TWOPI-PHOAN1
01774       RETURN
01775       END
01776       FUNCTION PHOAN2(X,Y)
01777 C.----------------------------------------------------------------------
01778 C.
01779 C.    PHOTOS:   PHOton radiation in decays calculation of ANgle '2'
01780 C.
01781 C.    Purpose:  Calculate angle from X and Y
01782 C.
01783 C.    Input Parameters:  X, Y
01784 C.
01785 C.    Output Parameter:  Function value
01786 C.
01787 C.    Author(s):  S. Jadach                       Created at:  01/01/89
01788 C.                B. van Eijk                     Last Update: 02/01/90
01789 C.
01790 C.----------------------------------------------------------------------
01791       IMPLICIT NONE
01792       DOUBLE PRECISION PHOAN2
01793       REAL*8 X,Y
01794       REAL*8 PI,TWOPI
01795       COMMON/PHPICO/PI,TWOPI
01796       IF (ABS(Y).LT.ABS(X)) THEN
01797         PHOAN2=ATAN(ABS(Y/X))
01798         IF (X.LE.0.D0) PHOAN2=PI-PHOAN2
01799       ELSE
01800         PHOAN2=ACOS(X/SQRT(X**2+Y**2))
01801       ENDIF
01802       RETURN
01803       END
01804       SUBROUTINE PHOBO3(ANGLE,PVEC)
01805 C.----------------------------------------------------------------------
01806 C.
01807 C.    PHOTOS:   PHOton radiation in decays BOost routine '3'
01808 C.
01809 C.    Purpose:  Boost  vector PVEC  along z-axis where ANGLE = EXP(ETA),
01810 C.              ETA is the hyperbolic velocity.
01811 C.
01812 C.    Input Parameters:  ANGLE, PVEC
01813 C.
01814 C.    Output Parameter:  PVEC
01815 C.
01816 C.    Author(s):  S. Jadach                       Created at:  01/01/89
01817 C.                B. van Eijk                     Last Update: 02/01/90
01818 C.
01819 C.----------------------------------------------------------------------
01820       IMPLICIT NONE
01821       DOUBLE PRECISION QPL,QMI,ANGLE
01822       REAL*8 PVEC(4)
01823       QPL=(PVEC(4)+PVEC(3))*ANGLE
01824       QMI=(PVEC(4)-PVEC(3))/ANGLE
01825       PVEC(3)=(QPL-QMI)/2.D0
01826       PVEC(4)=(QPL+QMI)/2.D0
01827       RETURN
01828       END
01829       SUBROUTINE PHORO2(ANGLE,PVEC)
01830 C.----------------------------------------------------------------------
01831 C.
01832 C.    PHOTOS:   PHOton radiation in decays ROtation routine '2'
01833 C.
01834 C.    Purpose:  Rotate  x and z components  of vector PVEC  around angle
01835 C.              'ANGLE'.
01836 C.
01837 C.    Input Parameters:  ANGLE, PVEC
01838 C.
01839 C.    Output Parameter:  PVEC
01840 C.
01841 C.    Author(s):  S. Jadach                       Created at:  01/01/89
01842 C.                B. van Eijk                     Last Update: 02/01/90
01843 C.
01844 C.----------------------------------------------------------------------
01845       IMPLICIT NONE
01846       DOUBLE PRECISION CS,SN,ANGLE
01847       REAL*8 PVEC(4)
01848       CS=COS(ANGLE)*PVEC(1)+SIN(ANGLE)*PVEC(3)
01849       SN=-SIN(ANGLE)*PVEC(1)+COS(ANGLE)*PVEC(3)
01850       PVEC(1)=CS
01851       PVEC(3)=SN
01852       RETURN
01853       END
01854       SUBROUTINE PHORO3(ANGLE,PVEC)
01855 C.----------------------------------------------------------------------
01856 C.
01857 C.    PHOTOS:   PHOton radiation in decays ROtation routine '3'
01858 C.
01859 C.    Purpose:  Rotate  x and y components  of vector PVEC  around angle
01860 C.              'ANGLE'.
01861 C.
01862 C.    Input Parameters:  ANGLE, PVEC
01863 C.
01864 C.    Output Parameter:  PVEC
01865 C.
01866 C.    Author(s):  S. Jadach                       Created at:  01/01/89
01867 C.                B. van Eijk                     Last Update: 02/01/90
01868 C.
01869 C.----------------------------------------------------------------------
01870       IMPLICIT NONE
01871       DOUBLE PRECISION CS,SN,ANGLE
01872       REAL*8 PVEC(4)
01873       CS=COS(ANGLE)*PVEC(1)-SIN(ANGLE)*PVEC(2)
01874       SN=SIN(ANGLE)*PVEC(1)+COS(ANGLE)*PVEC(2)
01875       PVEC(1)=CS
01876       PVEC(2)=SN
01877       RETURN
01878       END
01879       FUNCTION PHOCHA(IDHEP)
01880 C.----------------------------------------------------------------------
01881 C.
01882 C.    PHOTOS:   PHOton radiation in decays CHArge determination
01883 C.
01884 C.    Purpose:  Calculate the charge  of particle  with code IDHEP.  The
01885 C.              code  of the  particle  is  defined by the Particle Data
01886 C.              Group in Phys. Lett. B204 (1988) 1.
01887 C.
01888 C.    Input Parameter:   IDHEP
01889 C.
01890 C.    Output Parameter:  Funtion value = charge  of  particle  with code
01891 C.                       IDHEP
01892 C.
01893 C.    Author(s):  E. Barberio and B. van Eijk     Created at:  29/11/89
01894 C.                                                Last update: 02/01/90
01895 C.
01896 C.----------------------------------------------------------------------
01897       IMPLICIT NONE
01898       REAL*8 PHOCHA
01899       INTEGER IDHEP,IDABS,Q1,Q2,Q3
01900 C--
01901 C--   Array 'CHARGE' contains the charge  of the first 101 particles ac-
01902 C--   cording  to  the PDG particle code... (0 is added for convenience)
01903       REAL*8 CHARGE(0:100)
01904       DATA CHARGE/ 0.D0,
01905      &-0.3333333333D0,  0.6666666667D0, -0.3333333333D0, 0.6666666667D0,
01906      &-0.3333333333D0,  0.6666666667D0, -0.3333333333D0, 0.6666666667D0,
01907      & 2*0.D0, -1.D0, 0.D0, -1.D0, 0.D0, -1.D0, 0.D0, -1.D0, 6*0.D0, 
01908      & 1.D0, 12*0.D0, 1.D0, 63*0.D0/
01909       IDABS=ABS(IDHEP)
01910       IF (IDABS.LE.100) THEN
01911 C--
01912 C--   Charge of quark, lepton, boson etc....
01913         PHOCHA = CHARGE(IDABS)
01914       ELSE
01915 C--
01916 C--   Check on particle build out of quarks, unpack its code...
01917         Q3=MOD(IDABS/1000,10)
01918         Q2=MOD(IDABS/100,10)
01919         Q1=MOD(IDABS/10,10)
01920         IF (Q3.EQ.0) THEN
01921 C--
01922 C--   ...meson...
01923           IF(MOD(Q2,2).EQ.0) THEN
01924             PHOCHA=CHARGE(Q2)-CHARGE(Q1)
01925           ELSE
01926             PHOCHA=CHARGE(Q1)-CHARGE(Q2)
01927           ENDIF
01928         ELSE
01929 C--
01930 C--   ...diquarks or baryon.
01931           PHOCHA=CHARGE(Q1)+CHARGE(Q2)+CHARGE(Q3)
01932         ENDIF
01933       ENDIF
01934 C--
01935 C--   Find the sign of the charge...
01936       IF (IDHEP.LT.0.D0) PHOCHA=-PHOCHA
01937       IF (PHOCHA**2.lt.1d-6) PHOCHA=0.D0
01938       RETURN
01939       END
01940       FUNCTION PHOSPI(IDHEP)
01941 C.----------------------------------------------------------------------
01942 C.
01943 C.    PHOTOS:   PHOton radiation  in decays function for SPIn determina-
01944 C.              tion
01945 C.
01946 C.    Purpose:  Calculate  the spin  of particle  with  code IDHEP.  The
01947 C.              code  of the particle  is  defined  by the Particle Data
01948 C.              Group in Phys. Lett. B204 (1988) 1.
01949 C.
01950 C.    Input Parameter:   IDHEP
01951 C.
01952 C.    Output Parameter:  Funtion  value = spin  of  particle  with  code
01953 C.                       IDHEP
01954 C.
01955 C.    Author(s):  E. Barberio and B. van Eijk     Created at:  29/11/89
01956 C.                                                Last update: 02/01/90
01957 C.
01958 C.----------------------------------------------------------------------
01959       IMPLICIT NONE
01960       REAL*8 PHOSPI
01961       INTEGER IDHEP,IDABS
01962 C--
01963 C--   Array 'SPIN' contains the spin  of  the first 100 particles accor-
01964 C--   ding to the PDG particle code...
01965       REAL*8 SPIN(100)
01966       DATA SPIN/ 8*.5D0, 1.D0, 0.D0, 8*.5D0, 2*0.D0, 4*1.D0, 76*0.D0/
01967       IDABS=ABS(IDHEP)
01968 C--
01969 C--   Spin of quark, lepton, boson etc....
01970       IF (IDABS.LE.100) THEN
01971         PHOSPI=SPIN(IDABS)
01972       ELSE
01973 C--
01974 C--   ...other particles, however...
01975         PHOSPI=(MOD(IDABS,10)-1.D0)/2.D0
01976 C--
01977 C--   ...K_short and K_long are special !!
01978         PHOSPI=MAX(PHOSPI,0.D0)
01979       ENDIF
01980       RETURN
01981       END
01982       SUBROUTINE PHOERR(IMES,TEXT,DATA)
01983 C.----------------------------------------------------------------------
01984 C.
01985 C.    PHOTOS:   PHOton radiation in decays ERRror handling
01986 C.
01987 C.    Purpose:  Inform user  about (fatal) errors and warnings generated
01988 C.              by either the user or the program.
01989 C.
01990 C.    Input Parameters:   IMES, TEXT, DATA
01991 C.
01992 C.    Output Parameters:  None
01993 C.
01994 C.    Author(s):  B. van Eijk                     Created at:  29/11/89
01995 C.                                                Last Update: 10/01/92
01996 C.
01997 C.----------------------------------------------------------------------
01998       IMPLICIT NONE
01999       DOUBLE PRECISION DATA
02000       INTEGER IMES,IERROR
02001       REAL*8 SDATA
02002       INTEGER PHLUN
02003       COMMON/PHOLUN/PHLUN
02004       INTEGER PHOMES
02005       PARAMETER (PHOMES=10)
02006       INTEGER STATUS
02007       LOGICAL       IFSTOP
02008       COMMON/PHOSTA/STATUS(PHOMES),IFSTOP
02009 
02010       CHARACTER TEXT*(*)
02011       SAVE IERROR
02012 C--   security STOP switch  
02013       DATA IERROR/ 0/
02014 C--      IFSTOP=.TRUE.
02015       IF (IMES.LE.PHOMES) STATUS(IMES)=STATUS(IMES)+1
02016 C--
02017 C--   Count number of non-fatal errors...
02018       IF ((IMES.EQ. 6).AND.(STATUS(IMES).GE.2)) RETURN
02019       IF ((IMES.EQ.10).AND.(STATUS(IMES).GE.2)) RETURN
02020       SDATA=DATA
02021       WRITE(PHLUN,9000)
02022       WRITE(PHLUN,9120)
02023       GOTO (10,20,30,40,50,60,70,80,90,100),IMES
02024       WRITE(PHLUN,9130) IMES
02025       GOTO 120
02026    10 WRITE(PHLUN,9010) TEXT,INT(SDATA)
02027       GOTO 110
02028    20 WRITE(PHLUN,9020) TEXT,SDATA
02029       GOTO 110
02030    30 WRITE(PHLUN,9030) TEXT,SDATA
02031       GOTO 110
02032    40 WRITE(PHLUN,9040) TEXT
02033       GOTO 110
02034    50 WRITE(PHLUN,9050) TEXT,INT(SDATA)
02035       GOTO 110
02036    60 WRITE(PHLUN,9060) TEXT,SDATA
02037       GOTO 130
02038    70 WRITE(PHLUN,9070) TEXT,INT(SDATA)
02039       GOTO 110
02040    80 WRITE(PHLUN,9080) TEXT,INT(SDATA)
02041       GOTO 110
02042    90 WRITE(PHLUN,9090) TEXT,INT(SDATA)
02043       GOTO 110
02044   100 WRITE(PHLUN,9100) TEXT,SDATA
02045       GOTO 130
02046   110 CONTINUE
02047       WRITE(PHLUN,9140)
02048       WRITE(PHLUN,9120)
02049       WRITE(PHLUN,9000)
02050       IF (IFSTOP) THEN 
02051         STOP
02052       ELSE
02053         GOTO 130
02054       ENDIF
02055   120 IERROR=IERROR+1
02056       IF (IERROR.GE.10) THEN
02057         WRITE(PHLUN,9150)
02058         WRITE(PHLUN,9120)
02059         WRITE(PHLUN,9000)
02060         IF (IFSTOP) THEN 
02061           STOP
02062         ELSE
02063           GOTO 130
02064         ENDIF
02065       ENDIF
02066   130 WRITE(PHLUN,9120)
02067       WRITE(PHLUN,9000)
02068       RETURN
02069  9000 FORMAT(1H ,80('*'))
02070  9010 FORMAT(1H ,'* ',A,': Too many charged Particles, NCHARG =',I6,T81,
02071      &'*')
02072  9020 FORMAT(1H ,'* ',A,': Too much Bremsstrahlung required, PRSOFT = ',
02073      &F15.6,T81,'*')
02074  9030 FORMAT(1H ,'* ',A,': Combined Weight is exceeding 1., Weight = ',
02075      &F15.6,T81,'*')
02076  9040 FORMAT(1H ,'* ',A,
02077      &': Error in Rescaling charged and neutral Vectors',T81,'*')
02078  9050 FORMAT(1H ,'* ',A,
02079      &': Non matching charged Particle Pointer, NCHARG = ',I5,T81,'*')
02080  9060 FORMAT(1H ,'* ',A,
02081      &': Do you really work with a Particle of Spin: ',F4.1,' ?',T81,
02082      &'*')
02083  9070 FORMAT(1H ,'* ',A, ': Stack Length exceeded, NSTACK = ',I5 ,T81,
02084      &'*')
02085  9080 FORMAT(1H ,'* ',A,
02086      &': Random Number Generator Seed(1) out of Range: ',I8,T81,'*')
02087  9090 FORMAT(1H ,'* ',A,
02088      &': Random Number Generator Seed(2) out of Range: ',I8,T81,'*')
02089  9100 FORMAT(1H ,'* ',A,
02090      &': Available Phase Space below Cut-off: ',F15.6,' GeV/c^2',T81,
02091      &'*')
02092  9120 FORMAT(1H ,'*',T81,'*')
02093  9130 FORMAT(1H ,'* Funny Error Message: ',I4,' ! What to do ?',T81,'*')
02094  9140 FORMAT(1H ,'* Fatal Error Message, I stop this Run !',T81,'*')
02095  9150 FORMAT(1H ,'* 10 Error Messages generated, I stop this Run !',T81,
02096      &'*')
02097       END
02098       SUBROUTINE PHOREP
02099 C.----------------------------------------------------------------------
02100 C.
02101 C.    PHOTOS:   PHOton radiation in decays run summary REPort
02102 C.
02103 C.    Purpose:  Inform user about success and/or restrictions of PHOTOS
02104 C.              encountered during execution.
02105 C.
02106 C.    Input Parameters:   Common /PHOSTA/
02107 C.
02108 C.    Output Parameters:  None
02109 C.
02110 C.    Author(s):  B. van Eijk                     Created at:  10/01/92
02111 C.                                                Last Update: 10/01/92
02112 C.
02113 C.----------------------------------------------------------------------
02114       IMPLICIT NONE
02115       INTEGER PHLUN
02116       COMMON/PHOLUN/PHLUN
02117       INTEGER PHOMES
02118       PARAMETER (PHOMES=10)
02119       INTEGER STATUS
02120       LOGICAL IFSTOP
02121       COMMON/PHOSTA/STATUS(PHOMES),IFSTOP
02122       INTEGER I
02123       LOGICAL ERROR
02124       ERROR=.FALSE.
02125       WRITE(PHLUN,9000)
02126       WRITE(PHLUN,9010)
02127       WRITE(PHLUN,9020)
02128       WRITE(PHLUN,9030)
02129       WRITE(PHLUN,9040)
02130       WRITE(PHLUN,9030)
02131       WRITE(PHLUN,9020)
02132       DO 10 I=1,PHOMES
02133         IF (STATUS(I).EQ.0) GOTO 10
02134         IF ((I.EQ.6).OR.(I.EQ.10)) THEN
02135           WRITE(PHLUN,9050) I,STATUS(I)
02136         ELSE
02137           ERROR=.TRUE.
02138           WRITE(PHLUN,9060) I,STATUS(I)
02139         ENDIF
02140    10 CONTINUE
02141       IF (.NOT.ERROR) WRITE(PHLUN,9070)
02142       WRITE(PHLUN,9020)
02143       WRITE(PHLUN,9010)
02144       RETURN
02145  9000 FORMAT(1H1)
02146  9010 FORMAT(1H ,80('*'))
02147  9020 FORMAT(1H ,'*',T81,'*')
02148  9030 FORMAT(1H ,'*',26X,25('='),T81,'*')
02149  9040 FORMAT(1H ,'*',30X,'PHOTOS Run Summary',T81,'*')
02150  9050 FORMAT(1H ,'*',22X,'Warning #',I2,' occured',I6,' times',T81,'*')
02151  9060 FORMAT(1H ,'*',23X,'Error #',I2,' occured',I6,' times',T81,'*')
02152  9070 FORMAT(1H ,'*',16X,'PHOTOS Execution has successfully terminated',
02153      &T81,'*')
02154       END
02155       SUBROUTINE PHLUPA(IPOINT)
02156       IMPLICIT NONE
02157 C.----------------------------------------------------------------------
02158 C.
02159 C.    PHLUPA:   debugging tool
02160 C.
02161 C.    Purpose:  NONE, eventually may printout content of the 
02162 C.              /PHOEVT/ common
02163 C.
02164 C.    Input Parameters:   Common /PHOEVT/ and /PHNUM/ 
02165 C.                        latter may have number of the event. 
02166 C.
02167 C.    Output Parameters:  None
02168 C.
02169 C.    Author(s):  Z. Was                          Created at:  30/05/93
02170 C.                                                Last Update: 09/10/05
02171 C.
02172 C.----------------------------------------------------------------------
02173       INTEGER NMXPHO
02174       PARAMETER (NMXPHO=10000)
02175       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO,I,J,IPOINT
02176       INTEGER IPOIN,IPOIN0,IPOINM,IEV
02177       INTEGER IOUT
02178       REAL*8 PPHO,VPHO,SUM
02179       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
02180      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
02181       COMMON /PHNUM/ IEV
02182       INTEGER PHLUN
02183       COMMON/PHOLUN/PHLUN
02184       DIMENSION SUM(5)
02185       DATA IPOIN0/ -5/
02186       COMMON /PHLUPY/ IPOIN,IPOINM
02187       SAVE IPOIN0
02188       IF (IPOIN0.LT.0) THEN
02189         IPOIN0=400 000  ! maximal no-print point
02190         IPOIN =IPOIN0
02191         IPOINM=400 001  ! minimal no-print point
02192       ENDIF
02193       IF (IPOINT.LE.IPOINM.OR.IPOINT.GE.IPOIN ) RETURN
02194       IOUT=56
02195       IF (IEV.LT.1000) THEN
02196       DO I=1,5
02197         SUM(I)=0.0D0
02198       ENDDO 
02199       WRITE(PHLUN,*) 'EVENT NR=',IEV,
02200      $            'WE ARE TESTING /PHOEVT/ at IPOINT=',IPOINT
02201       WRITE(PHLUN,10)
02202       I=1
02203       WRITE(PHLUN,20) IDPHO(I),PPHO(1,I),PPHO(2,I),PPHO(3,I),
02204      $                      PPHO(4,I),PPHO(5,I),JDAPHO(1,I),JDAPHO(2,I)
02205       I=2
02206       WRITE(PHLUN,20) IDPHO(I),PPHO(1,I),PPHO(2,I),PPHO(3,I),
02207      $                      PPHO(4,I),PPHO(5,I),JDAPHO(1,I),JDAPHO(2,I)
02208       WRITE(PHLUN,*) ' '
02209       DO I=3,NPHO
02210       WRITE(PHLUN,20) IDPHO(I),PPHO(1,I),PPHO(2,I),PPHO(3,I),
02211      $                      PPHO(4,I),PPHO(5,I),JMOPHO(1,I),JMOPHO(2,I)
02212         DO J=1,4
02213           SUM(J)=SUM(J)+PPHO(J,I)
02214         ENDDO
02215       ENDDO
02216       SUM(5)=SQRT(ABS(SUM(4)**2-SUM(1)**2-SUM(2)**2-SUM(3)**2))
02217       WRITE(PHLUN,30) SUM
02218  10   FORMAT(1X,'  ID      ','p_x      ','p_y      ','p_z      ',
02219      $                   'E        ','m        ',
02220      $                   'ID-MO_DA1','ID-MO DA2' )
02221  20   FORMAT(1X,I4,5(F14.9),2I9)
02222  30   FORMAT(1X,' SUM',5(F14.9))
02223       ENDIF
02224       END
02225 
02226 
02227 
02228       FUNCTION IPHQRK(MODCOR)
02229       implicit none
02230 C.----------------------------------------------------------------------
02231 C.
02232 C.    IPHQRK: enables blocks emision from quarks
02233 C.            
02234 C
02235 C.    Input Parameters:   MODCOR
02236 C.                        MODCOR >0 type of action
02237 C.                               =1 blocks
02238 C.                               =2 enables
02239 C.                               =0 execution mode (retrns stored value)
02240 C.
02241 C.
02242 C.    Author(s):  Z. Was                          Created at:  11/12/00
02243 C.                                                Modified  :  
02244 C.----------------------------------------------------------------------
02245       INTEGER IPHQRK,MODCOR,MODOP
02246       INTEGER PHLUN
02247       COMMON/PHOLUN/PHLUN
02248 
02249       SAVE MODOP
02250       DATA MODOP  /0/
02251       IF (MODCOR.NE.0) THEN 
02252 C       INITIALIZATION
02253         MODOP=MODCOR
02254 
02255         WRITE(PHLUN,*) 
02256      $  'Message from PHOTOS: IPHQRK(MODCOR):: (re)initialization'
02257         IF     (MODOP.EQ.1) THEN
02258           WRITE(PHLUN,*) 
02259      $    'MODOP=1 -- blocks emission from light quarks: DEFAULT' 
02260         ELSEIF (MODOP.EQ.2) THEN
02261           WRITE(PHLUN,*) 
02262      $    'MODOP=2 -- enables emission from light quarks: TEST '
02263         ELSE
02264           WRITE(PHLUN,*) 'IPHQRK wrong MODCOR=',MODCOR
02265           STOP
02266         ENDIF
02267         RETURN
02268       ENDIF
02269 
02270       IF (MODOP.EQ.0.AND.MODCOR.EQ.0) THEN
02271         WRITE(PHLUN,*) 'IPHQRK lack of initialization'
02272         STOP
02273       ENDIF
02274       IPHQRK=MODOP
02275       END
02276 
02277 
02278       FUNCTION IPHEKL(MODCOR)
02279       implicit none
02280 C.----------------------------------------------------------------------
02281 C.
02282 C.    IPHEKL: enables/blocks emision in: pi0 to gamma e+ e-
02283 C.            
02284 C
02285 C.    Input Parameters:   MODCOR
02286 C.                        MODCOR >0 type of action
02287 C.                               =1 blocks
02288 C.                               =2 enables
02289 C.                               =0 execution mode (retrns stored value)
02290 C.
02291 C.
02292 C.    Author(s):  Z. Was                          Created at:  11/12/00
02293 C.                                                Modified  :  
02294 C.----------------------------------------------------------------------
02295       INTEGER IPHEKL,MODCOR,MODOP
02296       INTEGER PHLUN
02297       COMMON/PHOLUN/PHLUN
02298 
02299       SAVE MODOP
02300       DATA MODOP  /0/
02301 
02302       IF (MODCOR.NE.0) THEN 
02303 C       INITIALIZATION
02304         MODOP=MODCOR
02305 
02306         WRITE(PHLUN,*) 
02307      $  'Message from PHOTOS: IPHEKL(MODCOR):: (re)initialization'
02308         IF     (MODOP.EQ.2) THEN
02309           WRITE(PHLUN,*) 
02310      $    'MODOP=2 -- blocks emission in pi0 to gamma e+e-: DEFAULT' 
02311           WRITE(PHLUN,*) 
02312      $    'MODOP=2 -- blocks emission in Kl  to gamma e+e-: DEFAULT' 
02313         ELSEIF (MODOP.EQ.1) THEN
02314           WRITE(PHLUN,*) 
02315      $    'MODOP=1 -- enables emission in pi0 to gamma e+e- : TEST '
02316           WRITE(PHLUN,*) 
02317      $    'MODOP=1 -- enables emission in Kl  to gamma e+e- : TEST '
02318         ELSE
02319           WRITE(PHLUN,*) 'IPHEKL wrong MODCOR=',MODCOR
02320           STOP
02321         ENDIF
02322         RETURN
02323       ENDIF
02324 
02325       IF (MODOP.EQ.0.AND.MODCOR.EQ.0) THEN
02326         WRITE(PHLUN,*) 'IPHELK lack of initialization'
02327         STOP
02328       ENDIF
02329       IPHEKL=MODOP
02330       END
02331 
02332       SUBROUTINE PHCORK(MODCOR)
02333       implicit none
02334 C.----------------------------------------------------------------------
02335 C.
02336 C.    PHCORK: corrects kinmatics of subbranch needed if host program
02337 C.            produces events with the shaky momentum conservation
02338 C
02339 C.    Input Parameters:   Common /PHOEVT/, MODCOR
02340 C.                        MODCOR >0 type of action
02341 C.                               =1 no action
02342 C.                               =2 corrects energy from mass
02343 C.                               =3 corrects mass from energy
02344 C.                               =4 corrects energy from mass for 
02345 C.                                  particles up to .4 GeV mass, 
02346 C.                                  for heavier ones corrects mass,
02347 C.                               =5 most complete correct also of mother
02348 C.                                  often necessary for exponentiation.
02349 C.                               =0 execution mode 
02350 C.
02351 C.    Output Parameters:  corrected /PHOEVT/
02352 C.
02353 C.    Author(s):  P.Golonka, Z. Was               Created at:  01/02/99
02354 C.                                                Modified  :  08/02/99
02355 C.----------------------------------------------------------------------
02356       INTEGER NMXPHO
02357       PARAMETER (NMXPHO=10000)
02358       
02359       REAL*8 M,P2,PX,PY,PZ,E,EN,MCUT,XMS
02360       INTEGER MODCOR,MODOP,I,IEV,IPRINT,K
02361       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
02362       REAL*8 PPHO,VPHO
02363       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
02364      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
02365 
02366       INTEGER PHLUN
02367       COMMON/PHOLUN/PHLUN
02368 
02369       COMMON /PHNUM/ IEV
02370       SAVE MODOP
02371       DATA MODOP  /0/
02372       SAVE IPRINT
02373       DATA IPRINT /0/
02374       SAVE MCUT
02375       IF (MODCOR.NE.0) THEN 
02376 C       INITIALIZATION
02377         MODOP=MODCOR
02378 
02379         WRITE(PHLUN,*) 'Message from PHCORK(MODCOR):: initialization'
02380         IF     (MODOP.EQ.1) THEN
02381           WRITE(PHLUN,*) 'MODOP=1 -- no corrections on event: DEFAULT' 
02382         ELSEIF (MODOP.EQ.2) THEN
02383           WRITE(PHLUN,*) 'MODOP=2 -- corrects Energy from mass'
02384         ELSEIF (MODOP.EQ.3) THEN
02385           WRITE(PHLUN,*) 'MODOP=3 -- corrects mass from Energy'
02386         ELSEIF (MODOP.EQ.4) THEN
02387           WRITE(PHLUN,*) 'MODOP=4 -- corrects Energy from mass to Mcut'
02388           WRITE(PHLUN,*) '           and mass from  energy above  Mcut '
02389           MCUT=0.4
02390           WRITE(PHLUN,*) 'Mcut=',MCUT,'GeV'
02391         ELSEIF (MODOP.EQ.5) THEN
02392           WRITE(PHLUN,*) 'MODOP=5 -- corrects Energy from mass+flow'
02393 
02394         ELSE
02395           WRITE(PHLUN,*) 'PHCORK wrong MODCOR=',MODCOR
02396           STOP
02397         ENDIF
02398         RETURN
02399       ENDIF
02400 
02401       IF (MODOP.EQ.0.AND.MODCOR.EQ.0) THEN
02402         WRITE(PHLUN,*) 'PHCORK lack of initialization'
02403         STOP
02404       ENDIF
02405 
02406 C execution mode
02407 C ==============
02408 C ============== 
02409 
02410      
02411         PX=0
02412         PY=0
02413         PZ=0
02414         E =0
02415 
02416       IF    (MODOP.EQ.1) THEN
02417 C     -----------------------
02418 C       In this case we do nothing
02419         RETURN
02420       ELSEIF(MODOP.EQ.2) THEN
02421 C     -----------------------
02422 CC      lets loop thru all daughters and correct their energies 
02423 CC      according to E^2=p^2+m^2
02424 
02425        DO I=3,NPHO
02426          
02427          PX=PX+PPHO(1,I)
02428          PY=PY+PPHO(2,I)
02429          PZ=PZ+PPHO(3,I)
02430 
02431          P2=PPHO(1,I)**2+PPHO(2,I)**2+PPHO(3,I)**2
02432 
02433          EN=SQRT( PPHO(5,I)**2 + P2)
02434          
02435          IF (IPRINT.EQ.1)
02436      &   WRITE(PHLUN,*) "CORRECTING ENERGY OF ",I,":",
02437      &        PPHO(4,I),"=>",EN
02438 
02439          PPHO(4,I)=EN
02440          E = E+PPHO(4,I)
02441 
02442        ENDDO
02443 
02444       ELSEIF(MODOP.EQ.5) THEN
02445 C     -----------------------
02446 CC      lets loop thru all daughters and correct their energies 
02447 CC      according to E^2=p^2+m^2
02448 
02449        DO I=3,NPHO
02450          
02451          PX=PX+PPHO(1,I)
02452          PY=PY+PPHO(2,I)
02453          PZ=PZ+PPHO(3,I)
02454 
02455          P2=PPHO(1,I)**2+PPHO(2,I)**2+PPHO(3,I)**2
02456 
02457          EN=SQRT( PPHO(5,I)**2 + P2)
02458          
02459          IF (IPRINT.EQ.1)
02460      &   WRITE(PHLUN,*) "CORRECTING ENERGY OF ",I,":",
02461      &        PPHO(4,I),"=>",EN
02462 
02463          PPHO(4,I)=EN
02464          E = E+PPHO(4,I)
02465 
02466        ENDDO
02467        DO K=1,4
02468         PPHO(K,1)=0d0
02469        DO I=3,NPHO
02470         PPHO(K,1)=PPHO(K,1)+PPHO(K,I)
02471        ENDDO
02472        ENDDO
02473        XMS=SQRT(PPHO(4,1)**2-PPHO(3,1)**2-PPHO(2,1)**2-PPHO(1,1)**2)
02474        PPHO(5,1)=XMS
02475       ELSEIF(MODOP.EQ.3) THEN
02476 C     -----------------------
02477 
02478 CC      lets loop thru all daughters and correct their masses 
02479 CC      according to E^2=p^2+m^2
02480 
02481        DO I=3,NPHO
02482          
02483          PX=PX+PPHO(1,I)
02484          PY=PY+PPHO(2,I)
02485          PZ=PZ+PPHO(3,I)
02486          E = E+PPHO(4,I)
02487 
02488          P2=PPHO(1,I)**2+PPHO(2,I)**2+PPHO(3,I)**2
02489 
02490          M=SQRT(ABS( PPHO(4,I)**2 - P2))
02491 
02492          IF (IPRINT.EQ.1)
02493      &   WRITE(PHLUN,*) "CORRECTING MASS OF ",I,":",
02494      &        PPHO(5,I),"=>",M
02495 
02496          PPHO(5,I)=M
02497 
02498        ENDDO
02499       
02500 
02501       ELSEIF(MODOP.EQ.4) THEN
02502 C     -----------------------
02503             
02504 CC      lets loop thru all daughters and correct their masses 
02505 CC      or energies according to E^2=p^2+m^2
02506 
02507        DO I=3,NPHO
02508          
02509          PX=PX+PPHO(1,I)
02510          PY=PY+PPHO(2,I)
02511          PZ=PZ+PPHO(3,I)
02512 
02513          P2=PPHO(1,I)**2+PPHO(2,I)**2+PPHO(3,I)**2
02514 
02515          M=SQRT(ABS( PPHO(4,I)**2 - P2))
02516 
02517          IF (M.GT.MCUT) THEN
02518           IF (IPRINT.EQ.1)
02519      &    WRITE(PHLUN,*) "CORRECTING MASS OF ",I,":",
02520      &         PPHO(5,I),"=>",M
02521           PPHO(5,I)=M
02522           E = E+PPHO(4,I)
02523          ELSE
02524 
02525           EN=SQRT( PPHO(5,I)**2 + P2)
02526 
02527          IF (IPRINT.EQ.1)
02528      &    WRITE(PHLUN,*) "CORRECTING ENERGY OF ",I,":",
02529      &        PPHO(4,I),"=>",EN
02530 
02531           PPHO(4,I)=EN
02532           E = E+PPHO(4,I)
02533          ENDIF
02534 
02535        ENDDO
02536       ENDIF
02537 C     -----
02538 
02539        IF (IPRINT.EQ.1) THEN
02540         WRITE(PHLUN,*) "CORRECTING MOTHER"
02541         WRITE(PHLUN,*) "PX:",PPHO(1,1),"=>",PX-PPHO(1,2)
02542         WRITE(PHLUN,*) "PY:",PPHO(2,1),"=>",PY-PPHO(2,2)
02543         WRITE(PHLUN,*) "PZ:",PPHO(3,1),"=>",PZ-PPHO(3,2)
02544         WRITE(PHLUN,*) " E:",PPHO(4,1),"=>",E-PPHO(4,2)
02545        ENDIF
02546 
02547        PPHO(1,1)=PX-PPHO(1,2)
02548        PPHO(2,1)=PY-PPHO(2,2)
02549        PPHO(3,1)=PZ-PPHO(3,2)
02550        PPHO(4,1)=E -PPHO(4,2)
02551 
02552        P2=PPHO(1,1)**2+PPHO(2,1)**2+PPHO(3,1)**2
02553 
02554        IF (PPHO(4,1)**2.GT.P2) THEN
02555           M=SQRT( PPHO(4,1)**2 - P2 )
02556           IF (IPRINT.EQ.1)
02557      &    WRITE(PHLUN,*) " M:",PPHO(5,1),"=>",M
02558           PPHO(5,1)=M
02559        ENDIF
02560 
02561       CALL PHLUPA(25)
02562 
02563       END
02564 
02565 
02566 
02567       FUNCTION PHINT(IDUM)
02568 C --- can be used with  VARIANT A. For B use  PHINT1 or 2 --------------
02569 C.----------------------------------------------------------------------
02570 C.
02571 C.    PHINT:   PHotos universal INTerference correction weight
02572 C.
02573 C.    Purpose:  calculates correction weight as expressed by
02574 C               formula (17) from CPC 79 (1994), 291. 
02575 C.
02576 C.    Input Parameters:  Common /PHOEVT/, with photon added.
02577 C.                                          
02578 C.    Output Parameters: correction weight
02579 C.
02580 C.    Author(s):  Z. Was, P.Golonka               Created at:  19/01/05
02581 C.                                                Last Update: 25/01/05
02582 C.
02583 C.----------------------------------------------------------------------
02584       IMPLICIT NONE
02585       REAL*8 PHINT,PHINT2
02586       INTEGER IDUM
02587       INTEGER NMXPHO
02588       PARAMETER (NMXPHO=10000)
02589       INTEGER IDPHO,ISTPHO,JDAPHO,JMOPHO,NEVPHO,NPHO
02590       REAL*8 PPHO,VPHO
02591       COMMON/PHOEVT/NEVPHO,NPHO,ISTPHO(NMXPHO),IDPHO(NMXPHO),
02592      &JMOPHO(2,NMXPHO),JDAPHO(2,NMXPHO),PPHO(5,NMXPHO),VPHO(4,NMXPHO)
02593       INTEGER I,K,L
02594       DOUBLE PRECISION EMU,MCHREN,BETA,COSTHG,MPASQR,XPH, XC1, XC2,XDENO
02595       DOUBLE PRECISION XNUM1,XNUM2
02596       DOUBLE PRECISION EPS1(4),EPS2(4),PH(4),PL(4)
02597       REAL*8 PHOCHA
02598 C--
02599 
02600 C       Calculate polarimetric vector: ph, eps1, eps2 are orthogonal
02601 
02602       DO K=1,4
02603         PH(K)=PPHO(K,NPHO)
02604         EPS2(K)=1D0
02605       ENDDO
02606 
02607       CALL PHOEPS(PH,EPS2,EPS1)
02608       CALL PHOEPS(PH,EPS1,EPS2)
02609     
02610  
02611       XNUM1=0D0
02612       XNUM2=0D0
02613       XDENO=0D0
02614 
02615       DO K=JDAPHO(1,1),NPHO-1  ! or JDAPHO(1,2)
02616       
02617 C momenta of charged particle in PL
02618         DO L=1,4
02619           PL(L)=PPHO(L,K) 
02620         ENDDO      
02621 C scalar products: epsilon*p/k*p
02622 
02623        XC1 = - PHOCHA(IDPHO(K)) * 
02624      & ( PL(1)*EPS1(1) + PL(2)*EPS1(2) + PL(3)*EPS1(3) ) / 
02625      & ( PH(4)*PL(4)   - PH(1)*PL(1)   - PH(2)*PL(2) - PH(3)*PL(3) )
02626      
02627        XC2 = - PHOCHA(IDPHO(K)) * 
02628      & ( PL(1)*EPS2(1) + PL(2)*EPS2(2) + PL(3)*EPS2(3) ) / 
02629      & ( PH(4)*PL(4)   - PH(1)*PL(1)   - PH(2)*PL(2) - PH(3)*PL(3) )
02630         
02631 
02632 C accumulate the currents
02633        XNUM1  = XNUM1+XC1
02634        XNUM2  = XNUM2+XC2
02635 
02636        XDENO = XDENO + XC1**2 + XC2**2
02637 
02638       ENDDO
02639 
02640       PHINT=(XNUM1**2 + XNUM2**2) / XDENO
02641       PHINT2=PHINT
02642 
02643       END
02644 
02645 
02646       SUBROUTINE PHOEPS (VEC1, VEC2, EPS)
02647 C.----------------------------------------------------------------------
02648 C.
02649 C.    PHOEPS:   PHOeps vector product (normalized to unity)
02650 C.
02651 C.    Purpose:  calculates vector product, then normalizes its length.
02652 C               used to generate orthogonal vectors, i.e. to
02653 C               generate polarimetric vectors for photons.
02654 C.
02655 C.    Input Parameters:  VEC1,VEC2 - input 4-vectors
02656 C.                                          
02657 C.    Output Parameters: EPS - normalized 4-vector, orthogonal to
02658 C                              VEC1 and VEC2
02659 C.
02660 C.    Author(s):  Z. Was, P.Golonka               Created at:  19/01/05
02661 C.                                                Last Update: 25/01/05
02662 C.
02663 C.----------------------------------------------------------------------
02664       
02665       DOUBLE PRECISION VEC1(4), VEC2(4), EPS(4),XN
02666       
02667       EPS(1)=VEC1(2)*VEC2(3) - VEC1(3)*VEC2(2)
02668       EPS(2)=VEC1(3)*VEC2(1) - VEC1(1)*VEC2(3)      
02669       EPS(3)=VEC1(1)*VEC2(2) - VEC1(2)*VEC2(1)
02670       EPS(4)=0D0
02671       
02672       XN=SQRT( EPS(1)**2 +EPS(2)**2 +EPS(3)**2)
02673       
02674       EPS(1)=EPS(1)/XN
02675       EPS(2)=EPS(2)/XN
02676       EPS(3)=EPS(3)/XN
02677       
02678       
02679       END
02680       SUBROUTINE PHODMP
02681 C.----------------------------------------------------------------------
02682 C.
02683 C.    PHOTOS:   PHOton radiation in decays event DuMP routine
02684 C.
02685 C.    Purpose:  Print event record.
02686 C.
02687 C.    Input Parameters:   Common /PH_HEPEVT/
02688 C.
02689 C.    Output Parameters:  None
02690 C.
02691 C.    Author(s):  B. van Eijk                     Created at:  05/06/90
02692 C.                                                Last Update: 05/06/90
02693 C.
02694 C.----------------------------------------------------------------------
02695 C      IMPLICIT NONE
02696       DOUBLE PRECISION  SUMVEC(5)
02697       INTEGER I,J
02698 C this is the ph_hepevt class in old style. No d_h_ class pre-name
02699       INTEGER NMXHEP
02700       PARAMETER (NMXHEP=10000)
02701       REAL*8  phep,  vhep ! to be real*4/ *8  depending on host
02702       INTEGER nevhep,nhep,isthep,idhep,jmohep,
02703      $        jdahep
02704       COMMON /ph_hepevt/
02705      $      nevhep,               ! serial number
02706      $      nhep,                 ! number of particles
02707      $      isthep(nmxhep),   ! status code
02708      $      idhep(nmxhep),    ! particle ident KF
02709      $      jmohep(2,nmxhep), ! parent particles
02710      $      jdahep(2,nmxhep), ! childreen particles
02711      $      phep(5,nmxhep),   ! four-momentum, mass [GeV]
02712      $      vhep(4,nmxhep)    ! vertex [mm]
02713 * ----------------------------------------------------------------------
02714       LOGICAL qedrad
02715       COMMON /phoqed/ 
02716      $     qedrad(nmxhep)    ! Photos flag
02717 * ----------------------------------------------------------------------
02718       SAVE ph_hepevt,phoqed
02719       INTEGER PHLUN
02720       COMMON/PHOLUN/PHLUN
02721       DO 10 I=1,5
02722    10 SUMVEC(I)=0.
02723 C--
02724 C--   Print event number...
02725       WRITE(PHLUN,9000)
02726       WRITE(PHLUN,9010) NEVHEP
02727       WRITE(PHLUN,9080)
02728       WRITE(PHLUN,9020)
02729       DO 30 I=1,NHEP
02730 C--
02731 C--   For 'stable particle' calculate vector momentum sum
02732         IF (JDAHEP(1,I).EQ.0) THEN
02733           DO 20 J=1,4
02734    20     SUMVEC(J)=SUMVEC(J)+PHEP(J,I)
02735           IF (JMOHEP(2,I).EQ.0) THEN
02736             WRITE(PHLUN,9030) I,IDHEP(I),JMOHEP(1,I),(PHEP(J,I),J=1,5)
02737           ELSE
02738             WRITE(PHLUN,9040) I,IDHEP(I),JMOHEP(1,I),JMOHEP(2,I),(PHEP
02739      &      (J,I),J=1,5)
02740           ENDIF
02741         ELSE
02742           IF (JMOHEP(2,I).EQ.0) THEN
02743             WRITE(PHLUN,9050) I,IDHEP(I),JMOHEP(1,I),JDAHEP(1,I),
02744      &      JDAHEP(2,I),(PHEP(J,I),J=1,5)
02745           ELSE
02746             WRITE(PHLUN,9060) I,IDHEP(I),JMOHEP(1,I),JMOHEP(2,I),
02747      &      JDAHEP(1,I),JDAHEP(2,I),(PHEP(J,I),J=1,5)
02748           ENDIF
02749         ENDIF
02750    30 CONTINUE
02751       SUMVEC(5)=SQRT(SUMVEC(4)**2-SUMVEC(1)**2-SUMVEC(2)**2-
02752      &SUMVEC(3)**2)
02753       WRITE(PHLUN,9070) (SUMVEC(J),J=1,5)
02754       RETURN
02755  9000 FORMAT(1H0,80('='))
02756  9010 FORMAT(1H ,29X,'Event No.:',I10)
02757  9020 FORMAT(1H0,1X,'Nr',3X,'Type',3X,'Parent(s)',2X,'Daughter(s)',6X,
02758      &'Px',7X,'Py',7X,'Pz',7X,'E',4X,'Inv. M.')
02759  9030 FORMAT(1H ,I4,I7,3X,I4,9X,'Stable',2X,5F9.2)
02760  9040 FORMAT(1H ,I4,I7,I4,' - ',I4,5X,'Stable',2X,5F9.2)
02761  9050 FORMAT(1H ,I4,I7,3X,I4,6X,I4,' - ',I4,5F9.2)
02762  9060 FORMAT(1H ,I4,I7,I4,' - ',I4,2X,I4,' - ',I4,5F9.2)
02763  9070 FORMAT(1H0,23X,'Vector Sum: ', 5F9.2)
02764  9080 FORMAT(1H0,6X,'Particle Parameters')
02765       END
Generated on Sun Oct 20 20:23:56 2013 for C++InterfacetoPHOTOS by  doxygen 1.6.3