]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PYTHIA/jetset/lukfdi.F
This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / PYTHIA / jetset / lukfdi.F
diff --git a/PYTHIA/jetset/lukfdi.F b/PYTHIA/jetset/lukfdi.F
new file mode 100644 (file)
index 0000000..70fe6d0
--- /dev/null
@@ -0,0 +1,332 @@
+C********************************************************************* 
+      SUBROUTINE LUKFDI(KFL1,KFL2,KFL3,KF) 
+C...Purpose: to generate a new flavour pair and combine off a hadron. 
+      COMMON/LUDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200) 
+      COMMON/LUDAT2/KCHG(500,3),PMAS(500,4),PARF(2000),VCKM(4,4) 
+      SAVE /LUDAT1/,/LUDAT2/ 
+C...Default flavour values. Input consistency checks. 
+      KF1A=IABS(KFL1) 
+      KF2A=IABS(KFL2) 
+      KFL3=0 
+      KF=0 
+      IF(KF1A.EQ.0) RETURN 
+      IF(KF2A.NE.0) THEN 
+        IF(KF1A.LE.10.AND.KF2A.LE.10.AND.KFL1*KFL2.GT.0) RETURN 
+        IF(KF1A.GT.10.AND.KF2A.GT.10) RETURN 
+        IF((KF1A.GT.10.OR.KF2A.GT.10).AND.KFL1*KFL2.LT.0) RETURN 
+      ENDIF 
+C...Check if tabulated flavour probabilities are to be used. 
+      IF(MSTJ(15).EQ.1) THEN 
+        KTAB1=-1 
+        IF(KF1A.GE.1.AND.KF1A.LE.6) KTAB1=KF1A 
+        KFL1A=MOD(KF1A/1000,10) 
+        KFL1B=MOD(KF1A/100,10) 
+        KFL1S=MOD(KF1A,10) 
+        IF(KFL1A.GE.1.AND.KFL1A.LE.4.AND.KFL1B.GE.1.AND.KFL1B.LE.4) 
+     &  KTAB1=6+KFL1A*(KFL1A-2)+2*KFL1B+(KFL1S-1)/2 
+        IF(KFL1A.GE.1.AND.KFL1A.LE.4.AND.KFL1A.EQ.KFL1B) KTAB1=KTAB1-1 
+        IF(KF1A.GE.1.AND.KF1A.LE.6) KFL1A=KF1A 
+        KTAB2=0 
+        IF(KF2A.NE.0) THEN 
+          KTAB2=-1 
+          IF(KF2A.GE.1.AND.KF2A.LE.6) KTAB2=KF2A 
+          KFL2A=MOD(KF2A/1000,10) 
+          KFL2B=MOD(KF2A/100,10) 
+          KFL2S=MOD(KF2A,10) 
+          IF(KFL2A.GE.1.AND.KFL2A.LE.4.AND.KFL2B.GE.1.AND.KFL2B.LE.4) 
+     &    KTAB2=6+KFL2A*(KFL2A-2)+2*KFL2B+(KFL2S-1)/2 
+          IF(KFL2A.GE.1.AND.KFL2A.LE.4.AND.KFL2A.EQ.KFL2B) KTAB2=KTAB2-1 
+        ENDIF 
+        IF(KTAB1.GE.0.AND.KTAB2.GE.0) GOTO 150 
+      ENDIF 
+C...Parameters and breaking diquark parameter combinations. 
+  100 PAR2=PARJ(2) 
+      PAR3=PARJ(3) 
+      PAR4=3.*PARJ(4) 
+      IF(MSTJ(12).GE.2) THEN 
+        PAR3M=SQRT(PARJ(3)) 
+        PAR4M=1./(3.*SQRT(PARJ(4))) 
+        PARDM=PARJ(7)/(PARJ(7)+PAR3M*PARJ(6)) 
+        PARS0=PARJ(5)*(2.+(1.+PAR2*PAR3M*PARJ(7))*(1.+PAR4M)) 
+        PARS1=PARJ(7)*PARS0/(2.*PAR3M)+PARJ(5)*(PARJ(6)*(1.+PAR4M)+ 
+     &  PAR2*PAR3M*PARJ(6)*PARJ(7)) 
+        PARS2=PARJ(5)*2.*PARJ(6)*PARJ(7)*(PAR2*PARJ(7)+(1.+PAR4M)/PAR3M) 
+        PARSM=MAX(PARS0,PARS1,PARS2) 
+        PAR4=PAR4*(1.+PARSM)/(1.+PARSM/(3.*PAR4M)) 
+      ENDIF 
+C...Choice of whether to generate meson or baryon. 
+  110 MBARY=0 
+      KFDA=0 
+      IF(KF1A.LE.10) THEN 
+        IF(KF2A.EQ.0.AND.MSTJ(12).GE.1.AND.(1.+PARJ(1))*RLU(0).GT.1.) 
+     &  MBARY=1 
+        IF(KF2A.GT.10) MBARY=2 
+        IF(KF2A.GT.10.AND.KF2A.LE.10000) KFDA=KF2A 
+      ELSE 
+        MBARY=2 
+        IF(KF1A.LE.10000) KFDA=KF1A 
+      ENDIF 
+C...Possibility of process diquark -> meson + new diquark. 
+      IF(KFDA.NE.0.AND.MSTJ(12).GE.2) THEN 
+        KFLDA=MOD(KFDA/1000,10) 
+        KFLDB=MOD(KFDA/100,10) 
+        KFLDS=MOD(KFDA,10) 
+        WTDQ=PARS0 
+        IF(MAX(KFLDA,KFLDB).EQ.3) WTDQ=PARS1 
+        IF(MIN(KFLDA,KFLDB).EQ.3) WTDQ=PARS2 
+        IF(KFLDS.EQ.1) WTDQ=WTDQ/(3.*PAR4M) 
+        IF((1.+WTDQ)*RLU(0).GT.1.) MBARY=-1 
+        IF(MBARY.EQ.-1.AND.KF2A.NE.0) RETURN 
+      ENDIF 
+C...Flavour for meson, possibly with new flavour. 
+      IF(MBARY.LE.0) THEN 
+        KFS=ISIGN(1,KFL1) 
+        IF(MBARY.EQ.0) THEN 
+          IF(KF2A.EQ.0) KFL3=ISIGN(1+INT((2.+PAR2)*RLU(0)),-KFL1) 
+          KFLA=MAX(KF1A,KF2A+IABS(KFL3)) 
+          KFLB=MIN(KF1A,KF2A+IABS(KFL3)) 
+          IF(KFLA.NE.KF1A) KFS=-KFS 
+C...Splitting of diquark into meson plus new diquark. 
+        ELSE 
+          KFL1A=MOD(KF1A/1000,10) 
+          KFL1B=MOD(KF1A/100,10) 
+  120     KFL1D=KFL1A+INT(RLU(0)+0.5)*(KFL1B-KFL1A) 
+          KFL1E=KFL1A+KFL1B-KFL1D 
+          IF((KFL1D.EQ.3.AND.RLU(0).GT.PARDM).OR.(KFL1E.EQ.3.AND. 
+     &    RLU(0).LT.PARDM)) THEN 
+            KFL1D=KFL1A+KFL1B-KFL1D 
+            KFL1E=KFL1A+KFL1B-KFL1E 
+          ENDIF 
+          KFL3A=1+INT((2.+PAR2*PAR3M*PARJ(7))*RLU(0)) 
+          IF((KFL1E.NE.KFL3A.AND.RLU(0).GT.(1.+PAR4M)/MAX(2.,1.+PAR4M)) 
+     &    .OR.(KFL1E.EQ.KFL3A.AND.RLU(0).GT.2./MAX(2.,1.+PAR4M))) 
+     &    GOTO 120 
+          KFLDS=3 
+          IF(KFL1E.NE.KFL3A) KFLDS=2*INT(RLU(0)+1./(1.+PAR4M))+1 
+          KFL3=ISIGN(10000+1000*MAX(KFL1E,KFL3A)+100*MIN(KFL1E,KFL3A)+ 
+     &    KFLDS,-KFL1) 
+          KFLA=MAX(KFL1D,KFL3A) 
+          KFLB=MIN(KFL1D,KFL3A) 
+          IF(KFLA.NE.KFL1D) KFS=-KFS 
+        ENDIF 
+C...Form meson, with spin and flavour mixing for diagonal states. 
+        IF(KFLA.LE.2) KMUL=INT(PARJ(11)+RLU(0)) 
+        IF(KFLA.EQ.3) KMUL=INT(PARJ(12)+RLU(0)) 
+        IF(KFLA.GE.4) KMUL=INT(PARJ(13)+RLU(0)) 
+        IF(KMUL.EQ.0.AND.PARJ(14).GT.0.) THEN 
+          IF(RLU(0).LT.PARJ(14)) KMUL=2 
+        ELSEIF(KMUL.EQ.1.AND.PARJ(15)+PARJ(16)+PARJ(17).GT.0.) THEN 
+          RMUL=RLU(0) 
+          IF(RMUL.LT.PARJ(15)) KMUL=3 
+          IF(KMUL.EQ.1.AND.RMUL.LT.PARJ(15)+PARJ(16)) KMUL=4 
+          IF(KMUL.EQ.1.AND.RMUL.LT.PARJ(15)+PARJ(16)+PARJ(17)) KMUL=5 
+        ENDIF 
+        KFLS=3 
+        IF(KMUL.EQ.0.OR.KMUL.EQ.3) KFLS=1 
+        IF(KMUL.EQ.5) KFLS=5 
+        IF(KFLA.NE.KFLB) THEN 
+          KF=(100*KFLA+10*KFLB+KFLS)*KFS*(-1)**KFLA 
+        ELSE 
+          RMIX=RLU(0) 
+          IMIX=2*KFLA+10*KMUL 
+          IF(KFLA.LE.3) KF=110*(1+INT(RMIX+PARF(IMIX-1))+ 
+     &    INT(RMIX+PARF(IMIX)))+KFLS 
+          IF(KFLA.GE.4) KF=110*KFLA+KFLS 
+        ENDIF 
+        IF(KMUL.EQ.2.OR.KMUL.EQ.3) KF=KF+ISIGN(10000,KF) 
+        IF(KMUL.EQ.4) KF=KF+ISIGN(20000,KF) 
+C...Optional extra suppression of eta and eta'. 
+        IF(KF.EQ.221) THEN 
+          IF(RLU(0).GT.PARJ(25)) GOTO 110 
+        ELSEIF(KF.EQ.331) THEN 
+          IF(RLU(0).GT.PARJ(26)) GOTO 110 
+        ENDIF 
+C...Generate diquark flavour. 
+      ELSE 
+  130   IF(KF1A.LE.10.AND.KF2A.EQ.0) THEN 
+          KFLA=KF1A 
+  140     KFLB=1+INT((2.+PAR2*PAR3)*RLU(0)) 
+          KFLC=1+INT((2.+PAR2*PAR3)*RLU(0)) 
+          KFLDS=1 
+          IF(KFLB.GE.KFLC) KFLDS=3 
+          IF(KFLDS.EQ.1.AND.PAR4*RLU(0).GT.1.) GOTO 140 
+          IF(KFLDS.EQ.3.AND.PAR4.LT.RLU(0)) GOTO 140 
+          KFL3=ISIGN(1000*MAX(KFLB,KFLC)+100*MIN(KFLB,KFLC)+KFLDS,KFL1) 
+C...Take diquark flavour from input. 
+        ELSEIF(KF1A.LE.10) THEN 
+          KFLA=KF1A 
+          KFLB=MOD(KF2A/1000,10) 
+          KFLC=MOD(KF2A/100,10) 
+          KFLDS=MOD(KF2A,10) 
+C...Generate (or take from input) quark to go with diquark. 
+        ELSE 
+          IF(KF2A.EQ.0) KFL3=ISIGN(1+INT((2.+PAR2)*RLU(0)),KFL1) 
+          KFLA=KF2A+IABS(KFL3) 
+          KFLB=MOD(KF1A/1000,10) 
+          KFLC=MOD(KF1A/100,10) 
+          KFLDS=MOD(KF1A,10) 
+        ENDIF 
+C...SU(6) factors for formation of baryon. Try again if fails. 
+        KBARY=KFLDS 
+        IF(KFLDS.EQ.3.AND.KFLB.NE.KFLC) KBARY=5 
+        IF(KFLA.NE.KFLB.AND.KFLA.NE.KFLC) KBARY=KBARY+1 
+        WT=PARF(60+KBARY)+PARJ(18)*PARF(70+KBARY) 
+        IF(MBARY.EQ.1.AND.MSTJ(12).GE.2) THEN 
+          WTDQ=PARS0 
+          IF(MAX(KFLB,KFLC).EQ.3) WTDQ=PARS1 
+          IF(MIN(KFLB,KFLC).EQ.3) WTDQ=PARS2 
+          IF(KFLDS.EQ.1) WTDQ=WTDQ/(3.*PAR4M) 
+          IF(KFLDS.EQ.1) WT=WT*(1.+WTDQ)/(1.+PARSM/(3.*PAR4M)) 
+          IF(KFLDS.EQ.3) WT=WT*(1.+WTDQ)/(1.+PARSM) 
+        ENDIF 
+        IF(KF2A.EQ.0.AND.WT.LT.RLU(0)) GOTO 130 
+C...Form baryon. Distinguish Lambda- and Sigmalike baryons. 
+        KFLD=MAX(KFLA,KFLB,KFLC) 
+        KFLF=MIN(KFLA,KFLB,KFLC) 
+        KFLE=KFLA+KFLB+KFLC-KFLD-KFLF 
+        KFLS=2 
+        IF((PARF(60+KBARY)+PARJ(18)*PARF(70+KBARY))*RLU(0).GT. 
+     &  PARF(60+KBARY)) KFLS=4 
+        KFLL=0 
+        IF(KFLS.EQ.2.AND.KFLD.GT.KFLE.AND.KFLE.GT.KFLF) THEN 
+          IF(KFLDS.EQ.1.AND.KFLA.EQ.KFLD) KFLL=1 
+          IF(KFLDS.EQ.1.AND.KFLA.NE.KFLD) KFLL=INT(0.25+RLU(0)) 
+          IF(KFLDS.EQ.3.AND.KFLA.NE.KFLD) KFLL=INT(0.75+RLU(0)) 
+        ENDIF 
+        IF(KFLL.EQ.0) KF=ISIGN(1000*KFLD+100*KFLE+10*KFLF+KFLS,KFL1) 
+        IF(KFLL.EQ.1) KF=ISIGN(1000*KFLD+100*KFLF+10*KFLE+KFLS,KFL1) 
+      ENDIF 
+      RETURN 
+C...Use tabulated probabilities to select new flavour and hadron. 
+  150 IF(KTAB2.EQ.0.AND.MSTJ(12).LE.0) THEN 
+        KT3L=1 
+        KT3U=6 
+      ELSEIF(KTAB2.EQ.0.AND.KTAB1.GE.7.AND.MSTJ(12).LE.1) THEN 
+        KT3L=1 
+        KT3U=6 
+      ELSEIF(KTAB2.EQ.0) THEN 
+        KT3L=1 
+        KT3U=22 
+      ELSE 
+        KT3L=KTAB2 
+        KT3U=KTAB2 
+      ENDIF 
+      RFL=0. 
+      DO 170 KTS=0,2 
+      DO 160 KT3=KT3L,KT3U 
+      RFL=RFL+PARF(120+80*KTAB1+25*KTS+KT3) 
+  160 CONTINUE 
+  170 CONTINUE 
+      RFL=RLU(0)*RFL 
+      DO 190 KTS=0,2 
+      KTABS=KTS 
+      DO 180 KT3=KT3L,KT3U 
+      KTAB3=KT3 
+      RFL=RFL-PARF(120+80*KTAB1+25*KTS+KT3) 
+      IF(RFL.LE.0.) GOTO 200 
+  180 CONTINUE 
+  190 CONTINUE 
+  200 CONTINUE 
+C...Reconstruct flavour of produced quark/diquark. 
+      IF(KTAB3.LE.6) THEN 
+        KFL3A=KTAB3 
+        KFL3B=0 
+        KFL3=ISIGN(KFL3A,KFL1*(2*KTAB1-13)) 
+      ELSE 
+        KFL3A=1 
+        IF(KTAB3.GE.8) KFL3A=2 
+        IF(KTAB3.GE.11) KFL3A=3 
+        IF(KTAB3.GE.16) KFL3A=4 
+        KFL3B=(KTAB3-6-KFL3A*(KFL3A-2))/2 
+        KFL3=1000*KFL3A+100*KFL3B+1 
+        IF(KFL3A.EQ.KFL3B.OR.KTAB3.NE.6+KFL3A*(KFL3A-2)+2*KFL3B) KFL3= 
+     &  KFL3+2 
+        KFL3=ISIGN(KFL3,KFL1*(13-2*KTAB1)) 
+      ENDIF 
+C...Reconstruct meson code. 
+      IF(KFL3A.EQ.KFL1A.AND.KFL3B.EQ.KFL1B.AND.(KFL3A.LE.3.OR. 
+     &KFL3B.NE.0)) THEN 
+        RFL=RLU(0)*(PARF(143+80*KTAB1+25*KTABS)+PARF(144+80*KTAB1+ 
+     &  25*KTABS)+PARF(145+80*KTAB1+25*KTABS)) 
+        KF=110+2*KTABS+1 
+        IF(RFL.GT.PARF(143+80*KTAB1+25*KTABS)) KF=220+2*KTABS+1 
+        IF(RFL.GT.PARF(143+80*KTAB1+25*KTABS)+PARF(144+80*KTAB1+ 
+     &  25*KTABS)) KF=330+2*KTABS+1 
+      ELSEIF(KTAB1.LE.6.AND.KTAB3.LE.6) THEN 
+        KFLA=MAX(KTAB1,KTAB3) 
+        KFLB=MIN(KTAB1,KTAB3) 
+        KFS=ISIGN(1,KFL1) 
+        IF(KFLA.NE.KF1A) KFS=-KFS 
+        KF=(100*KFLA+10*KFLB+2*KTABS+1)*KFS*(-1)**KFLA 
+      ELSEIF(KTAB1.GE.7.AND.KTAB3.GE.7) THEN 
+        KFS=ISIGN(1,KFL1) 
+        IF(KFL1A.EQ.KFL3A) THEN 
+          KFLA=MAX(KFL1B,KFL3B) 
+          KFLB=MIN(KFL1B,KFL3B) 
+          IF(KFLA.NE.KFL1B) KFS=-KFS 
+        ELSEIF(KFL1A.EQ.KFL3B) THEN 
+          KFLA=KFL3A 
+          KFLB=KFL1B 
+          KFS=-KFS 
+        ELSEIF(KFL1B.EQ.KFL3A) THEN 
+          KFLA=KFL1A 
+          KFLB=KFL3B 
+        ELSEIF(KFL1B.EQ.KFL3B) THEN 
+          KFLA=MAX(KFL1A,KFL3A) 
+          KFLB=MIN(KFL1A,KFL3A) 
+          IF(KFLA.NE.KFL1A) KFS=-KFS 
+        ELSE 
+          CALL LUERRM(2,'(LUKFDI:) no matching flavours for qq -> qq') 
+          GOTO 100 
+        ENDIF 
+        KF=(100*KFLA+10*KFLB+2*KTABS+1)*KFS*(-1)**KFLA 
+C...Reconstruct baryon code. 
+      ELSE 
+        IF(KTAB1.GE.7) THEN 
+          KFLA=KFL3A 
+          KFLB=KFL1A 
+          KFLC=KFL1B 
+        ELSE 
+          KFLA=KFL1A 
+          KFLB=KFL3A 
+          KFLC=KFL3B 
+        ENDIF 
+        KFLD=MAX(KFLA,KFLB,KFLC) 
+        KFLF=MIN(KFLA,KFLB,KFLC) 
+        KFLE=KFLA+KFLB+KFLC-KFLD-KFLF 
+        IF(KTABS.EQ.0) KF=ISIGN(1000*KFLD+100*KFLF+10*KFLE+2,KFL1) 
+        IF(KTABS.GE.1) KF=ISIGN(1000*KFLD+100*KFLE+10*KFLF+2*KTABS,KFL1) 
+      ENDIF 
+C...Check that constructed flavour code is an allowed one. 
+      IF(KFL2.NE.0) KFL3=0 
+      KC=LUCOMP(KF) 
+      IF(KC.EQ.0) THEN 
+        CALL LUERRM(2,'(LUKFDI:) user-defined flavour probabilities '// 
+     &  'failed') 
+        GOTO 100 
+      ENDIF 
+      RETURN 
+      END