Blob_List* GenerateEvent() { Blob_List* blobs = new Blob_List(); Particle* mother_part = new Particle( 1,mother_flav,Vec4D(mother_flav.HadMass(),0.,0.,0.) ); mother_part->SetTime(); mother_part->SetFinalMass(mother_flav.HadMass()); Blob* blob = blobs->AddBlob(btp::Hadron_Decay); blob->SetStatus(blob_status::needs_hadrondecays); blob->AddToInParticles(mother_part); try { hadrons->FillOnshellDecay(blob, NULL); } catch (Return_Value::code ret) { msg_Error()<<METHOD<<" Something went wrong for event: "<<*blobs <<endl; return blobs; } hadrons->CleanUp(); msg_Events()<<*blobs<<std::endl; return blobs; }
bool Amisic::GenerateHardEvent(ATOOLS::Blob_List *blobs) { p_hardbase->Reset(); while (true) { Blob *newblob = new Blob(); if (GenerateHardProcess(newblob)) { newblob->SetType(btp::Hard_Collision); newblob->SetStatus(blob_status::needs_showers & blob_status::needs_beams & blob_status::needs_hadronization); newblob->SetId(); blobs->push_back(newblob); } else { delete newblob; if (MI_Base::StopGeneration(MI_Base::HardEvent)) return true; msg_Tracking()<<"Amisic::GenerateHardEvent(): " <<"Cannot create hard underlying event."<<std::endl <<" Abort attempt."<<std::endl; return false; } } return true; }
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; }