From d3881baf00e6c2391f09318212f94b8fcc8cf774 Mon Sep 17 00:00:00 2001 From: Clemens Lange <clemens.lange@cern.ch> Date: Thu, 13 Feb 2020 19:27:48 +0100 Subject: [PATCH] Add initial docker-cms payload --- .gitlab-ci.yml | 24 ++++ .gitlab/build.sh | 16 +++ ZPeakAnalysis/BuildFile.xml | 4 + ZPeakAnalysis/plugins/BuildFile.xml | 7 ++ ZPeakAnalysis/plugins/MyZPeakAnalyzer.cc | 135 +++++++++++++++++++++++ ZPeakAnalysis/test/MyZPeak_cfg.py | 27 +++++ 6 files changed, 213 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100755 .gitlab/build.sh create mode 100644 ZPeakAnalysis/BuildFile.xml create mode 100644 ZPeakAnalysis/plugins/BuildFile.xml create mode 100644 ZPeakAnalysis/plugins/MyZPeakAnalyzer.cc create mode 100644 ZPeakAnalysis/test/MyZPeak_cfg.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..e0c034b --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,24 @@ +build_docker: + only: + - pushes + - merge_requests + except: + - triggers + tags: + - docker-privileged + - docker-machine + image: docker:latest + before_script: + - docker login -u $CI_REGISTRY_USER -p $CI_BUILD_TOKEN $CI_REGISTRY + # Need to start the automounter for CVMFS: + - docker run -d --name cvmfs --pid=host --user 0 --privileged --restart always -v /cvmfsmounts:/cvmfsmounts:rshared gitlab-registry.cern.ch/vcs/cvmfs-automounter:master + script: + # ls /cvmfs/cms.cern.ch/ won't work, but from the container it will + # If you want to automount CVMFS on a new docker container add the volume config /cvmfsmounts/cvmfs:/cvmfs:rslave + - docker run -v /cvmfsmounts/cvmfs:/cvmfs:rslave -v $(pwd):$(pwd) -w $(pwd) --name ${CI_PROJECT_NAME} ${FROM} /bin/bash ./.gitlab/build.sh + - SHA256=$(docker commit ${CI_PROJECT_NAME}) + - docker tag ${SHA256} ${TO} + - docker push ${TO} + variables: + FROM: clelange/cc7-cms # Override the image specified in the Dockerfile + TO: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA} diff --git a/.gitlab/build.sh b/.gitlab/build.sh new file mode 100755 index 0000000..580a090 --- /dev/null +++ b/.gitlab/build.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# exit when any command fails, but allow variables not set (no -u); verbose +set -ex + +# make cmsrel etc. work +shopt -s expand_aliases +export MY_BUILD_DIR=${PWD} +source /cvmfs/cms.cern.ch/cmsset_default.sh +cd /home/cmsusr +cmsrel CMSSW_10_6_8_patch1 +mkdir -p CMSSW_10_6_8_patch1/src/AnalysisCode +mv ${MY_BUILD_DIR}/ZPeakAnalysis CMSSW_5_3_32/src/AnalysisCode +cd CMSSW_10_6_8_patch1/src +cmsenv +scram b diff --git a/ZPeakAnalysis/BuildFile.xml b/ZPeakAnalysis/BuildFile.xml new file mode 100644 index 0000000..0856c31 --- /dev/null +++ b/ZPeakAnalysis/BuildFile.xml @@ -0,0 +1,4 @@ +<use name="root"/> +<export> + <lib name="1"/> +</export> diff --git a/ZPeakAnalysis/plugins/BuildFile.xml b/ZPeakAnalysis/plugins/BuildFile.xml new file mode 100644 index 0000000..b152db4 --- /dev/null +++ b/ZPeakAnalysis/plugins/BuildFile.xml @@ -0,0 +1,7 @@ +<use name="FWCore/Framework"/> +<use name="FWCore/ParameterSet"/> +<use name="FWCore/ServiceRegistry"/> +<use name="PhysicsTools/UtilAlgos"/> +<library file="*.cc" name="AnalysisCodeZPeakAnalysisPlugins"> + <flags EDM_PLUGIN="1"/> +</library> diff --git a/ZPeakAnalysis/plugins/MyZPeakAnalyzer.cc b/ZPeakAnalysis/plugins/MyZPeakAnalyzer.cc new file mode 100644 index 0000000..4282946 --- /dev/null +++ b/ZPeakAnalysis/plugins/MyZPeakAnalyzer.cc @@ -0,0 +1,135 @@ +#include <map> +#include <string> + +#include "TH1.h" + +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EDAnalyzer.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "CommonTools/UtilAlgos/interface/TFileService.h" +#include "DataFormats/PatCandidates/interface/Muon.h" + +#include "DataFormats/PatCandidates/interface/Electron.h" +#include "DataFormats/PatCandidates/interface/Muon.h" + +class MyZPeakAnalyzer : public edm::EDAnalyzer { + +public: + explicit MyZPeakAnalyzer(const edm::ParameterSet&); + ~MyZPeakAnalyzer(); + +private: + + virtual void beginJob() ; + virtual void analyze(const edm::Event&, const edm::EventSetup&); + virtual void endJob() ; + + // simple map to contain all histograms; + // histograms are booked in the beginJob() + // method + std::map<std::string,TH1F*> histContainer_; + // ----------member data --------------------------- + edm::EDGetTokenT<pat::MuonCollection> muonCollToken; + edm::EDGetTokenT<pat::ElectronCollection> elecCollToken; + + // input tags + edm::InputTag muonSrc_; + edm::InputTag elecSrc_; +}; + + +MyZPeakAnalyzer::MyZPeakAnalyzer(const edm::ParameterSet& iConfig): + + histContainer_(), + muonSrc_(iConfig.getUntrackedParameter<edm::InputTag>("muonSrc")), + elecSrc_(iConfig.getUntrackedParameter<edm::InputTag>("elecSrc")){ + + muonCollToken = consumes<pat::MuonCollection>(muonSrc_); + elecCollToken = consumes<pat::ElectronCollection>(elecSrc_); + +} + +MyZPeakAnalyzer::~MyZPeakAnalyzer(){ +} + +void +MyZPeakAnalyzer::analyze(const edm::Event& iEvent, + const edm::EventSetup& iSetup){ + + // get pat muon collection + edm::Handle< std::vector<pat::Muon>> muons; + iEvent.getByToken(muonCollToken, muons); + + // fill pat muon histograms + for (auto it = muons->cbegin(); it != muons->cend(); ++it) { + histContainer_["muonPt"] ->Fill(it->pt()); + histContainer_["muonEta"]->Fill(it->eta()); + histContainer_["muonPhi"]->Fill(it->phi()); + + if( it->pt()>20 && fabs(it->eta())<2.1 ){ + for (auto it2 = muons->cbegin(); it2 != muons->cend(); ++it2){ + if (it2 > it){ + // check only muon pairs of unequal charge + if( it->charge()*it2->charge()<0){ + histContainer_["mumuMass"]->Fill((it->p4()+it2->p4()).mass()); + } + } + } + } + } + + // get pat electron collection + edm::Handle< std::vector<pat::Electron>> electrons; + iEvent.getByToken(elecCollToken, electrons); + + // loop over electrons + for (auto it = electrons->cbegin(); it != electrons->cend(); ++it) { + histContainer_["elePt"] ->Fill(it->pt()); + histContainer_["eleEta"]->Fill(it->eta()); + histContainer_["elePhi"]->Fill(it->phi()); + } + + // Multiplicity + histContainer_["eleMult" ]->Fill(electrons->size()); + histContainer_["muonMult"]->Fill(muons->size() ); +} + +void +MyZPeakAnalyzer::beginJob() +{ + // register to the TFileService + edm::Service<TFileService> fs; + + + histContainer_["mumuMass"]=fs->make<TH1F>("mumuMass", "mass", 90, 30., 120.); + + // book histograms for Multiplicity: + + histContainer_["eleMult"]=fs->make<TH1F>("eleMult", "electron multiplicity", 100, 0, 50); + histContainer_["muonMult"]=fs->make<TH1F>("muonMult", "muon multiplicity", 100, 0, 50); + + // book histograms for Pt: + + histContainer_["elePt"]=fs->make<TH1F>("elePt", "electron Pt", 100, 0, 200); + histContainer_["muonPt"]=fs->make<TH1F>("muonPt", "muon Pt", 100, 0, 200); + + // book histograms for Eta: + histContainer_["eleEta"]=fs->make<TH1F>("eleEta", "electron Eta",100, -5, 5); + histContainer_["muonEta"]=fs->make<TH1F>("muonEta", "muon Eta", 100, -5, 5); + + + // book histograms for Phi: + histContainer_["elePhi"]=fs->make<TH1F>("elePhi", "electron Phi", 100, -3.5, 3.5); + histContainer_["muonPhi"]=fs->make<TH1F>("muonPhi", "muon Phi", 100, -3.5, 3.5); + +} + +void +MyZPeakAnalyzer::endJob() +{ +} + +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_MODULE(MyZPeakAnalyzer); diff --git a/ZPeakAnalysis/test/MyZPeak_cfg.py b/ZPeakAnalysis/test/MyZPeak_cfg.py new file mode 100644 index 0000000..e29429c --- /dev/null +++ b/ZPeakAnalysis/test/MyZPeak_cfg.py @@ -0,0 +1,27 @@ +import FWCore.ParameterSet.Config as cms + +process = cms.Process("Test") + +process.source = cms.Source("PoolSource", + fileNames = cms.untracked.vstring( + # Multiple file should be comma separated + # Data set: /DYJetsToLL_M-50_HT-100to200_TuneCP5_13TeV-madgraphMLM-pythia8/RunIIFall17MiniAODv2-PU2017_12Apr2018_94X_mc2017_realistic_v14-v1/MINIAODSIM + '/store/mc/RunIIFall17MiniAODv2/DYJetsToLL_M-50_HT-100to200_TuneCP5_13TeV-madgraphMLM-pythia8/MINIAODSIM/PU2017_12Apr2018_94X_mc2017_realistic_v14-v1/50000/E43E4210-7742-E811-9430-AC1F6B23C96A.root', + ) +) + +process.MessageLogger = cms.Service("MessageLogger") +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(10000) +) + +process.analyzeBasicPat = cms.EDAnalyzer("MyZPeakAnalyzer", + muonSrc = cms.untracked.InputTag("slimmedMuons"), + elecSrc = cms.untracked.InputTag("slimmedElectrons"), +) + +process.TFileService = cms.Service("TFileService", + fileName = cms.string('myZPeak.root') + ) + +process.p = cms.Path(process.analyzeBasicPat) -- GitLab