138 if (newDir.length()!=0){
146 if (newDir.length()==0)
tfd.reset(&(*upDir.
tfd));
161 if (newDir.length()==0){
170 if (newDir.length()!=0){
179 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX);
180 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double *xBins);
181 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
int nBinY,
double minBinY,
double maxBinY);
182 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
double minBinY,
double maxBinY);
184 std::auto_ptr<TFileDirectory>
tfd;
195 virtual void endJob()
override;
204 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles);
206 void fillTree(TTree&
tree,
const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
221 int nBinsX,
double lowX,
double highX);
224 int nBinsX,
double lowX,
double highX);
227 int nBinsX,
double lowX,
double highX,
double lowY,
double highY);
230 int& nBinsX,
double& lowerBoundX,
double& upperBoundX);
245 template <
class OBJECT_TYPE>
int GetIndex(
const std::vector<OBJECT_TYPE*>& vec,
const TString&
name);
291 template <
class OBJECT_TYPE>
295 for (
typename std::vector<OBJECT_TYPE*>::const_iterator
iter = vec.begin(), iterEnd = vec.end();
297 if (*
iter && (*iter)->GetName() ==
name)
return result;
299 edm::LogError(
"Alignment") <<
"@SUB=TrackerOfflineValidation::GetIndex" <<
" could not find " <<
name;
304 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH1F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
305 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book1D(
name,
title,nBinX,minBinX,maxBinX)->getTH1();}
306 else{
return tfd->make<TH1F>(
name,
title,nBinX,minBinX,maxBinX);}
309 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double *xBins){
311 theDbe->setCurrentFolder(directoryString);
313 TProfile *tmpProfile=
new TProfile(
name,
title,nBinX,xBins);
314 tmpProfile->SetDirectory(0);
315 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
317 else{
return tfd->make<TProfile>(
name,
title,nBinX,xBins);}
320 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
322 theDbe->setCurrentFolder(directoryString);
324 TProfile *tmpProfile=
new TProfile(
name,
title,nBinX,minBinX,maxBinX);
325 tmpProfile->SetDirectory(0);
326 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
328 else{
return tfd->make<TProfile>(
name,
title,nBinX,minBinX,maxBinX);}
331 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name ,
const char*
title,
int nbinX,
double minX ,
double maxX,
double minY,
double maxY){
333 theDbe->setCurrentFolder(directoryString);
335 return (theDbe->bookProfile(
name,
title,nbinX,minX,maxX,dummy,minY,maxY)->getTH1());
338 return tfd->make<TProfile>(
name,
title,nbinX,minX,maxX,minY,maxY);
342 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH2F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
int nBinY,
double minBinY,
double maxBinY){
343 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book2D(
name,
title,nBinX,minBinX,maxBinX,nBinY,minBinY,maxBinY)->getTH1();}
344 else{
return tfd->make<TH2F>(
name,
title,nBinX,minBinX,maxBinX,nBinY,minBinY,maxBinY);}
352 : parSet_(iConfig), bareTkGeomPtr_(0), lCoorHistOn_(parSet_.getParameter<bool>(
"localCoorHistosOn")),
353 moduleLevelHistsTransient_(parSet_.getParameter<bool>(
"moduleLevelHistsTransient")),
354 moduleLevelProfiles_(parSet_.getParameter<bool>(
"moduleLevelProfiles")),
355 stripYResiduals_(parSet_.getParameter<bool>(
"stripYResiduals")),
356 useFwhm_(parSet_.getParameter<bool>(
"useFwhm")),
357 useFit_(parSet_.getParameter<bool>(
"useFit")),
358 useOverflowForRMS_(parSet_.getParameter<bool>(
"useOverflowForRMS")),
359 dqmMode_(parSet_.getParameter<bool>(
"useInDqmMode")),
360 moduleDirectory_(parSet_.getParameter<std::
string>(
"moduleDirectoryInOutput")),
399 edm::LogInfo(
"TrackerOfflineValidation") <<
"There are " << newBareTkGeomPtr->
detIds().size()
400 <<
" dets in the Geometry record.\n"
401 <<
"Out of these "<<newBareTkGeomPtr->
detUnitIds().size()
415 <<
"TrackerGeometry changed, but will not re-book hists!";
426 "Track #eta;#eta_{Track};Number of Tracks",
429 "Track #phi;#phi_{Track};Number of Tracks",
432 "Track # of valid hits;# of valid hits _{Track};Number of Tracks",
435 "Track # of lost hits;# of lost hits _{Track};Number of Tracks",
438 "Curvature #kappa;#kappa_{Track};Number of Tracks",
441 "Curvature |#kappa| Positive Tracks;|#kappa_{pos Track}|;Number of Tracks",
444 "Curvature |#kappa| Negative Tracks;|#kappa_{neg Track}|;Number of Tracks",
447 "Curvature |#kappa| Tracks Difference;|#kappa_{Track}|;# Pos Tracks - # Neg Tracks",
450 "#chi^{2};#chi^{2}_{Track};Number of Tracks",
453 "#chi^{2} probability;#chi^{2}prob_{Track};Number of Tracks",
456 "#chi^{2}/ndof;#chi^{2}/ndof;Number of Tracks",
459 "p_{T}^{track};p_{T}^{track} [GeV];Number of Tracks",
462 "#delta_{p_{T}}/p_{T}^{track};#delta_{p_{T}}/p_{T}^{track};Number of Tracks",
465 "Transverse Impact Parameter vs. #phi;#phi_{Track};#LT d_{0} #GT [cm]",
468 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};#LT d_{z} #GT [cm]",
471 "Transverse Impact Parameter vs. #eta;#eta_{Track};#LT d_{0} #GT [cm]",
474 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};#LT d_{z} #GT [cm]",
477 "#chi^{2} vs. #phi;#phi_{Track};#LT #chi^{2} #GT",
480 "#chi^{2} probablility vs. #phi;#phi_{Track};#LT #chi^{2} probability#GT",
483 "#chi^{2} probablility vs. |d_{0}|;|d_{0}|[cm];#LT #chi^{2} probability#GT",
486 "#chi^{2}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT",
489 "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT",
492 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.};
494 "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT",
498 "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT",
501 "#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",
504 "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT",
507 "#kappa vs. #phi;#phi_{Track};#kappa",
510 "#kappa vs. #eta;#eta_{Track};#kappa",
513 "#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",
516 "#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",
520 "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]",
521 100, -3.15, 3.15, 100,-1.,1.) );
523 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",
524 100, -3.15, 3.15, 100,-100.,100.));
526 "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]",
527 100, -3.15, 3.15, 100,-1.,1.));
529 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]",
530 100, -3.15, 3.15, 100,-100.,100.));
532 "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}",
533 100, -3.15, 3.15, 500, 0., 500.));
535 "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability",
536 100, -3.15, 3.15, 100, 0., 1.));
538 "#chi^{2} probability vs. |d_{0}|;|d_{0}| [cm];#chi^{2} probability",
539 100, 0, 80, 100, 0., 1.));
541 "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof",
542 100, -3.15, 3.15, 100, 0., 10.));
544 "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}",
545 100, -3.15, 3.15, 500, 0., 500.));
547 "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability",
548 100, -3.15, 3.15, 100, 0., 1.));
550 "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof",
551 100,-3.15,3.15, 100, 0., 10.));
553 "#kappa vs. #phi;#phi_{Track};#kappa",
554 100,-3.15,3.15, 100, .0,.05));
556 "#kappa vs. #eta;#eta_{Track};#kappa",
557 100,-3.15,3.15, 100, .0,.05));
559 "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa",
560 100,0.,10, 100,-.03,.03));
564 "res_{x'} vs momentum in BPix;p [GeV]; res_{x'}",
565 15,0.,15., 200, -0.1,0.1));
567 "res_{x'} vs momentum in FPix;p [GeV]; res_{x'}",
568 15,0.,15., 200, -0.1,0.1));
570 "res_{x'} vs momentum in TIB;p [GeV]; res_{x'}",
571 15,0.,15., 200, -0.1,0.1));
573 "res_{x'} vs momentum in TID;p [GeV]; res_{x'}",
574 15,0.,15., 200, -0.1,0.1));
576 "res_{x'} vs momentum in TOB;p [GeV]; res_{x'}",
577 15,0.,15., 200, -0.1,0.1));
579 "res_{x'} vs momentum in TEC;p [GeV]; res_{x'}",
580 15,0.,15., 200, -0.1,0.1));
584 "res_{y'} vs momentum in BPix;p [GeV]; res_{y'}",
585 15,0.,15., 200, -0.1,0.1));
587 "res_{y'} vs momentum in FPix;p [GeV]; res_{y'}",
588 15,0.,15., 200, -0.1,0.1));
596 std::vector<Alignable*> alivec(ali.
components());
599 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
600 std::stringstream dirname;
601 dirname << structurename;
603 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" <<
i+1;
605 if (structurename.find(
"Endcap",0) != std::string::npos ) {
609 }
else if( !(this->
isDetOrDetUnit( (alivec)[i]->alignableObjectId()) )
639 std::stringstream histoname, histotitle, normhistoname, normhistotitle,
640 yhistoname, yhistotitle,
641 xprimehistoname, xprimehistotitle, normxprimehistoname, normxprimehistotitle,
642 yprimehistoname, yprimehistotitle, normyprimehistoname, normyprimehistotitle,
643 localxname, localxtitle, localyname, localytitle,
644 resxvsxprofilename, resxvsxprofiletitle, resyvsxprofilename, resyvsxprofiletitle,
645 resxvsyprofilename, resxvsyprofiletitle, resyvsyprofilename, resyvsyprofiletitle;
649 if( this->
isEndCap(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_wheel_";
650 else if ( this->
isBarrel(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_layer_";
651 else edm::LogWarning(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookHists"
652 <<
"Unknown subdetid: " << subdetandlayer.first;
654 histoname <<
"h_residuals_subdet_" << subdetandlayer.first
655 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
656 yhistoname <<
"h_y_residuals_subdet_" << subdetandlayer.first
657 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
658 xprimehistoname <<
"h_xprime_residuals_subdet_" << subdetandlayer.first
659 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
660 yprimehistoname <<
"h_yprime_residuals_subdet_" << subdetandlayer.first
661 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
662 normhistoname <<
"h_normresiduals_subdet_" << subdetandlayer.first
663 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
664 normxprimehistoname <<
"h_normxprimeresiduals_subdet_" << subdetandlayer.first
665 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
666 normyprimehistoname <<
"h_normyprimeresiduals_subdet_" << subdetandlayer.first
667 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
668 histotitle <<
"X Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit} [cm]";
669 yhistotitle <<
"Y Residual for module " <<
id.rawId() <<
";y_{tr} - y_{hit} [cm]";
670 normhistotitle <<
"Normalized Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit}/#sigma";
671 xprimehistotitle <<
"X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})' [cm]";
672 normxprimehistotitle <<
"Normalized X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})'/#sigma";
673 yprimehistotitle <<
"Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})' [cm]";
674 normyprimehistotitle <<
"Normalized Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})'/#sigma";
677 localxname <<
"h_localx_subdet_" << subdetandlayer.first
678 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
679 localyname <<
"h_localy_subdet_" << subdetandlayer.first
680 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
681 localxtitle <<
"u local for module " <<
id.rawId() <<
"; u_{tr,r}";
682 localytitle <<
"v local for module " <<
id.rawId() <<
"; v_{tr,r}";
684 resxvsxprofilename <<
"p_residuals_x_vs_x_subdet_" << subdetandlayer.first
685 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
686 resyvsxprofilename <<
"p_residuals_y_vs_x_subdet_" << subdetandlayer.first
687 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
688 resxvsyprofilename <<
"p_residuals_x_vs_y_subdet_" << subdetandlayer.first
689 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
690 resyvsyprofilename <<
"p_residuals_y_vs_y_subdet_" << subdetandlayer.first
691 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
692 resxvsxprofiletitle <<
"U Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
693 resyvsxprofiletitle <<
"V Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
694 resxvsyprofiletitle <<
"U Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
695 resyvsyprofiletitle <<
"V Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
706 if (
dqmMode_) moduleLevelHistsTransient =
false;
712 histoname.str().c_str(),histotitle.str().c_str(),
716 normhistoname.str().c_str(),normhistotitle.str().c_str(),
721 xprimehistoname.str().c_str(),xprimehistotitle.str().c_str(),
725 normxprimehistoname.str().c_str(),normxprimehistotitle.str().c_str(),
731 histStruct.
LocalX = this->
bookTH1F(moduleLevelHistsTransient, tfd,
732 localxname.str().c_str(),localxtitle.str().c_str(),
734 histStruct.
LocalY = this->
bookTH1F(moduleLevelHistsTransient, tfd,
735 localyname.str().c_str(),localytitle.str().c_str(),
738 resxvsxprofilename.str().c_str(),resxvsxprofiletitle.str().c_str(),
742 resxvsyprofilename.str().c_str(),resxvsyprofiletitle.str().c_str(),
750 yprimehistoname.str().c_str(),yprimehistotitle.str().c_str(),
755 yhistoname.str().c_str(), yhistotitle.str().c_str(),
760 normyprimehistoname.str().c_str(),normyprimehistotitle.str().c_str(),
767 resyvsxprofilename.str().c_str(),resyvsxprofiletitle.str().c_str(),
771 resyvsyprofilename.str().c_str(),resyvsyprofiletitle.str().c_str(),
781 int nBinsX,
double lowX,
double highX)
784 vDeleteObjects_.push_back(
new TH1F(histName, histTitle, nBinsX, lowX, highX));
788 return tfd.
make<TH1F>(histName, histTitle, nBinsX, lowX, highX);
792 int nBinsX,
double lowX,
double highX)
795 TProfile * profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX);
800 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX);
805 int nBinsX,
double lowX,
double highX,
double lowY,
double highY)
808 TProfile * profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
813 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
849 int& nBinsX,
double& lowerBoundX,
double& upperBoundX)
902 if(targetHist && sourceHist) {
903 targetHist->SetBinContent(bin, sourceHist->GetMean(1));
904 if(
useFwhm_) targetHist->SetBinError(bin,
Fwhm(sourceHist)/2.);
905 else targetHist->SetBinError(bin, sourceHist->GetRMS(1) );
959 <<
"[TrackerOfflineValidation] Error, tried to get reference for non-tracker subdet " << subdetid
960 <<
" from detector " << detid.
det();
975 std::vector<TrackerValidationVariables::AVTrackStruct> vTrackstruct;
978 for (std::vector<TrackerValidationVariables::AVTrackStruct>::const_iterator itT = vTrackstruct.begin();
979 itT != vTrackstruct.end();
988 vTrackHistos_[numOfValidHitsindex]->Fill(itT->numberOfValidHits);
990 vTrackHistos_[numOfLostHitsindex]->Fill(itT->numberOfLostHits);
1007 if (itT->ptError != 0.) {
1009 vTrackHistos_[ptResolutionindex]->Fill(itT->ptError/itT->pt);
1025 vTrackProfiles_[chiProbabsd0index]->Fill(fabs(itT->d0),itT->chi2Prob);
1061 vTrack2DHistos_[chiProbabsd0index_2d]->Fill(fabs(itT->d0),itT->chi2Prob);
1078 for (std::vector<TrackerValidationVariables::AVHitStruct>::const_iterator itH = itT->hits.begin();
1079 itH != itT->hits.end();
1087 histStruct.
ResHisto->Fill(itH->resX);
1088 if(itH->resErrX != 0) histStruct.
NormResHisto->Fill(itH->resX/itH->resErrX);
1094 if (itH->resXprime != -999.) {
1125 float tgalpha =
tan(itH->localAlpha);
1126 if ( fabs(tgalpha)!=0 ){
1127 histStruct.
LocalX->Fill(itH->localXnorm, tgalpha*tgalpha);
1128 histStruct.
LocalY->Fill(itH->localYnorm, tgalpha*tgalpha);
1140 histStruct.
ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1141 histStruct.
ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1148 if(itH->resXprimeErr != 0 && itH->resXprimeErr != -999 ) {
1153 if (itH->resYprime != -999.) {
1169 float tgbeta =
tan(itH->localBeta);
1170 if ( fabs(tgbeta)!=0 ){
1183 histStruct.
ResYvsXProfile->Fill(itH->localXnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1184 histStruct.
ResYvsYProfile->Fill(itH->localYnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1189 if (itH->resYprimeErr != 0 && itH->resYprimeErr != -999. ) {
1222 std::vector<TrackerOfflineValidation::SummaryContainer> vTrackerprofiles;
1231 TTree *
tree = fs->
make<TTree>(
"TkOffVal",
"TkOffVal");
1237 tree->Branch(
"TkOffTreeVariables", &treeMemPtr);
1246 delete treeMemPtr; treeMemPtr = 0;
1252 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles)
1254 std::vector<Alignable*> alivec(ali.
components());
1255 if( this->
isDetOrDetUnit((alivec)[0]->alignableObjectId()) )
return;
1257 for(
int iComp=0, iCompEnd = ali.
components().size();iComp < iCompEnd; ++iComp) {
1258 std::vector< TrackerOfflineValidation::SummaryContainer > vProfiles;
1261 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
1262 std::stringstream dirname;
1263 dirname << structurename;
1266 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" << iComp+1;
1268 if( !(this->
isDetOrDetUnit( (alivec)[iComp]->alignableObjectId()) )
1273 TH1 *hY = vLevelProfiles[iComp].sumYResiduals_;
1274 TH1 *hNormY = vLevelProfiles[iComp].sumNormYResiduals_;
1275 for(uint
n = 0;
n < vProfiles.size(); ++
n) {
1277 vLevelProfiles[iComp].sumXResiduals_->Add(vProfiles[n].sumXResiduals_);
1278 vLevelProfiles[iComp].sumNormXResiduals_->Add(vProfiles[n].sumNormXResiduals_);
1279 if (hY) hY->Add(vProfiles[n].sumYResiduals_);
1280 if (hNormY) hNormY->Add(vProfiles[n].sumNormYResiduals_);
1284 this->
fitResiduals(vLevelProfiles[iComp].sumXResiduals_);
1285 this->
fitResiduals(vLevelProfiles[iComp].sumNormXResiduals_);
1300 const uint aliSize = ali.
components().size();
1307 const DetId aliDetId = ali.
id();
1317 const uint subcompSize = ali.
components()[0]->components().size();
1319 const TString
title(Form(
"Summary for substructures in %s %d;%s;",aliTypeName,i,aliSubtypeName));
1321 sumContainer.summaryXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d",aliTypeName,i),
1322 title +
"#LT #Delta x' #GT",
1323 aliSize, 0.5, aliSize+0.5);
1324 sumContainer.summaryNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d",aliTypeName,i),
1325 title +
"#LT #Delta x'/#sigma #GT",
1326 aliSize,0.5,aliSize+0.5);
1329 sumContainer.summaryYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d",aliTypeName,i),
1330 title +
"#LT #Delta y' #GT",
1331 aliSize, 0.5, aliSize+0.5);
1332 sumContainer.summaryNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d",aliTypeName,i),
1333 title +
"#LT #Delta y'/#sigma #GT",
1334 aliSize,0.5,aliSize+0.5);
1338 if (subcompSize != 2) {
1341 <<
"Det with " << subcompSize <<
" components";
1344 const TString
title(Form(
"Summary for substructures in %s %d;%s;", aliTypeName, i,
1347 sumContainer.summaryXResiduals_
1348 = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d", aliTypeName, i),
1349 title +
"#LT #Delta x' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1350 sumContainer.summaryNormXResiduals_
1351 = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d", aliTypeName, i),
1352 title +
"#LT #Delta x'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1355 sumContainer.summaryYResiduals_
1356 = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d", aliTypeName, i),
1357 title +
"#LT #Delta y' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1358 sumContainer.summaryNormYResiduals_
1359 = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d", aliTypeName, i),
1360 title +
"#LT #Delta y'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1364 edm::LogError(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookSummaryHists"
1365 <<
"No summary histogramm for hierarchy level "
1366 << aliTypeName <<
" in subdet " << aliDetId.
subdetId();
1374 const TString sumTitle(Form(
"Residual for %s %d in %s;", aliTypeName, i, typeName));
1378 sumContainer.sumXResiduals_ = tfd.
make<TH1F>(Form(
"h_Xprime_%s_%d", aliTypeName, i),
1383 sumContainer.sumNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_NormXprime_%s_%d",aliTypeName,i),
1388 sumContainer.sumYResiduals_ = tfd.
make<TH1F>(Form(
"h_Yprime_%s_%d",aliTypeName,i),
1393 sumContainer.sumNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_NormYprime_%s_%d",aliTypeName,i),
1402 for(uint
k = 0;
k < aliSize; ++
k) {
1415 for(uint
k = 0;
k < aliSize; ++
k) {
1416 for(uint
j = 0;
j < subcompSize; ++
j) {
1429 return sumContainer;
1436 float max = hist->GetMaximum();
1437 int left = -1, right = -1;
1438 for(
unsigned int i = 1, iEnd = hist->GetNbinsX();
i <= iEnd; ++
i) {
1439 if(hist->GetBinContent(
i) < max/2. && hist->GetBinContent(
i+1) > max/2. && left == -1) {
1440 if(max/2. - hist->GetBinContent(
i) < hist->GetBinContent(
i+1) - max/2.) {
1448 if(left != -1 && right == -1) {
1449 if(hist->GetBinContent(
i) > max/2. && hist->GetBinContent(
i+1) < max/2.) {
1450 if( hist->GetBinContent(
i) - max/2. < max/2. - hist->GetBinContent(
i+1)) {
1459 return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1465 const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
1469 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1470 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1474 DetId detId_ = it->first;
1480 unsigned int whichHalfBarrel(1), rawId(detId_.
rawId());
1481 if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) ||
1482 (rawId>=302189572 && rawId<302194980) ) whichHalfBarrel=2;
1484 treeMem.
half = whichHalfBarrel;
1488 unsigned int whichHalfCylinder(1), rawId(detId_.
rawId());
1489 if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) ||
1490 (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) ) whichHalfCylinder=2;
1493 treeMem.
half = whichHalfCylinder;
1498 unsigned int whichHalfShell(1), rawId(detId_.
rawId());
1499 if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) ||
1500 (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1501 (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) ||
1502 (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1503 (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) ||
1504 (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1505 (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) ||
1506 (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1509 treeMem.
half = whichHalfShell;
1546 treeMem.
posX = gPModule.
x();
1547 treeMem.
posY = gPModule.
y();
1548 treeMem.
posZ = gPModule.
z();
1553 LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1555 gVDirection = surface.
toGlobal(lVDirection),
1556 gWDirection = surface.
toGlobal(lWDirection);
1557 double dR(999.),
dPhi(999.), dZ(999.);
1559 dR = gWDirection.perp() - gPModule.
perp();
1561 dZ = gVDirection.z() - gPModule.
z();
1566 dZ = gWDirection.z() - gPModule.
z();
1569 dR = gVDirection.perp() - gPModule.
perp();
1571 dZ = gWDirection.z() - gPModule.
z();
1579 treeMem.
entries =
static_cast<UInt_t
>(it->second.ResXprimeHisto->GetEntries());
1580 treeMem.
meanX = it->second.ResXprimeHisto->GetMean();
1581 treeMem.
rmsX = it->second.ResXprimeHisto->GetRMS();
1587 std::pair<float,float> fitResult1 = this->
fitResiduals(it->second.ResXprimeHisto);
1588 treeMem.
fitMeanX = fitResult1.first;
1591 std::pair<float,float> fitResult2 = this->
fitResiduals(it->second.NormResXprimeHisto);
1599 int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1601 treeMem.
numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1602 treeMem.
numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1605 treeMem.
meanNormX = it->second.NormResXprimeHisto->GetMean();
1606 treeMem.
rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1609 it->second.NormResXprimeHisto->GetStats(stats);
1611 if (stats[0]) treeMem.
chi2PerDofX = stats[3]/stats[0];
1614 treeMem.
histNameX = it->second.ResXprimeHisto->GetName();
1615 treeMem.
histNameNormX = it->second.NormResXprimeHisto->GetName();
1619 treeMem.
meanLocalX = it->second.ResHisto->GetMean();
1620 treeMem.
rmsLocalX = it->second.ResHisto->GetRMS();
1626 if (it->second.ResYHisto) treeMem.
histNameLocalY = it->second.ResYHisto->GetName();
1631 if (it->second.ResYprimeHisto) {
1632 TH1 *
h = it->second.ResYprimeHisto;
1633 treeMem.
meanY = h->GetMean();
1634 treeMem.
rmsY = h->GetRMS();
1637 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1638 treeMem.
fitMeanY = fitMeanSigma.first;
1639 treeMem.
fitSigmaY = fitMeanSigma.second;
1647 if (it->second.NormResYprimeHisto) {
1648 TH1 *
h = it->second.NormResYprimeHisto;
1652 if (stats[0]) treeMem.
chi2PerDofY = stats[3]/stats[0];
1655 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1663 if (it->second.ResXvsXProfile) {
1664 TH1 *
h = it->second.ResXvsXProfile;
1669 if (it->second.ResXvsYProfile) {
1670 TH1 *
h = it->second.ResXvsYProfile;
1675 if (it->second.ResYvsXProfile) {
1676 TH1 *
h = it->second.ResYvsXProfile;
1681 if (it->second.ResYvsYProfile) {
1682 TH1 *
h = it->second.ResYvsYProfile;
1694 std::pair<float,float>
1697 std::pair<float,float> fitResult(9999., 9999.);
1698 if (!hist || hist->GetEntries() < 20)
return fitResult;
1700 float mean = hist->GetMean();
1701 float sigma = hist->GetRMS();
1706 TF1 func(
"tmp",
"gaus", mean - 2.*sigma, mean + 2.*sigma);
1707 if (0 == hist->Fit(&func,
"QNR")) {
1708 mean = func.GetParameter(1);
1709 sigma = func.GetParameter(2);
1711 func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1714 if (0 == hist->Fit(&func,
"Q0LR")) {
1715 if (hist->GetFunction(func.GetName())) {
1716 hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1718 fitResult.first = func.GetParameter(1);
1719 fitResult.second = func.GetParameter(2);
1723 edm::LogWarning(
"Alignment") <<
"@SUB=TrackerOfflineValidation::fitResiduals"
1724 <<
"Caught this exception during ROOT fit: "
1735 int nbins = histo->GetNbinsX();
1738 double *
x =
new double[
nbins];
1739 double *
y =
new double[
nbins];
1741 x[
j] = histo->GetBinCenter(
j+1);
1742 y[
j] = histo->GetBinContent(
j+1);
1744 median = TMath::Median(nbins, x, y);
const TrackerGeometry * bareTkGeomPtr_
virtual char const * what() const
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
void collateSummaryHists(DirectoryWrapper &tfd, const Alignable &ali, int i, std::vector< TrackerOfflineValidation::SummaryContainer > &vLevelProfiles)
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::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
std::string profileNameResXvsX
unsigned int tecRing(const DetId &id) const
ring id
const bool stripYResiduals_
const bool useOverflowForRMS_
uint32_t tobStereo(const DetId &id) const
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)
unsigned int tidWheel(const DetId &id) const
unsigned int pxbModule(const DetId &id) const
T * make(const Args &...args) const
make new ROOT object
void fillTree(TTree &tree, const std::map< int, TrackerOfflineValidation::ModuleHistos > &moduleHist_, TkOffTreeVariables &treeMem, const TrackerGeometry &tkgeom, const TrackerTopology *tTopo)
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
virtual Alignables components() const =0
Return vector of all direct components.
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.
TProfile * ResXvsYProfile
TH1 * summaryNormYResiduals_
std::string profileNameResYvsX
std::map< int, TrackerOfflineValidation::ModuleHistos > mTidResiduals_
uint32_t rawId() const
get the raw id
TProfile * ResYvsYProfile
virtual const DetIdContainer & detIds() const
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
TFileDirectory & tFileDirectory()
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
double dPhi(double phi1, double phi2)
uint32_t tidStereo(const DetId &id) const
void getBinning(uint32_t subDetId, TrackerOfflineValidation::HistogrammType residualtype, int &nBinsX, double &lowerBoundX, double &upperBoundX)
std::vector< unsigned int > tobRodInfo(const DetId &id) const
unsigned int subDetId[18]
Tan< T >::type tan(const T &t)
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
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)
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
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
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)
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
std::string histNameLocalX
std::auto_ptr< TFileDirectory > tfd
bool tidIsDoubleSide(const DetId &id) const
T const * product() const
void summarizeBinInContainer(int bin, SummaryContainer &targetContainer, SummaryContainer &sourceContainer)
void fillTrackQuantities(const edm::Event &, std::vector< AVTrackStruct > &v_avtrackout)
const bool moduleLevelHistsTransient_
bool isEndCap(uint32_t subDetId)
unsigned int tobModule(const DetId &id) const
std::string profileNameResXvsY
void clear()
set to empty values
void bookGlobalHists(DirectoryWrapper &tfd)
DirectoryWrapper(const DirectoryWrapper &upDir, const std::string &newDir, const std::string &basedir, bool useDqmMode)
uint32_t tecStereo(const DetId &id) const
virtual const DetIdContainer & detUnitIds() const
Returm a vector of all GeomDetUnit DetIds.
TProfile * ResXvsXProfile
std::vector< TH1 * > vTrackProfiles_
unsigned int pxfSide(const DetId &id) const
void bookDirHists(DirectoryWrapper &tfd, const Alignable &ali, const TrackerTopology *tTopo)
static const char * idToString(align::StructureType type)
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
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
const edm::EventSetup * lastSetup_
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
virtual const TrackerGeomDet * idToDet(DetId) const
bool isBarrel(uint32_t subDetId)