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

NuMMRunFC.cxx

Go to the documentation of this file.
00001 #include "TCanvas.h"
00002 #include "TFile.h"
00003 #include "TH1D.h"
00004  
00005 #include "MessageService/MsgService.h"
00006 #include "NtupleUtils/NuHistInterpolator.h"
00007 #include "NtupleUtils/NuMatrixSpectrum.h"
00008 #include "NtupleUtils/NuMMHelperCPT.h"
00009 #include "NtupleUtils/NuMMParameters.h"
00010 #include "NtupleUtils/NuMMRunFC.h"
00011 
00012 ClassImp(NuMMRunFC)
00013 
00014 CVSID("$Id: NuMMRunFC.cxx,v 1.22 2009/11/02 21:32:37 hartnell Exp $");
00015 
00016 using namespace Sample;
00017 
00018 //____________________________________________________________________72
00019 NuMMRunFC::NuMMRunFC(NuMMHelperCPT* helper,
00020                      NuMatrixSpectrum* ndNuData,
00021                      NuMatrixSpectrum* ndBarData,
00022                      double pot)
00023                : NuMMRunNuBar(),
00024                  fPredictNeutrinos(true),
00025                  fPredictAntiNeutrinos(true),
00026                  fDoneWsNeutrinos(false),
00027                  fDoneWsAntineutrinos(false)
00028 {
00029   TString name = "hError";
00030   name += (counter++);
00031   TH1D hBlank(name, "Something Went Wrong", 10, 0, 30);
00032   
00033   fndNuData = ndNuData;
00034   fndBarData = ndBarData;
00035   fHelper = helper;
00036   
00037   ffdNuData = new NuMatrixSpectrum(hBlank, pot);
00038   ffdBarData = new NuMatrixSpectrum(hBlank, pot);
00039 
00040   
00041   // Blank out all the Precache variables
00042   PreCalcnuPrediction   = PreCalcbarPrediction      = 0;
00043   PreCalcpotentialNuTaus= PreCalcpotentialTauBars   = 0;
00044   PreCalcnuNCBackground = PreCalcbarNCBackground    = 0;
00045   PreCalcwrongSignNuMus = PreCalcwrongSignNuBars    = 0;
00046   
00047   // We should now be completely capable of calculating the
00048   // halfway point of the prediction. Do so now.
00049   CacheExtrapolation();
00050   
00051 }
00052 
00053 //____________________________________________________________________72
00054 NuMMRunFC::NuMMRunFC(NuMMHelperCPT* helper,
00055                        NuMatrixSpectrum* ndNuData,
00056                        NuMatrixSpectrum* ndBarData,
00057                        NuMatrixSpectrum* fdNuData,
00058                        NuMatrixSpectrum* fdBarData)
00059                : NuMMRunNuBar(),
00060                  fPredictNeutrinos(true),
00061                  fPredictAntiNeutrinos(true),
00062                  fDoneWsNeutrinos(false),
00063                  fDoneWsAntineutrinos(false)
00064 {
00065   fndNuData = ndNuData;
00066   fndBarData = ndBarData;
00067   ffdNuData = fdNuData;
00068   ffdBarData = fdBarData;
00069   fHelper = helper;
00070   
00071   // Blank out all the Precache variables
00072   PreCalcnuPrediction   = PreCalcbarPrediction      = 0;
00073   PreCalcpotentialNuTaus= PreCalcpotentialTauBars   = 0;
00074   PreCalcnuNCBackground = PreCalcbarNCBackground    = 0;
00075   PreCalcwrongSignNuMus = PreCalcwrongSignNuBars    = 0;
00076   
00077   // We should now be completely capable of calculating the
00078   // halfway point of the prediction. Do so now.
00079   CacheExtrapolation();
00080   
00081 }
00082 
00083 
00084 //____________________________________________________________________72
00085 // The copy contructor
00086 NuMMRunFC::NuMMRunFC(const NuMMRunFC &old) : NuMMRunNuBar()
00087 {
00088   fndNuData = old.fndNuData;
00089   fndBarData = old.fndBarData;
00090   ffdNuData = old.ffdNuData;
00091   ffdBarData = old.ffdBarData;
00092   
00093   // Blank out all the Precache variables before reassignment
00094   PreCalcnuPrediction   = PreCalcbarPrediction      = 0;
00095   PreCalcpotentialNuTaus= PreCalcpotentialTauBars   = 0;
00096   PreCalcnuNCBackground = PreCalcbarNCBackground    = 0;
00097   PreCalcwrongSignNuMus = PreCalcwrongSignNuBars    = 0;
00098     
00099   // Make copies of all the precalculations frmo the old runner
00100   if (old.PreCalcnuPrediction)
00101     PreCalcnuPrediction = new NuMatrixSpectrum(*old.PreCalcnuPrediction);
00102   if (old.PreCalcbarPrediction)
00103     PreCalcbarPrediction = new NuMatrixSpectrum(*old.PreCalcbarPrediction);
00104   if (old.PreCalcpotentialNuTaus)
00105     PreCalcpotentialNuTaus = new NuMatrixSpectrum(*old.PreCalcpotentialNuTaus);
00106   if (old.PreCalcpotentialTauBars)
00107     PreCalcpotentialTauBars = new NuMatrixSpectrum(*old.PreCalcpotentialTauBars);
00108   
00109   if (old.PreCalcnuNCBackground)
00110     PreCalcnuNCBackground = new NuMatrixSpectrum(*old.PreCalcnuNCBackground);
00111   if (old.PreCalcbarNCBackground)
00112     PreCalcbarNCBackground = new NuMatrixSpectrum(*old.PreCalcbarNCBackground);
00113 
00114   if (old.PreCalcwrongSignNuMus)
00115     PreCalcwrongSignNuMus = new NuMatrixSpectrum(*old.PreCalcwrongSignNuMus);
00116   if (old.PreCalcwrongSignNuBars)
00117     PreCalcwrongSignNuBars = new NuMatrixSpectrum(*old.PreCalcwrongSignNuBars);
00118   
00119   fPredictNeutrinos = old.fPredictNeutrinos;
00120   fPredictAntiNeutrinos = old.fPredictAntiNeutrinos;
00121   
00122   // Set the wrong sign to false however - this copy may want different
00123   // oscillation parameters!
00124   fDoneWsNeutrinos = fDoneWsAntineutrinos = false;
00125 }
00126 
00127 //____________________________________________________________________72
00128 
00129 NuMMRunFC::~NuMMRunFC()
00130 {
00131   ResetCache();
00132 }
00133 
00134 
00135 //___________________________________________________________________
00136 
00137 void NuMMRunFC::ResetCache()
00138 {
00139   // delete the precalculated MM spectra we previously created
00140   if (PreCalcnuPrediction)    delete PreCalcnuPrediction;
00141   if (PreCalcbarPrediction)   delete PreCalcbarPrediction;
00142   
00143   if (PreCalcpotentialNuTaus) delete PreCalcpotentialNuTaus; 
00144   if (PreCalcpotentialTauBars)delete PreCalcpotentialTauBars; 
00145   
00146   if (PreCalcnuNCBackground)  delete PreCalcnuNCBackground; 
00147   if (PreCalcbarNCBackground) delete PreCalcbarNCBackground; 
00148   
00149   if (PreCalcwrongSignNuMus)  delete PreCalcwrongSignNuMus; 
00150   if (PreCalcwrongSignNuBars) delete PreCalcwrongSignNuBars; 
00151   
00152   PreCalcnuPrediction    = PreCalcbarPrediction    = 0;
00153   PreCalcpotentialNuTaus = PreCalcpotentialTauBars = 0;
00154   PreCalcnuNCBackground  = PreCalcbarNCBackground  = 0;
00155   PreCalcwrongSignNuMus  = PreCalcwrongSignNuBars  = 0;
00156   
00157   fCached = false;
00158 }
00159 
00160 //____________________________________________________________________72
00161 
00162 const std::vector<TH1D>
00163 NuMMRunFC::WriteFDPredHistos(const NuMMParameters& pars) const
00164 {    
00165   //Set up a vector to push the histograms into.
00166   vector<TH1D> vHistos;
00167 
00168   //Put the ND data in the vector:
00169   TH1D hNDNuData(*(fndNuData->Spectrum()));
00170   hNDNuData.SetName("ndDataNQ");
00171   hNDNuData.SetTitle("ndDataNQ");
00172   vHistos.push_back(*(new TH1D(hNDNuData)));
00173   TH1D hNDBarData(*(fndBarData->Spectrum()));
00174   hNDBarData.SetName("ndDataPQ");
00175   hNDBarData.SetTitle("ndDataPQ");
00176   vHistos.push_back(*(new TH1D(hNDBarData)));
00177 
00178   if (!fQuietMode) {
00179   cout << "sn2: " << pars.Sn2() << "; dm2: " << pars.Dm2() 
00180      << "; sn2bar: " << pars.Sn2Bar() << "; dm2bar: " << pars.Dm2Bar()
00181      << endl;
00182   }
00183 
00184   // Make copies of the prepared extrapolation variables
00185   NuMatrixSpectrum nuPrediction(*PreCalcnuPrediction);
00186   NuMatrixSpectrum barPrediction(*PreCalcbarPrediction);
00187   
00188   NuMatrixSpectrum potentialNuTaus(*PreCalcpotentialNuTaus);
00189   NuMatrixSpectrum potentialTauBars(*PreCalcpotentialTauBars);
00190 
00191   NuMatrixSpectrum nuNCBackground(*PreCalcnuNCBackground);
00192   NuMatrixSpectrum barNCBackground(*PreCalcbarNCBackground);
00193   
00194   NuMatrixSpectrum wrongSignNuMus(*PreCalcwrongSignNuMus);
00195   NuMatrixSpectrum wrongSignNuBars(*PreCalcwrongSignNuBars);
00196   
00197   cout << "NC Integral: " << barNCBackground.Spectrum()->Integral() << endl;
00198 
00199 
00200 
00201 // 
00202 //   //Add in backgrounds
00203 //   nuPrediction.Add(wrongSignNuBars);
00204 //   barPrediction.Add(wrongSignNuMus);
00205 //   nuPrediction.Add(nuNCBackground);
00206 //   nuPrediction.Add(potentialNuTaus);
00207 //   barPrediction.Add(barNCBackground);
00208 //   barPrediction.Add(potentialTauBars);
00209   
00211   // Processes for neutrinos
00212   
00213   if (fPredictNeutrinos)
00214   {  
00215     // Oscillate the taus
00216     if (fHelper->DoTaus()) {
00217       potentialNuTaus.InverseOscillate(pars.Dm2(),pars.Sn2());
00218     
00219       // Write out the true tau spectra
00220       TH1D hFDTausNuMu(*(potentialNuTaus.Spectrum()));
00221       hFDTausNuMu.SetName("fdTausNuMu");
00222       vHistos.push_back(hFDTausNuMu);
00223       
00224       potentialNuTaus.TrueToReco(fHelper->FDNuTauRecoVsTrue());
00225     }
00226 
00227     // Antineutrinos in the neutrino spectrum
00228     if (!fDoneWsAntineutrinos) wrongSignNuBars.Oscillate(pars.Dm2Bar(),pars.Sn2Bar());
00229 
00230     // Now convert wrong sign to reco
00231     if (!fDoneWsAntineutrinos) wrongSignNuBars.TrueToReco(fHelper->FDWrongSignBarRecoVsTrue());
00232     
00233     // Write out the true wrong sign components
00234     TH1D hFDWrongSignNQ(*(wrongSignNuBars.Spectrum()));
00235     hFDWrongSignNQ.SetName("fdWrongSignNQ");
00236     vHistos.push_back(hFDWrongSignNQ);
00237     
00238     // Oscillation and efficiency for the Neutrino spectrum
00239     nuPrediction.Oscillate(pars.Dm2(),pars.Sn2());
00240 //    nuPrediction.Multiply(fHelper->FDNuEfficiency());
00241 
00242     // Write out the true spectra for the prediction components
00243     // before we add in backgrounds
00244     TH1D hFDNoBackTrueNQ(*(nuPrediction.Spectrum()));
00245     hFDNoBackTrueNQ.SetName("fdBasePredictionNuMus");
00246     vHistos.push_back(hFDNoBackTrueNQ);
00247 
00248     // True to Reco
00249     nuPrediction.TrueToReco(fHelper->FDNuRecoVsTrue());
00250 
00251     // Dump out the reco spectrum before adding in the backgrounds
00252     TH1D hFDNoBackNQ(*(nuPrediction.Spectrum()));
00253     hFDNoBackNQ.SetName("fdBasePredictionNQ");
00254     vHistos.push_back(hFDNoBackNQ);
00255 
00256     //Add in backgrounds
00257     nuPrediction.Add(wrongSignNuBars);
00258     nuPrediction.Add(nuNCBackground);
00259     if (fHelper->DoTaus()) nuPrediction.Add(potentialNuTaus);
00260     
00261     //Put the other componants of the predictions in the vector
00262     TH1D hFDPredictionNQ(*(nuPrediction.Spectrum()));
00263     hFDPredictionNQ.SetName("fdPredictionNQ");
00264     vHistos.push_back(hFDPredictionNQ);
00265 
00266     TH1D hFDNCNQ(*(nuNCBackground.Spectrum()));
00267     hFDNCNQ.SetName("fdNCNQ");
00268     vHistos.push_back(hFDNCNQ);
00269 
00270     if (fHelper->DoTaus()) {
00271       TH1D hFDTausNQ(*(potentialNuTaus.Spectrum()));
00272       hFDTausNQ.SetName("fdTausNQ");
00273       vHistos.push_back(hFDTausNQ);
00274     }
00275     
00276     TH1D hFDDataNQ(*(ffdNuData->Spectrum()));
00277     hFDDataNQ.SetName("fdDataNQ");
00278     vHistos.push_back(hFDDataNQ);
00279     
00280   } else {
00281       // Scale the histogram to zero, so as not to confuse people
00282       nuPrediction.Spectrum()->Scale(0);
00283   }
00284   
00286   // Processes for Antineutrinos
00287   
00288   if (fPredictAntiNeutrinos)
00289   {
00290     if (fHelper->DoTaus()) {
00291       // Oscillate the taubars
00292       potentialTauBars.InverseOscillate(pars.Dm2Bar(),pars.Sn2Bar());
00293       // Write out the True Tau Spectrum
00294       TH1D hFDTausNuBar(*(potentialTauBars.Spectrum()));
00295       hFDTausNuBar.SetName("fdTausNuBar");
00296       vHistos.push_back(hFDTausNuBar);
00297       // Convert taus to reco energy
00298       potentialTauBars.TrueToReco(fHelper->FDTauBarRecoVsTrue());
00299     }
00300     // Oscillate the wrong sign component
00301     // Neutrinos for the antineutrino spectrum
00302     if (!fDoneWsNeutrinos) wrongSignNuMus.Oscillate(pars.Dm2(),pars.Sn2());
00303 
00304     // Now, convert wrong sign to reco energy
00305     if (!fDoneWsNeutrinos) wrongSignNuMus.TrueToReco(fHelper->FDWrongSignNuRecoVsTrue());
00306     
00307     // write out the true wrong sign spectra
00308     TH1D hFDWrongSignPQ(*(wrongSignNuMus.Spectrum()));
00309     hFDWrongSignPQ.SetName("fdWrongSignPQ");
00310     vHistos.push_back(hFDWrongSignPQ);
00311     
00312     //Oscillation and efficiency for the antineutrino spectrum
00313     barPrediction.Oscillate(pars.Dm2Bar(),pars.Sn2Bar());
00314 
00315     // Write out the true antineutrino spectrum, without backgrounds
00316     TH1D hFDNoBackTruePQ(*(barPrediction.Spectrum()));
00317     hFDNoBackTruePQ.SetName("fdBasePredictionNuBars");
00318     vHistos.push_back(hFDNoBackTruePQ);
00319 
00320     //True to reco
00321     barPrediction.TrueToReco(fHelper->FDBarRecoVsTrue());
00322 
00323     // Antineutrino reco spectrum, before backgrounds
00324     TH1D hFDNoBackPQ(*(barPrediction.Spectrum()));
00325     hFDNoBackPQ.SetName("fdBasePredictionPQ");
00326     vHistos.push_back(hFDNoBackPQ);
00327 
00328     //Add in backgrounds
00329     barPrediction.Add(wrongSignNuMus);
00330     barPrediction.Add(barNCBackground);
00331     if (fHelper->DoTaus()) barPrediction.Add(potentialTauBars);
00332     
00333     TH1D hFDPredictionPQ(*(barPrediction.Spectrum()));
00334     hFDPredictionPQ.SetName("fdPredictionPQ");
00335     vHistos.push_back(hFDPredictionPQ);
00336 
00337     TH1D hFDNCPQ(*(barNCBackground.Spectrum()));
00338     hFDNCPQ.SetName("fdNCPQ");
00339     vHistos.push_back(hFDNCPQ);
00340 
00341     if (fHelper->DoTaus()) {
00342       TH1D hFDTausPQ(*(potentialTauBars.Spectrum()));
00343       hFDTausPQ.SetName("fdTausPQ");
00344       vHistos.push_back(hFDTausPQ);
00345     }
00346 
00347     TH1D hFDDataPQ(*(ffdBarData->Spectrum()));
00348     hFDDataPQ.SetName("fdDataPQ");
00349     vHistos.push_back(hFDDataPQ);
00350     
00351   } else {
00352       // Scale the histogram to zero, so as not to confuse people
00353       barPrediction.Spectrum()->Scale(0);
00354   }
00355 
00356   return vHistos;
00357 }
00358 
00359 
00360 //___________________________________________________________________
00361 
00362 void NuMMRunFC::CacheExtrapolation( void )
00363 {
00364     // Only cache once.
00365     if (fCached) return;
00366   
00367     ResetCache();
00368   
00369     // Disable this output for now - this process should be fast anyway!
00370     // if (!fQuietMode)
00371     //     cout << "Pre-calculating static extrapolation variables..." << endl;
00372     
00373     // Caching variables, to reduce the workload of each step of the fitter
00374     // Initialise these the way they would be before
00375     PreCalcnuPrediction = new NuMatrixSpectrum(*fndNuData);
00376     PreCalcbarPrediction = new NuMatrixSpectrum(*fndBarData);
00377     
00378     // Be lazy and just alias the pointers to references so can keep
00379     // the code the same
00380     NuMatrixSpectrum &nuPrediction = *PreCalcnuPrediction;
00381     NuMatrixSpectrum &barPrediction = *PreCalcbarPrediction;
00382     
00383     // Now we have prepared the extrapolation variables, calculate them
00384     // Get the neutrinos to the FD
00385     nuPrediction.Multiply(fHelper->NDNuPurity());
00386     nuPrediction.RecoToTrue(fHelper->NDNuRecoVsTrue());
00387     nuPrediction.Divide(fHelper->NDNuEfficiency());
00388     nuPrediction.Divide(fHelper->NuXSecGraph());
00389     nuPrediction.Divide(fndNuData->PoT());
00390     nuPrediction.Divide(fNDFidMass);
00391     nuPrediction.ExtrapolateNDToFD(fHelper->NuBeamMatrix());
00392     nuPrediction.Multiply(fFDFidMass);
00393     nuPrediction.Multiply(ffdNuData->PoT());
00394     // Reset the spectrum to the new PoT
00395     nuPrediction.ResetPoT(ffdNuData->PoT());
00396 
00397     //Get the antineutrinos to the FD
00398     barPrediction.Multiply(fHelper->NDBarPurity());
00399     barPrediction.RecoToTrue(fHelper->NDBarRecoVsTrue());
00400     barPrediction.Divide(fHelper->NDBarEfficiency());
00401     barPrediction.Divide(fHelper->BarXSecGraph());
00402     barPrediction.Divide(fndBarData->PoT());
00403     barPrediction.Divide(fNDFidMass);
00404     barPrediction.ExtrapolateNDToFD(fHelper->BarBeamMatrix());
00405     barPrediction.Multiply(fFDFidMass);
00406     barPrediction.Multiply(ffdBarData->PoT());
00407     // Reset the spectrum to the new PoT
00408     barPrediction.ResetPoT(ffdBarData->PoT());
00409 
00410     // Create and link to the Tau components, before we include the
00411     // cross section in the predictions (tau Xsec is different)
00412     PreCalcpotentialNuTaus = new NuMatrixSpectrum(nuPrediction);
00413     PreCalcpotentialTauBars = new NuMatrixSpectrum(barPrediction);
00414     NuMatrixSpectrum &potentialNuTaus = *PreCalcpotentialNuTaus;
00415     NuMatrixSpectrum &potentialTauBars = *PreCalcpotentialTauBars;
00416 
00417     if (fHelper->DoTaus()) {
00418       //Get the taus (ignoring any wrong-sign taubars)
00419       potentialNuTaus.Multiply(fHelper->XSecGraphNuTaus());
00420       potentialNuTaus.Multiply(fHelper->FDNuTauEfficiency());
00421       //Get the taubars (ignoring any wrong-sign taus)
00422       potentialTauBars.Multiply(fHelper->XSecGraphTauBars());
00423       potentialTauBars.Multiply(fHelper->FDTauBarEfficiency());
00424     }
00425     else {
00426       PreCalcpotentialNuTaus->Multiply(0.0);
00427       PreCalcpotentialTauBars->Multiply(0.0);
00428     }
00429   
00430     //Cross sections
00431     nuPrediction.Multiply(fHelper->NuXSecGraph());
00432     barPrediction.Multiply(fHelper->BarXSecGraph());
00433 
00434     // Now build the NC Spectrum, after the cross section calculation!
00435     PreCalcnuNCBackground = new NuMatrixSpectrum(*PreCalcnuPrediction);;
00436     PreCalcbarNCBackground = new NuMatrixSpectrum(*PreCalcbarPrediction);
00437     NuMatrixSpectrum &nuNCBackground = *PreCalcnuNCBackground;
00438     NuMatrixSpectrum &barNCBackground = *PreCalcbarNCBackground;  
00439 
00440     //Get the neutrino NC background
00441     nuNCBackground.Multiply(fHelper->FDNuEfficiency());
00442     nuNCBackground.TrueToReco(fHelper->FDNuRecoVsTrue());
00443     nuNCBackground.Divide(fHelper->FDNuPurity());
00444     nuNCBackground.Multiply(fHelper->FDNuNCContamination());
00445 
00446     //Get the antineutrino NC background
00447     barNCBackground.Multiply(fHelper->FDBarEfficiency());
00448     barNCBackground.TrueToReco(fHelper->FDBarRecoVsTrue());
00449     barNCBackground.Divide(fHelper->FDBarPurity());
00450     barNCBackground.Multiply(fHelper->FDBarNCContamination());
00451     
00452     // Now build the wrong sign spectrum
00453     PreCalcwrongSignNuMus = new NuMatrixSpectrum(*PreCalcnuPrediction);
00454     PreCalcwrongSignNuBars = new NuMatrixSpectrum(*PreCalcbarPrediction);
00455     NuMatrixSpectrum &wrongSignNuMus = *PreCalcwrongSignNuMus;
00456     NuMatrixSpectrum &wrongSignNuBars = *PreCalcwrongSignNuBars;
00457     
00458     // Do the Neutrino background for the antineutrino spectrum
00459     wrongSignNuMus.Multiply(fHelper->FDWrongSignNuEfficiency());
00460     
00461     // Do the Antineutrino background for the neutrino spectrum
00462     wrongSignNuBars.Multiply(fHelper->FDWrongSignBarEfficiency());
00463     
00464     // Apply the efficiency to the predictions
00465     barPrediction.Multiply(fHelper->FDBarEfficiency());
00466     nuPrediction.Multiply(fHelper->FDNuEfficiency());
00467     
00468   
00469     nuPrediction.SetName("NuMus");
00470     barPrediction.SetName("NuMuBars");
00471     
00472     if (fHelper->DoTaus()) {
00473       potentialNuTaus.SetName("NuTaus");
00474       potentialTauBars.SetName("NuTauBars");
00475     }
00476     
00477     wrongSignNuMus.SetName("WrongSign_NuMus");
00478     wrongSignNuBars.SetName("WrongSign_NuMuBars");
00479     
00480     nuNCBackground.SetName("NC_NuMus");
00481     barNCBackground.SetName("NC_NuMuBars");
00482   
00483     fCached = true;
00484   
00485     // If we have precalculated the wrong sign oscillations,
00486     // then we need to recalculate them next time we are given
00487     // the oscilaltion parameters. Reset the flags used to
00488     // control this  
00489     fDoneWsNeutrinos = fDoneWsAntineutrinos = false;
00490 }
00491 
00492 //____________________________________________________________________
00493 
00494 void NuMMRunFC::PreCalcWrongSign(const NuMMParameters& pars)
00495 {
00496     // Precalculate the wrong sign, if we have disabled predictions
00497     // for that class, and it hasn't been done already. This should only
00498     // be done once, unless of course the user does something strange like
00499     // turning on neutrino prediction in the middle of an extrapolation.
00500     if(!fDoneWsNeutrinos) {
00501         if (!fPredictNeutrinos)
00502         {
00503             if (!fQuietMode) cout << "Neutrino prediction off: Precalculating wrong sign oscillation." << endl;
00504             PreCalcwrongSignNuMus->Oscillate(pars.Dm2(),pars.Sn2());
00505             PreCalcwrongSignNuMus->TrueToReco(fHelper->FDWrongSignNuRecoVsTrue());
00506             fDoneWsNeutrinos = true;
00507         }
00508     }
00509     if(!fPredictAntiNeutrinos) {
00510         if (!fDoneWsAntineutrinos)
00511         {
00512             if (!fQuietMode) cout << "Antineutrino prediction off: Precalculating wrong sign oscillation." << endl;
00513             PreCalcwrongSignNuBars->Oscillate(pars.Dm2Bar(),pars.Sn2Bar());
00514             PreCalcwrongSignNuBars->TrueToReco(fHelper->FDWrongSignBarRecoVsTrue());
00515             fDoneWsAntineutrinos = true;
00516         }
00517     }
00518 }
00519 
00520 //____________________________________________________________________
00521 
00522 const pair<NuMatrixSpectrum,NuMatrixSpectrum>
00523 NuMMRunFC::MakeFDPred(const NuMMParameters& pars)
00524 {
00525   // Precache extrap, but only if needed
00526   CacheExtrapolation(); 
00527   // Do the wrong sign precalcuation, if it hasn't been done
00528   PreCalcWrongSign(pars);
00529   
00530   // Output the oscillation settings!
00531   if (!fQuietMode) {
00532       //pars.PrintStatus();
00533     cout << "sn2: " << pars.Sn2() << "; dm2: " << pars.Dm2() 
00534     << "; sn2bar: " << pars.Sn2Bar() << "; dm2bar: " << pars.Dm2Bar()
00535     << endl;
00536   }
00537   
00539   // For all neutrinos
00540 
00541   // Make copies of the prepared extrapolation variables, so that
00542   // we can alter them locally with the oscillation parameters
00543   NuMatrixSpectrum nuPrediction(*PreCalcnuPrediction);
00544   NuMatrixSpectrum barPrediction(*PreCalcbarPrediction);
00545   
00546   NuMatrixSpectrum potentialNuTaus(*PreCalcpotentialNuTaus);
00547   NuMatrixSpectrum potentialTauBars(*PreCalcpotentialTauBars);
00548 
00549   NuMatrixSpectrum nuNCBackground(*PreCalcnuNCBackground);
00550   NuMatrixSpectrum barNCBackground(*PreCalcbarNCBackground);
00551   
00552   NuMatrixSpectrum wrongSignNuMus(*PreCalcwrongSignNuMus);
00553   NuMatrixSpectrum wrongSignNuBars(*PreCalcwrongSignNuBars);
00554 
00556   // Processes for neutrinos
00557   
00558   if (fPredictNeutrinos)
00559   {  
00560     if (fHelper->DoTaus()) {
00561       // Oscillate the taus
00562       potentialNuTaus.InverseOscillate(pars.Dm2(),pars.Sn2());
00563       potentialNuTaus.TrueToReco(fHelper->FDNuTauRecoVsTrue());
00564     }
00565 
00566     // If we have pre-oscillated the wrong sign, do not do so again
00567     if (!fDoneWsAntineutrinos) {
00568         // Antineutrinos in the neutrino spectrum
00569         wrongSignNuBars.Oscillate(pars.Dm2Bar(),pars.Sn2Bar());
00570         wrongSignNuBars.TrueToReco(fHelper->FDWrongSignBarRecoVsTrue());
00571     }
00572 
00573     // Oscillate the Neutrino spectrum!
00574     nuPrediction.Oscillate(pars.Dm2(),pars.Sn2());
00575 
00576     // True to Reco
00577     nuPrediction.TrueToReco(fHelper->FDNuRecoVsTrue());
00578 
00579     //Add in backgrounds
00580     nuPrediction.Add(wrongSignNuBars);
00581     nuPrediction.Add(nuNCBackground);
00582     if (fHelper->DoTaus()) nuPrediction.Add(potentialNuTaus);
00583   } else {
00584       // Scale the histogram to zero, so as not to confuse people
00585       // if they look at the spectrum with neutrinos turned off
00586       nuPrediction.Spectrum()->Scale(0);
00587   }
00588   
00590   // Processes for Antineutrinos
00591   
00592   if (fPredictAntiNeutrinos)
00593   {
00594       if (fHelper->DoTaus()) {
00595         // Oscillate the taubars
00596         potentialTauBars.InverseOscillate(pars.Dm2Bar(),pars.Sn2Bar());
00597         potentialTauBars.TrueToReco(fHelper->FDTauBarRecoVsTrue());
00598       }
00599 
00600       // Only oscillate the wrong sign if it hasn't been done already
00601       if (!fDoneWsNeutrinos) {
00602           // Oscillate the wrong sign component
00603           // Neutrinos for the antineutrino spectrum
00604           wrongSignNuMus.Oscillate(pars.Dm2(),pars.Sn2());
00605           wrongSignNuMus.TrueToReco(fHelper->FDWrongSignNuRecoVsTrue());
00606       }
00607       // Oscillate the antineutrino spectrum!
00608       barPrediction.Oscillate(pars.Dm2Bar(),pars.Sn2Bar());
00609 
00610       // True to reco
00611      barPrediction.TrueToReco(fHelper->FDBarRecoVsTrue());
00612       
00613       // Add in backgrounds
00614       barPrediction.Add(wrongSignNuMus);
00615       barPrediction.Add(barNCBackground);
00616       if (fHelper->DoTaus()) barPrediction.Add(potentialTauBars);
00617   } else {
00618       // Scale the histogram to zero, so as not to confuse people
00619       barPrediction.Spectrum()->Scale(0);
00620   }
00621   
00622   // Return the two predictions, as a pair
00623   pair<NuMatrixSpectrum,NuMatrixSpectrum>
00624     predictions(nuPrediction,barPrediction);
00625   return predictions;
00626 }
00627 
00628 
00629 //____________________________________________________________________
00630 // Be careful -- DO NOT precalculate the wrong signs for this function
00631 
00632 const NuMatrixSpectrum NuMMRunFC::TrueComponents(const NuMMParameters& pars, Sample_t s)
00633 {
00634   // Precache extrap, but only if needed
00635   CacheExtrapolation(); 
00636 
00637   // Output the oscillation settings!
00638   if (!fQuietMode) {
00639     cout << "sn2: " << pars.Sn2() << "; dm2: " << pars.Dm2() 
00640     << "; sn2bar: " << pars.Sn2Bar() << "; dm2bar: " << pars.Dm2Bar()
00641     << endl;
00642   }
00643   
00644   if (fDoneWsNeutrinos || fDoneWsAntineutrinos) {
00645     MSG("NuMMRunFC",Msg::kError) << "Already True-To-Recoed the wrong signs.  Cannot precalculate the wrong-signs for event-by-event.  Bailing." << endl;
00646     MSG("NuMMRunFC",Msg::kFatal) << "Already True-To-Recoed the wrong signs.  Cannot precalculate the wrong-signs for event-by-event.  Bailing." << endl;
00647   } 
00648   
00649   // No appeared spectrum for oscillations
00650   if (s == kAppearedPQ || s == kAppearedNQ) {
00651     NuMatrixSpectrum blank(*PreCalcnuPrediction);
00652     blank.SetName("Blank");
00653     blank.Spectrum()->Scale(0);
00654     return blank;    
00655   }
00656   
00657   // Request NQ spectrum, but no NuBar Predictions OR
00658   // Request PQ spectrum, but no NuMu Predictions
00659   if ( (s < 0 && !fPredictNeutrinos) || 
00660       (s > 0 && !fPredictAntiNeutrinos) ) {
00661     NuMatrixSpectrum blank(*PreCalcnuPrediction);
00662     blank.SetName("Blank");
00663     blank.Spectrum()->Scale(0);
00664     return blank;
00665   }
00666   
00667   if (s == kSignalPQ) {
00668     NuMatrixSpectrum barPrediction(*PreCalcbarPrediction);
00669     barPrediction.Oscillate(pars.Dm2Bar(),pars.Sn2Bar());
00670     return barPrediction;
00671   }
00672   else if (s == kSignalNQ) {
00673     NuMatrixSpectrum nuPrediction(*PreCalcnuPrediction);  
00674     nuPrediction.Oscillate(pars.Dm2(),pars.Sn2());
00675     return nuPrediction;
00676   }
00677   else if (s == kWrongSignPQ) {
00678     NuMatrixSpectrum wrongSignNuMus(*PreCalcwrongSignNuMus);
00679     wrongSignNuMus.Oscillate(pars.Dm2(),pars.Sn2());
00680     return wrongSignNuMus;
00681   }
00682   else if (s == kWrongSignNQ) {
00683     NuMatrixSpectrum wrongSignNuBars(*PreCalcwrongSignNuBars);
00684     wrongSignNuBars.Oscillate(pars.Dm2Bar(),pars.Sn2Bar());
00685     return wrongSignNuBars;
00686   }  
00687   else if (s == kNCPQ) {
00688     NuMatrixSpectrum barNCBackground(*PreCalcbarNCBackground);
00689     return barNCBackground;
00690   }
00691   else if (s == kNCNQ) {
00692     NuMatrixSpectrum nuNCBackground(*PreCalcnuNCBackground);
00693     return nuNCBackground;
00694   }
00695   else if (s == kTauPQ) {
00696     NuMatrixSpectrum potentialTauBars(*PreCalcpotentialTauBars);
00697     potentialTauBars.InverseOscillate(pars.Dm2Bar(),pars.Sn2Bar());
00698     return potentialTauBars;
00699   }
00700   else if (s == kTauNQ) {
00701     NuMatrixSpectrum potentialNuTaus(*PreCalcpotentialNuTaus);
00702     potentialNuTaus.InverseOscillate(pars.Dm2(),pars.Sn2());
00703     return potentialNuTaus;
00704   }
00705   else {
00706     MSG("NuMMRunTransitions",Msg::kWarning) << "Requested unknown prediction #" << s << ", returning blank." << endl;
00707     NuMatrixSpectrum blank(*PreCalcnuPrediction);
00708     blank.SetName("Blank");
00709     blank.Spectrum()->Scale(0);
00710     return blank;
00711   }
00712 }
00713 
00714 //____________________________________________________________________
00715 
00716 const Double_t NuMMRunFC
00717 ::ComparePredWithData(const NuMMParameters& pars)
00718 {
00719   // Generate a prediction
00720   const pair<NuMatrixSpectrum,NuMatrixSpectrum> predictions =
00721     this->MakeFDPred(pars);
00722   Double_t like = 0;
00723   // Now, only count a likelihood for components we want - this is just
00724   // a constant offset, but should help speed things up a little.
00725   if (fPredictNeutrinos)
00726   {
00727     like += this->StatsLikelihood(predictions.first.Spectrum(),
00728         ffdNuData->Spectrum());
00729   }
00730   if (fPredictAntiNeutrinos) {
00731     like += this->StatsLikelihood(predictions.second.Spectrum(),
00732         ffdBarData->Spectrum());
00733   }
00734   return like;
00735 }

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