Something went wrong on our end
-
Bertram Kopf authored740d38aa
AbsHist.cc 10.41 KiB
// AbsHist class definition file. -*- C++ -*-
// Copyright 2012 Bertram Kopf
#include <getopt.h>
#include <fstream>
#include <algorithm>
#include <boost/algorithm/string.hpp>
#include "PwaUtils/AbsHist.hh"
#include "PwaUtils/AbsEnv.hh"
#include "qft++/relativistic-quantum-mechanics/Utils.hh"
#include "ErrLogger/ErrLogger.hh"
#include "Particle/Particle.hh"
#include "Particle/ParticleTable.hh"
#include "Utils/PawianCollectionUtils.hh"
#include "PwaUtils/KinUtils.hh"
#include "PwaUtils/AbsLh.hh"
#include "PwaUtils/EvtDataBaseList.hh"
#include "TFile.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TNtuple.h"
AbsHist::AbsHist(AbsEnv* theEnv) :
_absEnv(theEnv)
{
std::ostringstream rootFileName;
rootFileName << "./pawianHists" << _absEnv->outputFileNameSuffix() << ".root";
_theTFile=new TFile(rootFileName.str().c_str(),"recreate");
std::vector<boost::shared_ptr<angleHistData> > angleHistDataVec=_absEnv->angleHistDataVec();
std::vector<boost::shared_ptr<angleHistData> >::iterator itAngleVec;
for (itAngleVec=angleHistDataVec.begin(); itAngleVec!=angleHistDataVec.end(); ++itAngleVec){
std::string tmpBaseName= (*itAngleVec)->_name;
boost::replace_all(tmpBaseName,"+","p");
boost::replace_all(tmpBaseName,"-","m");
std::string histThetaName="DataTheta"+tmpBaseName;
std::string histPhiName="DataPhi"+tmpBaseName;
std::string histThetaDescription = "cos#Theta(" +(*itAngleVec)->_name + ") (data)";
std::string histPhiDescription = "#phi(" +(*itAngleVec)->_name + ") (data)";
TH1F* currentThetaAngleDataHist=new TH1F(histThetaName.c_str(), histThetaDescription.c_str(), 100., -1., 1.);
TH1F* currentPhiAngleDataHist=new TH1F(histPhiName.c_str(), histPhiDescription.c_str(), 100., -3.14159, 3.14159);
currentThetaAngleDataHist->Sumw2();
currentPhiAngleDataHist->Sumw2();
_angleDataHistMap[*itAngleVec].push_back(currentThetaAngleDataHist);
_angleDataHistMap[*itAngleVec].push_back(currentPhiAngleDataHist);
histThetaName="MCTheta"+tmpBaseName;
histPhiName="MCPhi"+tmpBaseName;
histThetaDescription = "cos#Theta(" +(*itAngleVec)->_name + ") (MC)";
histPhiDescription = "#phi(" +(*itAngleVec)->_name + ") (MC)";
TH1F* currentThetaAngleMcHist=new TH1F(histThetaName.c_str(), histThetaDescription.c_str(), 100., -1., 1.);
TH1F* currentPhiAngleMcHist=new TH1F(histPhiName.c_str(), histPhiDescription.c_str(), 100., -3.14159, 3.14159);
currentThetaAngleMcHist->Sumw2();
currentPhiAngleMcHist->Sumw2();
_angleMcHistMap[*itAngleVec].push_back(currentThetaAngleMcHist);
_angleMcHistMap[*itAngleVec].push_back(currentPhiAngleMcHist);
histThetaName="FitTheta"+tmpBaseName;
histPhiName="FitPhi"+tmpBaseName;
histThetaDescription = "cos#Theta(" +(*itAngleVec)->_name + ") (fit)";
histPhiDescription = "#phi(" +(*itAngleVec)->_name + ") (fit)";
TH1F* currentThetaAngleFitHist=new TH1F(histThetaName.c_str(), histThetaDescription.c_str(), 100., -1., 1.);
TH1F* currentPhiAngleFitHist=new TH1F(histPhiName.c_str(), histPhiDescription.c_str(), 100., -3.14159, 3.14159);
currentThetaAngleFitHist->Sumw2();
currentPhiAngleFitHist->Sumw2();
_angleFitHistMap[*itAngleVec].push_back(currentThetaAngleFitHist);
_angleFitHistMap[*itAngleVec].push_back(currentPhiAngleFitHist);
if( (*itAngleVec)->_nBodyDecay == 3){
std::string histLambdaName="DataLambda"+tmpBaseName;
std::string histLambdaDescription = "#Lambda(" +(*itAngleVec)->_name + ") (data)";
TH1F* currentLambdaDataHist=new TH1F(histLambdaName.c_str(), histLambdaDescription.c_str(), 100., 0., 1.);
_angleDataHistMap[*itAngleVec].push_back(currentLambdaDataHist);
histLambdaName="MCLambda"+tmpBaseName;
histLambdaDescription = "#Lambda(" +(*itAngleVec)->_name + ") (MC)";
TH1F* currentLambdaMcHist=new TH1F(histLambdaName.c_str(), histLambdaDescription.c_str(), 100., 0., 1.);
_angleMcHistMap[*itAngleVec].push_back(currentLambdaMcHist);
histLambdaName="FitLambda"+tmpBaseName;
histLambdaDescription = "#Lambda(" +(*itAngleVec)->_name + ") (fit)";
TH1F* currentLambdaFitHist=new TH1F(histLambdaName.c_str(), histLambdaDescription.c_str(), 100., 0., 1.);
_angleFitHistMap[*itAngleVec].push_back(currentLambdaFitHist);
}
}
}
AbsHist::~AbsHist(){
_theTFile->Write();
_theTFile->Close();
}
void AbsHist::fillIt(boost::shared_ptr<AbsLh> theLh, fitParams& theFitParams){
if(0==theLh){
Alert <<"AbsLh* is a 0 pointer !!!!" ; // << endmsg;
exit(1);
}
boost::shared_ptr<const EvtDataBaseList> theEvtList=theLh->getEventList();
const std::vector<EvtData*> dataList=theEvtList->getDataVecs();
std::vector<EvtData*>::const_iterator it=dataList.begin();
while(it!=dataList.end())
{
double weight = (*it)->evtWeight;
fillMassHists((*it), weight, _massDataHistMap);
fillAngleHists((*it), weight, _angleDataHistMap);
++it;
}
const std::vector<EvtData*> mcList=theEvtList->getMcVecs();
it=mcList.begin();
while(it!=mcList.end())
{
double evtWeight = (*it)->evtWeight;
fillMassHists((*it), evtWeight, _massMcHistMap);
fillAngleHists((*it), evtWeight, _angleMcHistMap);
double fitWeight= theLh->calcEvtIntensity( (*it), theFitParams );
fillMassHists((*it), evtWeight*fitWeight, _massFitHistMap);
fillAngleHists((*it), evtWeight*fitWeight, _angleFitHistMap);
++it;
}
double integralDataWoWeight=(double) theEvtList->getDataVecs().size();
Info <<"No of data events without weight " << integralDataWoWeight ; // << endmsg;
double integralDataWWeight=(double) theEvtList->NoOfWeightedDataEvts();
Info <<"No of data events with weight " << integralDataWWeight ; // << endmsg;
double integralMC=(double) theEvtList->NoOfWeightedMcEvts();
Info <<"No of MC events " << integralMC ; // << endmsg;
Info <<"scaling factor " << integralDataWWeight/integralMC ; // << endmsg;
double scaleFactor = integralDataWWeight/integralMC;
std::map<boost::shared_ptr<massHistData>, TH1F*, pawian::Collection::SharedPtrLess >::iterator itMassMap;
for(itMassMap= _massFitHistMap.begin(); itMassMap!= _massFitHistMap.end(); ++itMassMap){
itMassMap->second->Scale(scaleFactor);
}
std::map<boost::shared_ptr<angleHistData>, std::vector<TH1F*>, pawian::Collection::SharedPtrLess >::iterator itAngleMap;
for(itAngleMap= _angleFitHistMap.begin(); itAngleMap!=_angleFitHistMap.end(); ++itAngleMap){
std::vector<TH1F*>::iterator itTH1F;
for(itTH1F=itAngleMap->second.begin(); itTH1F!=itAngleMap->second.end(); ++itTH1F){
(*itTH1F)->Scale(scaleFactor);
}
}
}
void AbsHist::fillMassHists(EvtData* theData, double weight, std::map<boost::shared_ptr<massHistData>, TH1F*, pawian::Collection::SharedPtrLess >& toFill){
std::map<boost::shared_ptr<massHistData>, TH1F*, pawian::Collection::SharedPtrLess >::iterator it;
for(it= toFill.begin(); it!= toFill.end(); ++it){
//get relevant 4 vecs
Vector4<double> combined4Vec(0.,0.,0.,0.);
std::vector<std::string> fspNames=it->first->_fspNames;
std::vector<std::string>::iterator itStr;
for(itStr=fspNames.begin(); itStr!=fspNames.end(); ++itStr){
Vector4<double> tmp4vec=theData->FourVecsString[*itStr];
combined4Vec+=tmp4vec;
}
it->second->Fill(combined4Vec.M(), weight);
}
}
void AbsHist::fillAngleHists(EvtData* theData, double weight, std::map<boost::shared_ptr<angleHistData>, std::vector<TH1F*>, pawian::Collection::SharedPtrLess >& toFill){
std::map<boost::shared_ptr<angleHistData>, std::vector<TH1F*>, pawian::Collection::SharedPtrLess >::iterator it;
for(it= toFill.begin(); it!= toFill.end(); ++it){
short nBodyDecay = it->first->_nBodyDecay;
Vector4<double> combinedDec4Vec(0.,0.,0.,0.);
Vector4<double> combinedDec4Vec2(0.,0.,0.,0.);
Vector4<double> combinedMother4Vec(0.,0.,0.,0.);
Vector4<double> all4Vec=theData->FourVecsString["all"];
std::vector<std::string> decNames=it->first->_decPNames;
std::vector<std::string> decNames2=it->first->_decPNames2;
std::vector<std::string>::iterator itStr;
for(itStr=decNames.begin(); itStr!=decNames.end(); ++itStr){
Vector4<double> tmp4vec=theData->FourVecsString[*itStr];
combinedDec4Vec+=tmp4vec;
}
for(itStr=decNames2.begin(); itStr!=decNames2.end(); ++itStr){
Vector4<double> tmp4vec=theData->FourVecsString[*itStr];
combinedDec4Vec2+=tmp4vec;
}
std::vector<std::string> motherNames=it->first->_motherPNames;
for(itStr=motherNames.begin(); itStr!=motherNames.end(); ++itStr){
Vector4<double> tmp4vec=theData->FourVecsString[*itStr];
combinedMother4Vec+=tmp4vec;
}
Vector4<double> result4Vec(0.,0.,0.,0.);
Vector4<double> result4Vec2(0.,0.,0.,0.);
if( fabs(all4Vec.E()-combinedMother4Vec.E()) < 1e-5
&& fabs(all4Vec.Px()-combinedMother4Vec.Px()) < 1e-5
&& fabs(all4Vec.Py()-combinedMother4Vec.Py()) < 1e-5
&& fabs(all4Vec.Pz()-combinedMother4Vec.Pz()) < 1e-5 ){
result4Vec=combinedDec4Vec;
result4Vec.Boost(all4Vec);
}
else{
result4Vec=helicityVec(all4Vec, combinedMother4Vec, combinedDec4Vec);
if(nBodyDecay==3)
result4Vec2=helicityVec(all4Vec, combinedMother4Vec, combinedDec4Vec2);
}
if(nBodyDecay == 2){
it->second[0]->Fill( result4Vec.CosTheta(), weight);
it->second[1]->Fill( result4Vec.Phi(), weight);
}
else if(nBodyDecay == 3){
Vector4<double> result4VecPart1 = result4Vec;
Vector4<double> result4VecPart2 = result4Vec2;
Vector4<float> normVec(0,
result4VecPart1.Y()*result4VecPart2.Z()-result4VecPart1.Z()*result4VecPart2.Y(),
result4VecPart1.Z()*result4VecPart2.X()-result4VecPart1.X()*result4VecPart2.Z(),
result4VecPart1.X()*result4VecPart2.Y()-result4VecPart1.Y()*result4VecPart2.X());
it->second[0]->Fill( normVec.CosTheta(), weight);
it->second[1]->Fill( normVec.Phi(), weight);
Vector4<double> result4VecPart3(combinedMother4Vec.M()-result4VecPart1.E()-result4VecPart2.E()
,-result4VecPart1.Px()-result4VecPart2.Px()
,-result4VecPart1.Py()-result4VecPart2.Py()
,-result4VecPart1.Pz()-result4VecPart2.Pz());
double theQ=result4VecPart1.E()-result4VecPart1.M()+result4VecPart2.E()-result4VecPart2.M()+result4VecPart3.E()-result4VecPart3.M();
double lambdaNorm=theQ*theQ*(theQ*theQ/108.+result4VecPart1.M()*theQ/9.+result4VecPart1.M()*result4VecPart1.M()/3.);
double lambda=normVec.P()*normVec.P()/lambdaNorm;
it->second[2]->Fill( lambda, weight);
}
}
}