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;
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);
322 template <
class OBJECT_TYPE>
326 for (
typename std::vector<OBJECT_TYPE*>::const_iterator iter = vec.begin(), iterEnd = vec.end();
327 iter != iterEnd; ++iter, ++
result) {
328 if (*iter && (*iter)->GetName() ==
name)
return result;
330 edm::LogError(
"Alignment") <<
"@SUB=TrackerOfflineValidation::GetIndex" <<
" could not find " <<
name;
335 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH1F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
336 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book1D(
name,
title,
nBinX,minBinX,maxBinX)->getTH1();}
340 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double *xBins){
342 theDbe->setCurrentFolder(directoryString);
345 tmpProfile->SetDirectory(
nullptr);
346 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
351 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
353 theDbe->setCurrentFolder(directoryString);
355 TProfile *tmpProfile=
new TProfile(
name,
title,
nBinX,minBinX,maxBinX);
356 tmpProfile->SetDirectory(
nullptr);
357 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
359 else{
return tfd->make<TProfile>(
name,
title,
nBinX,minBinX,maxBinX);}
362 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name ,
const char*
title,
int nbinX,
double minX ,
double maxX,
double minY,
double maxY){
364 theDbe->setCurrentFolder(directoryString);
366 return (theDbe->bookProfile(
name,
title,nbinX,minX,maxX,dummy,minY,maxY)->getTH1());
369 return tfd->make<TProfile>(
name,
title,nbinX,minX,maxX,minY,maxY);
373 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH2F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
int nBinY,
double minBinY,
double maxBinY){
374 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book2D(
name,
title,
nBinX,minBinX,maxBinX,
nBinY,minBinY,maxBinY)->getTH1();}
432 edm::LogInfo(
"TrackerOfflineValidation") <<
"There are " << newBareTkGeomPtr->
detIds().size()
433 <<
" dets in the Geometry record.\n" 434 <<
"Out of these "<<newBareTkGeomPtr->
detUnitIds().size()
446 std::vector<TrackerOfflineValidation::SummaryContainer> vTrackerprofiles;
458 <<
"TrackerGeometry changed, but will not re-book hists!";
469 "Track #eta;#eta_{Track};Number of Tracks",
472 "Track #phi;#phi_{Track};Number of Tracks",
475 "Track # of valid hits;# of valid hits _{Track};Number of Tracks",
478 "Track # of lost hits;# of lost hits _{Track};Number of Tracks",
481 "Curvature #kappa;#kappa_{Track};Number of Tracks",
484 "Curvature |#kappa| Positive Tracks;|#kappa_{pos Track}|;Number of Tracks",
487 "Curvature |#kappa| Negative Tracks;|#kappa_{neg Track}|;Number of Tracks",
490 "Curvature |#kappa| Tracks Difference;|#kappa_{Track}|;# Pos Tracks - # Neg Tracks",
493 "#chi^{2};#chi^{2}_{Track};Number of Tracks",
496 "#chi^{2} probability;#chi^{2}prob_{Track};Number of Tracks",
499 "#chi^{2}/ndof;#chi^{2}/ndof;Number of Tracks",
502 "p_{T}^{track};p_{T}^{track} [GeV];Number of Tracks",
505 "#delta_{p_{T}}/p_{T}^{track};#delta_{p_{T}}/p_{T}^{track};Number of Tracks",
508 "Transverse Impact Parameter vs. #phi;#phi_{Track};#LT d_{0} #GT [cm]",
511 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};#LT d_{z} #GT [cm]",
514 "Transverse Impact Parameter vs. #eta;#eta_{Track};#LT d_{0} #GT [cm]",
517 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};#LT d_{z} #GT [cm]",
520 "#chi^{2} vs. #phi;#phi_{Track};#LT #chi^{2} #GT",
523 "#chi^{2} probablility vs. #phi;#phi_{Track};#LT #chi^{2} probability#GT",
526 "#chi^{2} probablility vs. |d_{0}|;|d_{0}|[cm];#LT #chi^{2} probability#GT",
529 "#chi^{2}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT",
532 "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT",
535 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.};
537 "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT",
541 "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT",
544 "#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",
547 "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT",
550 "#kappa vs. #phi;#phi_{Track};#kappa",
553 "#kappa vs. #eta;#eta_{Track};#kappa",
556 "#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",
559 "#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",
563 "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]",
564 100, -3.15, 3.15, 100,-1.,1.) );
566 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",
567 100, -3.15, 3.15, 100,-100.,100.));
569 "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]",
570 100, -3.15, 3.15, 100,-1.,1.));
572 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]",
573 100, -3.15, 3.15, 100,-100.,100.));
575 "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}",
576 100, -3.15, 3.15, 500, 0., 500.));
578 "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability",
579 100, -3.15, 3.15, 100, 0., 1.));
581 "#chi^{2} probability vs. |d_{0}|;|d_{0}| [cm];#chi^{2} probability",
582 100, 0, 80, 100, 0., 1.));
584 "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof",
585 100, -3.15, 3.15, 100, 0., 10.));
587 "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}",
588 100, -3.15, 3.15, 500, 0., 500.));
590 "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability",
591 100, -3.15, 3.15, 100, 0., 1.));
593 "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof",
594 100,-3.15,3.15, 100, 0., 10.));
596 "#kappa vs. #phi;#phi_{Track};#kappa",
597 100,-3.15,3.15, 100, .0,.05));
599 "#kappa vs. #eta;#eta_{Track};#kappa",
600 100,-3.15,3.15, 100, .0,.05));
602 "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa",
603 100,0.,10, 100,-.03,.03));
607 "res_{x'} vs momentum in BPix;p [GeV]; res_{x'}",
608 15,0.,15., 200, -0.1,0.1));
610 "res_{x'} vs momentum in FPix;p [GeV]; res_{x'}",
611 15,0.,15., 200, -0.1,0.1));
613 "res_{x'} vs momentum in TIB;p [GeV]; res_{x'}",
614 15,0.,15., 200, -0.1,0.1));
616 "res_{x'} vs momentum in TID;p [GeV]; res_{x'}",
617 15,0.,15., 200, -0.1,0.1));
619 "res_{x'} vs momentum in TOB;p [GeV]; res_{x'}",
620 15,0.,15., 200, -0.1,0.1));
622 "res_{x'} vs momentum in TEC;p [GeV]; res_{x'}",
623 15,0.,15., 200, -0.1,0.1));
627 "res_{y'} vs momentum in BPix;p [GeV]; res_{y'}",
628 15,0.,15., 200, -0.1,0.1));
630 "res_{y'} vs momentum in FPix;p [GeV]; res_{y'}",
631 15,0.,15., 200, -0.1,0.1));
642 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
644 dirname << structurename;
646 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" <<
i+1;
648 if (structurename.find(
"Endcap",0) != std::string::npos ) {
652 }
else if( !(this->
isDetOrDetUnit( (alivec)[i]->alignableObjectId()) )
682 std::stringstream histoname, histotitle, normhistoname, normhistotitle,
683 yhistoname, yhistotitle,
684 xprimehistoname, xprimehistotitle, normxprimehistoname, normxprimehistotitle,
685 yprimehistoname, yprimehistotitle, normyprimehistoname, normyprimehistotitle,
686 localxname, localxtitle, localyname, localytitle,
687 resxvsxprofilename, resxvsxprofiletitle, resyvsxprofilename, resyvsxprofiletitle,
688 resxvsyprofilename, resxvsyprofiletitle, resyvsyprofilename, resyvsyprofiletitle;
692 if( this->
isEndCap(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_wheel_";
693 else if ( this->
isBarrel(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_layer_";
694 else edm::LogWarning(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookHists" 695 <<
"Unknown subdetid: " << subdetandlayer.first;
697 histoname <<
"h_residuals_subdet_" << subdetandlayer.first
698 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
699 yhistoname <<
"h_y_residuals_subdet_" << subdetandlayer.first
700 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
701 xprimehistoname <<
"h_xprime_residuals_subdet_" << subdetandlayer.first
702 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
703 yprimehistoname <<
"h_yprime_residuals_subdet_" << subdetandlayer.first
704 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
705 normhistoname <<
"h_normresiduals_subdet_" << subdetandlayer.first
706 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
707 normxprimehistoname <<
"h_normxprimeresiduals_subdet_" << subdetandlayer.first
708 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
709 normyprimehistoname <<
"h_normyprimeresiduals_subdet_" << subdetandlayer.first
710 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
711 histotitle <<
"X Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit} [cm]";
712 yhistotitle <<
"Y Residual for module " <<
id.rawId() <<
";y_{tr} - y_{hit} [cm]";
713 normhistotitle <<
"Normalized Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit}/#sigma";
714 xprimehistotitle <<
"X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})' [cm]";
715 normxprimehistotitle <<
"Normalized X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})'/#sigma";
716 yprimehistotitle <<
"Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})' [cm]";
717 normyprimehistotitle <<
"Normalized Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})'/#sigma";
720 localxname <<
"h_localx_subdet_" << subdetandlayer.first
721 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
722 localyname <<
"h_localy_subdet_" << subdetandlayer.first
723 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
724 localxtitle <<
"u local for module " <<
id.rawId() <<
"; u_{tr,r}";
725 localytitle <<
"v local for module " <<
id.rawId() <<
"; v_{tr,r}";
727 resxvsxprofilename <<
"p_residuals_x_vs_x_subdet_" << subdetandlayer.first
728 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
729 resyvsxprofilename <<
"p_residuals_y_vs_x_subdet_" << subdetandlayer.first
730 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
731 resxvsyprofilename <<
"p_residuals_x_vs_y_subdet_" << subdetandlayer.first
732 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
733 resyvsyprofilename <<
"p_residuals_y_vs_y_subdet_" << subdetandlayer.first
734 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
735 resxvsxprofiletitle <<
"U Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
736 resyvsxprofiletitle <<
"V Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
737 resxvsyprofiletitle <<
"U Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
738 resyvsyprofiletitle <<
"V Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
749 if (
dqmMode_) moduleLevelHistsTransient =
false;
755 histoname.str().c_str(),histotitle.str().c_str(),
759 normhistoname.str().c_str(),normhistotitle.str().c_str(),
764 xprimehistoname.str().c_str(),xprimehistotitle.str().c_str(),
768 normxprimehistoname.str().c_str(),normxprimehistotitle.str().c_str(),
774 histStruct.
LocalX = this->
bookTH1F(moduleLevelHistsTransient, tfd,
775 localxname.str().c_str(),localxtitle.str().c_str(),
777 histStruct.
LocalY = this->
bookTH1F(moduleLevelHistsTransient, tfd,
778 localyname.str().c_str(),localytitle.str().c_str(),
781 resxvsxprofilename.str().c_str(),resxvsxprofiletitle.str().c_str(),
785 resxvsyprofilename.str().c_str(),resxvsyprofiletitle.str().c_str(),
793 yprimehistoname.str().c_str(),yprimehistotitle.str().c_str(),
798 yhistoname.str().c_str(), yhistotitle.str().c_str(),
803 normyprimehistoname.str().c_str(),normyprimehistotitle.str().c_str(),
810 resyvsxprofilename.str().c_str(),resyvsxprofiletitle.str().c_str(),
814 resyvsyprofilename.str().c_str(),resyvsyprofiletitle.str().c_str(),
824 int nBinsX,
double lowX,
double highX)
827 vDeleteObjects_.push_back(
new TH1F(histName, histTitle, nBinsX, lowX, highX));
831 return tfd.
make<TH1F>(histName, histTitle, nBinsX, lowX, highX);
835 int nBinsX,
double lowX,
double highX)
838 TProfile *
profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX);
843 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX);
848 int nBinsX,
double lowX,
double highX,
double lowY,
double highY)
851 TProfile *
profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
856 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
892 int& nBinsX,
double& lowerBoundX,
double& upperBoundX)
945 if(targetHist && sourceHist) {
946 targetHist->SetBinContent(bin, sourceHist->GetMean(1));
947 if(
useFwhm_) targetHist->SetBinError(bin,
Fwhm(sourceHist)/2.);
948 else targetHist->SetBinError(bin, sourceHist->GetRMS(1) );
1002 <<
"[TrackerOfflineValidation] Error, tried to get reference for non-tracker subdet " << subdetid
1003 <<
" from detector " << detid.
det();
1019 std::vector<TrackerValidationVariables::AVTrackStruct> vTrackstruct;
1022 for (std::vector<TrackerValidationVariables::AVTrackStruct>::const_iterator itT = vTrackstruct.begin();
1023 itT != vTrackstruct.end();
1033 vTrackHistos_[numOfValidHitsindex]->Fill(itT->numberOfValidHits);
1035 vTrackHistos_[numOfLostHitsindex]->Fill(itT->numberOfLostHits);
1039 if (itT->charge > 0)
1042 if (itT->charge < 0)
1052 if (itT->ptError != 0.) {
1054 vTrackHistos_[ptResolutionindex]->Fill(itT->ptError/itT->pt);
1070 vTrackProfiles_[chiProbabsd0index]->Fill(fabs(itT->d0),itT->chi2Prob);
1106 vTrack2DHistos_[chiProbabsd0index_2d]->Fill(fabs(itT->d0),itT->chi2Prob);
1123 for (std::vector<TrackerValidationVariables::AVHitStruct>::const_iterator itH = itT->hits.begin();
1124 itH != itT->hits.end();
1127 DetId detid(itH->rawDetId);
1132 histStruct.
ResHisto->Fill(itH->resX);
1133 if(itH->resErrX != 0) histStruct.
NormResHisto->Fill(itH->resX/itH->resErrX);
1139 if (itH->resXprime != -999.) {
1170 float tgalpha =
tan(itH->localAlpha);
1171 if ( fabs(tgalpha)!=0 ){
1172 histStruct.
LocalX->Fill(itH->localXnorm, tgalpha*tgalpha);
1173 histStruct.
LocalY->Fill(itH->localYnorm, tgalpha*tgalpha);
1185 histStruct.
ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1186 histStruct.
ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1193 if(itH->resXprimeErr != 0 && itH->resXprimeErr != -999 ) {
1198 if (itH->resYprime != -999.) {
1214 float tgbeta =
tan(itH->localBeta);
1215 if ( fabs(tgbeta)!=0 ){
1228 histStruct.
ResYvsXProfile->Fill(itH->localXnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1229 histStruct.
ResYvsYProfile->Fill(itH->localYnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1234 if (itH->resYprimeErr != 0 && itH->resYprimeErr != -999. ) {
1266 TTree *
tree = fs->
make<TTree>(
"TkOffVal",
"TkOffVal");
1272 tree->Branch(
"TkOffTreeVariables", &treeMemPtr);
1281 delete treeMemPtr; treeMemPtr =
nullptr;
1287 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles)
1290 if( this->
isDetOrDetUnit((alivec)[0]->alignableObjectId()) )
return;
1292 for(
int iComp=0, iCompEnd = ali.
components().size();iComp < iCompEnd; ++iComp) {
1293 std::vector< TrackerOfflineValidation::SummaryContainer > vProfiles;
1296 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
1298 dirname << structurename;
1301 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" << iComp+1;
1303 if( !(this->
isDetOrDetUnit( (alivec)[iComp]->alignableObjectId()) )
1308 TH1 *hX = vLevelProfiles[iComp].sumXResiduals_;
1309 TH1 *hNormX = vLevelProfiles[iComp].sumNormXResiduals_;
1310 TH1 *hY = vLevelProfiles[iComp].sumYResiduals_;
1311 TH1 *hNormY = vLevelProfiles[iComp].sumNormYResiduals_;
1312 TH1 *pXX = vLevelProfiles[iComp].sumResXvsXProfile_;
1313 TH1 *pXY = vLevelProfiles[iComp].sumResXvsYProfile_;
1314 TH1 *pYX = vLevelProfiles[iComp].sumResYvsXProfile_;
1315 TH1 *pYY = vLevelProfiles[iComp].sumResYvsYProfile_;
1316 for(
uint n = 0;
n < vProfiles.size(); ++
n) {
1321 if (hNormY)
sumHistStructure_.emplace_back(hNormY, vProfiles[n].sumNormYResiduals_);
1329 toFit_.push_back(vLevelProfiles[iComp].sumXResiduals_);
1330 toFit_.push_back(vLevelProfiles[iComp].sumNormXResiduals_);
1331 if (hY)
toFit_.push_back(hY);
1332 if (hNormY)
toFit_.push_back(hNormY);
1343 for (std::vector<std::pair<TH1*,TH1*> >::const_iterator it =
sumHistStructure_.begin();
1346 it->first->Add(it->second);
1348 for (std::vector<std::tuple<int,TH1*,TH1*> >::const_iterator it =
summaryBins_.begin();
1351 setSummaryBin(std::get<0>(*it), std::get<1>(*it), std::get<2>(*it));
1353 for (std::vector<TH1*>::const_iterator it =
toFit_.begin();
1367 const char *aliTypeName =
alignableTracker_->objectIdProvider().idToString(alitype);
1368 const char *aliSubtypeName =
alignableTracker_->objectIdProvider().idToString(subtype);
1371 const DetId aliDetId = ali.
id();
1381 const uint subcompSize = ali.
components()[0]->components().size();
1383 const TString
title(Form(
"Summary for substructures in %s %d;%s;",aliTypeName,i,aliSubtypeName));
1385 sumContainer.summaryXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d",aliTypeName,i),
1386 title +
"#LT #Delta x' #GT",
1387 aliSize, 0.5, aliSize+0.5);
1388 sumContainer.summaryNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d",aliTypeName,i),
1389 title +
"#LT #Delta x'/#sigma #GT",
1390 aliSize,0.5,aliSize+0.5);
1393 sumContainer.summaryYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d",aliTypeName,i),
1394 title +
"#LT #Delta y' #GT",
1395 aliSize, 0.5, aliSize+0.5);
1396 sumContainer.summaryNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d",aliTypeName,i),
1397 title +
"#LT #Delta y'/#sigma #GT",
1398 aliSize,0.5,aliSize+0.5);
1402 if (subcompSize != 2) {
1405 <<
"Det with " << subcompSize <<
" components";
1408 const TString
title(Form(
"Summary for substructures in %s %d;%s;", aliTypeName, i,
1411 sumContainer.summaryXResiduals_
1412 = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d", aliTypeName, i),
1413 title +
"#LT #Delta x' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1414 sumContainer.summaryNormXResiduals_
1415 = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d", aliTypeName, i),
1416 title +
"#LT #Delta x'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1419 sumContainer.summaryYResiduals_
1420 = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d", aliTypeName, i),
1421 title +
"#LT #Delta y' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1422 sumContainer.summaryNormYResiduals_
1423 = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d", aliTypeName, i),
1424 title +
"#LT #Delta y'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1428 edm::LogError(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookSummaryHists" 1429 <<
"No summary histogram for hierarchy level " 1430 << aliTypeName <<
" in subdet " << aliDetId.
subdetId();
1438 const TString sumTitle(Form(
"Residual for %s %d in %s;", aliTypeName, i, typeName));
1442 sumContainer.sumXResiduals_ = tfd.
make<TH1F>(Form(
"h_Xprime_%s_%d", aliTypeName, i),
1447 sumContainer.sumNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_NormXprime_%s_%d",aliTypeName,i),
1453 sumContainer.sumResXvsXProfile_ = tfd.
make<TProfile>(Form(
"p_resXX_%s_%d",aliTypeName,i),
1457 sumContainer.sumResXvsXProfile_->Sumw2();
1458 sumContainer.sumResXvsYProfile_ = tfd.
make<TProfile>(Form(
"p_resXY_%s_%d",aliTypeName,i),
1462 sumContainer.sumResXvsYProfile_->Sumw2();
1467 sumContainer.sumYResiduals_ = tfd.
make<TH1F>(Form(
"h_Yprime_%s_%d",aliTypeName,i),
1472 sumContainer.sumNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_NormYprime_%s_%d",aliTypeName,i),
1478 sumContainer.sumResYvsXProfile_ = tfd.
make<TProfile>(Form(
"p_resYX_%s_%d",aliTypeName,i),
1482 sumContainer.sumResYvsXProfile_->Sumw2();
1483 sumContainer.sumResYvsYProfile_ = tfd.
make<TProfile>(Form(
"p_resYY_%s_%d",aliTypeName,i),
1487 sumContainer.sumResYvsYProfile_->Sumw2();
1495 for(
uint k = 0;
k < aliSize; ++
k) {
1516 for(
uint k = 0;
k < aliSize; ++
k) {
1517 for(
uint j = 0; j < subcompSize; ++j) {
1538 return sumContainer;
1545 float max = hist->GetMaximum();
1546 int left = -1, right = -1;
1547 for(
unsigned int i = 1, iEnd = hist->GetNbinsX();
i <= iEnd; ++
i) {
1548 if(hist->GetBinContent(
i) < max/2. && hist->GetBinContent(
i+1) > max/2. && left == -1) {
1549 if(max/2. - hist->GetBinContent(
i) < hist->GetBinContent(
i+1) - max/2.) {
1557 if(left != -1 && right == -1) {
1558 if(hist->GetBinContent(
i) > max/2. && hist->GetBinContent(
i+1) < max/2.) {
1559 if( hist->GetBinContent(
i) - max/2. < max/2. - hist->GetBinContent(
i+1)) {
1568 return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1577 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1578 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1582 DetId detId_ = it->first;
1588 unsigned int whichHalfBarrel(1), rawId(detId_.
rawId());
1589 if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) ||
1590 (rawId>=302189572 && rawId<302194980) ) whichHalfBarrel=2;
1592 treeMem.
half = whichHalfBarrel;
1596 unsigned int whichHalfCylinder(1), rawId(detId_.
rawId());
1597 if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) ||
1598 (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) ) whichHalfCylinder=2;
1601 treeMem.
half = whichHalfCylinder;
1606 unsigned int whichHalfShell(1), rawId(detId_.
rawId());
1607 if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) ||
1608 (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1609 (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) ||
1610 (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1611 (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) ||
1612 (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1613 (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) ||
1614 (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1617 treeMem.
half = whichHalfShell;
1654 treeMem.
posX = gPModule.
x();
1655 treeMem.
posY = gPModule.
y();
1656 treeMem.
posZ = gPModule.
z();
1661 LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1663 gVDirection = surface.
toGlobal(lVDirection),
1664 gWDirection = surface.
toGlobal(lWDirection);
1665 double dR(999.),
dPhi(999.), dZ(999.);
1667 dR = gWDirection.perp() - gPModule.
perp();
1669 dZ = gVDirection.z() - gPModule.
z();
1674 dZ = gWDirection.z() - gPModule.
z();
1677 dR = gVDirection.perp() - gPModule.
perp();
1679 dZ = gWDirection.z() - gPModule.
z();
1690 const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_)
1692 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1693 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1697 treeMem.
entries =
static_cast<UInt_t
>(it->second.ResXprimeHisto->GetEntries());
1698 treeMem.
meanX = it->second.ResXprimeHisto->GetMean();
1699 treeMem.
rmsX = it->second.ResXprimeHisto->GetRMS();
1705 std::pair<float,float> fitResult1 = this->
fitResiduals(it->second.ResXprimeHisto);
1706 treeMem.
fitMeanX = fitResult1.first;
1709 std::pair<float,float> fitResult2 = this->
fitResiduals(it->second.NormResXprimeHisto);
1717 int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1719 treeMem.
numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1720 treeMem.
numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1723 treeMem.
meanNormX = it->second.NormResXprimeHisto->GetMean();
1724 treeMem.
rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1727 it->second.NormResXprimeHisto->GetStats(stats);
1729 if (stats[0]) treeMem.
chi2PerDofX = stats[3]/stats[0];
1732 treeMem.
histNameX = it->second.ResXprimeHisto->GetName();
1733 treeMem.
histNameNormX = it->second.NormResXprimeHisto->GetName();
1737 treeMem.
meanLocalX = it->second.ResHisto->GetMean();
1738 treeMem.
rmsLocalX = it->second.ResHisto->GetRMS();
1744 if (it->second.ResYHisto) treeMem.
histNameLocalY = it->second.ResYHisto->GetName();
1749 if (it->second.ResYprimeHisto) {
1750 TH1 *
h = it->second.ResYprimeHisto;
1751 treeMem.
meanY = h->GetMean();
1752 treeMem.
rmsY = h->GetRMS();
1755 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1756 treeMem.
fitMeanY = fitMeanSigma.first;
1757 treeMem.
fitSigmaY = fitMeanSigma.second;
1765 if (it->second.NormResYprimeHisto) {
1766 TH1 *
h = it->second.NormResYprimeHisto;
1770 if (stats[0]) treeMem.
chi2PerDofY = stats[3]/stats[0];
1773 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1781 if (it->second.ResXvsXProfile) {
1782 TH1 *
h = it->second.ResXvsXProfile;
1787 if (it->second.ResXvsYProfile) {
1788 TH1 *
h = it->second.ResXvsYProfile;
1793 if (it->second.ResYvsXProfile) {
1794 TH1 *
h = it->second.ResYvsXProfile;
1799 if (it->second.ResYvsYProfile) {
1800 TH1 *
h = it->second.ResYvsYProfile;
1812 std::pair<float,float>
1815 std::pair<float,float> fitResult(9999., 9999.);
1816 if (!hist || hist->GetEntries() < 20)
return fitResult;
1818 float mean = hist->GetMean();
1819 float sigma = hist->GetRMS();
1824 TF1
func(
"tmp",
"gaus", mean - 2.*sigma, mean + 2.*sigma);
1825 if (0 == hist->Fit(&func,
"QNR")) {
1826 mean = func.GetParameter(1);
1827 sigma = func.GetParameter(2);
1829 func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1832 if (0 == hist->Fit(&func,
"Q0LR")) {
1833 if (hist->GetFunction(func.GetName())) {
1834 hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1836 fitResult.first = func.GetParameter(1);
1837 fitResult.second = func.GetParameter(2);
1841 edm::LogWarning(
"Alignment") <<
"@SUB=TrackerOfflineValidation::fitResiduals" 1842 <<
"Caught this exception during ROOT fit: " 1853 int nbins = histo->GetNbinsX();
1856 double *
x =
new double[
nbins];
1857 double *
y =
new double[
nbins];
1858 for (
int j = 0; j <
nbins; j++) {
1859 x[j] = histo->GetBinCenter(j+1);
1860 y[j] = histo->GetBinContent(j+1);
1862 median = TMath::Median(nbins, x, y);
1864 delete[]
x; x =
nullptr;
1865 delete []
y; y =
nullptr;
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_
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
const unsigned long long maxTracks_
TH1 * make(const char *name, const char *title, int nBinX, double minBinX, double maxBinX)
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
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
constexpr uint32_t rawId() const
get the raw id
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
virtual const Alignables & components() const =0
Return vector of all direct components.
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_
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
unsigned long long nTracks_
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
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)
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
~TrackerOfflineValidation() 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_
std::string histNameNormY
uint32_t tibStereo(const DetId &id) const
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
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
constexpr Detector det() const
get the detector field from this detid
bool isBarrel(uint32_t subDetId)