static void emitdenoms(void) {int j; /* 1..2 * maxvert */ int k; /* 1..4 */ int denrno; /* EmitDenoms -- main */ for (j = 1; j <= vcs.sizet; j++) for (k = 1; k <= vcs.valence[j-1]; k++) { edgeinvert *ln = &vcs.vertlist[j-1][k-1]; if(ln->moment>0) { char*mass= prtclbase1[ln->partcl].massidnt; if(!(ln->prop&(IN_PRTCL|OUT_PRTCL)) && pseudop(ln->partcl)) writeF("totFactor_:=totFactor_/%s^2$\n",mass); else { int spin=prtclbase1[ln->partcl].spin; if(spin==3)writeF("totFactor_:=totFactor_/(3*%s^2)$\n",mass); else if(spin==4)writeF("totFactor_:=totFactor_/(6*%s^4)$\n",mass); } } } writeF("denominator_:="); denrno = 0; for (j = 1; j <= vcs.sizet; j++) for (k = 1; k <= vcs.valence[j-1]; k++) {edgeinvert *ln = &vcs.vertlist[j-1][k-1]; if (ln->moment > 0 && !(ln->prop & (IN_PRTCL|OUT_PRTCL)) ) { if (!pseudop(ln->partcl)) { char width[10]="0"; if(denrno) writeF("*"); denrno++; /* if(!ttypepropag(j,k))*/ strcpy(width,prtclbase1[ln->partcl].imassidnt); writeF("propDen(p%d,%s,%s)",ln->moment, prtclbase1[ln->partcl].massidnt,width); } } } if(!denrno) writeF("1"); writeF("$\n"); } /* EmitDenoms */
static int restrict_p(int y0, int anti, char * mess, char * hlp, char * inputstr, whohow liminsp) { int m, j, k; int ntot; char ** items; char *errpos=NULL; int r; do{ for(r=1;r!=KB_ENTER;) { r=input(y0, hlp, mess,inputstr, errpos? 1+errpos-inputstr:1,SSTRLEN); if(r==KB_ESC) return 1; } trim(inputstr); nilprtcl(liminsp); ntot=0; items=stritems(",",inputstr); for(m=0 ; items[m]; m++) { char frgm[100]; char *n; sscanf(items[m],"%[^,]",frgm); if(n=strstr(frgm,"!=")) { if(!anti) {errTxt="wrong restriction"; break;} if(sscanf(n+2,"%d",&k)!=1) {errTxt="wrong number"; break;} else {n[0]=0; k++; k=-k;} } else if(n=strstr(frgm,">")) { if(sscanf(n+1,"%d",&k)!=1) {errTxt="wrong number"; break;} else {n[0]=0;k++;} } else k=1; trim(frgm); locateinbase(frgm,&j); if ((j == 0) || (!anti&&pseudop(j))) { errTxt="wrong limit statement"; break; } ntot++; if(ntot>=whohowMAX) { errTxt="Too many items"; break;} addlim(liminsp,j,k,anti); } errpos=items[m]; free(items); }while(errpos); return 0; }
/* momdep from prepdiag.h must be calculated before */ void calcdenominators(vcsect vcs ) { int v, l, k; char buff[MAXINOUT+1]; denrno = 0; for (v = 1; v <= vcs.sizet; v++) for (l = 1; l <= vcs.valence[v-1]; l++) { edgeinvert *ln = &vcs.vertlist[v-1][l-1]; if(!(ln->moment<0||((IN_PRTCL|OUT_PRTCL)&ln->prop)||pseudop(ln->partcl))) { for( k=1;k<=momdep[ln->moment-1][0];k++) buff[k-1]=momdep[ln->moment-1][k]; buff[k-1]=0; k=-1; while(buff[++k]) if(buff[k]<0) buff[k]=-buff[k]; if( (2*strlen(buff) > nin+nout) || (2*strlen(buff)==nin+nout && !strchr(buff,1)) ) { int ll=0; char buff2[MAXINOUT+1]; for(k=1;k<=nin+nout;k++){ if(!strchr(buff,k)) buff2[ll++]=k;} buff2[ll]=0; strcpy(buff,buff2); } k=0; while(buff[k]) { if(!k) k++; if(buff[k]<buff[k-1]) { int c=buff[k]; buff[k]=buff[k-1]; buff[k-1]=c; k--; } else k++; } strcpy(denom[denrno].momStr,buff); if(v <= vcs.sizel) denom[denrno].power = 1; else denom[denrno].power = -1; denom[denrno].mass=modelVarPos(prtclbase[ln->partcl-1].massidnt); if(ttypepropag(v,l)&&!tWidths) denom[denrno].width = 0; else denom[denrno].width=modelVarPos(prtclbase[ln->partcl-1].imassidnt); for (k = 0; k < denrno; k++) if ( !strcmp(denom[denrno].momStr,denom[k].momStr) && denom[denrno].mass == denom[k].mass && denom[denrno].width == denom[k].width ) { denom[k].power=2; goto label_1;} denrno++; label_1:; } } }
int photonp(int p) { return ((vectorp(p) && zeromass(p)) || pseudop(p)); }
static int enter_h(int * y,char* name,int num,int scat) { int i,m,j=0; int redres; shortstr hadrch; char ** items; char * errpos=NULL; locateinbase(name,&j); if(j) { if(pseudop(j)) return -1; strcpy(hadrons[num].name,name); strcpy(hadrons[num].contents,name); hadrons[num].parton[0] = j; hadrons[num].pow = 1; if(!scat && num==0 && strcmp(prtclbase1[j].massidnt,"0")==0) { errTxt="Decay of massless particle."; return -1; } if(name[strlen(name)-1]=='%') { if( !scat || nout||strcmp(prtclbase1[j].massidnt,"0") || (prtclbase1[j].spin!=1 && prtclbase1[j].spin!=2) || strchr("LR",prtclbase1[j].hlp) ) { errTxt="This particle can not be polarized"; return -1; } else hadrons[num].polarized[0]=1; } else hadrons[num].polarized[0]=0; return 0; } for(i=0;i<num;i++) if(!strcmp(hadrons[i].name,name)) { strcpy(hadrons[num].name,name); strcpy(hadrons[num].contents,hadrons[i].contents); hadrons[num].pow=hadrons[i].pow; for(j=0;j<hadrons[num].pow;j++) { hadrons[num].parton[j]=hadrons[i].parton[j]; if(nout) hadrons[num].polarized[j]=0; else hadrons[num].polarized[j]=hadrons[i].polarized[j]; } return 0; } hadrch[0]=0; for(i=num;i<MAXINOUT;i++) if(!strcmp(hadrons[i].name,name)) { strcpy(hadrch,hadrons[i].contents); break; } if(*y>=maxRow()-1) { goto_xy(1,*y); clr_eol();} else (*y)++; do { m=errpos? errpos-hadrch+1: 0; do { char direction[100]; sprintf(direction,"composit '%s' consists of: ",name); redres=input(*y, "s_ent_2", direction, hadrch, m , SSTRLEN); if(redres==KB_ESC) return 1; } while (redres!=KB_ENTER && redres!=KB_ESC); if (redres == KB_ESC || strcmp(hadrch,"") == 0) return 1; items=stritems(" ,",hadrch); for(m=0,hadrons[num].pow=0; items[m]; m++) { char name[100]; if(hadrons[num].pow>=100) {errTxt="too many partons";break;} sscanf(items[m],"%[^ ,]",name); locateinbase(name,&j); if (j==0 || pseudop(j)) { errTxt= "This particle is absent in the model"; break;} if(!scat && num==0 && strcmp(prtclbase1[j].massidnt,"0")==0) { errTxt="Decay of massless particle."; break; } if(name[strlen(name)-1]=='%') { if( !scat || nout||strcmp(prtclbase1[j].massidnt,"0") || (prtclbase1[j].spin!=1 && prtclbase1[j].spin!=2) || strchr("LR",prtclbase1[j].hlp) ) { errTxt="This particle can not be polarized"; break; } else hadrons[num].polarized[hadrons[num].pow]=1; } else hadrons[num].polarized[hadrons[num].pow]=0; hadrons[num].parton[hadrons[num].pow++]=j; } errpos=items[m]; if(!errpos) { for(i=0;i<hadrons[num].pow;i++) for(j=i+1;j<hadrons[num].pow;j++) if(hadrons[num].parton[i]==hadrons[num].parton[j]) { errpos=items[j]; errTxt="duplicate parton"; } } strcpy(hadrons[num].name,name); strcpy(hadrons[num].contents,hadrch); free(items); } while(errpos); return 0; }