Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

NCCoordinateConverter.cxx

Go to the documentation of this file.
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   // Whether to fit particular parameters
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   // Fixed values to use for the parameters if not fitting them
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     } // end if not Delta41=0
00239 
00240     if(fOscillationModel != kFourFlavorDelta43Is0){
00241       fLoc[kTheta34] = AddParameter("theta34", "#theta_{34}",
00242                                     0, TMath::Pi()/3, -1, true);
00243     }
00244 
00245 
00246     // TODO - How big should the ranges on all these mass scales be?
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     //fLoc[kFs] = AddParameter("fs", "f_{s}", 0, 1, -1, true);
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     // Using a lower limit of zero gets us the pure-decay dchisq
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     // TODO - range?
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   // This can happen if eg we didn't do a fit. It's still the callers'
00403   // fault, but this is more polite than the alternatives (crashing).
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; //SNO+KamLAND
00417       pars->DeltaMSqr12() = 7.59e-5;//SNO+KamLAND
00418       pars->RockDensity() = 2.7;//g/cc standard rock
00419       pars->Delta13() = fFixedVals[kDelta13];//cp violating phase
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;//coords.at(fLoc[kFs]);
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     } // end switch
00535 
00536     assert(0 && "Unknown oscillation model");
00537   } // end try
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       // Have to undo 1e3 factor in deltam values. TODO better
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 }

Generated on Mon Feb 15 11:07:03 2010 for loon by  doxygen 1.3.9.1