Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
#! /usr/bin/env cmsRun
# Author: Izaak Neutelings (March 2020)
#import os
import os, shlex, shutil, getpass
#import subprocess
import FWCore.ParameterSet.Config as cms
from Configuration.StandardSequences.Eras import eras

# SETTINGS
run       = 313000 # select the geometry for Phase-I pixels
era       = eras.Run2_2017 
verbose   = False #or True
threshold = 'INFO' if verbose else 'WARNING'
print(">>> run = %s"%run)

# LOAD PROCESS
process = cms.Process("SiPixelVCalDB",era)
process.load("FWCore.MessageService.MessageLogger_cfi")
process.load("Configuration.StandardSequences.GeometryDB_cff")
#process.load("Configuration.StandardSequences.GeometryIdeal_cff")
#process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff")
process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff")
#process.load("CalibTracker.Configuration.TrackerAlignment.TrackerAlignment_Fake_cff")
#process.load("Geometry.CMSCommonData.cmsIdealGeometryXML_cfi")
#process.load("Geometry.TrackerGeometryBuilder.trackerGeometry_cfi")
#process.load("Geometry.TrackerNumberingBuilder.trackerNumberingGeometry_cfi")
process.load("CondTools.SiPixel.SiPixelGainCalibrationService_cfi")
#process.load("CondCore.CondDB.CondDB_cfi") # deprecated
process.load("CondCore.CondDB.CondDB_cfi")

# GLOBAL TAG
from Configuration.AlCa.GlobalTag import GlobalTag
#from Configuration.AlCa.autoCond import autoCond
#from Configuration.AlCa.autoCond import autoCond
#process.GlobalTag.globaltag = "auto:run2_data" 
#process.GlobalTag.globaltag = autoCond['run2_design']
# In case you of conditions missing, or if you want to test a specific GT
#process.GlobalTag.globaltag = 'PRE_DES72_V6'
process.GlobalTag = GlobalTag(process.GlobalTag,'auto:run2_data','')
#process.GlobalTag = GlobalTag(process.GlobalTag,autoCond['run2_design'],'')
#process.GlobalTag.globaltag = autoCond['run2_design']
print(">>> globaltag = '%s'"%(process.GlobalTag.globaltag))

# BASIC SETTING
process.source = cms.Source("EmptyIOVSource",
    firstValue = cms.uint64(run),
    lastValue = cms.uint64(run),
    #firstRun = cms.untracked.uint32(run),
    timetype = cms.string('runnumber'),
    interval = cms.uint64(1),
)
process.maxEvents = cms.untracked.PSet(
    input = cms.untracked.int32(1)
)

# MESSAGER
process.MessageLogger.cerr.enable = False
process.MessageLogger.cout = dict(enable = True, threshold = threshold)

# BACK UP DATABASE FILE
user = getpass.getuser()
#try:
#    user = os.environ["USER"]
#except KeyError:
#    user = subprocess.call('whoami')
#    # user = commands.getoutput('whoami') 
#file = "/tmp/" + user + "/SiPixelVCal.db"
file = "siPixelVCal.db"
sqlfile = "sqlite_file:" + file
print(">>> Uploading as user %s into file %s, i.e. %s"%(user,file,sqlfile))
if os.path.exists("siPixelVCal.db"):
  oldfile = file.replace(".db","_old.db")
  print(">>> Backing up locally existing '%s' -> '%s'"%(file,oldfile))
  shutil.move(file,oldfile)

# DATABASE CONNNECTION AND INPUT TAGS
process.PoolDBOutputService = cms.Service("PoolDBOutputService",
    BlobStreamerName = cms.untracked.string('TBufferBlobStreamingService'),
    DBParameters = cms.PSet(
        authenticationPath = cms.untracked.string('.'),
        connectionRetrialPeriod = cms.untracked.int32(10),
        idleConnectionCleanupPeriod = cms.untracked.int32(10),
        messageLevel = cms.untracked.int32(1),
        enablePoolAutomaticCleanUp = cms.untracked.bool(False),
        enableConnectionSharing = cms.untracked.bool(True),
        connectionRetrialTimeOut = cms.untracked.int32(60),
        connectionTimeOut = cms.untracked.int32(0),
        enableReadOnlySessionOnUpdateConnection = cms.untracked.bool(False)
    ),
    timetype = cms.untracked.string('runnumber'),
    connect = cms.string(sqlfile),
    toPut = cms.VPSet(
        cms.PSet(
            record = cms.string('SiPixelVCalRcd'),
            tag = cms.string('SiPixelVCal_v1')
        ),
        #cms.PSet(
        #    record = cms.string('SiPixelVCalSimRcd'),
        #    tag = cms.string('SiPixelVCalSim_v1')
        #),
    )
)

# VCAL -> NUMBER OF ELECTRONS DB OBJECT
# https://github.com/cms-analysis/DPGAnalysis-SiPixelTools/blob/1232a8c0ef3abe7b78c757887138089706e0499a/GainCalibration/test/vcal-irradiation-factors.txt
# https://github.com/cms-sw/cmssw/blob/master/DataFormats/SiPixelDetId/src/PixelEndcapName.cc
slope      = 47.
slope_L1   = 50.
offset     = -60.
offset_L1  = -670.
corrs_bpix = { 1: 1.110, 2: 1.036, 3: 1.023, 4: 1.011 }
corrs_fpix = { 1: 1.1275, 2: 1.1275, 3: 1.1275 }
layers     = [1,2,3,4]
nladders   = { 1: 12, 2: 28, 3: 44, 4: 64, }
sides      = [1,2]   # 1=minus, 2=plus
disks      = [1,2,3] # 1, 2, 3
rings      = [1,2]   # 1=lower, 2=upper
bpixpars   = cms.untracked.VPSet()
fpixpars   = cms.untracked.VPSet()
print(">>> %8s %8s %10s %10s %10s"%('layer','ladder','slope','offset','corr'))
for layer in layers:
  for ladder in range(1,nladders[layer]+1):
    corr     = corrs_bpix[layer]
    slope_   = (slope_L1 if layer==1 else slope)*corr
    offset_  = (offset_L1 if layer==1 else offset)
    print(">>> %8d %8d %10.4f %10.3f %10.4f"%(layer,ladder,slope_,offset_,corr))
    bpixpars.append(cms.PSet(
      layer  = cms.int32(layer),
      ladder = cms.int32(ladder),
      slope  = cms.double(slope_),
      offset = cms.double(offset_),
    ))
print(">>> %8s %8s %8s %10s %10s %10s"%('side','disk','ring','slope','offset','corr'))
for side in sides:
  for disk in disks:
    for ring in rings:
      corr     = corrs_fpix[ring]
      slope_   = slope*corr
      offset_  = offset
      print(">>> %8d %8d %8d %10.4f %10.3f %10.4f"%(side,disk,ring,slope_,offset_,corr))
      fpixpars.append(cms.PSet(
        side   = cms.int32(side),
        disk   = cms.int32(disk),
        ring   = cms.int32(ring),
        slope  = cms.double(slope_),
        offset = cms.double(offset_),
      ))

# DB CREATOR
process.SiPixelVCal = cms.EDAnalyzer("SiPixelVCalDB",
    BPixParameters = bpixpars,
    FPixParameters = fpixpars,
    record = cms.untracked.string('SiPixelVCalRcd'),
)
process.p = cms.Path(process.SiPixelVCal)