*CMZ : 4.20/13 19/10/93 15.35.31 by Roger Barlow, Christine Beeston *CMZ : 4.20/09 24/09/93 16.27.34 by Roger Barlow, Christine Beeston *-- Author : Roger Barlow, Christine Beeston 24/09/93 C glitch caused by comparing reals corrected (I hope) RJB 29/11/03 C thanks to Peter Litchfield SUBROUTINE HADJUST(TI,I,P,KZERO,AKI) C Subroutine which given a set of Pj (answer), solves for the ti C (ti = 1 - di/fi, where di is the number of data events in bin i, C and fi is the number of mc events predicted in bin i, given the Pj C provided. fi = Nd * sum over j of (Pj aji/Nj), where Nd = total data C events, Nj is total number of mc events from source j, aji is number C of mc events from source j in bin i. *KEEP,HCMCPM. C some maximum values - max number of bins and dimensions INTEGER NSRCMX,NSRCMN,NOPTS PARAMETER(NSRCMX=20,NSRCMN=2,NOPTS=7) C Numbers of monte carlo and data events, links to data, MC and weight C histograms, Number of mc sources, options, total number of bins. C normalisation constants for weight histograms DOUBLE PRECISION BJ(NSRCMX) INTEGER NDATEV,NMCEV(NSRCMX), + NMCSRC,IOPT(NOPTS),NTOT COMMON/HINPUTS/NDATEV,NMCEV,NMCSRC,IOPT,NTOT,BJ C Histogram IDs INTEGER IDD,IDM(NSRCMX),IDW(NSRCMX) COMMON/HMCIDS/IDD,IDM,IDW *KEND. DOUBLE PRECISION TI,P(NSRCMX),WPMAX,TMIN,AKI, + STEP,FUNC,DERIV,D,DELTA,WJI,WKI INTEGER I,KZERO,IMAX,J,NPMAX,APMAXS C set up largest step value STEP=0.2D0 C First case - di=0 -> ti=1 IF(NINT(HI(IDD,I)).EQ.0)THEN TI=1.0D0 KZERO=0 RETURN ENDIF C Find the largest pj (for case when one or more of the aji are zero) WPMAX=HI(IDW(1),I)*P(1) IMAX=1 DO 10 J=2,NMCSRC WJI=HI(IDW(J),I) IF(WJI*P(J).GT.WPMAX)THEN WPMAX=WJI*P(J) IMAX=J ENDIF 10 CONTINUE C count the number of sources having p=pmax, and the sum of their aji NPMAX=0 APMAXS=0 DO 20J=1,NMCSRC WJI=HI(IDW(J),I) C glitch correction IF(WJI*P(J).GE.WPMAX.or.J.EQ.IMAX) THEN C IF(WJI*P(J).EQ.WPMAX)THEN NPMAX=NPMAX+1 APMAXS=APMAXS+HI(IDM(J),I) ENDIF C check that none of the p(j) are zero as this causes crashes IF(WJI*P(J).EQ.0.0D0)THEN WRITE(6,*)'ADJUST: P(',J,') =',P(J),' - zero + fractions cause crashes' WRITE(6,*)'ADJUST: dont set starting values + to zero - if you didnt then' WRITE(6,*)'ADJUST: try setting limits on the P(J) + (01 INDEPENDENT FIT ***' WRITE(6,*)' *** HMCINI MUST BE CALLED ONCE FOR EACH SET ***' WRITE(6,*)' *** OF HISTOGRAMS. THEN LOG L IS GIVEN BY ***' WRITE(6,*)' *** ***' WRITE(6,*)' *** RLNL = HMCLNL(IDDATA,IDMC,IDWT,NSRC,PJ) ***' WRITE(6,*)' *** ***' WRITE(6,*)' *** THE OLD VERSION OF HMCLNL IS STILL ***' WRITE(6,*)' *** AVAILABLE - HMCLNO(PJ). THIS WILL ***' WRITE(6,*)' *** BE REMOVED IN A COUPLE OF MONTHS ***' WRITE(6,*)' *** REPORT PROBLEMS TO Roger.barlow@cern.ch ***' WRITE(6,*)' ************************************************' IFIRST=1 ENDIF C put ids in common IDD=IDDATA NMCSRC=NSRC DO 10 J=1,NMCSRC IDM(J)=IDMC(J) IDW(J)=IDWT(J) 10 CONTINUE C retrieve histogram normalisation factors(bj) from weight histograms DO 20 J=1,NMCSRC BJ(J)=1. IRET=3 CALL HLOOP(IDW(J),'HMCLNL',IRET) IF(IRET.EQ.0)THEN STOP ENDIF IF(I18.NE.0)THEN BJ(J)=Q(LCID+KNORM) ENDIF 20 CONTINUE C get total numbers of events in histograms - ignoring under + overflows NDATEV=NINT(HSUM(IDD)) DO 25 J=1,NMCSRC NMCEV(J)=NINT(HSUM(IDM(J))) 25 CONTINUE C first convert Pj to Pj' PJSUM=0.0D0 BPJSUM=0.0D0 DO 30 J=1,NMCSRC PJSUM=PJSUM+PJ(J) BPJSUM=BPJSUM+BJ(J)*PJ(J) 30 CONTINUE DO 40 J=1,NMCSRC ANSWER(J)=BJ(J)*PJ(J)*PJSUM/BPJSUM 40 CONTINUE C convert ANSWER to normalised fractions in X DO 50 J=1,NMCSRC X(J)=ANSWER(J)*NDATEV/NMCEV(J) 50 CONTINUE HMCLNL=0.0D0 DO 80 I=1,NTOT CALL HADJUST(TI,I,X,KZERO,AKI) F=0.0 DO 70 J=1,NMCSRC WJI=HI(IDW(J),I) C now get AJI from the aji and the Ti IF(KZERO.NE.0.AND.X(J).EQ.X(KZERO))THEN AJI=AKI ELSE AJI=0 IF(NINT(HI(IDM(J),I)).NE.0)THEN AJI=HI(IDM(J),I)/(1.0D0+X(J)*WJI*TI) ENDIF ENDIF F=F+X(J)*WJI*AJI IF(NINT(HI(IDM(J),I)).NE.0)THEN IF(AJI.LE.0.0)THEN CONTINUE ELSE HMCLNL=HMCLNL+HI(IDM(J),I)*DLOG(AJI) ENDIF ENDIF HMCLNL=HMCLNL-AJI 70 CONTINUE IF(NINT(HI(IDD,I)).NE.0)THEN HMCLNL=HMCLNL+HI(IDD,I)*DLOG(F) ENDIF HMCLNL=HMCLNL-F 80 CONTINUE RETURN END *CMZ : 26/04/94 21.56.24 by Unknown *CMZ : 4.21/06 01/12/93 15.11.40 by Christine Beeston *CMZ : 4.20/13 19/10/93 15.33.26 by Roger Barlow, Christine Beeston *CMZ : 4.20/10 28/09/93 16.50.28 by Rene Brun *CMZ : 4.20/09 24/09/93 16.33.59 by Roger Barlow, Christine Beeston *-- Author : Roger Barlow, Christine Beeston 24/09/93 DOUBLE PRECISION FUNCTION HMCLNO(PJ) * HMCLNO returns the log likelihood (including effect of both data * and Monte Carlo statistics) that the data distribution arose from a * distribution given by combining the Monte Carlo distributions, weighted * by the weights provided, using the fractions given in FRAC. * HMCINI must be called before this function may be used. * * Input parameters: * ---------------- * FRAC: Double precision array of dimension NMCSRC containing the * fraction of each Monte Carlo distribution you wish to assume is in the data * distribution, in order to calculate the log likelihood. *KEEP,HCBOOK. INTEGER NWPAW,IXPAWC,IHDIV,IXHIGZ,IXKU, LMAIN REAL FENC , HCV COMMON/PAWC/NWPAW,IXPAWC,IHDIV,IXHIGZ,IXKU,FENC(5),LMAIN,HCV(9989) INTEGER IQ ,LQ REAL Q DIMENSION IQ(2),Q(2),LQ(8000) EQUIVALENCE (LQ(1),LMAIN),(IQ(1),LQ(9)),(Q(1),IQ(1)) INTEGER HVERSN,IHWORK,LHBOOK,LHPLOT,LGTIT,LHWORK, +LCDIR,LSDIR,LIDS,LTAB,LCID,LCONT,LSCAT,LPROX,LPROY,LSLIX, +LSLIY,LBANX,LBANY,LPRX,LPRY,LFIX,LLID,LR1,LR2,LNAME,LCHAR,LINT, +LREAL,LBLOK,LLBLK,LBUFM,LBUF,LTMPM,LTMP,LTMP1,LHPLIP,LHDUM, +LHFIT,LFUNC,LHFCO,LHFNA,LCIDN COMMON/HCBOOK/HVERSN,IHWORK,LHBOOK,LHPLOT,LGTIT,LHWORK, +LCDIR,LSDIR,LIDS,LTAB,LCID,LCONT,LSCAT,LPROX,LPROY,LSLIX, +LSLIY,LBANX,LBANY,LPRX,LPRY,LFIX,LLID,LR1,LR2,LNAME,LCHAR,LINT, +LREAL,LBLOK,LLBLK,LBUFM,LBUF,LTMPM,LTMP,LTMP1,LHPLIP,LHDUM(9), +LHFIT,LFUNC,LHFCO,LHFNA,LCIDN * INTEGER KNCX ,KXMIN ,KXMAX ,KMIN1 ,KMAX1 ,KNORM , KTIT1, + KNCY ,KYMIN ,KYMAX ,KMIN2 ,KMAX2 ,KSCAL2 , KTIT2, + KNBIT ,KNOENT ,KSTAT1 ,KNSDIR ,KNRH , + KCON1 ,KCON2 ,KBITS ,KNTOT PARAMETER(KNCX=3,KXMIN=4,KXMAX=5,KMIN1=7,KMAX1=8,KNORM=9,KTIT1=10, + KNCY=7,KYMIN=8,KYMAX=9,KMIN2=6,KMAX2=10,KSCAL2=11, + KTIT2=12,KNBIT=1,KNOENT=2,KSTAT1=3,KNSDIR=5,KNRH=6, + KCON1=9,KCON2=3,KBITS=1,KNTOT=2) * *KEEP,HCBITS. INTEGER I1, I2, I3, I4, I5, I6, I7, I8, + I9, I10, I11, I12, I13, I14, I15, I16, +I17, I18, I19, I20, I21, I22, I23, I24, I25, I26, I27, +I28, I29, I30, I31, I32, I33, I34, I35, I123, I230 COMMON / HCBITS / I1, I2, I3, I4, I5, I6, I7, I8, + I9, I10, I11, I12, I13, I14, I15, I16, +I17, I18, I19, I20, I21, I22, I23, I24, I25, I26, I27, +I28, I29, I30, I31, I32, I33, I34, I35, I123, I230 * *KEEP,HCMCPM. C some maximum values - max number of bins and dimensions INTEGER NSRCMX,NSRCMN,NOPTS PARAMETER(NSRCMX=20,NSRCMN=2,NOPTS=7) C Numbers of monte carlo and data events, links to data, MC and weight C histograms, Number of mc sources, options, total number of bins. C normalisation constants for weight histograms DOUBLE PRECISION BJ(NSRCMX) INTEGER NDATEV,NMCEV(NSRCMX), + NMCSRC,IOPT(NOPTS),NTOT COMMON/HINPUTS/NDATEV,NMCEV,NMCSRC,IOPT,NTOT,BJ C Histogram IDs INTEGER IDD,IDM(NSRCMX),IDW(NSRCMX) COMMON/HMCIDS/IDD,IDM,IDW *KEND. DOUBLE PRECISION ANSWER(NSRCMX), X(NSRCMX), AKI, TI, + F,AJI,WJI,PJ(NSRCMX),PJSUM,BPJSUM INTEGER KZERO,I,J,IRET,IFIRST DATA IFIRST/0/ IF(IFIRST.EQ.0)THEN WRITE(6,*)' ************************************************' WRITE(6,*)' *** THIS IS THE OLD VERSION OF ***' WRITE(6,*)' *** HMCLNL: IT WILL BE DELETED IN ***' WRITE(6,*)' *** A COUPLE OF MONTHS. THE NEW ***' WRITE(6,*)' *** VERSION IS NO SLOWER AND ***' WRITE(6,*)' *** ALLOWS FOR MULTIPLE SIMULTANEOUS ***' WRITE(6,*)' *** FITS. THE HISTOGRAM IDS MUST BE ***' WRITE(6,*)' *** PASSED AS FOLLOWS: ***' WRITE(6,*)' *** ***' WRITE(6,*)' *** RLNL=HMCLNL(IDDATA,IDMC,IDWT,NSRC,PJ) ***' WRITE(6,*)' *** ***' WRITE(6,*)' *** PLEASE REPORT PROBLEMS TO BEESTON@CERNVM ***' WRITE(6,*)' ************************************************' IFIRST=1 ENDIF C retrieve histogram normalisation factors(bj) from weight histograms DO 20 J=1,NMCSRC BJ(J)=1. IRET=3 CALL HLOOP(IDW(J),'HMCLNO',IRET) IF(IRET.EQ.0)THEN STOP ENDIF IF(I18.NE.0)THEN BJ(J)=Q(LCID+KNORM) ENDIF 20 CONTINUE C get total numbers of events in histograms - ignoring under + overflows NDATEV=NINT(HSUM(IDD)) DO 25 J=1,NMCSRC NMCEV(J)=NINT(HSUM(IDM(J))) 25 CONTINUE C first convert Pj to Pj' PJSUM=0.0D0 BPJSUM=0.0D0 DO 30 J=1,NMCSRC PJSUM=PJSUM+PJ(J) BPJSUM=BPJSUM+BJ(J)*PJ(J) 30 CONTINUE DO 40 J=1,NMCSRC ANSWER(J)=BJ(J)*PJ(J)*PJSUM/BPJSUM 40 CONTINUE C convert ANSWER to normalised fractions in X DO 50 J=1,NMCSRC X(J)=ANSWER(J)*NDATEV/NMCEV(J) 50 CONTINUE HMCLNO=0.0D0 DO 80 I=1,NTOT CALL HADJUST(TI,I,X,KZERO,AKI) F=0.0 DO 70 J=1,NMCSRC WJI=HI(IDW(J),I) C now get AJI from the aji and the Ti IF(KZERO.NE.0.AND.X(J).EQ.X(KZERO))THEN AJI=AKI ELSE AJI=0 IF(NINT(HI(IDM(J),I)).NE.0)THEN AJI=HI(IDM(J),I)/(1.0D0+X(J)*WJI*TI) ENDIF ENDIF F=F+X(J)*WJI*AJI IF(NINT(HI(IDM(J),I)).NE.0)THEN IF(AJI.LE.0.0)THEN CONTINUE ELSE HMCLNO=HMCLNO+HI(IDM(J),I)*DLOG(AJI) ENDIF ENDIF HMCLNO=HMCLNO-AJI 70 CONTINUE IF(NINT(HI(IDD,I)).NE.0)THEN HMCLNO=HMCLNO+HI(IDD,I)*DLOG(F) ENDIF HMCLNO=HMCLNO-F 80 CONTINUE RETURN END