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
00047 Observer<G3EventProxy *>::init() ;
00048 Observer<G3SetUp *>::init() ;
00049
00050
00051 produceReference_=SimpleConfigurable<bool>(false,"XANAMuons:ProduceReference");
00052 muonReconstructorName_=
00053 SimpleConfigurable<string>("GlobalMuonReconstructor","XANAMuons:MuonReconstructor");
00054
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
00065
00066
00067
00068 void upDate( G3SetUp *su )
00069 {
00070
00071
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
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
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
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