Exemplo 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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
bool Soft_Cluster_Handler::CheckIfAllowed(Cluster_List * clin,double & E) {
  double totmass(0.);
  Vec4D  totmom(0.,0.,0.,0.);
  Cluster * cluster;
  for (Cluster_Iterator cit=clin->begin();cit!=clin->end();cit++) {
    cluster = (*cit);
    msg_Tracking()<<METHOD<<"("<<cluster->Number()<<").\n";
    switch (cluster->size()) {
    case 1: 
      totmass += (*cluster)[0].HadMass();
      break;
    case 2:
    case 0:
    default:
      totmass += cluster->Mass();
      break;
    }
    if (E<0) totmom += cluster->Momentum();
  }
  if (E<0) E = sqrt(totmom.Abs2());
  return (totmass<E);
}
Exemplo n.º 4
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;  
}