1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#ifndef DataFormats_TrackReco_TrackExtraBase_h
#define DataFormats_TrackReco_TrackExtraBase_h
/** \class reco::TrackExtraBase TrackExtraBase.h DataFormats/TrackReco/interface/TrackExtraBase.h
*
* Basic extension of a reconstructed Track.
* Contains references to the hits assigned to the track.
*
* If you access the hits, check if they are valid or not. (Invalid hits are dummy hits
* created in layers crossed by the track, where no physical hit was found).
*
* \author Luca Lista, INFN
*
*
*/
#include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
#include "DataFormats/TrajectoryState/interface/LocalTrajectoryParameters.h"
namespace reco {
class TrackExtraBase {
public:
using TrajParams = std::vector<LocalTrajectoryParameters>;
using Chi2sFive = std::vector<unsigned char>;
/// default constructor
TrackExtraBase() : m_firstHit((unsigned int)-1), m_nHits(0) {}
void setHits(TrackingRecHitRefProd const& prod, unsigned firstH, unsigned int nH) {
m_hitCollection.pushBackItem(prod.refCore(), true);
m_firstHit = firstH;
m_nHits = nH;
}
void setTrajParams(TrajParams tmps, Chi2sFive chi2s) {
m_trajParams = std::move(tmps);
m_chi2sX5 = std::move(chi2s);
}
unsigned int firstRecHit() const { return m_firstHit; }
/// number of RecHits
unsigned int recHitsSize() const { return m_nHits; }
/// accessor to RecHits
auto recHits() const { return TrackingRecHitRange(recHitsBegin(), recHitsEnd()); }
/// first iterator over RecHits
trackingRecHit_iterator recHitsBegin() const { return recHitsProduct().data().begin() + firstRecHit(); }
/// last iterator over RecHits
trackingRecHit_iterator recHitsEnd() const { return recHitsBegin() + recHitsSize(); }
/// get a ref to i-th recHit
TrackingRecHitRef recHitRef(unsigned int i) const {
//Another thread might change the RefCore at the same time.
// By using a copy we will be safe.
edm::RefCore hitCollection(m_hitCollection);
if (hitCollection.productPtr()) {
TrackingRecHitRef::finder_type finder;
TrackingRecHitRef::value_type const* item =
finder(*(static_cast<TrackingRecHitRef::product_type const*>(hitCollection.productPtr())), m_firstHit + i);
return TrackingRecHitRef(hitCollection.id(), item, m_firstHit + i);
}
return TrackingRecHitRef(hitCollection, m_firstHit + i);
}
/// get i-th recHit
TrackingRecHitRef recHit(unsigned int i) const { return recHitRef(i); }
TrackingRecHitCollection const& recHitsProduct() const {
return *edm::getProduct<TrackingRecHitCollection>(m_hitCollection);
}
TrajParams const& trajParams() const { return m_trajParams; }
Chi2sFive const& chi2sX5() const { return m_chi2sX5; }
// Check validity of track rechits
bool recHitsOk() const { return m_hitCollection.isNonnull() && m_hitCollection.isAvailable(); }
private:
edm::RefCore m_hitCollection;
unsigned int m_firstHit;
unsigned int m_nHits;
TrajParams m_trajParams;
Chi2sFive m_chi2sX5; // chi2 * 5 chopped at 255 (max chi2 is 51)
};
} // namespace reco
#endif // DataFormats_TrackReco_TrackExtraBase_h
|