bool Soft_Cluster_Handler::ForceMomenta(Cluster_List * clin) { #ifdef AHAmomcheck Vec4D checkbef(SumMomentum(clin)); #endif size_t size(clin->size()); 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()); break; case 2: case 0: default: masses.push_back(cluster->Mass()); break; } momenta.push_back(cluster->Momentum()); } if (!hadpars->AdjustMomenta(size,&momenta.front(),&masses.front())) { return false; } int pos(0); for (Cluster_Iterator cit=clin->begin();cit!=clin->end();cit++) { cluster = (*cit); if (cluster->size()==1) cluster->SetFlav((*cluster)[0]); else cluster->RescaleMomentum(momenta[pos]); cluster->SetMomentum(momenta[pos]); pos++; } #ifdef AHAmomcheck Vec4D checkaft(SumMomentum(clin)); 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_Debugging()<<METHOD<<" conserves momentum : " <<(checkbef-checkaft).Abs2()<<"("<<size<<").\n"; #endif 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; }