float CalInt(ind1,ind2,lpoints,t,R1,R2,OutO,OutOrg,deb)
int ind1;
int ind2;
double *lpoints;
double t[3];
double R1[4][4];
double R2[4][4];
float OutO[3];
float OutOrg[3];
int deb;
{
    int i,j,l,ipr;
    float e12,ddev,adev1,adev2,dd,aqmin,aq,at,todeg;
    float fq1,fq2,fd1,fa1,fa2;
    float O[3],T[3];
    double ctmp[3],v1[3],v2[3],cosa;
   
    ipr = 0;

    for (l=0; l < 3; l++) O[l] = t[l] + ligtyp[ind2]->ORI[l];
    xyzROT4(R1,O);
    xyzROT4(R2,O);

    todeg = 45.0e0/atan(1.0e0);

    e12 = inttyp[ind1]->area.ene + ligtyp[ind2]->area.ene;

    fq1 = 1.0;

    if (inttyp[ind1]->q0*ligtyp[ind2]->q0 < inttyp[ind1]->area.chgsc[1])
	fq1 = inttyp[ind1]->area.chgsc[0];

    fq2 = 1.0;

    if (inttyp[ind1]->q0*ligtyp[ind2]->q0 < ligtyp[ind2]->area.chgsc[1])
	fq2 = ligtyp[ind2]->area.chgsc[0];

    fd1 = 1.0;

    ddev = 0.0;

    for (i = 0; i < 3; i++ ) {
	dd = (inttyp[ind1]->ORI[i] - O[i]);
	ddev +=  dd*dd;
    }

    ddev = sqrt(ddev);
    ddev = ddev*toangs;

    ddev = ddev - 0.5*(inttyp[ind1]->area.radius + ligtyp[ind2]->area.radius);
    ddev = ABS(ddev);

    if (ddev <= inttyp[ind1]->area.dissc[0]) {
	fd1 = 1.0;
    } else if (inttyp[ind1]->area.dissc[0] < ddev && 
	ddev < inttyp[ind1]->area.dissc[1]) {
	fd1 = 1.0 - (ddev - inttyp[ind1]->area.dissc[0])/
		    (inttyp[ind1]->area.dissc[1]-inttyp[ind1]->area.dissc[0]);
    } else {
	fd1 = 0.0;
	return 0.0;
    }

    if (inttyp[ind1]->area.angsc[0] == 0 && 
	inttyp[ind1]->area.angsc[1] == 360.0) {

	fa1 = 1.0;

    } else {

	
	adev1 = 0.0;
	aqmin = 10000.0;

	for (i = 0; i < inttyp[ind1]->npts; i++ ) {
	   aq = 0.0;
	   for (j = 0; j < 3; j++ ) {
		at = inttyp[ind1]->points[i*3+j] - O[j];
		aq = aq + at*at;
	   }
	   if (aq < aqmin) {
		aqmin = aq;
		for (j = 0; j < 3; j++ ) 
		   ctmp[j] = inttyp[ind1]->points[i*3+j];
	   }
	}

	for (j = 0; j < 3; j++ ) {
	   v1[j] = O[j] - inttyp[ind1]->ORI[j];
	   v2[j] = ctmp[j] - inttyp[ind1]->ORI[j];
	}
    
	dinprod(v1,v2,&cosa);

	if (fabs(cosa) == 1.0) {
           adev1 = 0.0;
	   if (cosa < 0) adev1 = 180.0;
	} else {
           adev1 = (float) acos(cosa)*todeg;
	}
    
	fa1 = 1.0;

	if (adev1 <= inttyp[ind1]->area.angsc[0]) {
	   fa1 = 1.0;
	} else if (inttyp[ind1]->area.angsc[0] < adev1 && 
		   adev1 < inttyp[ind1]->area.angsc[1]) {
	   fa1 = 1.0 - (adev1 - inttyp[ind1]->area.angsc[0])/
		    (inttyp[ind1]->area.angsc[1]-inttyp[ind1]->area.angsc[0]);
	} else {
	   fa1 = 0.0;
	   return 0.0;
	}
    }


    if (ligtyp[ind2]->area.angsc[0] == 0 && 
	ligtyp[ind2]->area.angsc[1] == 360.0) {

	fa2 = 1.0;

    } else {

	adev2 = 0.0;
	aqmin = 10000.0;

	for (i = 0; i < ligtyp[ind2]->npts; i++ ) {
	   aq = 0.0;
	   for (j = 0; j < 3; j++ ) T[j] = t[j] + lpoints[i*3+j];
	   xyzROT4(R1,T);
	   xyzROT4(R2,T);
	   for (j = 0; j < 3; j++ ) {
		at = T[j] - inttyp[ind1]->ORI[j];
		aq = aq + at*at;
	   }
	   if (aq < aqmin) {
		aqmin = aq;
		for (j = 0; j < 3; j++ ) ctmp[j] = T[j];
	   }
	}

	for (j = 0; j < 3; j++ ) {
	   v1[j] = inttyp[ind1]->ORI[j] - O[j];
	   v2[j] = ctmp[j] - O[j];
	}
    
	dinprod(v1,v2,&cosa);

	if (fabs(cosa) == 1.0) {
           adev2 = 0.0;
	   if (cosa < 0) adev2 = 180.0;
	} else {
           adev2 = (float) acos(cosa)*todeg;
	}
    
	fa2 = 1.0;

	if (adev2 <= ligtyp[ind2]->area.angsc[0]) {
	   fa2 = 1.0;
	} else if (ligtyp[ind2]->area.angsc[0] < adev2 && 
		   adev2 < ligtyp[ind2]->area.angsc[1]) {
	   fa2 = 1.0 - (adev2 - ligtyp[ind2]->area.angsc[0])/
		    (ligtyp[ind2]->area.angsc[1]-ligtyp[ind2]->area.angsc[0]);
	} else {
	   fa2 = 0.0;
	   return 0.0;
	}
    }

if (e12 > 0.0) fprintf(stderr,"CalInt: e12 %.3f\n",e12);
if (fq1 < 0.0 || fq2 < 0.0 || fd1 < 0.0 || fa1 < 0.0 || fa2 < 0.0) 
	fprintf(stderr,"CalInt: fq1 %.3f fq2 %.3f fd1 %.3f fa1 %.3f fa2 %.3f\n",fq1,fq2,fd1,fa1,fa2);

    e12 = e12*fq1*fq2*fd1*fa1*fa2;
    return e12;
}

