Skip to content
Snippets Groups Projects
reconstruction.cpp 4.35 KiB
Newer Older
  • Learn to ignore specific revisions
  • mingf2's avatar
    mingf2 committed
    #include "reconstruction.h"
    
    int addCones(const Setup* config, TH2D* histo, ULong64_t& counts,
                 std::vector<Cone>::const_iterator first,
                 std::vector<Cone>::const_iterator last)
    {
        // project cones onto the spherical surface
        double alpha(0);
        double beta(0);
        double E2(0);
        double sgma2(0);
        double sgmb2(0);
        Vector3D ray;
        for (auto k = first; k < last; k++)
        {
            alpha = k->cosHalfAngle;
            // ideal case: inital energy is known
            // sgma2 = std::pow(0.511*k->E0/std::pow((k->E0-k->Edpst),2)*config->sgmE, 2);
            // realistic case: initial energy = E_1 + E_2
            E2 = k->E0 - k->Edpst;
            sgma2 = std::pow(k->Edpst/std::pow(k->E0, 2) , 2) + std::pow(1/E2 - E2/std::pow(k->E0, 2) , 2);
            sgma2 *= std::pow(config->sgmE * 0.511, 2);
            #pragma omp parallel for private(ray, beta, sgmb2)
            for (int i = 0; i < config->thetaBins; i++)
            {
                for (int j = 0; j < config->phiBins; j++)
                {
                    ray = k->apex - config->xbs[i][j];
                    beta = getCosAngle(ray, k->axis);
                    sgmb2 = std::pow((ray/(ray*ray) + k->axis/(k->axis*k->axis)-
                                    (ray+k->axis)/(ray*k->axis))*config->sgmpos * beta, 2);
                    sgmb2+= std::pow((ray/(ray*k->axis)-k->axis/(k->axis*k->axis))*config->sgmpos * beta, 2);
                    histo->SetBinContent(j+1, i+1,
                        histo->GetBinContent(j+1, i+1) +
                        std::exp(-std::pow((std::pow(beta, config->order)-std::pow(alpha, config->order)), 2)/
                                 (2*std::pow(config->order, 2)*
                                  (std::pow(alpha,2*config->order-2)*sgma2 +std::pow(beta, 2*config->order-2)*sgmb2))));
                }
            }
        }
        counts += (last - first);
    
        return 0;
    }
    
    int addConesNormalized(const Setup* config, TH2D* histo, ULong64_t& counts,
                 std::vector<Cone>::const_iterator first,
                 std::vector<Cone>::const_iterator last)
    {
        // project cones onto the spherical surface
        double alpha(0);
        double beta(0);
        double E2(0);
        double sgma2(0);
        double sgmb2(0);
        double summ(0);
        Vector3D ray;
        static std::vector<std::vector<double>> probDist(config->thetaBins, std::vector<double>(config->phiBins, 0));
        for (auto k = first; k < last; k++)
        {
            counts++;
            alpha = k->cosHalfAngle;
            // ideal case: inital energy is known
            // sgma2 = std::pow(0.511*k->E0/std::pow((k->E0-k->Edpst),2)*config->sgmE, 2);
            // realistic case: initial energy = E_1 + E_2
            E2 = k->E0 - k->Edpst;
            sgma2 = std::pow(k->Edpst/std::pow(k->E0, 2) , 2) + std::pow(1/E2 - E2/std::pow(k->E0, 2) , 2);
            sgma2 *= std::pow(config->sgmE * 0.511, 2);
            summ = 0;
            #pragma omp parallel for private(ray, beta, sgmb2) shared(probDist) reduction(+:summ)
            for (int i = 0; i < config->thetaBins; i++)
            {
                for (int j = 0; j < config->phiBins; j++)
                {
                    ray = k->apex - config->xbs[i][j];
                    beta = getCosAngle(ray, k->axis);
                    sgmb2 = std::pow((ray/(ray*ray) + k->axis/(k->axis*k->axis)-
                                    (ray+k->axis)/(ray*k->axis))*config->sgmpos * beta, 2);
                    sgmb2+= std::pow((ray/(ray*k->axis)-k->axis/(k->axis*k->axis))*config->sgmpos * beta, 2);
                    probDist[i][j] = std::exp(-std::pow((std::pow(beta, config->order)-std::pow(alpha, config->order)), 2)/
                                    (2*std::pow(config->order, 2)*
                                    (std::pow(alpha,2*config->order-2)*sgma2 +std::pow(beta, 2*config->order-2)*sgmb2)));
                    // use proability density
                    // uncomment to use integral in the bin
                    // probDist[i][j] = probDist[i][j] * config->dtheta * config->dphi * std::cos(config->thetaBinCenters[i]);
                    // summ += probDist[i][j];
                    summ += probDist[i][j] * config->dtheta * config->dphi * std::cos(config->thetaBinCenters[i]);
                }
            }
            // #pragma omp parallel for
            for (int i = 0; i < config->thetaBins; i++)
            {
                for (int j = 0; j < config->phiBins; j++)
                {
                    histo->SetBinContent(j+1, i+1, (histo->GetBinContent(j+1, i+1)*(counts - 1) + probDist[i][j] / summ) / counts);
                }
            }
        }
        return 0;
    }