18 #include "CLHEP/Random/RandFlat.h"
19 #include "CLHEP/Random/RandGauss.h"
38 edm::LogInfo(
"SiStripGainCosmicCalculator::SiStripGainCosmicCalculator");
53 edm::LogInfo(
"SiStripApvGainCalculator")<<
"The calibration for these DetIds will be set to a default value";
55 edm::LogInfo(
"SiStripApvGainCalculator")<<
"exclude detid = "<< *imod;
64 edm::LogInfo(
"SiStripGainCosmicCalculator::~SiStripGainCosmicCalculator");
78 std::cout<<
"SiStripGainCosmicCalculator::algoBeginJob called"<<std::endl;
82 HlistOtherHistos->Add(
new TH1F( Form(
"APVPairCorrections"), Form(
"APVPairCorrections"), 50,-1.,4.));
83 HlistOtherHistos->Add(
new TH1F(Form(
"APVPairCorrectionsTIB1mono"),Form(
"APVPairCorrectionsTIB1mono"),50,-1.,4.));
84 HlistOtherHistos->Add(
new TH1F(Form(
"APVPairCorrectionsTIB1stereo"),Form(
"APVPairCorrectionsTIB1stereo"),50,-1.,4.));
85 HlistOtherHistos->Add(
new TH1F(Form(
"APVPairCorrectionsTIB2"),Form(
"APVPairCorrectionsTIB2"),50,-1.,4.));
86 HlistOtherHistos->Add(
new TH1F(Form(
"APVPairCorrectionsTOB1"),Form(
"APVPairCorrectionsTOB1"),50,-1.,4.));
87 HlistOtherHistos->Add(
new TH1F(Form(
"APVPairCorrectionsTOB2"),Form(
"APVPairCorrectionsTOB2"),50,-1.,4.));
88 HlistOtherHistos->Add(
new TH1F(Form(
"LocalAngle"),Form(
"LocalAngle"),70,-0.1,3.4));
89 HlistOtherHistos->Add(
new TH1F(Form(
"LocalAngleAbsoluteCosine"),Form(
"LocalAngleAbsoluteCosine"),48,-0.1,1.1));
90 HlistOtherHistos->Add(
new TH1F(Form(
"LocalPosition_cm"),Form(
"LocalPosition_cm"),100,-5.,5.));
91 HlistOtherHistos->Add(
new TH1F(Form(
"LocalPosition_normalized"),Form(
"LocalPosition_normalized"),100,-1.1,1.1));
92 TH1F* local_histo =
new TH1F(Form(
"SiStripRecHitType"),Form(
"SiStripRecHitType"),2,0.5,2.5);
HlistOtherHistos->Add(local_histo);
93 local_histo->GetXaxis()->SetBinLabel(1,
"simple"); local_histo->GetXaxis()->SetBinLabel(2,
"matched");
97 std::vector<uint32_t> activeDets; activeDets.clear();
99 siStripDetCabling->addActiveDetectorsRawIds(activeDets);
107 for(TrackerGeometry::DetContainer::const_iterator it = tkGeom->dets().begin(); it != tkGeom->dets().end(); it++){
108 if( dynamic_cast<StripGeomDetUnit*>((*it))!=0){
109 uint32_t
detid=((*it)->geographicalId()).rawId();
111 double module_thickness = (*it)->surface().bounds().thickness();
112 thickness_map.insert(std::make_pair(detid,module_thickness));
114 bool is_active_detector =
false;
116 if( *iactive == detid ){
117 is_active_detector =
true;
122 bool exclude_this_detid =
false;
124 if(*imod == detid) exclude_this_detid =
true;
128 if(is_active_detector && (!exclude_this_detid)){
130 unsigned short NAPVPairs = p.
nstrips()/256;
131 if( NAPVPairs<2 || NAPVPairs>3 ) {
132 edm::LogError(
"SiStripGainCosmicCalculator")<<
"Problem with Number of strips in detector: "<<p.
nstrips()<<
" Exiting program";
135 for(
int iapp = 0; iapp<NAPVPairs; iapp++){
136 TString hid = Form(
"ChargeAPVPair_%i_%i",detid,iapp);
165 for(reco::TrackCollection::const_iterator itr =
tracks->begin(); itr !=
tracks->end(); itr++){
169 std::vector<std::pair<const TrackingRecHit *,float> >hitangle;
171 for(std::vector<std::pair<const TrackingRecHit *,float> >::const_iterator hitangle_iter=hitangle.begin();hitangle_iter!=hitangle.end();hitangle_iter++){
173 float local_angle=hitangle_iter->second;
175 const SiStripRecHit2D* sistripsimplehit=
dynamic_cast<const SiStripRecHit2D*
>(trechit);
176 const SiStripMatchedRecHit2D* sistripmatchedhit=
dynamic_cast<const SiStripMatchedRecHit2D*
>(trechit);
180 if(sistripsimplehit){
182 const SiStripRecHit2D::ClusterRef & cluster=sistripsimplehit->cluster();
183 const std::vector<uint8_t>& ampls = cluster->amplitudes();
185 uint32_t thedetid = cluster->geographicalId();
186 double module_width =
moduleWidth(thedetid, &iSetup);
188 ((TH1F*)
HlistOtherHistos->FindObject(
"LocalPosition_normalized"))->
Fill(local_position.
x()/module_width);
190 int ifirststrip= cluster->firstStrip();
191 int theapvpairid = int(
float(ifirststrip)/256.);
192 TH1F* histopointer = (TH1F*)
HlistAPVPairs->FindObject(Form(
"ChargeAPVPair_%i_%i",thedetid,theapvpairid));
195 for(
unsigned int iampl = 0; iampl<ampls.size(); iampl++){
196 cCharge += ampls[iampl];
198 double cluster_charge_over_path = ((double)cCharge) * fabs(
cos(local_angle)) / ( 10. * module_thickness);
199 histopointer->Fill(cluster_charge_over_path);
212 double adcs = -0.5;
double error = 0.;
double nr_of_entries = inputHisto->GetEntries();
214 return std::make_pair(adcs,error);
225 inputHisto->Fit(
"landau",
"0Q");
226 TF1 * fitfunction = (TF1*) inputHisto->GetListOfFunctions()->First();
227 adcs = fitfunction->GetParameter(
"MPV");
228 error = fitfunction->GetParError(1);
229 double chi2 = fitfunction->GetChisquare();
230 double ndf = fitfunction->GetNDF();
231 double chi2overndf = chi2 / ndf;
233 if(adcs< 2. || (error/adcs)>1.8 ){
234 inputHisto->Fit(
"landau",
"0Q",0,0.,400.);
235 TF1 * fitfunction2 = (TF1*) inputHisto->GetListOfFunctions()->First();
236 std::cout<<
"refitting landau for histogram "<<inputHisto->GetTitle()<<std::endl;
237 std::cout<<
"initial error/adcs ="<<error<<
" / "<<adcs<<std::endl;
238 std::cout<<
"new error/adcs ="<<fitfunction2->GetParError(1)<<
" / "<<fitfunction2->GetParameter(
"MPV")<<std::endl;
239 adcs = fitfunction2->GetParameter(
"MPV");
240 error = fitfunction2->GetParError(1);
241 chi2 = fitfunction2->GetChisquare();
242 ndf = fitfunction2->GetNDF();
243 chi2overndf = chi2 / ndf;
247 adcs = -0.5; error = 0.;
249 return std::make_pair(adcs,error);
256 double module_width=0.;
258 if (dynamic_cast<const StripGeomDetUnit*>(it)==0 && dynamic_cast<const PixelGeomDetUnit*>(it)==0) {
259 std::cout <<
"this detID doesn't seem to belong to the Tracker" << std::endl;
270 double module_thickness=0.;
272 if (dynamic_cast<const StripGeomDetUnit*>(it)==0 && dynamic_cast<const PixelGeomDetUnit*>(it)==0) {
273 std::cout <<
"this detID doesn't seem to belong to the Tracker" << std::endl;
277 return module_thickness;
282 std::cout<<
"SiStripGainCosmicCalculator::getNewObject called"<<std::endl;
286 TH1F *ChargeOfEachAPVPair =
new TH1F(
"ChargeOfEachAPVPair",
"ChargeOfEachAPVPair",1,0,1); ChargeOfEachAPVPair->SetBit(TH1::kCanRebin);
287 TH1F *EntriesApvPairs =
new TH1F(
"EntriesApvPairs",
"EntriesApvPairs",1,0,1); EntriesApvPairs->SetBit(TH1::kCanRebin);
288 TH1F * NrOfEntries =
new TH1F(
"NrOfEntries",
"NrOfEntries",351,-0.5,350.5);
289 TH1F * ModuleThickness =
new TH1F(
"ModuleThickness",
"ModuleThickness",2,0.5,2.5);
HlistOtherHistos->Add(ModuleThickness);
290 ModuleThickness->GetXaxis()->SetBinLabel(1,
"320mu"); ModuleThickness->GetXaxis()->SetBinLabel(2,
"500mu"); ModuleThickness->SetYTitle(
"Nr APVPairs");
291 TH1F * ModuleWidth =
new TH1F(
"ModuleWidth",
"ModuleWidth",5,0.5,5.5);
HlistOtherHistos->Add(ModuleWidth);
292 ModuleWidth->GetXaxis()->SetBinLabel(1,
"6.144cm"); ModuleWidth->GetXaxis()->SetBinLabel(2,
"7.14cm");
293 ModuleWidth->GetXaxis()->SetBinLabel(3,
"9.3696cm"); ModuleWidth->GetXaxis()->SetBinLabel(4,
"10.49cm");
294 ModuleWidth->GetXaxis()->SetBinLabel(5,
"12.03cm");
295 ModuleWidth->SetYTitle(
"Nr APVPairs");
299 double MeanCharge = 0.;
300 double NrOfApvPairs = 0.;
301 TH1F *MyHisto = (TH1F*)hiterator();
303 TString histo_title = MyHisto->GetTitle();
304 if(histo_title.Contains(
"ChargeAPVPair_")){
306 double local_nrofadcs = two_values.first;
307 double local_sigma = two_values.second;
308 ChargeOfEachAPVPair->Fill(histo_title, local_nrofadcs);
309 int ichbin = ChargeOfEachAPVPair->GetXaxis()->FindBin(histo_title.Data());
310 ChargeOfEachAPVPair->SetBinError(ichbin,local_sigma);
311 EntriesApvPairs->Fill(histo_title, MyHisto->GetEntries());
312 NrOfEntries->Fill(MyHisto->GetEntries());
313 if(local_nrofadcs > 0){
314 MeanCharge += local_nrofadcs;
318 MyHisto = (TH1F*)hiterator();
320 ChargeOfEachAPVPair->LabelsDeflate(
"X"); EntriesApvPairs->LabelsDeflate(
"X");
324 MeanCharge = MeanCharge / NrOfApvPairs;
326 TH1F* CorrectionOfEachAPVPair = (TH1F*) ChargeOfEachAPVPair->Clone(
"CorrectionOfEachAPVPair");
327 TH1F *ChargeOfEachAPVPairControlView =
new TH1F(
"ChargeOfEachAPVPairControlView",
"ChargeOfEachAPVPairControlView",1,0,1); ChargeOfEachAPVPairControlView->SetBit(TH1::kCanRebin);
328 TH1F *CorrectionOfEachAPVPairControlView =
new TH1F(
"CorrectionOfEachAPVPairControlView",
"CorrectionOfEachAPVPairControlView",1,0,1); CorrectionOfEachAPVPairControlView->SetBit(TH1::kCanRebin);
329 std::ofstream APVPairTextOutput(
"apvpair_corrections.txt");
330 APVPairTextOutput<<
"# MeanCharge = "<<MeanCharge<<std::endl;
331 APVPairTextOutput<<
"# Nr. of APVPairs = "<<NrOfApvPairs<<std::endl;
332 for(
int ibin=1; ibin <= ChargeOfEachAPVPair->GetNbinsX(); ibin++){
333 TString local_bin_label = ChargeOfEachAPVPair->GetXaxis()->GetBinLabel(ibin);
334 double local_charge_over_path = ChargeOfEachAPVPair->GetBinContent(ibin);
335 if(local_bin_label.Contains(
"ChargeAPVPair_") && local_charge_over_path > 0.0000001){
336 uint32_t extracted_detid; std::istringstream read_label((local_bin_label(14,9)).
Data()); read_label >> extracted_detid;
337 unsigned short extracted_apvpairid; std::istringstream read_apvpair((local_bin_label(24,1)).
Data()); read_apvpair >> extracted_apvpairid;
338 double local_error_of_charge = ChargeOfEachAPVPair->GetBinError(ibin);
339 double local_correction = -0.5;
340 double local_error_correction = 0.;
341 local_correction = MeanCharge / local_charge_over_path;
342 local_error_correction = local_correction * local_error_of_charge / local_charge_over_path;
343 if(local_error_correction>1.8){
344 std::cout<<
"too large error "<<local_error_correction<<
" for histogram "<<local_bin_label<<std::endl;
346 double nr_of_entries = EntriesApvPairs->GetBinContent(ibin);
347 APVPairTextOutput<<local_bin_label<<
" "<<local_correction<<
" "<<local_charge_over_path<<
" "<<nr_of_entries<<std::endl;
348 CorrectionOfEachAPVPair->SetBinContent(ibin, local_correction);
349 CorrectionOfEachAPVPair->SetBinError(ibin, local_error_correction);
352 unsigned int generalized_layer = 0;
362 generalized_layer = 10*thedetId.
subdetId();
368 if(generalized_layer==31){
371 if(generalized_layer==32){
374 if(generalized_layer==33){
377 if(generalized_layer==51){
380 if(generalized_layer==52){
385 const FedChannelConnection& fedchannelconnection = siStripDetCabling->getConnection( extracted_detid, extracted_apvpairid );
386 std::ostringstream local_key;
388 local_key<<
"fecCrate"<<fedchannelconnection.
fecCrate()<<
"_fecSlot"<<fedchannelconnection.
fecSlot()<<
"_fecRing"<<fedchannelconnection.
fecRing()<<
"_ccuAddr"<<fedchannelconnection.
ccuAddr()<<
"_ccuChan"<<fedchannelconnection.
ccuChan()<<
"_apvPair"<<extracted_apvpairid;
389 TString control_key = local_key.str();
390 ChargeOfEachAPVPairControlView->Fill(control_key,local_charge_over_path);
391 int ibin1 = ChargeOfEachAPVPairControlView->GetXaxis()->FindBin(control_key);
392 ChargeOfEachAPVPairControlView->SetBinError(ibin1,local_error_of_charge);
393 CorrectionOfEachAPVPairControlView->Fill(control_key, local_correction);
394 int ibin2 = CorrectionOfEachAPVPairControlView->GetXaxis()->FindBin(control_key);
395 CorrectionOfEachAPVPairControlView->SetBinError(ibin2, local_error_correction);
398 if( fabs(module_thickness - 0.032)<0.001 ) ModuleThickness->Fill(1);
399 if( fabs(module_thickness - 0.05)<0.001 ) ModuleThickness->Fill(2);
402 if(fabs(module_width-6.144)<0.01) ModuleWidth->Fill(1);
403 if(fabs(module_width-7.14)<0.01) ModuleWidth->Fill(2);
404 if(fabs(module_width-9.3696)<0.01) ModuleWidth->Fill(3);
405 if(fabs(module_width-10.49)<0.01) ModuleWidth->Fill(4);
406 if(fabs(module_width-12.03)<0.01) ModuleWidth->Fill(5);
410 ChargeOfEachAPVPairControlView->LabelsDeflate(
"X");
411 CorrectionOfEachAPVPairControlView->LabelsDeflate(
"X");
const uint16_t & fecSlot() const
T getParameter(std::string const &) const
TObjArray * HlistAPVPairs
virtual int nstrips() const =0
T getUntrackedParameter(std::string const &, T const &) const
uint32_t total_nr_of_events
std::vector< uint32_t > SelectedDetIds
double ExpectedChargeDeposition
const uint16_t & fecCrate() const
unsigned int tibLayer(const DetId &id) const
double moduleThickness(const uint32_t detid, const edm::EventSetup *iSetup)
TObjArray * HlistOtherHistos
const edm::EventSetup * eventSetupCopy_
std::vector< Track > TrackCollection
collection of Tracks
const Bounds & bounds() const
~SiStripGainCosmicCalculator()
bool outputHistogramsInRootFile
double moduleWidth(const uint32_t detid, const edm::EventSetup *iSetup)
const Plane & surface() const
The nominal surface of the GeomDet.
std::pair< double, double > getPeakOfLandau(TH1F *inputHisto)
uint32_t rawId() const
get the raw id
virtual float thickness() const =0
unsigned int MinNrEntries
const uint16_t & fecRing() const
void getTOBDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tobDetRawIds, uint32_t layer=0, uint32_t bkw_frw=0, uint32_t rod=0) const
Class containning control, module, detector and connection information, at the level of a FED channel...
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
void algoBeginJob(const edm::EventSetup &)
Cos< T >::type cos(const T &t)
const uint16_t & ccuChan() const
SiStripGainCosmicCalculator(const edm::ParameterSet &)
std::map< uint32_t, double > thickness_map
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
const uint16_t & ccuAddr() const
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
SiStripApvGain * getNewObject()
uint32_t tibGlued(const DetId &id) const
const TrackerTopology * tTopo
std::vector< uint32_t > detModulesToBeExcluded
T const * product() const
void algoAnalyze(const edm::Event &, const edm::EventSetup &)
void getTIBDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tibDetRawIds, uint32_t layer=0, uint32_t bkw_frw=0, uint32_t int_ext=0, uint32_t string=0) const
uint32_t tibStereo(const DetId &id) const
virtual LocalPoint localPosition() const =0
virtual float width() const =0
unsigned int tobLayer(const DetId &id) const