photos.F

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