1 #ifndef DataFormats_EventHypothesis_interface_EventHypothesisLooper_h
2 #define DataFormats_EventHypothesis_interface_EventHypothesisLooper_h
9 namespace eventhypothesis {
28 cachePtr_ =
dynamic_cast<const T *
>(ptr);
35 if ((ptr !=
nullptr) && (cachePtr_ ==
nullptr))
37 <<
"You can't convert a " <<
typeid(*ptr).name() <<
" to a " <<
typeid(
T).
name() <<
"\n"
38 <<
"note: you can use c++filt command to convert the above in human readable types.\n";
69 const T *
get()
const {
return ptr_.get(
iter_->second.get()); }
104 operator bool()
const;
107 template <
typename T2>
109 return iter_ == other.iter_;
111 template <
typename T2>
113 return iter_ != other.iter_;
115 template <
typename T2>
116 bool operator<=(const Looper<T2> &other)
const {
117 return iter_ <= other.iter_;
119 template <
typename T2>
121 return iter_ >= other.iter_;
123 template <
typename T2>
124 bool operator<(const Looper<T2> &other)
const {
125 return iter_ < other.iter_;
127 template <
typename T2>
129 return iter_ > other.iter_;
151 template <
typename T>
157 template <
typename T>
162 template <
typename T>
164 : eh_(eh), filter_(filter), total_(-1) {
168 template <
typename T>
170 assert(iter_ <= eh_.end());
171 assert((iter_ + 1) >= eh_.begin());
172 assert((iter_ < eh_.begin()) || (iter_ == eh_.end()) || ((*filter_)(*iter_)));
176 template <
typename T>
180 if (iter_ == eh_.end())
184 if (iter_ == eh_.end())
186 if ((*filter_)(*iter_)) {
195 template <
typename T>
203 if (iter_ < eh_.begin()) {
207 if ((*filter_)(*iter_)) {
217 template <
typename T>
220 std::advance(
this, delta);
225 template <
typename T>
230 std::advance(
this, item);
234 std::advance(
this, item);
240 template <
typename T>
245 for (; iter_ != eh_.end(); ++iter_) {
246 if ((*filter_)(*iter_))
252 template <
typename T>
254 return (iter_ < eh_.end()) && (iter_ >= eh_.begin());
257 template <
typename T>
260 if (it < eh_.begin()) {
266 for (; it != eh_.end(); ++it) {
Looper & reset(int item=0)
const T * get(const reco::Candidate *ptr)
Looper & operator++()
iteration
bool isTypeOk() const
test if the type is correct
const T * operator->() const
Accessor as if it was a const_iterator on a list of T.
bool typeOk(const reco::Candidate *ptr)
bool typeOk(const reco::Candidate *ptr)
const CandRefType & ref() const
EDM Ref to pointed particle.
bool operator!=(const Looper< T2 > &other) const
Looper & operator--()
iteration
Looper(const EventHypothesis &eh, const ParticleFilter &filter)
bool operator==(const Looper< T2 > &other) const
returns true if loopers point to the same record
size_t globalIndex()
Index of this item in the full EventHypothesis.
const reco::Candidate & cand() const
C++ reference to pointed particle.
void operator()(void const *) const
const std::string & role() const
Role of pointed item.
size_t index() const
Index of this item among those in the loop.
const T & operator*() const
Accessor as if it was a const_iterator on a list of T.
void doPtr(const reco::Candidate *ptr)
EventHypothesis::const_iterator const_iterator
vector_type::const_iterator const_iterator
bool operator>=(const Looper< T2 > &other) const
Looper & skip(int delta)
skip (might be slow)
Looper< reco::Candidate > CandLooper
const ParticleFilterPtr filter_
const EventHypothesis & eh_
const_iterator begin() const
bool operator>(const Looper< T2 > &other) const
size_t size() const
Number of particles in the loop.
std::shared_ptr< const ParticleFilter > ParticleFilterPtr