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
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
00131
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
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
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
00161
00162 GlobalTrajectoryParameters Gtp(outer, outer-inner, -1, &(*magfield));
00163 FreeTrajectoryState LaserSeed(Gtp, CurvilinearTrajectoryError(AlgebraicSymMatrix(5,1)));
00164 LogDebug("SeedGeneratorForLaserBeams:propagateWithMaterial") << " FirstTSOS " << LaserSeed;
00165
00166
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
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
00207
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
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
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
00237
00238 GlobalTrajectoryParameters Gtp(outer, outer-inner, -1, &(*magfield));
00239 FreeTrajectoryState LaserSeed(Gtp, CurvilinearTrajectoryError(AlgebraicSymMatrix(5,1)));
00240 LogDebug("SeedGeneratorForLaserBeams:propagateWithAnalytical") << " FirstTSOS " << LaserSeed;
00241
00242
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
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