00001
00002
00003
00004 #include "GaudiKernel/AlgFactory.h"
00005 #include "GaudiKernel/IDataProviderSvc.h"
00006
00007
00008 #include "Event/TrFitTrack.h"
00009 #include "Event/ITClusterOnTrack.h"
00010 #include "Event/OTClusterOnTrack.h"
00011 #include "Event/VeloRClusterOnTrack.h"
00012 #include "Event/VeloPhiClusterOnTrack.h"
00013
00014
00015 #include "Event/Track.h"
00016 #include "Event/TrackKeys.h"
00017 #include "Event/Measurement.h"
00018
00019
00020 #include "Kernel/LHCbID.h"
00021
00022
00023 #include "TrFitTrack2TrackCnv.h"
00024
00025
00026
00027
00028
00029
00030
00031
00032 static const AlgFactory<TrFitTrack2TrackCnv> Factory ;
00033 const IAlgFactory& TrFitTrack2TrackCnvFactory = Factory ;
00034
00035
00036
00037
00038 TrFitTrack2TrackCnv::TrFitTrack2TrackCnv( const std::string& name,
00039 ISvcLocator* pSvcLocator)
00040 : GaudiAlgorithm ( name , pSvcLocator )
00041 , m_inputTrackName ( TrFitTrackLocation::Default )
00042 , m_outputTrackName ( TrackLocation::Default )
00043 , m_measProvider(0)
00044 {
00045 declareProperty( "InputTracks" , m_inputTrackName );
00046 declareProperty( "OutputTracks", m_outputTrackName );
00047 declareProperty( "ConvertAllStates", m_convertAllStates = true );
00048 declareProperty( "LoadMeasurements", m_createMeasurements = true );
00049 }
00050
00051
00052
00053
00054 TrFitTrack2TrackCnv::~TrFitTrack2TrackCnv() {};
00055
00056
00057
00058
00059 StatusCode TrFitTrack2TrackCnv::initialize() {
00060
00061
00062
00063 StatusCode sc = GaudiAlgorithm::initialize() ;
00064 if ( sc.isFailure() )
00065 return Error( "Base class \"GaudiAlgorithm\" was not initialized properly!" );
00066
00067 debug() << "==> Initialize" << endreq;
00068
00069 m_measProvider = tool<IMeasurementProvider>( "MeasurementProvider" );
00070 if ( 0 == m_measProvider )
00071 return Error( "Unable to retrieve the \"MeasurementProvider\" tool!" );
00072 else
00073 debug() << "Found the \"MeasurementProvider\" tool" << endreq;
00074
00075 return StatusCode::SUCCESS;
00076 };
00077
00078
00079
00080
00081 StatusCode TrFitTrack2TrackCnv::execute() {
00082
00083 debug() << "==> Execute" << endreq;
00084
00085
00086 TrFitTracks* inTra = get<TrFitTracks>( m_inputTrackName );
00087 debug() << "- # TrFitTracks = " << inTra -> size() << endreq;
00088
00089
00090 Tracks* outTra = new Tracks();
00091 StatusCode sc = eventSvc() -> registerObject( m_outputTrackName, outTra );
00092 if( sc.isFailure() ) {
00093 delete outTra;
00094 error() << "Unable to register the output container "
00095 << m_outputTrackName << ". Status is " << sc << endreq;
00096 return sc ;
00097 }
00098 else {
00099 debug() << "Output container " << m_outputTrackName
00100 << " registered" << endreq;
00101 }
00102
00103 TrStateP* trStaP;
00104 TrStateL* trStaL;
00105 TrState* trSta;
00106 OTClusterOnTrack* myOt;
00107 ITClusterOnTrack* myIt;
00108 VeloRClusterOnTrack* myRV;
00109 VeloPhiClusterOnTrack* myPV;
00110 TrFitTracks::const_iterator itF;
00111 TrStates::const_iterator itS;
00112 TrTrack::TrMeasurements::const_iterator itM;
00113
00114 Track* trSto;
00115 LHCbID myID;
00116 std::vector<LHCbID> myIDs;
00117
00118
00119 if ( m_createMeasurements ) m_measProvider -> load();
00120
00121 debug() << "Processing TrFitTracks ... " << endreq;
00122
00123 for ( itF = inTra->begin() ; inTra->end() != itF ; ++itF ) {
00124
00125 trSto = new Track();
00126 outTra -> insert( trSto, (*itF)->key() );
00127
00128
00129 debug()
00130 << "- TrFitTrack with key # " << (*itF) -> key() << endreq
00131 << " * # states = " << (*itF) -> nStates() << endreq
00132 << " * # measurements = " << (*itF) -> nMeasurements() << endreq
00133 << " - # IT = " << (*itF) -> nMeasurements( TrMeasurement::kITClusterOnTrack ) << endreq
00134 << " - # OT = " << (*itF) -> nMeasurements( TrMeasurement::kOTClusterOnTrack ) << endreq
00135 << " - # VeloR = " << (*itF) -> nMeasurements( TrMeasurement::kVeloRClusterOnTrack ) << endreq
00136 << " - # VeloPhi = " << (*itF) -> nMeasurements( TrMeasurement::kVeloPhiClusterOnTrack ) << endreq
00137 << " * charge = " << (*itF) -> charge() << endreq
00138 << " * error flag = " << (*itF) -> errorFlag() << endreq
00139 << " * is Unique = " << (*itF) -> unique() << endreq
00140 << " * is Long = " << (*itF) -> isLong() << endreq
00141 << " * is Upstream = " << (*itF) -> isUpstream() << endreq
00142 << " * is Downstream = " << (*itF) -> isDownstream() << endreq
00143 << " * is Velotrack = " << (*itF) -> isVelotrack() << endreq
00144 << " * is Backward = " << (*itF) -> isBackward() << endreq
00145 << " * is Ttrack = " << (*itF) -> isTtrack() << endreq
00146 << " * velo = " << (*itF) -> velo() << endreq
00147 << " * seed = " << (*itF) -> seed() << endreq
00148 << " * match = " << (*itF) -> match() << endreq
00149 << " * forward = " << (*itF) -> forward() << endreq
00150 << " * follow = " << (*itF) -> follow() << endreq
00151 << " * veloTT = " << (*itF) -> veloTT() << endreq
00152 << " * veloBack = " << (*itF) -> veloBack() << endreq
00153 << " * ksTrack = " << (*itF) -> ksTrack() << endreq;
00154
00155
00156
00157 if ( (bool) (*itF)->errorFlag() ) trSto -> setFlag( TrackKeys::Invalid, true );
00158 if ( (bool) (*itF)->unique() ) trSto -> setFlag( TrackKeys::Unique, true );
00159
00160 if ( (*itF)->isLong() ) trSto -> setType( TrackKeys::Long );
00161 else if ( (*itF)->isUpstream() ) trSto -> setType( TrackKeys::Upstream );
00162 else if ( (*itF)->isDownstream() ) trSto -> setType( TrackKeys::Downstream );
00163 else if ( (*itF)->isVelotrack() ) trSto -> setType( TrackKeys::Velo );
00164 else if ( (*itF)->isBackward() ) { trSto -> setType( TrackKeys::Velo );
00165 trSto -> setFlag( TrackKeys::Backward, true );
00166 }
00167
00168 else if ( (*itF)->isTtrack() ) trSto -> setType( TrackKeys::Ttrack );
00169
00170 if ( (*itF)->ksTrack() ) trSto -> setHistory( TrackKeys::TrKshort );
00171
00172
00173 debug()
00174 << " -> Track stored with key # " << trSto -> key() << endreq
00175 << " * is Invalid = "
00176 << trSto -> checkFlag( TrackKeys::Invalid ) << endreq
00177 << " * is Unique = "
00178 << trSto -> checkFlag( TrackKeys::Unique ) << endreq
00179 << " * is Long = "
00180 << trSto -> checkType( TrackKeys::Long ) << endreq
00181 << " * is Upstream = "
00182 << trSto -> checkType( TrackKeys::Upstream ) << endreq
00183 << " * is Downstream = "
00184 << trSto -> checkType( TrackKeys::Downstream ) << endreq
00185 << " * is Velo = "
00186 << trSto -> checkType( TrackKeys::Velo ) << endreq
00187 << " * is Backward = "
00188 << trSto -> checkFlag( TrackKeys::Backward ) << endreq
00189 << " * is Ttrack = "
00190 << trSto -> checkType( TrackKeys::Ttrack ) << endreq;
00191
00192
00193 if ( m_convertAllStates ) {
00194 unsigned ist = 0;
00195 for ( itS = (*itF)->beginS() ; (*itF)->endS() != itS; itS++ ) {
00196 trSta = (*itS)->clone();
00197 trStaP = dynamic_cast<TrStateP*>(trSta);
00198 trStaL = dynamic_cast<TrStateL*>(trSta);
00199 if ( 0 != trStaP ) {
00200 verbose() << " * TrStateP # " << ist++ << endreq
00201 << " - (x,y,z) = (" << trStaP -> x() << ", "
00202 << trStaP -> y() << ", "
00203 << trStaP -> z() << ")" << endreq
00204 << " - tx, ty, Q/P = " << trStaP -> tx() << ", "
00205 << trStaP -> ty() << ", "
00206 << trStaP -> qDivP() << endreq;
00207 State pstate = State();
00208 pstate.setState( trStaP->x(), trStaP->y(), trStaP->z(),
00209 trStaP->tx(), trStaP->ty(), trStaP->qDivP() );
00210 pstate.setCovariance( trStaP->stateCov() );
00211 trSto -> addToStates( pstate );
00212 verbose() << " -> stored TrStateP at z = " << trStaP -> z()
00213 << " as state # " << ist << endreq;
00214 }
00215 else if ( 0 != trStaL ) {
00216 verbose() << " * TrStateL # " << ist++ << endreq
00217 << " - (x,y,z) = (" << trStaL -> x() << ", "
00218 << trStaL -> y() << ", "
00219 << trStaL -> z() << ")" << endreq
00220 << " - tx, ty = " << trStaL -> tx() << ", "
00221 << trStaL -> ty() << endreq;
00222 State lstate = State();
00223 lstate.setState( trStaL->x(), trStaL->y(), trStaL->z(),
00224 trStaL->tx(), trStaL->ty(), 0. );
00225 lstate.setCovariance( trStaL->stateCov() );
00226 trSto -> addToStates( lstate );
00227 verbose() << " -> stored TrStateL at z = " << trStaL -> z()
00228 << " as state # " << ist << endreq;
00229 }
00230 else {
00231 verbose() << " * unknown state at z =" << trSta -> z() << "!" << endreq;
00232 delete trSta;
00233 }
00234 }
00235 }
00236 else {
00237
00238 trSta = (*itF) -> closestState(0.);
00239 trStaP = dynamic_cast<TrStateP*>(trSta);
00240 trStaL = dynamic_cast<TrStateL*>(trSta);
00241 if ( 0 != trStaP ) {
00242
00243 State pstate = State();
00244 pstate.setState( trStaP->x(), trStaP->y(), trStaP->z(),
00245 trStaP->tx(), trStaP->ty(), trStaP->qDivP() );
00246 pstate.setCovariance( trStaP->stateCov() );
00247 trSto -> addToStates( pstate );
00248 verbose() << " -> stored TrStateP at z = " << trStaP -> z()
00249 << " as first state" << endreq;
00250 }
00251 else if ( 0 != trStaL ) {
00252 verbose() << " -> no first state stored!" << endreq;
00253 }
00254 debug() << " -> track charge = " << trSto -> charge() << endreq;
00255 }
00256 debug() << " -> # States stored = " << trSto -> states().size() << endreq;
00257
00258
00259 myIDs.clear();
00260 for ( itM = (*itF)->beginM() ; (*itF)->endM() != itM ; itM++ ) {
00261 if ( TrMeasurement::kOTClusterOnTrack == (*itM)->measType()) {
00262
00263
00264
00265
00266
00267
00268
00269
00270 myOt = dynamic_cast<OTClusterOnTrack*>(*itM);
00271 OTTime* otTime = myOt -> time();
00272 myID = LHCbID( otTime -> channel() );
00273 int amb = myOt -> ambiguity();
00274
00275 if ( amb != 0 ) {
00276 ( amb < 0 ) ? myID.setSpareBits( 2 ) : myID.setSpareBits( 3 );
00277 }
00278 else {
00279 myID.setSpareBits( 0 );
00280 }
00281 myIDs.push_back( myID );
00282 verbose() << " * OTCluster at z = " << myOt -> z()
00283 << " , channelID = " << otTime -> channel().channelID()
00284 << " , ambiguity = " << amb << endreq
00285 << " -> stored as LHCbID = " << myID.lhcbID()
00286 << " (detectorType / spareBits = "
00287 << myID.detectorType() << " / "
00288 << myID.spareBits() << ")" << endreq;
00289 if ( m_createMeasurements ) {
00290 Measurement& meas = m_measProvider -> measurement( myID, amb);
00291 trSto -> addToMeasurements(meas);
00292 }
00293 }
00294 else if ( TrMeasurement::kITClusterOnTrack == (*itM)->measType() ) {
00295
00296
00297
00298
00299
00300
00301
00302 myIt = dynamic_cast<ITClusterOnTrack*>(*itM);
00303 ITCluster* itClu = myIt -> cluster();
00304 myID = LHCbID( itClu -> channelID() );
00305 myIDs.push_back( myID );
00306 verbose() << " * ITCluster at z = " << myIt -> z()
00307 << " , channelID = "
00308 << itClu -> channelID().channelID() << endreq
00309 << " -> stored as LHCbID = " << myID.lhcbID()
00310 << " (detectorType / spareBits = "
00311 << myID.detectorType() << " / "
00312 << myID.spareBits() << ")" << endreq;
00313 if ( m_createMeasurements ) {
00314 Measurement& meas = m_measProvider -> measurement( myID );
00315 trSto -> addToMeasurements(meas);
00316 }
00317 }
00318 else if ( TrMeasurement::kVeloRClusterOnTrack == (*itM)->measType() ) {
00319
00320
00321
00322
00323
00324
00325
00326 myRV = dynamic_cast<VeloRClusterOnTrack*>(*itM);
00327 VeloCluster* veloClu = myRV -> cluster();
00328 int sensor = veloClu -> sensor();
00329 std::vector< std::pair<long,double> > sign = veloClu->stripSignals();
00330 int strip = (*sign.begin()).first;
00331 VeloChannelID channel(sensor,strip);
00332 myID = LHCbID( channel );
00333 myIDs.push_back( myID );
00334 verbose() << " * R Velo Cluster at z = " << myRV -> z()
00335 << " , VeloChannelID = " << channel << endreq
00336 << " , key = " << veloClu -> key() << endreq
00337 << " -> stored as LHCbID = " << myID.lhcbID()
00338 << " (detectorType / spareBits = "
00339 << myID.detectorType() << " / "
00340 << myID.spareBits() << ")" << endreq;
00341 if ( m_createMeasurements ) {
00342 Measurement& meas = m_measProvider -> measurement( myID );
00343 trSto -> addToMeasurements(meas);
00344 }
00345 }
00346 else if ( TrMeasurement::kVeloPhiClusterOnTrack == (*itM)->measType() ) {
00347
00348
00349
00350
00351
00352
00353 myPV = dynamic_cast<VeloPhiClusterOnTrack*>(*itM);
00354 VeloCluster* veloClu = myPV -> cluster();
00355 int sensor = veloClu -> sensor();
00356 std::vector< std::pair<long,double> > sign = veloClu->stripSignals();
00357 int strip = (*sign.begin()).first;
00358 VeloChannelID channel(sensor,strip);
00359 myID = LHCbID( channel );
00360 myIDs.push_back( myID );
00361 verbose() << " * Phi Velo Cluster at z = " << myPV -> z()
00362 << " , VeloChannelID = " << channel << endreq
00363 << " , key = " << veloClu -> key() << endreq
00364 << " -> stored as LHCbID = " << myID.lhcbID()
00365 << " (detectorType / spareBits = "
00366 << myID.detectorType() << " / "
00367 << myID.spareBits() << ")" << endreq;
00368 if ( m_createMeasurements ) {
00369 Measurement& meas = m_measProvider -> measurement( myID );
00370 trSto -> addToMeasurements(meas);
00371 }
00372 }
00373 }
00374
00375 trSto -> setLhcbIDs( myIDs );
00376 debug() << " -> # LHCbIDs stored = " << myIDs.size() << endreq;
00377
00378 if ( m_createMeasurements ) {
00379
00380 trSto -> setStatus( TrackKeys::PatRecMeas );
00381 debug() << " -> # measurements created = "
00382 << trSto -> measurements().size() << endreq;
00383 }
00384 }
00385
00386
00387 debug() << "-> stored " << outTra -> size() << " Tracks " << endreq;
00388
00389 return StatusCode::SUCCESS;
00390 };
00391
00392
00393
00394
00395 StatusCode TrFitTrack2TrackCnv::finalize() {
00396
00397 debug() << "==> Finalize" << endreq;
00398
00399
00400
00401 return GaudiAlgorithm::finalize();
00402 }
00403
00404