/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D E S C O L L I S I O N S E N T R E P A R T I C U L E S : */
/* */
/* */
/* Author of '$xrq/nucleon.LH$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1991??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R A C T I O N F O R T E ( " S T R O N G I N T E R A C T I O N " ) */
/* */
/* D I F F E R E N T S T Y P E S D E C O L L I S I O N S E N T R E P A R T I C U L E S : */
/* */
/*************************************************************************************************************************************/
#define PROBABILITE_DE_STRONG_ANNHILATION_GxGxGxG___V \
GRO1(FRA2(FU))
DEFV(Local,DEFV(Float,INIT(probabilite_de_STRONG_ANNHILATION_GxGxGxG___V,PROBABILITE_DE_STRONG_ANNHILATION_GxGxGxG___V)));
/* Probabilite du vertex : GxGxGxG --> V. */
DEFV(Local,DEFV(Positive,INIT(compteur_de_STRONG_ANNHILATION_GxGxGxG___V,ZERO)));
/* Compteur des vertex : GxGxGxG --> V. */
#define STRONG_ANNHILATION_GxGxGxG___V(gluonD1,gluonD2,gluonD3,gluonD4) \
Bblock \
TRACE_D_UN_EVENEMENT(Prin4("STRONG_ANNHILATION_GxGxGxG___V G(%d)xG(%d)xG(%d)xG(%d) --> VIDE" \
,ETIQUETTE(gluonD1) \
,ETIQUETTE(gluonD2) \
,ETIQUETTE(gluonD3) \
,ETIQUETTE(gluonD4) \
) \
); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD1); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD2); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD3); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD4); \
INCR(compteur_de_STRONG_ANNHILATION_GxGxGxG___V,I); \
Eblock \
/* Vertex : GxGxGxG --> V. */
#define PROBABILITE_DE_STRONG_ANNHILATION_GxGxG___V \
GRO1(FRA2(FU))
DEFV(Local,DEFV(Float,INIT(probabilite_de_STRONG_ANNHILATION_GxGxG___V,PROBABILITE_DE_STRONG_ANNHILATION_GxGxG___V)));
/* Probabilite du vertex : GxGxG --> V. */
DEFV(Local,DEFV(Positive,INIT(compteur_de_STRONG_ANNHILATION_GxGxG___V,ZERO)));
/* Compteur des vertex : GxGxG --> V. */
#define STRONG_ANNHILATION_GxGxG___V(gluonD1,gluonD2,gluonD3) \
Bblock \
TRACE_D_UN_EVENEMENT(Prin3("STRONG_ANNHILATION_GxGxG___V G(%d)xG(%d)xG(%d) --> VIDE" \
,ETIQUETTE(gluonD1) \
,ETIQUETTE(gluonD2) \
,ETIQUETTE(gluonD3) \
) \
); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD1); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD2); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD3); \
INCR(compteur_de_STRONG_ANNHILATION_GxGxG___V,I); \
Eblock \
/* Vertex : GxGxG --> V. */
#define PROBABILITE_DE_STRONG_ANNHILATION_QxAQxG___V \
GRO1(FRA2(FU))
DEFV(Local,DEFV(Float,INIT(probabilite_de_STRONG_ANNHILATION_QxAQxG___V,PROBABILITE_DE_STRONG_ANNHILATION_QxAQxG___V)));
/* _ */
/* Probabilite du vertex : QxQxG --> V. */
DEFV(Local,DEFV(Positive,INIT(compteur_de_STRONG_ANNHILATION_QxAQxG___V,ZERO)));
/* _ */
/* Compteur des vertex : QxQxG --> V. */
#define STRONG_ANNHILATION_QxAQxG___V(quarkD1,anti_quarkD1,gluonD1) \
Bblock \
ATTENTION_EST_CE_UN_QUARK_REEL(quarkD1); \
TRACE_D_UN_EVENEMENT(Prin3("STRONG_ANNHILATION_QxAQxG___V Q(%d)xAQ(%d)xG(%d) --> VIDE" \
,ETIQUETTE(quarkD1) \
,ETIQUETTE(anti_quarkD1) \
,ETIQUETTE(gluonD1) \
) \
); \
DESTRUCTION_D_UN_QUARK_VIRTUEL(quarkD1); \
DESTRUCTION_D_UN_ANTI_QUARK_VIRTUEL(anti_quarkD1); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD1); \
INCR(compteur_de_STRONG_ANNHILATION_QxAQxG___V,I); \
Eblock \
/* _ */ \
/* Vertex : QxQxG --> V. */
#define PROBABILITE_DE_STRONG_ABSORBTION_QxG___Q \
GRO3(FRA10(FU))
DEFV(Local,DEFV(Float,INIT(probabilite_de_STRONG_ABSORBTION_QxG___Q,PROBABILITE_DE_STRONG_ABSORBTION_QxG___Q)));
/* Probabilite du vertex : QxG --> Q. */
DEFV(Local,DEFV(Positive,INIT(compteur_de_STRONG_ABSORBTION_QxG___Q,ZERO)));
/* Compteur des vertex : QxG --> Q. */
#define STRONG_ABSORBTION_QxG___Q(quarkD1,gluonD1,quarkA1) \
Bblock \
DEFINITION_DE_LA_VITESSE_ALEATOIRE; \
/* Structures necessaires a definir une vitesse en coordonnees spheriques et en coordonnees */ \
/* cartesiennes. */ \
DEFINITION_DE_LA_RESULTANTE_DE_2_POSITIONS(position_du_vertex,vitesse_resultante_virtuelle,quarkD1,gluonD1); \
/* Definition d'une position moyenne entre les 2 particules, ainsi que d'un vecteur */ \
/* resultante des deux vecteurs vitesse ; il est dit "virtuel" parce que son module peut */ \
/* tres bien etre superieur a la vitesse de la lumiere, ce qui n'a aucune importance, */ \
/* puisque seule sa direction importe. On notera que 'vitesse_resultante_virtuelle' n'est */ \
/* pas utilisee... */ \
CONSERVATION_DU_MODULE_DE_LA_VITESSE_D_UN_QUARK_OU_D_UN_ANTI_QUARK(quarkD1); \
/* On fixe a priori la conservation de la vitesse du quark... */ \
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(vitesse_resultante_virtuelle \
,PERTURBER_UNE_DIRECTION \
); \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
VITESSE_CARTESIENNE_POLAIRE(vitesse_courante \
,rho_de_la_vitesse \
,theta_polaire \
,PAS_DE_DEPHASAGE \
); \
CREATION_D_UN_QUARK_VIRTUEL(quarkA1 \
,SAVEUR(quarkD1) \
,position_du_vertex \
,vitesse_courante \
,ROUGE_indefinie,VERTE_indefinie,BLEUE_indefinie \
); \
FLUCTUATION_ALEATOIRE_DES_POSITIONS_INITIALE_ET_COURANTE(quarkA1,PERTURBER_UNE_POSITION); \
ADDITION_DE_2_CHARGES_DE_COULEUR(quarkA1 \
,quarkD1,gluonD1 \
); \
RENORMALISATION_DE_LA_CHARGE_DE_COULEUR(quarkA1); \
PERTURBATION_ALEATOIRE_ADDITIVE_DE_LA_CHARGE_DE_COULEUR(quarkA1); \
MAJORATION_DE_LA_COMPOSANTE_PREPONDERANTE_DE_LA_CHARGE_DE_COULEURS(quarkA1); \
CHANGEMENT_EVENTUEL_DE_QUARK_REEL(quarkD1,quarkA1); \
TRACE_D_UN_EVENEMENT(Prin3("STRONG_ABSORBTION_QxG___Q Q(%d)xG(%d) --> Q(%d)" \
,ETIQUETTE(quarkD1) \
,ETIQUETTE(gluonD1) \
,ETIQUETTE(quarkA1) \
) \
); \
DESTRUCTION_D_UN_QUARK(quarkD1); \
/* On n'utilise pas 'DESTRUCTION_D_UN_QUARK_VIRTUEL(quarkD1)' car en effet, 'quarkD1' peut */ \
/* etre un quark REEL... */ \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD1); \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
INCR(compteur_de_STRONG_ABSORBTION_QxG___Q,I); \
Eblock \
/* Vertex : QxG --> Q. */
#define PROBABILITE_DE_STRONG_ABSORBTION_AQxG___AQ \
GRO3(FRA10(FU))
DEFV(Local,DEFV(Float,INIT(probabilite_de_STRONG_ABSORBTION_AQxG___AQ,PROBABILITE_DE_STRONG_ABSORBTION_AQxG___AQ)));
/* _ _ */
/* Probabilite du vertex : QxG --> Q. */
DEFV(Local,DEFV(Positive,INIT(compteur_de_STRONG_ABSORBTION_AQxG___AQ,ZERO)));
/* _ _ */
/* Compteur des vertex : QxG --> Q. */
#define STRONG_ABSORBTION_AQxG___AQ(anti_quarkD1,gluonD1,anti_quarkA1) \
Bblock \
DEFINITION_DE_LA_VITESSE_ALEATOIRE; \
/* Structures necessaires a definir une vitesse en coordonnees spheriques et en coordonnees */ \
/* cartesiennes. */ \
DEFINITION_DE_LA_RESULTANTE_DE_2_POSITIONS(position_du_vertex,vitesse_resultante_virtuelle,anti_quarkD1,gluonD1); \
/* Definition d'une position moyenne entre les 2 particules, ainsi que d'un vecteur */ \
/* resultante des deux vecteurs vitesse ; il est dit "virtuel" parce que son module peut */ \
/* tres bien etre superieur a la vitesse de la lumiere, ce qui n'a aucune importance, */ \
/* puisque seule sa direction importe. On notera que 'vitesse_resultante_virtuelle' n'est */ \
/* pas utilisee... */ \
CONSERVATION_DU_MODULE_DE_LA_VITESSE_D_UN_QUARK_OU_D_UN_ANTI_QUARK(anti_quarkD1); \
/* On fixe a priori la conservation de la vitesse de l'anti-quark... */ \
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(vitesse_resultante_virtuelle \
,PERTURBER_UNE_DIRECTION \
); \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
VITESSE_CARTESIENNE_POLAIRE(vitesse_courante \
,rho_de_la_vitesse \
,theta_polaire \
,PAS_DE_DEPHASAGE \
); \
CREATION_D_UN_ANTI_QUARK_VIRTUEL(anti_quarkA1 \
,SAVEUR(anti_quarkD1) \
,position_du_vertex \
,vitesse_courante \
,ROUGE_indefinie,VERTE_indefinie,BLEUE_indefinie \
); \
FLUCTUATION_ALEATOIRE_DES_POSITIONS_INITIALE_ET_COURANTE(anti_quarkA1,PERTURBER_UNE_POSITION); \
ADDITION_DE_2_CHARGES_DE_COULEUR(anti_quarkA1 \
,anti_quarkD1,gluonD1 \
); \
RENORMALISATION_DE_LA_CHARGE_DE_COULEUR(anti_quarkA1); \
PERTURBATION_ALEATOIRE_ADDITIVE_DE_LA_CHARGE_DE_COULEUR(anti_quarkA1); \
MAJORATION_DE_LA_COMPOSANTE_PREPONDERANTE_DE_LA_CHARGE_DE_COULEURS(anti_quarkA1); \
CHANGEMENT_EVENTUEL_D_ANTI_QUARK_REEL(anti_quarkD1,anti_quarkA1); \
TRACE_D_UN_EVENEMENT(Prin3("STRONG_ABSORBTION_AQxG___AQ AQ(%d)xG(%d) --> AQ(%d)" \
,ETIQUETTE(anti_quarkD1) \
,ETIQUETTE(gluonD1) \
,ETIQUETTE(anti_quarkA1) \
) \
); \
DESTRUCTION_D_UN_ANTI_QUARK_VIRTUEL(anti_quarkD1); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD1); \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
INCR(compteur_de_STRONG_ABSORBTION_AQxG___AQ,I); \
Eblock \
/* _ _ */ \
/* Vertex : QxG --> Q. */
#define PROBABILITE_DE_STRONG_TRANSFORMATION_QxAQ___G \
GRO3(FRA10(FU))
DEFV(Local,DEFV(Float,INIT(probabilite_de_STRONG_TRANSFORMATION_QxAQ___G,PROBABILITE_DE_STRONG_TRANSFORMATION_QxAQ___G)));
/* _ */
/* Probabilite du vertex : QxQ --> G. */
DEFV(Local,DEFV(Positive,INIT(compteur_de_STRONG_TRANSFORMATION_QxAQ___G,ZERO)));
/* _ */
/* Compteur des vertex : QxQ --> G. */
#define STRONG_TRANSFORMATION_QxAQ___G(quarkD1,anti_quarkD1,gluonA1) \
Bblock \
DEFINITION_DE_LA_VITESSE_ALEATOIRE; \
/* Structures necessaires a definir une vitesse en coordonnees spheriques et en coordonnees */ \
/* cartesiennes. */ \
DEFINITION_DE_LA_RESULTANTE_DE_2_POSITIONS(position_du_vertex,vitesse_resultante_virtuelle,quarkD1,anti_quarkD1); \
/* Definition d'une position moyenne entre les 2 particules, ainsi que d'un vecteur */ \
/* resultante des deux vecteurs vitesse ; il est dit "virtuel" parce que son module peut */ \
/* tres bien etre superieur a la vitesse de la lumiere, ce qui n'a aucune importance, */ \
/* puisque seule sa direction importe... */ \
INITIALISATION_DU_MODULE_DE_LA_VITESSE_ALEATOIRE_D_UN_GLUON; \
/* Le module de la vitesse des gluons est figees, puisque ces particules se deplacent a la */ \
/* vitesse de la lumiere, et la direction est aleatoire (en coordonnees spheriques). */ \
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(vitesse_resultante_virtuelle \
,PERTURBER_UNE_DIRECTION \
); \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
VITESSE_CARTESIENNE_POLAIRE(vitesse_courante \
,rho_de_la_vitesse \
,theta_polaire \
,PAS_DE_DEPHASAGE \
); \
CREATION_D_UN_GLUON_VIRTUEL(gluonA1 \
,position_du_vertex \
,vitesse_courante \
,ROUGE_indefinie,VERTE_indefinie,BLEUE_indefinie \
); \
FLUCTUATION_ALEATOIRE_DES_POSITIONS_INITIALE_ET_COURANTE(gluonA1,PERTURBER_UNE_POSITION); \
ADDITION_DE_2_CHARGES_DE_COULEUR(gluonA1 \
,quarkD1,anti_quarkD1 \
); \
RENORMALISATION_DE_LA_CHARGE_DE_COULEUR(gluonA1); \
PERTURBATION_ALEATOIRE_ADDITIVE_DE_LA_CHARGE_DE_COULEUR(gluonA1); \
MAJORATION_DE_LA_COMPOSANTE_PREPONDERANTE_DE_LA_CHARGE_DE_COULEURS(gluonA1); \
ATTENTION_EST_CE_UN_QUARK_REEL(quarkD1); \
TRACE_D_UN_EVENEMENT(Prin3("STRONG_TRANSFORMATION_QxAQ___G Q(%d)xAQ(%d) --> G(%d)" \
,ETIQUETTE(quarkD1) \
,ETIQUETTE(anti_quarkD1) \
,ETIQUETTE(gluonA1) \
) \
); \
DESTRUCTION_D_UN_QUARK_VIRTUEL(quarkD1); \
DESTRUCTION_D_UN_ANTI_QUARK_VIRTUEL(anti_quarkD1); \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
INCR(compteur_de_STRONG_TRANSFORMATION_QxAQ___G,I); \
Eblock \
/* _ */ \
/* Vertex : QxQ --> G. */
#define PROBABILITE_DE_STRONG_TRANSFORMATION_GxG___G \
GRO3(FRA10(FU))
DEFV(Local,DEFV(Float,INIT(probabilite_de_STRONG_TRANSFORMATION_GxG___G,PROBABILITE_DE_STRONG_TRANSFORMATION_GxG___G)));
/* Probabilite du vertex : GxG --> G. */
DEFV(Local,DEFV(Positive,INIT(compteur_de_STRONG_TRANSFORMATION_GxG___G,ZERO)));
/* Compteur des vertex : GxG --> G. */
#define STRONG_TRANSFORMATION_GxG___G(gluonD1,gluonD2,gluonA1) \
Bblock \
DEFINITION_DE_LA_VITESSE_ALEATOIRE; \
/* Structures necessaires a definir une vitesse en coordonnees spheriques et en coordonnees */ \
/* cartesiennes. */ \
DEFINITION_DE_LA_RESULTANTE_DE_2_POSITIONS(position_du_vertex,vitesse_resultante_virtuelle,gluonD1,gluonD2); \
/* Definition d'une position moyenne entre les 2 particules, ainsi que d'un vecteur */ \
/* resultante des deux vecteurs vitesse ; il est dit "virtuel" parce que son module peut */ \
/* tres bien etre superieur a la vitesse de la lumiere, ce qui n'a aucune importance, */ \
/* puisque seule sa direction importe... */ \
INITIALISATION_DU_MODULE_DE_LA_VITESSE_ALEATOIRE_D_UN_GLUON; \
/* Le module de la vitesse des gluons est figees, puisque ces particules se deplacent a la */ \
/* vitesse de la lumiere, et la direction est aleatoire (en coordonnees spheriques). */ \
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(vitesse_resultante_virtuelle \
,PERTURBER_UNE_DIRECTION \
); \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
VITESSE_CARTESIENNE_POLAIRE(vitesse_courante \
,rho_de_la_vitesse \
,theta_polaire \
,PAS_DE_DEPHASAGE \
); \
CREATION_D_UN_GLUON_VIRTUEL(gluonA1 \
,position_du_vertex \
,vitesse_courante \
,ROUGE_indefinie,VERTE_indefinie,BLEUE_indefinie \
); \
FLUCTUATION_ALEATOIRE_DES_POSITIONS_INITIALE_ET_COURANTE(gluonA1,PERTURBER_UNE_POSITION); \
ADDITION_DE_2_CHARGES_DE_COULEUR(gluonA1 \
,gluonD1,gluonD2 \
); \
RENORMALISATION_DE_LA_CHARGE_DE_COULEUR(gluonA1); \
PERTURBATION_ALEATOIRE_ADDITIVE_DE_LA_CHARGE_DE_COULEUR(gluonA1); \
MAJORATION_DE_LA_COMPOSANTE_PREPONDERANTE_DE_LA_CHARGE_DE_COULEURS(gluonA1); \
TRACE_D_UN_EVENEMENT(Prin3("STRONG_TRANSFORMATION_GxG___G G(%d)xG(%d) --> G(%d)" \
,ETIQUETTE(gluonD1) \
,ETIQUETTE(gluonD2) \
,ETIQUETTE(gluonA1) \
) \
); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD1); \
DESTRUCTION_D_UN_GLUON_VIRTUEL(gluonD2); \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
INCR(compteur_de_STRONG_TRANSFORMATION_GxG___G,I); \
Eblock \
/* Vertex : GxG --> G. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R A C T I O N F O R T E ( " S T R O N G I N T E R A C T I O N " ) */
/* */
/* C O L L I S I O N S E N T R E P A R T I C U L E S : */
/* */
/*************************************************************************************************************************************/
DEFV(Local,DEFV(Float,INIT(voisinage_1_D1_D2,VOISINAGE_D_INTERACTION_1_POUR_2_PARTICULES)));
/* Distance en-dessous de laquelle 2 particules peuvent interagir dans tous les evenements */
/* de type 'COLLISION(...)' : */
/* */
/* STRONG_ABSORBTION_QxG___Q(...), */
/* STRONG_ABSORBTION_AQxG___AQ(...), */
/* STRONG_TRANSFORMATION_QxAQ___G(...). */
/* */
#define ADOLESCENCE_D_UNE_PARTICULE \
GRO4(FRA10(DIVI(VOISINAGE_D_INTERACTION_1_POUR_2_PARTICULES \
,MIN2(VITESSE_MOYENNE_DES_QUARKS_ET_DES_ANTI_QUARKS \
,VITESSE_DES_GLUONS \
) \
) \
) \
) \
/* Duree de l'adolescence d'une particule qui correspond a une periode au cours de laquelle */ \
/* elle ne peut rentrer en collision. La valeur implicite est choisie de facon telle qu'elle */ \
/* corresponde a une duree superieure a celle necessaire a s'echapper du voisinage d'une */ \
/* particule ; ceci permet d'eviter que des particules emises soient immediatement */ \
/* reabsorbee. Mais ATTENTION : il faut reduite cette duree par 'GRO4(FRA10(...))' car, en */ \
/* effet, une duree d'adolescence trop elevee fait qu'une particule risque de mourir avant */ \
/* d'avoir atteint cet age, et donc ne jamais pouvoir collisionner... */ \
/* */ \
/* ATTENTION : la valeur de 'ADOLESCENCE_D_UNE_PARTICULE' est plus grande dans le fichier */ \
/* '$xrq/di_elec.LH$I' que dans le fichier '$xrq/nucleon.LH$I', et ce afin de limiter au */ \
/* mieux l'absorbtion, par des electrons, des photons qu'ils viennent d'emettre... */
DEFV(Local,DEFV(Float,INIT(adolescence_d_une_particule,FLOT__UNDEF)));
/* Duree de l'adolescence d'une particule qui correspond a une periode au cours de laquelle */
/* elle ne peut rentrer en collision. La valeur implicite est choisie de facon telle qu'elle */
/* corresponde a une duree superieure a celle necessaire a s'echapper du voisinage d'une */
/* particule ; ceci permet d'eviter que des particules emises soient immediatement */
/* reabsorbee. L'initialisation a lieu dans 'DEBUT_DE_L_INITIALISATION_DE_L_UNIVERS' a */
/* cause du compilateur de 'SYSTEME_SG4D..._IRIX_CC' qui refuse d'initialiser cette */
/* variable avec l'expression 'ADOLESCENCE_D_UNE_PARTICULE' qui contient un 'MIN2(...)'... */
#define COLLISION(condition,probabilite_de_la_collision,evenement) \
Bblock \
Test(condition) \
Bblock \
DEFV(Float,INIT(probabilite_d_evenement_collisionnel,FLOT__UNDEF)); \
GENERATION_D_UNE_PROBABILITE_01(probabilite_d_evenement_collisionnel); \
/* Probabilite pour que la collision courante ait lieu... */ \
Test(IFLE(probabilite_d_evenement_collisionnel \
,REGUL9(probabilite_de_la_collision) \
) \
) \
Bblock \
BLOC(evenement); \
/* Lorsque toutes les conditions sont remplies, il y a interaction... */ \
Eblock \
ATes \
Bblock \
/* Lorsque toutes les conditions ('probabilite') ne sont pas remplies, rien ne se passe... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
/* Lorsque toutes les conditions ('condition') ne sont pas remplies, rien ne se passe... */ \
Eblock \
ETes \
Eblock \
/* Lorsqu'une collision a ete detectee, il faut verifier si les particules en cause */ \
/* remplissent un certain nombre de conditions pour pouvoir interagir... */
#ifdef __VERSION__LES_PARTICULES_REELLES_SONT_SOUMISES_A_L_INTERACTION_FORTE
# define COLLISION_EVENTUELLE_QxG \
Bblock \
COLLISION(IFET(IMEQ(NATURE(particuleD1) \
,QUARK_REEL \
,QUARK_VIRTUEL \
) \
,IFEQ(NATURE(particuleD2) \
,GLUON_VIRTUEL \
) \
) \
,probabilite_de_STRONG_ABSORBTION_QxG___Q \
,STRONG_ABSORBTION_QxG___Q(particuleD1,particuleD2,quarkA1); \
); \
Eblock \
/* Collision eventuelle du type : */ \
/* */ \
/* QxG --> Q */ \
/* */
# define COLLISION_EVENTUELLE_AQxG \
Bblock \
COLLISION(IFET(IMEQ(NATURE(particuleD1) \
,ANTI_QUARK_REEL \
,ANTI_QUARK_VIRTUEL \
) \
,IFEQ(NATURE(particuleD2) \
,GLUON_VIRTUEL \
) \
) \
,probabilite_de_STRONG_ABSORBTION_AQxG___AQ \
,STRONG_ABSORBTION_AQxG___AQ(particuleD1,particuleD2,anti_quarkA1); \
); \
Eblock \
/* Collision eventuelle du type : */ \
/* */ \
/* AQxG --> AQ */ \
/* */
#Aifdef __VERSION__LES_PARTICULES_REELLES_SONT_SOUMISES_A_L_INTERACTION_FORTE
# define COLLISION_EVENTUELLE_QxG \
Bblock \
COLLISION(IFET(IFEQ(NATURE(particuleD1) \
,QUARK_VIRTUEL \
) \
,IFEQ(NATURE(particuleD2) \
,GLUON_VIRTUEL \
) \
) \
,probabilite_de_STRONG_ABSORBTION_QxG___Q \
,STRONG_ABSORBTION_QxG___Q(particuleD1,particuleD2,quarkA1); \
); \
Eblock \
/* Collision eventuelle du type : */ \
/* */ \
/* QxG --> Q */ \
/* */
# define COLLISION_EVENTUELLE_AQxG \
Bblock \
COLLISION(IFET(IFEQ(NATURE(particuleD1) \
,ANTI_QUARK_VIRTUEL \
) \
,IFEQ(NATURE(particuleD2) \
,GLUON_VIRTUEL \
) \
) \
,probabilite_de_STRONG_ABSORBTION_AQxG___AQ \
,STRONG_ABSORBTION_AQxG___AQ(particuleD1,particuleD2,anti_quarkA1); \
); \
Eblock \
/* Collision eventuelle du type : */ \
/* */ \
/* AQxG --> AQ */ \
/* */
#Eifdef __VERSION__LES_PARTICULES_REELLES_SONT_SOUMISES_A_L_INTERACTION_FORTE
#define ___EVENEMENTS_COLLISIONNELS_POUR_2_PARTICULES \
Bblock \
DEFV(particule,POINTERs(particuleD1)); \
DEFV(particule,POINTERs(particuleD2)); \
/* Definition d'un ensemble de 2 particules en interaction... */ \
DEFV(Float,INIT(distance_D1_D2,FLOT__UNDEF)); \
/* Distance entre les 2 particules (D1,D2), et on notera la propriete triviale, mais */ \
/* essentielle suivante : */ \
/* */ \
/* distance(D1,D2) == distance(D2,D1). */ \
/* */ \
/* De plus, il serait possible d'optimiser en manipulant le carre des distances, mais il */ \
/* est plus physique de manipuler les distances elle-memes, et de plus le temps perdu a */ \
/* extraire les racines carrees est minime... */ \
ENSEMBLE_DES_PARTICULES(BLOC(VOISINAGE_D_UNE_PARTICULE(PARTICULE_COURANTE); \
/* Initialisation du detecteur de collisions a 2 particules. */ \
) \
); \
ENSEMBLE_DES_PARTICULES(BLOC(EGAL(particuleD1,PARTICULE_COURANTE); \
Test(IFGE(AGE(particuleD1),adolescence_d_une_particule)) \
Bblock \
/* Cas d'une particule assez agee : */ \
ENSEMBLE_DES_PARTICULES(BLOC(EGAL(particuleD2,PARTICULE_COURANTE); \
Test(IFET(IFNE(particuleD1,particuleD2) \
,IFGE(AGE(particuleD2) \
,adolescence_d_une_particule \
) \
) \
) \
/* Cas ou les deux particules sont distinctes et suffisamment agees : */ \
Bblock \
EGAL(distance_D1_D2 \
,pDISTANCE(particuleD1,particuleD2) \
); \
Test(IFLT(distance_D1_D2 \
,REGUL0(voisinage_1_D1_D2) \
) \
) \
/* Nota : a la place de 'REGUL0(...)', on pourrait utiliser 'REGUL9(...)'. */ \
Bblock \
/* Cas ou les deux particules sont suffisamment proches l'une de l'autre pour interagir : */ \
Test(IFLT(distance_D1_D2 \
,ASI2(particuleD1 \
,voisines \
,distance1 \
) \
) \
) \
Bblock \
EGAL(ASI2(particuleD1 \
,voisines \
,distance1 \
) \
,distance_D1_D2 \
); \
EGAL(ASI2(particuleD1 \
,voisines \
,voisine1 \
) \
,particuleD2 \
); \
EGAL(ASI2(particuleD1 \
,voisines \
,vide \
) \
,FAUX \
); \
/* Memorisation de la proximite D1 --> D2 (on notera que la relation D2 --> D1 ne sera */ \
/* memorisee que si D1 et D2 forment bien les 2 voisines les plus proches...). */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
/* Cas ou les deux particules sont trop eloignes, et ne peuvent interagir... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
/* Cas ou D1=D2... */ \
Eblock \
ETes \
) \
); \
Eblock \
ATes \
Bblock \
/* Cas d'une particule trop jeune, pas de collisions possibles pour elle... */ \
Eblock \
ETes \
) \
); \
ENSEMBLE_DES_PARTICULES(BLOC(EGAL(particuleD1,PARTICULE_COURANTE); \
Test(EST_FAUX(ASI2(particuleD1,voisines,vide))) \
/* Nota important : lors du processus qui va suivre, des particles vont etre crees, mais, */ \
/* pour elles, le test precedent est faux (voir 'VOISINAGE_D_UNE_PARTICULE(...)'). Donc */ \
/* ces particules ne seront pas manipulees en ce qui concerne les collisions... */ \
Bblock \
EGAL(particuleD2,ASI2(particuleD1,voisines,voisine1)); \
/* Recuperation d'un couple (D1,D2) de 2 particules voisines... */ \
COLLISION_EVENTUELLE_QxG; \
/* Vertex : QxG --> Q. */ \
/* Nota : le vertex GxQ --> Q est obligatoirement present dans la liste (voir la symetrie */ \
/* de 'distance_D1_D2'...). */ \
COLLISION_EVENTUELLE_AQxG; \
/* _ _ */ \
/* Vertex : QxG --> Q. */ \
/* _ _ */ \
/* Nota : le vertex GxQ --> Q est obligatoirement present dans la liste (voir la symetrie */ \
/* de 'distance_D1_D2'...). */ \
COLLISION(IFET(IFEQ(NATURE(particuleD1) \
,QUARK_VIRTUEL \
) \
,IFEQ(NATURE(particuleD2) \
,ANTI_QUARK_VIRTUEL \
) \
) \
,probabilite_de_STRONG_TRANSFORMATION_QxAQ___G \
,STRONG_TRANSFORMATION_QxAQ___G(particuleD1,particuleD2,gluonA1); \
); \
/* _ */ \
/* Vertex : QxQ --> G, */ \
/* _ */ \
/* Nota : le vertex QxQ --> G est obligatoirement present dans la liste (voir la symetrie */ \
/* de 'distance_D1_D2'...). */ \
/* */ \
/* ATTENTION : pour conserver les trois quarks REELs, on ne regarde pas si 'particuleD1' */ \
/* ou 'particuleD2' sont des quarks REELs ; le test 'COLLISION(...)' ci-dessus n'est donc */ \
/* fait que pour les 'QUARK_VIRTUEL' et les 'ANTI_QUARK_VIRTUEL'... */ \
COLLISION(IFET(IFEQ(NATURE(particuleD1) \
,GLUON_VIRTUEL \
) \
,IFEQ(NATURE(particuleD2) \
,GLUON_VIRTUEL \
) \
) \
,probabilite_de_STRONG_TRANSFORMATION_GxG___G \
,STRONG_TRANSFORMATION_GxG___G(particuleD1,particuleD2,gluonA1); \
); \
/* Vertex : GxG --> G. */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
) \
); \
Eblock \
/* Evenements collisionnels pour les ensembles de 2 particules voisines dans le proton. */
BFonctionI
DEFV(LoF,GENERE__Fonction__OPT(EVENEMENTS_COLLISIONNELS_POUR_2_PARTICULES,P2,___EVENEMENTS_COLLISIONNELS_POUR_2_PARTICULES))
EFonctionI
#define ___EVENEMENTS_COLLISIONNELS_POUR_3_PARTICULES \
Bblock \
PROCESSUS_INCOMPLET("evenements collisionnels pour les ensembles de 3 particules"); \
Eblock \
/* Evenements collisionnels pour les ensembles de 3 particules voisines dans le proton. */
BFonctionI
DEFV(LoF,GENERE__Fonction__OPT(EVENEMENTS_COLLISIONNELS_POUR_3_PARTICULES,P3,___EVENEMENTS_COLLISIONNELS_POUR_3_PARTICULES))
EFonctionI
#define ___EVENEMENTS_COLLISIONNELS_POUR_4_PARTICULES \
Bblock \
PROCESSUS_INCOMPLET("evenements collisionnels pour les ensembles de 4 particules"); \
Eblock \
/* Evenements collisionnels pour les ensembles de 4 particules voisines dans le proton. */
BFonctionI
DEFV(LoF,GENERE__Fonction__OPT(EVENEMENTS_COLLISIONNELS_POUR_4_PARTICULES,P4,___EVENEMENTS_COLLISIONNELS_POUR_4_PARTICULES))
EFonctionI
#define ___EVENEMENTS_COLLISIONNELS_POUR_LES_PARTICULES \
Bblock \
EVENEMENTS_COLLISIONNELS_POUR_4_PARTICULES; \
/* Les evenements a 4 particules etant les plus rares, ils sont testes en premier afin */ \
/* de ne pas etre masques par ceux a 3 et 2 particules... */ \
EVENEMENTS_COLLISIONNELS_POUR_3_PARTICULES; \
/* Evenements a 3 particules... */ \
EVENEMENTS_COLLISIONNELS_POUR_2_PARTICULES; \
/* Les evenements a 2 particules sont donc testes en dernier... */ \
Eblock \
/* Evenements collisionnels pour l'ensemble des particules presentes dans le proton, */ \
/* et correspondant, par exemple, a ce que j'appelerai, des collisions... */
BFonctionI
DEFV(LoF,GENERE__Fonction__OPT(EVENEMENTS_COLLISIONNELS_POUR_LES_PARTICULES,P,___EVENEMENTS_COLLISIONNELS_POUR_LES_PARTICULES))
EFonctionI