bool Perturbative_Interface::FillBlobs(ATOOLS::Blob_List *blobs) { if (p_hard==NULL) return false; Blob *sblob = new Blob(); sblob->SetType(btp::Shower); sblob->SetStatus(blob_status::needs_showers); sblob->SetId(); sblob->SetPosition(p_hard->Position()); if (p_shower->On()) { if (!p_hd) { for (int i(0);i<p_hard->NInP();++i) sblob->AddToOutParticles(p_hard->InParticle(i)); for (size_t j(0);j<blobs->size();++j) { Blob *cb((*blobs)[j]); if (cb->Has(blob_status::needs_showers)) for (int i(0);i<cb->NOutP();++i) if (cb->OutParticle(i)->DecayBlob()==NULL) sblob->AddToInParticles(cb->OutParticle(i)); } } else { for (int i(0);i<p_hard->NOutP();++i) { if (!(p_hard->OutParticle(i)->GetFlow(1)==0 && p_hard->OutParticle(i)->GetFlow(2)==0)) sblob->AddToInParticles(p_hard->OutParticle(i)); } } } blobs->push_back(sblob); p_shower->FillBlobs(blobs); return true; }
ATOOLS::Blob* Mixing_Handler::PerformMixing(Particle* decayer) const { // explicit mixing in event record Flavour flav = decayer->Flav(); string tag = flav.IsAnti() ? flav.Bar().IDName() : flav.IDName(); if(m_model("Mixing_"+tag,0.0)!=0.0 && decayer->Info()!=char('M')) { double t = DetermineMixingTime(decayer,true)/rpa->hBar(); if(t==0.0) return NULL; double factor = decayer->Flav().QOverP2(); if(decayer->Flav().IsAnti()) factor = 1.0/factor; double dG = decayer->Flav().DeltaGamma()*t/4.0; double dm = decayer->Flav().DeltaM()*t/2.0; Complex i(0.0,1.0); double prob_not_mix = sqr(abs(exp(i*dm)*exp(dG)+exp(-i*dm)*exp(-dG))); double prob_mix = factor*sqr(abs(exp(i*dm)*exp(dG)-exp(-i*dm)*exp(-dG))); if(prob_mix > ran->Get()*(prob_mix+prob_not_mix)) { if(decayer->DecayBlob()) { decayer->DecayBlob()->RemoveOwnedParticles(); delete decayer->DecayBlob(); } decayer->SetStatus(part_status::decayed); decayer->SetInfo('m'); Particle* mixed_part = new Particle(0, decayer->Flav().Bar(), decayer->Momentum(), 'M'); mixed_part->SetFinalMass(decayer->FinalMass()); mixed_part->SetStatus(part_status::active); mixed_part->SetTime(decayer->Time()); Blob* mixingblob = new Blob(); mixingblob->SetType(btp::Hadron_Mixing); mixingblob->SetId(); mixingblob->SetStatus(blob_status::inactive); mixingblob->SetTypeSpec("HADRONS"); mixingblob->AddToInParticles(decayer); mixingblob->AddToOutParticles(mixed_part); mixingblob->SetPosition(decayer->ProductionBlob()->Position()); mixingblob->SetStatus(blob_status::needs_hadrondecays); return mixingblob; } } return NULL; }