#include "hrichparticleidentifier.h"
#include "hrichhitselection.h"

#include "hruntimedb.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hrichdetector.h"
#include "hcategory.h"
#include "hmatrixcatiter.h"
#include "hlocation.h"
#include "hrichhit.h"
#include "hrichanalysispar.h"
#include "hrichpid.h"
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "richdef.h"


ClassImp(HRichParticleIdentifier)

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////
//HRichParticleIdentifier
//
//HRichParticleIdentifier selects hits, which passed through
//rich criterium defined by HRichHitSelection
//
//////////////////////////////////////////////////////////////////////

HRichParticleIdentifier::HRichParticleIdentifier(const Text_t *name,const Text_t *title) : HReconstructor(name,title)
{
   fIter=NULL;
   m_zeroLoc.set(0);
   m_pHitSelection = new HRichHitSelection;
}

HRichParticleIdentifier::HRichParticleIdentifier()
{
  m_zeroLoc.set(0);
  fIter=NULL;
  m_pHitSelection = new HRichHitSelection;
}

HRichParticleIdentifier::~HRichParticleIdentifier(void) {
     if (fIter) delete fIter;
     if (m_pHitSelection) delete m_pHitSelection;
}

Bool_t HRichParticleIdentifier::init() {
  //initailization of pid and hit levels 

    printf("initialization of rich particle identifier\n");
    
    HRichDetector *pRichDet = (HRichDetector*)gHades->getSetup()
                                                  ->getDetector("Rich");

    m_pHitCat=gHades->getCurrentEvent()->getCategory(catRichHit);
    if (!m_pHitCat) {
      m_pHitCat=pRichDet->buildCategory(catRichHit);

      if (!m_pHitCat) return kFALSE;
      else gHades->getCurrentEvent()
                         ->addCategory(catRichHit, m_pHitCat, "Rich");
    }

    m_pPIDCat=gHades->getCurrentEvent()->getCategory(catRichPID);
    if (!m_pPIDCat) {
      m_pPIDCat=pRichDet->buildCategory(catRichPID);

      if (!m_pPIDCat) return kFALSE;
      else gHades->getCurrentEvent()
                        ->addCategory(catRichPID, m_pPIDCat, "Rich");
    }

    fIter=(HIterator*)m_pHitCat->MakeIterator("native");
    initParameters();

    return kTRUE;
}



Bool_t HRichParticleIdentifier::initParameters() {
    HRuntimeDb* rtdb=gHades->getRuntimeDb();

    HRichAnalysisPar *pAnalysisPar = (HRichAnalysisPar*)rtdb->
                                       getContainer("RichAnalysisParameters");
    setAnalysisPar(pAnalysisPar);
    if (!pAnalysisPar) return kFALSE;
    m_pHitSelection->setParams(pAnalysisPar);

    return kTRUE;
}


void HRichParticleIdentifier::setHitSelection(HRichHitSelection* pCrit) {
   if (m_pHitSelection) delete m_pHitSelection;
   m_pHitSelection = pCrit;
}


Bool_t HRichParticleIdentifier::finalize(void) {
   return kTRUE;
}

Int_t HRichParticleIdentifier::execute()
{
 //it selects hits, which passed rich criterium 
  Float_t fRich = 0.0;
  Int_t ret = 0;
  HRichHit *pHit;
  HRichPID *pPID;

  fIter->Reset();
  while((pHit = (HRichHit *)fIter->Next()))
  {
    //loop on local maxima
    fRich = m_pHitSelection->richHitSelection(pHit, ret,
                             (HRichAnalysisPar*)m_pAnalysisPar);

    if (fRich > 0.0) {
      pPID=(HRichPID *)m_pPIDCat->getNewSlot(m_zeroLoc);
      if (pPID) {
        pPID=new(pPID) HRichPID;
        fillPID(pHit, pPID);
      }
    }
  }

  return 0;
}

void HRichParticleIdentifier::fillPID(HRichHit* hit, HRichPID* pid) {
   Float_t fX, fY;
   // Float_t fPhi, fTheta;

   pid->setSector(hit->getSector());
//   pid->setEventNr(hit->getEventNr());

   switch (((HRichAnalysisPar*)m_pAnalysisPar)->iSuperiorAlgorithmID) {
    case 1: pid->setRingQuality(hit->iRingPatMat);
            break;
    case 2: pid->setRingQuality(hit->iRingHouTra);
            break;
    default: pid->setRingQuality(hit->iRingPatMat);
             break; 
   }
   pid->setRingAmplitude(hit->iRingAmplitude);
   pid->setRingPadNr(hit->iRingPadNr);

   hit->getXY(&fX, &fY);
   pid->setXY(fX, fY);
   pid->setPhi(hit->getPhi());
   pid->setTheta(hit->getTheta());

//   getPIDCat()->sort();
}


Last change: Sat May 22 13:09:46 2010
Last generated: 2010-05-22 13:09

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.