static void emitfactors(void) { int c, i, j, s, vln, pnum; writeF("%%---------- Factors ---------------\n"); /* ------- Symmetry Factor ------- */ writeF(" SymmFact:=%d/%d$ %% Diagram symmerty factor\n", vcs.symnum,vcs.symdenum); /* ----- average factor --------- */ for (c=1,i=0; i < vcs.sizel; i++) { vln = vcs.valence[i]; for (j = 0; j < vln; j++) if (IN_PRTCL & vcs.vertlist[i][j].prop) { pnum = vcs.vertlist[i][j].partcl; s = prtclbase1[pnum].spin; switch (s) { case 1: if(!strchr("LR",prtclbase1[pnum].hlp)) c*=2; break; case 2: if(zeromass(pnum)) c*=2; else c*=3; break; case 3: if(zeromass(pnum)) c*=2; else c*=4; break; case 4: if(zeromass(pnum)) c*=2; else c*=5; } c *= abs(prtclbase1[pnum].cdim); } } writeF(" AverFact:=1/%d$ %% Normalization factor of polarization average\n",c); /* ----- Fermion factor --------- */ for (c=1,i= 0; i < vcs.sizel; i++) for (j=0; j <vcs.valence[i]; j++) { pnum=vcs.vertlist[i][j].partcl; if(prtclbase1[pnum].spin&1 && (IN_PRTCL & vcs.vertlist[i][j].prop))c*=-1; } writeF(" FermFact:=%d$ %% (-1)**(number of in-fermion particles)\n",c); /* ----- Color factor --------- */ writeF(" ColorFact:=%d/%d$ %% QCD color weight of diagram \n%%\n", vcs.clrnum,vcs.clrdenum); }
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; } }
int photonp(int p) { return ((vectorp(p) && zeromass(p)) || pseudop(p)); }
static int readlagrangian(int check, int ugForce) { algvertptr lgrgn1,lgrgn2; int i, j, mm; char * ss; char pPtr[4][60]; int factorShift,lorentzShift; arr4byte f_copy; int mLine,totcolor,color,spinorNumb; linelist ln; static char fName[4][5] = {"P1","P2","P3","P4"}; polyvars var_testing={0,NULL}; vardef=&(var_testing); clearlgrgn(); factorShift=tabCharPos(lgrng_tab.format,4); lorentzShift=tabCharPos(lgrng_tab.format,5); tabName=lgrng_tab.headln; for(ln=lgrng_tab.strings, nLine=1; ln; ln=ln->next, nLine++) { ss=ln->line; sscanf(ss,"%[^|]%*c%[^|]%*c%[^|]%*c%[^|]",pPtr[0],pPtr[1],pPtr[2],pPtr[3]); for(i=0;i<4;i++) trim(pPtr[i]); if(pPtr[0][0]=='%') continue; for(i=0;i<4;i++) { if(pPtr[i][0]) { locateinbase(pPtr[i],&j); if(check && j == 0) { errorMessage( fName[i]," unknown particle %s" ,pPtr[i]); return 0; } f_copy[i]=j; } else if(i==3) f_copy[3]=0; else { errorMessage( fName[i],"particle name is expected");return 0;} } if(ugForce) { for(i=0;i<4;i++) { j=f_copy[i]; if(j && ghostp(j) &&(!zeromass(j))) i=10; } if(i>=10) continue; } lgrgn1=(algvertptr)m_alloc( sizeof(*lgrgn1)); lgrgn1->next = lgrgn; lgrgn = lgrgn1; lgrgn->comcoef= ln->line+factorShift; lgrgn->description=ln->line+lorentzShift; for (i=0;i<4;i++) lgrgn->fields[i] = f_copy[i]; if(check) { totcolor=1; for (mm=0;((mm<4)&&(lgrgn->fields[mm] !=0));mm++) { color=prtclbase[lgrgn->fields[mm] -1].cdim; if (color==-3) color=5; totcolor=totcolor*color; } if( (totcolor!=1)&&(totcolor!=15)&&(totcolor!=64)&&(totcolor!=120)&&(totcolor!=512) ) { errorMessage("Lorentz part","wrong color structure"); return 0; } spinorNumb=0; for (mm=0;((mm<4)&&(lgrgn->fields[mm] !=0));mm++) { if( prtclbase1[lgrgn->fields[mm]].spin&1 ) spinorNumb++ ; } if( (spinorNumb!=0)&&(spinorNumb!=2) ) { errorMessage("Lorentz part","wrong spinor structure"); return 0; } } if (! testLgrgn(lgrgn) ) { clearVars(vardef); return 0;} } clearVars(vardef); clearpregarbage(); lgrgn1 = lgrgn; /* Sorting */ do { lgrgn1->factor=1; for(i=0;i<4 && lgrgn1->fields[i];i++) { int hlp=prtclbase[lgrgn1->fields[i]-1].hlp; if(hlp=='C') break; else if(hlp=='c') {lgrgn1->factor=-1; break;} } for (i = 1; i <= 4; i++) lgrgn1->perm[i-1] = i; i = 1; while (i < 4) if (lgrgn1->fields[i-1] >= lgrgn1->fields[i + 1-1]) ++(i); else { mm = lgrgn1->fields[i-1]; lgrgn1->fields[i-1] = lgrgn1->fields[i + 1-1]; lgrgn1->fields[i + 1-1] = mm; mm = lgrgn1->perm[i-1]; lgrgn1->perm[i-1] = lgrgn1->perm[i + 1-1]; lgrgn1->perm[i + 1-1] = mm; if (i == 1) ++(i); else --(i); } lgrgn1 = lgrgn1->next; } while (lgrgn1 != NULL); if (check) { mLine=nLine; lgrgn1 = lgrgn; /* check1 */ do { nLine--; lgrgn2=lgrgn1->next; while (lgrgn2 != NULL ) { if( (lgrgn1->fields[0]==lgrgn2->fields[0]) && (lgrgn1->fields[1]==lgrgn2->fields[1]) && (lgrgn1->fields[2]==lgrgn2->fields[2]) && (lgrgn1->fields[3]==lgrgn2->fields[3]) ) { char sss[20]=""; for(i=0;i<4;i++) if(lgrgn1->fields[i]) { strcat(sss, prtclbase1[lgrgn1->fields[i]].name); strcat(sss," ");} errorMessage("P1,P2,P3,P4","duplicate vertex {%s}",sss); return 0; } lgrgn2=lgrgn2->next; } lgrgn1= lgrgn1->next; } while (lgrgn1 != NULL); nLine=mLine; lgrgn1 = lgrgn; /* check2 */ do { nLine--; for (i=0;i<4;i++) { f_copy[i]=lgrgn1->fields[i]; if (f_copy[i] !=0) { mm=ghostmother(f_copy[i]); f_copy[i]=prtclbase[mm-1].anti + f_copy[i]-mm ; } } i = 1; while (i < 4) if (f_copy[i-1] >= f_copy[i ]) ++(i); else { mm = f_copy[i-1]; f_copy[i-1] = f_copy[i ]; f_copy[i ] = mm; if (i == 1) ++(i); else --(i); } lgrgn2=lgrgn; while ((lgrgn2 != NULL ) && ( (f_copy[0] !=lgrgn2->fields[0]) || (f_copy[1] !=lgrgn2->fields[1]) || (f_copy[2] !=lgrgn2->fields[2]) || (f_copy[3] !=lgrgn2->fields[3]) ) ) { lgrgn2=lgrgn2->next; } if (lgrgn2 == NULL) { char sss[10]; strcpy(sss,""); for (i=0;i<3;i++) { strcat (sss, prtclbase[lgrgn1->fields[i]-1].name); strcat(sss," "); } if (lgrgn1->fields[3] !=0 ) strcat(sss,prtclbase[lgrgn1->fields[3]-1].name); errorMessage("P1,P2,P3,P4","conjugated vertex for %s not found",sss); return 0; } lgrgn1= lgrgn1->next; } while (lgrgn1 != NULL); } return 1; }
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; }