#pragma implementation
#include "TClass.h"
#include "TFile.h"
#include "hshowerdigidetpar.h"
#include "hparhadasciifileio.h"
#include "TRandom.h"

#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <cmath>
using namespace std;

ClassImp(HShowerDigiDetPar)

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////
//
// HShowerDigiDetPar - parameters of digitalisation
//
/////////////////////////////////////////////////////////

//------------------------------------------------------------------------------

#define CHARGE_MATRIX_SIZE (2 * nMatrixRange + 1)
#define CALCULATE_FROM_FIT(FUN, X)  (((FUN[3]*X+FUN[2])*X+FUN[1])*X+FUN[0])

//------------------------------------------------------------------------------
 HShowerDigiDetPar::HShowerDigiDetPar(const Char_t* name,const Char_t* title,
                                      const Char_t* context)
                                      : HShowerParSet(name,title,context)
{
    pfChargeMatrix = NULL;
    phEff          = NULL;
    ph2QvB         = NULL;
    pArrayQvB      = NULL;
    clear();
}

//------------------------------------------------------------------------------

HShowerDigiDetPar::~HShowerDigiDetPar()
{
    clear();
}

//------------------------------------------------------------------------------

void HShowerDigiDetPar::clear(void)
{
    fThickDet           = 1.0f;
    nMatrixRange        = 0;
    fBoxSize            = 1.0f;
    fChargeSlope        = 1.0f;
    fPlaneDist          = 1.0f;
    nPadRange           = 0;
    fPadThreshold       = 0.0f;
    fUpdatePadThreshold = 0.0f;
    fMasterOffset       = 0.0f;

    dQvSmin             = 0.0;
    dQvSmax             = 0.0;
    iQvSbins            = 0;

    if(pfChargeMatrix != NULL)
    {
        delete [] pfChargeMatrix;
        pfChargeMatrix = NULL;
    }

    memset(afMeanParams, 0, sizeof(afMeanParams));
    memset(afSigmaParams, 0, sizeof(afSigmaParams));
    memset(afEffParams, 0, sizeof(afEffParams));

    if(phEff != NULL)
    {
        delete phEff;
        phEff = NULL;
    }

    if(ph2QvB != NULL)
    {
        delete ph2QvB;
        ph2QvB = NULL;
    }

    if(pArrayQvB != NULL)
    {
        delete pArrayQvB;
        pArrayQvB = NULL;
    }
}

//------------------------------------------------------------------------------

void HShowerDigiDetPar::setChargeMatrix(Int_t nRange, const Float_t *pMatrix)
{
    if(pfChargeMatrix != NULL)
        delete [] pfChargeMatrix;

    nMatrixRange = nRange;

    if(nMatrixRange == 0)
        pfChargeMatrix = NULL;
    else
    {
        pfChargeMatrix = new Float_t[CHARGE_MATRIX_SIZE];
        if(pMatrix != NULL)
        {
            memcpy(pfChargeMatrix, pMatrix,
                            sizeof(Float_t) * CHARGE_MATRIX_SIZE);
        }
        else
            memset(pfChargeMatrix, 0, sizeof(Float_t) * CHARGE_MATRIX_SIZE);
    }
}

//------------------------------------------------------------------------------

void HShowerDigiDetPar::setMeanParams(const Float_t *pParams)
{
    if(pParams == NULL)
        memset(afMeanParams, 0, sizeof(afMeanParams));
    else
        memcpy(afMeanParams, pParams, sizeof(afMeanParams));
}

//------------------------------------------------------------------------------

void HShowerDigiDetPar::setSigmaParams(const Float_t *pParams)
{
    if(pParams == NULL)
        memset(afSigmaParams, 0, sizeof(afSigmaParams));
    else
        memcpy(afSigmaParams, pParams, sizeof(afSigmaParams));
}

//------------------------------------------------------------------------------

void HShowerDigiDetPar::setEffParams(const Float_t *pParams)
{
    if(pParams == NULL)
        memset(afEffParams, 0, sizeof(afEffParams));
    else
        memcpy(afEffParams, pParams, sizeof(afEffParams));
}

//------------------------------------------------------------------------------

Bool_t HShowerDigiDetPar::initAscii(HParHadAsciiFileIo* pHadAsciiFile)
{
Int_t   status = kTRUE;
TFile  *pFile;
Char_t  sFileName[1000];
Char_t  sHistName[1000];

    if(pHadAsciiFile == NULL)
        return kFALSE;

    try
    {
    HAsciiKey *pHAscii = pHadAsciiFile->GetKeyAscii();

        pHAscii->SetActiveSection("Shower Digitalization Parameters");

        fThickDet           = pHAscii->ReadFloat("thickDet");
        nMatrixRange        = pHAscii->ReadInt("matrixRange");
        fBoxSize            = pHAscii->ReadFloat("boxSize");
        fChargeSlope        = pHAscii->ReadFloat("chargeSlope");
        fPlaneDist          = pHAscii->ReadFloat("planeDist");
        nPadRange           = pHAscii->ReadInt("padRange");
        fPadThreshold       = pHAscii->ReadFloat("padThreshold");
        fUpdatePadThreshold = pHAscii->ReadFloat("updatePadThreshold");
        fMasterOffset       = pHAscii->ReadFloat("masterOffset");

//      pHAscii->ReadFloat(afMeanParams,  "chargeDigitMeanParams");
//      pHAscii->ReadFloat(afSigmaParams, "chargeDigitSigmaParams");
//      pHAscii->ReadFloat(afEffParams,   "efficiencyParams");

        setChargeMatrix(nMatrixRange);
        initChargeMatrix();

            // reads and get the histograms
        strcpy(sFileName, pHAscii->ReadString("sumVerBetaFile"));
        strcpy(sHistName, pHAscii->ReadString("sumVerBetaHist"));
        printf("sFileName: %s\nsHistName: %s\n", sFileName, sHistName);
        if(((pFile = new TFile(sFileName)) == NULL)
                || (pFile->IsOpen() == kFALSE))
        {
            Error("Cannot open the input histogram file: %s\n", sFileName);
            status = kFALSE;
        }
        else
        {
            if((ph2QvB = (TH2F *)pFile->Get(sHistName)) == NULL)
            {
                Error("No histogram %s in file: %s\n", sHistName, sFileName);
                status = kFALSE;
            }
            else
                ph2QvB->SetDirectory(0);
        }

        if(pFile != NULL)
            pFile->Close();

        if(status == kFALSE)
            return status;

            // reads and get the histograms
        strcpy(sFileName, pHAscii->ReadString("efficiencyFile"));
        strcpy(sHistName, pHAscii->ReadString("efficiencyHist"));
        if(((pFile = new TFile(sFileName)) == NULL)
                || (pFile->IsOpen() == kFALSE))
        {
            Error("Cannot open the input histogram file: %s\n", sFileName);
            status = kFALSE;
        }
        else
        {
            if((phEff = (TH1F *)pFile->Get(sHistName)) == NULL)
            {
                Error("No histogram %s in file: %s\n", sHistName, sFileName);
                status = kFALSE;
            }
            else
                phEff->SetDirectory(0);
        }

        if(pFile != NULL)
            pFile->Close();

        status = initSumVerBetaHistograms();
    }
    catch(Bool_t ret)
    {
        status = ret;
    }

    return status;
}

//------------------------------------------------------------------------------

Bool_t HShowerDigiDetPar::writeAscii(HParHadAsciiFileIo* pHadAsciiFile)
{
Bool_t status=kTRUE;

    if(pHadAsciiFile == NULL)
        return kFALSE;

    try
    {
    HAsciiKey* pHAscii = pHadAsciiFile->GetKeyAscii();

        pHAscii->WriteSection("Shower Digitalization Parameters");

        pHAscii->WriteFloat("thickDet", fThickDet);
        pHAscii->WriteInt("matrixRange", nMatrixRange);
        pHAscii->WriteFloat("boxSize", fBoxSize);
        pHAscii->WriteFloat("chargeSlope", fChargeSlope);
        pHAscii->WriteFloat("planeDist", fPlaneDist);
        pHAscii->WriteInt("padRange", nPadRange);
        pHAscii->WriteFloat("padThreshold", fPadThreshold);
        pHAscii->WriteFloat("updatePadThreshold", fUpdatePadThreshold);
        pHAscii->WriteFloat("masterOffset",fMasterOffset);

//      pHAscii->WriteFloat("chargeDigitMeanParams", POLY_DEGREE, afMeanParams);
//      pHAscii->WriteFloat("chargeDigitSigmaParams", POLY_DEGREE,
//                                                  afSigmaParams);
//      pHAscii->WriteFloat("efficiencyParams", POLY_DEGREE, afEffParams);
    }
    catch(Bool_t ret)
    {
        ret = status;
    }

    return status;
}

//------------------------------------------------------------------------------

Float_t HShowerDigiDetPar::calcCharge(Float_t fCharge, Float_t fDist,
                        Float_t fXd, Float_t fYd, Float_t fXu, Float_t fYu)
{
const Float_t twoPI = 6.28318530718;

return ((fCharge / twoPI) *
        (atan(fXd * fYd / (fDist * sqrt(fDist * fDist + fXd * fXd + fYd * fYd)))
       - atan(fXd * fYu / (fDist * sqrt(fDist * fDist + fXd * fXd + fYu * fYu)))
       + atan(fXu * fYu / (fDist * sqrt(fDist * fDist + fXu * fXu + fYu * fYu)))
       - atan(fXu * fYd / (fDist * sqrt(fDist * fDist + fXu * fXu + fYd * fYd)))
       ));
}

//------------------------------------------------------------------------------

void  HShowerDigiDetPar::initChargeMatrix()
{
Int_t   i;
Float_t cornerX = -0.5 * fBoxSize;
Float_t cornerY = cornerX;
Float_t fM;

    setChargeMatrix(nMatrixRange);

    for(i = 0; i <= nMatrixRange; i++)
    {
        pfChargeMatrix[nMatrixRange - i] = calcCharge(1., fPlaneDist,
                                 cornerX + i * fBoxSize,
                                 cornerY,
                                 cornerX + (i + 1) * fBoxSize,
                                 cornerY + fBoxSize);

        if((fM = (float)(1.0 - fChargeSlope * i / nMatrixRange)) < 0.0f)
            fM = 0.0f;

        pfChargeMatrix[nMatrixRange - i] *= fM;
/*
        pfChargeMatrix[nMatrixRange - i] *= fChargeSlope
                        * ((float)(nMatrixRange - i + 1)) / (nMatrixRange + 1);
*/
        //printf("%d: %f\n", i, fM);

        pfChargeMatrix[nMatrixRange + i] = pfChargeMatrix[nMatrixRange - i];
    }

    for(i = 1; i < CHARGE_MATRIX_SIZE; i++)
        pfChargeMatrix[i] += pfChargeMatrix[i - 1];
}

//------------------------------------------------------------------------------

void HShowerDigiDetPar::Streamer(TBuffer &b)
{
    if(b.IsReading())
    {
    Version_t v = b.ReadVersion();

        if((HShowerDigiDetPar::IsA())->GetClassVersion() < 2)
        {
            Error("Streamer",
                "Bad version of HShowerDigiDetPar %d / %d !!!\n",
                v, (HShowerDigiDetPar::IsA())->GetClassVersion());

            exit(-1);
        }

        HShowerParSet::Streamer(b);

        b >> fThickDet;
        b >> nMatrixRange;
        b >> fBoxSize;
        b >> fChargeSlope;
        b >> fPlaneDist;
        b >> nPadRange;
        b >> fPadThreshold;
        b >> fUpdatePadThreshold;
        b >> fMasterOffset;

        setChargeMatrix(nMatrixRange);
        b.ReadFastArray(pfChargeMatrix, CHARGE_MATRIX_SIZE);

        if(v == 2)
        {
            b.ReadFastArray(afMeanParams, POLY_DEGREE);
            b.ReadFastArray(afSigmaParams, POLY_DEGREE);
            b.ReadFastArray(afEffParams, POLY_DEGREE);
            pArrayQvB = NULL;
            phEff     = NULL;
            ph2QvB    = NULL;
        }
        else
        {
            b >> phEff;
            b >> ph2QvB;
            pArrayQvB = NULL;

            phEff->SetDirectory(0);
            ph2QvB->SetDirectory(0);

            if( ! initSumVerBetaHistograms())
                Error("%s", "HShowerDigiDetPar::Streamer");
        }
    }
    else
    {
        b.WriteVersion(HShowerDigiDetPar::IsA());

        HShowerParSet::Streamer(b);

        b << fThickDet;
        b << nMatrixRange;
        b << fBoxSize;
        b << fChargeSlope;
        b << fPlaneDist;
        b << nPadRange;
        b << fPadThreshold;
        b << fUpdatePadThreshold;
        b << fMasterOffset;

        if(pfChargeMatrix != NULL)
            b.WriteFastArray(pfChargeMatrix, CHARGE_MATRIX_SIZE);

        /*
        b.WriteFastArray(afMeanParams, POLY_DEGREE);
        b.WriteFastArray(afSigmaParams, POLY_DEGREE);
        b.WriteFastArray(afEffParams, POLY_DEGREE);
        */

        b << (TObject*)phEff;
        b << (TObject*)ph2QvB;
    }
}

//------------------------------------------------------------------------------

Bool_t HShowerDigiDetPar::initSumVerBetaHistograms(void)
{
Int_t    iSums;
Double_t dSumMin, dSumMax;
Int_t    iBeta;
TH1D    *pH;
Char_t     s1[100];
Char_t     s2[100];

    if(pArrayQvB != NULL)
    {
        delete pArrayQvB;
        pArrayQvB = NULL;
    }

    if(ph2QvB == NULL)
    {
        Error("%s", "No QvB histogram");
        return kFALSE;
    }

    iQvSbins = ph2QvB->GetNbinsX();
    dQvSmin  = ph2QvB->GetXaxis()->GetXmin();
    dQvSmax  = ph2QvB->GetXaxis()->GetXmax();

    d1_QvSDiff = 1.0 / (dQvSmax - dQvSmin);
    dQvSOneBin = (dQvSmax - dQvSmin) / iQvSbins;

    iSums    = ph2QvB->GetNbinsY();
    dSumMin  = ph2QvB->GetYaxis()->GetXmin();
    dSumMax  = ph2QvB->GetYaxis()->GetXmax();

    pArrayQvB = new TObjArray(iQvSbins);
    pArrayQvB->SetOwner();

    for(iBeta = 0; iBeta < iQvSbins; iBeta++)
    {
        sprintf(s1, "sumVerBeta_%02d", iBeta);
        sprintf(s2, "sum(%f)",
                    dQvSmin + (dQvSmax - dQvSmin) * (iBeta + 0.5) / iQvSbins);

        pH = ph2QvB->ProjectionY(s1, iBeta,  iBeta + 1);
        pH->SetDirectory(NULL);
        pH->SetTitle(s2);
        pArrayQvB->AddAt(pH, iBeta);
    }

    return kTRUE;
}

//------------------------------------------------------------------------------

Float_t HShowerDigiDetPar::getEfficiency(Float_t fBeta) const
{
    if(phEff == NULL)
        return CALCULATE_FROM_FIT(afEffParams, fBeta);

    return phEff->GetBinContent(phEff->GetXaxis()->FindFixBin(fBeta));
}

//------------------------------------------------------------------------------

Bool_t HShowerDigiDetPar::checkEfficiency(Float_t fBeta) const
{
Float_t f = getEfficiency(fBeta);

    return ((f >= 1.0f) || ((f > 0.0f) && (f > gRandom->Rndm())));
}

//------------------------------------------------------------------------------

Float_t HShowerDigiDetPar::getCharge(Float_t fBeta) const
{
Float_t  fQ;

    if(ph2QvB == NULL)
    {
    Double_t dMean;
    Double_t dSigma;
    Int_t    iTry;

        dMean  = CALCULATE_FROM_FIT(afMeanParams, fBeta);
        dSigma = CALCULATE_FROM_FIT(afSigmaParams, fBeta);

        for(iTry = 0; iTry < 10; iTry++)
        {
            if((fQ = gRandom->Landau(dMean, dSigma)) > 0.0)
            {
                if(fQ > 250.0f)
                    continue;

                return fQ;
            }
        }

        return 0.0f;
    }

Int_t iBin;
TH1D *pH;

    iBin = (Int_t)((fBeta - dQvSmin) * iQvSbins * d1_QvSDiff);
    if(iBin < 0)
        iBin = 0;

    if(iBin >= iQvSbins)
        iBin = iQvSbins - 1;

    if((pH = (TH1D *)pArrayQvB->At(iBin)) == NULL)
        return 0.0f;

    fQ = (Float_t)(pH->GetRandom() + (2 * gRandom->Rndm() - 1) * dQvSOneBin);
    return ((fQ < 0.0f) ? 0.0f : fQ);
}

Last change: Sat May 22 13:13:26 2010
Last generated: 2010-05-22 13:13

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.