CMS 3D CMS Logo

InOutConversionSeedFinder.cc

Go to the documentation of this file.
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 // Field
00009 #include "MagneticField/Engine/interface/MagneticField.h"
00010 //
00011 #include "DataFormats/CLHEP/interface/AlgebraicObjects.h"
00012 // Geometry
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   //the2ndHitdphi_ = 0.008; 
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   //Start looking for seeds for both of the 2 best tracks from the inward tracking
00081   
00083   /*
00084   for(outInTrackItr = theOutInTracks_.begin(); outInTrackItr != theOutInTracks_.end();  ++outInTrackItr) {
00085 
00086 
00087     LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeeds out in input track hits " << (*outInTrackItr).foundHits() << "\n";
00088     DetId tmpId = DetId( (*outInTrackItr).seed().startingState().detId());
00089     const GeomDet* tmpDet  = this->getMeasurementTracker()->geomTracker()->idToDet( tmpId );
00090     GlobalVector gv = tmpDet->surface().toGlobal( (*outInTrackItr).seed().startingState().parameters().momentum() );
00091 
00092 
00093     LogDebug("InOutConversionSeedFinder") << " InOutConversionSeedFinder::fillClusterSeed was built from seed position " <<gv   <<  " charge " << (*outInTrackItr).seed().startingState().parameters().charge() << "\n";
00094 
00095     Trajectory::DataContainer m=  outInTrackItr->measurements();
00096     int nHit=0;
00097     for (Trajectory::DataContainer::iterator itm = m.begin(); itm != m.end(); ++itm) {
00098       if ( itm->recHit()->isValid()  ) {
00099         nHit++;
00100         LogDebug("InOutConversionSeedFinder") << nHit << ")  Valid RecHit global position " << itm->recHit()->globalPosition() << " R " <<  itm->recHit()->globalPosition().perp() << " phi " << itm->recHit()->globalPosition().phi() << " eta " << itm->recHit()->globalPosition().eta() << "\n";
00101       } 
00102 
00103     }
00104 
00105   }
00106 
00107   */
00108 
00109 
00110   //Start looking for seeds for both of the 2 best tracks from the inward tracking
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     //Find the first valid hit of the track
00116     // Measurements are ordered according to the direction in which the trajectories were built
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     //    for(unsigned int i = 0; i < allLayers.size(); ++i) {
00123     // LogDebug("InOutConversionSeedFinder") <<  " allLayers " << allLayers[i] << "\n"; 
00124     // printLayer(i);
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     //    for( unsigned int i = 0; i < myLayers.size(); ++i) {
00155     // LogDebug("InOutConversionSeedFinder") <<  " myLayers " << myLayers[i] << " myItr " << myItr[i] << "\n"; 
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       // Propagate to the previous layer
00234       // The present layer is actually included in the loop so that a partner can be searched for
00235       // Applying the propagator to the same layer does not do any harm. It simply does nothing
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         //LogDebug("InOutConversionSeedFinder") << "  InOutConversionSeedFinder::fillClusterSeeds stateAtPreviousLayer " << stateAtPreviousLayer <<std:: endl;
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   }  // End loop over Out In tracks
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   // Get a list of basic clusters that are consistent with a track 
00295   // starting at the assumed conversion point with opp. charge to the 
00296   // inward track.  Loop over these basic clusters.
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   // debug
00310   //  for(bcItr = bcVec.begin(); bcItr != bcVec.end(); ++bcItr) {
00311   //   LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::startSeed list of  bc eta " << (*bcItr)->position().eta() << " phi " << (*bcItr)->position().phi() << " x " << (*bcItr)->position().x() << " y " << (*bcItr)->position().y() << " z " << (*bcItr)->position().z() << "\n";
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     // Require phi of cluster to be consistent with the conversion 
00360     // position and the track charge
00361     
00362     
00363     if (fabs(theBcPhi-theConvPhi ) < .5 &&
00364         ((charge<0 && theBcPhi-theConvPhi >-.5) || 
00365          (charge>0 && theBcPhi-theConvPhi <.5))){
00366       //LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::getSecondCaloClusters  Adding bc pointer " << &(*bcItr) << "  to vector:" << "\n";
00367       
00368       //result.push_back(&(*bcItr));
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   // create error matrix
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   // Make an FTS consistent with the start point, start direction and curvature
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   //thePropagatorWithMaterial_.setPropagationDirection(alongMomentum);
00415   
00416   //float dphi = 0.01;
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     //    if ( layer->location() == GeomDetEnumerators::barrel ) {const BarrelDetLayer * barrelLayer = dynamic_cast<const BarrelDetLayer*>(layer);
00426     //LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds  ****  Barrel on layer " << ilayer  << " R= " << barrelLayer->specificSurface().radius() <<  "\n";     
00427     //} else {
00428     // const ForwardDetLayer * forwardLayer = dynamic_cast<const ForwardDetLayer*>(layer);
00429     // LogDebug("InOutConversionSeedFinder") << "InOutConversionSeedFinder::findSeeds  ****  Forw on layer " << ilayer  << " Z= " << forwardLayer->specificSurface().position().z() <<  "\n"; 
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     // Get measurements compatible with the FTS and Estimator
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     //Loop over compatible hits
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         // Make a new helix as in fillClusterSeeds() but using the hit position
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         //     << ", bcet = " << theBc->Et() 
00485         //     << ", estimatedPt/bcet = " << estimatedPt/theBc->Et() << endl;
00486         
00487         
00488         // Make a new FTS
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         // Soome diagnostic output
00499         // may be useful - comparission of the basic cluster position 
00500         // with the ecal impact position of the track
00501         TrajectoryStateOnSurface stateAtECAL
00502         = forwardPropagator.propagate(newfts, ECALSurfaces::barrel());
00503         if (!stateAtECAL.isValid() || abs(stateAtECAL.globalPosition().eta())>1.479) {
00504         if (startingState.globalDirection().eta() > 0.) {
00505         stateAtECAL = forwardPropagator.propagate(newfts, 
00506         ECALSurfaces::positiveEtaEndcap());
00507         } else {
00508         stateAtECAL = forwardPropagator.propagate(newfts, 
00509         ECALSurfaces::negativeEtaEndcap());
00510         }
00511         }
00512         GlobalPoint ecalImpactPosition = stateAtECAL.isValid() ? stateAtECAL.globalPosition() : GlobalPoint(0.,0.,0.);
00513         cout << "Projected fts positon at ECAL surface: " << 
00514         ecalImpactPosition << " bc position: " << theBc->Position() << endl;
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   // A seed is made from 2 Trajectory Measuremennts.  The 1st is the input
00543   // argument m1.  This routine looks for the 2nd measurement in layer ilayer
00544   // Begin by making a new much stricter MeasurementEstimator based on the
00545   // position errors of the 1st hit.
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     LogDebug("InOutConversionSeedFinder") << "hit surface " <<  m1.recHit()->det()->surface().position() << "\n";
00612     LogDebug("InOutConversionSeedFinder") << "prop to " << typeid( m1.recHit()->det()->surface() ).name() <<"\n";
00613     LogDebug("InOutConversionSeedFinder") << "prop to first hit " << state1 << "\n"; 
00614     LogDebug("InOutConversionSeedFinder") << "update to " <<  m1.recHit()->globalPosition() << "\n";
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 }

Generated on Tue Jun 9 17:43:26 2009 for CMSSW by  doxygen 1.5.4