CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/RecoTracker/SpecialSeedGenerators/src/SeedGeneratorForCRack.cc

Go to the documentation of this file.
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   // get the transient builder
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       //FIRST STATE IS CALCULATED CONSIDERING THAT THE CHARGE CAN BE POSITIVE OR NEGATIVE
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         //Cosmic Seed update inner...
00082         LogDebug("CosmicSeedFinder") << " FirstTSOS " << innerUpdated;
00083         
00084         //First propagation
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           //fudge factor for multiple scattering
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         //First propagation
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           //fudge factor for multiple scattering
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