31 #ifndef __FASTJET_CLUSTERSEQUENCEACTIVEAREAEXPLICITGHOSTS_HH_ 
   32 #define __FASTJET_CLUSTERSEQUENCEACTIVEAREAEXPLICITGHOSTS_HH_  
   34 #include "fastjet/PseudoJet.hh" 
   35 #include "fastjet/ClusterSequenceAreaBase.hh" 
   36 #include "fastjet/GhostedAreaSpec.hh" 
   37 #include "fastjet/LimitedWarning.hh" 
   42 FASTJET_BEGIN_NAMESPACE      
 
   63          (
const std::vector<L> & pseudojets, 
 
   66           const bool & writeout_combinations = 
false) 
 
   68            std::vector<L> * ghosts = NULL;
 
   69            _initialise(pseudojets,jet_def_in,&ghost_spec,ghosts,0.0,
 
   70                        writeout_combinations); }
 
   73          (
const std::vector<L> & pseudojets, 
 
   75           const std::vector<L> & ghosts,
 
   77           const bool & writeout_combinations = 
false) 
 
   80            _initialise(pseudojets,jet_def_in,ghost_spec,&ghosts,ghost_area,
 
   81                        writeout_combinations); }
 
   85   template<
class L> 
void _initialise
 
   86          (
const std::vector<L> & pseudojets, 
 
   87           const JetDefinition & jet_def_in,
 
   88           const GhostedAreaSpec * ghost_spec,
 
   89           const std::vector<L> * ghosts,
 
   91           const bool & writeout_combinations); 
 
   96   unsigned int n_hard_particles() 
const;
 
   99   virtual double area (
const PseudoJet & jet) 
const FASTJET_OVERRIDE;
 
  105   virtual PseudoJet area_4vector (
const PseudoJet & jet) 
const FASTJET_OVERRIDE;
 
  108   virtual bool is_pure_ghost(
const PseudoJet & jet) 
const FASTJET_OVERRIDE;
 
  113   bool is_pure_ghost(
int history_index) 
const;
 
  122   virtual double empty_area(
const Selector & selector) 
const FASTJET_OVERRIDE;
 
  125   double total_area () 
const;
 
  143   std::vector<bool> _is_pure_ghost;
 
  144   std::vector<double> _areas;
 
  145   std::vector<PseudoJet> _area_4vectors;
 
  148   double _max_ghost_perp2;
 
  149   bool   _has_dangerous_particles; 
 
  156   unsigned int _initial_hard_n;
 
  163   template<
class L> 
void _add_ghosts (
 
  164           const std::vector<L> & ghosts,
 
  170   void _post_process();
 
  178 template<
class L> 
void ClusterSequenceActiveAreaExplicitGhosts::_initialise
 
  179          (
const std::vector<L> & pseudojets, 
 
  182           const std::vector<L> * ghosts,
 
  184           const bool & writeout_combinations) {
 
  191   for (
unsigned int i = 0; i < pseudojets.size(); i++) {
 
  194     _jets.push_back(mom);
 
  195     _is_pure_ghost.push_back(
false);
 
  198   _initial_hard_n = _jets.size();
 
  200   if (ghost_spec != NULL) {
 
  202     _jets.reserve((_jets.size()+ghost_spec->n_ghosts()));
 
  203     _add_ghosts(*ghost_spec);
 
  205     _jets.reserve(_jets.size()+ghosts->size());
 
  206     _add_ghosts(*ghosts, ghost_area);
 
  209   if (writeout_combinations) {
 
  210     std::cout << 
"# Printing particles including ghosts\n";
 
  211     for (
unsigned j = 0; j < _jets.size(); j++) {
 
  212       printf(
"%5u %20.13f %20.13f %20.13e\n",
 
  213                j,_jets[j].rap(),_jets[j].phi_02pi(),_jets[j].kt2());
 
  215     std::cout << 
"# Finished printing particles including ghosts\n";
 
  221   _jets.reserve(_jets.size()*2); 
 
  224   _initialise_and_run(jet_def_in,writeout_combinations);
 
  231 inline unsigned int ClusterSequenceActiveAreaExplicitGhosts::n_hard_particles()
 const {
return _initial_hard_n;}
 
  236 template<
class L> 
void ClusterSequenceActiveAreaExplicitGhosts::_add_ghosts (
 
  237           const std::vector<L> & ghosts,
 
  241   for (
unsigned i = 0; i < ghosts.size(); i++) {
 
  242     _is_pure_ghost.push_back(
true);
 
  243     _jets.push_back(ghosts[i]);
 
  246   _ghost_area = ghost_area;
 
  247   _n_ghosts   = ghosts.size();
 
  251 FASTJET_END_NAMESPACE
 
  253 #endif // __FASTJET_CLUSTERSEQUENCEACTIVEAREAEXPLICITGHOSTS_HH_