Esempio n. 1
0
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;
}
Esempio n. 2
0
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;  
}