Skip to content
102 changes: 102 additions & 0 deletions source/container/LKMCTag.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#include "LKMCTag.h"

ClassImp(LKMCTag)

LKMCTag::LKMCTag()
{
Clear();
}

LKMCTag::~LKMCTag()
{
}

void LKMCTag::Clear(Option_t *option)
{
LKContainer::Clear(option);
fIndex.clear();
fMCID.clear();
fWeight.clear();
}

void LKMCTag::Copy(TObject &obj) const
{
((LKMCTag&)obj).Clear();
LKContainer::Copy(obj);
for (auto i=0; i<fIndex.size(); i++)
((LKMCTag&)obj).AddMCWeightTag(fMCID[i], fWeight[i], fIndex[i]);

}

void LKMCTag::AddMCTag(Int_t mcId, Int_t index)
{
AddMCWeightTag(mcId, 1., index);
}

void LKMCTag::AddMCWeightTag(Int_t mcId, Double_t weight, Int_t index)
{
bool isExist = false;
for (auto i=0; i<fIndex.size(); i++)
{
if (fIndex[i] == index && fMCID[i] == mcId) {
fWeight[i] = fWeight[i] + fabs(weight);
isExist = true;
break;
}
}

if (!isExist) {
fIndex.push_back(index);
fMCID.push_back(mcId);
fWeight.push_back(fabs(weight));
}
}

Int_t LKMCTag::GetMCNum(int index)
{
int num = 0;
for (auto i=0; i<fIndex.size(); i++)
if (fIndex[i] == index) num++;

return num;
}

Int_t LKMCTag::GetMCID(int mcIdx, int index)
{
if (mcIdx >= GetMCNum(index)) return -999;

int tmpIdx = 0;
for (auto i=0; i<fIndex.size(); i++)
{
if (fIndex[i] == index) {
if (tmpIdx == mcIdx) return fMCID[i];
tmpIdx++;
}
}

return -999;
}

Double_t LKMCTag::GetMCPurity(int mcIdx, int index)
{
if (mcIdx >= GetMCNum(index)) return -999.;

double mcIdxWeight = 0.;
double weightSum = 0.;
int tmpIdx = 0;
for (auto i=0; i<fIndex.size(); i++)
{
if (fIndex[i] == index) {
if (tmpIdx == mcIdx)
mcIdxWeight = fWeight[i];

weightSum += fWeight[i];
tmpIdx++;
}
}

if (weightSum == 0.) return -999.;
mcIdxWeight /= weightSum;

return mcIdxWeight;
}
32 changes: 32 additions & 0 deletions source/container/LKMCTag.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#ifndef LKMCTAG_HH
#define LKMCTAG_HH

#include <vector>

#include "LKContainer.h"

class LKMCTag : public LKContainer
{
protected:
std::vector<Int_t> fIndex; // Arbitrary index
std::vector<Int_t> fMCID; // Truth track ID
std::vector<Double_t> fWeight; // Truth track weight within same index

public:
LKMCTag();
virtual ~LKMCTag();

virtual void Clear(Option_t *option = "");
virtual void Copy (TObject &object) const;

void AddMCTag(Int_t mcId, Int_t index=-1);
void AddMCWeightTag(Int_t mcId, Double_t weight, Int_t index=-1);

Int_t GetMCNum(int index=-1);
Int_t GetMCID(int mcIdx=0, int index=-1);
Double_t GetMCPurity(int mcIdx=0, int index=-1);

ClassDef(LKMCTag, 1)
};

#endif