Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

XANAMuons.cpp

Go to the documentation of this file.
00001 
00002 #include <Utilities/Configuration/interface/Architecture.h>
00003 
00004 #include <XANADOO/XANAMuons/interface/XANAMuonCandidate.h>
00005 #include <XANADOO/XANAMuons/interface/XANAMuonTrack.h>
00006 #include <XANADOO/XANATracks/interface/XANATrack.h>
00007 #include <XANADOO/XANAUtilities/interface/XANAToolkit.h>
00008 
00009 #include "Trigger/L1GlobalMuonTrigger/interface/L1MuGMTSetup.h"
00010 #include "Trigger/L1GlobalMuonTrigger/interface/L1MuGlobalMuonTrigger.h"
00011 #include "Trigger/L1GlobalMuonTrigger/interface/L1MuGMTCand.h"
00012 
00013 #include <CommonReco/PersistentTrack/interface/TTrack.h>
00014 #include <CommonReco/PersistentTrack/interface/TrackReconstructor.h>
00015 #include <CommonReco/PatternTools/interface/TrackFinder.h>
00016 #include <TrackerReco/GtfPattern/interface/ModularKfReconstructor.h>
00017 #include <TrackerReco/TkSeedGenerator/interface/CombinatorialSeedGeneratorFromPixel.h>
00018 #include <TrackerReco/GtfPattern/interface/CombinatorialTrajectoryBuilder.h>
00019 #include <CommonReco/TrackFitters/interface/KFFittingSmoother.h>
00020 #include <CommonReco/PatternTools/interface/TrajectoryCleanerBySharedHits.h>
00021 
00022 #include <CARF/G3Event/interface/G3EventProxy.h>
00023 #include <CARF/G3Event/interface/G3SetUp.h>
00024 #include <CARF/Reco/interface/AutoRecCollection.h>
00025 #include <CARF/Reco/interface/RecItr.h>
00026 
00027 #include <Utilities/Notification/interface/Observer.h>
00028 #include <Utilities/Notification/interface/PackageInitializer.h>
00029 #include <Utilities/UI/interface/SimpleConfigurable.h> 
00030 #include "Utilities/Notification/interface/Singleton.h"
00031  
00032 #include <CLHEP/Geometry/Point3D.h>
00033 #include <vector>
00034 
00035 struct MuonObserver : public Observer<G3EventProxy *>, public Observer<G3SetUp *> {
00036 
00037   int nbMuons_ ;
00038   double momentumSum_ ;
00039   SimpleConfigurable<bool> produceReference_;
00040   SimpleConfigurable<string> muonReconstructorName_;
00041   TrackReconstructor *muonReconstructor_;
00042  
00043   MuonObserver()
00044    : nbMuons_(0), momentumSum_(0), muonReconstructor_(0)
00045    { 
00046     // initialize observer
00047     Observer<G3EventProxy *>::init() ;      
00048     Observer<G3SetUp *>::init() ;
00049     
00050     // steering
00051     produceReference_=SimpleConfigurable<bool>(false,"XANAMuons:ProduceReference");
00052     muonReconstructorName_=
00053      SimpleConfigurable<string>("GlobalMuonReconstructor","XANAMuons:MuonReconstructor");
00054     // initialisation of muoning algo must be done in observing G3SetUp       
00055    }
00056    
00057   ~MuonObserver()
00058    {
00059     delete muonReconstructor_;
00060     xana::out(1)<<"[OVAL] number of muons : "<<nbMuons_<<endl ;
00061     xana::out(1)<<"[OVAL] mean energy : "<<momentumSum_/nbMuons_<<endl ;
00062    }
00063 
00064   // observing G3SetUp needed for traker initialisation
00065   // algos can also be initialised in an update(G3SetUp*) method if the o
00066   // observer is also observing G3SetUp. Then initialisation of RecUnits is
00067   // done a bit later in the execution, but god knows exactly when! 
00068   void upDate( G3SetUp *su )
00069    {    
00070     // defines muon reconstruction algo  
00071     // muon reconstructor initialisation can be done in the event loop as well
00072     L1MuGMTSetup* setup = Singleton<L1MuGMTSetup>::instance();
00073 
00074    }
00075     
00076   void upDate( G3EventProxy * ev )
00077    { 
00078     
00079     if (!ev) return ;    
00080     
00081     RecItr<TTrack> muon(ev->recEvent(),muonReconstructorName_.value().c_str());
00082     
00083     // to produce reference
00084     double momentum=0.;
00085     if (produceReference_) {
00086       while (muon.next()) {
00087         TrajectoryStateOnSurface ts = (*muon).impactPointState() ;
00088         if (ts.isValid()) {
00089           momentum = ts.globalMomentum().mag() ;
00090           nbMuons_++ ;
00091           momentumSum_ += momentum ;
00092           cout<<"[OVAL] new muon with momentum "<<momentum<<flush ;
00093           cout<<" and impact parameter "<<muon->impactParameter3D().value()<<endl ;
00094          }  
00095       }
00096       return ;
00097     } 
00098     
00099     // construct XANAmuons from Tmuons
00100     vector<XANAMuonCandidate> xmuons;
00101     XANAMuonCandidate *xmuon=0;
00102     while (muon.next()) { 
00103       TrajectoryStateOnSurface ts = (*muon).impactPointState() ;
00104       if (ts.isValid()) {
00105         momentum = ts.globalMomentum().mag() ;
00106         nbMuons_++ ;
00107         momentumSum_ += momentum ;
00108       }        
00109       cout << "Found new muon with momentum : "<<momentum<<endl ; 
00110       TrajectoryStateOnSurface tsi = (*muon).innermostState() ;
00111       TrajectoryStateOnSurface tso = (*muon).outermostState() ;
00112       HepVector3D momentumAtVertex(muon->momentumAtVertex().x(), 
00113        muon->momentumAtVertex().y(),muon->momentumAtVertex().z());
00114       HepPoint3D firstHit(tsi.globalPosition().x(),tsi.globalPosition().y(),
00115         tsi.globalPosition().z()); 
00116       HepVector3D momentumAtFirst(tsi.globalMomentum().x(),tsi.globalMomentum().y(),
00117         tsi.globalMomentum().z());
00118       HepPoint3D lastHit(tso.globalPosition().x(),tso.globalPosition().y(),
00119         tso.globalPosition().z()); 
00120       HepVector3D momentumAtLast(tso.globalMomentum().x(),tso.globalMomentum().y(),
00121         tso.globalMomentum().z());
00122       xmuon = new XANAMuonCandidate();
00123       HepLorentzVector momentum(muon->momentumAtVertex().x(), 
00124        muon->momentumAtVertex().y(),muon->momentumAtVertex().z(),
00125        muon->momentumAtVertex().mag());
00126       xmuon->setMomentum(momentum);
00127       xmuon->setPt(momentum.perp());
00128       xmuon->setCharge(muon->charge());
00129       XANAMuonTrack *xmuontrack = new XANAMuonTrack();
00130       xmuontrack->setCharge(muon->charge()); 
00131       xmuontrack->setChi2OverDof(muon->normalisedChiSquared());
00132       xmuontrack->setNumberOfHits(muon->foundHits());
00133       xmuontrack->setNumberOfLostHits(muon->lostHits());
00134       xmuontrack->setImpactParameter(muon->impactParameter3D().value());
00135       xmuontrack->setLongImpactParameter(muon->zImpactParameter().value());
00136       xmuontrack->setTransImpactParameter(muon->transverseImpactParameter().value());
00137       xmuontrack->setMomentumAtVertex(momentumAtVertex);
00138       xmuontrack->setPositionAtFirstPoint(firstHit);
00139       xmuontrack->setMomentumAtFirstPoint(momentumAtFirst);
00140       xmuontrack->setPositionAtLastPoint(lastHit);
00141       xmuontrack->setMomentumAtLastPoint(momentumAtLast);
00142       xmuontrack->setAlgoName(muonReconstructorName_.value());
00143       xmuon->setMuonTrack(xmuontrack);
00144       xmuons.push_back(*xmuon);
00145     }
00146      
00147     // read XANAmuons 
00148     vector<XANAMuonCandidate>::iterator it;
00149     for (it=xmuons.begin(); it!=xmuons.end(); it++)  
00150      {
00151       xana::out(1)<<"[OVAL] new muon with transverse momentum "<<it->getMuonTrack()->getMomentumAtVertex().perp()<<flush ;
00152       xana::out(1)<<" and impact parameter "<<it->getMuonTrack()->getImpactParameter()<<endl ;
00153      }
00154    }
00155       
00156 } ;
00157  
00158 static PKBuilder<MuonObserver> muonObserver("MuonObserver") ;
00159 
00160 

Generated on Tue May 10 10:01:24 2005 for XANADOO by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002