00001 #include "NCCoordinateConverter.h"
00002
00003 #include "MessageService/MsgService.h"
00004
00005 #include "NCUtils/NCUtility.h"
00006
00007 #include <stdexcept>
00008
00009 CVSID("$Id: NCCoordinateConverter.cxx,v 1.32 2009/11/26 12:03:29 bckhouse Exp $");
00010
00011 using namespace NCType;
00012 using namespace NC::Fitter;
00013 using NC::Utility::SQR;
00014
00015 ClassImp(NC::CoordinateConverter)
00016
00017
00018 NC::SystPars::SystPars()
00019 {
00020 for(int n = 0; n < kNumSystematicParameters; ++n) fShifts[n] = 0;
00021 }
00022
00023
00024 bool NC::SystPars::operator!=(const SystPars& s) const
00025 {
00026 for(int n = 0; n < kNumSystematicParameters; ++n)
00027 if(s.fShifts[n] != fShifts[n]) return true;
00028
00029 return false;
00030 }
00031
00032
00033 bool NC::SystPars::operator==(const SystPars& s) const
00034 {
00035 return !(*this != s);
00036 }
00037
00038
00039 double NC::SystPars::ShowerScale(Detector::Detector_t det) const
00040 {
00041 if(det == Detector::kNear) return 1+fShifts[kAbsoluteHadronicCalibration];
00042
00043 return (1+fShifts[kRelativeHadronicCalibration])*
00044 (1+fShifts[kAbsoluteHadronicCalibration]);
00045 }
00046
00047
00048 double NC::SystPars::TrackScale() const
00049 {
00050 return 1+fShifts[kTrackEnergy];
00051 }
00052
00053
00054 double NC::SystPars::NormScale() const
00055 {
00056 return 1+fShifts[kNormalization];
00057 }
00058
00059
00060 double NC::SystPars::NDCleaningScale(NCType::EEventType nccc,
00061 double showerEnergy) const
00062 {
00063 if(nccc == NCType::kCC) return 1;
00064
00065 if(showerEnergy <= 0.5) return 1 + 0.152*fShifts[kNCNearClean];
00066 if(showerEnergy <= 1.0) return 1 + 0.029*fShifts[kNCNearClean];
00067 if(showerEnergy <= 1.5) return 1 + 0.004*fShifts[kNCNearClean];
00068
00069 return 1;
00070 }
00071
00072
00073 double NC::SystPars::NCBkgScale() const
00074 {
00075 return 1+fShifts[kNCBackground];
00076 }
00077
00078
00079 double NC::SystPars::CCBkgScale() const
00080 {
00081 return 1+fShifts[kCCBackground];
00082 }
00083
00084
00085 double NC::SystPars::PenaltyForShifts() const
00086 {
00087 double pen = 0;
00088
00089 for(int n = 0; n < kNumSystematicParameters; ++n){
00090 const double shift = fShifts[n];
00091 if(shift) pen += shift/NCType::kParams[n].sigma;
00092 }
00093
00094 return pen;
00095 }
00096
00097
00098 NC::CoordinateConverter::CoordinateConverter()
00099 {
00100 for(int n = 0; n < kNumParameters; ++n){
00101 fLoc[n] = -1;
00102 fFixedVals[n] = -9999;
00103 }
00104 }
00105
00106
00107 const Registry& NC::CoordinateConverter::DefaultConfig()
00108 {
00109 static Registry r;
00110
00111 r.UnLockValues();
00112
00113 r.Set("PrecScale", 1.0);
00114
00115 r.Set("DeltaCP3FlavorVal", 0.0);
00116
00117
00118 r.Set("FitUE3Sqr", false);
00119 r.Set("FitTheta13", false);
00120 r.Set("FitDelta1", false);
00121 r.Set("FitDelta2", false);
00122
00123 r.Set("FitTheta14", true);
00124 r.Set("FitTheta24", true);
00125 r.Set("FitTheta23", true);
00126
00127
00128 r.Set("UE3SqrVal", 0.);
00129 r.Set("Theta13Val", 0.);
00130 r.Set("Delta1Val", 0.);
00131 r.Set("Delta2Val", 0.);
00132
00133 r.Set("Theta14Val", 0.);
00134 r.Set("Theta24Val", 0.);
00135 r.Set("Theta23Val", 0.);
00136
00137
00138 r.LockValues();
00139 return r;
00140 }
00141
00142
00143 void NC::CoordinateConverter::TryAddSystematic(const Registry& r,
00144 NCType::EFitParam p)
00145 {
00146 int tmpb;
00147 TString key = "Fit"+NCType::kParams[p].name;
00148 if(r.Get(key, tmpb) && tmpb) fLoc[p] = AddSystematicParameter(p);
00149 }
00150
00151
00152 void NC::CoordinateConverter::PrepareSystematics(const Registry& r)
00153 {
00154 TryAddSystematic(r, kNormalization);
00155 TryAddSystematic(r, kRelativeHadronicCalibration);
00156 TryAddSystematic(r, kAbsoluteHadronicCalibration);
00157 TryAddSystematic(r, kTrackEnergy);
00158 TryAddSystematic(r, kNCBackground);
00159 TryAddSystematic(r, kCCBackground);
00160 TryAddSystematic(r, kNCNearClean);
00161 }
00162
00163
00164 void NC::CoordinateConverter::PrepareOscillations(const Registry& r)
00165 {
00166 const int kNumUMu3SqrBins = 100;
00167 const double kUMu3SqrStart = 1e-3;
00168 const double kUMu3SqrEnd = 1;
00169 const double kDeltaUMu3Sqr = (kUMu3SqrEnd-kUMu3SqrStart)/kNumUMu3SqrBins;
00170
00171 const int kNumDeltaMSqrBins = 300;
00172 const double kDeltaMSqrStart = 1.5;
00173 const double kDeltaMSqrEnd = 4.5;
00174 const double kDeltaDeltaMSqr = (kDeltaMSqrEnd-kDeltaMSqrStart)/kNumDeltaMSqrBins;
00175
00176 int tmpb;
00177
00178 switch(fOscillationModel){
00179 case kThreeFlavor:
00180 fLoc[kDeltaMSqr32] = AddParameter("dmsq_32", "#Deltam^{2}_{32} (10^{-3} eV^{2})",
00181 kDeltaMSqrStart,
00182 kDeltaMSqrEnd,
00183 kDeltaDeltaMSqr, true);
00184
00185 if(r.Get("FitUE3Sqr", tmpb) && tmpb){
00186 fLoc[kTheta13] = AddParameter("theta13", "#theta_{13}",
00187 0, TMath::Pi()*2, -1, true);
00188 }
00189
00190 if(r.Get("FitTheta23", tmpb) && tmpb){
00191 fLoc[kTheta23] = AddParameter("theta23", "#theta_{23}",
00192 0, TMath::Pi()*2, -1, true);
00193 }
00194
00195 return;
00196
00197 case kNoOscillations:
00198 return;
00199
00200 case kFourFlavorGeneral:
00201 case kFourFlavorDelta43IsBig:
00202 case kFourFlavorDelta43Is0:
00203 case kFourFlavorDelta41Is0:
00204
00205 if(r.Get("FitTheta13", tmpb) && tmpb){
00206 fLoc[kTheta13] = AddParameter("theta13", "#theta_{13}",
00207 0, TMath::Pi()*2, -1, true);
00208 }
00209
00210 if(r.Get("FitTheta23", tmpb) && tmpb){
00211 fLoc[kTheta23] = AddParameter("theta23", "#theta_{23}",
00212 0, TMath::Pi()/2, -1, true);
00213 }
00214
00215 if(fOscillationModel != kFourFlavorDelta41Is0){
00216
00217 if(r.Get("FitTheta14", tmpb) && tmpb){
00218 fLoc[kTheta14] = AddParameter("theta14", "#theta_{14}",
00219 0, TMath::Pi()*2, -1, true);
00220 }
00221
00222 if(r.Get("FitTheta24", tmpb) && tmpb){
00223 fLoc[kTheta24] = AddParameter("theta24", "#theta_{24}",
00224 0, TMath::Pi()/3, -1, true);
00225 }
00226
00227 if(r.Get("FitDelta1", tmpb) && tmpb){
00228 fLoc[kDelta1] = AddParameter("delta1", "#delta_{1}",
00229 0, TMath::Pi()*2, -1, true);
00230 }
00231
00232 if(fOscillationModel != kFourFlavorDelta43Is0){
00233 if(r.Get("FitDelta2", tmpb) && tmpb){
00234 fLoc[kDelta2] = AddParameter("delta2", "#delta_{2}",
00235 0, TMath::Pi()*2, -1, true);
00236 }
00237 }
00238 }
00239
00240 if(fOscillationModel != kFourFlavorDelta43Is0){
00241 fLoc[kTheta34] = AddParameter("theta34", "#theta_{34}",
00242 0, TMath::Pi()/3, -1, true);
00243 }
00244
00245
00246
00247 fLoc[kDeltaMSqr31] = AddParameter("dmsq_31", "#Deltam^{2}_{31} (10^{-3} eV^{2})",
00248 kDeltaMSqrStart,
00249 kDeltaMSqrEnd,
00250 kDeltaDeltaMSqr, true);
00251
00252 if(fOscillationModel != kFourFlavorDelta43IsBig &&
00253 fOscillationModel != kFourFlavorDelta43Is0 &&
00254 fOscillationModel != kFourFlavorDelta41Is0){
00255
00256 fLoc[kDeltaMSqr41] = AddParameter("dmsq_41", "#Deltam^{2}_{41} (10^{-3} eV^{2})",
00257 kDeltaMSqrStart,
00258 kDeltaMSqrEnd,
00259 kDeltaDeltaMSqr, true);
00260
00261 fLoc[kDeltaMSqr43] = AddParameter("dmsq_43", "#Deltam^{2}_{43} (10^{-3} eV^{2})",
00262 kDeltaMSqrStart,
00263 kDeltaMSqrEnd,
00264 kDeltaDeltaMSqr, true);
00265 }
00266
00267 return;
00268
00269 case kSterileFraction:
00270 fLoc[kFs] = AddParameter("fs", "f_{s}", 0, 1, -1, true);
00271
00272 fLoc[kUMu3Sqr] = AddParameter("umu3", "|U_{#mu3}|^{2}",
00273 kUMu3SqrStart,
00274 kUMu3SqrEnd,
00275 kDeltaUMu3Sqr, true);
00276
00277 fLoc[kDeltaMSqr32] = AddParameter("dmsq",
00278 "#Deltam^{2}_{32} (10^{-3} eV^{2})",
00279 kDeltaMSqrStart,
00280 kDeltaMSqrEnd,
00281 kDeltaDeltaMSqr, true);
00282
00283 if(r.Get("FitUE3Sqr", tmpb) && tmpb){
00284 fLoc[kUE3Sqr] = AddParameter("ue3", "|U_{e3}|^{2}", 0, 1, -1, true);
00285 }
00286
00287 return;
00288
00289 case kSterileFractionTauNorm:
00290
00291
00292 fLoc[kUMu3Sqr] = AddParameter("umu3", "|U_{#mu3}|^{2}",
00293 kUMu3SqrStart,
00294 kUMu3SqrEnd,
00295 kDeltaUMu3Sqr, true);
00296 fLoc[kTauScale] = AddParameter("tauscale", "A_{#tau}",
00297 -0.1,
00298 2,
00299 0.01, true);
00300 fLoc[kDeltaMSqr32] = AddParameter("dmsq",
00301 "#Deltam^{2}_{32} (10^{-3} eV^{2})",
00302 kDeltaMSqrStart,
00303 kDeltaMSqrEnd,
00304 kDeltaDeltaMSqr, true);
00305
00306 if(r.Get("FitUE3Sqr", tmpb) && tmpb){
00307 fLoc[kUE3Sqr] = AddParameter("ue3", "|U_{e3}|^{2}", 0, 1, -1, true);
00308 }
00309 return;
00310
00311 case kDecay:
00312 fLoc[kTheta] = AddParameter("theta", "#theta", 0, TMath::Pi()/2, -1, true);
00313
00314 fLoc[kAlpha] = AddParameter("alpha", "#alpha (GeV/km)", 0, 8e-3, -1, true);
00315
00316
00317 fLoc[kDeltaMSqr] = AddParameter("dmsq_32", "#Deltam^{2} (10^{-3} eV^{2})",0, 4.5, -1, true);
00318
00319 return;
00320
00321 case kDecoherence:
00322 fLoc[kTheta] = AddParameter("theta", "#theta", 0, TMath::Pi()/2, -1, true);
00323
00324
00325 fLoc[kMu] = AddParameter("mu", "#mu", 0, 0.2, -1, true);
00326
00327 return;
00328 }
00329
00330 assert(0 && "Unknown oscillation model");
00331 }
00332
00333
00334 double NC::CoordinateConverter::
00335 ChooseValue(NCType::EFitParam param, const NC::Fitter::CoordNDim& coords) const
00336 {
00337 if(IsFit(param))
00338 return coords.at(fLoc[param]);
00339 else
00340 return fFixedVals[param];
00341 }
00342
00343
00344 void NC::CoordinateConverter::Prepare(const Registry& r, bool hush)
00345 {
00346 int tmpi;
00347 double tmpd;
00348
00349 if(r.Get("DeltaCP3FlavorVal", tmpd)) fFixedVals[kDelta13] = tmpd;
00350 if(r.Get("UE3SqrVal", tmpd)) fFixedVals[kUE3Sqr] = tmpd;
00351 if(r.Get("Theta13Val", tmpd)) fFixedVals[kTheta13] = tmpd;
00352 if(r.Get("Delta1Val", tmpd)) fFixedVals[kDelta1] = tmpd;
00353 if(r.Get("Delta2Val", tmpd)) fFixedVals[kDelta2] = tmpd;
00354 if(r.Get("Theta14Val", tmpd)) fFixedVals[kTheta14] = tmpd;
00355 if(r.Get("Theta24Val", tmpd)) fFixedVals[kTheta24] = tmpd;
00356 if(r.Get("Theta23Val", tmpd)) fFixedVals[kTheta23] = tmpd;
00357
00358
00359 if(r.Get("PrecScale", tmpd)) fPrecScale = tmpd;
00360
00361 if(r.Get("OscillationModel", tmpi)) fOscillationModel = NCType::EOscModel(tmpi);
00362
00363 PrepareOscillations(r);
00364 PrepareSystematics(r);
00365
00366 if(!hush){
00367 MSG("NCCoordConv", Msg::kInfo) << "parameter names, labels, etc:" << endl;
00368
00369 for(unsigned int i = 0; i < fFitParams.size(); ++i)
00370 MSG("NCCoordConv", Msg::kInfo) << fFitParams[i].ShortName() << "\t"
00371 << fFitParams[i].LatexName() << "\t"
00372 << fFitParams[i].Min() << " to "
00373 << fFitParams[i].Max() << " in "
00374 << fFitParams[i].Precision() << " with "
00375 << (fFitParams[i].UseLimits() ?
00376 "binding" : "non-binding")
00377 << " limits" << endl;
00378 }
00379 }
00380
00381
00382 NC::SystPars NC::CoordinateConverter::
00383 SystParsFromCoordNDim(const CoordNDim& coords) const
00384 {
00385 NC::SystPars ret;
00386
00387 for(int n = 0; n < kNumParameters; ++n){
00388 if(!IsSystematic(EFitParam(n))) continue;
00389
00390 if(IsFit(EFitParam(n))) ret.fShifts[n] = coords[fLoc[n]];
00391 }
00392
00393 return ret;
00394 }
00395
00396
00397 NC::OscProb::OscPars*
00398 NC::CoordinateConverter::OscParsFromCoordNDim(const CoordNDim& coords) const
00399 {
00400 using namespace NC::OscProb;
00401
00402
00403
00404 if(coords.empty() && fOscillationModel != kNoOscillations) return 0;
00405
00406 try{
00407 switch(fOscillationModel){
00408 case kThreeFlavor:{
00409 ThreeFlavor* pars = new ThreeFlavor;
00410
00411 pars->Theta23() = ChooseValue(kTheta23, coords);
00412 pars->DeltaMSqr32() = coords.at(fLoc[kDeltaMSqr32])*1.e-3;
00413
00414 pars->Theta13() = ChooseValue(kTheta13, coords);
00415
00416 pars->Theta12() = 0.61;
00417 pars->DeltaMSqr12() = 7.59e-5;
00418 pars->RockDensity() = 2.7;
00419 pars->Delta13() = fFixedVals[kDelta13];
00420 pars->Hierarchy() = 1;
00421
00422 return pars;
00423 }
00424
00425 case kNoOscillations:{
00426 return new NoOscillations;
00427 }
00428
00429 case kFourFlavorGeneral:{
00430 FourFlavorGeneral* pars = new FourFlavorGeneral;
00431
00432 pars->Theta13() = ChooseValue(kTheta13, coords);
00433 pars->Delta1() = ChooseValue(kDelta1, coords);
00434 pars->Delta2() = ChooseValue(kDelta2, coords);
00435 pars->Theta14() = ChooseValue(kTheta14, coords);
00436
00437 pars->Theta23() = ChooseValue(kTheta23, coords);
00438 pars->Theta24() = ChooseValue(kTheta24, coords);
00439 pars->Theta34() = coords.at(fLoc[kTheta34]);
00440 pars->DeltaMSqr31() = coords.at(fLoc[kDeltaMSqr31])*1e-3;
00441 pars->DeltaMSqr41() = coords.at(fLoc[kDeltaMSqr41])*1e-3;
00442 pars->DeltaMSqr43() = coords.at(fLoc[kDeltaMSqr43])*1e-3;
00443
00444 return pars;
00445 }
00446
00447 case kFourFlavorDelta43IsBig:{
00448 FourFlavorDelta43IsBig* pars = new FourFlavorDelta43IsBig;
00449
00450 pars->Theta13() = ChooseValue(kTheta13, coords);
00451 pars->Delta1() = ChooseValue(kDelta1, coords);
00452 pars->Delta2() = ChooseValue(kDelta2, coords);
00453 pars->Theta14() = ChooseValue(kTheta14, coords);
00454
00455 pars->Theta23() = ChooseValue(kTheta23, coords);
00456 pars->Theta24() = ChooseValue(kTheta24, coords);
00457 pars->Theta34() = coords.at(fLoc[kTheta34]);
00458 pars->DeltaMSqr31() = coords.at(fLoc[kDeltaMSqr31])*1e-3;
00459
00460 return pars;
00461 }
00462
00463 case kFourFlavorDelta41Is0:{
00464 FourFlavorDelta41Is0* pars = new FourFlavorDelta41Is0;
00465
00466 pars->Theta13() = ChooseValue(kTheta13, coords);
00467
00468 pars->Theta23() = ChooseValue(kTheta23, coords);
00469 pars->Theta34() = coords.at(fLoc[kTheta34]);
00470 pars->DeltaMSqr31() = coords.at(fLoc[kDeltaMSqr31])*1e-3;
00471
00472 return pars;
00473 }
00474
00475 case kFourFlavorDelta43Is0:{
00476 FourFlavorDelta43Is0* pars = new FourFlavorDelta43Is0;
00477
00478 pars->Theta13() = ChooseValue(kTheta13, coords);
00479 pars->Delta1() = ChooseValue(kDelta1, coords);
00480 pars->Theta14() = ChooseValue(kTheta14, coords);
00481
00482 pars->Theta23() = ChooseValue(kTheta23, coords);
00483 pars->Theta24() = ChooseValue(kTheta24, coords);
00484 pars->DeltaMSqr31() = coords.at(fLoc[kDeltaMSqr31])*1e-3;
00485
00486 return pars;
00487 }
00488
00489 case kSterileFraction:{
00490 SterileFraction* pars = new SterileFraction;
00491
00492 pars->UE3Sqr() = ChooseValue(kUE3Sqr, coords);
00493
00494 pars->UMu3Sqr() = coords.at(fLoc[kUMu3Sqr]);
00495 pars->DeltaMSqr32() = coords.at(fLoc[kDeltaMSqr32])*1.e-3;
00496 pars->Fs() = coords.at(fLoc[kFs]);
00497
00498
00499 return pars;
00500 }
00501
00502 case kDecay:{
00503 Decay* pars = new Decay;
00504
00505 pars->Theta() = coords.at(fLoc[kTheta]);
00506 pars->Alpha() = coords.at(fLoc[kAlpha]);
00507 pars->DeltaMSqr() = coords.at(fLoc[kDeltaMSqr])*1e-3;
00508
00509 return pars;
00510 }
00511
00512 case kSterileFractionTauNorm:{
00513 SterileFractionTauNorm* pars = new SterileFractionTauNorm;
00514
00515 pars->UMu3Sqr() = coords.at(fLoc[kUMu3Sqr]);
00516 pars->DeltaMSqr32() = coords.at(fLoc[kDeltaMSqr32])*1.e-3;
00517 pars->Fs() = 0;
00518 pars->TauScale() = coords.at(fLoc[kTauScale]);
00519
00520 pars->UE3Sqr() = ChooseValue(kUE3Sqr, coords);
00521
00522 return pars;
00523 }
00524
00525 case kDecoherence:{
00526 Decoherence* pars = new Decoherence;
00527
00528 pars->Theta() = coords.at(fLoc[kTheta]);
00529 pars->Mu() = coords.at(fLoc[kMu]);
00530
00531 return pars;
00532 }
00533
00534 }
00535
00536 assert(0 && "Unknown oscillation model");
00537 }
00538
00539 catch(std::out_of_range& e){
00540 MSG("NCCoordConv", Msg::kError) << "Out of range error in "
00541 << "OscParsForCoordNDim, with model "
00542 << fOscillationModel << " and coords size "
00543 << coords.size() << ". Aborting." << endl;
00544 abort();
00545 }
00546 }
00547
00548
00549 CoordNDim NC::CoordinateConverter::
00550 CoordNDimFromOscPars(const NC::OscProb::OscPars* pars) const
00551 {
00552 assert(pars->OscillationModel() == fOscillationModel);
00553
00554 CoordNDim ret;
00555
00556 using namespace NCType;
00557
00558 for(int n = 0; n < kNumParameters; ++n){
00559 const EFitParam par = EFitParam(n);
00560 if(IsFit(par) && !IsSystematic(par)){
00561 const unsigned int loc = FitterIndex(par);
00562 if(ret.size() <= loc) ret.resize(loc+1);
00563 double parval = pars->GetParameterValue(par);
00564
00565 if(par == kDeltaMSqr || par == kDeltaMSqr12 || par == kDeltaMSqr31 ||
00566 par == kDeltaMSqr32 || par == kDeltaMSqr41 || par == kDeltaMSqr43)
00567 parval *= 1e3;
00568 ret[loc] = parval;
00569 }
00570 }
00571
00572 return ret;
00573 }
00574
00575
00576 int NC::CoordinateConverter::FitterIndex(EFitParam par) const
00577 {
00578 assert(int(par) >= 0 && par < kNumParameters);
00579 assert(fLoc[par] != -1);
00580 return fLoc[par];
00581 }
00582
00583
00584 NCParameter NC::CoordinateConverter::ParameterForFitterIndex(int idx) const
00585 {
00586 assert(idx >= 0 && idx < int(fFitParams.size()));
00587
00588 return fFitParams[idx];
00589 }
00590
00591
00592 NCParameter NC::CoordinateConverter::
00593 ParameterForFitParam(NCType::EFitParam par) const
00594 {
00595 return ParameterForFitterIndex(FitterIndex(par));
00596 }
00597
00598
00599 bool NC::CoordinateConverter::IsFit(NCType::EFitParam par) const
00600 {
00601 return fLoc[par] != -1;
00602 }
00603
00604
00605 int NC::CoordinateConverter::NumParameters() const
00606 {
00607 int fit = 0;
00608 for(int n = 0; n < NCType::kNumParameters; ++n)
00609 if(IsFit(NCType::EFitParam(n))) ++fit;
00610 return fit;
00611 }
00612
00613
00614 bool NC::CoordinateConverter::IsSystematic(NCType::EFitParam par) const
00615 {
00616 assert(par < NCType::kNumParameters);
00617 return par < NCType::kNumSystematicParameters;
00618 }
00619
00620
00621 int NC::CoordinateConverter::AddParameter(string shortName,
00622 string latexName,
00623 double min,
00624 double max,
00625 double prec,
00626 bool limit)
00627 {
00628 assert(fPrecScale > 0);
00629
00630 const double defaultPrec = .01;
00631 if(prec < 0) prec = TMath::Abs((max - min)*defaultPrec);
00632
00633 fFitParams.push_back(NCParameter(shortName, latexName, min, max,
00634 prec/fPrecScale, limit));
00635 return fFitParams.size()-1;
00636 }
00637
00638
00639 int NC::CoordinateConverter::AddSystematicParameter(EFitParam p)
00640 {
00641 const double sigma = kParams[p].sigma;
00642 return AddParameter(kParams[p].name.Data(), kParams[p].latexName.Data(),
00643 -sigma, sigma, -1, false);
00644 }
00645
00646
00648 TH1* AxesForNCParameter(TString name, TString title,
00649 NCParameter xp, TString yLabel)
00650 {
00651 return new TH1F((name != "") ? TString::Format("%s_%s",
00652 name.Data(),
00653 xp.ShortName().c_str())
00654 : "",
00655 TString::Format("%s;%s;%s",
00656 title.Data(),
00657 xp.LatexName().c_str(),
00658 yLabel.Data()),
00659 100, xp.Min(), xp.Max());
00660 }
00661
00662
00663 TH1* NC::CoordinateConverter::AxesForParameter(TString name,
00664 TString title,
00665 NCType::EFitParam x,
00666 TString yLabel) const
00667 {
00668 const NCParameter xp = ParameterForFitParam(x);
00669
00670 return AxesForNCParameter(name, title, xp, yLabel);
00671 }
00672
00673
00674 TH1* NC::CoordinateConverter::AxesForParameter(TString name,
00675 TString title,
00676 int x,
00677 TString yLabel) const
00678 {
00679 const NCParameter xp = ParameterForFitterIndex(x);
00680
00681 return AxesForNCParameter(name, title, xp, yLabel);
00682 }
00683
00684
00686 TH2* AxesForNCParameters(TString name, TString title,
00687 NCParameter xp, NCParameter yp)
00688 {
00689 return new TH2F((name != "") ? TString::Format("%s_%s_%s",
00690 name.Data(),
00691 xp.ShortName().c_str(),
00692 yp.ShortName().c_str())
00693 : "",
00694 TString::Format("%s;%s;%s",
00695 title.Data(),
00696 xp.LatexName().c_str(),
00697 yp.LatexName().c_str()),
00698 100, xp.Min(), xp.Max(),
00699 100, yp.Min(), yp.Max());
00700 }
00701
00702
00703 TH2* NC::CoordinateConverter::AxesForParameters(TString name,
00704 TString title,
00705 NCType::EFitParam x,
00706 NCType::EFitParam y) const
00707 {
00708 const NCParameter xp = ParameterForFitParam(x);
00709 const NCParameter yp = ParameterForFitParam(y);
00710
00711 return AxesForNCParameters(name, title, xp, yp);
00712 }
00713
00714
00715 TH2* NC::CoordinateConverter::AxesForParameters(TString name,
00716 TString title,
00717 int x, int y) const
00718 {
00719 const NCParameter xp = ParameterForFitterIndex(x);
00720 const NCParameter yp = ParameterForFitterIndex(y);
00721
00722 return AxesForNCParameters(name, title, xp, yp);
00723 }
00724
00725
00726 vector<double> NC::CoordinateConverter::
00727 VectorFromSystPars(const NC::SystPars& s) const
00728 {
00729 vector<double> shift;
00730
00731 for(int n = 0; n < kNumParameters; ++n){
00732 if(!IsSystematic(EFitParam(n))) continue;
00733
00734 if(IsFit(EFitParam(n))) shift.push_back(s.fShifts[n]/kParams[n].sigma);
00735 }
00736
00737 return shift;
00738 }