148 if (newDir.length()!=0){
156 if (newDir.length()==0)
tfd.reset(&(*upDir.
tfd));
171 if (newDir.length()==0){
180 if (newDir.length()!=0){
189 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX);
190 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double *xBins);
191 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
int nBinY,
double minBinY,
double maxBinY);
192 template <
typename T> TH1*
make(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
double minBinY,
double maxBinY);
194 std::auto_ptr<TFileDirectory>
tfd;
205 virtual void endJob()
override;
214 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles);
217 void setUpTreeMembers(
const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
233 int nBinsX,
double lowX,
double highX);
236 int nBinsX,
double lowX,
double highX);
239 int nBinsX,
double lowX,
double highX,
double lowY,
double highY);
242 int& nBinsX,
double& lowerBoundX,
double& upperBoundX);
257 template <
class OBJECT_TYPE>
int GetIndex(
const std::vector<OBJECT_TYPE*>& vec,
const TString&
name);
318 template <
class OBJECT_TYPE>
322 for (
typename std::vector<OBJECT_TYPE*>::const_iterator iter = vec.begin(), iterEnd = vec.end();
323 iter != iterEnd; ++iter, ++
result) {
324 if (*iter && (*iter)->GetName() ==
name)
return result;
326 edm::LogError(
"Alignment") <<
"@SUB=TrackerOfflineValidation::GetIndex" <<
" could not find " <<
name;
331 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH1F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
332 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book1D(
name,
title,nBinX,minBinX,maxBinX)->getTH1();}
333 else{
return tfd->make<TH1F>(
name,
title,nBinX,minBinX,maxBinX);}
336 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double *xBins){
338 theDbe->setCurrentFolder(directoryString);
340 TProfile *tmpProfile=
new TProfile(
name,
title,nBinX,xBins);
341 tmpProfile->SetDirectory(0);
342 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
344 else{
return tfd->make<TProfile>(
name,
title,nBinX,xBins);}
347 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
349 theDbe->setCurrentFolder(directoryString);
351 TProfile *tmpProfile=
new TProfile(
name,
title,nBinX,minBinX,maxBinX);
352 tmpProfile->SetDirectory(0);
353 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
355 else{
return tfd->make<TProfile>(
name,
title,nBinX,minBinX,maxBinX);}
358 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name ,
const char*
title,
int nbinX,
double minX ,
double maxX,
double minY,
double maxY){
360 theDbe->setCurrentFolder(directoryString);
362 return (theDbe->bookProfile(
name,
title,nbinX,minX,maxX,dummy,minY,maxY)->getTH1());
365 return tfd->make<TProfile>(
name,
title,nbinX,minX,maxX,minY,maxY);
369 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH2F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
int nBinY,
double minBinY,
double maxBinY){
370 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book2D(
name,
title,nBinX,minBinX,maxBinX,nBinY,minBinY,maxBinY)->getTH1();}
371 else{
return tfd->make<TH2F>(
name,
title,nBinX,minBinX,maxBinX,nBinY,minBinY,maxBinY);}
379 : parSet_(iConfig), bareTkGeomPtr_(0), lCoorHistOn_(parSet_.getParameter<bool>(
"localCoorHistosOn")),
380 moduleLevelHistsTransient_(parSet_.getParameter<bool>(
"moduleLevelHistsTransient")),
381 moduleLevelProfiles_(parSet_.getParameter<bool>(
"moduleLevelProfiles")),
382 stripYResiduals_(parSet_.getParameter<bool>(
"stripYResiduals")),
383 useFwhm_(parSet_.getParameter<bool>(
"useFwhm")),
384 useFit_(parSet_.getParameter<bool>(
"useFit")),
385 useOverflowForRMS_(parSet_.getParameter<bool>(
"useOverflowForRMS")),
386 dqmMode_(parSet_.getParameter<bool>(
"useInDqmMode")),
387 moduleDirectory_(parSet_.getParameter<std::
string>(
"moduleDirectoryInOutput")),
388 avalidator_(iConfig, consumesCollector())
426 edm::LogInfo(
"TrackerOfflineValidation") <<
"There are " << newBareTkGeomPtr->
detIds().size()
427 <<
" dets in the Geometry record.\n"
428 <<
"Out of these "<<newBareTkGeomPtr->
detUnitIds().size()
440 std::vector<TrackerOfflineValidation::SummaryContainer> vTrackerprofiles;
452 <<
"TrackerGeometry changed, but will not re-book hists!";
463 "Track #eta;#eta_{Track};Number of Tracks",
466 "Track #phi;#phi_{Track};Number of Tracks",
469 "Track # of valid hits;# of valid hits _{Track};Number of Tracks",
472 "Track # of lost hits;# of lost hits _{Track};Number of Tracks",
475 "Curvature #kappa;#kappa_{Track};Number of Tracks",
478 "Curvature |#kappa| Positive Tracks;|#kappa_{pos Track}|;Number of Tracks",
481 "Curvature |#kappa| Negative Tracks;|#kappa_{neg Track}|;Number of Tracks",
484 "Curvature |#kappa| Tracks Difference;|#kappa_{Track}|;# Pos Tracks - # Neg Tracks",
487 "#chi^{2};#chi^{2}_{Track};Number of Tracks",
490 "#chi^{2} probability;#chi^{2}prob_{Track};Number of Tracks",
493 "#chi^{2}/ndof;#chi^{2}/ndof;Number of Tracks",
496 "p_{T}^{track};p_{T}^{track} [GeV];Number of Tracks",
499 "#delta_{p_{T}}/p_{T}^{track};#delta_{p_{T}}/p_{T}^{track};Number of Tracks",
502 "Transverse Impact Parameter vs. #phi;#phi_{Track};#LT d_{0} #GT [cm]",
505 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};#LT d_{z} #GT [cm]",
508 "Transverse Impact Parameter vs. #eta;#eta_{Track};#LT d_{0} #GT [cm]",
511 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};#LT d_{z} #GT [cm]",
514 "#chi^{2} vs. #phi;#phi_{Track};#LT #chi^{2} #GT",
517 "#chi^{2} probablility vs. #phi;#phi_{Track};#LT #chi^{2} probability#GT",
520 "#chi^{2} probablility vs. |d_{0}|;|d_{0}|[cm];#LT #chi^{2} probability#GT",
523 "#chi^{2}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT",
526 "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT",
529 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.};
531 "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT",
535 "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT",
538 "#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",
541 "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT",
544 "#kappa vs. #phi;#phi_{Track};#kappa",
547 "#kappa vs. #eta;#eta_{Track};#kappa",
550 "#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",
553 "#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",
557 "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]",
558 100, -3.15, 3.15, 100,-1.,1.) );
560 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",
561 100, -3.15, 3.15, 100,-100.,100.));
563 "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]",
564 100, -3.15, 3.15, 100,-1.,1.));
566 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]",
567 100, -3.15, 3.15, 100,-100.,100.));
569 "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}",
570 100, -3.15, 3.15, 500, 0., 500.));
572 "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability",
573 100, -3.15, 3.15, 100, 0., 1.));
575 "#chi^{2} probability vs. |d_{0}|;|d_{0}| [cm];#chi^{2} probability",
576 100, 0, 80, 100, 0., 1.));
578 "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof",
579 100, -3.15, 3.15, 100, 0., 10.));
581 "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}",
582 100, -3.15, 3.15, 500, 0., 500.));
584 "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability",
585 100, -3.15, 3.15, 100, 0., 1.));
587 "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof",
588 100,-3.15,3.15, 100, 0., 10.));
590 "#kappa vs. #phi;#phi_{Track};#kappa",
591 100,-3.15,3.15, 100, .0,.05));
593 "#kappa vs. #eta;#eta_{Track};#kappa",
594 100,-3.15,3.15, 100, .0,.05));
596 "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa",
597 100,0.,10, 100,-.03,.03));
601 "res_{x'} vs momentum in BPix;p [GeV]; res_{x'}",
602 15,0.,15., 200, -0.1,0.1));
604 "res_{x'} vs momentum in FPix;p [GeV]; res_{x'}",
605 15,0.,15., 200, -0.1,0.1));
607 "res_{x'} vs momentum in TIB;p [GeV]; res_{x'}",
608 15,0.,15., 200, -0.1,0.1));
610 "res_{x'} vs momentum in TID;p [GeV]; res_{x'}",
611 15,0.,15., 200, -0.1,0.1));
613 "res_{x'} vs momentum in TOB;p [GeV]; res_{x'}",
614 15,0.,15., 200, -0.1,0.1));
616 "res_{x'} vs momentum in TEC;p [GeV]; res_{x'}",
617 15,0.,15., 200, -0.1,0.1));
621 "res_{y'} vs momentum in BPix;p [GeV]; res_{y'}",
622 15,0.,15., 200, -0.1,0.1));
624 "res_{y'} vs momentum in FPix;p [GeV]; res_{y'}",
625 15,0.,15., 200, -0.1,0.1));
633 std::vector<Alignable*> alivec(ali.
components());
636 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
638 dirname << structurename;
640 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" <<
i+1;
642 if (structurename.find(
"Endcap",0) != std::string::npos ) {
646 }
else if( !(this->
isDetOrDetUnit( (alivec)[i]->alignableObjectId()) )
676 std::stringstream histoname, histotitle, normhistoname, normhistotitle,
677 yhistoname, yhistotitle,
678 xprimehistoname, xprimehistotitle, normxprimehistoname, normxprimehistotitle,
679 yprimehistoname, yprimehistotitle, normyprimehistoname, normyprimehistotitle,
680 localxname, localxtitle, localyname, localytitle,
681 resxvsxprofilename, resxvsxprofiletitle, resyvsxprofilename, resyvsxprofiletitle,
682 resxvsyprofilename, resxvsyprofiletitle, resyvsyprofilename, resyvsyprofiletitle;
686 if( this->
isEndCap(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_wheel_";
687 else if ( this->
isBarrel(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_layer_";
688 else edm::LogWarning(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookHists"
689 <<
"Unknown subdetid: " << subdetandlayer.first;
691 histoname <<
"h_residuals_subdet_" << subdetandlayer.first
692 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
693 yhistoname <<
"h_y_residuals_subdet_" << subdetandlayer.first
694 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
695 xprimehistoname <<
"h_xprime_residuals_subdet_" << subdetandlayer.first
696 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
697 yprimehistoname <<
"h_yprime_residuals_subdet_" << subdetandlayer.first
698 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
699 normhistoname <<
"h_normresiduals_subdet_" << subdetandlayer.first
700 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
701 normxprimehistoname <<
"h_normxprimeresiduals_subdet_" << subdetandlayer.first
702 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
703 normyprimehistoname <<
"h_normyprimeresiduals_subdet_" << subdetandlayer.first
704 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
705 histotitle <<
"X Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit} [cm]";
706 yhistotitle <<
"Y Residual for module " <<
id.rawId() <<
";y_{tr} - y_{hit} [cm]";
707 normhistotitle <<
"Normalized Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit}/#sigma";
708 xprimehistotitle <<
"X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})' [cm]";
709 normxprimehistotitle <<
"Normalized X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})'/#sigma";
710 yprimehistotitle <<
"Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})' [cm]";
711 normyprimehistotitle <<
"Normalized Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})'/#sigma";
714 localxname <<
"h_localx_subdet_" << subdetandlayer.first
715 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
716 localyname <<
"h_localy_subdet_" << subdetandlayer.first
717 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
718 localxtitle <<
"u local for module " <<
id.rawId() <<
"; u_{tr,r}";
719 localytitle <<
"v local for module " <<
id.rawId() <<
"; v_{tr,r}";
721 resxvsxprofilename <<
"p_residuals_x_vs_x_subdet_" << subdetandlayer.first
722 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
723 resyvsxprofilename <<
"p_residuals_y_vs_x_subdet_" << subdetandlayer.first
724 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
725 resxvsyprofilename <<
"p_residuals_x_vs_y_subdet_" << subdetandlayer.first
726 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
727 resyvsyprofilename <<
"p_residuals_y_vs_y_subdet_" << subdetandlayer.first
728 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
729 resxvsxprofiletitle <<
"U Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
730 resyvsxprofiletitle <<
"V Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
731 resxvsyprofiletitle <<
"U Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
732 resyvsyprofiletitle <<
"V Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
743 if (
dqmMode_) moduleLevelHistsTransient =
false;
749 histoname.str().c_str(),histotitle.str().c_str(),
753 normhistoname.str().c_str(),normhistotitle.str().c_str(),
758 xprimehistoname.str().c_str(),xprimehistotitle.str().c_str(),
762 normxprimehistoname.str().c_str(),normxprimehistotitle.str().c_str(),
768 histStruct.
LocalX = this->
bookTH1F(moduleLevelHistsTransient, tfd,
769 localxname.str().c_str(),localxtitle.str().c_str(),
771 histStruct.
LocalY = this->
bookTH1F(moduleLevelHistsTransient, tfd,
772 localyname.str().c_str(),localytitle.str().c_str(),
775 resxvsxprofilename.str().c_str(),resxvsxprofiletitle.str().c_str(),
779 resxvsyprofilename.str().c_str(),resxvsyprofiletitle.str().c_str(),
787 yprimehistoname.str().c_str(),yprimehistotitle.str().c_str(),
792 yhistoname.str().c_str(), yhistotitle.str().c_str(),
797 normyprimehistoname.str().c_str(),normyprimehistotitle.str().c_str(),
804 resyvsxprofilename.str().c_str(),resyvsxprofiletitle.str().c_str(),
808 resyvsyprofilename.str().c_str(),resyvsyprofiletitle.str().c_str(),
818 int nBinsX,
double lowX,
double highX)
821 vDeleteObjects_.push_back(
new TH1F(histName, histTitle, nBinsX, lowX, highX));
825 return tfd.
make<TH1F>(histName, histTitle, nBinsX, lowX, highX);
829 int nBinsX,
double lowX,
double highX)
832 TProfile * profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX);
837 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX);
842 int nBinsX,
double lowX,
double highX,
double lowY,
double highY)
845 TProfile * profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
850 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
886 int& nBinsX,
double& lowerBoundX,
double& upperBoundX)
939 if(targetHist && sourceHist) {
940 targetHist->SetBinContent(bin, sourceHist->GetMean(1));
941 if(
useFwhm_) targetHist->SetBinError(bin,
Fwhm(sourceHist)/2.);
942 else targetHist->SetBinError(bin, sourceHist->GetRMS(1) );
996 <<
"[TrackerOfflineValidation] Error, tried to get reference for non-tracker subdet " << subdetid
997 <<
" from detector " << detid.
det();
1010 std::vector<TrackerValidationVariables::AVTrackStruct> vTrackstruct;
1013 for (std::vector<TrackerValidationVariables::AVTrackStruct>::const_iterator itT = vTrackstruct.begin();
1014 itT != vTrackstruct.end();
1023 vTrackHistos_[numOfValidHitsindex]->Fill(itT->numberOfValidHits);
1025 vTrackHistos_[numOfLostHitsindex]->Fill(itT->numberOfLostHits);
1029 if (itT->charge > 0)
1032 if (itT->charge < 0)
1042 if (itT->ptError != 0.) {
1044 vTrackHistos_[ptResolutionindex]->Fill(itT->ptError/itT->pt);
1060 vTrackProfiles_[chiProbabsd0index]->Fill(fabs(itT->d0),itT->chi2Prob);
1096 vTrack2DHistos_[chiProbabsd0index_2d]->Fill(fabs(itT->d0),itT->chi2Prob);
1113 for (std::vector<TrackerValidationVariables::AVHitStruct>::const_iterator itH = itT->hits.begin();
1114 itH != itT->hits.end();
1122 histStruct.
ResHisto->Fill(itH->resX);
1123 if(itH->resErrX != 0) histStruct.
NormResHisto->Fill(itH->resX/itH->resErrX);
1129 if (itH->resXprime != -999.) {
1160 float tgalpha =
tan(itH->localAlpha);
1161 if ( fabs(tgalpha)!=0 ){
1162 histStruct.
LocalX->Fill(itH->localXnorm, tgalpha*tgalpha);
1163 histStruct.
LocalY->Fill(itH->localYnorm, tgalpha*tgalpha);
1175 histStruct.
ResXvsXProfile->Fill(itH->localXnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1176 histStruct.
ResXvsYProfile->Fill(itH->localYnorm, itH->resXatTrkY/tgalpha, tgalpha*tgalpha);
1183 if(itH->resXprimeErr != 0 && itH->resXprimeErr != -999 ) {
1188 if (itH->resYprime != -999.) {
1204 float tgbeta =
tan(itH->localBeta);
1205 if ( fabs(tgbeta)!=0 ){
1218 histStruct.
ResYvsXProfile->Fill(itH->localXnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1219 histStruct.
ResYvsYProfile->Fill(itH->localYnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1224 if (itH->resYprimeErr != 0 && itH->resYprimeErr != -999. ) {
1256 TTree *
tree = fs->
make<TTree>(
"TkOffVal",
"TkOffVal");
1262 tree->Branch(
"TkOffTreeVariables", &treeMemPtr);
1271 delete treeMemPtr; treeMemPtr = 0;
1277 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles)
1279 std::vector<Alignable*> alivec(ali.
components());
1280 if( this->
isDetOrDetUnit((alivec)[0]->alignableObjectId()) )
return;
1282 for(
int iComp=0, iCompEnd = ali.
components().size();iComp < iCompEnd; ++iComp) {
1283 std::vector< TrackerOfflineValidation::SummaryContainer > vProfiles;
1286 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
1288 dirname << structurename;
1291 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" << iComp+1;
1293 if( !(this->
isDetOrDetUnit( (alivec)[iComp]->alignableObjectId()) )
1298 TH1 *hX = vLevelProfiles[iComp].sumXResiduals_;
1299 TH1 *hNormX = vLevelProfiles[iComp].sumNormXResiduals_;
1300 TH1 *hY = vLevelProfiles[iComp].sumYResiduals_;
1301 TH1 *hNormY = vLevelProfiles[iComp].sumNormYResiduals_;
1302 TH1 *pXX = vLevelProfiles[iComp].sumResXvsXProfile_;
1303 TH1 *pXY = vLevelProfiles[iComp].sumResXvsYProfile_;
1304 TH1 *pYX = vLevelProfiles[iComp].sumResYvsXProfile_;
1305 TH1 *pYY = vLevelProfiles[iComp].sumResYvsYProfile_;
1306 for(uint
n = 0;
n < vProfiles.size(); ++
n) {
1311 if (hNormY)
sumHistStructure_.emplace_back(hNormY, vProfiles[n].sumNormYResiduals_);
1319 toFit_.push_back(vLevelProfiles[iComp].sumXResiduals_);
1320 toFit_.push_back(vLevelProfiles[iComp].sumNormXResiduals_);
1321 if (hY)
toFit_.push_back(hY);
1322 if (hNormY)
toFit_.push_back(hNormY);
1333 for (std::vector<std::pair<TH1*,TH1*> >::const_iterator it =
sumHistStructure_.begin();
1336 it->first->Add(it->second);
1338 for (std::vector<std::tuple<int,TH1*,TH1*> >::const_iterator it =
summaryBins_.begin();
1341 setSummaryBin(std::get<0>(*it), std::get<1>(*it), std::get<2>(*it));
1343 for (std::vector<TH1*>::const_iterator it =
toFit_.begin();
1354 const uint aliSize = ali.
components().size();
1361 const DetId aliDetId = ali.
id();
1371 const uint subcompSize = ali.
components()[0]->components().size();
1373 const TString
title(Form(
"Summary for substructures in %s %d;%s;",aliTypeName,i,aliSubtypeName));
1375 sumContainer.summaryXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d",aliTypeName,i),
1376 title +
"#LT #Delta x' #GT",
1377 aliSize, 0.5, aliSize+0.5);
1378 sumContainer.summaryNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d",aliTypeName,i),
1379 title +
"#LT #Delta x'/#sigma #GT",
1380 aliSize,0.5,aliSize+0.5);
1383 sumContainer.summaryYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d",aliTypeName,i),
1384 title +
"#LT #Delta y' #GT",
1385 aliSize, 0.5, aliSize+0.5);
1386 sumContainer.summaryNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d",aliTypeName,i),
1387 title +
"#LT #Delta y'/#sigma #GT",
1388 aliSize,0.5,aliSize+0.5);
1392 if (subcompSize != 2) {
1395 <<
"Det with " << subcompSize <<
" components";
1398 const TString
title(Form(
"Summary for substructures in %s %d;%s;", aliTypeName, i,
1401 sumContainer.summaryXResiduals_
1402 = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d", aliTypeName, i),
1403 title +
"#LT #Delta x' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1404 sumContainer.summaryNormXResiduals_
1405 = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d", aliTypeName, i),
1406 title +
"#LT #Delta x'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1409 sumContainer.summaryYResiduals_
1410 = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d", aliTypeName, i),
1411 title +
"#LT #Delta y' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1412 sumContainer.summaryNormYResiduals_
1413 = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d", aliTypeName, i),
1414 title +
"#LT #Delta y'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1418 edm::LogError(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookSummaryHists"
1419 <<
"No summary histogram for hierarchy level "
1420 << aliTypeName <<
" in subdet " << aliDetId.
subdetId();
1428 const TString sumTitle(Form(
"Residual for %s %d in %s;", aliTypeName, i, typeName));
1432 sumContainer.sumXResiduals_ = tfd.
make<TH1F>(Form(
"h_Xprime_%s_%d", aliTypeName, i),
1437 sumContainer.sumNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_NormXprime_%s_%d",aliTypeName,i),
1443 sumContainer.sumResXvsXProfile_ = tfd.
make<TProfile>(Form(
"p_resXX_%s_%d",aliTypeName,i),
1447 sumContainer.sumResXvsXProfile_->Sumw2();
1448 sumContainer.sumResXvsYProfile_ = tfd.
make<TProfile>(Form(
"p_resXY_%s_%d",aliTypeName,i),
1452 sumContainer.sumResXvsYProfile_->Sumw2();
1457 sumContainer.sumYResiduals_ = tfd.
make<TH1F>(Form(
"h_Yprime_%s_%d",aliTypeName,i),
1462 sumContainer.sumNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_NormYprime_%s_%d",aliTypeName,i),
1468 sumContainer.sumResYvsXProfile_ = tfd.
make<TProfile>(Form(
"p_resYX_%s_%d",aliTypeName,i),
1472 sumContainer.sumResYvsXProfile_->Sumw2();
1473 sumContainer.sumResYvsYProfile_ = tfd.
make<TProfile>(Form(
"p_resYY_%s_%d",aliTypeName,i),
1477 sumContainer.sumResYvsYProfile_->Sumw2();
1485 for(uint
k = 0;
k < aliSize; ++
k) {
1506 for(uint
k = 0;
k < aliSize; ++
k) {
1507 for(uint
j = 0;
j < subcompSize; ++
j) {
1528 return sumContainer;
1535 float max = hist->GetMaximum();
1536 int left = -1, right = -1;
1537 for(
unsigned int i = 1, iEnd = hist->GetNbinsX();
i <= iEnd; ++
i) {
1538 if(hist->GetBinContent(
i) < max/2. && hist->GetBinContent(
i+1) > max/2. && left == -1) {
1539 if(max/2. - hist->GetBinContent(
i) < hist->GetBinContent(
i+1) - max/2.) {
1547 if(left != -1 && right == -1) {
1548 if(hist->GetBinContent(
i) > max/2. && hist->GetBinContent(
i+1) < max/2.) {
1549 if( hist->GetBinContent(
i) - max/2. < max/2. - hist->GetBinContent(
i+1)) {
1558 return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1567 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1568 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1572 DetId detId_ = it->first;
1578 unsigned int whichHalfBarrel(1), rawId(detId_.
rawId());
1579 if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) ||
1580 (rawId>=302189572 && rawId<302194980) ) whichHalfBarrel=2;
1582 treeMem.
half = whichHalfBarrel;
1586 unsigned int whichHalfCylinder(1), rawId(detId_.
rawId());
1587 if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) ||
1588 (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) ) whichHalfCylinder=2;
1591 treeMem.
half = whichHalfCylinder;
1596 unsigned int whichHalfShell(1), rawId(detId_.
rawId());
1597 if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) ||
1598 (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1599 (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) ||
1600 (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1601 (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) ||
1602 (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1603 (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) ||
1604 (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1607 treeMem.
half = whichHalfShell;
1644 treeMem.
posX = gPModule.
x();
1645 treeMem.
posY = gPModule.
y();
1646 treeMem.
posZ = gPModule.
z();
1651 LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1653 gVDirection = surface.
toGlobal(lVDirection),
1654 gWDirection = surface.
toGlobal(lWDirection);
1655 double dR(999.),
dPhi(999.), dZ(999.);
1657 dR = gWDirection.perp() - gPModule.
perp();
1659 dZ = gVDirection.z() - gPModule.
z();
1664 dZ = gWDirection.z() - gPModule.
z();
1667 dR = gVDirection.perp() - gPModule.
perp();
1669 dZ = gWDirection.z() - gPModule.
z();
1680 const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_)
1682 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1683 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1687 treeMem.
entries =
static_cast<UInt_t
>(it->second.ResXprimeHisto->GetEntries());
1688 treeMem.
meanX = it->second.ResXprimeHisto->GetMean();
1689 treeMem.
rmsX = it->second.ResXprimeHisto->GetRMS();
1695 std::pair<float,float> fitResult1 = this->
fitResiduals(it->second.ResXprimeHisto);
1696 treeMem.
fitMeanX = fitResult1.first;
1699 std::pair<float,float> fitResult2 = this->
fitResiduals(it->second.NormResXprimeHisto);
1707 int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1709 treeMem.
numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1710 treeMem.
numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1713 treeMem.
meanNormX = it->second.NormResXprimeHisto->GetMean();
1714 treeMem.
rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1717 it->second.NormResXprimeHisto->GetStats(stats);
1719 if (stats[0]) treeMem.
chi2PerDofX = stats[3]/stats[0];
1722 treeMem.
histNameX = it->second.ResXprimeHisto->GetName();
1723 treeMem.
histNameNormX = it->second.NormResXprimeHisto->GetName();
1727 treeMem.
meanLocalX = it->second.ResHisto->GetMean();
1728 treeMem.
rmsLocalX = it->second.ResHisto->GetRMS();
1734 if (it->second.ResYHisto) treeMem.
histNameLocalY = it->second.ResYHisto->GetName();
1739 if (it->second.ResYprimeHisto) {
1740 TH1 *
h = it->second.ResYprimeHisto;
1741 treeMem.
meanY = h->GetMean();
1742 treeMem.
rmsY = h->GetRMS();
1745 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1746 treeMem.
fitMeanY = fitMeanSigma.first;
1747 treeMem.
fitSigmaY = fitMeanSigma.second;
1755 if (it->second.NormResYprimeHisto) {
1756 TH1 *
h = it->second.NormResYprimeHisto;
1760 if (stats[0]) treeMem.
chi2PerDofY = stats[3]/stats[0];
1763 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1771 if (it->second.ResXvsXProfile) {
1772 TH1 *
h = it->second.ResXvsXProfile;
1777 if (it->second.ResXvsYProfile) {
1778 TH1 *
h = it->second.ResXvsYProfile;
1783 if (it->second.ResYvsXProfile) {
1784 TH1 *
h = it->second.ResYvsXProfile;
1789 if (it->second.ResYvsYProfile) {
1790 TH1 *
h = it->second.ResYvsYProfile;
1802 std::pair<float,float>
1805 std::pair<float,float> fitResult(9999., 9999.);
1806 if (!hist || hist->GetEntries() < 20)
return fitResult;
1808 float mean = hist->GetMean();
1809 float sigma = hist->GetRMS();
1814 TF1 func(
"tmp",
"gaus", mean - 2.*sigma, mean + 2.*sigma);
1815 if (0 == hist->Fit(&func,
"QNR")) {
1816 mean = func.GetParameter(1);
1817 sigma = func.GetParameter(2);
1819 func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1822 if (0 == hist->Fit(&func,
"Q0LR")) {
1823 if (hist->GetFunction(func.GetName())) {
1824 hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1826 fitResult.first = func.GetParameter(1);
1827 fitResult.second = func.GetParameter(2);
1831 edm::LogWarning(
"Alignment") <<
"@SUB=TrackerOfflineValidation::fitResiduals"
1832 <<
"Caught this exception during ROOT fit: "
1843 int nbins = histo->GetNbinsX();
1846 double *
x =
new double[
nbins];
1847 double *
y =
new double[
nbins];
1849 x[
j] = histo->GetBinCenter(
j+1);
1850 y[
j] = histo->GetBinContent(
j+1);
1852 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
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
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
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
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.
std::vector< std::tuple< int, TH1 *, TH1 * > > summaryBins_
TProfile * ResXvsYProfile
TH1 * summaryNormYResiduals_
std::string profileNameResYvsX
std::map< int, TrackerOfflineValidation::ModuleHistos > mTidResiduals_
uint32_t rawId() const
get the raw id
TProfile * ResYvsYProfile
virtual const DetIdContainer & detIds() const
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
std::vector< std::pair< TH1 *, TH1 * > > sumHistStructure_
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)
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 int subDetId[18]
Tan< T >::type tan(const T &t)
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
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)
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
void prepareSummaryHists(DirectoryWrapper &tfd, const Alignable &ali, std::vector< TrackerOfflineValidation::SummaryContainer > &vLevelProfiles)
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
std::string histNameLocalY
std::string histNameNormLocalX
unsigned int tibModule(const DetId &id) const
unsigned int pxfModule(const DetId &id) const
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
T const * product() 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
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.
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)