134 const std::string& basedir,
bool useDqmMode)
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;
206 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles);
208 void fillTree(TTree&
tree,
const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
220 bool isPixel(uint32_t subDetId);
224 int nBinsX,
double lowX,
double highX);
227 int nBinsX,
double lowX,
double highX);
230 int nBinsX,
double lowX,
double highX,
double lowY,
double highY);
233 int& nBinsX,
double& lowerBoundX,
double& upperBoundX);
248 template <
class OBJECT_TYPE>
int GetIndex(
const std::vector<OBJECT_TYPE*>& vec,
const TString&
name);
295 template <
class OBJECT_TYPE>
299 for (
typename std::vector<OBJECT_TYPE*>::const_iterator iter = vec.begin(), iterEnd = vec.end();
300 iter != iterEnd; ++iter, ++
result) {
301 if (*iter && (*iter)->GetName() ==
name)
return result;
303 edm::LogError(
"Alignment") <<
"@SUB=TrackerOfflineValidation::GetIndex" <<
" could not find " <<
name;
308 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH1F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
309 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book1D(
name,
title,nBinX,minBinX,maxBinX)->getTH1();}
310 else{
return tfd->make<TH1F>(
name,
title,nBinX,minBinX,maxBinX);}
313 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double *xBins){
315 theDbe->setCurrentFolder(directoryString);
317 TProfile *tmpProfile=
new TProfile(
name,
title,nBinX,xBins);
318 tmpProfile->SetDirectory(0);
319 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
321 else{
return tfd->make<TProfile>(
name,
title,nBinX,xBins);}
324 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX){
326 theDbe->setCurrentFolder(directoryString);
328 TProfile *tmpProfile=
new TProfile(
name,
title,nBinX,minBinX,maxBinX);
329 tmpProfile->SetDirectory(0);
330 return theDbe->bookProfile(
name,tmpProfile)->getTH1();
332 else{
return tfd->make<TProfile>(
name,
title,nBinX,minBinX,maxBinX);}
335 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TProfile>(
const char*
name ,
const char*
title,
int nbinX,
double minX ,
double maxX,
double minY,
double maxY){
337 theDbe->setCurrentFolder(directoryString);
346 template <> TH1* TrackerOfflineValidation::DirectoryWrapper::make<TH2F>(
const char*
name,
const char*
title,
int nBinX,
double minBinX,
double maxBinX,
int nBinY,
double minBinY,
double maxBinY){
347 if(dqmMode){theDbe->setCurrentFolder(directoryString);
return theDbe->book2D(
name,
title,nBinX,minBinX,maxBinX,nBinY,minBinY,maxBinY)->getTH1();}
348 else{
return tfd->make<TH2F>(
name,
title,nBinX,minBinX,maxBinX,nBinY,minBinY,maxBinY);}
356 : parSet_(iConfig), bareTkGeomPtr_(0), lCoorHistOn_(parSet_.getParameter<bool>(
"localCoorHistosOn")),
357 moduleLevelHistsTransient_(parSet_.getParameter<bool>(
"moduleLevelHistsTransient")),
358 moduleLevelProfiles_(parSet_.getParameter<bool>(
"moduleLevelProfiles")),
359 overlappOn_(parSet_.getParameter<bool>(
"overlappOn")),
360 stripYResiduals_(parSet_.getParameter<bool>(
"stripYResiduals")),
361 useFwhm_(parSet_.getParameter<bool>(
"useFwhm")),
362 useFit_(parSet_.getParameter<bool>(
"useFit")),
363 useOverflowForRMS_(parSet_.getParameter<bool>(
"useOverflowForRMS")),
364 dqmMode_(parSet_.getParameter<bool>(
"useInDqmMode")),
365 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()
405 std::string globDir(
"GlobalTrackVariables");
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}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT",
487 "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT",
490 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.};
492 "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT",
496 "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT",
499 "#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",
502 "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT",
505 "#kappa vs. #phi;#phi_{Track};#kappa",
508 "#kappa vs. #eta;#eta_{Track};#kappa",
511 "#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",
514 "#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",
518 "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]",
519 100, -3.15, 3.15, 100,-1.,1.) );
521 "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",
522 100, -3.15, 3.15, 100,-100.,100.));
524 "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]",
525 100, -3.15, 3.15, 100,-1.,1.));
527 "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]",
528 100, -3.15, 3.15, 100,-100.,100.));
530 "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}",
531 100, -3.15, 3.15, 500, 0., 500.));
533 "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability",
534 100, -3.15, 3.15, 100, 0., 1.));
536 "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof",
537 100, -3.15, 3.15, 100, 0., 10.));
539 "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}",
540 100, -3.15, 3.15, 500, 0., 500.));
542 "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability",
543 100, -3.15, 3.15, 100, 0., 1.));
545 "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof",
546 100,-3.15,3.15, 100, 0., 10.));
548 "#kappa vs. #phi;#phi_{Track};#kappa",
549 100,-3.15,3.15, 100, .0,.05));
551 "#kappa vs. #eta;#eta_{Track};#kappa",
552 100,-3.15,3.15, 100, .0,.05));
554 "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa",
555 100,0.,10, 100,-.03,.03));
559 "#momentum vs. #resX in pixB;#momentum;#resX",
560 15,0.,15., 200, -0.1,0.1));
562 "#momentum vs. #resX in pixE;#momentum;#resX",
563 15,0.,15., 200, -0.1,0.1));
565 "#momentum vs. #resX in TIB;#momentum;#resX",
566 15,0.,15., 200, -0.1,0.1));
568 "#momentum vs. #resX in TID;#momentum;#resX",
569 15,0.,15., 200, -0.1,0.1));
571 "#momentum vs. #resX in TOB;#momentum;#resX",
572 15,0.,15., 200, -0.1,0.1));
574 "#momentum vs. #resX in TEC;#momentum;#resX",
575 15,0.,15., 200, -0.1,0.1));
579 "#momentum vs. #resY in pixB;#momentum;#resY",
580 15,0.,15., 200, -0.1,0.1));
582 "#momentum vs. #resY in pixE;#momentum;#resY",
583 15,0.,15., 200, -0.1,0.1));
591 std::vector<Alignable*> alivec(ali.
components());
593 std::string structurename = aliobjid.
typeToName((alivec)[
i]->alignableObjectId());
594 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
595 std::stringstream dirname;
596 dirname << structurename;
598 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" <<
i+1;
600 if (structurename.find(
"Endcap",0) != std::string::npos ) {
604 }
else if( !(this->
isDetOrDetUnit( (alivec)[i]->alignableObjectId()) )
605 || alivec[i]->components().
size() > 1) {
634 std::stringstream histoname, histotitle, normhistoname, normhistotitle,
635 yhistoname, yhistotitle,
636 xprimehistoname, xprimehistotitle, normxprimehistoname, normxprimehistotitle,
637 yprimehistoname, yprimehistotitle, normyprimehistoname, normyprimehistotitle,
638 localxname, localxtitle, localyname, localytitle,
639 resxvsxprofilename, resxvsxprofiletitle, resyvsxprofilename, resyvsxprofiletitle,
640 resxvsyprofilename, resxvsyprofiletitle, resyvsyprofilename, resyvsyprofiletitle;
642 std::string wheel_or_layer;
644 if( this->
isEndCap(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_wheel_";
645 else if ( this->
isBarrel(static_cast<uint32_t>(subdetandlayer.first)) ) wheel_or_layer =
"_layer_";
646 else edm::LogWarning(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookHists"
647 <<
"Unknown subdetid: " << subdetandlayer.first;
649 histoname <<
"h_residuals_subdet_" << subdetandlayer.first
650 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
651 yhistoname <<
"h_y_residuals_subdet_" << subdetandlayer.first
652 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
653 xprimehistoname <<
"h_xprime_residuals_subdet_" << subdetandlayer.first
654 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
655 yprimehistoname <<
"h_yprime_residuals_subdet_" << subdetandlayer.first
656 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
657 normhistoname <<
"h_normresiduals_subdet_" << subdetandlayer.first
658 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
659 normxprimehistoname <<
"h_normxprimeresiduals_subdet_" << subdetandlayer.first
660 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
661 normyprimehistoname <<
"h_normyprimeresiduals_subdet_" << subdetandlayer.first
662 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
663 histotitle <<
"X Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit} [cm]";
664 yhistotitle <<
"Y Residual for module " <<
id.rawId() <<
";y_{tr} - y_{hit} [cm]";
665 normhistotitle <<
"Normalized Residual for module " <<
id.rawId() <<
";x_{tr} - x_{hit}/#sigma";
666 xprimehistotitle <<
"X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})' [cm]";
667 normxprimehistotitle <<
"Normalized X' Residual for module " <<
id.rawId() <<
";(x_{tr} - x_{hit})'/#sigma";
668 yprimehistotitle <<
"Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})' [cm]";
669 normyprimehistotitle <<
"Normalized Y' Residual for module " <<
id.rawId() <<
";(y_{tr} - y_{hit})'/#sigma";
672 localxname <<
"h_localx_subdet_" << subdetandlayer.first
673 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
674 localyname <<
"h_localy_subdet_" << subdetandlayer.first
675 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
676 localxtitle <<
"u local for module " <<
id.rawId() <<
"; u_{tr,r}";
677 localytitle <<
"v local for module " <<
id.rawId() <<
"; v_{tr,r}";
679 resxvsxprofilename <<
"p_residuals_x_vs_x_subdet_" << subdetandlayer.first
680 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
681 resyvsxprofilename <<
"p_residuals_y_vs_x_subdet_" << subdetandlayer.first
682 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
683 resxvsyprofilename <<
"p_residuals_x_vs_y_subdet_" << subdetandlayer.first
684 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
685 resyvsyprofilename <<
"p_residuals_y_vs_y_subdet_" << subdetandlayer.first
686 << wheel_or_layer << subdetandlayer.second <<
"_module_" <<
id.rawId();
687 resxvsxprofiletitle <<
"U Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
688 resyvsxprofiletitle <<
"V Residual vs u for module " <<
id.rawId() <<
"; u_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
689 resxvsyprofiletitle <<
"U Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(u_{tr} - u_{hit})/tan#alpha [cm]";
690 resyvsyprofiletitle <<
"V Residual vs v for module " <<
id.rawId() <<
"; v_{tr,r} ;(v_{tr} - v_{hit})/tan#beta [cm]";
696 double xmin = 0., xmax = 0.;
697 double ymin = -0.1, ymax = 0.1;
701 if (
dqmMode_) moduleLevelHistsTransient =
false;
707 histoname.str().c_str(),histotitle.str().c_str(),
711 normhistoname.str().c_str(),normhistotitle.str().c_str(),
716 xprimehistoname.str().c_str(),xprimehistotitle.str().c_str(),
720 normxprimehistoname.str().c_str(),normxprimehistotitle.str().c_str(),
726 histStruct.
LocalX = this->
bookTH1F(moduleLevelHistsTransient, tfd,
727 localxname.str().c_str(),localxtitle.str().c_str(),
729 histStruct.
LocalY = this->
bookTH1F(moduleLevelHistsTransient, tfd,
730 localyname.str().c_str(),localytitle.str().c_str(),
733 resxvsxprofilename.str().c_str(),resxvsxprofiletitle.str().c_str(),
734 nbins, xmin, xmax, ymin, ymax);
736 resxvsyprofilename.str().c_str(),resxvsyprofiletitle.str().c_str(),
737 nbins, xmin, xmax, ymin, ymax);
743 yprimehistoname.str().c_str(),yprimehistotitle.str().c_str(),
748 yhistoname.str().c_str(), yhistotitle.str().c_str(),
753 normyprimehistoname.str().c_str(),normyprimehistotitle.str().c_str(),
760 resyvsxprofilename.str().c_str(),resyvsxprofiletitle.str().c_str(),
761 nbins, xmin, xmax, ymin, ymax);
763 resyvsyprofilename.str().c_str(),resyvsyprofiletitle.str().c_str(),
764 nbins, xmin, xmax, ymin, ymax);
772 int nBinsX,
double lowX,
double highX)
775 vDeleteObjects_.push_back(
new TH1F(histName, histTitle, nBinsX, lowX, highX));
779 return tfd.
make<TH1F>(histName, histTitle, nBinsX, lowX, highX);
783 int nBinsX,
double lowX,
double highX)
786 TProfile *
profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX);
791 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX);
796 int nBinsX,
double lowX,
double highX,
double lowY,
double highY)
799 TProfile *
profile =
new TProfile(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
804 return (TProfile*)tfd.
make<TProfile>(histName, histTitle, nBinsX, lowX, highX, lowY, highY);
840 int& nBinsX,
double& lowerBoundX,
double& upperBoundX)
893 if(targetHist && sourceHist) {
894 targetHist->SetBinContent(bin, sourceHist->GetMean(1));
895 if(
useFwhm_) targetHist->SetBinError(bin,
Fwhm(sourceHist)/2.);
896 else targetHist->SetBinError(bin, sourceHist->GetRMS(1) );
950 <<
"[TrackerOfflineValidation] Error, tried to get reference for non-tracker subdet " << subdetid
951 <<
" from detector " << detid.
det();
966 std::vector<TrackerValidationVariables::AVTrackStruct> vTrackstruct;
969 for (std::vector<TrackerValidationVariables::AVTrackStruct>::const_iterator itT = vTrackstruct.begin();
970 itT != vTrackstruct.end();
979 vTrackHistos_[numOfValidHitsindex]->Fill(itT->numberOfValidHits);
981 vTrackHistos_[numOfLostHitsindex]->Fill(itT->numberOfLostHits);
998 if (itT->ptError != 0.) {
1000 vTrackHistos_[ptResolutionindex]->Fill(itT->ptError/itT->pt);
1065 for (std::vector<TrackerValidationVariables::AVHitStruct>::const_iterator itH = itT->hits.begin();
1066 itH != itT->hits.end();
1074 histStruct.
ResHisto->Fill(itH->resX);
1075 if(itH->resErrX != 0) histStruct.
NormResHisto->Fill(itH->resX/itH->resErrX);
1081 if (itH->resXprime != -999.) {
1112 float tgalpha =
tan(itH->localAlpha);
1113 if ( fabs(tgalpha)!=0 ){
1114 histStruct.
LocalX->Fill(itH->localXnorm, tgalpha*tgalpha);
1115 histStruct.
LocalY->Fill(itH->localYnorm, tgalpha*tgalpha);
1116 histStruct.
ResXvsXProfile->Fill(itH->localXnorm, itH->resX/tgalpha, tgalpha*tgalpha);
1117 histStruct.
ResXvsYProfile->Fill(itH->localYnorm, itH->resX/tgalpha, tgalpha*tgalpha);
1121 if(itH->resXprimeErr != 0 && itH->resXprimeErr != -999 ) {
1126 if (itH->resYprime != -999.) {
1142 float tgbeta =
tan(itH->localBeta);
1143 if ( fabs(tgbeta)!=0 ){
1144 histStruct.
ResYvsXProfile->Fill(itH->localXnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1145 histStruct.
ResYvsYProfile->Fill(itH->localYnorm, itH->resY/tgbeta, tgbeta*tgbeta);
1149 if (itH->resYprimeErr != 0 && itH->resYprimeErr != -999. ) {
1156 std::pair<uint32_t,uint32_t> tmp_pair(std::make_pair(itH->rawDetId, itH->overlapres.first));
1157 if (itH->overlapres.first != 0) {
1160 }
else if (
hOverlappResidual[std::make_pair(itH->overlapres.first, itH->rawDetId)]) {
1161 hOverlappResidual[std::make_pair( itH->overlapres.first, itH->rawDetId)]->Fill(itH->overlapres.second);
1163 std::string dirname(
"OverlappResiduals");
1165 hOverlappResidual[tmp_pair] = tfd.make<TH1F>(Form(
"hOverlappResidual_%d_%d",tmp_pair.first,tmp_pair.second),
1166 "Overlapp Residuals",100,-50,50);
1167 hOverlappResidual[tmp_pair]->Fill(itH->overlapres.second);
1196 std::vector<TrackerOfflineValidation::SummaryContainer> vTrackerprofiles;
1205 TTree *
tree = fs->
make<TTree>(
"TkOffVal",
"TkOffVal");
1211 tree->Branch(
"TkOffTreeVariables", &treeMemPtr);
1220 delete treeMemPtr; treeMemPtr = 0;
1227 std::vector<TrackerOfflineValidation::SummaryContainer>& vLevelProfiles)
1229 std::vector<Alignable*> alivec(ali.
components());
1230 if( this->
isDetOrDetUnit((alivec)[0]->alignableObjectId()) )
return;
1232 for(
int iComp=0, iCompEnd = ali.
components().size();iComp < iCompEnd; ++iComp) {
1233 std::vector< TrackerOfflineValidation::SummaryContainer > vProfiles;
1234 std::string structurename = aliobjid.
typeToName((alivec)[iComp]->alignableObjectId());
1236 LogDebug(
"TrackerOfflineValidation") <<
"StructureName = " << structurename;
1237 std::stringstream dirname;
1238 dirname << structurename;
1241 if (structurename !=
"Strip" && structurename !=
"Pixel") dirname <<
"_" << iComp+1;
1243 if( !(this->
isDetOrDetUnit( (alivec)[iComp]->alignableObjectId()) )
1244 || (alivec)[0]->components().
size() > 1 ) {
1248 TH1 *hY = vLevelProfiles[iComp].sumYResiduals_;
1249 TH1 *hNormY = vLevelProfiles[iComp].sumNormYResiduals_;
1250 for(uint
n = 0;
n < vProfiles.size(); ++
n) {
1252 vLevelProfiles[iComp].sumXResiduals_->Add(vProfiles[n].sumXResiduals_);
1253 vLevelProfiles[iComp].sumNormXResiduals_->Add(vProfiles[n].sumNormXResiduals_);
1254 if (hY) hY->Add(vProfiles[n].sumYResiduals_);
1255 if (hNormY) hNormY->Add(vProfiles[n].sumNormYResiduals_);
1259 this->
fitResiduals(vLevelProfiles[iComp].sumXResiduals_);
1260 this->
fitResiduals(vLevelProfiles[iComp].sumNormXResiduals_);
1276 const uint aliSize = ali.
components().size();
1279 const char *aliTypeName = aliobjid.
typeToName(alitype).c_str();
1280 const char *aliSubtypeName = aliobjid.
typeToName(subtype).c_str();
1281 const char *typeName = aliobjid.
typeToName(type).c_str();
1283 const DetId aliDetId = ali.
id();
1293 const uint subcompSize = ali.
components()[0]->components().size();
1295 const TString
title(Form(
"Summary for substructures in %s %d;%s;",aliTypeName,i,aliSubtypeName));
1297 sumContainer.summaryXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d",aliTypeName,i),
1298 title +
"#LT #Delta x' #GT",
1299 aliSize, 0.5, aliSize+0.5);
1300 sumContainer.summaryNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d",aliTypeName,i),
1301 title +
"#LT #Delta x'/#sigma #GT",
1302 aliSize,0.5,aliSize+0.5);
1305 sumContainer.summaryYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d",aliTypeName,i),
1306 title +
"#LT #Delta y' #GT",
1307 aliSize, 0.5, aliSize+0.5);
1308 sumContainer.summaryNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d",aliTypeName,i),
1309 title +
"#LT #Delta y'/#sigma #GT",
1310 aliSize,0.5,aliSize+0.5);
1314 if (subcompSize != 2) {
1317 <<
"Det with " << subcompSize <<
" components";
1320 const TString
title(Form(
"Summary for substructures in %s %d;%s;", aliTypeName, i,
1323 sumContainer.summaryXResiduals_
1324 = tfd.
make<TH1F>(Form(
"h_summaryX%s_%d", aliTypeName, i),
1325 title +
"#LT #Delta x' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1326 sumContainer.summaryNormXResiduals_
1327 = tfd.
make<TH1F>(Form(
"h_summaryNormX%s_%d", aliTypeName, i),
1328 title +
"#LT #Delta x'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1331 sumContainer.summaryYResiduals_
1332 = tfd.
make<TH1F>(Form(
"h_summaryY%s_%d", aliTypeName, i),
1333 title +
"#LT #Delta y' #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1334 sumContainer.summaryNormYResiduals_
1335 = tfd.
make<TH1F>(Form(
"h_summaryNormY%s_%d", aliTypeName, i),
1336 title +
"#LT #Delta y'/#sigma #GT", (2*aliSize), 0.5, 2*aliSize+0.5);
1340 edm::LogError(
"TrackerOfflineValidation") <<
"@SUB=TrackerOfflineValidation::bookSummaryHists"
1341 <<
"No summary histogramm for hierarchy level "
1342 << aliTypeName <<
" in subdet " << aliDetId.
subdetId();
1349 double xmin = 0., xmax = 0.;
1350 const TString sumTitle(Form(
"Residual for %s %d in %s;", aliTypeName, i, typeName));
1354 sumContainer.sumXResiduals_ = tfd.
make<TH1F>(Form(
"h_Xprime_%s_%d", aliTypeName, i),
1359 sumContainer.sumNormXResiduals_ = tfd.
make<TH1F>(Form(
"h_NormXprime_%s_%d",aliTypeName,i),
1364 sumContainer.sumYResiduals_ = tfd.
make<TH1F>(Form(
"h_Yprime_%s_%d",aliTypeName,i),
1369 sumContainer.sumNormYResiduals_ = tfd.
make<TH1F>(Form(
"h_NormYprime_%s_%d",aliTypeName,i),
1378 for(uint
k = 0;
k < aliSize; ++
k) {
1391 for(uint
k = 0;
k < aliSize; ++
k) {
1392 for(uint
j = 0;
j < subcompSize; ++
j) {
1405 return sumContainer;
1412 float max = hist->GetMaximum();
1413 int left = -1, right = -1;
1414 for(
unsigned int i = 1, iEnd = hist->GetNbinsX();
i <= iEnd; ++
i) {
1415 if(hist->GetBinContent(
i) < max/2. && hist->GetBinContent(
i+1) > max/2. && left == -1) {
1416 if(max/2. - hist->GetBinContent(
i) < hist->GetBinContent(
i+1) - max/2.) {
1424 if(left != -1 && right == -1) {
1425 if(hist->GetBinContent(
i) > max/2. && hist->GetBinContent(
i+1) < max/2.) {
1426 if( hist->GetBinContent(
i) - max/2. < max/2. - hist->GetBinContent(
i+1)) {
1435 return hist->GetXaxis()->GetBinCenter(right) - hist->GetXaxis()->GetBinCenter(left);
1441 const std::map<int, TrackerOfflineValidation::ModuleHistos>& moduleHist_,
1445 for(std::map<int, TrackerOfflineValidation::ModuleHistos>::const_iterator it = moduleHist_.begin(),
1446 itEnd= moduleHist_.end(); it != itEnd;++it ) {
1450 DetId detId_ = it->first;
1457 unsigned int whichHalfBarrel(1), rawId(detId_.
rawId());
1458 if( (rawId>=302056964 && rawId<302059300) || (rawId>=302123268 && rawId<302127140) || (rawId>=302189572 && rawId<302194980) )whichHalfBarrel=2;
1460 treeMem.
half = whichHalfBarrel;
1465 unsigned int whichHalfCylinder(1), rawId(detId_.
rawId());
1466 if( (rawId>=352394500 && rawId<352406032) || (rawId>=352460036 && rawId<352471568) || (rawId>=344005892 && rawId<344017424) || (rawId>=344071428 && rawId<344082960) )whichHalfCylinder=2;
1469 treeMem.
half = whichHalfCylinder;
1475 unsigned int whichHalfShell(1), rawId(detId_.
rawId());
1476 if ( (rawId>=369120484 && rawId<369120688) || (rawId>=369121540 && rawId<369121776) || (rawId>=369136932 && rawId<369137200) || (rawId>=369137988 && rawId<369138288) ||
1477 (rawId>=369153396 && rawId<369153744) || (rawId>=369154436 && rawId<369154800) || (rawId>=369169844 && rawId<369170256) || (rawId>=369170900 && rawId<369171344) ||
1478 (rawId>=369124580 && rawId<369124784) || (rawId>=369125636 && rawId<369125872) || (rawId>=369141028 && rawId<369141296) || (rawId>=369142084 && rawId<369142384) ||
1479 (rawId>=369157492 && rawId<369157840) || (rawId>=369158532 && rawId<369158896) || (rawId>=369173940 && rawId<369174352) || (rawId>=369174996 && rawId<369175440) ) whichHalfShell=2;
1482 treeMem.
half = whichHalfShell;
1500 treeMem.
side = tobId.
rod()[0];
1501 treeMem.
rod = tobId.
rod()[1];
1522 treeMem.
posX = gPModule.
x();
1523 treeMem.
posY = gPModule.
y();
1524 treeMem.
posZ = gPModule.
z();
1529 LocalPoint lUDirection(1.,0.,0.), lVDirection(0.,1.,0.), lWDirection(0.,0.,1.);
1531 gVDirection = surface.
toGlobal(lVDirection),
1532 gWDirection = surface.
toGlobal(lWDirection);
1533 double dR(999.),
dPhi(999.), dZ(999.);
1535 dR = gWDirection.perp() - gPModule.
perp();
1537 dZ = gVDirection.z() - gPModule.
z();
1540 dR = gUDirection.
perp() - gPModule.
perp();
1542 dZ = gWDirection.z() - gPModule.
z();
1545 dR = gVDirection.perp() - gPModule.
perp();
1547 dZ = gWDirection.z() - gPModule.
z();
1555 treeMem.
entries =
static_cast<UInt_t>(it->second.ResXprimeHisto->GetEntries());
1556 treeMem.
meanX = it->second.ResXprimeHisto->GetMean();
1557 treeMem.
rmsX = it->second.ResXprimeHisto->GetRMS();
1563 std::pair<float,float> fitResult1 = this->
fitResiduals(it->second.ResXprimeHisto);
1564 treeMem.
fitMeanX = fitResult1.first;
1567 std::pair<float,float> fitResult2 = this->
fitResiduals(it->second.NormResXprimeHisto);
1575 int numberOfBins=it->second.ResXprimeHisto->GetNbinsX();
1577 treeMem.
numberOfOverflows = it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1578 treeMem.
numberOfOutliers = it->second.ResXprimeHisto->GetBinContent(0)+it->second.ResXprimeHisto->GetBinContent(numberOfBins+1);
1581 treeMem.
meanNormX = it->second.NormResXprimeHisto->GetMean();
1582 treeMem.
rmsNormX = it->second.NormResXprimeHisto->GetRMS();
1585 it->second.NormResXprimeHisto->GetStats(stats);
1587 if (stats[0]) treeMem.
chi2PerDofX = stats[3]/stats[0];
1590 treeMem.
histNameX = it->second.ResXprimeHisto->GetName();
1591 treeMem.
histNameNormX = it->second.NormResXprimeHisto->GetName();
1595 treeMem.
meanLocalX = it->second.ResHisto->GetMean();
1596 treeMem.
rmsLocalX = it->second.ResHisto->GetRMS();
1602 if (it->second.ResYHisto) treeMem.
histNameLocalY = it->second.ResYHisto->GetName();
1607 if (it->second.ResYprimeHisto) {
1608 TH1 *
h = it->second.ResYprimeHisto;
1609 treeMem.
meanY = h->GetMean();
1610 treeMem.
rmsY = h->GetRMS();
1613 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1614 treeMem.
fitMeanY = fitMeanSigma.first;
1615 treeMem.
fitSigmaY = fitMeanSigma.second;
1623 if (it->second.NormResYprimeHisto) {
1624 TH1 *
h = it->second.NormResYprimeHisto;
1628 if (stats[0]) treeMem.
chi2PerDofY = stats[3]/stats[0];
1631 std::pair<float,float> fitMeanSigma = this->
fitResiduals(h);
1642 std::pair<float,float>
1645 std::pair<float,float> fitResult(9999., 9999.);
1646 if (!hist || hist->GetEntries() < 20)
return fitResult;
1648 float mean = hist->GetMean();
1649 float sigma = hist->GetRMS();
1654 TF1 func(
"tmp",
"gaus", mean - 2.*sigma, mean + 2.*sigma);
1655 if (0 == hist->Fit(&func,
"QNR")) {
1656 mean = func.GetParameter(1);
1657 sigma = func.GetParameter(2);
1659 func.SetRange(mean - 3.*sigma, mean + 3.*sigma);
1662 if (0 == hist->Fit(&func,
"Q0LR")) {
1663 if (hist->GetFunction(func.GetName())) {
1664 hist->GetFunction(func.GetName())->ResetBit(TF1::kNotDraw);
1666 fitResult.first = func.GetParameter(1);
1667 fitResult.second = func.GetParameter(2);
1671 edm::LogWarning(
"Alignment") <<
"@SUB=TrackerOfflineValidation::fitResiduals"
1672 <<
"Caught this exception during ROOT fit: "
1683 int nbins = histo->GetNbinsX();
1686 double *
x =
new double[
nbins];
1687 double *
y =
new double[
nbins];
1689 x[
j] = histo->GetBinCenter(
j+1);
1690 y[
j] = histo->GetBinContent(
j+1);
1692 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 isDoubleSide() const
unsigned int panel() const
panel id
std::vector< TH1 * > vDeleteObjects_
void bookDirHists(DirectoryWrapper &tfd, const Alignable &ali, const AlignableObjectId &aliobjid)
std::map< int, TrackerOfflineValidation::ModuleHistos > mPxeResiduals_
std::vector< TH1 * > vTrackHistos_
~TrackerOfflineValidation()
unsigned int layer() const
layer id
void bookHists(DirectoryWrapper &tfd, const Alignable &ali, align::StructureType type, int i, const AlignableObjectId &aliobjid)
TH1 * make(const char *name, const char *title, int nBinX, double minBinX, double maxBinX)
virtual uint32_t stereo() const
Float_t numberOfOverflows
bool isPixel(uint32_t subDetId)
void fillTree(TTree &tree, const std::map< int, TrackerOfflineValidation::ModuleHistos > &moduleHist_, TkOffTreeVariables &treeMem, const TrackerGeometry &tkgeom)
double deltaPhi(float phi1, float phi2)
bool isDoubleSide() 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)
virtual void analyze(const edm::Event &, const edm::EventSetup &)
std::string directoryString
container to hold data to be written into TTree
const bool stripYResiduals_
const bool useOverflowForRMS_
Geom::Phi< T > phi() const
edm::ESHandle< TrackerGeometry > tkGeom_
int GetIndex(const std::vector< OBJECT_TYPE * > &vec, const TString &name)
unsigned int ladder() const
ladder id
const std::string & typeToName(align::StructureType type) const
Convert type to name.
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)
virtual Alignables components() const =0
Return vector of all direct components.
std::map< int, TrackerOfflineValidation::ModuleHistos > mTibResiduals_
std::vector< unsigned int > string() const
string id
unsigned int module() const
det id
unsigned int layer() const
layer id
unsigned int side() const
positive or negative id
TProfile * ResXvsYProfile
TH1 * summaryNormYResiduals_
std::vector< unsigned int > rod() const
rod id
unsigned int blade() const
blade id
std::map< int, TrackerOfflineValidation::ModuleHistos > mTidResiduals_
uint32_t rawId() const
get the raw id
TProfile * ResYvsYProfile
std::map< std::pair< uint32_t, uint32_t >, TH1 * > hOverlappResidual
virtual const DetIdContainer & detIds() const
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
std::vector< unsigned int > petal() const
petal id
const Surface::PositionType & position() const
The position (origin of the R.F.)
TH1 * summaryNormXResiduals_
std::string histNameNormX
double dPhi(double phi1, double phi2)
void getBinning(uint32_t subDetId, TrackerOfflineValidation::HistogrammType residualtype, int &nBinsX, double &lowerBoundX, double &upperBoundX)
const T & max(const T &a, const T &b)
unsigned int ring() const
ring id
Tan< T >::type tan(const T &t)
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
unsigned int module() const
det id
Allows conversion between type and name, and vice-versa.
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)
unsigned int module() const
det id
std::vector< unsigned int > module() const
det id
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
unsigned int disk() const
disk id
std::string histNameNormLocalX
bool isDetOrDetUnit(align::StructureType type)
std::map< int, TrackerOfflineValidation::ModuleHistos > mTobResiduals_
DirectoryWrapper(const std::string &newDir, const std::string &basedir, bool useDqmMode)
void collateSummaryHists(DirectoryWrapper &tfd, const Alignable &ali, int i, const AlignableObjectId &aliobjid, std::vector< TrackerOfflineValidation::SummaryContainer > &vLevelProfiles)
const std::string moduleDirectory_
std::pair< float, float > fitResiduals(TH1 *hist) const
unsigned int module() const
detector id
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
unsigned int side() const
positive or negative id
std::string histNameLocalX
std::auto_ptr< TFileDirectory > tfd
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 wheel() const
wheel id
unsigned int layer() const
layer id
void clear()
set to empty values
void bookGlobalHists(DirectoryWrapper &tfd)
DirectoryWrapper(const DirectoryWrapper &upDir, const std::string &newDir, const std::string &basedir, bool useDqmMode)
virtual const DetIdContainer & detUnitIds() const
Returm a vector of all GeomDetUnit DetIds.
unsigned int ring() const
ring id
TrackerOfflineValidation::SummaryContainer bookSummaryHists(DirectoryWrapper &tfd, const Alignable &ali, align::StructureType type, int i, const AlignableObjectId &aliobjid)
T * make() const
make new ROOT object
bool isDoubleSide() const
unsigned int side() const
positive or negative id
TProfile * ResXvsXProfile
std::vector< TH1 * > vTrackProfiles_
std::pair< int, int > typeAndLayerFromDetId(const DetId &detId) const
unsigned int module() const
detector id
std::map< int, TrackerOfflineValidation::ModuleHistos > mPxbResiduals_
std::string histNameNormY
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Detector det() const
get the detector field from this detid
const edm::ParameterSet parSet_
TrackerOfflineValidation(const edm::ParameterSet &)
float Fwhm(const TH1 *hist) const
virtual const BoundPlane & surface() const
The nominal surface of the GeomDet.
tuple size
Write out results.
TProfile * ResYvsXProfile
bool isDoubleSide() const
unsigned int wheel() const
wheel id
bool isBarrel(uint32_t subDetId)