CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC4_patch1/src/SLHCUpgradeSimulations/L1TrackTrigger/interface/L1TkTrackBuilder.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #ifndef L1TK_TRACK_BUILDER_H
00010 #define L1TK_TRACK_BUILDER_H
00011 
00012 #include "FWCore/Framework/interface/Frameworkfwd.h"
00013 #include "FWCore/Framework/interface/EDProducer.h"
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/Framework/interface/EventSetup.h"
00016 #include "FWCore/Framework/interface/ESHandle.h"
00017 #include "FWCore/Framework/interface/MakerMacros.h"
00018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00019 
00020 //#include "SLHCUpgradeSimulations/Utilities/interface/StackedTrackerDetId.h"
00021 #include "SLHCUpgradeSimulations/L1TrackTrigger/interface/TrackingAlgorithm.h"
00022 #include "SLHCUpgradeSimulations/L1TrackTrigger/interface/TrackingAlgorithmRecord.h"
00023 #include "classNameFinder.h"
00024 
00025 #include <memory>
00026 #include <map>
00027 #include <vector>
00028 
00035 template<  typename T  >
00036 class L1TkTrackBuilder : public edm::EDProducer
00037 {
00038   public:
00039 /*
00040     typedef L1TkStub< T >                                     L1TkStubType;
00041     typedef edm::Ptr< L1TkStubType >                                       L1TkStubPtrType;
00042     typedef std::vector< L1TkStub< T > >                      L1TkStubCollectionType;
00043     typedef L1TkTracklet< T >                                 L1TkTrackletType;
00044     typedef edm::Ptr< L1TkTrackletType >                                   L1TkTrackletPtrType;
00045     typedef std::vector< L1TkTrackletType >                                L1TkTrackletCollectionType;
00046     typedef L1TkTrack< T >                                    L1TkTrackType;
00047     typedef std::vector< L1TkTrackType >                                   L1TkTrackCollectionType;
00048     typedef std::map< unsigned int, std::vector< L1TkStubPtrType > >       L1TkStubMapType;
00049     typedef std::map< unsigned int, std::vector< L1TkTrackletPtrType > >   L1TkTrackletMapType;
00050     typedef std::set< std::pair< unsigned int , L1TkStubPtrType > >        L1TkTrackletMap;
00051 */
00052 
00054     explicit L1TkTrackBuilder( const edm::ParameterSet& iConfig );
00055 
00057     ~L1TkTrackBuilder();
00058 
00059   private:
00062 //    edm::ESHandle< StackedTrackerGeometry >        StackedTrackerGeomHandle;
00063     const StackedTrackerGeometry            *theStackedTracker;
00064 //    StackedTrackerGeometry::StackContainerIterator StackedTrackerIterator;
00066     edm::ESHandle< TrackingAlgorithm< T > > TrackingAlgoHandle;
00067     edm::InputTag                                        L1TkStubsInputTag;
00069 //    bool                                                 wantTrackletSeeds;
00070 
00071 
00072 
00073 
00074 //    edm::InputTag                                          L1TkTrackletInputTag;
00075 
00076 //    bool                                                   useAlsoSeedVtx;
00077 //    bool                                                   doHelixFit;
00078 //    bool                                                   removeDuplicates;
00079 //    std::vector< unsigned int >                            allowedDoubleStacks;
00080 
00082 //    double mMagneticFieldStrength;
00083 
00085 
00088     virtual void beginRun( edm::Run& run, const edm::EventSetup& iSetup );
00089     virtual void endRun( edm::Run& run, const edm::EventSetup& iSetup );
00090     virtual void produce( edm::Event& iEvent, const edm::EventSetup& iSetup );
00091 
00092 }; 
00093 
00100 
00101 template< typename T >
00102 L1TkTrackBuilder< T >::L1TkTrackBuilder( const edm::ParameterSet& iConfig )
00103 {
00104   produces< std::vector< L1TkTrack< T > > >();
00105   L1TkStubsInputTag = iConfig.getParameter< edm::InputTag >("L1TkStubsBricks");
00106 
00108 //  L1TkTrackletInputTag = iConfig.getParameter< edm::InputTag >("L1TkTrackletSeed"); /// The kind of seed
00109 //  useAlsoSeedVtx       = iConfig.getParameter< bool >("UseAlsoSeedVertex");
00110 //  doHelixFit           = iConfig.getParameter< bool >("DoHelixFit");
00111 //  removeDuplicates     = iConfig.getParameter< bool >("RemoveDuplicates");
00112 //  allowedDoubleStacks  = iConfig.getParameter< std::vector< unsigned int > >("SeedDoubleStacks");
00113 }
00114 
00116 template< typename T >
00117 L1TkTrackBuilder< T >::~L1TkTrackBuilder() {}
00118 
00120 template< typename T >
00121 void L1TkTrackBuilder< T >::beginRun( edm::Run& run, const edm::EventSetup& iSetup )
00122 {
00124   edm::ESHandle< StackedTrackerGeometry > StackedTrackerGeomHandle;
00125   iSetup.get< StackedTrackerGeometryRecord >().get( StackedTrackerGeomHandle );
00126   theStackedTracker = StackedTrackerGeomHandle.product();
00127 
00129   iSetup.get< TrackingAlgorithmRecord >().get( TrackingAlgoHandle );
00131   std::cout  << "L1TkTrackBuilder<" << templateNameFinder<T>() << "> loaded modules:"
00132              << "\n\tTrackingAlgorithm:\t" << TrackingAlgoHandle->AlgorithmName()
00133              << std::endl;
00134 
00136 //  edm::ESHandle<MagneticField> magnet;
00137 //  iSetup.get<IdealMagneticFieldRecord>().get(magnet);
00138 //  mMagneticFieldStrength = magnet->inTesla(GlobalPoint(0,0,0)).z();
00139 
00141 //  mMagneticFieldStrength = (floor(mMagneticFieldStrength*10.0 + 0.5))/10.0;
00142 }
00143 
00145 template< typename T >
00146 void L1TkTrackBuilder< T >::endRun( edm::Run& run, const edm::EventSetup& iSetup ) {}
00147 
00149 template< typename T >
00150 void L1TkTrackBuilder< T >::produce( edm::Event& iEvent, const edm::EventSetup& iSetup )
00151 {
00155   std::vector< L1TkTrack< T > > tempTrackCollection;
00156   tempTrackCollection.clear();
00157   std::auto_ptr< std::vector< L1TkTrack< T > > > L1TkTracksForOutput( new std::vector< L1TkTrack< T > > );
00158 
00160   edm::Handle< std::vector< L1TkStub< T > > > L1TkStubHandle;
00161   iEvent.getByLabel( L1TkStubsInputTag, L1TkStubHandle);
00162 
00163   std::vector< L1TkTrack< T > > theseSeeds;
00164   TrackingAlgoHandle->CreateSeeds( theseSeeds, L1TkStubHandle );
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 /*
00177   edm::Handle< L1TkStubCollectionType >     L1TkStubHandleBricks;
00178   edm::Handle< L1TkTrackletCollectionType > L1TkTrackletHandleSeed;
00179   iEvent.getByLabel( L1TkStubsInputTag, L1TkStubHandleBricks );
00180   iEvent.getByLabel( L1TkTrackletInputTag, L1TkTrackletHandleSeed );
00181   
00185   L1TkTrackCollectionType tempTrackCollection;
00186   tempTrackCollection.clear();
00187   std::auto_ptr< L1TkTrackCollectionType > L1TkTracksForOutput( new L1TkTrackCollectionType );
00188 
00191   L1TkTrackletMapType SeedTracklets;
00192   for ( unsigned int i = 0; i != L1TkTrackletHandleSeed->size(); ++i )
00193   {
00195     StackedTrackerDetId stDetId0( L1TkTrackletHandleSeed->at(i).getStubRef(0)->getDetId() );
00196     StackedTrackerDetId stDetId1( L1TkTrackletHandleSeed->at(i).getStubRef(1)->getDetId() );
00197     unsigned int stack0 = stDetId0.iLayer();
00198     unsigned int stack1 = stDetId1.iLayer();
00199 
00200     unsigned int doubleStack = stack0/2;
00201     if ( doubleStack != (stack1-1)/2 ) continue; /// Reject bad formed Tracklets
00202  
00203     unsigned int ladder0 = stDetId0.iPhi();
00204     unsigned int ladder1 = stDetId1.iPhi();
00205     if ( ladder0 != ladder1 ) continue; /// Reject bad formed Tracklets
00206 
00208     bool skip = true;
00209     for ( unsigned int t = 0; t < allowedDoubleStacks.size(); t++ )
00210       if ( allowedDoubleStacks.at(t) == doubleStack )
00211         skip = false;
00212     if ( allowedDoubleStacks.size() != 0 && skip ) continue;
00213 
00214     SeedTracklets[ doubleStack ].push_back( L1TkTrackletPtrType( L1TkTrackletHandleSeed, i ) );
00215   }
00216 
00221   L1TkStubMapType BrickStubs;
00222   for ( unsigned int i = 0; i != L1TkStubHandleBricks->size(); ++i )
00223   {
00224 
00225     StackedTrackerDetId stDetId( L1TkStubHandleBricks->at(i).getDetId() );
00226 
00227     unsigned int stack = stDetId.iLayer();
00228     unsigned int doubleStack;
00229     if ( stack%2 == 0 ) doubleStack = stack/2;
00230     else doubleStack = (stack-1)/2;
00231 
00233     bool skip = true;
00234     for ( unsigned int t = 0; t < allowedDoubleStacks.size(); t++ )
00235       if ( allowedDoubleStacks.at(t) == doubleStack )
00236         skip = false;
00237     if ( allowedDoubleStacks.size() != 0 && skip ) continue;
00238 
00239     for ( unsigned int q = 0; q < 5; q++ )
00240     {
00241       if ( doubleStack != q) BrickStubs[ q ].push_back( L1TkStubPtrType( L1TkStubHandleBricks , i ) );
00242     }
00243   }
00244 
00247   for ( unsigned int j = 0; j < 5; j++ )
00248   {
00251     std::vector< L1TkTrackletPtrType > theSeeds  = SeedTracklets[j];
00252     std::vector< L1TkStubPtrType >     theBricks = BrickStubs[j];
00253 
00256     for ( unsigned int k = 0; k < theSeeds.size(); k++ )
00257     {
00260       std::vector< L1TkTrack< T > > allCandTracks;
00261       allCandTracks.clear();
00262       allCandTracks = TrackingAlgoHandle->PropagateSeed( theSeeds.at(k), theBricks );
00263 
00266       for ( unsigned int h = 0; h < allCandTracks.size(); h++ )
00267       {
00268         if ( iEvent.isRealData() == false )
00269           allCandTracks.at(h).checkSimTrack();
00270         allCandTracks.at(h).fitTrack( mMagneticFieldStrength, useAlsoSeedVtx, doHelixFit );
00271         if ( removeDuplicates )
00272           tempTrackCollection.push_back( allCandTracks.at(h) );
00273         else
00274           L1TkTracksForOutput->push_back( allCandTracks.at(h) );
00275       } /// End of loop on candidates
00276 
00277     } /// End of loop on seeds
00278   } /// End of loop on Superlayers
00279 
00283   unsigned int minForDupl = 2;
00284   unsigned int plusVtx = 0;
00285   if ( useAlsoSeedVtx ) plusVtx = 1;
00286 
00288   if ( removeDuplicates )
00289   {
00291     if ( tempTrackCollection.size() != 0 )
00292     {
00293       for ( unsigned int tk = 0; tk < tempTrackCollection.size()-1; tk++ )
00294       {
00295         L1TkStubCollectionType tkStubs0 = tempTrackCollection.at(tk).getStubs();
00296         unsigned int tkNum0 = tkStubs0.size();
00298         if ( tkNum0 == 0 ) continue;
00299         unsigned int tkSeed0 = tempTrackCollection.at(tk).getSeedDoubleStack();
00300 
00302         if ( tempTrackCollection.size() == 1 ) continue;
00303         for ( unsigned int tkk = tk+1; tkk < tempTrackCollection.size(); tkk++ )
00304         {
00305           L1TkStubCollectionType tkStubs1 = tempTrackCollection.at(tkk).getStubs();
00306           unsigned int tkNum1 = tkStubs1.size();
00308           if ( tkNum1 == 0 ) continue;
00309           unsigned int tkSeed1 = tempTrackCollection.at(tkk).getSeedDoubleStack();
00310 
00311           unsigned int numShared = 0;
00312           for ( unsigned int st = 0; st < tkStubs0.size(); st++ )
00313           {
00314             if ( numShared >= minForDupl ) continue;
00315             for ( unsigned int stt = 0; stt < tkStubs1.size(); stt++ )
00316             {
00317               if ( numShared >= minForDupl ) continue;
00318               if ( tkStubs0.at(st).getClusterPtr(0) == tkStubs1.at(stt).getClusterPtr(0) &&
00319                    tkStubs0.at(st).getClusterPtr(1) == tkStubs1.at(stt).getClusterPtr(1) )
00320                 numShared++;
00321             }
00322           } /// End of check if they are shared or not
00323 
00325           if ( numShared < minForDupl ) continue;
00326 
00328           if ( tkSeed1 > tkSeed0 )
00329             tempTrackCollection.at(tkk) = L1TkTrackType();
00330           else if ( tkSeed1 < tkSeed0 )
00331             tempTrackCollection.at(tk) = L1TkTrackType();
00332           else
00333           {
00336             if ( tempTrackCollection.at(tkk).getChi2RPhi() / tkNum1 > tempTrackCollection.at(tk).getChi2RPhi() / tkNum0 )
00337               tempTrackCollection.at(tkk) = L1TkTrackType();
00338             else if ( tempTrackCollection.at(tkk).getChi2RPhi() / tkNum1 < tempTrackCollection.at(tk).getChi2RPhi() / tkNum0 )
00339               tempTrackCollection.at(tk) = L1TkTrackType();
00340             else
00341               std::cerr << "*** I CAN'T BELIEVE IT!! ***" << std::endl;
00342           }
00343         } /// End of Nested loop
00344       } /// End of Loop over pairs Candidate L1TkTracks
00345 
00347       for ( unsigned int tk = 0; tk < tempTrackCollection.size(); tk++ )
00348       {
00349         if ( tempTrackCollection.at(tk).getStubs().size() != 0 )
00350           L1TkTracksForOutput->push_back( tempTrackCollection.at(tk) );
00351       }
00352     } /// End of if ( tempTrackCollection.size() != 0 ) {
00353   } /// End of Implement Duplicate Removal
00354 */
00355 
00357 //  if ( doHelixFit && useAlsoSeedVtx )
00358 //    iEvent.put( L1TkTracksForOutput, "Level1TracksHelFitVtxYes" );
00359 //  else if ( useAlsoSeedVtx )
00360 //    iEvent.put( L1TkTracksForOutput, "Level1TracksStdFitVtxYes" );
00361 //  else if ( doHelixFit )
00362 //    iEvent.put( L1TkTracksForOutput, "Level1TracksHelFitVtxNo" );
00363 //  else
00364 //    iEvent.put( L1TkTracksForOutput, "Level1TracksStdFitVtxNo" );
00365 
00366 }
00367 
00368 #endif
00369