24 #ifndef MODEL_BUILDER_H_INCLUDED 25 #define MODEL_BUILDER_H_INCLUDED 38 std::vector<size_t> positions;
39 std::vector<Particle> particles;
40 std::vector<Lagrangian::TermType> terms;
76 template<
class ...Args>
121 return abbreviatedMassExpressions;
143 std::function<
bool(
csl::Expr const&)> condition
150 std::function<
bool(
csl::Expr const&)> condition
157 std::function<
bool(
csl::Expr const&)> condition
162 std::string
const &fields,
164 std::function<
bool(
csl::Expr const&)> condition
168 auto part = getParticle(fields);
169 rotateFields(part, unitaryMatrix, condition);
173 std::vector<mty::Particle>
const &fields,
174 std::vector<mty::Particle>
const &newFields,
175 std::vector<std::vector<csl::Expr>>
const &rotation,
176 bool diagonalizeMasses =
false,
177 int nMassLessFields = 0
181 std::vector<mty::Particle>
const &fields1,
182 std::vector<mty::Particle>
const &newFields1,
183 std::vector<std::vector<csl::Expr>>
const &rotation1,
184 std::vector<mty::Particle>
const &fields2,
185 std::vector<mty::Particle>
const &newFields2,
186 std::vector<std::vector<csl::Expr>>
const &rotation2,
187 int nMassLessFields = 0
191 std::vector<mty::Particle>
const &fields,
192 bool diagonalizeMasses =
false,
193 int nMassLessFields = 0
197 std::vector<mty::Particle>
const &fields1,
198 std::vector<mty::Particle>
const &fields2,
199 int nMassLessFields = 0
203 std::vector<std::string>
const &fields,
204 std::vector<std::string>
const &newFields,
205 std::vector<std::vector<csl::Expr>>
const &rotation,
206 bool diagonalizeMasses =
false,
207 int nMassLessFields = 0
211 std::vector<std::string>
const &fields1,
212 std::vector<std::string>
const &newFields1,
213 std::vector<std::vector<csl::Expr>>
const &rotation1,
214 std::vector<std::string>
const &fields2,
215 std::vector<std::string>
const &newFields2,
216 std::vector<std::vector<csl::Expr>>
const &rotation2,
217 int nMassLessFields = 0
221 std::initializer_list<std::string>
const &fields,
222 std::initializer_list<std::string>
const &newFields,
223 std::vector<std::vector<csl::Expr>>
const &rotation,
224 bool diagonalizeMasses =
false,
225 int nMassLessFields = 0
229 std::vector<std::string>(fields),
230 std::vector<std::string>(newFields),
238 std::initializer_list<std::string>
const &fields1,
239 std::initializer_list<std::string>
const &newFields1,
240 std::vector<std::vector<csl::Expr>>
const &rotation1,
241 std::initializer_list<std::string>
const &fields2,
242 std::initializer_list<std::string>
const &newFields2,
243 std::vector<std::vector<csl::Expr>>
const &rotation2,
244 int nMassLessFields = 0
248 std::vector<std::string>(fields1),
249 std::vector<std::string>(newFields1),
251 std::vector<std::string>(fields2),
252 std::vector<std::string>(newFields2),
259 std::vector<std::string>
const &fields,
260 bool diagonalizeMasses =
false,
261 int nMassLessFields = 0
265 std::vector<std::string>
const &fields1,
266 std::vector<std::string>
const &fields2,
267 int nMassLessFields = 0
271 std::initializer_list<std::string>
const &fields,
272 bool diagonalizeMasses =
false,
273 int nMassLessFields = 0
277 std::vector<std::string>(fields),
284 std::initializer_list<std::string>
const &fields1,
285 std::initializer_list<std::string>
const &fields2,
286 int nMassLessFields = 0
289 return birotateFields(
290 std::vector<std::string>(fields1),
291 std::vector<std::string>(fields2),
296 void applyUnitaryCondition(
297 std::vector<std::vector<csl::Expr>>
const& unitary
311 template<
class GroupType>
317 template<
class FieldType1,
class FieldType2>
318 void promoteToGoldstone(
319 FieldType1 &&goldstone,
320 FieldType2 &&gaugeBoson
323 template<
class FieldType1,
class FieldType2>
326 FieldType2 &&gaugeBoson
329 template<
class FieldType,
class ...Args>
330 void promoteToMajorana(
331 FieldType &&weylFermion,
335 static void findAbreviation(
csl::Expr &expr);
336 void integrateOutParticle(
338 std::vector<csl::Expr> newInteractions
341 void diracFermionEmbedding(
342 std::string
const &leftName,
343 std::string
const &rightName
346 void diracFermionEmbedding(
350 void applyDiracFermionEmbedding(
354 std::vector<mty::Lagrangian::TermType> &interaction
358 void gatherMass(std::string
const &name);
364 void breakU1GaugeSymmetry(
365 std::string
const &groupName
368 void breakGaugeSymmetry(std::string
const &brokenGroup);
370 void breakGaugeSymmetry(
371 std::string
const &brokenGroup,
372 std::vector<mty::Particle>
const &brokenFields,
373 std::vector<std::vector<std::string>>
const &newNames
376 void breakGaugeSymmetry(
377 std::string
const &brokenGroup,
378 std::vector<std::string>
const &brokenFields,
379 std::vector<std::vector<std::string>>
const &newNames
382 void breakGaugeSymmetry(
383 std::string
const &brokenGroup,
384 std::vector<std::string>
const &brokenFields
387 void breakGaugeSymmetry(
388 std::string
const &brokenGroup,
389 std::vector<mty::Particle>
const &brokenFields
392 void breakGaugeSymmetry(
394 std::vector<mty::Particle>
const &brokenFields,
395 std::vector<std::vector<std::string>>
const &newNames
398 void breakFlavorSymmetry(std::string
const &nameGroup);
400 void breakFlavorSymmetry(
401 std::string
const &flavorName,
402 std::vector<size_t>
const &subGroups,
403 std::vector<std::string> newFlavorNames
404 = std::vector<std::string>()
407 void breakFlavorSymmetry(
408 std::string
const &flavorName,
409 std::vector<mty::Particle>
const &brokenFields,
410 std::vector<std::vector<std::string>>
const &newNames
413 void breakFlavorSymmetry(
414 std::string
const &flavorName,
415 std::vector<size_t>
const &subGroups,
416 std::vector<mty::Particle>
const &brokenFields,
417 std::vector<std::vector<std::string>>
const &newNames,
418 std::vector<std::string>
const &newFlavorNames
421 void diagonalizeMassMatrices();
423 template<
class FieldType>
424 bool diagonalizeSymbolically(
426 bool forceDetZero =
false);
428 void diagonalizeYukawa(
429 std::string
const &nameYukawa,
430 std::vector<std::string>
const &nameMass,
433 void diagonalizeYukawa(
434 std::string
const &nameYukawa,
435 std::vector<std::string>
const &nameMass,
438 std::vector<mty::Particle> mixed
440 void diagonalizeYukawa(
441 std::string
const &nameYukawa,
442 std::vector<csl::Expr>
const &diagonal,
444 std::vector<mty::Particle> mixed
448 std::vector<mty::Particle>
const &particles,
449 std::vector<std::vector<csl::Expr>>
const &mass,
450 std::vector<std::vector<csl::Expr>>
const &mix,
451 std::vector<std::vector<csl::Expr>>
const &mix2
452 = std::vector<std::vector<csl::Expr>>()
455 void updateDiagonalizationData();
457 void applyDiagonalizationData(
csl::Expr &expr)
const;
458 void applyDiagonalizationData(std::vector<csl::Expr> &expr)
const;
460 void applyDiagonalizationData(
464 void applyDiagonalizationData(
468 void addMassAbbreviations(
472 void abbreviateBigTerms(
size_t maxLeafs = 30);
475 std::vector<mty::Particle>
const &fields,
476 std::vector<mty::Particle>
const &newFields,
477 std::vector<std::vector<csl::Expr>>
const &rotation
480 std::vector<csl::Expr> getRotationTerms(
481 std::vector<mty::Particle>
const &newFields,
482 std::vector<std::vector<csl::Expr>>
const &rotation
485 std::vector<csl::Expr> getFullMassMatrix(
486 std::vector<mty::Particle>
const &fields
489 void fillDependenciesForRotation(
490 std::vector<csl::Expr> &kinetic,
491 std::vector<csl::Expr> &interaction,
495 void fillDependenciesForRotation(
496 std::vector<csl::Expr> &kinetic,
497 std::vector<csl::Expr> &interaction,
498 std::vector<mty::Particle>
const &fields
508 std::vector<mty::Particle>
const &fields,
509 std::vector<mty::Particle>
const &newFields,
510 std::vector<csl::Expr>
const &rotations
513 void diagonalizeWithSpectrum(
514 std::vector<mty::Particle>
const &fields,
515 std::vector<mty::Particle>
const &newFields,
516 std::vector<std::vector<csl::Expr>>
const &mixing,
517 std::vector<csl::Expr>
const &massMatrix
520 void bidiagonalizeWithSpectrum(
521 std::vector<mty::Particle>
const &fields1,
522 std::vector<mty::Particle>
const &newFields1,
523 std::vector<std::vector<csl::Expr>>
const &mixing1,
524 std::vector<mty::Particle>
const &fields2,
525 std::vector<mty::Particle>
const &newFields2,
526 std::vector<std::vector<csl::Expr>>
const &mixing2,
527 std::vector<csl::Expr>
const &massMatrix
530 std::vector<std::vector<mty::Particle>>
const &getParticleFamilies()
const {
531 return particleFamilies;
534 void addParticleFamily(std::vector<mty::Particle>
const &families);
537 void addParticleFamily(std::vector<std::string>
const &familyNames);
538 void removeParticleFamily(std::string
const &particleName);
542 void replaceTermInLagrangian(
543 std::vector<Lagrangian::TermType> &lagrangian,
545 csl::vector_expr &newTerms);
547 void fillDependencies(
548 std::vector<csl::Expr> &kinetic,
549 std::vector<csl::Expr> &mass,
550 std::vector<csl::Expr> &interaction,
554 std::vector<csl::Expr> clearDependencies(
558 std::vector<csl::Expr> clearDependencies(
559 std::vector<Lagrangian::TermType> &terms,
563 void doSetGaugeChoice(
568 void doPromoteToGoldstone(
573 void doPromoteToGhost(
578 void clearProjectorsInMass();
580 void doPromoteToMajorana(
582 std::string
const &newParticleName =
"" 585 bool doDiagonalizeSymbolically(
587 bool forceDetZero =
false 590 void breakLagrangian(
594 void breakLagrangian(
597 std::vector<csl::Space const*>
const &newSpace
602 static std::vector<mty::Particle> uniqueContent(
606 static std::vector<mty::Particle>::const_iterator findInContent(
607 std::vector<mty::Particle>
const &content,
610 static bool fieldInContent(
611 std::vector<mty::Particle>
const &content,
615 std::vector<MassBlock> getMassBlocks()
const;
619 bool diagonalizeExplicitely(
621 std::vector<mty::Particle> &newFields,
622 bool forceDetZero =
false 628 std::string
const &indent
652 std::vector<std::vector<mty::Particle>> particleFamilies;
659 template<
class FieldType>
660 void ModelBuilder::setGaugeChoice(
665 constexpr
bool group_valid =
670 if constexpr (group_valid)
671 doSetGaugeChoice(field, choice);
674 getParticle(std::forward<FieldType>(field)),
679 template<
class FieldType1,
class FieldType2>
680 void ModelBuilder::promoteToGoldstone(
681 FieldType1 &&goldstone,
682 FieldType2 &&gaugeBoson
685 constexpr
bool field1_valid =
689 constexpr
bool field2_valid =
694 if constexpr(field1_valid) {
695 if constexpr(field2_valid)
696 return doPromoteToGoldstone(goldstone, gaugeBoson);
698 return promoteToGoldstone(
700 getParticle(std::forward<FieldType2>(gaugeBoson))
703 else if constexpr (field2_valid)
704 return promoteToGoldstone(
705 getParticle(std::forward<FieldType1>(goldstone)),
709 return promoteToGoldstone(
710 getParticle(std::forward<FieldType1>(goldstone)),
711 getParticle(std::forward<FieldType2>(gaugeBoson))
715 template<
class FieldType1,
class FieldType2>
716 void ModelBuilder::promoteToGhost(
718 FieldType2 &&gaugeBoson
721 constexpr
bool field1_valid =
725 constexpr
bool field2_valid =
730 if constexpr(field1_valid) {
731 if constexpr(field2_valid)
732 return doPromoteToGhost(ghost, gaugeBoson);
734 return promoteToGhost(
736 getParticle(std::forward<FieldType2>(gaugeBoson))
739 else if constexpr (field2_valid)
740 return promoteToGhost(
741 getParticle(std::forward<FieldType1>(ghost)),
745 return promoteToGhost(
746 getParticle(std::forward<FieldType1>(ghost)),
747 getParticle(std::forward<FieldType2>(gaugeBoson))
751 template<
class FieldType,
class ...Args>
752 void ModelBuilder::promoteToMajorana(
753 FieldType &&weylFermion,
757 constexpr
bool field_valid =
762 if constexpr(field_valid) {
763 return doPromoteToMajorana(weylFermion, std::forward<Args>(args)...);
766 return promoteToMajorana(
767 getParticle(std::forward<FieldType>(weylFermion)),
768 std::forward<Args>(args)...
772 template<
class FieldType>
773 bool ModelBuilder::diagonalizeSymbolically(
778 constexpr
bool field_valid =
783 if constexpr(field_valid)
784 return doDiagonalizeSymbolically(
789 return doDiagonalizeSymbolically(
790 getParticle(std::forward<FieldType>(field)),
Helper struct to store mass block data when diagonalizing.
Definition: modelBuilder.h:37
Class handling numerical diagonalization for HEP models.
Definition: spectrum.h:82
This class inherits from std::shared_ptr<QuantumFieldParent> and should be used instead of direct Qua...
Definition: quantumField.h:1409
Namespace of MARTY.
Definition: 2HDM.h:31
std::vector< csl::Expr > abbreviatedMassExpressions
Vector of abbreviated masses in the model, determined by the ModelBuilder::gatherMasses() function an...
Definition: modelBuilder.h:650
class mty::AbstractGroup Group
Abstract base class for groups.
Interface class containing the result of an amplitude calculation.
Definition: amplitude.h:41
File containing the Spectrum class, handling numerical diagonalization for High-Energy physics models...
First abstraction layer for a High-Energy Physics model.
ModelBuilder(Args &&...args)
Constructor.
Definition: modelBuilder.h:77
std::vector< csl::Expr > const & getAbbreviatedMassExpressions() const
Definition: modelBuilder.h:120
Type
Different types of gauge ficing parameter for gauge boson propagators.
Definition: gaugedGroup.h:92
The class ModelData contains all the necessary features to store and manipulate the content of a mode...
Definition: modelData.h:56
Interaction term (in the Lagrangian) in MARTY.
Definition: interactionTerm.h:50
~ModelBuilder() override
Default destructor.
Definition: modelBuilder.h:83
std::vector< Spectrum > spectra
Vector of Spectrum objects, remembering symbolic diagonalizations to, later on, diagonalize numerical...
Definition: modelBuilder.h:643
Class containing all model building features of MARTY.
Definition: modelBuilder.h:54