// ------------------------------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------
// on tutorial.cc
auto * m_truth_info = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
const auto prange = m_truth_info->GetPrimaryParticleRange();
for (auto iter = prange.first; iter != prange.second; ++iter)
{
    PHG4Particle *ptcl = iter->second;
    // 找到pr electron track id
    if (abs(ptcl->get_pid()) == 11)  // 电子的 PDG ID 是 ±11
    {
        primary_electron_tracks.insert(ptcl->get_track_id());
    }
}

auto * hits_CEMC = findNode::getClass<PHG4HitContainer>(topNode, "G4HIT_CEMC");
PHG4HitContainer::ConstRange hit_range = hits_CEMC->getHits();
for (PHG4HitContainer::ConstIterator hit_iter = hit_range.first; hit_iter != hit_range.second; hit_iter++)
{
    PHG4Hit *this_hit = hit_iter->second;
    float light_yield = hit_iter->second->get_light_yield();
    float edep = hit_iter->second->get_edep();
    int ch = hit_iter->second->get_layer();
    float x = hit_iter->second->get_x(0);
    float y = hit_iter->second->get_y(0);
    float z = hit_iter->second->get_z(0);
    
    // add trkid to a set
    _CEMC_Hit_Evis.push_back(light_yield);
    _CEMC_Hit_Edep.push_back(edep);
    _CEMC_Hit_ch.push_back(ch);
    _CEMC_Hit_x.push_back(x);
    _CEMC_Hit_y.push_back(y);
    _CEMC_Hit_z.push_back(z);

    // get primary electron hits on emcal
    int track_id = this_hit->get_trkid();

    // 只选择初级电子的 G4Hit，忽略由 shower 产生的次级粒子
    if (primary_electron_tracks.find(track_id) != primary_electron_tracks.end())
    {
        prhit0 += 1;

        double x0 = this_hit->get_x(0);  // 入口 x
        double y0 = this_hit->get_y(0);  // 入口 y
        double z0 = this_hit->get_z(0);  // 入口 z
        double t0 = this_hit->get_t(0);  // 时间
        double r0 = sqrt(x0*x0 + y0*y0);

        double x1 = this_hit->get_x(1);  // 出口 x
        double y1 = this_hit->get_y(1);  // 出口 y
        double z1 = this_hit->get_z(1);  // 出口 z
        double t1 = this_hit->get_t(1);  // 时间

        if (prhit0 == 1) 
        {
            _CEMC_Pr_Hit_x.push_back(x0);
            _CEMC_Pr_Hit_y.push_back(y0);
            _CEMC_Pr_Hit_z.push_back(z0);
            _CEMC_Pr_Hit_R.push_back(r0);
        }
    }
}

// on CaloInfo.C
double PrHit_x = CEMC_Pr_Hit_x->at(0);
double PrHit_y = CEMC_Pr_Hit_y->at(0);
double PrHit_z = CEMC_Pr_Hit_z->at(0);
double pr1cemc_xyz[3] = {PrHit_x, PrHit_y, PrHit_z};

// ------------------------------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------
// on tutorial.cc
auto * hits_CEMC = findNode::getClass<PHG4HitContainer>(topNode, "G4HIT_CEMC");
PHG4HitContainer::ConstRange hit_range = hits_CEMC->getHits();
for (PHG4HitContainer::ConstIterator hit_iter = hit_range.first; hit_iter != hit_range.second; hit_iter++)
{
    PHG4Hit *this_hit = hit_iter->second;
    float edep = hit_iter->second->get_edep();
    float x = hit_iter->second->get_x(0);
    float y = hit_iter->second->get_y(0);
    float z = hit_iter->second->get_z(0);
    
    _CEMC_Hit_Edep.push_back(edep);
    _CEMC_Hit_x.push_back(x);
    _CEMC_Hit_y.push_back(y);
    _CEMC_Hit_z.push_back(z);
}

// on CaloInfo.C
Double_t g4hit_TotEMCalE = 0.;
Double_t g4hit_ModifEMCal_x = 0.;
Double_t g4hit_ModifEMCal_y = 0.;
Double_t g4hit_ModifEMCal_z = 0.;

for (size_t j = 0; j < CEMC_Hit_x->size(); j++)
{            
    double hitval_x = CEMC_Hit_x->at(j);
    double hitval_y = CEMC_Hit_y->at(j);
    double hitval_z = CEMC_Hit_z->at(j);
    double hitval_R = TMath::Sqrt(hitval_x * hitval_x + hitval_y * hitval_y);
    double hitval_phi = TMath::ATan2(hitval_y, hitval_x);
    double hitval_eta = TMath::ATan2(hitval_R, hitval_z);
    double hitval_edep = CEMC_Hit_Edep->at(j);

    if(hitval_R<200)
    {
        g4hit_TotEMCalE += hitval_edep;

        g4hit_ModifEMCal_x += hitval_edep * hitval_x;
        g4hit_ModifEMCal_y += hitval_edep * hitval_y;
        g4hit_ModifEMCal_z += hitval_edep * hitval_z;
    }
}
g4hit_ModifEMCal_x /= g4hit_TotEMCalE;
g4hit_ModifEMCal_y /= g4hit_TotEMCalE;
g4hit_ModifEMCal_z /= g4hit_TotEMCalE;
double g4hit_xyz[3] = {g4hit_ModifEMCal_x, g4hit_ModifEMCal_y, g4hit_ModifEMCal_z};
