CMS 3D CMS Logo

SeedGeneratorForLaserBeams.cc

Go to the documentation of this file.
00001 
00009 #include "Alignment/LaserAlignment/interface/SeedGeneratorForLaserBeams.h"
00010 #include "FWCore/Framework/interface/EventSetup.h" 
00011 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h" 
00012 #include "RecoTracker/TkSeedingLayers/interface/SeedingLayer.h" 
00013 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h" 
00014 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" 
00015 #include "boost/mpl/vector.hpp" 
00016 #include "DataFormats/GeometrySurface/interface/Surface.h" 
00017 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h" 
00018 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h" 
00019 #include "Alignment/LaserAlignment/interface/LaserLayerPairs.h"
00020 
00021 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00022 #include "FWCore/Framework/interface/ESHandle.h" 
00023 #include "DataFormats/CLHEP/interface/AlgebraicObjects.h" 
00024 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00025 
00026 
00027         SeedGeneratorForLaserBeams::SeedGeneratorForLaserBeams(edm::ParameterSet const& iConfig) 
00028           : conf_(iConfig), region(), 
00029         thePairGenerator(), magfield(), tracker(), transformer(), theUpdator(),
00030         thePropagatorMaterialAl(), thePropagatorMaterialOp(), thePropagatorAnalyticalAl(),
00031         thePropagatorAnalyticalOp(), TTRHBuilder(), builderName(), propagatorName()
00032 {
00033         double ptmin = conf_.getParameter<double>("ptMin");
00034         double originradius = conf_.getParameter<double>("originRadius");
00035         double halflength = conf_.getParameter<double>("originHalfLength");
00036         double originz = conf_.getParameter<double>("originZPosition");
00037         builderName = conf_.getParameter<std::string>("TTRHBuilder");
00038   propagatorName = conf_.getParameter<std::string>("Propagator");
00039 
00040         region = GlobalTrackingRegion(ptmin, originradius, halflength, originz);
00041 
00042         edm::LogInfo("SeedGeneratorForLaserBeams") << " Using " << propagatorName 
00043           << " Propagator,  PtMin of track is " << ptmin
00044                 << " The Radius of the cylinder for seeds is " << originradius << " cm";
00045 }
00046 
00047 SeedGeneratorForLaserBeams::~SeedGeneratorForLaserBeams()
00048 {
00049   if (propagatorName == "WithMaterial")
00050   {
00051     if ( thePropagatorMaterialAl != 0 ) { delete thePropagatorMaterialAl; }
00052     if ( thePropagatorMaterialOp != 0 ) { delete thePropagatorMaterialOp; }
00053   }
00054   else if (propagatorName == "Analytical")
00055   {
00056     if ( thePropagatorAnalyticalAl != 0 ) { delete thePropagatorAnalyticalAl; }
00057     if ( thePropagatorAnalyticalOp != 0 ) { delete thePropagatorAnalyticalOp; }
00058   }     
00059   if ( theUpdator != 0 ) { delete theUpdator; }
00060         if ( thePairGenerator != 0) { delete thePairGenerator; }
00061 }
00062 
00063 void SeedGeneratorForLaserBeams::init(const SiStripRecHit2DCollection &collstereo,
00064         const SiStripRecHit2DCollection &collrphi,
00065         const SiStripMatchedRecHit2DCollection &collmatched,
00066         const edm::EventSetup & iSetup)
00067 {
00068         iSetup.get<IdealMagneticFieldRecord>().get(magfield);
00069         iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
00070 
00071   if ( propagatorName == "WithMaterial" )
00072   {
00073     thePropagatorMaterialAl = new PropagatorWithMaterial(alongMomentum, 0.0, &(*magfield) );
00074     thePropagatorMaterialOp = new PropagatorWithMaterial(oppositeToMomentum, 0.0, &(*magfield) );
00075   }     
00076   else if ( propagatorName == "Analytical" )
00077   {
00078     thePropagatorAnalyticalAl = new AnalyticalPropagator(&(*magfield), alongMomentum);
00079     thePropagatorAnalyticalOp = new AnalyticalPropagator(&(*magfield), oppositeToMomentum);
00080   }
00081 
00082   theUpdator = new KFUpdator();
00083 
00084         // get the transient builder
00085         edm::ESHandle<TransientTrackingRecHitBuilder> theBuilder;
00086         iSetup.get<TransientRecHitRecord>().get(builderName, theBuilder);
00087         TTRHBuilder = theBuilder.product();
00088 
00089         LaserLayerPairs laserLayers;
00090         laserLayers.init(collstereo, collrphi, collmatched, iSetup);
00091         thePairGenerator = new LaserHitPairGenerator(laserLayers, iSetup);
00092 }
00093 
00094 void SeedGeneratorForLaserBeams::run(TrajectorySeedCollection & output, const edm::EventSetup & iSetup)
00095 {
00096         OrderedLaserHitPairs HitPairs;
00097         thePairGenerator->hitPairs(region, HitPairs, iSetup);
00098 
00099         if (HitPairs.size() > 0)
00100         {
00101                 stable_sort(HitPairs.begin(), HitPairs.end(), CompareHitPairsZ(iSetup) );
00102 
00103     if (propagatorName == "WithMaterial")
00104     {
00105       propagateWithMaterial(HitPairs, output);
00106     }
00107     else if ( propagatorName == "Analytical")
00108     {
00109       propagateAnalytical(HitPairs, output);
00110     }
00111         }
00112 }
00113 
00114 void SeedGeneratorForLaserBeams::propagateWithMaterial(OrderedLaserHitPairs & HitPairs, TrajectorySeedCollection & output)
00115 {
00116   for (uint i = 0; i < HitPairs.size(); i++)
00117   {
00118     GlobalPoint inner = tracker->idToDet(HitPairs[i].inner()->geographicalId())->surface().toGlobal(HitPairs[i].inner()->localPosition());
00119     GlobalPoint outer = tracker->idToDet(HitPairs[i].outer()->geographicalId())->surface().toGlobal(HitPairs[i].outer()->localPosition());
00120 
00121     TransientTrackingRecHit::ConstRecHitPointer outrhit = TTRHBuilder->build(HitPairs[i].outer());
00122 
00123     edm::OwnVector<TrackingRecHit> hits;
00124     hits.push_back(HitPairs[i].inner()->clone());
00125     hits.push_back(HitPairs[i].outer()->clone());
00126 
00127     if ( ( (outer.z()-inner.z())>0 && outer.z() > 0 && inner.z() > 0 ) 
00128       || ( (outer.z() - inner.z()) < 0 && outer.z() < 0 && inner.z() < 0 ) )
00129     {
00130         // the 0 is a possible problem!!!!
00131         //        GlobalTrajectoryParameters Gtp(outer, inner-outer, 0, &(*magfield));
00132       GlobalTrajectoryParameters Gtp(outer, outer-inner, -1, &(*magfield));
00133       FreeTrajectoryState LaserSeed(Gtp, CurvilinearTrajectoryError(AlgebraicSymMatrix(5,1)));
00134 
00135       LogDebug("SeedGeneratorForLaserBeams:propagateWithMaterial") << " FirstTSOS " << LaserSeed;
00136 
00137           // First propagation
00138       const TSOS outerState = thePropagatorMaterialAl->propagate(LaserSeed, tracker->idToDet(HitPairs[i].outer()->geographicalId())->surface());
00139 
00140       if (outerState.isValid())
00141       {
00142         LogDebug("SeedGeneratorForLaserBeams:propagateWithMaterial") << " outerState " << outerState;
00143         const TSOS outerUpdated = theUpdator->update( outerState, *outrhit);
00144 
00145         if (outerUpdated.isValid())
00146         {
00147           LogDebug("SeedGeneratorForLaserBeams:propagateWithMaterial") << " outerUpdated " << outerUpdated;
00148 
00149           PTrajectoryStateOnDet *pTraj = transformer.persistentState(outerUpdated, HitPairs[i].outer()->geographicalId().rawId());
00150           TrajectorySeed * trSeed = new TrajectorySeed(*pTraj, hits, alongMomentum);
00151             // store seed
00152           output.push_back(*trSeed);
00153         }
00154         else { edm::LogError("SeedGeneratorForLaserBeams:propagateWithMaterial") << " SeedForLaserBeams first update failed "; }
00155       }
00156       else { edm::LogError("SeedGeneratorForLaserBeams:propagateWithMaterial") << " SeedForLaserBeams first propagation failed "; }
00157     }
00158     else 
00159     {
00160           // the 0 is a possible problem!!!!
00161           //      GlobalTrajectoryParameters Gtp(outer, outer-inner, 0, &(*magfield));
00162       GlobalTrajectoryParameters Gtp(outer, outer-inner, -1, &(*magfield));
00163       FreeTrajectoryState LaserSeed(Gtp, CurvilinearTrajectoryError(AlgebraicSymMatrix(5,1)));
00164       LogDebug("SeedGeneratorForLaserBeams:propagateWithMaterial") << " FirstTSOS " << LaserSeed;
00165 
00166           // First propagation
00167       const TSOS outerState = thePropagatorMaterialOp->propagate(LaserSeed, tracker->idToDet(HitPairs[i].outer()->geographicalId())->surface());
00168 
00169       if (outerState.isValid())
00170       {
00171         LogDebug("SeedGeneratorForLaserBeams:propagateWithMaterial") << " outerState " << outerState;
00172         const TSOS outerUpdated = theUpdator->update(outerState, *outrhit);
00173 
00174         if (outerUpdated.isValid())
00175         {
00176           LogDebug("SeedGeneratorForLaserBeams:propagateWithMaterial") << " outerUpdated " << outerUpdated;
00177           PTrajectoryStateOnDet *pTraj = transformer.persistentState(outerUpdated, HitPairs[i].outer()->geographicalId().rawId());
00178 
00179           TrajectorySeed *trSeed = new TrajectorySeed(*pTraj, hits, oppositeToMomentum);
00180             // store seed
00181           output.push_back(*trSeed);
00182         }
00183         else { edm::LogError("SeedGeneratorForLaserBeams:propagateWithMaterial") << " SeedForLaserBeams first update failed "; }
00184       }
00185       else { edm::LogError("SeedGeneratorForLaserBeams:propagateWithMaterial") << " SeedForLaserBeams first propagation failed "; }
00186     }
00187   }
00188 }
00189 
00190 void SeedGeneratorForLaserBeams::propagateAnalytical(OrderedLaserHitPairs & HitPairs, TrajectorySeedCollection & output)
00191 {
00192   for (uint i = 0; i < HitPairs.size(); i++)
00193   {
00194     GlobalPoint inner = tracker->idToDet(HitPairs[i].inner()->geographicalId())->surface().toGlobal(HitPairs[i].inner()->localPosition());
00195     GlobalPoint outer = tracker->idToDet(HitPairs[i].outer()->geographicalId())->surface().toGlobal(HitPairs[i].outer()->localPosition());
00196 
00197     TransientTrackingRecHit::ConstRecHitPointer outrhit = TTRHBuilder->build(HitPairs[i].outer());
00198 
00199     edm::OwnVector<TrackingRecHit> hits;
00200     hits.push_back(HitPairs[i].inner()->clone());
00201     hits.push_back(HitPairs[i].outer()->clone());
00202 
00203     if ( ( (outer.z()-inner.z())>0 && outer.z() > 0 && inner.z() > 0 ) 
00204       || ( (outer.z() - inner.z()) < 0 && outer.z() < 0 && inner.z() < 0 ) )
00205     {
00206         // the 0 is a possible problem!!!!
00207         //        GlobalTrajectoryParameters Gtp(outer, inner-outer, 0, &(*magfield));
00208       GlobalTrajectoryParameters Gtp(outer, outer-inner, -1, &(*magfield));
00209       FreeTrajectoryState LaserSeed(Gtp, CurvilinearTrajectoryError(AlgebraicSymMatrix(5,1)));
00210 
00211       LogDebug("SeedGeneratorForLaserBeams:propagateAnalytical") << " FirstTSOS " << LaserSeed;
00212 
00213           // First propagation
00214       const TSOS outerState = thePropagatorAnalyticalAl->propagate(LaserSeed, tracker->idToDet(HitPairs[i].outer()->geographicalId())->surface());
00215 
00216       if (outerState.isValid())
00217       {
00218         LogDebug("SeedGeneratorForLaserBeams:propagateAnalytical") << " outerState " << outerState;
00219         const TSOS outerUpdated = theUpdator->update( outerState, *outrhit);
00220 
00221         if (outerUpdated.isValid())
00222         {
00223           LogDebug("SeedGeneratorForLaserBeams:propagateAnalytical") << " outerUpdated " << outerUpdated;
00224 
00225           PTrajectoryStateOnDet *pTraj = transformer.persistentState(outerUpdated, HitPairs[i].outer()->geographicalId().rawId());
00226           TrajectorySeed * trSeed = new TrajectorySeed(*pTraj, hits, alongMomentum);
00227             // store seed
00228           output.push_back(*trSeed);
00229         }
00230         else { edm::LogError("SeedGeneratorForLaserBeams:propagateAnalytical") << " SeedForLaserBeams first update failed "; }
00231       }
00232       else { edm::LogError("SeedGeneratorForLaserBeams:propagateAnalytical") << " SeedForLaserBeams first propagation failed "; }
00233     }
00234     else 
00235     {
00236           // the 0 is a possible problem!!!!
00237           //      GlobalTrajectoryParameters Gtp(outer, outer-inner, 0, &(*magfield));
00238       GlobalTrajectoryParameters Gtp(outer, outer-inner, -1, &(*magfield));
00239       FreeTrajectoryState LaserSeed(Gtp, CurvilinearTrajectoryError(AlgebraicSymMatrix(5,1)));
00240       LogDebug("SeedGeneratorForLaserBeams:propagateWithAnalytical") << " FirstTSOS " << LaserSeed;
00241 
00242           // First propagation
00243       const TSOS outerState = thePropagatorAnalyticalOp->propagate(LaserSeed, tracker->idToDet(HitPairs[i].outer()->geographicalId())->surface());
00244 
00245       if (outerState.isValid())
00246       {
00247         LogDebug("SeedGeneratorForLaserBeams:propagateAnalytical") << " outerState " << outerState;
00248         const TSOS outerUpdated = theUpdator->update(outerState, *outrhit);
00249 
00250         if (outerUpdated.isValid())
00251         {
00252           LogDebug("SeedGeneratorForLaserBeams:propagateAnalytical") << " outerUpdated " << outerUpdated;
00253           PTrajectoryStateOnDet *pTraj = transformer.persistentState(outerUpdated, HitPairs[i].outer()->geographicalId().rawId());
00254 
00255           TrajectorySeed *trSeed = new TrajectorySeed(*pTraj, hits, oppositeToMomentum);
00256             // store seed
00257           output.push_back(*trSeed);
00258         }
00259         else { edm::LogError("SeedGeneratorForLaserBeams:propagateAnalytical") << " SeedForLaserBeams first update failed "; }
00260       }
00261       else { edm::LogError("SeedGeneratorForLaserBeams:propagateAnalytical") << " SeedForLaserBeams first propagation failed "; }
00262     }
00263   }
00264 }
00265 

Generated on Tue Jun 9 17:24:09 2009 for CMSSW by  doxygen 1.5.4