00001 #include "RecoTracker/SpecialSeedGenerators/interface/SeedGeneratorForCRack.h"
00002 #include "RecoTracker/TkHitPairs/interface/CosmicLayerPairs.h"
00003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00004 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00005 void
00006 SeedGeneratorForCRack::init(const SiStripRecHit2DCollection &collstereo,
00007 const SiStripRecHit2DCollection &collrphi ,
00008 const SiStripMatchedRecHit2DCollection &collmatched,
00009 const edm::EventSetup& iSetup)
00010 {
00011 iSetup.get<IdealMagneticFieldRecord>().get(magfield);
00012 iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
00013 thePropagatorAl= new PropagatorWithMaterial(alongMomentum,0.1057,&(*magfield) );
00014 thePropagatorOp= new PropagatorWithMaterial(oppositeToMomentum,0.1057,&(*magfield) );
00015 theUpdator= new KFUpdator();
00016
00017
00018
00019 edm::ESHandle<TransientTrackingRecHitBuilder> theBuilder;
00020
00021 iSetup.get<TransientRecHitRecord>().get(builderName,theBuilder);
00022 TTTRHBuilder = theBuilder.product();
00023 CosmicLayerPairs cosmiclayers(geometry);
00024 cosmiclayers.init(collstereo,collrphi,collmatched,iSetup);
00025 thePairGenerator=new CosmicHitPairGenerator(cosmiclayers,iSetup);
00026 HitPairs.clear();
00027 thePairGenerator->hitPairs(region,HitPairs,iSetup);
00028 LogDebug("CosmicSeedFinder") <<"Initialized with " << HitPairs.size() << " hit pairs" << std::endl;
00029 }
00030
00031 SeedGeneratorForCRack::SeedGeneratorForCRack(edm::ParameterSet const& conf):
00032 conf_(conf), region(conf.getParameter<double>("ptMin")
00033 ,conf.getParameter<double>("originRadius")
00034 ,conf.getParameter<double>("originHalfLength")
00035 ,conf.getParameter<double>("originZPosition")
00036 )
00037 {
00038 seedpt = conf_.getParameter<double>("SeedPt");
00039 builderName = conf_.getParameter<std::string>("TTRHBuilder");
00040 geometry=conf_.getUntrackedParameter<std::string>("GeometricStructure","STANDARD");
00041 multipleScatteringFactor=conf_.getUntrackedParameter<double>("multipleScatteringFactor", 1.0);
00042 seedMomentum =conf_.getUntrackedParameter<double>("SeedMomentum",1);
00043 }
00044
00045 void SeedGeneratorForCRack::run(TrajectorySeedCollection &output,const edm::EventSetup& iSetup){
00046 seeds(output,iSetup,region);
00047 delete thePairGenerator;
00048 delete thePropagatorAl;
00049 delete thePropagatorOp;
00050 delete theUpdator;
00051 }
00052
00053 void SeedGeneratorForCRack::seeds(TrajectorySeedCollection &output,
00054 const edm::EventSetup& iSetup,
00055 const TrackingRegion& region){
00056 for(unsigned int is=0;is<HitPairs.size();is++){
00057
00058 GlobalPoint inner = tracker->idToDet((*(HitPairs[is].inner())).geographicalId())->surface().toGlobal((*(HitPairs[is].inner())).localPosition());
00059 GlobalPoint outer = tracker->idToDet((*(HitPairs[is].outer())).geographicalId())->surface().toGlobal((*(HitPairs[is].outer())).localPosition());
00060
00061 LogDebug("CosmicSeedFinder") <<"inner point of the seed "<<inner <<" outer point of the seed "<<outer;
00062 TransientTrackingRecHit::ConstRecHitPointer inrhit=TTTRHBuilder->build(HitPairs[is].inner()->hit());
00063 TransientTrackingRecHit::ConstRecHitPointer outrhit = TTTRHBuilder->build(HitPairs[is].outer()->hit());
00064
00065 edm::OwnVector<TrackingRecHit> hits;
00066 hits.push_back(HitPairs[is].outer()->hit()->clone());
00067
00068 for (int i=0;i<2;i++){
00069
00070 int predsign=(2*i)-1;
00071 if((outer.y()-inner.y())>0){
00072 GlobalVector momentum = GlobalVector(inner-outer);
00073 momentum = momentum.unit()*seedMomentum;
00074 GlobalTrajectoryParameters Gtp(inner,
00075 momentum,
00076 predsign,
00077 &(*magfield));
00078 AlgebraicSymMatrix55 errMatrix = ROOT::Math::SMatrixIdentity();
00079 TSOS innerState = TSOS(Gtp, CurvilinearTrajectoryError(errMatrix), tracker->idToDet((HitPairs[is].inner()->hit())->geographicalId())->surface());
00080 const TSOS innerUpdated = theUpdator->update(innerState, *inrhit);
00081
00082 LogDebug("CosmicSeedFinder") << " FirstTSOS " << innerUpdated;
00083
00084
00085 const TSOS outerState =
00086 thePropagatorOp->propagate(innerUpdated,
00087 tracker->idToDet((*(HitPairs[is].outer())).geographicalId())->surface());
00088 if ( outerState.isValid()) {
00089 LogDebug("CosmicSeedFinder") <<"outerState "<<outerState;
00090 TSOS outerUpdated= theUpdator->update( outerState,*outrhit);
00091
00092 outerUpdated.rescaleError( multipleScatteringFactor);
00093 if ( outerUpdated.isValid()) {
00094 LogDebug("CosmicSeedFinder") <<"outerUpdated "<<outerUpdated;
00095
00096 PTrajectoryStateOnDet PTraj=
00097 trajectoryStateTransform::persistentState(outerUpdated, (*(HitPairs[is].outer())).geographicalId().rawId());
00098 output.push_back(TrajectorySeed(PTraj,hits,alongMomentum));
00099
00100 }else edm::LogWarning("CosmicSeedFinder") << " SeedForCosmics first update failed ";
00101 }else edm::LogWarning("CosmicSeedFinder") << " SeedForCosmics first propagation failed ";
00102
00103
00104 }
00105 else{
00106 GlobalVector momentum= GlobalVector(outer-inner);
00107 momentum=momentum.unit()*seedMomentum;
00108 GlobalTrajectoryParameters Gtp(inner,
00109 momentum,
00110 predsign,
00111 &(*magfield));
00112 AlgebraicSymMatrix55 errMatrix = ROOT::Math::SMatrixIdentity();
00113 TSOS innerState = TSOS(Gtp, CurvilinearTrajectoryError(errMatrix), tracker->idToDet((HitPairs[is].inner()->hit())->geographicalId())->surface());
00114 const TSOS innerUpdated = theUpdator->update(innerState, *inrhit);
00115 LogDebug("CosmicSeedFinder") << " FirstTSOS "<< innerState;
00116
00117
00118 const TSOS outerState =
00119 thePropagatorOp->propagate(innerUpdated,
00120 tracker->idToDet((*(HitPairs[is].outer())).geographicalId())->surface());
00121 if ( outerState.isValid()) {
00122
00123 LogDebug("CosmicSeedFinder") <<"outerState "<<outerState;
00124 TSOS outerUpdated = theUpdator->update( outerState,*outrhit);
00125
00126 outerUpdated.rescaleError( multipleScatteringFactor);
00127 if ( outerUpdated.isValid()) {
00128 LogDebug("CosmicSeedFinder") <<"outerUpdated "<<outerUpdated;
00129 PTrajectoryStateOnDet PTraj=
00130 trajectoryStateTransform::persistentState(outerUpdated,(*(HitPairs[is].outer())).geographicalId().rawId());
00131 output.push_back(TrajectorySeed(PTraj,hits,oppositeToMomentum));
00132
00133 }else edm::LogWarning("CosmicSeedFinder") << " SeedForCosmics first update failed ";
00134 }else edm::LogWarning("CosmicSeedFinder") << " SeedForCosmics first propagation failed ";
00135 }
00136 }
00137 }
00138 }
00139