7 #include "Pythia8/SLHAinterface.h"
19 void SLHAinterface::init( Settings& settings, Rndm* rndmPtr,
20 Couplings* couplingsPtrIn, ParticleData* particleDataPtr,
21 bool& useSLHAcouplings, stringstream& particleDataBuffer) {
24 couplingsPtr = couplingsPtrIn;
25 useSLHAcouplings =
false;
28 if( !initSLHA(settings, particleDataPtr))
29 infoPtr->errorMsg(
"Error in SLHAinterface::init: "
30 "Could not read SLHA file");
34 string warnPref =
"Warning in SLHAinterface::init: ";
35 while (getline(particleDataBuffer, line)
36 && settings.flag(
"SLHA:allowUserOverride")) {
37 bool pass = particleDataPtr->readString(line,
true);
38 if (!pass) infoPtr->errorMsg(warnPref +
"Unable to process line " + line);
39 else infoPtr->errorMsg(warnPref +
"Overwriting SLHA by " + line);
43 if (couplingsPtr->isSUSY) {
45 coupSUSY.init( settings, rndmPtr);
46 coupSUSY.initSUSY(&slha, infoPtr, particleDataPtr, &settings);
49 couplingsPtr = (Couplings *) &coupSUSY;
50 useSLHAcouplings =
true;
59 bool SLHAinterface::initSLHA(Settings& settings,
60 ParticleData* particleDataPtr) {
63 string errPref =
"Error in SLHAinterface::initSLHA: ";
64 string warnPref =
"Warning in SLHAinterface::initSLHA: ";
65 string infoPref =
"Info from SLHAinterface::initSLHA: ";
70 int readFrom = settings.mode(
"SLHA:readFrom");
71 string lhefFile = settings.word(
"Beams:LHEF");
72 string lhefHeader = settings.word(
"Beams:LHEFheader");
73 string slhaFile = settings.word(
"SLHA:file");
74 int verboseSLHA = settings.mode(
"SLHA:verbose");
75 bool slhaUseDec = settings.flag(
"SLHA:useDecayTable");
76 bool noSLHAFile = ( slhaFile ==
"none" || slhaFile ==
"void"
77 || slhaFile ==
"" || slhaFile ==
" " );
80 meMode = settings.mode(
"SLHA:meMode");
83 couplingsPtr->isSUSY =
false;
86 if (readFrom == 0)
return true;
92 string slhaInHeader( infoPtr->header(
"slha") );
93 if (slhaInHeader ==
"" && noSLHAFile)
return true;
95 if (lhefHeader !=
"void")
96 ifailLHE = slha.readFile(lhefHeader, verboseSLHA, slhaUseDec );
97 else if (lhefFile !=
"void")
98 ifailLHE = slha.readFile(lhefFile, verboseSLHA, slhaUseDec );
99 else if (noSLHAFile) {
100 istringstream slhaInHeaderStream(slhaInHeader);
101 ifailLHE = slha.readFile(slhaInHeaderStream, verboseSLHA, slhaUseDec );
108 couplingsPtr->isSUSY =
true;
112 if ( noSLHAFile )
return true;
113 ifailSpc = slha.readFile(slhaFile,verboseSLHA, slhaUseDec);
118 infoPtr->errorMsg(errPref +
"problem reading SLHA file", slhaFile);
121 couplingsPtr->isSUSY =
true;
125 ifailSpc = slha.checkSpectrum();
130 couplingsPtr->isSUSY =
false;
131 infoPtr->errorMsg(infoPref +
132 "No MODSEL found, keeping internal SUSY switched off");
133 }
else if (ifailSpc >= 2) {
135 infoPtr->errorMsg(warnPref +
"Problem with SLHA MASS or QNUMBERS.");
136 couplingsPtr->isSUSY =
false;
139 else if (ifailSpc == 0) {
141 slha.listSpectrum(0);
143 else if (ifailSpc < 0) {
144 infoPtr->errorMsg(warnPref +
"Problem with SLHA spectrum.",
145 "\n Only using masses and switching off SUSY.");
146 settings.flag(
"SUSY:all",
false);
147 couplingsPtr->isSUSY =
false;
148 slha.listSpectrum(ifailSpc);
153 bool isOrderedQ =
true;
154 bool isOrderedL =
true;
155 int idSdown[6]={1000001,1000003,1000005,2000001,2000003,2000005};
156 int idSup[6]={1000002,1000004,1000006,2000002,2000004,2000006};
157 int idSlep[6]={1000011,1000013,1000015,2000011,2000013,2000015};
158 for (
int j=0;j<=4;j++) {
159 if (slha.mass(idSlep[j+1]) < slha.mass(idSlep[j]))
161 if (slha.mass(idSup[j+1]) < slha.mass(idSup[j]))
163 if (slha.mass(idSdown[j+1]) < slha.mass(idSdown[j]))
168 for (
int i=1;i<=6;i++) {
171 string uName =
"~u_"+indx.str();
172 string dName =
"~d_"+indx.str();
173 string lName =
"~e_"+indx.str();
175 particleDataPtr->names(idSup[i-1],uName,uName+
"bar");
176 particleDataPtr->names(idSdown[i-1],dName,dName+
"bar");
178 if (isOrderedL) particleDataPtr->names(idSlep[i-1],lName+
"-",lName+
"+");
182 if ( (ifailSpc == 1 || ifailSpc == 0) && slha.modsel(3) >= 1 ) {
184 particleDataPtr->name(25,
"H_1");
185 particleDataPtr->name(35,
"H_2");
186 particleDataPtr->name(45,
"H_3");
187 particleDataPtr->name(36,
"A_1");
188 particleDataPtr->name(46,
"A_2");
189 particleDataPtr->name(1000045,
"~chi_50");
193 if ( (ifailSpc == 1 || ifailSpc == 0) && slha.modsel(6) >= 1 ) {
195 if ( (slha.modsel(6) == 1 || slha.modsel(6) >= 3)
196 && slha.usqmix.exists() && slha.dsqmix.exists() ) {
198 particleDataPtr->names(1000001,
"~d_1",
"~d_1bar");
199 particleDataPtr->names(1000002,
"~u_1",
"~u_1bar");
200 particleDataPtr->names(1000003,
"~d_2",
"~d_2bar");
201 particleDataPtr->names(1000004,
"~u_2",
"~u_2bar");
202 particleDataPtr->names(1000005,
"~d_3",
"~d_3bar");
203 particleDataPtr->names(1000006,
"~u_3",
"~u_3bar");
204 particleDataPtr->names(2000001,
"~d_4",
"~d_4bar");
205 particleDataPtr->names(2000002,
"~u_4",
"~u_4bar");
206 particleDataPtr->names(2000003,
"~d_5",
"~d_5bar");
207 particleDataPtr->names(2000004,
"~u_5",
"~u_5bar");
208 particleDataPtr->names(2000005,
"~d_6",
"~d_6bar");
209 particleDataPtr->names(2000006,
"~u_6",
"~u_6bar");
212 if ( (slha.modsel(6) == 2 || slha.modsel(6) >= 3)
213 && slha.selmix.exists()) {
215 particleDataPtr->names(1000011,
"~e_1-",
"~e_1+");
216 particleDataPtr->names(1000013,
"~e_2-",
"~e_2+");
217 particleDataPtr->names(1000015,
"~e_3-",
"~e_3+");
218 particleDataPtr->names(2000011,
"~e_4-",
"~e_4+");
219 particleDataPtr->names(2000013,
"~e_5-",
"~e_5+");
220 particleDataPtr->names(2000015,
"~e_6-",
"~e_6+");
223 if ( (slha.modsel(6) == 2 || slha.modsel(6) >= 3)
224 && slha.upmns.exists()) {
226 particleDataPtr->names(12,
"nu_1",
"nu_1bar");
227 particleDataPtr->names(14,
"nu_2",
"nu_2bar");
228 particleDataPtr->names(16,
"nu_3",
"nu_3bar");
231 if ( (slha.modsel(6) == 2 || slha.modsel(6) >= 3)
232 && slha.snumix.exists()) {
234 particleDataPtr->names(1000012,
"~nu_1",
"~nu_1bar");
235 particleDataPtr->names(1000014,
"~nu_2",
"~nu_2bar");
236 particleDataPtr->names(1000016,
"~nu_3",
"~nu_3bar");
239 if ( slha.snsmix.exists() && slha.snamix.exists() ) {
241 particleDataPtr->names(1000012,
"~nu_S1",
"~nu_S1bar");
242 particleDataPtr->names(1000014,
"~nu_S2",
"~nu_S2bar");
243 particleDataPtr->names(1000016,
"~nu_S3",
"~nu_S3bar");
245 particleDataPtr->addParticle(1000017,
"~nu_A1",
"~nu_A1bar",1, 0., 0);
246 particleDataPtr->addParticle(1000018,
"~nu_A2",
"~nu_A2bar",1, 0., 0);
247 particleDataPtr->addParticle(1000019,
"~nu_A3",
"~nu_A3bar",1, 0., 0);
252 if ( (ifailSpc == 1 || ifailSpc == 0) && slha.modsel(4) >= 1 ) {
253 if ( slha.rvnmix.exists() ) {
256 particleDataPtr->names(12,
"nu_1",
"nu_1bar");
257 particleDataPtr->names(14,
"nu_2",
"nu_2bar");
258 particleDataPtr->names(16,
"nu_3",
"nu_3bar");
259 particleDataPtr->name(1000022,
"~chi_10");
260 particleDataPtr->name(1000023,
"~chi_20");
261 particleDataPtr->name(1000025,
"~chi_30");
262 particleDataPtr->name(1000035,
"~chi_40");
264 if ( slha.rvumix.exists() && slha.rvvmix.exists() ) {
267 particleDataPtr->names(11,
"e-",
"e+");
268 particleDataPtr->names(13,
"mu-",
"mu+");
269 particleDataPtr->names(15,
"tau-",
"tau+");
270 particleDataPtr->names(1000024,
"~chi_1+",
"~chi_1-");
271 particleDataPtr->names(1000037,
"~chi_2+",
"~chi_2-");
273 if ( slha.rvhmix.exists() ) {
275 particleDataPtr->name(25,
"H_10");
276 particleDataPtr->name(35,
"H_20");
277 particleDataPtr->names(1000012,
"H_30",
"H_30");
278 particleDataPtr->names(1000014,
"H_40",
"H_40");
279 particleDataPtr->names(1000016,
"H_50",
"H_50");
281 if ( slha.rvamix.exists() ) {
283 particleDataPtr->name(36,
"A_10");
284 particleDataPtr->names(1000017,
"A_20",
"A_20");
285 particleDataPtr->names(1000018,
"A_30",
"A_30");
286 particleDataPtr->names(1000019,
"A_40",
"A_40");
288 if ( slha.rvlmix.exists() ) {
290 particleDataPtr->names(37,
"H_1+",
"H_1-");
291 particleDataPtr->names(1000011,
"H_2-",
"H_2+");
292 particleDataPtr->names(1000013,
"H_3-",
"H_3+");
293 particleDataPtr->names(1000015,
"H_4-",
"H_4+");
294 particleDataPtr->names(2000011,
"H_5-",
"H_5+");
295 particleDataPtr->names(2000013,
"H_6-",
"H_6+");
296 particleDataPtr->names(2000015,
"H_7-",
"H_7+");
301 if ( (ifailSpc == 1 || ifailSpc == 0) && slha.modsel(5) >= 1 ) {
303 particleDataPtr->name(25,
"H_10");
304 particleDataPtr->name(35,
"H_20");
305 particleDataPtr->name(36,
"H_30");
310 vector<int> isQnumbers;
311 bool foundLowCode =
false;
312 if ( (ifailSpc == 1 || ifailSpc == 0) && slha.qnumbers.size() > 0) {
313 for (
int iQnum=0; iQnum < int(slha.qnumbers.size()); iQnum++) {
315 int id = abs(slha.qnumbers[iQnum](0));
316 ostringstream idCode;
318 if (particleDataPtr->isParticle(
id)) {
319 infoPtr->errorMsg(warnPref +
"ignoring QNUMBERS",
"for id = "
320 + idCode.str() +
" (already exists)",
true);
322 int qEM3 = slha.qnumbers[iQnum](1);
323 int nSpins = slha.qnumbers[iQnum](2);
324 int colRep = slha.qnumbers[iQnum](3);
325 int hasAnti = slha.qnumbers[iQnum](4);
328 if (colRep == 3) colType = 1;
329 else if (colRep == -3) colType = -1;
330 else if (colRep == 8) colType = 2;
331 else if (colRep == 6) colType = 3;
332 else if (colRep == -6) colType = -3;
334 string name, antiName;
335 ostringstream idStream;
337 name = idStream.str();
339 if (iQnum <
int(slha.qnumbersName.size())) {
340 name = slha.qnumbersName[iQnum];
341 antiName = slha.qnumbersAntiName[iQnum];
342 if (antiName ==
"") {
343 if (name.find(
"+") != string::npos) {
345 antiName.replace(antiName.find(
"+"),1,
"-");
346 }
else if (name.find(
"-") != string::npos) {
348 antiName.replace(antiName.find(
"-"),1,
"+");
350 antiName = name+
"bar";
356 particleDataPtr->addParticle(
id, name, nSpins, qEM3, colType);
358 particleDataPtr->addParticle(
id, name, antiName, nSpins, qEM3,
362 isQnumbers.push_back(
id);
363 if (
id < 1000000) foundLowCode =
true;
369 infoPtr->errorMsg(warnPref
370 +
"using QNUMBERS for id codes < 1000000 may clash with SM.");
373 bool keepSM = settings.flag(
"SLHA:keepSM");
374 double minMassSM = settings.parm(
"SLHA:minMassSM");
375 map<int,bool> idModified;
376 if (ifailSpc == 1 || ifailSpc == 0) {
379 int id = slha.mass.first();
380 vector<int> ignoreMassKeepSM;
381 vector<int> ignoreMassM0;
382 vector<int> importMass;
384 for (
int i = 1; i <= slha.mass.size() ; i++) {
386 if (i>1)
id = slha.mass.next();
387 double mass = abs(slha.mass(
id));
390 bool isInternal =
true;
391 for (
unsigned int iq = 0; iq<isQnumbers.size(); ++iq)
392 if (
id == isQnumbers[iq]) isInternal =
false;
396 if (keepSM && (
id < 25 || (
id > 80 &&
id < 1000000)) && isInternal)
397 ignoreMassKeepSM.push_back(
id);
398 else if (id < 1000000 && particleDataPtr->m0(
id) < minMassSM
400 ignoreMassM0.push_back(
id);
402 particleDataPtr->m0(
id,mass);
403 idModified[id] =
true;
404 importMass.push_back(
id);
409 if (!particleDataPtr->hasChangedMMin(
id))
410 particleDataPtr->findParticle(
id)->setMMinNoChange( mass/2. );
411 if (!particleDataPtr->hasChangedMMax(
id))
412 particleDataPtr->findParticle(
id)->setMMaxNoChange( 3.*mass/2. );
416 if (importMass.size() >= 1) {
418 for (
unsigned int i=0; i<importMass.size(); ++i) {
419 ostringstream idCode;
420 idCode << importMass[i];
421 if (i != 0) idImport +=
",";
422 idImport += idCode.str();
424 infoPtr->errorMsg(infoPref +
"importing MASS entries",
"for id = {"
425 + idImport +
"}",
true);
427 if (ignoreMassKeepSM.size() >= 1) {
429 for (
unsigned int i=0; i<ignoreMassKeepSM.size(); ++i) {
430 ostringstream idCode;
431 idCode << ignoreMassKeepSM[i];
432 if (i != 0) idIgnore +=
",";
433 idIgnore += idCode.str();
435 infoPtr->errorMsg(warnPref +
"ignoring MASS entries",
"for id = {"
437 +
" (SLHA:keepSM. Use id > 1000000 for new particles)",
true);
439 if (ignoreMassM0.size() >= 1) {
441 for (
unsigned int i=0; i<ignoreMassM0.size(); ++i) {
442 ostringstream idCode;
443 idCode << ignoreMassM0[i];
444 if (i != 0) idIgnore +=
",";
445 idIgnore += idCode.str();
447 infoPtr->errorMsg(warnPref +
"ignoring MASS entries",
"for id = {"
448 + idIgnore +
"}" +
" (m0 < SLHA:minMassSM)",
true);
453 vector<int> ignoreDecayKeepSM;
454 vector<int> ignoreDecayM0;
455 vector<int> ignoreDecayBR;
456 vector<int> importDecay;
457 for (
int iTable=0; iTable < int(slha.decays.size()); iTable++) {
460 LHdecayTable* slhaTable=&(slha.decays[iTable]);
463 int idRes = slhaTable->getId();
464 ostringstream idCode;
466 ParticleDataEntry* particlePtr
467 = particleDataPtr->particleDataEntryPtr(idRes);
470 bool isInternal =
true;
471 for (
unsigned int iq = 0; iq<isQnumbers.size(); ++iq)
472 if (idRes == isQnumbers[iq]) isInternal =
false;
476 if (keepSM && (idRes < 25 || (idRes > 80 && idRes < 1000000))
478 ignoreDecayKeepSM.push_back(idRes);
481 else if (idRes < 1000000 && particleDataPtr->m0(idRes) < minMassSM
483 ignoreDecayM0.push_back(idRes);
488 double widRes = abs(slhaTable->getWidth());
489 double pythiaMinWidth = settings.parm(
"ResonanceWidths:minWidth");
490 if (widRes > 0. && widRes < pythiaMinWidth) {
491 infoPtr->errorMsg(warnPref +
"forcing width = 0 ",
"for id = "
492 + idCode.str() +
" (width < ResonanceWidths:minWidth)" ,
true);
495 particlePtr->setMWidth(widRes);
501 if (!particlePtr->hasChangedMMin()) {
502 double m0 = particlePtr->m0();
503 double mMin = m0 - min(5*widRes , m0/2.);
504 particlePtr->setMMinNoChange(mMin);
506 if (!particlePtr->hasChangedMMax()) {
507 double m0 = particlePtr->m0();
508 double mMax = m0 + min(5*widRes , m0/2.);
509 particlePtr->setMMaxNoChange(mMax);
515 double decayLength = 1.97e-13/widRes;
516 particlePtr->setTau0(decayLength);
519 if (slhaTable->size() > 0) {
520 particlePtr->clearChannels();
521 particleDataPtr->mayDecay(idRes,
true);
522 particleDataPtr->isResonance(idRes,
true);
524 importDecay.push_back(idRes);
526 ignoreDecayBR.push_back(idRes);
531 particlePtr->clearChannels();
532 particleDataPtr->mayDecay(idRes,
false);
533 particleDataPtr->isResonance(idRes,
false);
539 for (
int iChannel=0 ; iChannel<slhaTable->size(); iChannel++) {
540 LHdecayChannel slhaChannel = slhaTable->getChannel(iChannel);
541 double brat = slhaChannel.getBrat();
542 vector<int> idDa = slhaChannel.getIdDa();
543 if (idDa.size() >= 9) {
544 infoPtr->errorMsg(errPref +
"max number of DECAY products is 8 ",
545 "for id = "+idCode.str(),
true);
546 }
else if (idDa.size() <= 1) {
547 infoPtr->errorMsg(errPref +
"min number of DECAY products is 2 ",
548 "for id = "+idCode.str(),
true);
552 if (brat < 0.0) onMode = 0;
553 int meModeNow = meMode;
557 double widSqSum = pow2(widRes);
558 int nDa = idDa.size();
559 for (
int jDa=0; jDa<nDa; ++jDa) {
560 massSum += particleDataPtr->m0( idDa[jDa] );
561 widSqSum += pow2(particleDataPtr->mWidth( idDa[jDa] ));
563 double deltaM = particleDataPtr->m0(idRes) - massSum;
565 if (onMode == 1 && brat > 0.0 && deltaM < 0.) {
567 ostringstream errCode;
568 errCode << idRes <<
" ->";
569 for (
int jDa=0; jDa<nDa; ++jDa) errCode<<
" "<<idDa[jDa];
571 if (abs(deltaM) > 100. * sqrt(widSqSum)) {
572 infoPtr->errorMsg(warnPref +
"switched off DECAY mode",
573 ": " + errCode.str()+
" (too far off shell)",
true);
579 if (meModeNow != 100) {
580 infoPtr->errorMsg(warnPref +
"adding off shell DECAY mode",
581 ": "+errCode.str()+
" (forced meMode = 100)",
true);
584 infoPtr->errorMsg(warnPref +
"adding off shell DECAY mode",
585 errCode.str(),
true);
593 int id2 = (idDa.size() >= 3) ? idDa[2] : 0;
594 int id3 = (idDa.size() >= 4) ? idDa[3] : 0;
595 int id4 = (idDa.size() >= 5) ? idDa[4] : 0;
596 int id5 = (idDa.size() >= 6) ? idDa[5] : 0;
597 int id6 = (idDa.size() >= 7) ? idDa[6] : 0;
598 int id7 = (idDa.size() >= 8) ? idDa[7] : 0;
599 particlePtr->addChannel(onMode,abs(brat),meModeNow,
600 id0,id1,id2,id3,id4,id5,id6,id7);
606 idModified[idRes]=
true;
611 if (importDecay.size() >= 1) {
613 for (
unsigned int i=0; i<importDecay.size(); ++i) {
614 ostringstream idCode;
615 idCode << importDecay[i];
616 if (i != 0) idImport +=
",";
617 idImport += idCode.str();
619 infoPtr->errorMsg(infoPref +
"importing DECAY tables",
"for id = {"
620 + idImport +
"}",
true);
622 if (ignoreDecayKeepSM.size() >= 1) {
624 for (
unsigned int i=0; i<ignoreDecayKeepSM.size(); ++i) {
625 ostringstream idCode;
626 idCode << ignoreDecayKeepSM[i];
627 if (i != 0) idIgnore +=
",";
628 idIgnore += idCode.str();
630 infoPtr->errorMsg(warnPref +
"ignoring DECAY tables",
"for id = {"
632 +
" (SLHA:keepSM. Use id > 1000000 for new particles)",
true);
634 if (ignoreDecayM0.size() >= 1) {
636 for (
unsigned int i=0; i<ignoreDecayM0.size(); ++i) {
637 ostringstream idCode;
638 idCode << ignoreDecayM0[i];
639 if (i != 0) idIgnore +=
",";
640 idIgnore += idCode.str();
642 infoPtr->errorMsg(warnPref +
"ignoring DECAY tables",
"for id = {"
643 + idIgnore +
"}" +
" (m0 < SLHA:minMassSM)",
true);
645 if (ignoreDecayBR.size() >= 1) {
647 for (
unsigned int i=0; i<ignoreDecayBR.size(); ++i) {
648 ostringstream idCode;
649 idCode << ignoreDecayBR[i];
650 if (i != 0) idIgnore +=
",";
651 idIgnore += idCode.str();
653 infoPtr->errorMsg(warnPref +
"ignoring empty DECAY tables",
"for id = {"
654 + idIgnore +
"}" +
" (total width provided but no Branching Ratios)",
659 map<int,bool>::iterator it;
660 for (it=idModified.begin(); it!=idModified.end(); ++it) {
662 if (idModified[
id] ==
false)
continue;
663 ostringstream idCode;
665 ParticleDataEntry* particlePtr
666 = particleDataPtr->particleDataEntryPtr(
id);
667 double m0 = particlePtr->m0();
668 double wid = particlePtr->mWidth();
670 if (m0 <= 0.0 && (wid > 0.0 || particlePtr->mayDecay())) {
671 infoPtr->errorMsg(warnPref +
"massless particle forced stable",
" id = "
672 + idCode.str(),
true);
673 particlePtr->clearChannels();
674 particlePtr->setMWidth(0.0);
675 particlePtr->setMayDecay(
false);
676 particleDataPtr->isResonance(
id,
false);
680 if (wid == 0.0 && particlePtr->mayDecay()) {
681 particlePtr->setMayDecay(
false);
685 double mSumMin = 10. * m0;
686 int nChannels = particlePtr->sizeChannels();
687 if (nChannels >= 1) {
688 for (
int iChannel=0; iChannel<nChannels; ++iChannel) {
689 DecayChannel channel = particlePtr->channel(iChannel);
690 if (channel.onMode() <= 0)
continue;
691 int nProd = channel.multiplicity();
693 for (
int iDa = 0; iDa < nProd; ++iDa) {
694 int idDa = channel.product(iDa);
695 mSum += particleDataPtr->m0(idDa);
697 mSumMin = min(mSumMin, mSum);
700 if (mSumMin > m0 && particlePtr->id() != 25) {
701 infoPtr->errorMsg(warnPref +
"particle forced stable",
" id = "
702 + idCode.str() +
" (no on-shell decay channels)",
true);
703 particlePtr->setMWidth(0.0);
704 particlePtr->setMayDecay(
false);
707 else if (mSumMin > m0 && particlePtr->id() == 25) {
708 infoPtr->errorMsg(warnPref
709 +
"allowing particle with no on-shell decays ",
710 " id = " + idCode.str() ,
true);
715 double mMin = max(mSumMin, particlePtr->mMin());
716 particlePtr->setMMin(mMin);
730 void SLHAinterface::pythia2slha(ParticleData* particleDataPtr) {
733 string blockName =
"sminputs";
734 double mZ = particleDataPtr->m0(23);
735 slha.set(blockName,1,1.0/couplingsPtr->alphaEM(pow2(mZ)));
736 slha.set(blockName,2,couplingsPtr->GF());
737 slha.set(blockName,3,couplingsPtr->alphaS(pow2(mZ)));
738 slha.set(blockName,4,mZ);
740 slha.set(blockName,5,particleDataPtr->m0(5));
741 slha.set(blockName,6,particleDataPtr->m0(6));
742 slha.set(blockName,7,particleDataPtr->m0(15));
743 slha.set(blockName,8,particleDataPtr->m0(16));
744 slha.set(blockName,11,particleDataPtr->m0(11));
745 slha.set(blockName,12,particleDataPtr->m0(12));
746 slha.set(blockName,13,particleDataPtr->m0(13));
747 slha.set(blockName,14,particleDataPtr->m0(14));
749 slha.set(blockName,21,
double(0.0));
750 slha.set(blockName,22,
double(0.0));
751 slha.set(blockName,23,
double(0.0));
753 slha.set(blockName,24,particleDataPtr->m0(4));
759 while (particleDataPtr->nextId(
id) > id) {
760 slha.set(blockName,
id,particleDataPtr->m0(
id));
761 id = particleDataPtr->nextId(
id);
764 infoPtr->errorMsg(
"Error in SLHAinterface::pythia2slha(): "
765 "encountered infinite loop when saving mass block");