bool Soft_Cluster_Handler:: AttachHadronsToBlob(Cluster_List * clin,Blob * blob) { Cluster_Iterator cit(clin->begin()); Particle * part; Cluster * cluster; while (cit!=clin->end()) { cluster = (*cit); switch (cluster->size()) { case 1: part = cluster->GetSelf(); part->SetFinalMass(); blob->AddToOutParticles(part); msg_Tracking()<<"$$ attach one hadron ("<<part->Flav()<<", " <<part->Momentum()<<", " <<"pt = "<<part->Momentum().PPerp()<<", " <<"y = "<<part->Momentum().Y()<<") " <<"from cluster "<<cluster->Number()<<", " <<"m = "<<cluster->Mass()<<".\n"; delete cluster->GetTrip(); delete cluster->GetAnti(); delete cluster; cit = clin->erase(cit); break; case 2: FixHHDecay(cluster,blob,(*cluster)[0],(*cluster)[1]); delete cluster->GetTrip(); delete cluster->GetAnti(); delete cluster; cit = clin->erase(cit); break; case 0: cit++; break; default: cit++; break; } } return true; }
bool Soft_Cluster_Handler::EnforcedTransition(Cluster_List * clin) { #ifdef AHAmomcheck Vec4D checkbef(SumMomentum(clin)); #endif size_t size(0); std::vector<double> masses; std::vector<Vec4D> momenta; Cluster * cluster; for (Cluster_Iterator cit=clin->begin();cit!=clin->end();cit++) { cluster = (*cit); switch (cluster->size()) { case 1: masses.push_back((*cluster)[0].HadMass()); momenta.push_back(cluster->Momentum()); ++size; break; case 2: case 0: masses.push_back(sqrt(Max(cluster->GetTrip()->m_mom.Abs2(),0.))); masses.push_back(sqrt(Max(cluster->GetAnti()->m_mom.Abs2(),0.))); momenta.push_back(cluster->GetTrip()->m_mom); momenta.push_back(cluster->GetAnti()->m_mom); size+=2; default: break; } } if (!hadpars->AdjustMomenta(size,&momenta.front(),&masses.front())) { if (size>1 /*&& msg->LevelIsDebugging()*/) { msg_Tracking()<<"Error in "<<METHOD<<" ("<<size<<" clusters) : \n" <<" Could not adjust momenta for : \n"; int i(0); for (Cluster_Iterator cit=clin->begin();cit!=clin->end();cit++) { msg_Tracking()<<"Mass/Mom = "<<masses[i]<<"/"<<momenta[i]; if ((*cit)->size()==1) msg_Tracking()<<" ("<<((**cit)[0])<<" )"; msg_Tracking()<<" for \n"<<(**cit)<<"\n"; i++; } msg_Tracking()<<" Will possibly lead to retrying the event.\n"; } return false; } int pos(0); #ifdef AHAmomcheck Vec4D checkaft(SumMomentum(clin)); #endif for (Cluster_Iterator cit=clin->begin();cit!=clin->end();cit++) { cluster = (*cit); switch (cluster->size()) { case 1: cluster->SetFlav((*cluster)[0]); cluster->SetMomentum(momenta[pos]); break; case 2: #ifdef AHAmomcheck checkaft += momenta[pos]; #endif cluster->GetTrip()->m_mom=momenta[pos++]; cluster->GetAnti()->m_mom=momenta[pos]; cluster->Update(); if (cluster->Mass()<(*cluster)[0].HadMass()+(*cluster)[1].HadMass()) { cluster->clear(); } break; case 0: cluster->GetTrip()->m_mom=momenta[pos++]; cluster->GetAnti()->m_mom=momenta[pos]; cluster->Update(); break; default: break; } pos++; } #ifdef AHAmomcheck double Q2(dabs((checkbef-checkaft).Abs2())); if (Q2>1.e-12 || IsNan(Q2)) { msg_tracking()<<METHOD<<" yields a momentum violation for "<<size<<" : \n" <<" "<<checkbef<<" - "<<checkaft<<" --> " <<(checkbef-checkaft).Abs2()<<"("<<size<<").\n" <<(*clin)<<"\n"; } else msg_Tracking()<<METHOD<<" satisfied four-momentum conservation.\n"; #endif m_transitions += 1; return true; }