40 #include "CLHEP/Matrix/SymMatrix.h"
54 #include "TDirectory.h"
106 parameterSet_(iConfig),
125 std::ifstream inputFileStream;
127 inputFileStream.open(inputFileName.c_str());
128 if(inputFileStream.is_open()){
129 inputFile_ =
new TFile(inputFileName.c_str(),
"READ");
132 edm::LogInfo(
"CalculateAPE")<<
"Input file from loop over tracks and corresponding hits sucessfully opened";
136 <<
"...APE calculation stopped. Please check path of input file name in config:\n"
139 "Bad input file name");
148 TString pluginName(
inputFile_->GetListOfKeys()->At(0)->GetName());
151 TDirectory *sectorDir(0), *intervalDir(0);
152 bool sectorBool(
true);
153 for(
unsigned int iSector(1);sectorBool;++iSector){
154 std::stringstream sectorName, fullSectorName;
155 sectorName <<
"Sector_" << iSector <<
"/";
156 fullSectorName << pluginName << sectorName.str();
157 TString
fullName(fullSectorName.str().c_str());
162 sectorDir->GetObject(
"z_name;1", tkSector.
Name);
163 tkSector.
name = tkSector.
Name->GetTitle();
164 bool intervalBool(
true);
165 for(
unsigned int iInterval(1);intervalBool;++iInterval){
166 std::stringstream intervalName, fullIntervalName;
167 intervalName <<
"Interval_" << iInterval <<
"/";
168 fullIntervalName << fullSectorName.str() << intervalName.str();
169 fullName = fullIntervalName.str().c_str();
172 intervalDir->GetObject(
"h_sigmaX;1", tkSector.
m_binnedHists[iInterval][
"sigmaX"]);
173 intervalDir->GetObject(
"h_norResX;1", tkSector.
m_binnedHists[iInterval][
"norResX"]);
174 intervalDir->GetObject(
"h_sigmaY;1", tkSector.
m_binnedHists[iInterval][
"sigmaY"]);
175 intervalDir->GetObject(
"h_norResY;1", tkSector.
m_binnedHists[iInterval][
"norResY"]);
181 intervalBool =
false;
182 if(iSector==1)
edm::LogInfo(
"CalculateAPE")<<
"There are "<<iInterval-1<<
" intervals per sector defined in input file";
185 TDirectory *resultsDir(0);
186 std::stringstream fullResultName;
187 fullResultName << fullSectorName.str() <<
"Results/";
188 fullName = fullResultName.str().c_str();
191 resultsDir->GetObject(
"h_entriesX;1", tkSector.
EntriesX);
192 if(tkSector.
isPixel)resultsDir->GetObject(
"h_entriesY;1", tkSector.
EntriesY);
194 resultsDir->GetObject(
"rawIdTree", rawIdTree);
195 unsigned int rawId(0);
196 rawIdTree->SetBranchAddress(
"RawId", &rawId);
197 for(Int_t entry=0; entry<rawIdTree->GetEntries(); ++entry){
198 rawIdTree->GetEntry(entry);
200 bool alreadyAdded(
false);
201 for(std::vector<unsigned int>::const_iterator i_rawId = tkSector.
v_rawId.begin(); i_rawId != tkSector.
v_rawId.end(); ++i_rawId){
202 if(rawId==*i_rawId)alreadyAdded =
true;
204 if(alreadyAdded)
break;
205 tkSector.
v_rawId.push_back(rawId);
212 edm::LogInfo(
"CalculateAPE")<<
"There are "<<iSector-1<<
" sectors defined in input file";
222 for(std::map<unsigned int,TrackerSectorStruct>::iterator i_sector=
m_tkSector_.begin(); i_sector!=
m_tkSector_.end(); ++i_sector){
223 (*i_sector).second.WeightX =
new TH1F(
"h_weightX",
"relative weight w_{x}/w_{tot,x};#sigma_{x} [#mum];w_{x}/w_{tot,x}",v_binX.size()-1,&(v_binX[0]));
224 (*i_sector).second.MeanX =
new TH1F(
"h_meanX",
"residual mean <r_{x}/#sigma_{r,x}>;#sigma_{x} [#mum];<r_{x}/#sigma_{r,x}>",v_binX.size()-1,&(v_binX[0]));
225 (*i_sector).second.RmsX =
new TH1F(
"h_rmsX",
"residual rms RMS(r_{x}/#sigma_{r,x});#sigma_{x} [#mum];RMS(r_{x}/#sigma_{r,x})",v_binX.size()-1,&(v_binX[0]));
226 (*i_sector).second.FitMeanX1 =
new TH1F(
"h_fitMeanX1",
"fitted residual mean #mu_{x};#sigma_{x} [#mum];#mu_{x}",v_binX.size()-1,&(v_binX[0]));
227 (*i_sector).second.ResidualWidthX1 =
new TH1F(
"h_residualWidthX1",
"residual width #Delta_{x};#sigma_{x} [#mum];#Delta_{x}",v_binX.size()-1,&(v_binX[0]));
228 (*i_sector).second.CorrectionX1 =
new TH1F(
"h_correctionX1",
"correction to APE_{x};#sigma_{x} [#mum];#Delta#sigma_{align,x} [#mum]",v_binX.size()-1,&(v_binX[0]));
229 (*i_sector).second.FitMeanX2 =
new TH1F(
"h_fitMeanX2",
"fitted residual mean #mu_{x};#sigma_{x} [#mum];#mu_{x}",v_binX.size()-1,&(v_binX[0]));
230 (*i_sector).second.ResidualWidthX2 =
new TH1F(
"h_residualWidthX2",
"residual width #Delta_{x};#sigma_{x} [#mum];#Delta_{x}",v_binX.size()-1,&(v_binX[0]));
231 (*i_sector).second.CorrectionX2 =
new TH1F(
"h_correctionX2",
"correction to APE_{x};#sigma_{x} [#mum];#Delta#sigma_{align,x} [#mum]",v_binX.size()-1,&(v_binX[0]));
233 if((*i_sector).second.isPixel){
234 (*i_sector).second.WeightY =
new TH1F(
"h_weightY",
"relative weight w_{y}/w_{tot,y};#sigma_{y} [#mum];w_{y}/w_{tot,y}",v_binX.size()-1,&(v_binX[0]));
235 (*i_sector).second.MeanY =
new TH1F(
"h_meanY",
"residual mean <r_{y}/#sigma_{r,y}>;#sigma_{y} [#mum];<r_{y}/#sigma_{r,y}>",v_binX.size()-1,&(v_binX[0]));
236 (*i_sector).second.RmsY =
new TH1F(
"h_rmsY",
"residual rms RMS(r_{y}/#sigma_{r,y});#sigma_{y} [#mum];RMS(r_{y}/#sigma_{r,y})",v_binX.size()-1,&(v_binX[0]));
237 (*i_sector).second.FitMeanY1 =
new TH1F(
"h_fitMeanY1",
"fitted residual mean #mu_{y};#sigma_{y} [#mum];#mu_{y}",v_binX.size()-1,&(v_binX[0]));
238 (*i_sector).second.ResidualWidthY1 =
new TH1F(
"h_residualWidthY1",
"residual width #Delta_{y};#sigma_{y} [#mum];#Delta_{y}",v_binX.size()-1,&(v_binX[0]));
239 (*i_sector).second.CorrectionY1 =
new TH1F(
"h_correctionY1",
"correction to APE_{y};#sigma_{y} [#mum];#Delta#sigma_{align,y} [#mum]",v_binX.size()-1,&(v_binX[0]));
240 (*i_sector).second.FitMeanY2 =
new TH1F(
"h_fitMeanY2",
"fitted residual mean #mu_{y};#sigma_{y} [#mum];#mu_{y}",v_binX.size()-1,&(v_binX[0]));
241 (*i_sector).second.ResidualWidthY2 =
new TH1F(
"h_residualWidthY2",
"residual width #Delta_{y};#sigma_{y} [#mum];#Delta_{y}",v_binX.size()-1,&(v_binX[0]));
242 (*i_sector).second.CorrectionY2 =
new TH1F(
"h_correctionY2",
"correction to APE_{y};#sigma_{y} [#mum];#Delta#sigma_{align,y} [#mum]",v_binX.size()-1,&(v_binX[0]));
251 std::vector<double> v_binX;
253 for(
int iBin=1; iBin<=EntriesX->GetNbinsX()+1; ++iBin){
254 v_binX.push_back(EntriesX->GetBinLowEdge(iBin));
263 TDirectory* baseDir = resultsFile->mkdir(
"ApeEstimatorSummary");
264 for(std::map<unsigned int,TrackerSectorStruct>::const_iterator i_sector=
m_tkSector_.begin(); i_sector!=
m_tkSector_.end(); ++i_sector){
266 dirName<<
"Sector_" << (*i_sector).first;
267 TDirectory*
dir = baseDir->mkdir(dirName.str().c_str());
270 (*i_sector).second.Name->Write();
272 (*i_sector).second.WeightX->Write();
273 (*i_sector).second.MeanX->Write();
274 (*i_sector).second.RmsX->Write();
275 (*i_sector).second.FitMeanX1->Write();
276 (*i_sector).second.ResidualWidthX1 ->Write();
277 (*i_sector).second.CorrectionX1->Write();
278 (*i_sector).second.FitMeanX2->Write();
279 (*i_sector).second.ResidualWidthX2->Write();
280 (*i_sector).second.CorrectionX2->Write();
282 if((*i_sector).second.isPixel){
283 (*i_sector).second.WeightY->Write();
284 (*i_sector).second.MeanY->Write();
285 (*i_sector).second.RmsY->Write();
286 (*i_sector).second.FitMeanY1->Write();
287 (*i_sector).second.ResidualWidthY1 ->Write();
288 (*i_sector).second.CorrectionY1->Write();
289 (*i_sector).second.FitMeanY2->Write();
290 (*i_sector).second.ResidualWidthY2->Write();
291 (*i_sector).second.CorrectionY2->Write();
294 resultsFile->Close();
307 TFile* baselineFile(0);
308 TTree* baselineTreeX(0);
309 TTree* baselineTreeY(0);
310 TTree* sectorNameBaselineTree(0);
312 std::ifstream baselineFileStream;
314 baselineFileStream.open(baselineFileName.c_str());
315 if(baselineFileStream.is_open()){
316 baselineFileStream.close();
317 baselineFile =
new TFile(baselineFileName.c_str(),
"READ");
320 edm::LogInfo(
"CalculateAPE")<<
"Baseline file for APE values sucessfully opened";
321 baselineFile->GetObject(
"iterTreeX;1",baselineTreeX);
322 baselineFile->GetObject(
"iterTreeY;1",baselineTreeY);
323 baselineFile->GetObject(
"nameTree;1",sectorNameBaselineTree);
326 edm::LogWarning(
"CalculateAPE")<<
"There is NO baseline file for APE values, so normalized residual width =1 for ideal conditions is assumed";
333 TFile* iterationFile =
new TFile(iterationFileName.c_str(),setBaseline ?
"RECREATE" :
"UPDATE");
337 TTree* iterationTreeX(0);
338 TTree* iterationTreeY(0);
339 iterationFile->GetObject(
"iterTreeX;1",iterationTreeX);
340 iterationFile->GetObject(
"iterTreeY;1",iterationTreeY);
342 TTree* sectorNameTree(0);
343 iterationFile->GetObject(
"nameTree;1",sectorNameTree);
345 bool firstIter(
false);
349 iterationTreeX =
new TTree(
"iterTreeX",
"Tree for APE x values of all iterations");
350 iterationTreeY =
new TTree(
"iterTreeY",
"Tree for APE y values of all iterations");
351 edm::LogInfo(
"CalculateAPE")<<
"First APE iteration (number 0.), create iteration file with TTree";
352 sectorNameTree =
new TTree(
"nameTree",
"Tree with names of sectors");
355 iterationTreeX =
new TTree(
"iterTreeX",
"Tree for baseline x values of normalized residual width");
356 iterationTreeY =
new TTree(
"iterTreeY",
"Tree for baseline y values of normalized residual width");
357 edm::LogInfo(
"CalculateAPE")<<
"Set baseline, create baseline file with TTree";
358 sectorNameTree =
new TTree(
"nameTree",
"Tree with names of sectors");
362 const unsigned int iteration(iterationTreeX->GetEntries());
363 edm::LogWarning(
"CalculateAPE")<<
"NOT the first APE iteration (number 0.) but the "<<
iteration<<
". one, is this wanted or forgot to delete old iteration file with TTree?";
368 double a_apeSectorX[16589];
369 double a_apeSectorY[16589];
370 double a_baselineSectorX[16589];
371 double a_baselineSectorY[16589];
375 std::map<unsigned int, TrackerSectorStruct>::const_iterator i_sector;
377 const unsigned int iSector(i_sector->first);
378 const bool pixelSector(i_sector->second.isPixel);
379 a_apeSectorX[iSector] = 99.;
380 a_apeSectorY[iSector] = 99.;
381 a_baselineSectorX[iSector] = -99.;
382 a_baselineSectorY[iSector] = -99.;
384 a_sectorName[iSector] = 0;
385 a_sectorBaselineName[iSector] = 0;
386 std::stringstream ss_sector, ss_sectorSuffixed;
387 ss_sector <<
"Ape_Sector_" << iSector;
388 if(!setBaseline && baselineTreeX){
389 baselineTreeX->SetBranchAddress(ss_sector.str().c_str(), &a_baselineSectorX[iSector]);
390 baselineTreeX->GetEntry(0);
392 baselineTreeY->SetBranchAddress(ss_sector.str().c_str(), &a_baselineSectorY[iSector]);
393 baselineTreeY->GetEntry(0);
395 sectorNameBaselineTree->SetBranchAddress(ss_sector.str().c_str(), &a_sectorBaselineName[iSector]);
396 sectorNameBaselineTree->GetEntry(0);
400 a_baselineSectorX[iSector] = 1.;
401 a_baselineSectorY[iSector] = 1.;
404 ss_sectorSuffixed << ss_sector.str() <<
"/D";
405 iterationTreeX->Branch(ss_sector.str().c_str(), &a_apeSectorX[iSector], ss_sectorSuffixed.str().c_str());
407 iterationTreeY->Branch(ss_sector.str().c_str(), &a_apeSectorY[iSector], ss_sectorSuffixed.str().c_str());
409 sectorNameTree->Branch(ss_sector.str().c_str(), &a_sectorName[iSector], 32000, 00);
412 iterationTreeX->SetBranchAddress(ss_sector.str().c_str(), &a_apeSectorX[iSector]);
413 iterationTreeX->GetEntry(iterationTreeX->GetEntries()-1);
415 iterationTreeY->SetBranchAddress(ss_sector.str().c_str(), &a_apeSectorY[iSector]);
416 iterationTreeY->GetEntry(iterationTreeY->GetEntries()-1);
418 sectorNameTree->SetBranchAddress(ss_sector.str().c_str(), &a_sectorName[iSector]);
419 sectorNameTree->GetEntry(0);
425 for(std::map<unsigned int,TrackerSectorStruct>::iterator i_sector =
m_tkSector_.begin(); i_sector !=
m_tkSector_.end(); ++i_sector){
428 const std::string& nameLastIter(*a_sectorName[(*i_sector).first]);
429 if(name!=nameLastIter){
430 edm::LogError(
"CalculateAPE")<<
"Inconsistent sector definition in iterationFile for sector "<<i_sector->first<<
",\n"
431 <<
"Recent iteration has name \""<<name<<
"\", while previous had \""<<nameLastIter<<
"\"\n"
432 <<
"...APE calculation stopped. Please check sector definitions in config!\n";
436 else a_sectorName[(*i_sector).first] =
new std::string(name);
437 if(!setBaseline && baselineFile){
438 const std::string& nameBaseline(*a_sectorBaselineName[(*i_sector).first]);
439 if(name!=nameBaseline){
440 edm::LogError(
"CalculateAPE")<<
"Inconsistent sector definition in baselineFile for sector "<<i_sector->first<<
",\n"
441 <<
"Recent iteration has name \""<<name<<
"\", while baseline had \""<<nameBaseline<<
"\"\n"
442 <<
"...APE calculation stopped. Please check sector definitions in config!\n";
450 std::ofstream apeOutputFile;
453 apeOutputFile.open(apeOutputFileName.c_str());
454 if(apeOutputFile.is_open()){
455 edm::LogInfo(
"CalculateAPE")<<
"Text file for writing APE values successfully opened";
457 edm::LogError(
"CalculateAPE")<<
"Text file for writing APE values NOT opened,\n"
458 <<
"...APE calculation stopped. Please check path of text file name in config:\n"
459 <<
"\t"<<apeOutputFileName;
470 if(apeWeightName==
"unity") apeWeight =
wUnity;
471 else if(apeWeightName==
"entries")apeWeight =
wEntries;
474 edm::LogError(
"CalculateAPE")<<
"Invalid parameter 'apeWeight' in cfg file: \""<<apeWeightName
475 <<
"\"\nimplemented apeWeights are \"unity\", \"entries\", \"entriesOverSigmaX2\""
476 <<
"\n...APE calculation stopped.";
484 if(smoothFraction<=0. || smoothFraction>1.){
485 edm::LogError(
"CalculateAPE")<<
"Incorrect parameter in cfg file,"
486 <<
"\nsmoothFraction has to be in [0,1], but is "<<smoothFraction
487 <<
"\n...APE calculation stopped.";
490 for(std::map<unsigned int,TrackerSectorStruct>::iterator i_sector =
m_tkSector_.begin(); i_sector !=
m_tkSector_.end(); ++i_sector){
492 typedef std::pair<double,double> Error2AndResidualWidth2PerBin;
493 typedef std::pair<double,Error2AndResidualWidth2PerBin> WeightAndResultsPerBin;
494 std::vector<WeightAndResultsPerBin> v_weightAndResultsPerBinX;
495 std::vector<WeightAndResultsPerBin> v_weightAndResultsPerBinY;
498 double baselineWidthX2(a_baselineSectorX[(*i_sector).first]);
499 double baselineWidthY2(a_baselineSectorY[(*i_sector).first]);
503 for(std::map<
unsigned int, std::map<std::string,TH1*> >::const_iterator i_errBins = (*i_sector).second.m_binnedHists.begin();
504 i_errBins != (*i_sector).second.m_binnedHists.end(); ++i_errBins){
505 std::map<std::string,TH1*> mHists = (*i_errBins).second;
507 double entriesX = mHists[
"sigmaX"]->GetEntries();
508 double meanSigmaX = mHists[
"sigmaX"]->GetMean();
511 double xMin = mHists[
"norResX"]->GetXaxis()->GetXmin();
512 double xMax = mHists[
"norResX"]->GetXaxis()->GetXmax();
513 double integralX = mHists[
"norResX"]->Integral();
514 double meanX = mHists[
"norResX"]->GetMean();
515 double rmsX = mHists[
"norResX"]->GetRMS();
516 double maximumX = mHists[
"norResX"]->GetBinContent(mHists[
"norResX"]->GetMaximumBin());
520 TF1 funcX_1(
"mygausX",
"gaus", xMin, xMax);
521 funcX_1.SetParameters(maximumX, meanX, rmsX);
522 TString fitOpt(
"ILERQ");
524 if(integralX>minHitsPerInterval){
525 if(mHists[
"norResX"]->
Fit(&funcX_1, fitOpt)){
526 edm::LogWarning(
"CalculateAPE")<<
"Fit1 did not work: "<<mHists[
"norResX"]->Fit(&funcX_1, fitOpt);
529 fitResultX = mHists[
"norResX"]->Fit(&funcX_1, fitOpt);
530 std::cout<<
"FitResult1\t"<<fitResultX<<
"\n";
532 Double_t meanX_1 = funcX_1.GetParameter(1);
533 Double_t sigmaX_1 = funcX_1.GetParameter(2);
537 TF1 funcX_2(
"mygausX2",
"gaus",meanX_1 - sigmaFactorFit*
TMath::Abs(sigmaX_1), meanX_1 + sigmaFactorFit*
TMath::Abs(sigmaX_1));
538 funcX_2.SetParameters(funcX_1.GetParameter(0),meanX_1,sigmaX_1);
539 if(integralX>minHitsPerInterval){
540 if(mHists[
"norResX"]->
Fit(&funcX_2, fitOpt)){
541 edm::LogWarning(
"CalculateAPE")<<
"Fit2 did not work for x : "<<mHists[
"norResX"]->Fit(&funcX_2, fitOpt);
544 fitResultX = mHists[
"norResX"]->Fit(&funcX_2, fitOpt);
546 Double_t meanX_2 = funcX_2.GetParameter(1);
547 Double_t sigmaX_2 = funcX_2.GetParameter(2);
552 double meanSigmaY(0.);
553 if((*i_sector).second.isPixel){
554 entriesY = mHists[
"sigmaY"]->GetEntries();
555 meanSigmaY = mHists[
"sigmaY"]->GetMean();
558 Double_t meanY_1(0.);
559 Double_t sigmaY_1(0.);
560 Double_t meanY_2(0.);
561 Double_t sigmaY_2(0.);
564 if((*i_sector).second.isPixel){
566 double yMin = mHists[
"norResY"]->GetXaxis()->GetXmin();
567 double yMax = mHists[
"norResY"]->GetXaxis()->GetXmax();
568 double integralY = mHists[
"norResY"]->Integral();
569 meanY = mHists[
"norResY"]->GetMean();
570 rmsY = mHists[
"norResY"]->GetRMS();
571 double maximumY = mHists[
"norResY"]->GetBinContent(mHists[
"norResY"]->GetMaximumBin());
574 TF1 funcY_1(
"mygausY",
"gaus", yMin, yMax);
575 funcY_1.SetParameters(maximumY, meanY, rmsY);
577 if(integralY>minHitsPerInterval){
578 if(mHists[
"norResY"]->
Fit(&funcY_1, fitOpt)){
579 edm::LogWarning(
"CalculateAPE")<<
"Fit1 did not work: "<<mHists[
"norResY"]->Fit(&funcY_1, fitOpt);
582 fitResultY = mHists[
"norResY"]->Fit(&funcY_1, fitOpt);
583 std::cout<<
"FitResult2\t"<<fitResultY<<
"\n";
585 meanY_1 = funcY_1.GetParameter(1);
586 sigmaY_1 = funcY_1.GetParameter(2);
589 TF1 funcY_2(
"mygausY2",
"gaus",meanY_1 - sigmaFactorFit*
TMath::Abs(sigmaY_1), meanY_1 + sigmaFactorFit*
TMath::Abs(sigmaY_1));
590 funcY_2.SetParameters(funcY_1.GetParameter(0),meanY_1,sigmaY_1);
591 if(integralY>minHitsPerInterval){
592 if(mHists[
"norResY"]->
Fit(&funcY_2, fitOpt)){
593 edm::LogWarning(
"CalculateAPE")<<
"Fit2 did not work for y : "<<mHists[
"norResY"]->Fit(&funcY_2, fitOpt);
596 fitResultY = mHists[
"norResY"]->Fit(&funcY_2, fitOpt);
598 meanY_2 = funcY_2.GetParameter(1);
599 sigmaY_2 = funcY_2.GetParameter(2);
605 double fitMeanX_1(meanX_1), fitMeanX_2(meanX_2);
606 double residualWidthX_1(sigmaX_1), residualWidthX_2(sigmaX_2);
607 double fitMeanY_1(meanY_1), fitMeanY_2(meanY_2);
608 double residualWidthY_1(sigmaY_1), residualWidthY_2(sigmaY_2);
610 double correctionX2_1(-0.0010), correctionX2_2(-0.0010);
611 double correctionY2_1(-0.0010), correctionY2_2(-0.0010);
612 correctionX2_1 = meanSigmaX*meanSigmaX*(residualWidthX_1*residualWidthX_1 -baselineWidthX2);
613 correctionX2_2 = meanSigmaX*meanSigmaX*(residualWidthX_2*residualWidthX_2 -baselineWidthX2);
614 if((*i_sector).second.isPixel){
615 correctionY2_1 = meanSigmaY*meanSigmaY*(residualWidthY_1*residualWidthY_1 -baselineWidthY2);
616 correctionY2_2 = meanSigmaY*meanSigmaY*(residualWidthY_2*residualWidthY_2 -baselineWidthY2);
619 double correctionX_1 = correctionX2_1>=0. ?
std::sqrt(correctionX2_1) : -
std::sqrt(-correctionX2_1);
620 double correctionX_2 = correctionX2_2>=0. ?
std::sqrt(correctionX2_2) : -
std::sqrt(-correctionX2_2);
621 double correctionY_1 = correctionY2_1>=0. ?
std::sqrt(correctionY2_1) : -
std::sqrt(-correctionY2_1);
622 double correctionY_2 = correctionY2_2>=0. ?
std::sqrt(correctionY2_2) : -
std::sqrt(-correctionY2_2);
624 if(
isnan(correctionX_1))correctionX_1 = -0.0010;
625 if(
isnan(correctionX_2))correctionX_2 = -0.0010;
626 if(
isnan(correctionY_1))correctionY_1 = -0.0010;
627 if(
isnan(correctionY_2))correctionY_2 = -0.0010;
629 if(entriesX<minHitsPerInterval){
630 meanX = 0.; rmsX = -0.0010;
631 fitMeanX_1 = 0.; correctionX_1 = residualWidthX_1 = -0.0010;
632 fitMeanX_2 = 0.; correctionX_2 = residualWidthX_2 = -0.0010;
635 if(entriesY<minHitsPerInterval){
636 meanY = 0.; rmsY = -0.0010;
637 fitMeanY_1 = 0.; correctionY_1 = residualWidthY_1 = -0.0010;
638 fitMeanY_2 = 0.; correctionY_2 = residualWidthY_2 = -0.0010;
641 (*i_sector).second.MeanX ->SetBinContent((*i_errBins).first,meanX);
642 (*i_sector).second.RmsX ->SetBinContent((*i_errBins).first,rmsX);
644 (*i_sector).second.FitMeanX1 ->SetBinContent((*i_errBins).first,fitMeanX_1);
645 (*i_sector).second.ResidualWidthX1->SetBinContent((*i_errBins).first,residualWidthX_1);
646 (*i_sector).second.CorrectionX1 ->SetBinContent((*i_errBins).first,correctionX_1*10000.);
648 (*i_sector).second.FitMeanX2 ->SetBinContent((*i_errBins).first,fitMeanX_2);
649 (*i_sector).second.ResidualWidthX2->SetBinContent((*i_errBins).first,residualWidthX_2);
650 (*i_sector).second.CorrectionX2 ->SetBinContent((*i_errBins).first,correctionX_2*10000.);
652 if((*i_sector).second.isPixel){
653 (*i_sector).second.MeanY ->SetBinContent((*i_errBins).first,meanY);
654 (*i_sector).second.RmsY ->SetBinContent((*i_errBins).first,rmsY);
656 (*i_sector).second.FitMeanY1 ->SetBinContent((*i_errBins).first,fitMeanY_1);
657 (*i_sector).second.ResidualWidthY1->SetBinContent((*i_errBins).first,residualWidthY_1);
658 (*i_sector).second.CorrectionY1 ->SetBinContent((*i_errBins).first,correctionY_1*10000.);
660 (*i_sector).second.FitMeanY2 ->SetBinContent((*i_errBins).first,fitMeanY_2);
661 (*i_sector).second.ResidualWidthY2->SetBinContent((*i_errBins).first,residualWidthY_2);
662 (*i_sector).second.CorrectionY2 ->SetBinContent((*i_errBins).first,correctionY_2*10000.);
667 if(entriesX<minHitsPerInterval && entriesY<minHitsPerInterval)
continue;
680 weightX = entriesX/(meanSigmaX*meanSigmaX);
681 weightY = entriesY/(meanSigmaY*meanSigmaY);
684 const Error2AndResidualWidth2PerBin error2AndResidualWidth2PerBinX(meanSigmaX*meanSigmaX, residualWidthX_1*residualWidthX_1);
685 const WeightAndResultsPerBin weightAndResultsPerBinX(weightX, error2AndResidualWidth2PerBinX);
686 if(!(entriesX<minHitsPerInterval)){
688 (*i_sector).second.WeightX->SetBinContent((*i_errBins).first,weightX);
689 v_weightAndResultsPerBinX.push_back(weightAndResultsPerBinX);
692 const Error2AndResidualWidth2PerBin error2AndResidualWidth2PerBinY(meanSigmaY*meanSigmaY, residualWidthY_1*residualWidthY_1);
693 const WeightAndResultsPerBin weightAndResultsPerBinY(weightY, error2AndResidualWidth2PerBinY);
694 if(!(entriesY<minHitsPerInterval)){
696 (*i_sector).second.WeightY->SetBinContent((*i_errBins).first,weightY);
697 v_weightAndResultsPerBinY.push_back(weightAndResultsPerBinY);
704 if(v_weightAndResultsPerBinX.size()==0){
705 edm::LogError(
"CalculateAPE")<<
"NO error interval of sector "<<(*i_sector).first<<
" has a valid x APE calculated,\n...so cannot set APE";
709 if((*i_sector).second.isPixel && v_weightAndResultsPerBinY.size()==0){
710 edm::LogError(
"CalculateAPE")<<
"NO error interval of sector "<<(*i_sector).first<<
" has a valid y APE calculated,\n...so cannot set APE";
714 double correctionX2(999.);
715 double correctionY2(999.);
718 double weightSumX(0.);
719 std::vector<WeightAndResultsPerBin>::const_iterator i_apeBin;
720 for(i_apeBin=v_weightAndResultsPerBinX.begin(); i_apeBin!=v_weightAndResultsPerBinX.end(); ++i_apeBin){
721 weightSumX += i_apeBin->first;
723 (*i_sector).second.WeightX->Scale(1/weightSumX);
724 double weightSumY(0.);
725 if((*i_sector).second.isPixel){
726 std::vector<WeightAndResultsPerBin>::const_iterator i_apeBin;
727 for(i_apeBin=v_weightAndResultsPerBinY.begin(); i_apeBin!=v_weightAndResultsPerBinY.end(); ++i_apeBin){
728 weightSumY += i_apeBin->first;
730 (*i_sector).second.WeightY->Scale(1/weightSumY);
736 bool firstIntervalX(
true);
737 for(i_apeBin=v_weightAndResultsPerBinX.begin(); i_apeBin!=v_weightAndResultsPerBinX.end(); ++i_apeBin){
739 correctionX2 = i_apeBin->first*i_apeBin->second.first*(i_apeBin->second.second - baselineWidthX2);
740 firstIntervalX =
false;
743 correctionX2 += i_apeBin->first*i_apeBin->second.first*(i_apeBin->second.second - baselineWidthX2);
746 correctionX2 = correctionX2/weightSumX;
749 double numeratorX(0.), denominatorX(0.);
750 std::vector<WeightAndResultsPerBin>::const_iterator i_apeBin;
751 for(i_apeBin=v_weightAndResultsPerBinX.begin(); i_apeBin!=v_weightAndResultsPerBinX.end(); ++i_apeBin){
752 numeratorX += i_apeBin->first*i_apeBin->second.first*i_apeBin->second.second;
753 denominatorX += i_apeBin->first*i_apeBin->second.first;
755 correctionX2 = numeratorX/denominatorX;
758 if((*i_sector).second.isPixel){
761 bool firstIntervalY(
true);
762 for(i_apeBin=v_weightAndResultsPerBinY.begin(); i_apeBin!=v_weightAndResultsPerBinY.end(); ++i_apeBin){
764 correctionY2 = i_apeBin->first*i_apeBin->second.first*(i_apeBin->second.second - baselineWidthY2);
765 firstIntervalY =
false;
768 correctionY2 += i_apeBin->first*i_apeBin->second.first*(i_apeBin->second.second - baselineWidthY2);
771 correctionY2 = correctionY2/weightSumY;
774 double numeratorY(0.), denominatorY(0.);
775 std::vector<WeightAndResultsPerBin>::const_iterator i_apeBin;
776 for(i_apeBin=v_weightAndResultsPerBinY.begin(); i_apeBin!=v_weightAndResultsPerBinY.end(); ++i_apeBin){
777 numeratorY += i_apeBin->first*i_apeBin->second.first*i_apeBin->second.second;
778 denominatorY += i_apeBin->first*i_apeBin->second.first;
780 correctionY2 = numeratorY/denominatorY;
797 apeX2 = a_apeSectorX[(*i_sector).first];
798 apeY2 = a_apeSectorY[(*i_sector).first];
800 const double apeX2old = apeX2;
801 const double apeY2old = apeY2;
804 edm::LogInfo(
"CalculateAPE")<<
"Unscaled correction x for sector "<<(*i_sector).first<<
" is "<<(correctionX2>0. ? +1. : -1.)*
std::sqrt(std::fabs(correctionX2));
805 if(!smoothIteration || firstIter)correctionX2 = correctionX2*correctionScaling*correctionScaling;
806 if((*i_sector).second.isPixel){
807 edm::LogInfo(
"CalculateAPE")<<
"Unscaled correction y for sector "<<(*i_sector).first<<
" is "<<(correctionY2>0. ? +1. : -1.)*
std::sqrt(std::fabs(correctionY2));
808 if(!smoothIteration || firstIter)correctionY2 = correctionY2*correctionScaling*correctionScaling;
813 if(apeX2 + correctionX2 < 0.) correctionX2 = -apeX2;
814 if(apeY2 + correctionY2 < 0.) correctionY2 = -apeY2;
815 const double apeX2new(apeX2old + correctionX2);
816 const double apeY2new(apeY2old + correctionY2);
817 if(!smoothIteration || firstIter){
825 if(apeX2<0. || apeY2<0.)
edm::LogError(
"CalculateAPE")<<
"\n\n\tBad APE, but why???\n\n\n";
826 a_apeSectorX[(*i_sector).first] = apeX2;
827 a_apeSectorY[(*i_sector).first] = apeY2;
832 const double apeZ(
std::sqrt(0.5*(apeX2+apeY2)));
833 std::vector<unsigned int>::const_iterator i_rawId;
834 for(i_rawId = (*i_sector).second.v_rawId.begin(); i_rawId != (*i_sector).second.v_rawId.end(); ++i_rawId){
835 if((*i_sector).second.isPixel){
836 apeOutputFile<<*i_rawId<<
" "<<std::fixed<<std::setprecision(5)<<apeX<<
" "<<apeY<<
" "<<apeZ<<
"\n";
839 apeOutputFile<<*i_rawId<<
" "<<std::fixed<<std::setprecision(5)<<apeX<<
" "<<apeX<<
" "<<apeX<<
"\n";
845 a_apeSectorX[(*i_sector).first] = correctionX2;
846 a_apeSectorY[(*i_sector).first] = correctionY2;
849 if(!setBaseline)apeOutputFile.close();
851 iterationTreeX->Fill();
852 iterationTreeX->Write(
"iterTreeX", TObject::kOverwrite);
853 iterationTreeY->Fill();
854 iterationTreeY->Write(
"iterTreeY", TObject::kOverwrite);
856 sectorNameTree->Fill();
857 sectorNameTree->Write(
"nameTree");
859 iterationFile->Close();
861 if(baselineFile)baselineFile->Close();
882 TFile* baselineFile(0);
883 TTree* sectorNameBaselineTree(0);
885 std::ifstream baselineFileStream;
887 baselineFileStream.open(baselineFileName.c_str());
888 if(baselineFileStream.is_open()){
889 baselineFileStream.close();
890 baselineFile =
new TFile(baselineFileName.c_str(),
"READ");
893 edm::LogInfo(
"CalculateAPE")<<
"Baseline file for APE values sucessfully opened";
894 baselineFile->GetObject(
"nameTree;1",sectorNameBaselineTree);
897 edm::LogWarning(
"CalculateAPE")<<
"There is NO baseline file for APE values, so normalized residual width =1 for ideal conditions is assumed";
903 TFile* defaultFile =
new TFile(defaultFileName.c_str(),
"RECREATE");
906 TTree* defaultTreeX(0);
907 TTree* defaultTreeY(0);
908 defaultFile->GetObject(
"iterTreeX;1",defaultTreeX);
909 defaultFile->GetObject(
"iterTreeY;1",defaultTreeY);
911 TTree* sectorNameTree(0);
912 defaultFile->GetObject(
"nameTree;1",sectorNameTree);
914 bool firstIter(
false);
917 defaultTreeX =
new TTree(
"iterTreeX",
"Tree for default APE x values from GT");
918 defaultTreeY =
new TTree(
"iterTreeY",
"Tree for default APE y values from GT");
919 edm::LogInfo(
"CalculateAPE")<<
"First APE iteration (number 0.), create default file with TTree";
920 sectorNameTree =
new TTree(
"nameTree",
"Tree with names of sectors");
923 edm::LogWarning(
"CalculateAPE")<<
"NOT the first APE iteration (number 0.), is this wanted or forgot to delete old iteration file with TTree?";
927 double a_defaultSectorX[16589];
928 double a_defaultSectorY[16589];
932 std::map<unsigned int, TrackerSectorStruct>::const_iterator i_sector;
934 const unsigned int iSector(i_sector->first);
935 const bool pixelSector(i_sector->second.isPixel);
937 a_defaultSectorX[iSector] = -99.;
938 a_defaultSectorY[iSector] = -99.;
940 a_sectorName[iSector] = 0;
941 a_sectorBaselineName[iSector] = 0;
942 std::stringstream ss_sector, ss_sectorSuffixed;
943 ss_sector <<
"Ape_Sector_" << iSector;
944 if(!setBaseline && sectorNameBaselineTree){
945 sectorNameBaselineTree->SetBranchAddress(ss_sector.str().c_str(), &a_sectorBaselineName[iSector]);
946 sectorNameBaselineTree->GetEntry(0);
950 ss_sectorSuffixed << ss_sector.str() <<
"/D";
951 defaultTreeX->Branch(ss_sector.str().c_str(), &a_defaultSectorX[iSector], ss_sectorSuffixed.str().c_str());
953 defaultTreeY->Branch(ss_sector.str().c_str(), &a_defaultSectorY[iSector], ss_sectorSuffixed.str().c_str());
955 sectorNameTree->Branch(ss_sector.str().c_str(), &a_sectorName[iSector], 32000, 00);
958 defaultTreeX->SetBranchAddress(ss_sector.str().c_str(), &a_defaultSectorX[iSector]);
959 defaultTreeX->GetEntry(0);
961 defaultTreeY->SetBranchAddress(ss_sector.str().c_str(), &a_defaultSectorY[iSector]);
962 defaultTreeY->GetEntry(0);
964 sectorNameTree->SetBranchAddress(ss_sector.str().c_str(), &a_sectorName[iSector]);
965 sectorNameTree->GetEntry(0);
971 for(std::map<unsigned int,TrackerSectorStruct>::iterator i_sector =
m_tkSector_.begin(); i_sector !=
m_tkSector_.end(); ++i_sector){
974 const std::string& nameLastIter(*a_sectorName[(*i_sector).first]);
975 if(name!=nameLastIter){
976 edm::LogError(
"CalculateAPE")<<
"Inconsistent sector definition in iterationFile for sector "<<i_sector->first<<
",\n"
977 <<
"Recent iteration has name \""<<name<<
"\", while previous had \""<<nameLastIter<<
"\"\n"
978 <<
"...APE calculation stopped. Please check sector definitions in config!\n";
982 else a_sectorName[(*i_sector).first] =
new std::string(name);
983 if(!setBaseline && baselineFile){
984 const std::string& nameBaseline(*a_sectorBaselineName[(*i_sector).first]);
985 if(name!=nameBaseline){
986 edm::LogError(
"CalculateAPE")<<
"Inconsistent sector definition in baselineFile for sector "<<i_sector->first<<
",\n"
987 <<
"Recent iteration has name \""<<name<<
"\", while baseline had \""<<nameBaseline<<
"\"\n"
988 <<
"...APE calculation stopped. Please check sector definitions in config!\n";
997 for(std::map<unsigned int,TrackerSectorStruct>::iterator i_sector =
m_tkSector_.begin(); i_sector !=
m_tkSector_.end(); ++i_sector){
999 double defaultApeX(0.);
1000 double defaultApeY(0.);
1001 unsigned int nModules(0);
1002 std::vector<unsigned int>::const_iterator i_rawId;
1003 for(i_rawId = (*i_sector).second.v_rawId.begin(); i_rawId != (*i_sector).second.v_rawId.end(); ++i_rawId){
1004 std::vector<AlignTransformErrorExtended> alignErrors = alignmentErrors->m_alignError;
1005 for(std::vector<AlignTransformErrorExtended>::const_iterator i_alignError = alignErrors.begin(); i_alignError != alignErrors.end(); ++i_alignError){
1006 if(*i_rawId == i_alignError->rawId()){
1007 CLHEP::HepSymMatrix errMatrix = i_alignError->matrix();
1008 defaultApeX += errMatrix[0][0];
1009 defaultApeY += errMatrix[1][1];
1014 a_defaultSectorX[(*i_sector).first] = defaultApeX/nModules;
1015 a_defaultSectorY[(*i_sector).first] = defaultApeY/nModules;
1018 sectorNameTree->Fill();
1019 sectorNameTree->Write(
"nameTree");
1020 defaultTreeX->Fill();
1021 defaultTreeX->Write(
"iterTreeX");
1022 defaultTreeY->Fill();
1023 defaultTreeY->Write(
"iterTreeY");
1025 defaultFile->Close();
1026 if(baselineFile)baselineFile->Close();
T getParameter(std::string const &) const
std::map< unsigned int, TrackerSectorStruct > m_tkSector_
#define DEFINE_FWK_MODULE(type)
ApeEstimatorSummary(const edm::ParameterSet &)
void getTrackerSectorStructs()
virtual void analyze(const edm::Event &, const edm::EventSetup &)
std::map< unsigned int, std::map< std::string, TH1 * > > m_binnedHists
std::vector< double > residualErrorBinning()
const edm::ParameterSet parameterSet_
Power< A, B >::type pow(const A &a, const B &b)
std::vector< unsigned int > v_rawId