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),
1446 sumContainer.sumResXvsXProfile_->Sumw2();
1447 sumContainer.sumResXvsYProfile_ = tfd.
make<TProfile>(Form(
"p_resXY_%s_%d",aliTypeName,i),
1450 sumContainer.sumResXvsYProfile_->Sumw2();
1455 sumContainer.sumYResiduals_ = tfd.
make<TH1F>(Form(
"h_Yprime_%s_%d",aliTypeName,i),
1460 sumContainer.sumNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_NormYprime_%s_%d",aliTypeName,i),
1466 sumContainer.sumResYvsXProfile_ = tfd.
make<TProfile>(Form(
"p_resYX_%s_%d",aliTypeName,i),
1469 sumContainer.sumResYvsXProfile_->Sumw2();
1470 sumContainer.sumResYvsYProfile_ = tfd.
make<TProfile>(Form(
"p_resYY_%s_%d",aliTypeName,i),
1473 sumContainer.sumResYvsYProfile_->Sumw2();
1481 for(uint
k = 0;
k < aliSize; ++
k) {
1502 for(uint
k = 0;
k < aliSize; ++
k) {
1503 for(uint
j = 0;
j < subcompSize; ++
j) {
1524 return sumContainer;
1531 float max = hist->GetMaximum();
1532 int left = -1, right = -1;
1533 for(
unsigned int i = 1, iEnd = hist->GetNbinsX();
i <= iEnd; ++
i) {
1534 if(hist->GetBinContent(
i) < max/2. && hist->GetBinContent(
i+1) > max/2. && left == -1) {
1535 if(max/2. - hist->GetBinContent(
i) < hist->GetBinContent(
i+1) - max/2.) {
1543 if(left != -1 && right == -1) {
1544 if(hist->GetBinContent(
i) > max/2. && hist->GetBinContent(
i+1) < max/2.) {
1545 if( hist->GetBinContent(
i) - max/2. < max/2. - hist->GetBinContent(
i+1)) {
1554 return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1563 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1564 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1568 DetId detId_ = it->first;
1574 unsigned int whichHalfBarrel(1), rawId(detId_.
rawId());
1575 if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) ||
1576 (rawId>=302189572 && rawId<302194980) ) whichHalfBarrel=2;
1578 treeMem.
half = whichHalfBarrel;
1582 unsigned int whichHalfCylinder(1), rawId(detId_.
rawId());
1583 if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) ||
1584 (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) ) whichHalfCylinder=2;
1587 treeMem.
half = whichHalfCylinder;
1592 unsigned int whichHalfShell(1), rawId(detId_.
rawId());
1593 if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) ||
1594 (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1595 (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) ||
1596 (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1597 (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) ||
1598 (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1599 (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) ||
1600 (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1603 treeMem.
half = whichHalfShell;
1640 treeMem.
posX = gPModule.
x();
1641 treeMem.
posY = gPModule.
y();
1642 treeMem.
posZ = gPModule.
z();
1647 LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1649 gVDirection = surface.
toGlobal(lVDirection),
1650 gWDirection = surface.
toGlobal(lWDirection);
1651 double dR(999.),
dPhi(999.), dZ(999.);
1653 dR = gWDirection.perp() - gPModule.
perp();
1655 dZ = gVDirection.z() - gPModule.
z();
1660 dZ = gWDirection.z() - gPModule.
z();
1663 dR = gVDirection.perp() - gPModule.
perp();
1665 dZ = gWDirection.z() - gPModule.
z();
1676 const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_)
1678 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1679 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1683 treeMem.
entries =
static_cast<UInt_t
>(it->second.ResXprimeHisto->GetEntries());
1684 treeMem.
meanX = it->second.ResXprimeHisto->GetMean();
1685 treeMem.
rmsX = it->second.ResXprimeHisto->GetRMS();
1691 std::pair<float,float> fitResult1 = this->
fitResiduals(it->second.ResXprimeHisto);
1692 treeMem.
fitMeanX = fitResult1.first;
1695 std::pair<float,float> fitResult2 = this->
fitResiduals(it->second.NormResXprimeHisto);
1703 int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1705 treeMem.
numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1706 treeMem.
numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1709 treeMem.
meanNormX = it->second.NormResXprimeHisto->GetMean();
1710 treeMem.
rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1713 it->second.NormResXprimeHisto->GetStats(stats);
1715 if (stats[0]) treeMem.
chi2PerDofX = stats[3]/stats[0];
1718 treeMem.
histNameX = it->second.ResXprimeHisto->GetName();
1719 treeMem.
histNameNormX = it->second.NormResXprimeHisto->GetName();
1723 treeMem.
meanLocalX = it->second.ResHisto->GetMean();
1724 treeMem.
rmsLocalX = it->second.ResHisto->GetRMS();
1730 if (it->second.ResYHisto) treeMem.
histNameLocalY = it->second.ResYHisto->GetName();
1735 if (it->second.ResYprimeHisto) {
1736 TH1 *
h = it->second.ResYprimeHisto;
1737 treeMem.
meanY = h->GetMean();
1738 treeMem.
rmsY = h->GetRMS();
1741 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1742 treeMem.
fitMeanY = fitMeanSigma.first;
1743 treeMem.
fitSigmaY = fitMeanSigma.second;
1751 if (it->second.NormResYprimeHisto) {
1752 TH1 *
h = it->second.NormResYprimeHisto;
1756 if (stats[0]) treeMem.
chi2PerDofY = stats[3]/stats[0];
1759 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1767 if (it->second.ResXvsXProfile) {
1768 TH1 *
h = it->second.ResXvsXProfile;
1773 if (it->second.ResXvsYProfile) {
1774 TH1 *
h = it->second.ResXvsYProfile;
1779 if (it->second.ResYvsXProfile) {
1780 TH1 *
h = it->second.ResYvsXProfile;
1785 if (it->second.ResYvsYProfile) {
1786 TH1 *
h = it->second.ResYvsYProfile;
1798 std::pair<float,float>
1801 std::pair<float,float> fitResult(9999., 9999.);
1802 if (!hist || hist->GetEntries() < 20)
return fitResult;
1804 float mean = hist->GetMean();
1805 float sigma = hist->GetRMS();
1810 TF1 func(
"tmp",
"gaus", mean - 2.*sigma, mean + 2.*sigma);
1811 if (0 == hist->Fit(&func,
"QNR")) {
1812 mean = func.GetParameter(1);
1813 sigma = func.GetParameter(2);
1815 func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1818 if (0 == hist->Fit(&func,
"Q0LR")) {
1819 if (hist->GetFunction(func.GetName())) {
1820 hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1822 fitResult.first = func.GetParameter(1);
1823 fitResult.second = func.GetParameter(2);
1827 edm::LogWarning(
"Alignment") <<
"@SUB=TrackerOfflineValidation::fitResiduals"
1828 <<
"Caught this exception during ROOT fit: "
1839 int nbins = histo->GetNbinsX();
1842 double *
x =
new double[
nbins];
1843 double *
y =
new double[
nbins];
1845 x[
j] = histo->GetBinCenter(
j+1);
1846 y[
j] = histo->GetBinContent(
j+1);
1848 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)