00001
00002
00004 #include <Utilities/Configuration/interface/Architecture.h>
00005
00006 #include <XANADOO/domain/interface/writeESD.h>
00007
00008 #include <XANADOO/domain/test/setHeader.icc>
00009 #include <XANADOO/domain/test/setAllTrackHits.icc>
00010 #include <XANADOO/domain/test/setCaloRecHits.icc>
00011 #include <XANADOO/domain/test/setElectrons.icc>
00012 #include <XANADOO/domain/test/setPhotons.icc>
00013 #include <XANADOO/domain/test/setElectronsGSF.icc>
00014 #include <XANADOO/domain/test/setElectronsGSFPixelMatch.icc>
00015 #include <XANADOO/domain/test/setElectronTracks.icc>
00016 #include <XANADOO/domain/test/setElectronsZZVertex.icc>
00017 #include <XANADOO/domain/test/setEmClusters.icc>
00018 #include <XANADOO/domain/test/setEndcapSuperClusters.icc>
00019 #include <XANADOO/domain/test/setHadClusters.icc>
00020 #include <XANADOO/domain/test/setJets.icc>
00021 #include <XANADOO/domain/test/setMcTruth.icc>
00022 #include <XANADOO/domain/test/setMet.icc>
00023 #include <XANADOO/domain/test/setMuons.icc>
00024 #include <XANADOO/domain/test/setSuperClusters.icc>
00025 #include <XANADOO/domain/test/setTracks.icc>
00026 #include <XANADOO/domain/test/setTriggerInfo.icc>
00027 #include <XANADOO/domain/test/setVertices.icc>
00028
00029 #include <XANADOO/domain/interface/XANAEsdEvent.h>
00030 #include <XANADOO/XANAClusters/interface/XANASuperCluster.h>
00031 #include <XANADOO/XANAClusters/interface/XANAHadCluster.h>
00032 #include <XANADOO/XANATracks/interface/XANATrackHit.h>
00033 #include <XANADOO/XANAVertex/interface/XANAVertex.h>
00034 #include <XANADOO/XANAMcInfo/interface/XANAGeneratorEvent.h>
00035 #include <XANADOO/XANAMcInfo/interface/XANAGeneratorParticle.h>
00036 #include <XANADOO/XANAMcInfo/interface/XANAGeantEvent.h>
00037 #include <XANADOO/XANAMcInfo/interface/XANAGeantVertex.h>
00038 #include <XANADOO/XANAMcInfo/interface/XANAGeantTrack.h>
00039 #include <XANADOO/XANATriggerInfo/interface/XANATriggerInfo.h>
00040 #include <XANADOO/XANAUtilities/interface/XANAToolkit.h>
00041 #include <XANADOO/XANAUtilities/interface/XANAMemLog.h>
00042 #include <XANADOO/XANAElectronCandidate/interface/XANAElectronCandidate.h>
00043 #include <XANADOO/XANAPhotonCandidate/interface/XANAPhotonCandidate.h>
00044 #include <XANADOO/XANAElectronCandidate/interface/XANAElectronGSFTrack.h>
00045 #include <XANADOO/XANAElectronCandidate/interface/XANAElectronSeed.h>
00046 #include <XANADOO/XANAMuons/interface/XANAMuonCandidate.h>
00047 #include <XANADOO/XANAMuons/interface/XANAMuonTrack.h>
00048 #include <XANADOO/XANAJets/interface/XANAJet.h>
00049 #include <XANADOO/XANAMet/interface/XANAMet.h>
00050
00051 #include <ElectronPhoton/ClusterTools/interface/IsoCalculator.h>
00052
00053 #include <TrackerReco/TkRecoDebugTools/interface/LayerMediumPropertySetter.h>
00054 #include <TrackerReco/GsfPattern/interface/GsfMaterialEffectsFactory.h>
00055 #include <TrackerReco/GsfPattern/interface/GsfMultiStateUpdator.h>
00056 #include <TrackerReco/GsfPattern/interface/GsfPropagatorWithMaterial.h>
00057 #include <TrackerReco/GtfPattern/interface/CombinatorialTrajectoryBuilder.h>
00058 #include <TrackerReco/GsfPattern/interface/GsfChi2MeasurementEstimator.h>
00059 #include <TrackerReco/GsfPattern/interface/GsfTrajectoryFitter.h>
00060 #include <TrackerReco/GtfPattern/interface/ModularKfReconstructor.h>
00061 #include <TrackerReco/TkSeedGenerator/interface/CombinatorialSeedGeneratorFromPixel.h>
00062 #include <TrackerReco/GsfPattern/interface/GsfTrajectorySmoother.h>
00063
00064 #include <CommonReco/TrackFitters/interface/KFFittingSmoother.h>
00065 #include <CommonReco/PatternTools/interface/TransverseImpactPointExtrapolator.h>
00066 #include <CommonReco/GeomPropagators/interface/AnalyticalPropagator.h>
00067 #include <CommonReco/MaterialEffects/interface/PropagatorWithMaterial.h>
00068 #include <CommonReco/KalmanUpdators/interface/KFUpdator.h>
00069 #include <CommonReco/KalmanUpdators/interface/Chi2MeasurementEstimator.h>
00070 #include <CommonReco/TrackFitters/interface/KFFittingSmoother.h>
00071 #include <CommonReco/TrackFitters/interface/KFTrajectoryFitter.h>
00072 #include <CommonReco/TrackFitters/interface/KFTrajectorySmoother.h>
00073 #include <CommonReco/MaterialEffects/interface/MaterialEffectsFactory.h>
00074 #include <CommonReco/PatternTools/interface/TrajectoryCleanerBySharedHits.h>
00075
00076 #include <CommonDet/BasicDet/interface/DetUnit.h>
00077 #include <Tracker/TkLayout/interface/CmsTracker.h>
00078 #include <Tracker/TkLayout/interface/FullTracker.h>
00079 #include <CommonDet/BasicDet/interface/DetType.h>
00080 #include <CommonDet/BasicDet/interface/Readout.h>
00081
00082 #include <CARF/G3Event/interface/G3SetUp.h>
00083 #include <CARF/Reco/interface/AutoRecCollection.h>
00084 #include <CARF/Reco/interface/RecQuery.h>
00085 #include <CARF/Reco/interface/ConfigAlgoFactory.h>
00086 #include <CARF/Reco/interface/RecBuilder.h>
00087
00088 #include <Utilities/Notification/interface/PackageInitializer.h>
00089 #include <Utilities/Notification/interface/Singleton.h>
00090
00091 #include <ClassReuse/GeomVector/interface/GlobalVector.h>
00092
00093
00094 #include <TROOT.h>
00095 #include <TObjectTable.h>
00096 #include <TFile.h>
00097 #include <TTree.h>
00098 #include <TBranch.h>
00099 #include <TClonesArray.h>
00100 #include <TBits.h>
00101
00102 #include <CLHEP/Units/PhysicalConstants.h>
00103
00104 #include <vector>
00105 #include <map>
00106 #include <string>
00107 #include <iostream>
00108 #include <iomanip>
00109 #include <numeric>
00110
00111
00112 XANAEsdBuilder::XANAEsdBuilder(): clusters(0), superClusters(0), endcapSuperClusters(0), towers(0), tracks(0), vertices(0),
00113 muons(0), electrons(0), photons(0), eltracks(0), jets(0), mets(0), hlt(0), xanaEsdTree_(0), xanaEsdEventBranch_(0), xanaEsdFile_(0),
00114 xanaEsdEvent_(0), xanaGenEventBranch_(0), xanaGenEvent_(0), xanaGeantEventBranch_(0),
00115 xanaGeantEvent_(0), ciso_(0), xanamemlog_(0), nbClusters_(0), nbTracks_(0), nbElectrons_(0)
00116
00117 {
00118
00119
00120 xana::out(1) << "Constructing an XANAEsdBuilder" << endl ;
00121 Observer<G3EventProxy *>::init() ;
00122 Observer<G3SetUp *>::init() ;
00123
00124
00125 clusterizerName_ =
00126 SimpleConfigurable<std::string>("EGBCluster","XANADOO:Clusterizer");
00127 superClusterizerName_ =
00128 SimpleConfigurable<std::string>("EGSCluster","XANADOO:SuperClusterizer");
00129 endcapSuperClusterizerName_ =
00130 SimpleConfigurable<std::string>("EGECluster","XANADOO:EndcapSuperClusterizer");
00131 hcalClusterizerName_ =
00132 SimpleConfigurable<std::string>("TowerBuilder","XANADOO:HcalClusterizer");
00133 trackReconstructorName_=
00134 SimpleConfigurable<std::string>("TransientCombinatorialTrackFinder","XANADOO:TrackReconstructor");
00135 vertexReconstructorName_=
00136 SimpleConfigurable<std::string>("PrincipalVertexFinder","XANADOO:VertexReconstructor");
00137 muonReconstructorName_=
00138 SimpleConfigurable<std::string>("GlobalMuonReconstructor","XANADOO:MuonReconstructor");
00139 electronReconstructorName_=
00140 SimpleConfigurable<std::string>("GSF","XANADOO:ElectronReconstructor");
00141 gsfForwardFit_=
00142 SimpleConfigurable<std::string>("GSF","XANADOO:gsfForwardFit");
00143 electronTrackSeeding_=
00144 SimpleConfigurable<std::string>("PixelMatch","XANADOO:ElectronTrackSeeding");
00145 hZZVertexReconstructor_=
00146 SimpleConfigurable<bool>(false,"XANADOO:hZZVertexReconstructor");
00147 jetsFromTrueInformation_ =
00148 SimpleConfigurable<bool>(false,"XANADOO:jetsFromTrueInformation");
00149 metsFromTrueInformation_ =
00150 SimpleConfigurable<bool>(false,"XANADOO:metsFromTrueInformation");
00151
00152 l1Menu_ =
00153 SimpleConfigurable<std::string>("lumi2x1033","L1Globaltrigger:TriggerMenu");
00154
00155 hltMenu_ =
00156 SimpleConfigurable<std::string>("2x1033HLT.xml","HighLevelTriggerXML:XMLfile");
00157
00158
00159
00160 writeTree_ = SimpleConfigurable<bool>(false,"XANADOO:writeEsd");
00161 writeCaloRecHits_ = SimpleConfigurable<bool>(false,"XANADOO:EsdWithCaloRecHits");
00162 writeTrackHits_ = SimpleConfigurable<bool>(false,"XANADOO:EsdWithTrackHits"); writeAllTrackHits_ = SimpleConfigurable<bool>(false,"XANADOO:EsdWithAllTrackHits");
00163 writeEleTrackHits_ = SimpleConfigurable<bool>(false,"XANADOO:EsdWithEleTrackHits");
00164
00165
00166 memlog_ = SimpleConfigurable<bool>(false,"XANADOO:memlog");
00167 if (memlog_) xanamemlog_=new XANAMemLog();
00168
00169
00170 fileName_ = SimpleConfigurable<std::string>("single_eminus_pt100.root","XANADOO:FileName");
00171 xanaEsdFile_ = new TFile(fileName_.value().c_str(),"RECREATE");
00172 compressionLevel_ = SimpleConfigurable<int>(1,"XANADOO:CompressionLevel");
00173 xanaEsdFile_->SetCompressionLevel(compressionLevel_);
00174
00175
00176 autosave_ = SimpleConfigurable<int>(1000000000,"XANADOO:AutoSaveSize");
00177 bufferSize_ = SimpleConfigurable<int>(256000,"XANADOO:BufferSize");
00178 splitMode_ = SimpleConfigurable<int>(99,"XANADOO:SplitMode");
00179 xana::out(1) << "creating xanaEsdTree .."<<endl;
00180 treeName_ = SimpleConfigurable<std::string>("XANAESD","XANADOO:TreeName");
00181 xanaEsdTree_ = new TTree(treeName_.value().c_str(),"test XANADOO ESD tree");
00182 xanaEsdTree_->SetAutoSave(autosave_);
00183 int bufferSizeValue = bufferSize_.value();
00184 if (splitMode_.value()) bufferSizeValue /= 4;
00185
00186
00187 xanaEsdEvent_ = new XANAEsdEvent();
00188 xana::out(1) << "creating xanaEsdEventBranch .."<<endl;
00189 xanaEsdEventBranch_ =
00190 xanaEsdTree_->Branch("Event.","XANAEsdEvent",&xanaEsdEvent_,bufferSizeValue,splitMode_.value());
00191 xana::out(1) << "xanaEsdEventBranch branch created .."<<endl;
00192
00193 xanaGenEvent_ = new XANAGeneratorEvent();
00194 xana::out(1) << "creating xanaGeneratorEventBranch .."<<endl;
00195 xanaGenEventBranch_ =
00196 xanaEsdTree_->Branch("GeneratorEvent.","XANAGeneratorEvent",&xanaGenEvent_,bufferSizeValue,splitMode_.value());
00197 xana::out(1) << "xanaGeneratorEventBranch branch created .."<<endl;
00198
00199 xanaGeantEvent_ = new XANAGeantEvent();
00200 xana::out(1) << "creating xanaGeantEventBranch .."<<endl;
00201 xanaGeantEventBranch_ =
00202 xanaEsdTree_->Branch("GeantEvent.","XANAGeantEvent",&xanaGeantEvent_,bufferSizeValue,splitMode_.value());
00203 xana::out(1) << "xanaGeantEventBranch branch created .."<<endl;
00204
00205
00206 xanaGeantEvent_->addGeneratorEvent(xanaGenEvent_);
00207 xanaGeantEvent_->addEsdEvent(xanaEsdEvent_);
00208
00209
00210 ciso_ = Singleton<IsoCalculator>::instance();
00211
00212 }
00213
00214
00215 XANAEsdBuilder::~XANAEsdBuilder()
00216 {
00217
00218 xana::out(1) << "Deleting XANAEsdBuilder" << std::endl;
00219 xanaEsdFile_->Write();
00220 xanaEsdTree_->Print();
00221 delete xanaEsdFile_;
00222 if (memlog_) xanamemlog_->writeHistogram();
00223
00224 }
00225
00226
00227 void XANAEsdBuilder::upDate( G3EventProxy * ev )
00228 {
00229
00230 xana::out(1) << "[update] updating XANAEsdBuilder for event " << std::endl;
00231 if (!ev) return ;
00232
00233
00234
00235 setHeader(ev);
00236 if (writeCaloRecHits_) setCaloRecHits(ev);
00237 setEmClusters(ev);
00238 setSuperClusters(ev);
00239 setEndcapClusters(ev);
00240 setHadClusters(ev);
00241 setTracks(ev);
00242 if (writeAllTrackHits_) setAllTrackHits(ev);
00243 setVertices(ev);
00244 setMuons(ev);
00245 if (!strcmp(electronReconstructorName_.value().c_str(),"GSF")) {
00246
00247 if (electronTrackSeeding_.value() == "Regional") setElectronsGSF(ev);
00248 else if (electronTrackSeeding_.value() == "PixelMatch") setElectronsGSFPixelMatch(ev);
00249 else {
00250 cout << "writeESD: unknown electronTrackSeeding option" << electronTrackSeeding_.value()<< endl;
00251 }
00252 }
00253 else {
00254
00255 setElectronTracks(ev);
00256 setElectrons(ev);
00257 }
00258 if (hZZVertexReconstructor_) setElectronsZZVertex(ev);
00259 setPhotons(ev);
00260 setJets(ev);
00261 setMet(ev);
00262 setMcTruth(ev);
00263 setTriggerInfo(ev);
00264
00265 if (writeTree_) writeTree();
00266
00267 if (memlog_) xanamemlog_->fill();
00268
00269 xanaEsdEvent_->clear();
00270 xanaGenEvent_->clear();
00271 xanaGeantEvent_->clear();
00272
00273
00274
00275 }
00276
00277
00278 void XANAEsdBuilder::upDate (G3SetUp *)
00279 {
00280
00281 xana::out(5) << "Starting initSetUp==================================" << std::endl;
00282 theVertexTrackCompatibilityEstimator = new KalmanVertexTrackCompatibilityEstimator();
00283 if (strcmp(electronReconstructorName_.value().c_str(),"GSF")) return;
00284
00285
00286
00287
00288 RecQuery regionalQuery("RegionalCombinatorialTrackFinder");
00289
00290
00291 RecQuery builderQuery("CombinatorialTrajectoryBuilder");
00292 builderQuery.setParameter("chiSquarCut",100000.);
00293 builderQuery.setParameter("mass",0.000511);
00294 builderQuery.setParameter("maxCand",2);
00295 builderQuery.setParameter("maxLostHit",1);
00296 builderQuery.setParameter("maxConsecLostHit",1);
00297 builderQuery.setParameter("lostHitPenalty",50.);
00298 builderQuery.setParameter("intermediateCleaning",true);
00299 builderQuery.setParameter("minimumNumberOfHits",5);
00300 builderQuery.setParameter("ptCut", 3.);
00301 builderQuery.setParameter("alwaysUseInvalidHits",true);
00302
00303
00304 RecQuery fitQuery("KFFittingSmoother");
00305 fitQuery.setParameter("mass",0.000511);
00306
00307
00308 if (!strcmp(gsfForwardFit_.value().c_str(),"GSF") )
00309 {
00310 RecQuery fwdQuery("GsfElectronFitter");
00311 fwdQuery.setParameter("mass",0.000511);
00312 fitQuery.setComponent("Fitter",fwdQuery);
00313 }
00314
00315
00316 if (!strcmp(gsfForwardFit_.value().c_str(),"KF") )
00317 {
00318 RecQuery fwdQuery("KFTrajectoryFitter");
00319 fwdQuery.setParameter("mass",0.000511);
00320 fitQuery.setComponent("Fitter",fwdQuery);
00321 }
00322
00323
00324 RecQuery bwdQuery("GsfElectronSmoother");
00325 fitQuery.setComponent("Smoother",bwdQuery);
00326
00327
00328 regionalQuery.setParameter("mass",0.000511);
00329 regionalQuery.setParameter("createPersistableTracks",false);
00330 regionalQuery.setComponent("TrajectoryBuilder",builderQuery);
00331 regionalQuery.setComponent("Smoother",fitQuery);
00332
00333
00334 theRegionalTrackFinder = createAlgo<RegionalTrackFinder>(regionalQuery);
00335
00336
00337 }
00338
00339
00340 void XANAEsdBuilder::setEleTrackHits(std::vector<TrajectoryMeasurement> MyEleTrMeas, XANAElectronTrack *xTrack)
00341 {
00342
00343
00344
00345 std::vector<TrajectoryMeasurement>::const_iterator IterEleTrMeas;
00346
00347 xana::out(2) << "[update] adding electronic track hits " << std::endl;
00348 xana::out(2) << "[update] number of measurements " <<MyEleTrMeas.size() << std::endl;
00349
00350
00351 XANATrackHit *elethit=0;
00352 int nbhits=0;
00353 for (IterEleTrMeas=MyEleTrMeas.begin(); IterEleTrMeas!=MyEleTrMeas.end(); IterEleTrMeas++)
00354 {
00355
00356 RecHit IterEleRecHit = IterEleTrMeas->recHit();
00357
00358 if( !(IterEleRecHit.isValid()) ){xana::out(2) << "[update] non valid hit" << std::endl;}
00359
00360
00361 TrajectoryStateOnSurface IterEleTSN = IterEleTrMeas->updatedState();
00362
00363 if( !(IterEleTSN.isValid()) ){xana::out(2) << "[update] non valid updated state" << std::endl;}
00364
00365
00366
00367 if (!(IterEleRecHit.isValid()) && (IterEleTSN.isValid())){xana::out(2)<<"[update] non valid hit but valid updated state"<< std::endl;}
00368 if ((IterEleRecHit.isValid()) && !(IterEleTSN.isValid())){xana::out(2)<<"[update] non valid updated state but valid hit"<< std::endl;}
00369 if( IterEleRecHit.isValid() && IterEleTSN.isValid() )
00370 {
00371 HepPoint3D elehitposition( (IterEleRecHit).globalPosition().x(),
00372 (IterEleRecHit).globalPosition().y(),
00373 (IterEleRecHit).globalPosition().z());
00374
00375 HepPoint3D eleupdposition( (IterEleTSN).globalPosition().x(),
00376 (IterEleTSN).globalPosition().y(),
00377 (IterEleTSN).globalPosition().z());
00378
00379 HepVector3D eleupdmomentum( (IterEleTSN).globalMomentum().x(),
00380 (IterEleTSN).globalMomentum().y(),
00381 (IterEleTSN).globalMomentum().z());
00382
00383 elethit = new XANATrackHit( elehitposition, eleupdposition, eleupdmomentum );
00384 elethit->setIsStereo((IterEleRecHit).det().detUnits().front()->type().isStereo());
00385 Bool_t isBarrel = (((IterEleRecHit).det().detUnits().front()->type().part() == barrel) ? true : false);
00386 elethit->setIsBarrel(isBarrel);
00387
00388 xana::out(1) << "[update] ELE - NEW STEP" << std::endl;
00389 xana::out(1) << "[update] new hit" << std::endl;
00390 xana::out(1) << (IterEleRecHit).globalPosition().x() << std::endl;
00391 xana::out(1) << (IterEleRecHit).globalPosition().y() << std::endl;
00392 xana::out(1) << (IterEleRecHit).globalPosition().z() << std::endl;
00393 xana::out(1) << "[update] new updated state: position" << std::endl;
00394 xana::out(1) << (IterEleTSN).globalPosition().x() << std::endl;
00395 xana::out(1) << (IterEleTSN).globalPosition().y() << std::endl;
00396 xana::out(1) << (IterEleTSN).globalPosition().z() << std::endl;
00397 xana::out(1) << "[update] new updated state: momentum" << std::endl;
00398 xana::out(1) << (IterEleTSN).globalMomentum().x() << std::endl;
00399 xana::out(1) << (IterEleTSN).globalMomentum().y() << std::endl;
00400 xana::out(1) << (IterEleTSN).globalMomentum().z() << std::endl;
00401
00402 xanaEsdEvent_->addEleTrackHit(elethit, xTrack);
00403 ++nbhits;
00404 delete elethit;
00405
00406 }
00407 }
00408 xana::out(2) << "[update] number of hits that were added "<<nbhits<< std::endl;
00409 }
00410
00411
00412 void XANAEsdBuilder::writeTree()
00413 {
00414
00415 xana::out(2) << "[update] writing event " << std::endl;
00416
00417 xanaEsdTree_->Fill();
00418
00419 }
00420
00421
00422 std::string XANAEsdBuilder::getAlgoName(int algo) {
00423
00424 if (algo==1) return std::string("EgammaBasicIsland");
00425 else if (algo>=100) return std::string("EgammaBasicHybrid");
00426 else return std::string("");
00427
00428 }
00429
00430 static PKBuilder<XANAEsdBuilder> eventObserver("XANAEsdBuilder") ;
00431
00432
00433
00434 #include "ElectronPhoton/EgammaAnalysis/interface/EGDummy.h"
00435 #include "ElectronPhoton/EgammaL2Selection/src/EGCandidateRecAlgo.h"
00436
00437 static PKBuilder< RecBuilder<EGCandidateRecAlgo<EGDummy,EgammaSuperCluster> > > egoffbcandbuilder("EGCandfromEGSClusterBuilder");
00438 static PKBuilder< RecBuilder<EGCandidateRecAlgo<EGDummy,EgammaEndcapCluster> > > egoffecandbuilder("EGCandfromEGEClusterBuilder");