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