Skip to content

Commit

Permalink
Merge pull request #14769 from bapavlov/RPC_and_IRPC_digitization_Pha…
Browse files Browse the repository at this point in the history
…seII

Rpc and irpc digitization phase ii
  • Loading branch information
cmsbuild committed Jul 5, 2016
2 parents 74e554e + 8fcf409 commit b0e82b5
Show file tree
Hide file tree
Showing 21 changed files with 987 additions and 103 deletions.
46 changes: 39 additions & 7 deletions DataFormats/RPCDigi/interface/RPCDigi.h
Expand Up @@ -7,10 +7,13 @@
*
*
* \author I. Segoni -- CERN & M. Maggi -- INFN Bari
*
*/
*
* modified by Borislav Pavlov - University of Sofia
* modification to be used for upgrade and for "pseudodigi"
*
*/

#include <boost/cstdint.hpp>
#include <cstdint>
#include <iosfwd>

class RPCDigi{
Expand All @@ -21,14 +24,43 @@ class RPCDigi{

bool operator==(const RPCDigi& digi) const;
bool operator<(const RPCDigi& digi) const;

int strip() const ;
int bx() const;
void print() const;
int strip() const { return strip_; }
int bx() const { return bx_; }
double time() const { return time_; }
double coordinateX() const { return coordinateY_; }
double coordinateY() const { return coordinateY_; }
bool hasTime() const { return hasTime_; }
bool hasX() const { return hasX_; }
bool hasY() const { return hasY_; }
void hasTime(bool has) { hasTime_ = has; }
void hasX(bool has) { hasX_ = has; }
void hasY(bool has) { hasY_ = has; }
double deltaTime() const { return deltaTime_; }
double deltaX() const { return deltaX_; }
double deltaY() const { return deltaY_; }
void setTime(double time) { time_ = time;}
void setDeltaTime(double dt) { deltaTime_ = dt; }
void setX(double x) { coordinateX_ = x; }
void setY(double y) { coordinateY_ = y; }
void setDeltaX(double dx) { deltaX_ = dx; }
void setDeltaY(double dy) { deltaY_ = dy; }
bool isPseudoDigi() const { return hasX_ || hasY_ ; }



private:
uint16_t strip_;
int32_t bx_;
int32_t bx_;
double time_;
double coordinateX_;
double coordinateY_;
double deltaTime_;
double deltaX_;
double deltaY_;
bool hasTime_;
bool hasX_;
bool hasY_;
};

std::ostream & operator<<(std::ostream & o, const RPCDigi& digi);
Expand Down
44 changes: 29 additions & 15 deletions DataFormats/RPCDigi/src/RPCDigi.cc
Expand Up @@ -2,6 +2,11 @@
*
*
* \author Ilaria Segoni
*
* modified by Borislav Pavlov - University of Sofia
* modification to be used for upgrade and for "pseudodigi"
*
*
*/


Expand All @@ -10,27 +15,42 @@

RPCDigi::RPCDigi (int strip, int bx) :
strip_(strip),
bx_(bx)
bx_(bx),
time_(0),
coordinateX_(0),
coordinateY_(0),
deltaTime_(0),
deltaX_(0),
deltaY_(0),
hasTime_(false),
hasX_(false),
hasY_(false)
{}

RPCDigi::RPCDigi ():
strip_(0),
bx_(0)
bx_(0),
time_(0),
coordinateX_(0),
coordinateY_(0),
deltaTime_(0),
deltaX_(0),
deltaY_(0),
hasTime_(false),
hasX_(false),
hasY_(false)
{}


// Comparison
bool
RPCDigi::operator == (const RPCDigi& digi) const {
bool RPCDigi::operator == (const RPCDigi& digi) const {
if ( strip_ != digi.strip() ||
bx_ != digi.bx() ) return false;
return true;
}

///Precedence operator
bool
RPCDigi::operator<(const RPCDigi& digi) const{

bool RPCDigi::operator<(const RPCDigi& digi) const{
if(digi.bx() == this->bx())
return digi.strip()<this->strip();
else
Expand All @@ -42,13 +62,7 @@ std::ostream & operator<<(std::ostream & o, const RPCDigi& digi) {
<< " " << digi.bx();
}

int RPCDigi::strip() const { return strip_; }

int RPCDigi::bx() const { return bx_; }

void
RPCDigi::print() const {
void RPCDigi::print() const {
std::cout << "Strip " << strip()
<< " bx " << bx() <<std::endl;
<< " bx " << bx() <<std::endl;
}

4 changes: 2 additions & 2 deletions DataFormats/RPCDigi/src/classes_def.xml
@@ -1,6 +1,6 @@
<lcgdict>
<class name="RPCDigi" ClassVersion="10">
<version ClassVersion="10" checksum="3371330358"/>
<class name="RPCDigi" ClassVersion="13">
<version ClassVersion="13" checksum="3650334651"/>
</class>
<class name="std::vector<RPCDigi>"/>
<class name="std::map<RPCDetId,std::vector<RPCDigi> >"/>
Expand Down
2 changes: 1 addition & 1 deletion Geometry/RPCGeometry/interface/RPCRoll.h
Expand Up @@ -35,7 +35,7 @@ class RPCRoll : public GeomDetUnit{
float localPitch(const LocalPoint& lp) const;
bool isBarrel() const;
bool isForward() const;

bool isIRPC() const {return (((this->id()).region()!=0) && (((this->id()).station()==3)||((this->id()).station()==4))&&((this->id()).ring()==1));}
private:
void setChamber(const RPCChamber* ch);

Expand Down
@@ -1,8 +1,6 @@
import FWCore.ParameterSet.Config as cms

def fixRPCConditions(process):
if hasattr(process,'simMuonRPCDigis'):
process.simMuonRPCDigis.digiModel = cms.string('RPCSimAverageNoiseEffCls')
if not hasattr(process.GlobalTag,'toGet'):
process.GlobalTag.toGet=cms.VPSet()
process.GlobalTag.toGet.extend( cms.VPSet(
Expand All @@ -17,5 +15,3 @@ def fixRPCConditions(process):
)
)
return process


57 changes: 52 additions & 5 deletions SimMuon/RPCDigitizer/python/muonRPCDigis_cfi.py
@@ -1,6 +1,8 @@

import FWCore.ParameterSet.Config as cms

# Module to create simulated RPC digis.

simMuonRPCDigis = cms.EDProducer("RPCDigiProducer",
Noise = cms.bool(True),
digiModelConfig = cms.PSet(
Expand All @@ -17,19 +19,64 @@
Gate = cms.double(25.0),
averageEfficiency = cms.double(0.95),
Nbxing = cms.int32(9),
timeJitter = cms.double(1.0)
timeJitter = cms.double(1.0),
IRPC_time_resolution = cms.double(0.1),
IRPC_electronics_jitter = cms.double(0.025)
),
doBkgNoise = cms.bool(True), #False - no noise and bkg simulation
Signal = cms.bool(True),
mixLabel = cms.string('mix'),
InputCollection = cms.string('g4SimHitsMuonRPCHits'),
# digiModel = cms.string('RPCSimAverageNoiseEffCls')
digiModel = cms.string('RPCSimAsymmetricCls')
#the new digitizer is RPCSimAsymmetricCls
)

#the digitizer for PhaseII muon upgrade is RPCSimModelTiming and for the moment is based on RPCSimAverageNoiseEffCls
from Configuration.StandardSequences.Eras import eras
if eras.fastSim.isChosen():
simMuonRPCDigis.InputCollection = 'MuonSimHitsMuonRPCHits'
eras.phase2_muon.toModify( simMuonRPCDigis, digiModel = cms.string('RPCSimAverageNoiseEffCls') )

if eras.phase2_muon.isChosen():
simMuonRPCDigis = cms.EDProducer("RPCandIRPCDigiProducer",
Noise = cms.bool(True),
digiModelConfig = cms.PSet(
signalPropagationSpeed = cms.double(0.66),
timingRPCOffset = cms.double(50.0),
Frate = cms.double(1.0),
printOutDigitizer = cms.bool(False),
cosmics = cms.bool(False),
deltatimeAdjacentStrip = cms.double(3.0),
linkGateWidth = cms.double(20.0),
Rate = cms.double(0.0),
timeResolution = cms.double(2.5),
averageClusterSize = cms.double(1.5),
Gate = cms.double(25.0),
averageEfficiency = cms.double(0.95),
Nbxing = cms.int32(9),
timeJitter = cms.double(1.0),
IRPC_time_resolution = cms.double(0.1),
IRPC_electronics_jitter = cms.double(0.025)
),
doBkgNoise = cms.bool(True), #False - no noise and bkg simulation
Signal = cms.bool(True),
mixLabel = cms.string('mix'),
InputCollection = cms.string('g4SimHitsMuonRPCHits'),
digiModel = cms.string('RPCSimAverageNoiseEffCls'),
digiIRPCModelConfig = cms.PSet(
signalPropagationSpeed = cms.double(0.66),
timingRPCOffset = cms.double(50.0),
Frate = cms.double(1.0),
printOutDigitizer = cms.bool(False),
cosmics = cms.bool(False),
deltatimeAdjacentStrip = cms.double(3.0),
linkGateWidth = cms.double(20.0),
Rate = cms.double(0.0),
timeResolution = cms.double(2.5),
averageClusterSize = cms.double(1.5),
Gate = cms.double(25.0),
averageEfficiency = cms.double(0.95),
Nbxing = cms.int32(9),
timeJitter = cms.double(1.0),
IRPC_time_resolution = cms.double(0.1),
IRPC_electronics_jitter = cms.double(0.025)
),
digiIRPCModel = cms.string('RPCSimModelTiming')
)
72 changes: 72 additions & 0 deletions SimMuon/RPCDigitizer/src/IRPCDigitizer.cc
@@ -0,0 +1,72 @@
#include "SimMuon/RPCDigitizer/src/IRPCDigitizer.h"
#include "SimMuon/RPCDigitizer/src/RPCSimFactory.h"
#include "SimMuon/RPCDigitizer/src/RPCSim.h"
#include "SimDataFormats/TrackingHit/interface/PSimHit.h"
#include "Geometry/RPCGeometry/interface/RPCRoll.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "SimMuon/RPCDigitizer/src/RPCSimSetUp.h"

// default constructor allocates default wire and strip digitizers

IRPCDigitizer::IRPCDigitizer(const edm::ParameterSet& config) {
theName = config.getParameter<std::string>("digiIRPCModel");
theRPCSim = RPCSimFactory::get()->create(theName,config.getParameter<edm::ParameterSet>("digiIRPCModelConfig"));
theNoise=config.getParameter<bool>("doBkgNoise");
}

IRPCDigitizer::~IRPCDigitizer() {
if( theRPCSim )
delete theRPCSim;
theRPCSim = 0;
}

void IRPCDigitizer::doAction(MixCollection<PSimHit> & simHits,
RPCDigiCollection & rpcDigis,
RPCDigiSimLinks & rpcDigiSimLink,
CLHEP::HepRandomEngine* engine)
{

theRPCSim->setRPCSimSetUp(theSimSetUp);

// arrange the hits by roll
std::map<int, edm::PSimHitContainer> hitMap;
for(MixCollection<PSimHit>::MixItr hitItr = simHits.begin();
hitItr != simHits.end(); ++hitItr)
{
hitMap[hitItr->detUnitId()].push_back(*hitItr);
}

if ( ! theGeometry) {
throw cms::Exception("Configuration")
<< "IRPCDigitizer requires the RPCGeometry \n which is not present in the configuration file. You must add the service\n in the configuration file or remove the modules that require it.";
}


const std::vector<const RPCRoll*>& rpcRolls = theGeometry->rolls() ;
for(auto r = rpcRolls.begin();
r != rpcRolls.end(); r++){

RPCDetId id = (*r)->id();
const edm::PSimHitContainer & rollSimHits = hitMap[id];

if((*r)->isIRPC()){
theRPCSim->simulate(*r, rollSimHits, engine);

if(theNoise){
theRPCSim->simulateNoise(*r, engine);
}
}


theRPCSim->fillDigis((*r)->id(),rpcDigis);
rpcDigiSimLink.insert(theRPCSim->rpcDigiSimLinks());
}
}

const RPCRoll * IRPCDigitizer::findDet(int detId) const {
assert(theGeometry != 0);
const GeomDetUnit* detUnit = theGeometry->idToDetUnit(RPCDetId(detId));
return dynamic_cast<const RPCRoll *>(detUnit);
}

65 changes: 65 additions & 0 deletions SimMuon/RPCDigitizer/src/IRPCDigitizer.h
@@ -0,0 +1,65 @@
#ifndef SimMuon_IRPCDigitizer_h
#define SimMuon_IRPCDigitizer_h
//

/** \class IRPCDigitizer
* Digitizer class for RPC
*
* \author Borislav Pavlov -- University of Sofia
*
*/
#include "DataFormats/Common/interface/DetSetVector.h"
#include "SimDataFormats/TrackerDigiSimLink/interface/StripDigiSimLink.h"
#include "SimDataFormats/RPCDigiSimLink/interface/RPCDigiSimLink.h"
#include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
#include "DataFormats/RPCDigi/interface/RPCDigiCollection.h"
#include "Geometry/RPCGeometry/interface/RPCGeometry.h"
#include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
#include <string>
#include "CLHEP/Random/RandomEngine.h"

namespace edm{
class ParameterSet;
}

class RPCRoll;
class RPCSim;
class RPCSimSetUp;

namespace CLHEP {
class HepRandomEngine;
}

class IRPCDigitizer
{
public:
typedef edm::DetSetVector<RPCDigiSimLink> RPCDigiSimLinks;
IRPCDigitizer(const edm::ParameterSet& config);
~IRPCDigitizer();

// *** digitize ***
void doAction(MixCollection<PSimHit> & simHits,
RPCDigiCollection & rpcDigis,
RPCDigiSimLinks & rpcDigiSimLink,
CLHEP::HepRandomEngine*);

/// sets geometry
void setGeometry(const RPCGeometry * geom) {theGeometry = geom;}

void setRPCSimSetUp(RPCSimSetUp *simsetup){theSimSetUp = simsetup;}

RPCSimSetUp* getRPCSimSetUp(){ return theSimSetUp; }

/// finds the rpc det unit in the geometry associated with this det ID
const RPCRoll * findDet(int detId) const;

private:
const RPCGeometry * theGeometry;
RPCSim* theRPCSim;
RPCSimSetUp * theSimSetUp;
std::string theName;
bool theNoise;
};

#endif

0 comments on commit b0e82b5

Please sign in to comment.