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