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();
296 iter != iterEnd; ++iter, ++
result) {
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",
466 "Transverse Impact Parameter vs. #phi;#phi_{Track};#LT d_{0} #GT [cm]",
469 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};#LT d_{z} #GT [cm]",
472 "Transverse Impact Parameter vs. #eta;#eta_{Track};#LT d_{0} #GT [cm]",
475 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};#LT d_{z} #GT [cm]",
478 "#chi^{2} vs. #phi;#phi_{Track};#LT #chi^{2} #GT",
481 "#chi^{2} probablility vs. #phi;#phi_{Track};#LT #chi^{2} probability#GT",
484 "#chi^{2} probablility vs. |d_{0}|;|d_{0}|[cm];#LT #chi^{2} probability#GT",
487 "#chi^{2}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT",
490 "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT",
493 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.};
495 "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT",
499 "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT",
502 "#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",
505 "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT",
508 "#kappa vs. #phi;#phi_{Track};#kappa",
511 "#kappa vs. #eta;#eta_{Track};#kappa",
514 "#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",
517 "#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",
521 "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]",
522 100, -3.15, 3.15, 100,-1.,1.) );
524 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",
525 100, -3.15, 3.15, 100,-100.,100.));
527 "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]",
528 100, -3.15, 3.15, 100,-1.,1.));
530 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]",
531 100, -3.15, 3.15, 100,-100.,100.));
533 "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}",
534 100, -3.15, 3.15, 500, 0., 500.));
536 "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability",
537 100, -3.15, 3.15, 100, 0., 1.));
539 "#chi^{2} probability vs. |d_{0}|;|d_{0}| [cm];#chi^{2} probability",
540 100, 0, 80, 100, 0., 1.));
542 "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof",
543 100, -3.15, 3.15, 100, 0., 10.));
545 "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}",
546 100, -3.15, 3.15, 500, 0., 500.));
548 "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability",
549 100, -3.15, 3.15, 100, 0., 1.));
551 "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof",
552 100,-3.15,3.15, 100, 0., 10.));
554 "#kappa vs. #phi;#phi_{Track};#kappa",
555 100,-3.15,3.15, 100, .0,.05));
557 "#kappa vs. #eta;#eta_{Track};#kappa",
558 100,-3.15,3.15, 100, .0,.05));
560 "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa",
561 100,0.,10, 100,-.03,.03));
565 "#momentum vs. #resX in pixB;#momentum;#resX",
566 15,0.,15., 200, -0.1,0.1));
568 "#momentum vs. #resX in pixE;#momentum;#resX",
569 15,0.,15., 200, -0.1,0.1));
571 "#momentum vs. #resX in TIB;#momentum;#resX",
572 15,0.,15., 200, -0.1,0.1));
574 "#momentum vs. #resX in TID;#momentum;#resX",
575 15,0.,15., 200, -0.1,0.1));
577 "#momentum vs. #resX in TOB;#momentum;#resX",
578 15,0.,15., 200, -0.1,0.1));
580 "#momentum vs. #resX in TEC;#momentum;#resX",
581 15,0.,15., 200, -0.1,0.1));
585 "#momentum vs. #resY in pixB;#momentum;#resY",
586 15,0.,15., 200, -0.1,0.1));
588 "#momentum vs. #resY in pixE;#momentum;#resY",
589 15,0.,15., 200, -0.1,0.1));
597 std::vector<Alignable*> alivec(ali.
components());
600 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
601 std::stringstream dirname;
602 dirname << structurename;
604 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" <<
i+1;
606 if (structurename.find(
"Endcap",0) != std::string::npos ) {
610 }
else if( !(this->
isDetOrDetUnit( (alivec)[i]->alignableObjectId()) )
640 std::stringstream histoname, histotitle, normhistoname, normhistotitle,
641 yhistoname, yhistotitle,
642 xprimehistoname, xprimehistotitle, normxprimehistoname, normxprimehistotitle,
643 yprimehistoname, yprimehistotitle, normyprimehistoname, normyprimehistotitle,
644 localxname, localxtitle, localyname, localytitle,
645 resxvsxprofilename, resxvsxprofiletitle, resyvsxprofilename, resyvsxprofiletitle,
646 resxvsyprofilename, resxvsyprofiletitle, resyvsyprofilename, resyvsyprofiletitle;
650 if( this->
isEndCap(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_wheel_";
651 else if ( this->
isBarrel(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_layer_";
652 else edm::LogWarning(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookHists"
653 <<
"Unknown subdetid: " << subdetandlayer.first;
655 histoname <<
"h_residuals_subdet_" << subdetandlayer.first
656 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
657 yhistoname <<
"h_y_residuals_subdet_" << subdetandlayer.first
658 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
659 xprimehistoname <<
"h_xprime_residuals_subdet_" << subdetandlayer.first
660 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
661 yprimehistoname <<
"h_yprime_residuals_subdet_" << subdetandlayer.first
662 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
663 normhistoname <<
"h_normresiduals_subdet_" << subdetandlayer.first
664 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
665 normxprimehistoname <<
"h_normxprimeresiduals_subdet_" << subdetandlayer.first
666 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
667 normyprimehistoname <<
"h_normyprimeresiduals_subdet_" << subdetandlayer.first
668 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
669 histotitle <<
"X Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit} [cm]";
670 yhistotitle <<
"Y Residual for module " <<
id.rawId() <<
";y_{tr} - y_{hit} [cm]";
671 normhistotitle <<
"Normalized Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit}/#sigma";
672 xprimehistotitle <<
"X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})' [cm]";
673 normxprimehistotitle <<
"Normalized X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})'/#sigma";
674 yprimehistotitle <<
"Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})' [cm]";
675 normyprimehistotitle <<
"Normalized Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})'/#sigma";
678 localxname <<
"h_localx_subdet_" << subdetandlayer.first
679 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
680 localyname <<
"h_localy_subdet_" << subdetandlayer.first
681 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
682 localxtitle <<
"u local for module " <<
id.rawId() <<
"; u_{tr,r}";
683 localytitle <<
"v local for module " <<
id.rawId() <<
"; v_{tr,r}";
685 resxvsxprofilename <<
"p_residuals_x_vs_x_subdet_" << subdetandlayer.first
686 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
687 resyvsxprofilename <<
"p_residuals_y_vs_x_subdet_" << subdetandlayer.first
688 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
689 resxvsyprofilename <<
"p_residuals_x_vs_y_subdet_" << subdetandlayer.first
690 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
691 resyvsyprofilename <<
"p_residuals_y_vs_y_subdet_" << subdetandlayer.first
692 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
693 resxvsxprofiletitle <<
"U Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
694 resyvsxprofiletitle <<
"V Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
695 resxvsyprofiletitle <<
"U Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
696 resyvsyprofiletitle <<
"V Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
707 if (
dqmMode_) moduleLevelHistsTransient =
false;
713 histoname.str().c_str(),histotitle.str().c_str(),
717 normhistoname.str().c_str(),normhistotitle.str().c_str(),
722 xprimehistoname.str().c_str(),xprimehistotitle.str().c_str(),
726 normxprimehistoname.str().c_str(),normxprimehistotitle.str().c_str(),
732 histStruct.
LocalX = this->
bookTH1F(moduleLevelHistsTransient, tfd,
733 localxname.str().c_str(),localxtitle.str().c_str(),
735 histStruct.
LocalY = this->
bookTH1F(moduleLevelHistsTransient, tfd,
736 localyname.str().c_str(),localytitle.str().c_str(),
739 resxvsxprofilename.str().c_str(),resxvsxprofiletitle.str().c_str(),
743 resxvsyprofilename.str().c_str(),resxvsyprofiletitle.str().c_str(),
751 yprimehistoname.str().c_str(),yprimehistotitle.str().c_str(),
756 yhistoname.str().c_str(), yhistotitle.str().c_str(),
761 normyprimehistoname.str().c_str(),normyprimehistotitle.str().c_str(),
768 resyvsxprofilename.str().c_str(),resyvsxprofiletitle.str().c_str(),
772 resyvsyprofilename.str().c_str(),resyvsyprofiletitle.str().c_str(),
782 int nBinsX,
double lowX,
double highX)
785 vDeleteObjects_.push_back(
new TH1F(histName, histTitle, nBinsX, lowX, highX));
789 return tfd.
make<TH1F>(histName, histTitle, nBinsX, lowX, highX);
793 int nBinsX,
double lowX,
double highX)
796 TProfile * profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX);
801 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX);
806 int nBinsX,
double lowX,
double highX,
double lowY,
double highY)
809 TProfile * profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
814 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
850 int& nBinsX,
double& lowerBoundX,
double& upperBoundX)
903 if(targetHist && sourceHist) {
904 targetHist->SetBinContent(bin, sourceHist->GetMean(1));
905 if(
useFwhm_) targetHist->SetBinError(bin,
Fwhm(sourceHist)/2.);
906 else targetHist->SetBinError(bin, sourceHist->GetRMS(1) );
960 <<
"[TrackerOfflineValidation] Error, tried to get reference for non-tracker subdet " << subdetid
961 <<
" from detector " << detid.
det();
976 std::vector<TrackerValidationVariables::AVTrackStruct> vTrackstruct;
979 for (std::vector<TrackerValidationVariables::AVTrackStruct>::const_iterator itT = vTrackstruct.begin();
980 itT != vTrackstruct.end();
989 vTrackHistos_[numOfValidHitsindex]->Fill(itT->numberOfValidHits);
991 vTrackHistos_[numOfLostHitsindex]->Fill(itT->numberOfLostHits);
1008 if (itT->ptError != 0.) {
1010 vTrackHistos_[ptResolutionindex]->Fill(itT->ptError/itT->pt);
1026 vTrackProfiles_[chiProbabsd0index]->Fill(fabs(itT->d0),itT->chi2Prob);
1062 vTrack2DHistos_[chiProbabsd0index_2d]->Fill(fabs(itT->d0),itT->chi2Prob);
1079 for (std::vector<TrackerValidationVariables::AVHitStruct>::const_iterator itH = itT->hits.begin();
1080 itH != itT->hits.end();
1088 histStruct.
ResHisto->Fill(itH->resX);
1089 if(itH->resErrX != 0) histStruct.
NormResHisto->Fill(itH->resX/itH->resErrX);
1095 if (itH->resXprime != -999.) {
1126 float tgalpha =
tan(itH->localAlpha);
1127 if ( fabs(tgalpha)!=0 ){
1128 histStruct.
LocalX->Fill(itH->localXnorm, tgalpha*tgalpha);
1129 histStruct.
LocalY->Fill(itH->localYnorm, tgalpha*tgalpha);
1141 histStruct.
ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1142 histStruct.
ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1149 if(itH->resXprimeErr != 0 && itH->resXprimeErr != -999 ) {
1154 if (itH->resYprime != -999.) {
1170 float tgbeta =
tan(itH->localBeta);
1171 if ( fabs(tgbeta)!=0 ){
1184 histStruct.
ResYvsXProfile->Fill(itH->localXnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1185 histStruct.
ResYvsYProfile->Fill(itH->localYnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1190 if (itH->resYprimeErr != 0 && itH->resYprimeErr != -999. ) {
1223 std::vector<TrackerOfflineValidation::SummaryContainer> vTrackerprofiles;
1232 TTree *
tree = fs->
make<TTree>(
"TkOffVal",
"TkOffVal");
1238 tree->Branch(
"TkOffTreeVariables", &treeMemPtr);
1247 delete treeMemPtr; treeMemPtr = 0;
1253 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles)
1255 std::vector<Alignable*> alivec(ali.
components());
1256 if( this->
isDetOrDetUnit((alivec)[0]->alignableObjectId()) )
return;
1258 for(
int iComp=0, iCompEnd = ali.
components().size();iComp < iCompEnd; ++iComp) {
1259 std::vector< TrackerOfflineValidation::SummaryContainer > vProfiles;
1262 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
1263 std::stringstream dirname;
1264 dirname << structurename;
1267 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" << iComp+1;
1269 if( !(this->
isDetOrDetUnit( (alivec)[iComp]->alignableObjectId()) )
1274 TH1 *hY = vLevelProfiles[iComp].sumYResiduals_;
1275 TH1 *hNormY = vLevelProfiles[iComp].sumNormYResiduals_;
1276 for(uint
n = 0;
n < vProfiles.size(); ++
n) {
1278 vLevelProfiles[iComp].sumXResiduals_->Add(vProfiles[n].sumXResiduals_);
1279 vLevelProfiles[iComp].sumNormXResiduals_->Add(vProfiles[n].sumNormXResiduals_);
1280 if (hY) hY->Add(vProfiles[n].sumYResiduals_);
1281 if (hNormY) hNormY->Add(vProfiles[n].sumNormYResiduals_);
1285 this->
fitResiduals(vLevelProfiles[iComp].sumXResiduals_);
1286 this->
fitResiduals(vLevelProfiles[iComp].sumNormXResiduals_);
1301 const uint aliSize = ali.
components().size();
1308 const DetId aliDetId = ali.
id();
1318 const uint subcompSize = ali.
components()[0]->components().size();
1320 const TString
title(Form(
"Summary for substructures in %s %d;%s;",aliTypeName,i,aliSubtypeName));
1322 sumContainer.summaryXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d",aliTypeName,i),
1323 title +
"#LT #Delta x' #GT",
1324 aliSize, 0.5, aliSize+0.5);
1325 sumContainer.summaryNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d",aliTypeName,i),
1326 title +
"#LT #Delta x'/#sigma #GT",
1327 aliSize,0.5,aliSize+0.5);
1330 sumContainer.summaryYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d",aliTypeName,i),
1331 title +
"#LT #Delta y' #GT",
1332 aliSize, 0.5, aliSize+0.5);
1333 sumContainer.summaryNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d",aliTypeName,i),
1334 title +
"#LT #Delta y'/#sigma #GT",
1335 aliSize,0.5,aliSize+0.5);
1339 if (subcompSize != 2) {
1342 <<
"Det with " << subcompSize <<
" components";
1345 const TString
title(Form(
"Summary for substructures in %s %d;%s;", aliTypeName, i,
1348 sumContainer.summaryXResiduals_
1349 = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d", aliTypeName, i),
1350 title +
"#LT #Delta x' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1351 sumContainer.summaryNormXResiduals_
1352 = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d", aliTypeName, i),
1353 title +
"#LT #Delta x'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1356 sumContainer.summaryYResiduals_
1357 = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d", aliTypeName, i),
1358 title +
"#LT #Delta y' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1359 sumContainer.summaryNormYResiduals_
1360 = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d", aliTypeName, i),
1361 title +
"#LT #Delta y'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1365 edm::LogError(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookSummaryHists"
1366 <<
"No summary histogramm for hierarchy level "
1367 << aliTypeName <<
" in subdet " << aliDetId.
subdetId();
1375 const TString sumTitle(Form(
"Residual for %s %d in %s;", aliTypeName, i, typeName));
1379 sumContainer.sumXResiduals_ = tfd.
make<TH1F>(Form(
"h_Xprime_%s_%d", aliTypeName, i),
1384 sumContainer.sumNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_NormXprime_%s_%d",aliTypeName,i),
1389 sumContainer.sumYResiduals_ = tfd.
make<TH1F>(Form(
"h_Yprime_%s_%d",aliTypeName,i),
1394 sumContainer.sumNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_NormYprime_%s_%d",aliTypeName,i),
1403 for(uint
k = 0;
k < aliSize; ++
k) {
1416 for(uint
k = 0;
k < aliSize; ++
k) {
1417 for(uint
j = 0;
j < subcompSize; ++
j) {
1430 return sumContainer;
1437 float max = hist->GetMaximum();
1438 int left = -1, right = -1;
1439 for(
unsigned int i = 1, iEnd = hist->GetNbinsX();
i <= iEnd; ++
i) {
1440 if(hist->GetBinContent(
i) < max/2. && hist->GetBinContent(
i+1) > max/2. && left == -1) {
1441 if(max/2. - hist->GetBinContent(
i) < hist->GetBinContent(
i+1) - max/2.) {
1449 if(left != -1 && right == -1) {
1450 if(hist->GetBinContent(
i) > max/2. && hist->GetBinContent(
i+1) < max/2.) {
1451 if( hist->GetBinContent(
i) - max/2. < max/2. - hist->GetBinContent(
i+1)) {
1460 return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1466 const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
1470 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1471 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1475 DetId detId_ = it->first;
1481 unsigned int whichHalfBarrel(1), rawId(detId_.
rawId());
1482 if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) ||
1483 (rawId>=302189572 && rawId<302194980) ) whichHalfBarrel=2;
1485 treeMem.
half = whichHalfBarrel;
1489 unsigned int whichHalfCylinder(1), rawId(detId_.
rawId());
1490 if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) ||
1491 (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) ) whichHalfCylinder=2;
1494 treeMem.
half = whichHalfCylinder;
1499 unsigned int whichHalfShell(1), rawId(detId_.
rawId());
1500 if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) ||
1501 (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1502 (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) ||
1503 (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1504 (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) ||
1505 (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1506 (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) ||
1507 (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1510 treeMem.
half = whichHalfShell;
1547 treeMem.
posX = gPModule.
x();
1548 treeMem.
posY = gPModule.
y();
1549 treeMem.
posZ = gPModule.
z();
1554 LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1556 gVDirection = surface.
toGlobal(lVDirection),
1557 gWDirection = surface.
toGlobal(lWDirection);
1558 double dR(999.),
dPhi(999.), dZ(999.);
1560 dR = gWDirection.perp() - gPModule.
perp();
1562 dZ = gVDirection.z() - gPModule.
z();
1567 dZ = gWDirection.z() - gPModule.
z();
1570 dR = gVDirection.perp() - gPModule.
perp();
1572 dZ = gWDirection.z() - gPModule.
z();
1580 treeMem.
entries =
static_cast<UInt_t
>(it->second.ResXprimeHisto->GetEntries());
1581 treeMem.
meanX = it->second.ResXprimeHisto->GetMean();
1582 treeMem.
rmsX = it->second.ResXprimeHisto->GetRMS();
1588 std::pair<float,float> fitResult1 = this->
fitResiduals(it->second.ResXprimeHisto);
1589 treeMem.
fitMeanX = fitResult1.first;
1592 std::pair<float,float> fitResult2 = this->
fitResiduals(it->second.NormResXprimeHisto);
1600 int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1602 treeMem.
numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1603 treeMem.
numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1606 treeMem.
meanNormX = it->second.NormResXprimeHisto->GetMean();
1607 treeMem.
rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1610 it->second.NormResXprimeHisto->GetStats(stats);
1612 if (stats[0]) treeMem.
chi2PerDofX = stats[3]/stats[0];
1615 treeMem.
histNameX = it->second.ResXprimeHisto->GetName();
1616 treeMem.
histNameNormX = it->second.NormResXprimeHisto->GetName();
1620 treeMem.
meanLocalX = it->second.ResHisto->GetMean();
1621 treeMem.
rmsLocalX = it->second.ResHisto->GetRMS();
1627 if (it->second.ResYHisto) treeMem.
histNameLocalY = it->second.ResYHisto->GetName();
1632 if (it->second.ResYprimeHisto) {
1633 TH1 *
h = it->second.ResYprimeHisto;
1634 treeMem.
meanY = h->GetMean();
1635 treeMem.
rmsY = h->GetRMS();
1638 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1639 treeMem.
fitMeanY = fitMeanSigma.first;
1640 treeMem.
fitSigmaY = fitMeanSigma.second;
1648 if (it->second.NormResYprimeHisto) {
1649 TH1 *
h = it->second.NormResYprimeHisto;
1653 if (stats[0]) treeMem.
chi2PerDofY = stats[3]/stats[0];
1656 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1664 if (it->second.ResXvsXProfile) {
1665 TH1 *
h = it->second.ResXvsXProfile;
1670 if (it->second.ResXvsYProfile) {
1671 TH1 *
h = it->second.ResXvsYProfile;
1676 if (it->second.ResYvsXProfile) {
1677 TH1 *
h = it->second.ResYvsXProfile;
1682 if (it->second.ResYvsYProfile) {
1683 TH1 *
h = it->second.ResYvsYProfile;
1695 std::pair<float,float>
1698 std::pair<float,float> fitResult(9999., 9999.);
1699 if (!hist || hist->GetEntries() < 20)
return fitResult;
1701 float mean = hist->GetMean();
1702 float sigma = hist->GetRMS();
1707 TF1
func(
"tmp",
"gaus", mean - 2.*sigma, mean + 2.*sigma);
1708 if (0 == hist->Fit(&func,
"QNR")) {
1709 mean = func.GetParameter(1);
1710 sigma = func.GetParameter(2);
1712 func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1715 if (0 == hist->Fit(&func,
"Q0LR")) {
1716 if (hist->GetFunction(func.GetName())) {
1717 hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1719 fitResult.first = func.GetParameter(1);
1720 fitResult.second = func.GetParameter(2);
1724 edm::LogWarning(
"Alignment") <<
"@SUB=TrackerOfflineValidation::fitResiduals"
1725 <<
"Caught this exception during ROOT fit: "
1736 int nbins = histo->GetNbinsX();
1739 double *
x =
new double[
nbins];
1740 double *
y =
new double[
nbins];
1742 x[
j] = histo->GetBinCenter(
j+1);
1743 y[
j] = histo->GetBinContent(
j+1);
1745 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)
const T & max(const T &a, const T &b)
std::vector< unsigned int > tobRodInfo(const DetId &id) const
constexpr unsigned int subDetId[12]
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)
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
std::string histNameLocalY
virtual const GeomDet * idToDet(DetId) const
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
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
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
bool isBarrel(uint32_t subDetId)