00001 #include "RecoEgamma/EgammaPhotonAlgos/interface/InOutConversionSeedFinder.h"
00002 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionBarrelEstimator.h"
00003 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionForwardEstimator.h"
00004
00005 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionFastHelix.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007
00008
00009 #include "MagneticField/Engine/interface/MagneticField.h"
00010
00011 #include "DataFormats/CLHEP/interface/AlgebraicObjects.h"
00012
00013 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00014 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00015
00016 #include "TrackingTools/TrajectoryParametrization/interface/GlobalTrajectoryParameters.h"
00017 #include "TrackingTools/DetLayers/interface/DetLayer.h"
00018 #include "TrackingTools/PatternTools/interface/TrajectoryMeasurement.h"
00019 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00020 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
00021 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00022
00023
00024 #include "FWCore/Framework/interface/EventSetup.h"
00025
00026 #include "CLHEP/Units/PhysicalConstants.h"
00027 #include "CLHEP/Geometry/Point3D.h"
00028
00029 InOutConversionSeedFinder::InOutConversionSeedFinder( const edm::ParameterSet& conf ):
00030 ConversionSeedFinder( conf ), conf_(conf)
00031 {
00032
00033
00034 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder CTOR " << "\n";
00035
00036
00037
00038 the2ndHitdphi_ = 0.01;
00039 the2ndHitdzConst_ = 5.;
00040 the2ndHitdznSigma_ = 2.;
00041 maxNumberOfInOutSeedsPerInputTrack_=50;
00042
00043 }
00044
00045
00046
00047 InOutConversionSeedFinder::~InOutConversionSeedFinder() {
00048 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder DTOR " << "\n";
00049 }
00050
00051
00052
00053 void InOutConversionSeedFinder::makeSeeds( const edm::Handle<edm::View<reco::CaloCluster> > & allBC ) const {
00054
00055
00056 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::makeSeeds() " << "\n";
00057 theSeeds_.clear();
00058 LogDebug("InOutConversionSeedFinder") << " Check Calo cluster collection size " << allBC->size() << "\n";
00059 bcCollection_= allBC;
00060
00061
00062 findLayers();
00063
00064
00065 fillClusterSeeds();
00066 LogDebug("InOutConversionSeedFinder") << "Built vector of seeds of size " << theSeeds_.size() << "\n" ;
00067
00068
00069
00070
00071
00072 }
00073
00074
00075 void InOutConversionSeedFinder::fillClusterSeeds() const {
00076
00077 std::vector<Trajectory>::const_iterator outInTrackItr;
00078
00079 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds outInTracks_.size " << theOutInTracks_.size() << "\n";
00080
00081
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 for(outInTrackItr = theOutInTracks_.begin(); outInTrackItr != theOutInTracks_.end(); ++outInTrackItr) {
00112 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds out in input track hits " << (*outInTrackItr).foundHits() << "\n";
00113 nSeedsPerInputTrack_=0;
00114
00115
00116
00117 std::vector<TrajectoryMeasurement> measurements = (*outInTrackItr).measurements();
00118
00119 std::vector<const DetLayer*> allLayers=layerList();
00120
00121 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fill clusterSeed allLayers.size " << allLayers.size() << "\n";
00122
00123
00124
00125
00126
00127
00128
00129 std::vector<const DetLayer*> myLayers;
00130 myLayers.clear();
00131 std::vector<TrajectoryMeasurement>::reverse_iterator measurementItr;
00132 std::vector<TrajectoryMeasurement*> myItr;
00133 TrajectoryMeasurement* myPointer=0;
00134 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds measurements.size " << measurements.size() <<"\n";
00135
00136 for(measurementItr = measurements.rbegin() ; measurementItr != measurements.rend(); ++measurementItr) {
00137
00138
00139 if( (*measurementItr).recHit()->isValid()) {
00140
00141 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds measurement on layer " << measurementItr->layer() << " " <<&(*measurementItr) << " position " << measurementItr->recHit()->globalPosition() << " R " << sqrt( measurementItr->recHit()->globalPosition().x()*measurementItr->recHit()->globalPosition().x() + measurementItr->recHit()->globalPosition().y()*measurementItr->recHit()->globalPosition().y() ) << " Z " << measurementItr->recHit()->globalPosition().z() << " phi " << measurementItr->recHit()->globalPosition().phi() << "\n";
00142
00143
00144 myLayers.push_back( measurementItr->layer() ) ;
00145 myItr.push_back( &(*measurementItr) );
00146
00147
00148 }
00149 }
00150
00151
00152
00153 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeed myLayers.size " << myLayers.size() << "\n";
00154
00155
00156
00157
00158
00159 if ( myItr.size()==0 )LogDebug("InOutConversionSeedFinder") << "HORRENDOUS ERROR! No meas on track!" << "\n";
00160
00161 unsigned int ilayer;
00162 for(ilayer = 0; ilayer < allLayers.size(); ++ilayer) {
00163 LogDebug("InOutConversionSeedFinder") << " allLayers in the search loop " << allLayers[ilayer] << " " << myLayers[0] << "\n";
00164 if ( allLayers[ilayer] == myLayers[0]) {
00165
00166 myPointer=myItr[0];
00167
00168 LogDebug("InOutConversionSeedFinder") << " allLayers in the search loop allLayers[ilayer] == myLayers[0]) " << allLayers[ilayer] << " " << myLayers[0] << " myPointer " << myPointer << "\n";
00169
00170 LogDebug("InOutConversionSeedFinder") << "Layer " << ilayer << " contains the first valid measurement " << "\n";
00171 printLayer(ilayer);
00172
00173 if ( (myLayers[0])->location() == GeomDetEnumerators::barrel ) {
00174 const BarrelDetLayer * barrelLayer = dynamic_cast<const BarrelDetLayer*>(myLayers[0]);
00175 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds **** firstHit found in Barrel on layer " << ilayer << " R= " << barrelLayer->specificSurface().radius() << "\n";
00176 } else {
00177 const ForwardDetLayer * forwardLayer = dynamic_cast<const ForwardDetLayer*>(myLayers[0]);
00178 LogDebug("InOutConversionSeedFinder") << " InOutwardConversionSeedFinder::fillClusterSeeds **** firstHit found in Forw on layer " << ilayer << " Z= " << forwardLayer->specificSurface().position().z() << "\n";
00179 }
00180
00181
00182 break;
00183
00184 } else if ( allLayers[ilayer] == myLayers[1] ) {
00185 myPointer=myItr[1];
00186
00187 LogDebug("InOutConversionSeedFinder") << " allLayers in the search loop allLayers[ilayer] == myLayers[1]) " << allLayers[ilayer] << " " << myLayers[1] << " myPointer " << myPointer << "\n";
00188
00189 LogDebug("InOutConversionSeedFinder") << "Layer " << ilayer << " contains the first innermost valid measurement " << "\n";
00190 if ( (myLayers[1])->location() == GeomDetEnumerators::barrel ) {
00191 const BarrelDetLayer * barrelLayer = dynamic_cast<const BarrelDetLayer*>(myLayers[1]);
00192 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds **** 2ndHit found in Barrel on layer " << ilayer << " R= " << barrelLayer->specificSurface().radius() << "\n";
00193 } else {
00194 const ForwardDetLayer * forwardLayer = dynamic_cast<const ForwardDetLayer*>(myLayers[1]);
00195 LogDebug("InOutConversionSeedFinder") << " InOutwardConversionSeedFinder::fillClusterSeeds **** 2ndHitfound on forw layer " << ilayer << " Z= " << forwardLayer->specificSurface().position().z() << "\n";
00196 }
00197
00198
00199
00200 break;
00201
00202 }
00203 }
00204
00205
00206
00207 if(ilayer == allLayers.size()) {
00208 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::fillClusterSeeds ERROR could not find layer on list" << "\n";
00209 return;
00210 }
00211
00212 PropagatorWithMaterial reversePropagator(oppositeToMomentum, 0.000511, &(*theMF_) );
00213 FreeTrajectoryState * fts = myPointer->updatedState().freeTrajectoryState();
00214
00215 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds First FTS charge " << fts->charge() << " Position " << fts->position() << " momentum " << fts->momentum() << " R " << sqrt(fts->position().x()*fts->position().x() + fts->position().y()* fts->position().y() ) << " Z " << fts->position().z() << " phi " << fts->position().phi() << " fts parameters " << fts->parameters() << "\n";
00216
00217
00218 while (ilayer >0) {
00219
00220 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds looking for 2nd seed from layer " << ilayer << "\n";
00221
00222 if ( (allLayers[ilayer])->location() == GeomDetEnumerators::barrel ) {const BarrelDetLayer * barrelLayer = dynamic_cast<const BarrelDetLayer*>(allLayers[ilayer]);
00223 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds **** Barrel on layer " << ilayer << " R= " << barrelLayer->specificSurface().radius() << "\n";
00224 } else {
00225 const ForwardDetLayer * forwardLayer = dynamic_cast<const ForwardDetLayer*>(allLayers[ilayer]);
00226 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds **** Forw on layer " << ilayer << " Z= " << forwardLayer->specificSurface().position().z() << "\n";
00227 }
00228
00229
00230 const DetLayer * previousLayer = allLayers[ilayer];
00231 TrajectoryStateOnSurface stateAtPreviousLayer;
00232 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds previousLayer->surface() position before " <<allLayers[ilayer] << " " << previousLayer->surface().position() << " layer location " << previousLayer->location() << "\n";
00233
00234
00235
00236
00237 const Propagator& newProp=reversePropagator;
00238 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds reversepropagator direction " << newProp.propagationDirection() << "\n";
00239 if (ilayer-1>0) {
00240
00241 if ( allLayers[ilayer] == myLayers[0] ) {
00242 LogDebug("InOutConversionSeedFinder") << " innermost hit R " << myPointer->recHit()->globalPosition().perp() << " Z " << myPointer->recHit()->globalPosition().z() << " phi " <<myPointer->recHit()->globalPosition().phi() << "\n";
00243 LogDebug("InOutConversionSeedFinder") << " surface R " << theTrackerGeom_->idToDet( myPointer->recHit() ->geographicalId())->surface().position().perp() << " Z " << theTrackerGeom_->idToDet( myPointer->recHit() ->geographicalId())->surface().position().z() << " phi " << theTrackerGeom_->idToDet( myPointer->recHit() ->geographicalId())->surface().position().phi() << "\n";
00244
00245 stateAtPreviousLayer= newProp.propagate(*fts, theTrackerGeom_->idToDet( myPointer->recHit() ->geographicalId())->surface() );
00246
00247 } else {
00248
00249 stateAtPreviousLayer= newProp.propagate(*fts, previousLayer->surface() );
00250 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds previousLayer->surface() position after " << previousLayer->surface().position() << " layer location " << previousLayer->location() << "\n";
00251
00252 }
00253
00254 } else if ( ilayer-1==0) {
00255
00256
00257 LogDebug("InOutConversionSeedFinder") << " innermost hit R " << myPointer->recHit()->globalPosition().perp() << " Z " << myPointer->recHit()->globalPosition().z() << " phi " <<myPointer->recHit()->globalPosition().phi() << "\n";
00258 LogDebug("InOutConversionSeedFinder") << " surface R " << theTrackerGeom_->idToDet( myPointer->recHit() ->geographicalId())->surface().position().perp() << " Z " << theTrackerGeom_->idToDet( myPointer->recHit() ->geographicalId())->surface().position().z() << " phi " << theTrackerGeom_->idToDet( myPointer->recHit() ->geographicalId())->surface().position().phi() << "\n";
00259
00260 stateAtPreviousLayer= newProp.propagate(*fts, theTrackerGeom_->idToDet( myPointer->recHit() ->geographicalId())->surface() );
00261
00262 }
00263
00264 if(!stateAtPreviousLayer.isValid()) {
00265 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::fillClusterSeeds ERROR:could not propagate back to layer " << ilayer << "\n";
00266
00267 } else {
00268 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::fillClusterSeeds stateAtPreviousLayer is valid. Propagating back to layer " << ilayer << "\n";
00269 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::fillClusterSeeds stateAtPreviousLayer R " << stateAtPreviousLayer.globalPosition().perp() << " Z " << stateAtPreviousLayer.globalPosition().z() << " phi " << stateAtPreviousLayer.globalPosition().phi() << "\n";
00270
00271 startSeed(fts, stateAtPreviousLayer, -1, ilayer );
00272
00273
00274 }
00275
00276 --ilayer;
00277
00278 }
00279
00280
00281
00282
00283 }
00284
00285
00286
00287 }
00288
00289
00290
00291 void InOutConversionSeedFinder::startSeed( FreeTrajectoryState * fts, const TrajectoryStateOnSurface & stateAtPreviousLayer, int charge, int ilayer ) const {
00292
00293 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::startSeed " << "\n";
00294
00295
00296
00297 track2Charge_ = charge*fts->charge();
00298 std::vector<const reco::CaloCluster*> bcVec;
00299 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::startSeed charge assumed for the in-out track " << track2Charge_ << "\n";
00300
00301 Geom::Phi<float> theConvPhi( stateAtPreviousLayer.globalPosition().phi());
00302 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::startSeed stateAtPreviousLayer phi " << stateAtPreviousLayer.globalPosition().phi() << " R " << stateAtPreviousLayer.globalPosition().perp() << " Z " << stateAtPreviousLayer.globalPosition().z() << "\n";
00303
00304 bcVec = getSecondCaloClusters(stateAtPreviousLayer.globalPosition(),track2Charge_);
00305
00306 std::vector<const reco::CaloCluster*>::iterator bcItr;
00307 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::startSeed bcVec.size " << bcVec.size() << "\n";
00308
00309
00310
00311
00312
00313
00314
00315 for(bcItr = bcVec.begin(); bcItr != bcVec.end(); ++bcItr) {
00316
00317 theSecondBC_ = **bcItr;
00318 GlobalPoint bcPos((theSecondBC_.position()).x(),
00319 (theSecondBC_.position()).y(),
00320 (theSecondBC_.position()).z());
00321
00322 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::startSeed for bc position x " << bcPos.x() << " y " << bcPos.y() << " z " << bcPos.z() << " eta " << bcPos.eta() << " phi " << bcPos.phi() << "\n";
00323 GlobalVector dir = stateAtPreviousLayer.globalDirection();
00324 GlobalPoint back1mm = stateAtPreviousLayer.globalPosition();
00325 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::startSeed stateAtPreviousLayer.globalPosition() " << back1mm << "\n";
00326
00327 back1mm -= dir.unit()*0.1;
00328 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder:::startSeed going to make the helix using back1mm " << back1mm <<"\n";
00329 ConversionFastHelix helix(bcPos, stateAtPreviousLayer.globalPosition(), back1mm, &(*theMF_));
00330 helix.stateAtVertex();
00331
00332 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder:::startSeed helix status " <<helix.isValid() << std::endl;
00333 if ( !helix.isValid() ) continue;
00334 findSeeds(stateAtPreviousLayer, helix.stateAtVertex().transverseCurvature(), ilayer);
00335
00336
00337 }
00338
00339
00340
00341 }
00342
00343
00344
00345 std::vector<const reco::CaloCluster*> InOutConversionSeedFinder::getSecondCaloClusters(const GlobalPoint & conversionPosition, float charge) const {
00346
00347
00348 std::vector<const reco::CaloCluster*> result;
00349
00350 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::getSecondCaloClusters" << "\n";
00351
00352 Geom::Phi<float> theConvPhi(conversionPosition.phi() );
00353
00354 for (unsigned i = 0; i < bcCollection_->size(); ++i ) {
00355
00356 Geom::Phi<float> theBcPhi( bcCollection_->ptrAt(i)->position().phi() );
00357 LogDebug("InOutConversionSeedFinder")<< "InOutConversionSeedFinder::getSecondCaloClusters BC energy " << bcCollection_->ptrAt(i)->energy() << " Calo cluster phi " << theBcPhi << " " << bcCollection_->ptrAt(i)->position().phi()<< " theConvPhi " << theConvPhi << "\n";
00358
00359
00360
00361
00362
00363 if (fabs(theBcPhi-theConvPhi ) < .5 &&
00364 ((charge<0 && theBcPhi-theConvPhi >-.5) ||
00365 (charge>0 && theBcPhi-theConvPhi <.5))){
00366
00367
00368
00369
00370 result.push_back(&(*(bcCollection_->ptrAt(i)) ));
00371
00372 }
00373
00374
00375
00376
00377 }
00378
00379
00380
00381 return result;
00382
00383
00384 }
00385
00386
00387
00388 void InOutConversionSeedFinder::findSeeds(const TrajectoryStateOnSurface & startingState,
00389 float transverseCurvature,
00390 unsigned int startingLayer) const {
00391
00392
00393 std::vector<const DetLayer*> allLayers=layerList();
00394 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds starting forward propagation from startingLayer " << startingLayer << "\n";
00395
00396
00397
00398 AlgebraicSymMatrix55 m = AlgebraicMatrixID();
00399 m(0,0) = 0.1; m(1,1) = 0.0001 ; m(2,2) = 0.0001 ;
00400 m(3,3) = 0.0001 ; m(4,4) = 0.001;
00401
00402
00403
00404
00405 FreeTrajectoryState fts(GlobalTrajectoryParameters(startingState.globalPosition(),
00406 startingState.globalDirection(),
00407 double(transverseCurvature), 0, &(*theMF_) ),
00408 CurvilinearTrajectoryError(m));
00409 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::findSeeds startingState R "<< startingState.globalPosition().perp() << " Z " << startingState.globalPosition().z() << " phi " << startingState.globalPosition().phi() << " position " << startingState.globalPosition() << "\n";
00410 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::findSeeds Initial FTS charge " << fts.charge() << " curvature " << transverseCurvature << "\n";
00411 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::findSeeds Initial FTS parameters " << fts << "\n";
00412
00413 PropagatorWithMaterial thePropagatorWithMaterial_ (alongMomentum, 0.000511, &(*theMF_) );
00414
00415
00416
00417 float dphi = 0.03;
00418 float zrange = 5.;
00419 for( unsigned int ilayer = startingLayer; ilayer <= startingLayer+1 && (ilayer < allLayers.size()-2); ++ilayer) {
00420 const DetLayer * layer = allLayers[ilayer];
00421
00422
00423
00425
00426
00427
00428
00429
00430
00432
00433
00434
00435 MeasurementEstimator * newEstimator=0;
00436 if (layer->location() == GeomDetEnumerators::barrel ) {
00437 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds Barrel ilayer " << ilayer << "\n";
00438 newEstimator = new ConversionBarrelEstimator(-dphi, dphi, -zrange, zrange);
00439 }
00440 else {
00441 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds Forward ilayer " << ilayer << "\n";
00442 newEstimator = new ConversionForwardEstimator(-dphi, dphi, 15.);
00443 }
00444
00445
00446 theFirstMeasurements_.clear();
00447
00448 TSOS tsos(fts, layer->surface() );
00449
00450 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeed propagationDirection " << int(thePropagatorWithMaterial_.propagationDirection() ) << "\n";
00452 LayerMeasurements theLayerMeasurements_(this->getMeasurementTracker() );
00453
00454 theFirstMeasurements_ = theLayerMeasurements_.measurements( *layer, tsos, thePropagatorWithMaterial_, *newEstimator);
00455
00456 delete newEstimator;
00457 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds Found " << theFirstMeasurements_.size() << " first hits" << "\n";
00458
00459
00460 int mea=0;
00461 for(std::vector<TrajectoryMeasurement>::iterator tmItr = theFirstMeasurements_.begin(); tmItr !=theFirstMeasurements_.end(); ++tmItr) {
00462
00463 mea++;
00464
00465
00466 if (tmItr->recHit()->isValid() ) {
00467
00468 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds hit R " << tmItr->recHit()->globalPosition().perp() << " Z " << tmItr->recHit()->globalPosition().z() << " " << tmItr->recHit()->globalPosition() << "\n";
00469 GlobalPoint bcPos((theSecondBC_.position()).x(),(theSecondBC_.position()).y(),(theSecondBC_.position()).z());
00470 GlobalVector dir = startingState.globalDirection();
00471 GlobalPoint back1mm = tmItr->recHit()->globalPosition();
00472
00473 back1mm -= dir.unit()*0.1;
00474 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder:::findSeeds going to make the helix using back1mm " << back1mm << "\n";
00475 ConversionFastHelix helix(bcPos, tmItr->recHit()->globalPosition(), back1mm, &(*theMF_));
00476
00477 helix.stateAtVertex();
00478 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder:::findSeeds helix status " <<helix.isValid() << std::endl;
00479 if ( !helix.isValid() ) continue;
00480
00481 track2InitialMomentum_= helix.stateAtVertex().momentum();
00482
00483 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds Updated estimatedPt = " << helix.stateAtVertex().momentum().perp() << " curvature " << helix.stateAtVertex().transverseCurvature() << "\n";
00484
00485
00486
00487
00488
00489 FreeTrajectoryState newfts(GlobalTrajectoryParameters(
00490 tmItr->recHit()->globalPosition(), startingState.globalDirection(),
00491 helix.stateAtVertex().transverseCurvature(), 0, &(*theMF_)),
00492 CurvilinearTrajectoryError(m));
00493
00494 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds new FTS charge " << newfts.charge() << "\n";
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518 completeSeed(*tmItr, newfts, &thePropagatorWithMaterial_, ilayer+1);
00519 completeSeed(*tmItr, newfts, &thePropagatorWithMaterial_, ilayer+2);
00520
00521
00522 }
00523
00524 }
00525
00526
00527
00528 }
00529
00530
00531
00532 }
00533
00534
00535
00536
00537
00538 void InOutConversionSeedFinder::completeSeed(const TrajectoryMeasurement & m1,
00539 FreeTrajectoryState & fts, const Propagator* propagator, int ilayer) const {
00540
00541 LogDebug("InOutConversionSeedFinder")<< "InOutConversionSeedFinder::completeSeed ilayer " << ilayer << "\n";
00542
00543
00544
00545
00546 printLayer(ilayer);
00547
00548 MeasurementEstimator * newEstimator;
00549 std::vector<const DetLayer*> allLayers=layerList();
00550 const DetLayer * layer = allLayers[ilayer];
00551
00552 if (layer->location() == GeomDetEnumerators::barrel ) {
00553
00554 float dz = sqrt(the2ndHitdznSigma_*the2ndHitdznSigma_*m1.recHit()->globalPositionError().czz()
00555 + the2ndHitdzConst_*the2ndHitdzConst_);
00556 newEstimator = new ConversionBarrelEstimator(-the2ndHitdphi_, the2ndHitdphi_, -dz, dz);
00557
00558 }
00559 else {
00560 float m1dr = sqrt(m1.recHit()->localPositionError().yy());
00561 float dr = sqrt(the2ndHitdznSigma_*the2ndHitdznSigma_*m1dr*m1dr
00562 + the2ndHitdzConst_*the2ndHitdznSigma_);
00563
00564 newEstimator = new ConversionForwardEstimator(-the2ndHitdphi_, the2ndHitdphi_, dr);
00565 }
00566
00567
00568 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::completeSeed fts For the TSOS " << fts << "\n";
00569
00570 TSOS tsos(fts, layer->surface() );
00571
00572 if ( !tsos.isValid() ) {
00573 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::completeSeed TSOS is not valid " << "\n";
00574 }
00575
00576 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::completeSeed TSOS " << tsos << "\n";
00577 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::completeSeed propagationDirection " << int(propagator->propagationDirection() ) << "\n";
00578 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::completeSeed pointer to estimator " << newEstimator << "\n";
00579 LayerMeasurements theLayerMeasurements_(this->getMeasurementTracker() );
00580 std::vector<TrajectoryMeasurement> measurements = theLayerMeasurements_.measurements( *layer, tsos, *propagator, *newEstimator);
00581 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::completeSeed Found " << measurements.size() << " second hits " << "\n";
00582 delete newEstimator;
00583
00584 for(unsigned int i = 0; i < measurements.size(); ++i) {
00585 if( measurements[i].recHit()->isValid() ) {
00586 createSeed(m1, measurements[i]);
00587 }
00588 }
00589
00590
00591
00592
00593
00594
00595 }
00596
00597
00598
00599 void InOutConversionSeedFinder::createSeed(const TrajectoryMeasurement & m1, const TrajectoryMeasurement & m2) const {
00600
00601 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::createSeed " << "\n";
00602
00603 GlobalTrajectoryParameters newgtp( m1.recHit()->globalPosition(), track2InitialMomentum_, track2Charge_, &(*theMF_) );
00604 CurvilinearTrajectoryError errors = m1.predictedState().curvilinearError();
00605 FreeTrajectoryState fts(newgtp, errors);
00606
00607 PropagatorWithMaterial thePropagatorWithMaterial_ (alongMomentum, 0.000511, &(*theMF_) );
00608 TrajectoryStateOnSurface state1 = thePropagatorWithMaterial_.propagate(fts, m1.recHit()->det()->surface());
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620 if ( state1.isValid() ) {
00621
00622 TrajectoryStateOnSurface updatedState1 = theUpdator_.update(state1, *m1.recHit() );
00623
00624 if ( updatedState1.isValid() ) {
00625
00626 TrajectoryStateOnSurface state2 = thePropagatorWithMaterial_.propagate(*updatedState1.freeTrajectoryState(), m2.recHit()->det()->surface());
00627
00628 if ( state2.isValid() ) {
00629
00630 TrajectoryStateOnSurface updatedState2 = theUpdator_.update(state2, *m2.recHit() );
00631 TrajectoryMeasurement meas1(state1, updatedState1, m1.recHit() , m1.estimate(), m1.layer());
00632 TrajectoryMeasurement meas2(state2, updatedState2, m2.recHit() , m2.estimate(), m2.layer());
00633
00634 edm::OwnVector<TrackingRecHit> myHits;
00635 myHits.push_back(meas1.recHit()->hit()->clone());
00636 myHits.push_back(meas2.recHit()->hit()->clone());
00637
00638 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::createSeed new seed " << "\n";
00639 if ( nSeedsPerInputTrack_ >= maxNumberOfInOutSeedsPerInputTrack_ ) return;
00640
00641
00642 TrajectoryStateTransform tsTransform;
00643 PTrajectoryStateOnDet* ptsod= tsTransform.persistentState(state2, meas2.recHit()->hit()->geographicalId().rawId() );
00644 LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::createSeed New seed parameters " << state2 << "\n";
00645
00646
00647
00648 theSeeds_.push_back(TrajectorySeed( *ptsod, myHits, alongMomentum ));
00649 nSeedsPerInputTrack_++;
00650
00651 delete ptsod;
00652
00653 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::createSeed New seed hit 1 position " << m1.recHit()->globalPosition() << "\n";
00654 LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::createSeed New seed hit 2 position " << m2.recHit()->globalPosition() << "\n";
00655
00656
00657
00658
00659 }
00660 }
00661 }
00662
00663 }