CMS 3D CMS Logo

RawPCCProducer.cc
Go to the documentation of this file.
1 
10 #include <string>
11 #include <iostream>
12 #include <fstream>
13 #include <vector>
31 #include "TMath.h"
32 
33 class RawPCCProducer : public edm::one::EDProducer<edm::EndLuminosityBlockProducer,
34  edm::one::WatchLuminosityBlocks> {
35  public:
36  explicit RawPCCProducer(const edm::ParameterSet&);
37  ~RawPCCProducer() override;
38 
39  private:
40  void beginLuminosityBlock (edm::LuminosityBlock const& lumiSeg, const edm::EventSetup& iSetup) final;
41  void endLuminosityBlock (edm::LuminosityBlock const& lumiSeg, const edm::EventSetup& iSetup) final;
42  void endLuminosityBlockProduce(edm::LuminosityBlock& lumiSeg, const edm::EventSetup& iSetup) final;
43  void produce (edm::Event& iEvent, const edm::EventSetup& iSetup) final;
44 
46  std::string pccSource_; //input file EDproducer module label
47  std::string prodInst_; //input file product instance
48  std::string takeAverageValue_; //Output average values
49 
50  std::vector<int> modVeto_; //The list of modules to skip in the lumi calc.
51  std::string outputProductName_; //specifies the trigger Rand or ZeroBias
52  std::vector<int> clustersPerBXInput_; //Will fill this with content from PCC
53  std::vector<int> modID_; //vector with Module IDs 1-1 map to bunch x-ing in clusers
54  std::vector<int> events_; //vector with total events at each bxid.
55  std::vector<int> clustersPerBXOutput_; //new vector containing clusters per bxid
56  std::vector<float> corrClustersPerBXOutput_;//new vector containing clusters per bxid with afterglow corrections
57  std::vector<float> errorPerBX_; //Stat error (or number of events)
58  std::vector<int> goodMods_; //The indicies of all the good modules - not vetoed
59  float totalLumi_; //The total raw luminosity from the pixel clusters - not scaled
60  float statErrOnLumi_; //the statistical error on the lumi - large num ie sqrt(N)
61 
64 
65  bool applyCorr_;
66  std::vector<float> correctionScaleFactors_;
67 
68  std::unique_ptr<LumiInfo> outputLumiInfo;
69 
70  std::ofstream csvfile;
71  };
72 
73 //--------------------------------------------------------------------------------------------------
75 {
76  pccSource_ = iConfig.getParameter<edm::ParameterSet>("RawPCCProducerParameters").getParameter<std::string>("inputPccLabel");
77  prodInst_ = iConfig.getParameter<edm::ParameterSet>("RawPCCProducerParameters").getParameter<std::string>("ProdInst");
78  takeAverageValue_ = iConfig.getParameter<edm::ParameterSet>("RawPCCProducerParameters").getUntrackedParameter<std::string>("OutputValue",std::string("Totals"));
79  outputProductName_ = iConfig.getParameter<edm::ParameterSet>("RawPCCProducerParameters").getUntrackedParameter<std::string>("outputProductName","alcaLumi");
80  modVeto_ = iConfig.getParameter<edm::ParameterSet>("RawPCCProducerParameters").getParameter<std::vector<int>>("modVeto");
81  applyCorr_ = iConfig.getParameter<edm::ParameterSet>("RawPCCProducerParameters").getUntrackedParameter<bool>("ApplyCorrections",false);
82  saveCSVFile_ = iConfig.getParameter<edm::ParameterSet>("RawPCCProducerParameters").getUntrackedParameter<bool>("saveCSVFile",false);
83  csvOutLabel_ = iConfig.getParameter<edm::ParameterSet>("RawPCCProducerParameters").getUntrackedParameter<std::string>("label",std::string("rawPCC.csv"));
84 
85  edm::InputTag PCCInputTag_(pccSource_, prodInst_);
86  clustersPerBXOutput_.resize(LumiConstants::numBX,0);//vector containing clusters per bxid
87  corrClustersPerBXOutput_.resize(LumiConstants::numBX,0);//vector containing clusters per bxid
88  pccToken=consumes<reco::PixelClusterCounts, edm::InLumi>(PCCInputTag_);
89  produces<LumiInfo, edm::Transition::EndLuminosityBlock>(outputProductName_);
90 
91  if(!applyCorr_){
93  }
94 }
95 
96 //--------------------------------------------------------------------------------------------------
98 }
99 
100 //--------------------------------------------------------------------------------------------------
102 
103 
104 }
105 
106 //--------------------------------------------------------------------------------------------------
108 
109  outputLumiInfo = std::make_unique<LumiInfo>();
110 
111  if(saveCSVFile_){
112  csvfile.open(csvOutLabel_, std::ios_base::app);
113  csvfile<<std::to_string(lumiSeg.run())<<",";
114  csvfile<<std::to_string(lumiSeg.luminosityBlock())<<",";
115  }
116 }
117 
118 //--------------------------------------------------------------------------------------------------
120  totalLumi_=0.0;
121  statErrOnLumi_=0.0;
122 
125 
126  goodMods_.clear();
127 
129  lumiSeg.getByToken(pccToken,pccHandle);
130 
131  const reco::PixelClusterCounts& inputPcc = *(pccHandle.product());
132 
133  modID_ = inputPcc.readModID();
134  events_= inputPcc.readEvents();
135  clustersPerBXInput_ = inputPcc.readCounts();
136 
137  //making list of modules to sum over
138  for (unsigned int i=0;i<modID_.size();i++){
139  if (std::find(modVeto_.begin(),modVeto_.end(), modID_.at(i)) == modVeto_.end()){
140  goodMods_.push_back(i);
141  }
142  }
143 
144  //summing over good modules only
145  for (int bx=0;bx<int(LumiConstants::numBX);bx++){
146  for (unsigned int i=0;i<goodMods_.size();i++){
148 
149  }
150  }
151 
152  if(applyCorr_){
154  iSetup.get<LumiCorrectionsRcd>().get(corrHandle);
155  const LumiCorrections *pccCorrections = corrHandle.product();
156  correctionScaleFactors_ = pccCorrections->getCorrectionsBX();
157  }
158 
159  for (unsigned int i=0;i<clustersPerBXOutput_.size();i++){
160  if (events_.at(i)!=0){
162  }else{
164  }
167  }
168 
169  errorPerBX_.clear();
170  errorPerBX_.assign(events_.begin(),events_.end());
171 
172  if(takeAverageValue_=="Average"){
173  unsigned int NActiveBX=0;
174  for (int bx=0;bx<int(LumiConstants::numBX);bx++){
175  if(events_[bx]>0){
176  NActiveBX++;
177  // Counting where events are will only work
178  // for ZeroBias or AlwaysTrue triggers.
179  // Random triggers will get all BXs.
181  errorPerBX_[bx]=1/TMath::Sqrt(float(events_[bx]));
182  }
183  }
184  if (statErrOnLumi_!=0) {
187  }
188  }
189 
190 
191  outputLumiInfo->setTotalInstLumi(totalLumi_);
192  outputLumiInfo->setTotalInstStatError(statErrOnLumi_);
193 
194  outputLumiInfo->setErrorLumiAllBX(errorPerBX_);
195  outputLumiInfo->setInstLumiAllBX(corrClustersPerBXOutput_);
196 
197  if(saveCSVFile_){
198  csvfile<<std::to_string(totalLumi_);
199 
200  if(totalLumi_>0){
201  for(unsigned int bx=0;bx<LumiConstants::numBX;bx++){
202  csvfile<<","<<std::to_string(corrClustersPerBXOutput_[bx]);
203  }
204  csvfile<<std::endl;
205  } else if (totalLumi_<0) {
206  edm::LogInfo("WARNING")<<"WHY IS LUMI NEGATIVE?!?!?!? "<<totalLumi_;
207  }
208 
209  csvfile.close();
210  }
211 }
212 
213 //--------------------------------------------------------------------------------------------------
216 
217 }
218 
T getParameter(std::string const &) const
std::vector< int > modVeto_
std::vector< float > correctionScaleFactors_
std::unique_ptr< LumiInfo > outputLumiInfo
bool getByToken(EDGetToken token, Handle< PROD > &result) const
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
static const unsigned int numBX
Definition: LumiConstants.h:9
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
std::string prodInst_
std::vector< int > clustersPerBXInput_
LuminosityBlockNumber_t luminosityBlock() const
int iEvent
Definition: GenABIO.cc:230
std::vector< int > const & readCounts() const
std::vector< int > goodMods_
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) final
void put(std::unique_ptr< PROD > product)
Put a new product.
std::vector< int > const & readModID() const
RunNumber_t run() const
std::string outputProductName_
std::string takeAverageValue_
std::vector< int > modID_
std::vector< int > clustersPerBXOutput_
void endLuminosityBlockProduce(edm::LuminosityBlock &lumiSeg, const edm::EventSetup &iSetup) final
void endLuminosityBlock(edm::LuminosityBlock const &lumiSeg, const edm::EventSetup &iSetup) final
std::string csvOutLabel_
T const * product() const
Definition: Handle.h:81
const std::vector< float > & getCorrectionsBX() const
~RawPCCProducer() override
const T & get() const
Definition: EventSetup.h:58
std::string pccSource_
void beginLuminosityBlock(edm::LuminosityBlock const &lumiSeg, const edm::EventSetup &iSetup) final
edm::EDGetTokenT< reco::PixelClusterCounts > pccToken
RawPCCProducer(const edm::ParameterSet &)
std::vector< float > errorPerBX_
T const * product() const
Definition: ESHandle.h:86
std::ofstream csvfile
std::vector< int > events_
std::vector< int > const & readEvents() const
std::vector< float > corrClustersPerBXOutput_
def move(src, dest)
Definition: eostools.py:510