120 sumNormXResiduals_(), summaryNormXResiduals_(),
121 sumYResiduals_(), summaryYResiduals_(),
122 sumNormYResiduals_(), summaryNormYResiduals_(),
123 sumResXvsXProfile_(), sumResXvsYProfile_(),
124 sumResYvsXProfile_(), sumResYvsYProfile_() {}
148 if (newDir.length()!=0){
150 else directoryString = newDir;
156 if (newDir.length()==0) tfd.reset(&(*upDir.
tfd));
171 if (newDir.length()==0){
176 directoryString=newDir;
180 if (newDir.length()!=0){
181 if(basedir.length()!=0)directoryString=basedir+
"/"+newDir;
182 else directoryString = newDir;
184 else directoryString=basedir;
189 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX);
190 template <
typename T> TH1*
make(
const char* name,
const char* title,
int nBinX,
double *xBins);
191 template <
typename T> TH1*
make(
const char* name,
const char* title,
int nBinX,
double minBinX,
double maxBinX,
int nBinY,
double minBinY,
double maxBinY);
192 template <
typename T> TH1*
make(
const char* name,
const char* title,
int nBinX,
double minBinX,
double maxBinX,
double minBinY,
double maxBinY);
194 std::auto_ptr<TFileDirectory>
tfd;
205 virtual void endJob()
override;
214 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles);
217 void setUpTreeMembers(
const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
233 int nBinsX,
double lowX,
double highX);
236 int nBinsX,
double lowX,
double highX);
239 int nBinsX,
double lowX,
double highX,
double lowY,
double highY);
242 int& nBinsX,
double& lowerBoundX,
double& upperBoundX);
257 template <
class OBJECT_TYPE>
int GetIndex(
const std::vector<OBJECT_TYPE*>& vec,
const TString&
name);
319 template <
class OBJECT_TYPE>
323 for (
typename std::vector<OBJECT_TYPE*>::const_iterator iter = vec.begin(), iterEnd = vec.end();
324 iter != iterEnd; ++iter, ++
result) {
325 if (*iter && (*iter)->GetName() ==
name)
return result;
327 edm::LogError(
"Alignment") <<
"@SUB=TrackerOfflineValidation::GetIndex" <<
" could not find " <<
name;
332 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH1F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
333 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book1D(
name,
title,
nBinX,minBinX,maxBinX)->getTH1();}
337 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double *xBins){
339 theDbe->setCurrentFolder(directoryString);
342 tmpProfile->SetDirectory(0);
343 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
348 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
350 theDbe->setCurrentFolder(directoryString);
352 TProfile *tmpProfile=
new TProfile(
name,
title,
nBinX,minBinX,maxBinX);
353 tmpProfile->SetDirectory(0);
354 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
356 else{
return tfd->make<TProfile>(
name,
title,
nBinX,minBinX,maxBinX);}
359 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name ,
const char*
title,
int nbinX,
double minX ,
double maxX,
double minY,
double maxY){
361 theDbe->setCurrentFolder(directoryString);
363 return (theDbe->bookProfile(
name,
title,nbinX,minX,maxX,dummy,minY,maxY)->getTH1());
366 return tfd->make<TProfile>(
name,
title,nbinX,minX,maxX,minY,maxY);
370 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH2F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
int nBinY,
double minBinY,
double maxBinY){
371 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book2D(
name,
title,
nBinX,minBinX,maxBinX,
nBinY,minBinY,maxBinY)->getTH1();}
427 edm::LogInfo(
"TrackerOfflineValidation") <<
"There are " << newBareTkGeomPtr->
detIds().size()
428 <<
" dets in the Geometry record.\n" 429 <<
"Out of these "<<newBareTkGeomPtr->
detUnitIds().size()
441 std::vector<TrackerOfflineValidation::SummaryContainer> vTrackerprofiles;
453 <<
"TrackerGeometry changed, but will not re-book hists!";
464 "Track #eta;#eta_{Track};Number of Tracks",
467 "Track #phi;#phi_{Track};Number of Tracks",
470 "Track # of valid hits;# of valid hits _{Track};Number of Tracks",
473 "Track # of lost hits;# of lost hits _{Track};Number of Tracks",
476 "Curvature #kappa;#kappa_{Track};Number of Tracks",
479 "Curvature |#kappa| Positive Tracks;|#kappa_{pos Track}|;Number of Tracks",
482 "Curvature |#kappa| Negative Tracks;|#kappa_{neg Track}|;Number of Tracks",
485 "Curvature |#kappa| Tracks Difference;|#kappa_{Track}|;# Pos Tracks - # Neg Tracks",
488 "#chi^{2};#chi^{2}_{Track};Number of Tracks",
491 "#chi^{2} probability;#chi^{2}prob_{Track};Number of Tracks",
494 "#chi^{2}/ndof;#chi^{2}/ndof;Number of Tracks",
497 "p_{T}^{track};p_{T}^{track} [GeV];Number of Tracks",
500 "#delta_{p_{T}}/p_{T}^{track};#delta_{p_{T}}/p_{T}^{track};Number of Tracks",
503 "Transverse Impact Parameter vs. #phi;#phi_{Track};#LT d_{0} #GT [cm]",
506 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};#LT d_{z} #GT [cm]",
509 "Transverse Impact Parameter vs. #eta;#eta_{Track};#LT d_{0} #GT [cm]",
512 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};#LT d_{z} #GT [cm]",
515 "#chi^{2} vs. #phi;#phi_{Track};#LT #chi^{2} #GT",
518 "#chi^{2} probablility vs. #phi;#phi_{Track};#LT #chi^{2} probability#GT",
521 "#chi^{2} probablility vs. |d_{0}|;|d_{0}|[cm];#LT #chi^{2} probability#GT",
524 "#chi^{2}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT",
527 "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT",
530 double xBins[19]={0.,0.15,0.5,1.,1.5,2.,2.5,3.,3.5,4.,4.5,5.,7.,10.,15.,25.,40.,100.,200.};
532 "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT",
536 "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT",
539 "#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",
542 "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT",
545 "#kappa vs. #phi;#phi_{Track};#kappa",
548 "#kappa vs. #eta;#eta_{Track};#kappa",
551 "#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",
554 "#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",
558 "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]",
559 100, -3.15, 3.15, 100,-1.,1.) );
561 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",
562 100, -3.15, 3.15, 100,-100.,100.));
564 "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]",
565 100, -3.15, 3.15, 100,-1.,1.));
567 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]",
568 100, -3.15, 3.15, 100,-100.,100.));
570 "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}",
571 100, -3.15, 3.15, 500, 0., 500.));
573 "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability",
574 100, -3.15, 3.15, 100, 0., 1.));
576 "#chi^{2} probability vs. |d_{0}|;|d_{0}| [cm];#chi^{2} probability",
577 100, 0, 80, 100, 0., 1.));
579 "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof",
580 100, -3.15, 3.15, 100, 0., 10.));
582 "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}",
583 100, -3.15, 3.15, 500, 0., 500.));
585 "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability",
586 100, -3.15, 3.15, 100, 0., 1.));
588 "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof",
589 100,-3.15,3.15, 100, 0., 10.));
591 "#kappa vs. #phi;#phi_{Track};#kappa",
592 100,-3.15,3.15, 100, .0,.05));
594 "#kappa vs. #eta;#eta_{Track};#kappa",
595 100,-3.15,3.15, 100, .0,.05));
597 "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa",
598 100,0.,10, 100,-.03,.03));
602 "res_{x'} vs momentum in BPix;p [GeV]; res_{x'}",
603 15,0.,15., 200, -0.1,0.1));
605 "res_{x'} vs momentum in FPix;p [GeV]; res_{x'}",
606 15,0.,15., 200, -0.1,0.1));
608 "res_{x'} vs momentum in TIB;p [GeV]; res_{x'}",
609 15,0.,15., 200, -0.1,0.1));
611 "res_{x'} vs momentum in TID;p [GeV]; res_{x'}",
612 15,0.,15., 200, -0.1,0.1));
614 "res_{x'} vs momentum in TOB;p [GeV]; res_{x'}",
615 15,0.,15., 200, -0.1,0.1));
617 "res_{x'} vs momentum in TEC;p [GeV]; res_{x'}",
618 15,0.,15., 200, -0.1,0.1));
622 "res_{y'} vs momentum in BPix;p [GeV]; res_{y'}",
623 15,0.,15., 200, -0.1,0.1));
625 "res_{y'} vs momentum in FPix;p [GeV]; res_{y'}",
626 15,0.,15., 200, -0.1,0.1));
634 std::vector<Alignable*> alivec(ali.
components());
637 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
639 dirname << structurename;
641 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" <<
i+1;
643 if (structurename.find(
"Endcap",0) != std::string::npos ) {
647 }
else if( !(this->
isDetOrDetUnit( (alivec)[i]->alignableObjectId()) )
677 std::stringstream histoname, histotitle, normhistoname, normhistotitle,
678 yhistoname, yhistotitle,
679 xprimehistoname, xprimehistotitle, normxprimehistoname, normxprimehistotitle,
680 yprimehistoname, yprimehistotitle, normyprimehistoname, normyprimehistotitle,
681 localxname, localxtitle, localyname, localytitle,
682 resxvsxprofilename, resxvsxprofiletitle, resyvsxprofilename, resyvsxprofiletitle,
683 resxvsyprofilename, resxvsyprofiletitle, resyvsyprofilename, resyvsyprofiletitle;
687 if( this->
isEndCap(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_wheel_";
688 else if ( this->
isBarrel(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_layer_";
689 else edm::LogWarning(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookHists" 690 <<
"Unknown subdetid: " << subdetandlayer.first;
692 histoname <<
"h_residuals_subdet_" << subdetandlayer.first
693 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
694 yhistoname <<
"h_y_residuals_subdet_" << subdetandlayer.first
695 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
696 xprimehistoname <<
"h_xprime_residuals_subdet_" << subdetandlayer.first
697 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
698 yprimehistoname <<
"h_yprime_residuals_subdet_" << subdetandlayer.first
699 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
700 normhistoname <<
"h_normresiduals_subdet_" << subdetandlayer.first
701 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
702 normxprimehistoname <<
"h_normxprimeresiduals_subdet_" << subdetandlayer.first
703 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
704 normyprimehistoname <<
"h_normyprimeresiduals_subdet_" << subdetandlayer.first
705 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
706 histotitle <<
"X Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit} [cm]";
707 yhistotitle <<
"Y Residual for module " <<
id.rawId() <<
";y_{tr} - y_{hit} [cm]";
708 normhistotitle <<
"Normalized Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit}/#sigma";
709 xprimehistotitle <<
"X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})' [cm]";
710 normxprimehistotitle <<
"Normalized X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})'/#sigma";
711 yprimehistotitle <<
"Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})' [cm]";
712 normyprimehistotitle <<
"Normalized Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})'/#sigma";
715 localxname <<
"h_localx_subdet_" << subdetandlayer.first
716 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
717 localyname <<
"h_localy_subdet_" << subdetandlayer.first
718 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
719 localxtitle <<
"u local for module " <<
id.rawId() <<
"; u_{tr,r}";
720 localytitle <<
"v local for module " <<
id.rawId() <<
"; v_{tr,r}";
722 resxvsxprofilename <<
"p_residuals_x_vs_x_subdet_" << subdetandlayer.first
723 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
724 resyvsxprofilename <<
"p_residuals_y_vs_x_subdet_" << subdetandlayer.first
725 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
726 resxvsyprofilename <<
"p_residuals_x_vs_y_subdet_" << subdetandlayer.first
727 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
728 resyvsyprofilename <<
"p_residuals_y_vs_y_subdet_" << subdetandlayer.first
729 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
730 resxvsxprofiletitle <<
"U Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
731 resyvsxprofiletitle <<
"V Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
732 resxvsyprofiletitle <<
"U Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
733 resyvsyprofiletitle <<
"V Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
744 if (
dqmMode_) moduleLevelHistsTransient =
false;
750 histoname.str().c_str(),histotitle.str().c_str(),
754 normhistoname.str().c_str(),normhistotitle.str().c_str(),
759 xprimehistoname.str().c_str(),xprimehistotitle.str().c_str(),
763 normxprimehistoname.str().c_str(),normxprimehistotitle.str().c_str(),
769 histStruct.
LocalX = this->
bookTH1F(moduleLevelHistsTransient, tfd,
770 localxname.str().c_str(),localxtitle.str().c_str(),
772 histStruct.
LocalY = this->
bookTH1F(moduleLevelHistsTransient, tfd,
773 localyname.str().c_str(),localytitle.str().c_str(),
776 resxvsxprofilename.str().c_str(),resxvsxprofiletitle.str().c_str(),
780 resxvsyprofilename.str().c_str(),resxvsyprofiletitle.str().c_str(),
788 yprimehistoname.str().c_str(),yprimehistotitle.str().c_str(),
793 yhistoname.str().c_str(), yhistotitle.str().c_str(),
798 normyprimehistoname.str().c_str(),normyprimehistotitle.str().c_str(),
805 resyvsxprofilename.str().c_str(),resyvsxprofiletitle.str().c_str(),
809 resyvsyprofilename.str().c_str(),resyvsyprofiletitle.str().c_str(),
819 int nBinsX,
double lowX,
double highX)
822 vDeleteObjects_.push_back(
new TH1F(histName, histTitle, nBinsX, lowX, highX));
826 return tfd.
make<TH1F>(histName, histTitle, nBinsX, lowX, highX);
830 int nBinsX,
double lowX,
double highX)
833 TProfile *
profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX);
838 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX);
843 int nBinsX,
double lowX,
double highX,
double lowY,
double highY)
846 TProfile *
profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
851 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
887 int& nBinsX,
double& lowerBoundX,
double& upperBoundX)
940 if(targetHist && sourceHist) {
941 targetHist->SetBinContent(bin, sourceHist->GetMean(1));
942 if(
useFwhm_) targetHist->SetBinError(bin,
Fwhm(sourceHist)/2.);
943 else targetHist->SetBinError(bin, sourceHist->GetRMS(1) );
997 <<
"[TrackerOfflineValidation] Error, tried to get reference for non-tracker subdet " << subdetid
998 <<
" from detector " << detid.
det();
1011 std::vector<TrackerValidationVariables::AVTrackStruct> vTrackstruct;
1014 for (std::vector<TrackerValidationVariables::AVTrackStruct>::const_iterator itT = vTrackstruct.begin();
1015 itT != vTrackstruct.end();
1024 vTrackHistos_[numOfValidHitsindex]->Fill(itT->numberOfValidHits);
1026 vTrackHistos_[numOfLostHitsindex]->Fill(itT->numberOfLostHits);
1030 if (itT->charge > 0)
1033 if (itT->charge < 0)
1043 if (itT->ptError != 0.) {
1045 vTrackHistos_[ptResolutionindex]->Fill(itT->ptError/itT->pt);
1061 vTrackProfiles_[chiProbabsd0index]->Fill(fabs(itT->d0),itT->chi2Prob);
1097 vTrack2DHistos_[chiProbabsd0index_2d]->Fill(fabs(itT->d0),itT->chi2Prob);
1114 for (std::vector<TrackerValidationVariables::AVHitStruct>::const_iterator itH = itT->hits.begin();
1115 itH != itT->hits.end();
1118 DetId detid(itH->rawDetId);
1123 histStruct.
ResHisto->Fill(itH->resX);
1124 if(itH->resErrX != 0) histStruct.
NormResHisto->Fill(itH->resX/itH->resErrX);
1130 if (itH->resXprime != -999.) {
1161 float tgalpha =
tan(itH->localAlpha);
1162 if ( fabs(tgalpha)!=0 ){
1163 histStruct.
LocalX->Fill(itH->localXnorm, tgalpha*tgalpha);
1164 histStruct.
LocalY->Fill(itH->localYnorm, tgalpha*tgalpha);
1176 histStruct.
ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1177 histStruct.
ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1184 if(itH->resXprimeErr != 0 && itH->resXprimeErr != -999 ) {
1189 if (itH->resYprime != -999.) {
1205 float tgbeta =
tan(itH->localBeta);
1206 if ( fabs(tgbeta)!=0 ){
1219 histStruct.
ResYvsXProfile->Fill(itH->localXnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1220 histStruct.
ResYvsYProfile->Fill(itH->localYnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1225 if (itH->resYprimeErr != 0 && itH->resYprimeErr != -999. ) {
1257 TTree *
tree = fs->
make<TTree>(
"TkOffVal",
"TkOffVal");
1263 tree->Branch(
"TkOffTreeVariables", &treeMemPtr);
1272 delete treeMemPtr; treeMemPtr = 0;
1278 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles)
1280 std::vector<Alignable*> alivec(ali.
components());
1281 if( this->
isDetOrDetUnit((alivec)[0]->alignableObjectId()) )
return;
1283 for(
int iComp=0, iCompEnd = ali.
components().size();iComp < iCompEnd; ++iComp) {
1284 std::vector< TrackerOfflineValidation::SummaryContainer > vProfiles;
1287 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
1289 dirname << structurename;
1292 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" << iComp+1;
1294 if( !(this->
isDetOrDetUnit( (alivec)[iComp]->alignableObjectId()) )
1299 TH1 *hX = vLevelProfiles[iComp].sumXResiduals_;
1300 TH1 *hNormX = vLevelProfiles[iComp].sumNormXResiduals_;
1301 TH1 *hY = vLevelProfiles[iComp].sumYResiduals_;
1302 TH1 *hNormY = vLevelProfiles[iComp].sumNormYResiduals_;
1303 TH1 *pXX = vLevelProfiles[iComp].sumResXvsXProfile_;
1304 TH1 *pXY = vLevelProfiles[iComp].sumResXvsYProfile_;
1305 TH1 *pYX = vLevelProfiles[iComp].sumResYvsXProfile_;
1306 TH1 *pYY = vLevelProfiles[iComp].sumResYvsYProfile_;
1307 for(
uint n = 0;
n < vProfiles.size(); ++
n) {
1312 if (hNormY)
sumHistStructure_.emplace_back(hNormY, vProfiles[n].sumNormYResiduals_);
1320 toFit_.push_back(vLevelProfiles[iComp].sumXResiduals_);
1321 toFit_.push_back(vLevelProfiles[iComp].sumNormXResiduals_);
1322 if (hY)
toFit_.push_back(hY);
1323 if (hNormY)
toFit_.push_back(hNormY);
1334 for (std::vector<std::pair<TH1*,TH1*> >::const_iterator it =
sumHistStructure_.begin();
1337 it->first->Add(it->second);
1339 for (std::vector<std::tuple<int,TH1*,TH1*> >::const_iterator it =
summaryBins_.begin();
1342 setSummaryBin(std::get<0>(*it), std::get<1>(*it), std::get<2>(*it));
1344 for (std::vector<TH1*>::const_iterator it =
toFit_.begin();
1358 const char *aliTypeName =
alignableTracker_->objectIdProvider().idToString(alitype);
1359 const char *aliSubtypeName =
alignableTracker_->objectIdProvider().idToString(subtype);
1362 const DetId aliDetId = ali.
id();
1372 const uint subcompSize = ali.
components()[0]->components().size();
1374 const TString
title(Form(
"Summary for substructures in %s %d;%s;",aliTypeName,i,aliSubtypeName));
1376 sumContainer.summaryXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d",aliTypeName,i),
1377 title +
"#LT #Delta x' #GT",
1378 aliSize, 0.5, aliSize+0.5);
1379 sumContainer.summaryNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d",aliTypeName,i),
1380 title +
"#LT #Delta x'/#sigma #GT",
1381 aliSize,0.5,aliSize+0.5);
1384 sumContainer.summaryYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d",aliTypeName,i),
1385 title +
"#LT #Delta y' #GT",
1386 aliSize, 0.5, aliSize+0.5);
1387 sumContainer.summaryNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d",aliTypeName,i),
1388 title +
"#LT #Delta y'/#sigma #GT",
1389 aliSize,0.5,aliSize+0.5);
1393 if (subcompSize != 2) {
1396 <<
"Det with " << subcompSize <<
" components";
1399 const TString
title(Form(
"Summary for substructures in %s %d;%s;", aliTypeName, i,
1402 sumContainer.summaryXResiduals_
1403 = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d", aliTypeName, i),
1404 title +
"#LT #Delta x' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1405 sumContainer.summaryNormXResiduals_
1406 = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d", aliTypeName, i),
1407 title +
"#LT #Delta x'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1410 sumContainer.summaryYResiduals_
1411 = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d", aliTypeName, i),
1412 title +
"#LT #Delta y' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1413 sumContainer.summaryNormYResiduals_
1414 = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d", aliTypeName, i),
1415 title +
"#LT #Delta y'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1419 edm::LogError(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookSummaryHists" 1420 <<
"No summary histogram for hierarchy level " 1421 << aliTypeName <<
" in subdet " << aliDetId.
subdetId();
1429 const TString sumTitle(Form(
"Residual for %s %d in %s;", aliTypeName, i, typeName));
1433 sumContainer.sumXResiduals_ = tfd.
make<TH1F>(Form(
"h_Xprime_%s_%d", aliTypeName, i),
1438 sumContainer.sumNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_NormXprime_%s_%d",aliTypeName,i),
1444 sumContainer.sumResXvsXProfile_ = tfd.
make<TProfile>(Form(
"p_resXX_%s_%d",aliTypeName,i),
1448 sumContainer.sumResXvsXProfile_->Sumw2();
1449 sumContainer.sumResXvsYProfile_ = tfd.
make<TProfile>(Form(
"p_resXY_%s_%d",aliTypeName,i),
1453 sumContainer.sumResXvsYProfile_->Sumw2();
1458 sumContainer.sumYResiduals_ = tfd.
make<TH1F>(Form(
"h_Yprime_%s_%d",aliTypeName,i),
1463 sumContainer.sumNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_NormYprime_%s_%d",aliTypeName,i),
1469 sumContainer.sumResYvsXProfile_ = tfd.
make<TProfile>(Form(
"p_resYX_%s_%d",aliTypeName,i),
1473 sumContainer.sumResYvsXProfile_->Sumw2();
1474 sumContainer.sumResYvsYProfile_ = tfd.
make<TProfile>(Form(
"p_resYY_%s_%d",aliTypeName,i),
1478 sumContainer.sumResYvsYProfile_->Sumw2();
1486 for(
uint k = 0;
k < aliSize; ++
k) {
1507 for(
uint k = 0;
k < aliSize; ++
k) {
1508 for(
uint j = 0; j < subcompSize; ++j) {
1529 return sumContainer;
1536 float max = hist->GetMaximum();
1537 int left = -1, right = -1;
1538 for(
unsigned int i = 1, iEnd = hist->GetNbinsX();
i <= iEnd; ++
i) {
1539 if(hist->GetBinContent(
i) < max/2. && hist->GetBinContent(
i+1) > max/2. && left == -1) {
1540 if(max/2. - hist->GetBinContent(
i) < hist->GetBinContent(
i+1) - max/2.) {
1548 if(left != -1 && right == -1) {
1549 if(hist->GetBinContent(
i) > max/2. && hist->GetBinContent(
i+1) < max/2.) {
1550 if( hist->GetBinContent(
i) - max/2. < max/2. - hist->GetBinContent(
i+1)) {
1559 return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1568 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1569 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1573 DetId detId_ = it->first;
1579 unsigned int whichHalfBarrel(1), rawId(detId_.
rawId());
1580 if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) ||
1581 (rawId>=302189572 && rawId<302194980) ) whichHalfBarrel=2;
1583 treeMem.
half = whichHalfBarrel;
1587 unsigned int whichHalfCylinder(1), rawId(detId_.
rawId());
1588 if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) ||
1589 (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) ) whichHalfCylinder=2;
1592 treeMem.
half = whichHalfCylinder;
1597 unsigned int whichHalfShell(1), rawId(detId_.
rawId());
1598 if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) ||
1599 (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1600 (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) ||
1601 (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1602 (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) ||
1603 (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1604 (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) ||
1605 (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1608 treeMem.
half = whichHalfShell;
1645 treeMem.
posX = gPModule.
x();
1646 treeMem.
posY = gPModule.
y();
1647 treeMem.
posZ = gPModule.
z();
1652 LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1654 gVDirection = surface.
toGlobal(lVDirection),
1655 gWDirection = surface.
toGlobal(lWDirection);
1656 double dR(999.), dPhi(999.), dZ(999.);
1658 dR = gWDirection.perp() - gPModule.
perp();
1660 dZ = gVDirection.z() - gPModule.
z();
1665 dZ = gWDirection.z() - gPModule.
z();
1668 dR = gVDirection.perp() - gPModule.
perp();
1670 dZ = gWDirection.z() - gPModule.
z();
1681 const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_)
1683 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1684 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1688 treeMem.
entries =
static_cast<UInt_t
>(it->second.ResXprimeHisto->GetEntries());
1689 treeMem.
meanX = it->second.ResXprimeHisto->GetMean();
1690 treeMem.
rmsX = it->second.ResXprimeHisto->GetRMS();
1696 std::pair<float,float> fitResult1 = this->
fitResiduals(it->second.ResXprimeHisto);
1697 treeMem.
fitMeanX = fitResult1.first;
1700 std::pair<float,float> fitResult2 = this->
fitResiduals(it->second.NormResXprimeHisto);
1708 int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1710 treeMem.
numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1711 treeMem.
numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1714 treeMem.
meanNormX = it->second.NormResXprimeHisto->GetMean();
1715 treeMem.
rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1718 it->second.NormResXprimeHisto->GetStats(stats);
1720 if (stats[0]) treeMem.
chi2PerDofX = stats[3]/stats[0];
1723 treeMem.
histNameX = it->second.ResXprimeHisto->GetName();
1724 treeMem.
histNameNormX = it->second.NormResXprimeHisto->GetName();
1728 treeMem.
meanLocalX = it->second.ResHisto->GetMean();
1729 treeMem.
rmsLocalX = it->second.ResHisto->GetRMS();
1735 if (it->second.ResYHisto) treeMem.
histNameLocalY = it->second.ResYHisto->GetName();
1740 if (it->second.ResYprimeHisto) {
1741 TH1 *
h = it->second.ResYprimeHisto;
1742 treeMem.
meanY = h->GetMean();
1743 treeMem.
rmsY = h->GetRMS();
1746 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1747 treeMem.
fitMeanY = fitMeanSigma.first;
1748 treeMem.
fitSigmaY = fitMeanSigma.second;
1756 if (it->second.NormResYprimeHisto) {
1757 TH1 *
h = it->second.NormResYprimeHisto;
1761 if (stats[0]) treeMem.
chi2PerDofY = stats[3]/stats[0];
1764 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1772 if (it->second.ResXvsXProfile) {
1773 TH1 *
h = it->second.ResXvsXProfile;
1778 if (it->second.ResXvsYProfile) {
1779 TH1 *
h = it->second.ResXvsYProfile;
1784 if (it->second.ResYvsXProfile) {
1785 TH1 *
h = it->second.ResYvsXProfile;
1790 if (it->second.ResYvsYProfile) {
1791 TH1 *
h = it->second.ResYvsYProfile;
1803 std::pair<float,float>
1806 std::pair<float,float> fitResult(9999., 9999.);
1807 if (!hist || hist->GetEntries() < 20)
return fitResult;
1809 float mean = hist->GetMean();
1810 float sigma = hist->GetRMS();
1815 TF1
func(
"tmp",
"gaus", mean - 2.*sigma, mean + 2.*sigma);
1816 if (0 == hist->Fit(&func,
"QNR")) {
1817 mean = func.GetParameter(1);
1818 sigma = func.GetParameter(2);
1820 func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1823 if (0 == hist->Fit(&func,
"Q0LR")) {
1824 if (hist->GetFunction(func.GetName())) {
1825 hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1827 fitResult.first = func.GetParameter(1);
1828 fitResult.second = func.GetParameter(2);
1832 edm::LogWarning(
"Alignment") <<
"@SUB=TrackerOfflineValidation::fitResiduals" 1833 <<
"Caught this exception during ROOT fit: " 1844 int nbins = histo->GetNbinsX();
1847 double *
x =
new double[
nbins];
1848 double *
y =
new double[
nbins];
1849 for (
int j = 0; j <
nbins; j++) {
1850 x[j] = histo->GetBinCenter(j+1);
1851 y[j] = histo->GetBinContent(j+1);
1853 median = TMath::Median(nbins, x, y);
const TrackerGeometry * bareTkGeomPtr_
const DetIdContainer & detUnitIds() const override
Returm a vector of all GeomDetUnit DetIds.
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
T getParameter(std::string const &) const
align::ID id() const
Return the ID of Alignable, i.e. DetId of 'first' component GeomDet(Unit).
bool tecIsDoubleSide(const DetId &id) const
bool tobIsDoubleSide(const DetId &id) const
std::vector< TH1 * > vDeleteObjects_
std::map< int, TrackerOfflineValidation::ModuleHistos > mPxeResiduals_
std::vector< TH1 * > vTrackHistos_
~TrackerOfflineValidation()
bool tibIsDoubleSide(const DetId &id) const
unsigned int tibLayer(const DetId &id) const
std::pair< int, int > typeAndLayerFromDetId(const DetId &detId, const TrackerTopology *tTopo) const
unsigned int tidRing(const DetId &id) const
TH1 * make(const char *name, const char *title, int nBinX, double minBinX, double maxBinX)
Float_t numberOfOverflows
bool isPixel(uint32_t subDetId)
std::vector< unsigned int > tidModuleInfo(const DetId &id) const
std::vector< TH1 * > vTrack2DHistos_
TH1 * bookTH1F(bool isTransient, DirectoryWrapper &tfd, const char *histName, const char *histTitle, int nBinsX, double lowX, double highX)
std::unique_ptr< AlignableTracker > alignableTracker_
std::map< int, TrackerOfflineValidation::ModuleHistos > mTecResiduals_
#define DEFINE_FWK_MODULE(type)
std::string directoryString
unsigned int pxfDisk(const DetId &id) const
container to hold data to be written into TTree
moduleLevelHistsTransient
std::string profileNameResXvsX
void fillTree(TTree &tree, TkOffTreeVariables &treeMem, const std::map< int, TrackerOfflineValidation::ModuleHistos > &moduleHist_)
unsigned int tecRing(const DetId &id) const
ring id
const bool stripYResiduals_
const bool useOverflowForRMS_
uint32_t tobStereo(const DetId &id) const
S make(const edm::ParameterSet &cfg)
Geom::Phi< T > phi() const
unsigned int pxbLadder(const DetId &id) const
edm::ESHandle< TrackerGeometry > tkGeom_
int GetIndex(const std::vector< OBJECT_TYPE * > &vec, const TString &name)
def setup(process, global_tag, zero_tesla=False)
unsigned int tidWheel(const DetId &id) const
unsigned int pxbModule(const DetId &id) const
T * make(const Args &...args) const
make new ROOT object
char const * what() const override
float getMedian(const TH1 *hist) const
ModuleHistos & getHistStructFromMap(const DetId &detid)
const bool moduleLevelProfiles_
Float_t numberOfUnderflows
void setSummaryBin(int bin, TH1 *targetHist, TH1 *sourceHist)
std::vector< unsigned int > tibStringInfo(const DetId &id) const
std::map< int, TrackerOfflineValidation::ModuleHistos > mTibResiduals_
TrackerOfflineValidation::SummaryContainer bookSummaryHists(DirectoryWrapper &tfd, const Alignable &ali, align::StructureType type, int i)
const Plane & surface() const
The nominal surface of the GeomDet.
std::vector< std::tuple< int, TH1 *, TH1 * > > summaryBins_
TProfile * ResXvsYProfile
TH1 * summaryNormYResiduals_
std::string profileNameResYvsX
std::map< int, TrackerOfflineValidation::ModuleHistos > mTidResiduals_
uint32_t rawId() const
get the raw id
TProfile * ResYvsYProfile
std::vector< std::pair< TH1 *, TH1 * > > sumHistStructure_
TFileDirectory & tFileDirectory()
unsigned int subDetId[21]
std::vector< unsigned int > tecPetalInfo(const DetId &id) const
const Surface::PositionType & position() const
The position (origin of the R.F.)
TH1 * summaryNormXResiduals_
unsigned int tidSide(const DetId &id) const
std::string histNameNormX
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
void setUpTreeMembers(const std::map< int, TrackerOfflineValidation::ModuleHistos > &moduleHist_, const TrackerGeometry &tkgeom, const TrackerTopology *tTopo)
uint32_t tidStereo(const DetId &id) const
std::vector< unsigned int > tobRodInfo(const DetId &id) const
virtual Alignables components() const =0
Return vector of all direct components.
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
const DetIdContainer & detIds() const override
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
Tan< T >::type tan(const T &t)
void getBinning(uint32_t subDetId, TrackerOfflineValidation::HistogramType residualtype, int &nBinsX, double &lowerBoundX, double &upperBoundX)
virtual void checkBookHists(const edm::EventSetup &setup)
TProfile * bookTProfile(bool isTransient, DirectoryWrapper &tfd, const char *histName, const char *histTitle, int nBinsX, double lowX, double highX)
void prepareSummaryHists(DirectoryWrapper &tfd, const Alignable &ali, std::vector< TrackerOfflineValidation::SummaryContainer > &vLevelProfiles)
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
std::string histNameLocalY
std::string histNameNormLocalX
unsigned int tibModule(const DetId &id) const
unsigned int pxfModule(const DetId &id) const
bin
set the eta bin as selection string.
bool isDetOrDetUnit(align::StructureType type)
std::map< int, TrackerOfflineValidation::ModuleHistos > mTobResiduals_
unsigned int pxbLayer(const DetId &id) const
unsigned int tecModule(const DetId &id) const
DirectoryWrapper(const std::string &newDir, const std::string &basedir, bool useDqmMode)
void fillTrackQuantities(const edm::Event &, const edm::EventSetup &, std::vector< AVTrackStruct > &v_avtrackout)
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
const std::string moduleDirectory_
std::pair< float, float > fitResiduals(TH1 *hist) const
void collateSummaryHists()
std::string histNameLocalX
std::auto_ptr< TFileDirectory > tfd
bool tidIsDoubleSide(const DetId &id) const
void summarizeBinInContainer(int bin, SummaryContainer &targetContainer, SummaryContainer &sourceContainer)
const bool moduleLevelHistsTransient_
bool isEndCap(uint32_t subDetId)
unsigned int tobModule(const DetId &id) const
std::string profileNameResXvsY
std::vector< TH1 * > toFit_
void bookGlobalHists(DirectoryWrapper &tfd)
DirectoryWrapper(const DirectoryWrapper &upDir, const std::string &newDir, const std::string &basedir, bool useDqmMode)
TrackerValidationVariables avalidator_
std::map< int, TkOffTreeVariables > mTreeMembers_
uint32_t tecStereo(const DetId &id) const
const TrackerGeomDet * idToDet(DetId) const override
TProfile * ResXvsXProfile
std::vector< TH1 * > vTrackProfiles_
unsigned int pxfSide(const DetId &id) const
void bookDirHists(DirectoryWrapper &tfd, const Alignable &ali, const TrackerTopology *tTopo)
std::map< int, TrackerOfflineValidation::ModuleHistos > mPxbResiduals_
virtual void endJob() override
std::string histNameNormY
uint32_t tibStereo(const DetId &id) const
Detector det() const
get the detector field from this detid
const edm::ParameterSet parSet_
TrackerOfflineValidation(const edm::ParameterSet &)
float Fwhm(const TH1 *hist) const
unsigned int tecWheel(const DetId &id) const
T const * product() const
unsigned int pxfPanel(const DetId &id) const
unsigned int pxfBlade(const DetId &id) const
TProfile * ResYvsXProfile
virtual void analyze(const edm::Event &, const edm::EventSetup &) override
std::string profileNameResYvsY
unsigned int tobLayer(const DetId &id) const
void bookHists(DirectoryWrapper &tfd, const Alignable &ali, const TrackerTopology *tTopo, align::StructureType type, int i)
unsigned int tecSide(const DetId &id) const
bool isBarrel(uint32_t subDetId)