001 #include "GaudiKernel/ToolFactory.h"
002 #include "GaudiKernel/SmartDataPtr.h"
003 #include "GaudiKernel/IDataProviderSvc.h"
004
005
006 #include "CLHEP/Matrix/SymMatrix.h"
007
008 #include "TrkMeasurementBase/MeasurementBase.h"
009 #include "TrkParameters/MeasuredPerigee.h"
010 #include "Identifier/Identifier.h"
011
012 #include "TrkTrack/TrackInfo.h"
013
014
015 #include "TrkTrack/Track.h"
016 #include "TrkParameters/Perigee.h"
017 #include "TrkEventPrimitives/FitQuality.h"
018
019
020 #include "STACOTools/StacoToTrackTool.h"
021
022
023 Trk::StacoToTrackTool::StacoToTrackTool(const std::string& t,
024 const std::string& n,
025 const IInterface* p ):AthAlgTool(t,n,p)
026 {
027 declareInterface<IStacoToTrackTool>(this);
028
029 declareProperty("AddIDRots" , m_AddIDRots = 1 ) ;
030 declareProperty("AddMuonSystemRots" , m_AddMuonSystemRots = 1 ) ;
031 declareProperty("AddRotsMethods" , m_AddRotsMethods = 1 ) ;
032
033 }
034
035 Trk::StacoToTrackTool::~StacoToTrackTool(){}
036
037
038 StatusCode Trk::StacoToTrackTool::initialize()
039 {
040
041
042 StatusCode sc ;
043
044 sc = AthAlgTool::initialize();
045 if ( sc.isFailure() ) {
046 msg(MSG::FATAL) << " AthAlgTool::initialize() failed" << endreq;
047 return( StatusCode::FAILURE );
048 }
049
050
051
052 msg(MSG::INFO) << "================================" << endreq;
053 msg(MSG::INFO) << "=Proprieties are " << endreq;
054 msg(MSG::INFO) << "= AddIDRots " << m_AddIDRots << endreq;
055 msg(MSG::INFO) << "= AddMuonSystemRots " << m_AddMuonSystemRots << endreq;
056 msg(MSG::INFO) << "= AddRotsMethods " << m_AddRotsMethods << endreq;
057 msg(MSG::INFO) << "================================" << endreq;
058
059 return StatusCode::SUCCESS;
060
061 }
062
063 StatusCode Trk::StacoToTrackTool::finalize(){return StatusCode::SUCCESS;}
064
065
066
067
068 Trk::Track* Trk::StacoToTrackTool::convert(StacoObject& aStacoObject){
069
070 DataVector<const Trk::TrackStateOnSurface>* trackStateOnSurfaces = convertStateOnSurface( aStacoObject);
071
072 const Trk::FitQuality* fitQuality = convertFitQuality( aStacoObject );
073
074 TrackInfo aTrackInfo(Trk::TrackInfo::Unknown, Trk::muon) ;
075 aTrackInfo.setPatternRecognitionInfo( Trk::TrackInfo::STACO );
076
077 if ( (((aStacoObject.MuSpectro())->originalTrack())->info()).patternRecoInfo(Trk::TrackInfo::ReverseOrderedTrack) ){
078 aTrackInfo.setPatternRecognitionInfo( Trk::TrackInfo::ReverseOrderedTrack);
079 }
080 if ( (((aStacoObject.MuSpectro())->originalTrack())->info()).patternRecoInfo(Trk::TrackInfo::MuonNotHittingTileVolume) ){
081 aTrackInfo.setPatternRecognitionInfo( Trk::TrackInfo::MuonNotHittingTileVolume);
082 }
083
084 return new Trk::Track(aTrackInfo, trackStateOnSurfaces, fitQuality);
085
086 }
087
088 DataVector<const Trk::TrackStateOnSurface>*
089 Trk::StacoToTrackTool::convertStateOnSurface(StacoObject& aStacoObject){
090
091 DataVector<const Trk::TrackStateOnSurface>* trackStateOnSurfaces = new DataVector<const Trk::TrackStateOnSurface>;
092
093 const Trk::Perigee* perigee = convertPerigee(aStacoObject);
094
095 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> pattern(0);
096 pattern.set(Trk::TrackStateOnSurface::Perigee);
097 const Trk::TrackStateOnSurface* trackStateOnSurface = new TrackStateOnSurface(0 , perigee, 0, 0, pattern );
098
099 trackStateOnSurfaces->push_back( trackStateOnSurface );
100
101 AddRotToss(trackStateOnSurfaces,aStacoObject);
102
103 return trackStateOnSurfaces;
104
105 }
106 void
107 Trk::StacoToTrackTool::AddRotToss(
108 DataVector<const Trk::TrackStateOnSurface>* pTrackStateOnSurfaceS,
109 StacoObject& aStacoObject){
110
111 if ( m_AddIDRots == 1){
112 const Rec::TrackParticle* pTP_MuIdet = aStacoObject.MuIdet();
113 if ( pTP_MuIdet != 0 ) AddRotToss( pTrackStateOnSurfaceS , pTP_MuIdet->originalTrack() );
114 }
115
116 if ( m_AddMuonSystemRots == 1){
117
118 const Rec::TrackParticle* pTP_MuSpectroMSOnly = aStacoObject.MuSpectro();
119 if ( pTP_MuSpectroMSOnly != 0 ) AddRotToss( pTrackStateOnSurfaceS , pTP_MuSpectroMSOnly->originalTrack() );
120 }
121
122 }
123 void
124 Trk::StacoToTrackTool::AddRotToss(
125 DataVector<const Trk::TrackStateOnSurface>* pTrackStateOnSurfaceS,
126 const Trk::Track* pTrkTrack){
127
128 if (pTrkTrack != 0){
129 if (m_AddRotsMethods == 0 ) AddRotTossMeasurementBase( pTrackStateOnSurfaceS , pTrkTrack );
130 if (m_AddRotsMethods == 1 ) AddRotTossClonedTSOS( pTrackStateOnSurfaceS , pTrkTrack );
131 }
132
133 }
134 void
135 Trk::StacoToTrackTool::AddRotTossMeasurementBase(
136 DataVector<const Trk::TrackStateOnSurface>* pTrackStateOnSurfaceS,
137 const Trk::Track* pTrkTrack){
138
139 if (pTrkTrack != 0){
140 if (pTrkTrack->trackStateOnSurfaces() != 0){
141 DataVector<const Trk::TrackStateOnSurface>::const_iterator TrackStateOnSurfaceCurrent = pTrkTrack->trackStateOnSurfaces()->begin();
142 DataVector<const Trk::TrackStateOnSurface>::const_iterator TrackStateOnSurfaceCurrentEnd = pTrkTrack->trackStateOnSurfaces()->end();
143 for ( ; TrackStateOnSurfaceCurrent!=TrackStateOnSurfaceCurrentEnd; ++TrackStateOnSurfaceCurrent){
144 if ( (*TrackStateOnSurfaceCurrent) != 0 ){
145
146 if ( (*TrackStateOnSurfaceCurrent)->type(Trk::TrackStateOnSurface::Measurement) ) {
147 const Trk::MeasurementBase* pMeasurementBase = (*TrackStateOnSurfaceCurrent)->measurementOnTrack();
148 if (pMeasurementBase!=0) {
149 const Trk::MeasurementBase* pMeasurementBaseClone = ((*TrackStateOnSurfaceCurrent)->measurementOnTrack())->clone();
150 const TrackParameters* pTrackParameters = 0 ;
151 const FitQualityOnSurface* pFitQualityOnSurface = 0 ;
152
153 const Trk::TrackStateOnSurface* pTrackStateOnSurface = 0 ;
154 TrackStateOnSurface::TrackStateOnSurfaceType aTrackStateOnSurfaceType = TrackStateOnSurface::Measurement;
155
156 pTrackStateOnSurface = new TrackStateOnSurface(pMeasurementBaseClone, pTrackParameters, pFitQualityOnSurface, 0 , aTrackStateOnSurfaceType);
157 pTrackStateOnSurfaceS->push_back( pTrackStateOnSurface );
158 }
159 }
160 }
161 }
162 }
163 }
164
165 }
166 void
167 Trk::StacoToTrackTool::AddRotTossClonedTSOS(
168 DataVector<const Trk::TrackStateOnSurface>* pTrackStateOnSurfaceS,
169 const Trk::Track* pTrkTrack){
170
171 if (pTrkTrack != 0){
172 if (pTrkTrack->trackStateOnSurfaces() != 0){
173 DataVector<const Trk::TrackStateOnSurface>::const_iterator TrackStateOnSurfaceCurrent = pTrkTrack->trackStateOnSurfaces()->begin();
174 DataVector<const Trk::TrackStateOnSurface>::const_iterator TrackStateOnSurfaceCurrentEnd = pTrkTrack->trackStateOnSurfaces()->end();
175 for ( ; TrackStateOnSurfaceCurrent!=TrackStateOnSurfaceCurrentEnd; ++TrackStateOnSurfaceCurrent){
176 if ( (*TrackStateOnSurfaceCurrent) != 0 ){
177
178 if ( (*TrackStateOnSurfaceCurrent)->type(Trk::TrackStateOnSurface::Measurement) ) {
179 const Trk::MeasurementBase* pMeasurementBase = (*TrackStateOnSurfaceCurrent)->measurementOnTrack();
180 if (pMeasurementBase!=0) {
181 const Trk::MeasuredTrackParameters* pMeasuredTrackParameters = dynamic_cast<const Trk::MeasuredTrackParameters*>((*TrackStateOnSurfaceCurrent)->trackParameters());
182 if (pMeasuredTrackParameters){
183 const Trk::MeasurementBase* pMeasurementBaseClone = ((*TrackStateOnSurfaceCurrent)->measurementOnTrack())->clone();
184 const TrackParameters* pTrackParameters = 0 ;
185 const FitQualityOnSurface* pFitQualityOnSurface = 0 ;
186
187 const Trk::TrackStateOnSurface* pTrackStateOnSurface = 0 ;
188 TrackStateOnSurface::TrackStateOnSurfaceType aTrackStateOnSurfaceType = TrackStateOnSurface::Measurement;
189
190 pTrackStateOnSurface = new TrackStateOnSurface(pMeasurementBaseClone, pTrackParameters, pFitQualityOnSurface, 0 , aTrackStateOnSurfaceType);
191 pTrackStateOnSurfaceS->push_back( pTrackStateOnSurface );
192 }else{
193 pTrackStateOnSurfaceS->push_back( (*TrackStateOnSurfaceCurrent)->clone() );
194 }
195 }
196 }
197
198 if ( (*TrackStateOnSurfaceCurrent)->type(Trk::TrackStateOnSurface::Hole) ) {
199 pTrackStateOnSurfaceS->push_back( (*TrackStateOnSurfaceCurrent)->clone() );
200 }
201
202 if ( (*TrackStateOnSurfaceCurrent)->type(Trk::TrackStateOnSurface::Scatterer) ) {
203 pTrackStateOnSurfaceS->push_back( (*TrackStateOnSurfaceCurrent)->clone() );
204 }
205 }
206 }
207 }
208 }
209
210 }
211
212
213
214
215 const Trk::Perigee*
216 Trk::StacoToTrackTool::convertPerigee(StacoObject& aStacoObject) {
217
218 double parcomb[5];
219
220 parcomb[0]=aStacoObject.Param1();
221 parcomb[1]=aStacoObject.Param2();
222 parcomb[2]=aStacoObject.Param3();
223 parcomb[3]=aStacoObject.Param4();
224 parcomb[4]=aStacoObject.Param5();
225
226
227
228 Trk::CovarianceMatrix *StacoCovMat = new Trk::CovarianceMatrix(5);
229
230 StacoCovMat->fast(1,1) = aStacoObject.Cov11();
231 StacoCovMat->fast(2,1) = aStacoObject.Cov21();
232 StacoCovMat->fast(2,2) = aStacoObject.Cov22();
233 StacoCovMat->fast(3,1) = aStacoObject.Cov31();
234 StacoCovMat->fast(3,2) = aStacoObject.Cov32();
235 StacoCovMat->fast(3,3) = aStacoObject.Cov33();
236 StacoCovMat->fast(4,1) = aStacoObject.Cov41();
237 StacoCovMat->fast(4,2) = aStacoObject.Cov42();
238 StacoCovMat->fast(4,3) = aStacoObject.Cov43();
239 StacoCovMat->fast(4,4) = aStacoObject.Cov44();
240 StacoCovMat->fast(5,1) = aStacoObject.Cov51();
241 StacoCovMat->fast(5,2) = aStacoObject.Cov52();
242 StacoCovMat->fast(5,3) = aStacoObject.Cov53();
243 StacoCovMat->fast(5,4) = aStacoObject.Cov54();
244 StacoCovMat->fast(5,5) = aStacoObject.Cov55();
245
246 const Trk::MeasuredPerigee* perigee = new Trk::MeasuredPerigee(parcomb[0],
247 parcomb[1],
248 parcomb[2],
249 parcomb[3],
250 parcomb[4],
251 aStacoObject.GetPerigeeSurface(),
252 new Trk::ErrorMatrix(StacoCovMat));
253
254
255 return perigee;
256
257 }
258
259
260 const Trk::FitQuality*
261 Trk::StacoToTrackTool::convertFitQuality(StacoObject& aStacoObject){
262
263 int NberOfDOF = aStacoObject.Ndof();
264 double chiSquared = aStacoObject.Chi2();
265
266 return new Trk::FitQuality(chiSquared,NberOfDOF);
267
268 }
| Due to the LXR bug, the updates fail sometimes to remove references to deleted files. The Saturday's full rebuilds fix these problems |
|
This page was automatically generated by the
LXR engine.
|
|