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; }
void Hard_Decay_Handler::CreateDecayBlob(ATOOLS::Particle* inpart) { DEBUG_FUNC(inpart->Flav()); if(inpart->DecayBlob()) THROW(fatal_error,"Decay blob already exists."); if(!Decays(inpart->Flav())) return; Blob* blob = p_bloblist->AddBlob(btp::Hard_Decay); blob->SetStatus(blob_status::needs_showers); blob->AddStatus(blob_status::needs_extraQED); blob->AddToInParticles(inpart); blob->SetTypeSpec("Sherpa"); Decay_Table* table=p_decaymap->FindDecay(blob->InParticle(0)->Flav()); if (table==NULL) { msg_Error()<<METHOD<<" decay table not found, retrying event."<<endl <<*blob<<endl; throw Return_Value::Retry_Event; } blob->AddData("dc",new Blob_Data<Decay_Channel*>(table->Select())); DEBUG_INFO("p_onshell="<<inpart->Momentum()); blob->AddData("p_onshell",new Blob_Data<Vec4D>(inpart->Momentum())); DEBUG_INFO("succeeded."); }
Return_Value::code Signal_Process_FS_QED_Correction::Treat (Blob_List * bloblist, double & weight) { if (!m_on) return Return_Value::Nothing; if (bloblist->empty()) { msg_Error()<<"Signal_Process_FS_QED_Correction::Treat" <<"("<<bloblist<<","<<weight<<"): "<<endl <<" Blob list contains "<<bloblist->size()<<" entries."<<endl <<" Continue and hope for the best."<<endl; return Return_Value::Error; } // look for QCD corrected hard process in need for QED Blob * sigblob(bloblist->FindLast(btp::Shower)); if (!sigblob) return Return_Value::Nothing; // if already treated -> nothing to do if (sigblob->TypeSpec()=="YFS-type_QED_Corrections_to_ME") return Return_Value::Nothing; if (sigblob->TypeSpec()=="setting_leptons_on-shell") return Return_Value::Nothing; // extract FS leptons // two vectors -> the ones from the blob and the ones to be massive DEBUG_FUNC(m_qed); Particle_Vector fslep(sigblob->GetOutParticles()); Particle_Vector mfslep; for (Particle_Vector::iterator it=fslep.begin();it!=fslep.end();) { if ((*it)->Flav().Strong() || (*it)->Flav().IsDiQuark() || (*it)->DecayBlob()!=NULL) { fslep.erase(it); } else { mfslep.push_back(new Particle(-1,(*it)->Flav(),(*it)->Momentum(),'F')); (*mfslep.rbegin())->SetNumber(0); (*mfslep.rbegin())->SetOriginalPart(*it); (*mfslep.rbegin())->SetFinalMass((*it)->FinalMass()); ++it; } } // if no leptons, nothing to do // if only one lepton, cannot do anything if (fslep.size()<2) { sigblob->UnsetStatus(blob_status::needs_extraQED); for (Particle_Vector::iterator it=mfslep.begin();it!=mfslep.end();++it) delete *it; return Return_Value::Nothing; } // if switched off or no need for QED stop here and build a blob if (!m_qed || !sigblob->Has(blob_status::needs_extraQED)) { Blob * onshellblob = bloblist->AddBlob(btp::QED_Radiation); onshellblob->SetTypeSpec("setting_leptons_on-shell"); if (sigblob->Has(blob_status::needs_extraQED)) sigblob->UnsetStatus(blob_status::needs_extraQED); for (Particle_Vector::iterator it=fslep.begin();it!=fslep.end();++it) { (*it)->SetInfo('H'); (*it)->SetStatus(part_status::decayed); onshellblob->AddToInParticles(*it); } for (Particle_Vector::iterator it=mfslep.begin();it!=mfslep.end();++it) { onshellblob->AddToOutParticles(*it); } onshellblob->SetStatus(blob_status::needs_hadronization); return Return_Value::Success; } // put them on-shell (spoils consistency of pertubative calculation, // but necessary for YFS) if (!PutOnMassShell(mfslep)) { msg_Error()<<"Signal_Process_FS_QED_Correction::Treat(" <<bloblist<<","<<weight<<"): \n" <<" Leptons could not be put on their mass shell.\n" <<" Trying new event.\n" <<" The event contained a "; for (Particle_Vector::iterator it=mfslep.begin();it!=mfslep.end();++it) msg_Error()<<(*it)->Flav().ShellName()<<"-"; if (mfslep.size()==2) msg_Error()<<"pair"; else msg_Error()<<"set"; msg_Error()<<" of too little invariant mass to be put\n" <<" on their mass shell. If you are sensitive to this specific" <<" signature consider\n to set the respective particles" <<" massive in the perturbative calculation using\n" <<" 'MASSIVE[<id>]=1' to avoid this problem.\n"; for (Particle_Vector::iterator it=mfslep.begin();it!=mfslep.end();++it) delete *it; return Return_Value::New_Event; } // build effective verteces for resonant production // use subprocess infos if possible Blob_Vector blobs = BuildResonantBlobs(mfslep); // add radiation for (Blob_Vector::iterator it=blobs.begin();it!=blobs.end();++it) { // do nothing if no resonance determined if ((*it)->InParticle(0)->Flav().Kfcode()!=kf_none) { (*it)->SetStatus(blob_status::needs_extraQED); if (!p_sphotons->AddRadiation(*it)) { msg_Error()<<"Signal_Process_FS_QED_Correction::Treat("<<bloblist <<","<<weight<<"): "<<endl <<" Higher order QED corrections failed."<<endl <<" Retrying event."<<endl; for (Particle_Vector::iterator it=mfslep.begin();it!=mfslep.end();++it) delete *it; for (Blob_Vector::iterator it=blobs.begin();it!=blobs.end();++it) delete *it; return Return_Value::Retry_Event; } } } for (Blob_Vector::iterator it=blobs.begin();it!=blobs.end();++it) { msg_Debugging()<<**it<<endl; (*it)->DeleteInParticles(); } sigblob->UnsetStatus(blob_status::needs_extraQED); // build new QED radiation blob Blob * QEDblob = bloblist->AddBlob(btp::QED_Radiation); QEDblob->SetTypeSpec("YFS-type_QED_Corrections_to_ME"); for (Particle_Vector::iterator it=fslep.begin();it!=fslep.end();++it) { // set info back to hard process, otherwise // check for momentum conservation does not work (*it)->SetInfo('H'); (*it)->SetStatus(part_status::decayed); QEDblob->AddToInParticles(*it); } // first fill in all LO particles for (Blob_Vector::iterator it=blobs.begin();it!=blobs.end();++it) { while ((*it)->NOutP() && (*it)->OutParticle(0)->Info()!='S') { Particle * part((*it)->RemoveOutParticle(0,true)); QEDblob->AddToOutParticles(part); } } // then append all photons for (Blob_Vector::iterator it=blobs.begin();it!=blobs.end();++it) { while ((*it)->NOutP()) { Particle * part((*it)->RemoveOutParticle(0,true)); QEDblob->AddToOutParticles(part); } } QEDblob->SetStatus(blob_status::needs_hadronization); for (size_t i=0;i<blobs.size();++i) { delete blobs[i]; blobs[i]=NULL; } return Return_Value::Success; }