95 APV->isMasked = SiStripQuality_->
IsApvBad(APV->DetId,APV->APVId);
98 float newPreviousGain = gainHandle->
getApvGain(APV->APVId,gainHandle->
getRange(APV->DetId, 1),1);
99 if(APV->PreviousGain!=1 and newPreviousGain!=APV->PreviousGain)
edm::LogWarning(
"SiStripGainPCLHarvester")<<
"WARNING: ParticleGain in the global tag changed\n";
100 APV->PreviousGain = newPreviousGain;
102 float newPreviousGainTick = gainHandle->
getApvGain(APV->APVId,gainHandle->
getRange(APV->DetId, 0),0);
103 if(APV->PreviousGainTick!=1 and newPreviousGainTick!=APV->PreviousGainTick){
104 edm::LogWarning(
"SiStripGainPCLHarvester")<<
"WARNING: TickMarkGain in the global tag changed\n"<< std::endl
105 <<
" APV->SubDet: "<< APV->SubDet <<
" APV->APVId:" << APV->APVId << std::endl
106 <<
" APV->PreviousGainTick: "<<APV->PreviousGainTick<<
" newPreviousGainTick: "<<newPreviousGainTick<<std::endl;
108 APV->PreviousGainTick = newPreviousGainTick;
115 edm::LogInfo(
"SiStripGainsPCLHarvester") <<
"Starting harvesting statistics" << std::endl;
120 if(stag.size()!=0 && stag[0]!=
'_') stag.insert(0,1,
'_');
126 if (Charge_Vs_Index==0) {
127 edm::LogError(
"SiStripGainsPCLHarvester") <<
"Harvesting: could not retrieve " << cvi.c_str()
128 <<
", statistics will not be summed!" << std::endl;
130 edm::LogInfo(
"SiStripGainsPCLHarvester") <<
"Harvesting " 131 << (Charge_Vs_Index)->getTH2S()->GetEntries() <<
" more clusters" << std::endl;
135 std::unique_ptr<SiStripApvGain> theAPVGains = this->
getNewObject(Charge_Vs_Index);
144 throw std::runtime_error(
"PoolDBService required.");
146 edm::LogInfo(
"SiStripGainsPCLHarvester") <<
"Will not produce payload!" << std::endl;
161 std::vector<APVGain::APVmon> new_charge_histos;
163 for (
unsigned int i=0;
i<cnames.size();
i++){
175 MonitorElement* MPV_Vs_EtaTIB = ibooker_.
book2DD(
"MPVvsEtaTIB" ,
"MPV vs Eta TIB" ,50,-3.0,3.0,MPVbin,MPVmin,MPVmax);
176 MonitorElement* MPV_Vs_EtaTID = ibooker_.
book2DD(
"MPVvsEtaTID" ,
"MPV vs Eta TID" ,50,-3.0,3.0,MPVbin,MPVmin,MPVmax);
177 MonitorElement* MPV_Vs_EtaTOB = ibooker_.
book2DD(
"MPVvsEtaTOB" ,
"MPV vs Eta TOB" ,50,-3.0,3.0,MPVbin,MPVmin,MPVmax);
178 MonitorElement* MPV_Vs_EtaTEC = ibooker_.
book2DD(
"MPVvsEtaTEC" ,
"MPV vs Eta TEC" ,50,-3.0,3.0,MPVbin,MPVmin,MPVmax);
179 MonitorElement* MPV_Vs_EtaTECthin = ibooker_.
book2DD(
"MPVvsEtaTEC1",
"MPV vs Eta TEC-thin" ,50,-3.0,3.0,MPVbin,MPVmin,MPVmax);
180 MonitorElement* MPV_Vs_EtaTECthick = ibooker_.
book2DD(
"MPVvsEtaTEC2",
"MPV vs Eta TEC-thick",50,-3.0,3.0,MPVbin,MPVmin,MPVmax);
182 MonitorElement* MPV_Vs_PhiTIB = ibooker_.
book2DD(
"MPVvsPhiTIB" ,
"MPV vs Phi TIB" ,50,-3.4,3.4,MPVbin,MPVmin,MPVmax);
183 MonitorElement* MPV_Vs_PhiTID = ibooker_.
book2DD(
"MPVvsPhiTID" ,
"MPV vs Phi TID" ,50,-3.4,3.4,MPVbin,MPVmin,MPVmax);
184 MonitorElement* MPV_Vs_PhiTOB = ibooker_.
book2DD(
"MPVvsPhiTOB" ,
"MPV vs Phi TOB" ,50,-3.4,3.4,MPVbin,MPVmin,MPVmax);
185 MonitorElement* MPV_Vs_PhiTEC = ibooker_.
book2DD(
"MPVvsPhiTEC" ,
"MPV vs Phi TEC" ,50,-3.4,3.4,MPVbin,MPVmin,MPVmax);
186 MonitorElement* MPV_Vs_PhiTECthin = ibooker_.
book2DD(
"MPVvsPhiTEC1",
"MPV vs Phi TEC-thin ",50,-3.4,3.4,MPVbin,MPVmin,MPVmax);
187 MonitorElement* MPV_Vs_PhiTECthick = ibooker_.
book2DD(
"MPVvsPhiTEC2",
"MPV vs Phi TEC-thick",50,-3.4,3.4,MPVbin,MPVmin,MPVmax);
211 MonitorElement* MPVErrorVsMPV = ibooker_.
book2DD(
"MPVErrorVsMPV" ,
"MPV Error vs MPV" , 300, 0, 600, 150, 0, 150);
212 MonitorElement* MPVErrorVsEta = ibooker_.
book2DD(
"MPVErrorVsEta" ,
"MPV Error vs Eta" , 50, -3.0, 3.0, 150, 0, 150);
213 MonitorElement* MPVErrorVsPhi = ibooker_.
book2DD(
"MPVErrorVsPhi" ,
"MPV Error vs Phi" , 50, -3.4, 3.4, 150, 0, 150);
214 MonitorElement* MPVErrorVsN = ibooker_.
book2DD(
"MPVErrorVsN" ,
"MPV Error vs N" , 500, 0, 1000, 150, 0, 150);
216 MonitorElement* DiffWRTPrevGainTIB = ibooker_.
book1DD(
"DiffWRTPrevGainTIB" ,
"Diff w.r.t. PrevGain TIB" , 250, 0,2);
217 MonitorElement* DiffWRTPrevGainTID = ibooker_.
book1DD(
"DiffWRTPrevGainTID" ,
"Diff w.r.t. PrevGain TID" , 250, 0,2);
218 MonitorElement* DiffWRTPrevGainTOB = ibooker_.
book1DD(
"DiffWRTPrevGainTOB" ,
"Diff w.r.t. PrevGain TOB" , 250, 0,2);
219 MonitorElement* DiffWRTPrevGainTEC = ibooker_.
book1DD(
"DiffWRTPrevGainTEC" ,
"Diff w.r.t. PrevGain TEC" , 250, 0,2);
221 MonitorElement* GainVsPrevGainTIB = ibooker_.
book2DD(
"GainVsPrevGainTIB" ,
"Gain vs PrevGain TIB" , 100, 0,2, 100, 0,2);
222 MonitorElement* GainVsPrevGainTID = ibooker_.
book2DD(
"GainVsPrevGainTID" ,
"Gain vs PrevGain TID" , 100, 0,2, 100, 0,2);
223 MonitorElement* GainVsPrevGainTOB = ibooker_.
book2DD(
"GainVsPrevGainTOB" ,
"Gain vs PrevGain TOB" , 100, 0,2, 100, 0,2);
224 MonitorElement* GainVsPrevGainTEC = ibooker_.
book2DD(
"GainVsPrevGainTEC" ,
"Gain vs PrevGain TEC" , 100, 0,2, 100, 0,2);
230 if(APV==
NULL)
continue;
232 unsigned int Index = APV->Index;
233 unsigned int SubDet = APV->SubDet;
236 float Eta = APV->Eta;
238 float Phi = APV->Phi;
239 float Thickness = APV->Thickness;
240 double FitMPV = APV->FitMPV;
241 double FitMPVErr = APV->FitMPVErr;
242 double Gain = APV->Gain;
243 double NEntries = APV->NEntries;
244 double PreviousGain = APV->PreviousGain;
246 if (SubDet<3)
continue;
250 TH2S *chvsidx = (Charge_Vs_Index)->getTH2S();
251 int bin = chvsidx->GetXaxis()->FindBin(Index);
252 TH1D* Proj = chvsidx->ProjectionY(
"proj",bin,bin);
253 for (
int binId=0; binId<Proj->GetXaxis()->GetNbins();binId++) {
254 double new_charge = Proj->GetXaxis()->GetBinCenter(binId) /
Gain;
255 if (Proj->GetBinContent(binId)!=0.) {
256 for (
unsigned int h=0;
h<charge_histos.size();
h++) {
257 TH1D* chisto = (charge_histos[
h])->getTH1D();
258 for (
int e=0;
e<Proj->GetBinContent(binId);
e++) chisto->Fill(new_charge);
269 if(FitMPV>0.) Gains->
Fill(Gain);
272 if(Thickness<0.04) MPVs320->
Fill(Phi,FitMPV);
273 if(Thickness>0.04) MPVs500->
Fill(Phi,FitMPV);
275 MPVError->
Fill(FitMPVErr);
276 MPVErrorVsMPV->
Fill(FitMPV,FitMPVErr);
277 MPVErrorVsEta->
Fill(Eta,FitMPVErr);
278 MPVErrorVsPhi->
Fill(Phi,FitMPVErr);
279 MPVErrorVsN->
Fill(NEntries,FitMPVErr);
282 MPV_Vs_EtaTIB->
Fill(Eta,FitMPV);
283 MPV_Vs_PhiTIB->
Fill(Phi,FitMPV);
284 MPVsTIB->
Fill(FitMPV);
286 }
else if(SubDet==4) {
287 MPV_Vs_EtaTID->
Fill(Eta,FitMPV);
288 MPV_Vs_PhiTID->
Fill(Phi,FitMPV);
289 MPVsTID->
Fill(FitMPV);
290 if(Eta<0.) MPVsTIDM->
Fill(FitMPV);
291 if(Eta>0.) MPVsTIDP->
Fill(FitMPV);
293 }
else if (SubDet==5) {
294 MPV_Vs_EtaTOB->
Fill(Eta,FitMPV);
295 MPV_Vs_PhiTOB->
Fill(Phi,FitMPV);
296 MPVsTOB->
Fill(FitMPV);
298 }
else if (SubDet==6) {
299 MPV_Vs_EtaTEC->
Fill(Eta,FitMPV);
300 MPV_Vs_PhiTEC->
Fill(Phi,FitMPV);
301 MPVsTEC->
Fill(FitMPV);
302 if(Eta<0.) MPVsTECM->
Fill(FitMPV);
303 if(Eta>0.) MPVsTECP->
Fill(FitMPV);
305 MPV_Vs_EtaTECthin->
Fill(Eta,FitMPV);
306 MPV_Vs_PhiTECthin->
Fill(Phi,FitMPV);
307 MPVsTECthin->
Fill(FitMPV);
308 if(Eta>0.) MPVsTECP1->
Fill(FitMPV);
309 if(Eta<0.) MPVsTECM1->
Fill(FitMPV);
312 MPV_Vs_EtaTECthick->
Fill(Eta,FitMPV);
313 MPV_Vs_PhiTECthick->
Fill(Phi,FitMPV);
314 MPVsTECthick->
Fill(FitMPV);
315 if(Eta>0.) MPVsTECP2->
Fill(FitMPV);
316 if(Eta<0.) MPVsTECM2->
Fill(FitMPV);
321 if(SubDet==3 && PreviousGain!=0. ) DiffWRTPrevGainTIB->
Fill(Gain/PreviousGain);
322 else if(SubDet==4 && PreviousGain!=0. ) DiffWRTPrevGainTID->
Fill(Gain/PreviousGain);
323 else if(SubDet==5 && PreviousGain!=0. ) DiffWRTPrevGainTOB->
Fill(Gain/PreviousGain);
324 else if(SubDet==6 && PreviousGain!=0. ) DiffWRTPrevGainTEC->
Fill(Gain/PreviousGain);
326 if(SubDet==3 ) GainVsPrevGainTIB->
Fill(PreviousGain,Gain);
327 else if(SubDet==4 ) GainVsPrevGainTID->
Fill(PreviousGain,Gain);
328 else if(SubDet==5 ) GainVsPrevGainTOB->
Fill(PreviousGain,Gain);
329 else if(SubDet==6 ) GainVsPrevGainTEC->
Fill(PreviousGain,Gain);
341 double FitResults[6];
342 double MPVmean = 300;
344 if ( Charge_Vs_Index==0 ) {
345 edm::LogError(
"SiStripGainsPCLHarvester") <<
"Harvesting: could not execute algoComputeMPVandGain method because " 347 <<
"Please check if input contains " 352 TH2S *chvsidx = (Charge_Vs_Index)->getTH2S();
354 printf(
"Progressing Bar :0%% 20%% 40%% 60%% 80%% 100%%\n");
355 printf(
"Fitting Charge Distribution :");
360 if(I%TreeStep==0){printf(
".");fflush(stdout);}
361 std::shared_ptr<stAPVGain>
APV = it->second;
362 if(APV->Bin<0) APV->Bin = chvsidx->GetXaxis()->FindBin(APV->Index);
364 if(APV->isMasked){APV->Gain=APV->PreviousGain;
MASKED++;
continue;}
366 Proj = (TH1F*)(chvsidx->ProjectionY(
"",chvsidx->GetXaxis()->FindBin(APV->Index),chvsidx->GetXaxis()->FindBin(APV->Index),
"e"));
371 int SecondAPVId = APV->APVId;
372 if(SecondAPVId%2==0){ SecondAPVId = SecondAPVId+1; }
else{ SecondAPVId = SecondAPVId-1; }
373 std::shared_ptr<stAPVGain> APV2 =
APVsColl[(APV->DetId<<4) | SecondAPVId];
374 if(APV2->Bin<0) APV2->Bin = chvsidx->GetXaxis()->FindBin(APV2->Index);
375 TH1F* Proj2 = (TH1F*)(chvsidx->ProjectionY(
"",APV2->Bin,APV2->Bin,
"e"));
376 if(Proj2){Proj->Add(Proj2,1);
delete Proj2;}
378 for(
unsigned int i=0;
i<16;
i++){
379 auto tmpit =
APVsColl.find((APV->DetId<<4) |
i);
381 std::shared_ptr<stAPVGain> APV2 = tmpit->second;
382 if(APV2->DetId != APV->DetId || APV2->APVId == APV->APVId)
continue;
383 if(APV2->Bin<0) APV2->Bin = chvsidx->GetXaxis()->FindBin(APV2->Index);
384 TH1F* Proj2 = (TH1F*)(chvsidx->ProjectionY(
"",APV2->Bin,APV2->Bin,
"e"));
385 if(Proj2){Proj->Add(Proj2,1);
delete Proj2;}
393 APV->FitMPV = FitResults[0];
394 APV->FitMPVErr = FitResults[1];
395 APV->FitWidth = FitResults[2];
396 APV->FitWidthErr = FitResults[3];
397 APV->FitChi2 = FitResults[4];
398 APV->FitNorm = FitResults[5];
399 APV->NEntries = Proj->GetEntries();
402 APV->Gain = APV->FitMPV / MPVmean;
403 if(APV->SubDet>2)
GOOD++;
405 APV->Gain = APV->PreviousGain;
406 if(APV->SubDet>2)
BAD++;
408 if(APV->Gain<=0) APV->Gain = 1;
418 FitResults[0] = -0.5;
420 FitResults[2] = -0.5;
422 FitResults[4] = -0.5;
428 TF1 MyLandau(
"MyLandau",
"landau",LowRange, HighRange);
429 MyLandau.SetParameter(1,300);
430 InputHisto->Fit(&MyLandau,
"0QR WW");
433 FitResults[0] = MyLandau.GetParameter(1);
434 FitResults[1] = MyLandau.GetParError(1);
435 FitResults[2] = MyLandau.GetParameter(2);
436 FitResults[3] = MyLandau.GetParError(2);
437 FitResults[4] = MyLandau.GetChisquare() / MyLandau.GetNDF();
438 FitResults[5] = MyLandau.GetParameter(0);
445 if(FitResults[0] <= 0 )
return false;
462 auto const &
Det = newBareTkGeomPtr->
dets();
464 unsigned int Index=0;
466 for(
unsigned int i=0;
i<
Det.size();
i++){
475 if(!DetUnit)
continue;
478 unsigned int NAPV = Topo.
nstrips()/128;
480 for(
unsigned int j=0;j<NAPV;j++){
481 auto APV = std::make_shared<stAPVGain>();
490 APV->FitWidthErr = -1;
494 APV->PreviousGain = 1;
495 APV->PreviousGainTick = 1;
496 APV->x = DetUnit->position().basicVector().x();
497 APV->y = DetUnit->position().basicVector().y();
498 APV->z = DetUnit->position().basicVector().z();
499 APV->Eta = DetUnit->position().basicVector().eta();
500 APV->Phi = DetUnit->position().basicVector().phi();
501 APV->R = DetUnit->position().basicVector().transverse();
502 APV->Thickness = DetUnit->surface().bounds().thickness();
504 APV->isMasked =
false;
514 for(
unsigned int i=0;
i<
Det.size();
i++){
519 if(!DetUnit)
continue;
522 unsigned int NROCRow = Topo.
nrows()/(80.);
523 unsigned int NROCCol = Topo.
ncolumns()/(52.);
525 for(
unsigned int j=0;j<NROCRow;j++){
526 for(
unsigned int i=0;
i<NROCCol;
i++){
527 auto APV = std::make_shared<stAPVGain>();
531 APV->APVId = (j<<3 |
i);
536 APV->FitWidthErr = -1;
539 APV->PreviousGain = 1;
540 APV->PreviousGainTick = 1;
541 APV->x = DetUnit->position().basicVector().x();
542 APV->y = DetUnit->position().basicVector().y();
543 APV->z = DetUnit->position().basicVector().z();
544 APV->Eta = DetUnit->position().basicVector().eta();
545 APV->Phi = DetUnit->position().basicVector().phi();
546 APV->R = DetUnit->position().basicVector().transverse();
547 APV->Thickness = DetUnit->surface().bounds().thickness();
548 APV->isMasked =
false;
579 if( Charge_Vs_Index==0 ) {
580 edm::LogError(
"SiStripGainsPCLHarvester") <<
"produceTagFilter -> Return false: could not retrieve the " 582 <<
"Please check if input contains " 588 float integral = (Charge_Vs_Index)->getTH2S()->Integral();
592 <<
"produceTagFilter -> Return false: Statistics is too low : " << integral << std::endl;
598 <<
"produceTagFilter -> Return false: ratio of GOOD/TOTAL is too low: " << (1.0 *
GOOD) / (
GOOD+
BAD) << std::endl;
605 std::unique_ptr<SiStripApvGain>
608 std::unique_ptr<SiStripApvGain>
obj = std::unique_ptr<SiStripApvGain>(
new SiStripApvGain());
611 edm::LogWarning(
"SiStripGainsPCLHarvester")<<
"getNewObject -> will not produce a paylaod because produceTagFilter returned false " << std::endl;
617 std::vector<float> theSiStripVector;
618 unsigned int PreviousDetId = 0;
621 if(APV==
NULL){ printf(
"Bug\n");
continue; }
622 if(APV->SubDet<=2)
continue;
623 if(APV->DetId != PreviousDetId){
624 if(!theSiStripVector.empty()){
626 if ( !obj->put(PreviousDetId,range) ) printf(
"Bug to put detId = %i\n",PreviousDetId);
628 theSiStripVector.clear();
629 PreviousDetId = APV->DetId;
631 theSiStripVector.push_back(APV->Gain);
633 LogDebug(
"SiStripGainsPCLHarvester")<<
" DetId: "<<APV->DetId
634 <<
" APV: "<<APV->APVId
635 <<
" Gain: "<<APV->Gain
639 if(!theSiStripVector.empty()){
641 if ( !obj->put(PreviousDetId,range) ) printf(
"Bug to put detId = %i\n",PreviousDetId);
std::unique_ptr< SiStripApvGain > getNewObject(const MonitorElement *Charge_Vs_Index)
bool IsApvBad(const uint32_t &detid, const short &apvNb) const
T getUntrackedParameter(std::string const &, T const &) const
virtual int nrows() const =0
virtual void dqmEndJob(DQMStore::IBooker &ibooker_, DQMStore::IGetter &igetter_)
edm::ESHandle< TrackerGeometry > tkGeom_
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
size_t getNumberOfTags() const
MonitorElement * get(const std::string &path)
virtual void beginRun(edm::Run const &run, edm::EventSetup const &isetup)
const TrackerTopology * tTopo_
int subdetectorPlane(uint32_t, const TrackerTopology *)
def setup(process, global_tag, zero_tesla=False)
std::vector< std::string > dqm_tag_
DetId()
Create an empty or null id (also for persistence)
bool produceTagFilter(const MonitorElement *Charge_Vs_Index)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void getPeakOfLandau(TH1 *InputHisto, double *FitResults, double LowRange=50, double HighRange=5400)
void algoComputeMPVandGain(const MonitorElement *Charge_Vs_Index)
static float getApvGain(const uint16_t &apv, const SiStripApvGain::Range &range)
uint32_t rawId() const
get the raw id
U second(std::pair< T, U > const &p)
SiStripGainsPCLHarvester(const edm::ParameterSet &ps)
std::vector< MonitorElement * > FetchMonitor(std::vector< APVmon >, uint32_t, const TrackerTopology *topo=0)
const DetContainer & dets() const override
Returm a vector of all GeomDet (including all GeomDetUnits)
Data available (reporting)
void addDefault(ParameterSetDescription const &psetDescription)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double tagCondition_GoodFrac
bool doChargeMonitorPerPlane
std::pair< ContainerIterator, ContainerIterator > Range
const std::complex< double > I
void writeOne(T *payload, Time_t time, const std::string &recordName, bool withlogging=false)
std::vector< std::string > VChargeHisto
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
virtual void endRun(edm::Run const &run, edm::EventSetup const &isetup)
Integral< F, X >::type integral(const F &f)
bin
set the eta bin as selection string.
virtual void checkAndRetrieveTopology(const edm::EventSetup &setup)
std::string m_calibrationMode
bool IsGoodLandauFit(double *FitResults)
void setCurrentFolder(const std::string &fullpath)
void gainQualityMonitor(DQMStore::IBooker &ibooker_, const MonitorElement *Charge_Vs_Index) const
virtual int nstrips() const =0
int subdetectorSide(uint32_t, const TrackerTopology *)
const TrackerGeometry * bareTkGeomPtr_
double tagCondition_NClusters
virtual void checkBookAPVColls(const edm::EventSetup &setup)
std::vector< std::shared_ptr< stAPVGain > > APVsCollOrdered
virtual int ncolumns() const =0
cond::Time_t currentTime() const
MonitorElement * book2DD(Args &&...args)
std::vector< std::pair< std::string, std::string > > monHnames(std::vector< std::string >, bool, const char *tag)
MonitorElement * book1DD(Args &&...args)
T const * product() const
int subdetectorId(uint32_t)
const SiStripApvGain::Range getRange(uint32_t detID) const
std::unordered_map< unsigned int, std::shared_ptr< stAPVGain > > APVsColl