00001
00002
00003
00004
00005
00006
00008
00009 #include "NCUtils/Extrapolation/NCEnergyBin.h"
00010 #include "AnalysisNtuples/ANtpRecoInfo.h"
00011 #include "AnalysisNtuples/ANtpTruthInfoBeam.h"
00012 #include "MessageService/MsgService.h"
00013 #include "TMath.h"
00014
00015 #include <cassert>
00016
00017 CVSID("$Id: NCEnergyBin.cxx,v 1.41 2009/08/10 17:56:47 bckhouse Exp $");
00018
00019
00020 NCEnergyBin::NCEnergyBin(double binCenter, double binWidth,
00021 NCType::EEventType nccc) :
00022 fSignal(0.),
00023 fBinCenter(binCenter),
00024 fBinWidth(binWidth),
00025 fBinType(nccc)
00026 {
00027 fNCBin = (nccc == NCType::kNC);
00028
00029 MSG("NCEnergyBin", Msg::kDebug) << "NCEnergyBin::Constructor" << endl;
00030 }
00031
00032
00033 void NCEnergyBin::AddEventToBin(const ANtpRecoInfo* recoInfo,
00034 const ANtpTruthInfoBeam* truthInfo,
00035 NCType::EFileType fileType)
00036 {
00037 const double weight = recoInfo->weight;
00038
00039
00040 double trackEnergy=fNCBin ? 0 : recoInfo->muEnergy;
00041
00042 if(!truthInfo){
00043
00044 fSignal += weight;
00045 fDataEnergies.push_back(recoInfo->nuEnergy);
00046 fDataWeights.push_back(weight);
00047
00048 return;
00049 }
00050
00051 const bool electron = TMath::Abs(truthInfo->nuFlavor) == 12;
00052
00053
00054
00055 if(fileType == NCType::kBeamFile && !electron &&
00056 ((fNCBin && truthInfo->interactionType == NCType::kCC) ||
00057 (!fNCBin && truthInfo->interactionType == NCType::kNC))){
00058 fMCBeamWeightBG.push_back(weight);
00059 fMCRecoShowerEBG.push_back(recoInfo->showerEnergy);
00060 fMCRecoMuonEBG.push_back(trackEnergy);
00061 fMCFlavorBG.push_back(truthInfo->nuFlavor);
00062 fMCEnergyBG.push_back(truthInfo->nuEnergy);
00063 return;
00064 }
00065
00066 if(fileType == NCType::kTauFile &&
00067 truthInfo->interactionType == NCType::kCC){
00068 fMCBeamWeightNuTau.push_back(weight);
00069 fMCRecoShowerENuTau.push_back(recoInfo->showerEnergy);
00070 fMCRecoMuonENuTau.push_back(trackEnergy);
00071 fMCFlavorNuTau.push_back(truthInfo->nuFlavor);
00072 fMCEnergyNuTau.push_back(truthInfo->nuEnergy);
00073 return;
00074 }
00075
00076 if(electron &&
00077 fileType == NCType::kBeamFile){
00078 fMCBeamWeightBeamNuE.push_back(weight);
00079 fMCRecoShowerEBeamNuE.push_back(recoInfo->showerEnergy);
00080 fMCRecoMuonEBeamNuE.push_back(trackEnergy);
00081 fMCFlavorBeamNuE.push_back(truthInfo->nuFlavor);
00082 fMCEnergyBeamNuE.push_back(truthInfo->nuEnergy);
00083 return;
00084 }
00085
00086 if(electron &&
00087 fileType == NCType::kElectronFile &&
00088 truthInfo->interactionType == NCType::kCC){
00089 fMCBeamWeightOscNuE.push_back(weight);
00090 fMCRecoShowerEOscNuE.push_back(recoInfo->showerEnergy);
00091 fMCRecoMuonEOscNuE.push_back(trackEnergy);
00092 fMCFlavorOscNuE.push_back(truthInfo->nuFlavor);
00093 fMCEnergyOscNuE.push_back(truthInfo->nuEnergy);
00094 return;
00095 }
00096
00097 fMCBeamWeight.push_back(weight);
00098 fMCRecoShowerE.push_back(recoInfo->showerEnergy);
00099 fMCRecoMuonE.push_back(trackEnergy);
00100 fMCFlavor.push_back(truthInfo->nuFlavor);
00101 fMCEnergy.push_back(truthInfo->nuEnergy);
00102 }
00103
00104
00105 int NCEnergyBin::GetDataVectorSize() const
00106 {
00107 return int(fDataEnergies.size());
00108 }
00109
00110
00111 void NCEnergyBin::GetDataInformation(double &energy, double &weight, int eventNum) const
00112 {
00113 assert(eventNum < int(fDataEnergies.size()));
00114
00115 energy = fDataEnergies[eventNum];
00116 weight = fDataWeights[eventNum];
00117 }
00118
00119
00120 double NCEnergyBin::GetSignal() const
00121 {
00122 return fSignal;
00123 }
00124
00125
00126 double NCEnergyBin::GetBinCentralValue() const
00127 {
00128 return fBinCenter;
00129 }
00130
00131
00132 double NCEnergyBin::GetBinWidth() const
00133 {
00134 return fBinWidth;
00135 }
00136
00137
00138 int NCEnergyBin::GetBinType() const
00139 {
00140 return fBinType;
00141 }
00142
00143
00144 void NCEnergyBin::SetSignal(double signal)
00145 {
00146 fSignal = signal;
00147 }
00148
00149
00150 int NCEnergyBin::GetMCSignalVectorSize() const
00151 {
00152 return int(fMCBeamWeight.size());
00153 }
00154
00155
00156 void NCEnergyBin::GetMCInformation(double &trueEnergy,
00157 double &recoShowerE,
00158 double &recoMuonE,
00159 double &weight,
00160 int &flavor,
00161 int eventNum) const
00162 {
00163 assert(eventNum < int(fMCEnergy.size()));
00164
00165 trueEnergy = fMCEnergy[eventNum];
00166 recoShowerE = fMCRecoShowerE[eventNum];
00167 recoMuonE = fMCRecoMuonE[eventNum];
00168 weight = fMCBeamWeight[eventNum];
00169 flavor = fMCFlavor[eventNum];
00170 }
00171
00172
00173 int NCEnergyBin::GetMCBackgroundVectorSize() const
00174 {
00175 return int(fMCBeamWeightBG.size());
00176 }
00177
00178
00179 void NCEnergyBin::GetMCBackgroundInformation(double &trueEnergy,
00180 double &recoShowerE,
00181 double &recoMuonE,
00182 double &weight,
00183 int &flavor,
00184 int eventNum) const
00185 {
00186
00187 assert(eventNum < int(fMCEnergyBG.size()));
00188
00189 trueEnergy = fMCEnergyBG[eventNum];
00190 recoShowerE = fMCRecoShowerEBG[eventNum];
00191 recoMuonE = fMCRecoMuonEBG[eventNum];
00192 weight = fMCBeamWeightBG[eventNum];
00193 flavor = fMCFlavorBG[eventNum];
00194 }
00195
00196
00197 int NCEnergyBin::GetMCNuTauVectorSize() const
00198 {
00199 return int(fMCBeamWeightNuTau.size());
00200 }
00201
00202
00203 void NCEnergyBin::GetMCNuTauInformation(double &trueEnergy,
00204 double &recoShowerE,
00205 double &recoMuonE,
00206 double &weight,
00207 int &flavor,
00208 int eventNum) const
00209 {
00210
00211 assert(eventNum < int(fMCEnergyNuTau.size()));
00212
00213 trueEnergy = fMCEnergyNuTau[eventNum];
00214 recoShowerE = fMCRecoShowerENuTau[eventNum];
00215 recoMuonE = fMCRecoMuonENuTau[eventNum];
00216 weight = fMCBeamWeightNuTau[eventNum];
00217 flavor = fMCFlavorNuTau[eventNum];
00218 }
00219
00220
00221 int NCEnergyBin::GetMCOscNuEVectorSize() const
00222 {
00223 return int(fMCBeamWeightOscNuE.size());
00224 }
00225
00226
00227 void NCEnergyBin::GetMCOscNuEInformation(double &trueEnergy,
00228 double &recoShowerE,
00229 double &recoMuonE,
00230 double &weight,
00231 int &flavor,
00232 int eventNum) const
00233 {
00234 assert(eventNum < int(fMCEnergyOscNuE.size()));
00235
00236 trueEnergy = fMCEnergyOscNuE[eventNum];
00237 recoShowerE = fMCRecoShowerEOscNuE[eventNum];
00238 recoMuonE = fMCRecoMuonEOscNuE[eventNum];
00239 weight = fMCBeamWeightOscNuE[eventNum];
00240 flavor = fMCFlavorOscNuE[eventNum];
00241 }
00242
00243
00244 int NCEnergyBin::GetMCBeamNuEVectorSize() const
00245 {
00246 return int(fMCBeamWeightBeamNuE.size());
00247 }
00248
00249
00250 void NCEnergyBin::GetMCBeamNuEInformation(double &trueEnergy,
00251 double &recoShowerE,
00252 double &recoMuonE,
00253 double &weight,
00254 int &flavor,
00255 int eventNum) const
00256 {
00257 assert(eventNum < int(fMCEnergyBeamNuE.size()));
00258
00259 trueEnergy = fMCEnergyBeamNuE[eventNum];
00260 recoShowerE = fMCRecoShowerEBeamNuE[eventNum];
00261 recoMuonE = fMCRecoMuonEBeamNuE[eventNum];
00262 weight = fMCBeamWeightBeamNuE[eventNum];
00263 flavor = fMCFlavorBeamNuE[eventNum];
00264 }
00265
00266
00267 void NCEnergyBin::Add(NCEnergyBin *bin)
00268 {
00269
00270
00271 if(bin->GetBinType() == fBinType
00272 && bin->GetBinCentralValue() == fBinCenter){
00273
00274 double energy = 0.;
00275 double weight = 0.;
00276 double recoShowerE = 0.;
00277 double recoMuonE = 0.;
00278 int flavor = 0;
00279
00280 int size = bin->GetDataVectorSize();
00281 for(int i = 0; i < size; ++i){
00282 bin->GetDataInformation(energy, weight, i);
00283 fDataEnergies.push_back(energy);
00284 fDataWeights.push_back(weight);
00285 fSignal += weight;
00286 }
00287
00288 size = bin->GetMCSignalVectorSize();
00289 for(int j = 0; j < size; ++j){
00290 bin->GetMCInformation(energy, recoShowerE, recoMuonE, weight, flavor, j);
00291 fMCBeamWeight.push_back(weight);
00292 fMCRecoShowerE.push_back(recoShowerE);
00293 fMCRecoMuonE.push_back(recoMuonE);
00294 fMCFlavor.push_back(flavor);
00295 fMCEnergy.push_back(energy);
00296
00297 }
00298
00299 size = bin->GetMCBackgroundVectorSize();
00300 for(int j = 0; j < size; ++j){
00301 bin->GetMCBackgroundInformation(energy, recoShowerE, recoMuonE, weight, flavor, j);
00302 fMCBeamWeightBG.push_back(weight);
00303 fMCRecoShowerEBG.push_back(recoShowerE);
00304 fMCRecoMuonEBG.push_back(recoMuonE);
00305 fMCFlavorBG.push_back(flavor);
00306 fMCEnergyBG.push_back(energy);
00307
00308 }
00309
00310 size = bin->GetMCNuTauVectorSize();
00311 for(int j = 0; j < size; ++j){
00312 bin->GetMCNuTauInformation(energy, recoShowerE, recoMuonE, weight, flavor, j);
00313 fMCBeamWeightNuTau.push_back(weight);
00314 fMCRecoShowerENuTau.push_back(recoShowerE);
00315 fMCRecoMuonENuTau.push_back(recoMuonE);
00316 fMCFlavorNuTau.push_back(flavor);
00317 fMCEnergyNuTau.push_back(energy);
00318 }
00319
00320 size = bin->GetMCOscNuEVectorSize();
00321 for(int j = 0; j < size; ++j){
00322 bin->GetMCOscNuEInformation(energy, recoShowerE, recoMuonE, weight, flavor, j);
00323 fMCBeamWeightOscNuE.push_back(weight);
00324 fMCRecoShowerEOscNuE.push_back(recoShowerE);
00325 fMCRecoMuonEOscNuE.push_back(recoMuonE);
00326 fMCFlavorOscNuE.push_back(flavor);
00327 fMCEnergyOscNuE.push_back(energy);
00328 }
00329
00330 size = bin->GetMCBeamNuEVectorSize();
00331 for(int j = 0; j < size; ++j){
00332 bin->GetMCBeamNuEInformation(energy, recoShowerE, recoMuonE, weight, flavor, j);
00333 fMCBeamWeightBeamNuE.push_back(weight);
00334 fMCRecoShowerEBeamNuE.push_back(recoShowerE);
00335 fMCRecoMuonEBeamNuE.push_back(recoMuonE);
00336 fMCFlavorBeamNuE.push_back(flavor);
00337 fMCEnergyBeamNuE.push_back(energy);
00338 }
00339
00340 }
00341 else
00342 MSG("NCEnergyBin", Msg::kWarning) << "trying to add incompatible bins "
00343 << " " << fBinType << "/" << bin->GetBinType()
00344 << " " << fBinCenter << "/" << bin->GetBinCentralValue()
00345 << endl;
00346 }
00347
00348
00350 template<class T> void ZeroVector(vector<T>& vec)
00351 {
00352 for(unsigned int n = 0; n < vec.size(); ++n) vec[n] = 0;
00353 }
00354
00355
00356 void NCEnergyBin::Reset(bool data, bool mc)
00357 {
00358
00359
00360 if(data){
00361 fSignal = 0;
00362
00363 ZeroVector(fDataEnergies);
00364 ZeroVector(fDataWeights);
00365 }
00366
00367 if(mc){
00368 ZeroVector(fMCEnergy);
00369 ZeroVector(fMCEnergyBG);
00370 ZeroVector(fMCEnergyNuTau);
00371 ZeroVector(fMCEnergyOscNuE);
00372 ZeroVector(fMCEnergyBeamNuE);
00373 ZeroVector(fMCBeamWeight);
00374 ZeroVector(fMCBeamWeightBG);
00375 ZeroVector(fMCBeamWeightNuTau);
00376 ZeroVector(fMCBeamWeightOscNuE);
00377 ZeroVector(fMCBeamWeightBeamNuE);
00378 ZeroVector(fMCRecoShowerE);
00379 ZeroVector(fMCRecoMuonE);
00380 ZeroVector(fMCFlavor);
00381 ZeroVector(fMCRecoShowerEBG);
00382 ZeroVector(fMCRecoMuonEBG);
00383 ZeroVector(fMCFlavorBG);
00384 ZeroVector(fMCRecoShowerENuTau);
00385 ZeroVector(fMCRecoMuonENuTau);
00386 ZeroVector(fMCFlavorNuTau);
00387 ZeroVector(fMCRecoShowerEOscNuE);
00388 ZeroVector(fMCRecoMuonEOscNuE);
00389 ZeroVector(fMCFlavorOscNuE);
00390 ZeroVector(fMCRecoShowerEBeamNuE);
00391 ZeroVector(fMCRecoMuonEBeamNuE);
00392 ZeroVector(fMCFlavorBeamNuE);
00393 }
00394 }