![]() |
![]() |
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