ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/IPHCalignment2/TrackingTools/PatternTools/src/TempTrajectory.cc
Revision: 1.1
Committed: Fri Nov 25 16:38:25 2011 UTC (13 years, 5 months ago) by econte
Content type: text/plain
Branch: MAIN
CVS Tags: TBD2011, TBD_2011, HEAD
Log Message:
new IPHC alignment

File Contents

# Content
1 #include "TrackingTools/PatternTools/interface/TempTrajectory.h"
2 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
3 #include "FWCore/Utilities/interface/Exception.h"
4
5 #include <ext/slist>
6
7 TempTrajectory::TempTrajectory( const Trajectory& traj):
8 theSeed( traj.sharedSeed() ),
9 theChiSquared(0),
10 theNumberOfFoundHits(0), theNumberOfLostHits(0),
11 theDirection(traj.direction()), theDirectionValidity(true),
12 theValid(traj.isValid()) {
13
14 Trajectory::DataContainer::const_iterator begin=traj.measurements().begin();
15 Trajectory::DataContainer::const_iterator end=traj.measurements().end();
16
17 for(Trajectory::DataContainer::const_iterator it=begin; it!=end; ++it){
18 push(*it);
19 }
20
21 }
22
23 TempTrajectory::~TempTrajectory() {}
24
25 void TempTrajectory::pop() {
26 if (!empty()) {
27 if (theData.back().recHit()->isValid()) theNumberOfFoundHits--;
28 else if(lost(* (theData.back().recHit()) )) theNumberOfLostHits--;
29 theData.pop_back();
30 }
31 }
32
33 void TempTrajectory::push( const TrajectoryMeasurement& tm) {
34 push( tm, tm.estimate());
35 }
36
37 #if defined( __GXX_EXPERIMENTAL_CXX0X__)
38 void TempTrajectory::push( TrajectoryMeasurement&& tm) {
39 push( std::forward<TrajectoryMeasurement>(tm), tm.estimate());
40 }
41 #endif
42
43 void TempTrajectory::push( const TrajectoryMeasurement& tm, double chi2Increment){
44 pushAux(tm,chi2Increment);
45 theData.push_back(tm);
46 }
47
48 #if defined( __GXX_EXPERIMENTAL_CXX0X__)
49 void TempTrajectory::push(TrajectoryMeasurement&& tm, double chi2Increment){
50 pushAux(tm,chi2Increment);
51 theData.push_back(std::move(tm));
52 }
53 #endif
54
55 void TempTrajectory::pushAux( const TrajectoryMeasurement& tm, double chi2Increment)
56 {
57 if ( tm.recHit()->isValid()) {
58 theNumberOfFoundHits++;
59 }
60 //else if (lost( tm.recHit()) && !inactive(tm.recHit().det())) theNumberOfLostHits++;
61 else if (lost( *(tm.recHit()) ) ) theNumberOfLostHits++;
62
63
64 theChiSquared += chi2Increment;
65
66 // in case of a Trajectory constructed without direction,
67 // determine direction from the radii of the first two measurements
68
69 if ( !theDirectionValidity && theData.size() >= 2) {
70 if (theData.front().updatedState().globalPosition().perp() <
71 theData.back().updatedState().globalPosition().perp())
72 theDirection = alongMomentum;
73 else theDirection = oppositeToMomentum;
74 theDirectionValidity = true;
75 }
76 }
77
78 void TempTrajectory::push( const TempTrajectory& segment) {
79 assert (segment.direction() == theDirection) ;
80 __gnu_cxx::slist<const TrajectoryMeasurement*> list;
81 for (DataContainer::const_iterator it = segment.measurements().rbegin(), ed = segment.measurements().rend(); it != ed; --it) {
82 list.push_front(&(*it));
83 }
84 for(__gnu_cxx::slist<const TrajectoryMeasurement*>::const_iterator it = list.begin(), ed = list.end(); it != ed; ++it) {
85 push(**it);
86 }
87 }
88
89 void TempTrajectory::join( TempTrajectory& segment) {
90 assert (segment.direction() == theDirection) ;
91 if (segment.theData.shared()) {
92 push(segment);
93 segment.theData.clear(); // obey the contract, and increase the chances it will be not shared one day
94 } else {
95 for (DataContainer::const_iterator it = segment.measurements().rbegin(), ed = segment.measurements().rend(); it != ed; --it) {
96 if ( it->recHit()->isValid()) theNumberOfFoundHits++;
97 else if (lost( *(it->recHit()) ) ) theNumberOfLostHits++;
98 theChiSquared += it->estimate();
99 }
100 theData.join(segment.theData);
101
102 if ( !theDirectionValidity && theData.size() >= 2) {
103 if (theData.front().updatedState().globalPosition().perp() <
104 theData.back().updatedState().globalPosition().perp())
105 theDirection = alongMomentum;
106 else theDirection = oppositeToMomentum;
107 theDirectionValidity = true;
108 }
109 }
110 }
111
112
113 /*
114 Trajectory::RecHitContainer Trajectory::recHits() const {
115 RecHitContainer hits;
116 hits.reserve(theData.size());
117
118 for (Trajectory::DataContainer::const_iterator itm
119 = theData.begin(); itm != theData.end(); itm++) {
120 hits.push_back((*itm).recHit());
121 }
122 return hits;
123 }
124
125 */
126
127 PropagationDirection TempTrajectory::direction() const {
128 if (theDirectionValidity) return theDirection;
129 else throw cms::Exception("TrackingTools/PatternTools","Trajectory::direction() requested but not set");
130 }
131
132 void TempTrajectory::check() const {
133 if ( theData.size() == 0)
134 throw cms::Exception("TrackingTools/PatternTools","Trajectory::check() - information requested from empty Trajectory");
135 }
136
137 bool TempTrajectory::lost( const TransientTrackingRecHit& hit)
138 {
139 if ( hit.isValid()) return false;
140 else {
141 // // A DetLayer is always inactive in this logic.
142 // // The DetLayer is the Det of an invalid RecHit only if no DetUnit
143 // // is compatible with the predicted state, so we don't really expect
144 // // a hit in this case.
145
146 if(hit.geographicalId().rawId() == 0) {return false;}
147 else{
148 return hit.getType() == TrackingRecHit::missing;
149 }
150 }
151 }
152
153 Trajectory TempTrajectory::toTrajectory() const {
154 Trajectory traj(theSeed, theDirection);
155
156 traj.reserve(theData.size());
157 static std::vector<const TrajectoryMeasurement*> work;
158 work.resize(theData.size(), 0);
159 std::vector<const TrajectoryMeasurement*>::iterator workend = work.end(), itwork = workend;
160 for (TempTrajectory::DataContainer::const_iterator it = theData.rbegin(), ed = theData.rend(); it != ed; --it) {
161 --itwork; *itwork = (&(*it));
162 }
163 for (; itwork != workend; ++itwork) {
164 traj.push(**itwork);
165 }
166 return traj;
167 }
168