static void makeSkelet(void) {int i, j, p, i1; for (i = 0; i < vcs_stat.sizet; i++) { vertmrk[i] = 0; for (j = 0; j < vcs_stat.valence[i]; j++) sklt[i][j] = 0; } for (i = 0; i < vcs_stat.sizet; i++) /* mark subgraph vertex with '1' */ for (j = 0; j < vcs_stat.valence[i]; j++) { /* if(PLR_PRTCL&vcs_stat.vertlist[i][j].prop) continue;*/ i1 = vcs_stat.vertlist[i][j].nextvert.vno - 1 ; p = vcs_stat.vertlist[i][j].partcl; if (gaugep(p) && i < i1 && !(PLR_PRTCL&vcs.vertlist[i][j].prop) ) { /* check the Ghost particles existence in vertex */ if ((prtclInVert(p + 1,i+1) && prtclInVert(prtclbase[p + 1-1].anti,i1+1)) || (prtclInVert(p + 2,i+1) && prtclInVert(prtclbase[p + 2-1].anti,i1+1))) { sklt[i][j] = 1; sklt[i1][vcs_stat.vertlist[i][j].nextvert.edno-1] = 1; vertmrk[i] = 1; vertmrk[i1] = 1; } } } /* end of mark */ for (i = 0; i < vcs_stat.sizet; i++) {if (vertmrk[i] == 1) addVertex(i+1,maxmark);} }
set findmassindex(void) { int v, l; set index=set_constr(_E); for(v=0; v<vcs.sizet; v++) for(l=0; l<vcs.valence[v]; l++) { edgeinvert * L=&vcs.vertlist[v][l]; if(L->lorentz && L->link.vno<v && !photonp(L->partcl) && !gaugep(L->partcl) && prtclbase1[L->partcl].spin==2 ) { set_add1(&index,L->lorentz); massindpos[L->lorentz-1].vrt1= v+1; massindpos[L->lorentz-1].ln1 = l+1; massindpos[L->lorentz-1].vrt2= L->link.vno+1; massindpos[L->lorentz-1].ln2 = L->link.edno+1; } } return index; }
static void insertPermition(hlpcsptr alll) { int i, j, i1, j1; int first_mark[2 * maxvert][MAXVALENCE]; int mark, np; for (i = 0; i < vcs_stat.sizet; i++) for (j = 0; j < vcs_stat.valence[i]; j++) if(vcs_stat.vertlist[i][j].nextvert.vno != nullvert) { i1 = vcs_stat.vertlist[i][j].nextvert.vno-1; if (i < i1) { j1 = vcs_stat.vertlist[i][j].nextvert.edno-1; np= vcs_stat.vertlist[i][j].partcl; mark=0; if (gaugep(np) && !zeromass(np) && prtclInVert(np+sbosonmark,i+1) && prtclInVert(prtclbase[np+sbosonmark-1].anti,i1+1) )mark +=S_PERMIT; if ( (prtclbase[np-1].spin == 2) /*&& (prtclbase[np-1].cdim !=1)*/ && ( (i >= vcs_stat.sizel) || (i1 < vcs_stat.sizel) )) { if(prtclInVert(prtclbase[np+xbosonmark-1].anti,i1+1) && prtclInVert(np+xbosonmark,i+1)) mark += X_PERMIT; if(prtclInVert(prtclbase[np+ybosonmark-1].anti,i1+1 ) && prtclInVert(np+ybosonmark,i+1)) mark += Y_PERMIT; } first_mark[i ][j ]=mark; first_mark[i1][j1]=mark; } } else first_mark[i ][j ]=0; while (alll != NULL) { for (i = 0; i < vcs_stat.sizet; i++) for (j = 0; j < vcs_stat.valence[i]; j++) if (alll->hlpcs[i][j] == 0 ) alll->hlpcs[i][j] = first_mark[i][j]; alll = alll->next; } }
static int ghostaddition(void) { int i, nPrim; nPrim=nparticles; if( (prtclbase[nPrim-1].spin == 2) /*&& (prtclbase[nPrim-1].cdim !=1)*/ ) { nPrim ++; prtclbase[nPrim -1] = prtclbase[nparticles-1]; prtclbase[nparticles -1].hlp = 'T'; prtclbase[nparticles -1].spin=4; nparticles ++; nPrim ++; prtclbase[nPrim -1] = prtclbase[nparticles-1]; prtclbase[nparticles -1].hlp = 't'; prtclbase[nparticles -1].spin=4; nparticles ++; } if (gaugep(nPrim)) { nparticles ++; prtclbase[nparticles -1] = prtclbase[nPrim-1]; prtclbase[nparticles -1].hlp = 'c'; nparticles ++; prtclbase[nparticles -1] = prtclbase[nPrim-1]; prtclbase[nparticles -1].hlp = 'C'; if (strcmp(prtclbase[nPrim-1].massidnt,"0") != 0) { nparticles ++; prtclbase[nparticles -1] = prtclbase[nPrim-1]; prtclbase[nparticles -1].hlp = 'f'; } for (i=nPrim+1; i<=nparticles;i++) prtclbase[i -1].spin=0; } return nPrim; }
static int readparticles(int check, int ugForce ) { char *ss,*endstr; char fullname[60], massname[60], imassname[60], p1[60], p2[60],numtxt[20]; char latex[STRSIZ], latex_[STRSIZ], s[60],c[60], chlp[40]; int itmp,i,j, errcode,np1,np2,nparticleLimit =128; linelist ln=prtcls_tab.strings; tabName=prtcls_tab.headln; if(prtclbase) { cleardecaylist(); clearLatexNames(); free(prtclbase);} prtclbase=(prtcl_base*) malloc(nparticleLimit*sizeof(prtcl_base)); prtclbase1=prtclbase-1; nparticles = 0; for(i=nparticles;i<nparticleLimit;i++) {prtclbase[i].top=NULL;prtclbase[i].latex=NULL;} nLine=1; while (ln != NULL) { ss=ln->line; if (nparticles >= nparticleLimit-16) { nparticleLimit+=128; prtclbase=re_alloc(prtclbase,nparticleLimit*sizeof(prtcl_base)); if(!prtclbase) { errorMessage(" P ","too many particles"); return 0; } prtclbase1=prtclbase-1; for(i=nparticles;i<nparticleLimit;i++) {prtclbase[i].top=NULL;prtclbase[i].latex=NULL;} } sscanf(ss,"%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]", fullname,p1,p2,numtxt,s,massname,imassname,c,chlp,latex,latex_); trim(p1); trim(p2); trim(latex); trim(latex_); { static char fldName[2][5]={" P "," aP"}; char * pName[2]; pName[0]=p1; pName[1]=p2; for ( i=0;i<=1;i++) { if (check && (! isPrtclName(pName[i]))) { errorMessage(fldName[i],"incorrect particle name '%s'",pName[i]); return 0; } if (check ) { locateinbase(pName[i],&j); if (j != 0) { errorMessage(fldName[i],"duplicate particle name '%s'",pName[i]); return 0; } } } } nparticles++; strcpy(prtclbase[nparticles-1].name,p1); itmp=strtol(trim(s),&endstr,10); if(check) { if (s+strlen(s) != endstr) { errorMessage("2*spin","number expected"); return 0 ; } if((itmp!=0)&&(itmp!=1)&&(itmp!=2)&&(itmp!=3)&&(itmp!=4)) { errorMessage("2*spin","value out of range"); return 0; } } prtclbase[nparticles-1].spin=itmp; if( 1!=sscanf(numtxt,"%ld",&prtclbase[nparticles-1].N)) { errorMessage("number","can't read MC numeration parameter"); return 0; } trim(massname); if(strcmp(massname,"0")==0) { if(prtclbase[nparticles-1].spin==3 || prtclbase[nparticles-1].spin==4) errorMessage("mass","spin 3/2 and spin 2 particles should be massive"); } else { int pos; errcode=findvar(massname,NULL,&pos); if (check && (errcode != 0)) { errorMessage("mass","unknown variable %s",massname); return 0; }else { if(pos>nCommonVars) nCommonVars=pos; } } strcpy(prtclbase[nparticles-1].massidnt,massname); trim(imassname); if( check && strcmp(imassname,"0")&& !strcmp(massname,"0")) { errorMessage("width","non zero width for zero mass particle '%s'", prtclbase[nparticles-1].name); return 0; } if(strcmp(imassname,"0") != 0) { errcode=findvar(imassname,NULL,NULL); if(errcode) { if(imassname[0]=='!') { imassname[0]=' '; trim(imassname); if(check && (!isVarName(imassname)) ) { errorMessage("width","incorrect name '%s'",imassname); return 0; } if(check && (!isOriginName(imassname)) ) { errorMessage("width","this identifier '%s' already was used",imassname); return 0; } { varlist mvars=modelvars+1+nmodelvar; nmodelvar++; strcpy(mvars->varname,imassname); mvars->func = NULL; mvars->varvalue = 0.; mvars->need=0; mvars->hidden=0; mvars->pwidth=nparticles; } }else { errorMessage("width","unknown variable %s",imassname); return 0; } } } strcpy(prtclbase[nparticles-1].imassidnt,imassname); itmp=strtol(trim(c),&endstr,10); if(check) { if (c+strlen(c) != endstr) { errorMessage("color","number expected"); return 0; } if (((itmp!=1)&&(itmp!=3)&&(itmp!=8))||((itmp==3)&&(strcmp(p1,p2)==0)) ) { errorMessage("color","value out of range"); return 0; } } prtclbase[nparticles-1].cdim=itmp; trim(chlp); if (strcmp(chlp,"") == 0) strcpy(chlp," "); prtclbase[nparticles-1].hlp = toupper(chlp[0]); if(check) { int ner; ner=1; switch(prtclbase[nparticles-1].hlp) { case ' ':if(prtclbase[nparticles-1].spin==2 && !strcmp(prtclbase[nparticles-1].massidnt,"0") ) { errorMessage("aux","Massless vector boson must\n" " be a gauge particle"); return 0; } break; case 'L': case 'R': if ((prtclbase[nparticles-1].spin !=1) ||((prtclbase[nparticles-1].massidnt[0])!='0') ||(strcmp(p1,p2)==0)) ner=0; break; case '*': if(prtclbase[nparticles-1].massidnt[0]=='0') ner=0; else if(prtclbase[nparticles-1].imassidnt[0]!='0') { errorMessage("aux","for aux='*' zero width is expected"); return 0;} break; case 'G': if(prtclbase[nparticles-1].spin!=2) ner=0; break; default: ner=0; } if(!ner){ errorMessage("aux","unexpeted character"); return 0;} if(prtclbase[nparticles-1].N==0 && prtclbase[nparticles-1].hlp!='*') { errorMessage("number","Zero PDG code."); return 0;} } prtclbase[nparticles-1].latex=malloc(1+strlen(latex)); strcpy(prtclbase[nparticles-1].latex,latex); np1 = ghostaddition(); if (strcmp(p1,p2) == 0) prtclbase[np1-1].anti = np1; else { ++(nparticles); prtclbase[nparticles-1] = prtclbase[np1-1]; prtclbase[nparticles-1].N *=(-1); strcpy(prtclbase[nparticles-1].name,p2); prtclbase[nparticles-1].latex=malloc(1+strlen(latex_)); strcpy(prtclbase[nparticles-1].latex,latex_); if (prtclbase[np1-1].cdim == 3) prtclbase[nparticles-1].cdim = -3; np2=ghostaddition(); prtclbase[np1-1].anti = np2; prtclbase[np2-1].anti = np1; } ln=ln->next; nLine++; } for (i = 1; i <= nparticles; i++) { prtcl_base *with1 = &prtclbase[i-1]; with1->top = NULL; if (strchr("fcCtT",with1->hlp) != NULL) { sprintf(with1->name+strlen(with1->name),".%c",with1->hlp); switch (with1->hlp) { case 'c': with1->anti = prtclbase[i-1 - 1].anti +2; break; case 'C': with1->anti = prtclbase[i-1 - 2].anti +1; break; case 'f': with1->anti = prtclbase[i-1 - 3].anti +3; break; case 't': with1->anti = prtclbase[i-1 + 1].anti -1; break; case 'T': with1->anti = prtclbase[i-1 + 2].anti -2; break; } } } if(ugForce)for(i=1; i <= nparticles; i++) if(gaugep(i) && (!zeromass(i))) prtclbase[i-1].hlp=' '; for(i=1;i<=nmodelvar;i++) if(modelvars[i].pwidth) modelvars[i].pwidth=ghostmother(modelvars[i].pwidth); return 1; }