#include "hrichanalysisIPUSim.h"
#include "hades.h"
#include "hcategory.h"
#include "hlinearcategory.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hevent.h"
#include "hrichcalsim.h"
#include "hrichhitIPUSim.h"
#include "hmatrixcatiter.h"
#include "hrichringfindIPUSim.h"
#include "hrichgeometrypar.h"
#include "hrichpad.h"
#include "hrichcalsim.h"
#include "richutildef.h"
#include "hlocation.h"
#include "htriggerdetector.h"
#include "triggerinfodef.h"
#include "hrichtrack.h"
#include "hmessagemgr.h"
HRichAnalysisIPUSim::HRichAnalysisIPUSim()
: HRichAnalysisIPU()
{
pHardRingFindSim = new HRichRingFindIPUSim();
pRichCalSim = NULL;
}
HRichAnalysisIPUSim::HRichAnalysisIPUSim(const Text_t *name,const Text_t *title)
:HRichAnalysisIPU(name, title)
{
pHardRingFindSim = new HRichRingFindIPUSim();
pRichCalSim = NULL;
}
HRichAnalysisIPUSim::~HRichAnalysisIPUSim(void)
{
if (pHardRingFindSim) delete pHardRingFindSim;
pHardRingFindSim = NULL;
}
Bool_t HRichAnalysisIPUSim::init(void)
{
HTriggerDetector * pTriggerDet = (HTriggerDetector*)gHades->getSetup()->getDetector("Trigger");
m_pRawCat=gHades->getCurrentEvent()->getCategory(catRichCal);
if (!m_pRawCat)
{
ERROR_msg(HMessageMgr::DET_TRIGGER,"Can not find HRichCal category!");
return kFALSE;
}
fIter = (HIterator*)m_pRawCat->MakeIterator("native");
m_pTrackCat = gHades->getCurrentEvent()->getCategory(catRichTrack);
if (!m_pTrackCat)
{
ERROR_msg(HMessageMgr::DET_TRIGGER,"Can not create HRichTrack category!");
return kFALSE;
}
m_pHardHitCat=gHades->getCurrentEvent()->getCategory(catHardRichHit);
if (!m_pHardHitCat)
{
m_pHardHitCat=pTriggerDet->buildLinearCat("HRichHitIPUSim");
if (!m_pHardHitCat)
{
ERROR_msg(HMessageMgr::DET_TRIGGER,"Can not create HRichHitIPUSim category!");
return kFALSE;
}
else
{
gHades->getCurrentEvent()->addCategory(catHardRichHit, m_pHardHitCat, "Trigger");
}
}
HRuntimeDb* rtdb=gHades->getRuntimeDb();
if(rtdb)
{
HRichGeometryPar *pGeomPar = (HRichGeometryPar*)rtdb->getContainer("RichGeometryParameters");
if (pGeomPar == NULL)
{
ERROR_msg(HMessageMgr::DET_TRIGGER,"Can not find RichGeometryParameters container!");
return kFALSE;
}
setGeomPar(pGeomPar);
}
pHardRingFindSim->init(this);
return kTRUE;
}
Bool_t HRichAnalysisIPUSim::finalize(void)
{
return kTRUE;
}
Int_t HRichAnalysisIPUSim::execute(void)
{
HRichCalSim *pCalSim;
pHardRingFindSim->ZeroArray();
fIter->Reset();
while((pCalSim = (HRichCalSim *)fIter->Next()))
{
pHardRingFindSim->FiredPad(pCalSim->getSector(),pCalSim->getRow(),pCalSim->getCol());
}
iRingNrTot=0;
for(Int_t i = 0; i < 6; i++)
{
pHardRingFindSim->SetSector(i);
iRingNr = pHardRingFindSim->Execute(this);
iRingNrTot+=iRingNr;
if (iRingNr)
{
updateHits(i);
}
}
return kTRUE;
}
void HRichAnalysisIPUSim::updateHits(Int_t nSec)
{
HRichHitIPUSim *hit=NULL;
for (Int_t i = 0; i < iRingNr; i++)
{
loc.set(1, nSec);
hit=(HRichHitIPUSim *)m_pHardHitCat->getNewSlot(loc);
if (hit!=NULL)
{
HRichHitIPUSimCont* myHitCont=((HRichHitIPUSimCont*)pRings->At(i));
HRichHitIPUSim* myHit =((HRichHitIPUSimCont*)pRings->At(i))->getData();
myHit->setSector(nSec);
HRichPad * pad = ((HRichGeometryPar*)fpGeomPar)->getPadsPar()->getPad(myHit->getX(),myHit->getY());
if(!pad)
{
gHades->getMsg()->error(10,HMessageMgr::DET_TRIGGER,GetName(),
"RICH ring %d coordinate out of sector (%d %d)!",
i, myHit->getX(),myHit->getY());
continue;
}
myHit->setPhi(pad->getPhi(nSec));
myHit->setTheta(pad->getTheta());
Int_t k = 0;
while(myHitCont->getRingTrack(k) && ( k < 256))
{
if (myHit->getTrack1()==0)
{
myHit->setTrack1(myHitCont->getRingTrack(k));
myHit->setFlag1(myHitCont->getRingFlag(k));
myHit->setWeightTrack1(myHit->getWeightTrack1()+1);
}
else
{
if(myHitCont->getRingTrack(k)== myHit->getTrack1())
{
myHit->setWeightTrack1(myHit->getWeightTrack1()+1);
}
else
{
if(myHit->getTrack2()==0)
{
myHit->setTrack2(myHitCont->getRingTrack(k));
myHit->setFlag2(myHitCont->getRingFlag(k));
myHit->setWeightTrack2(myHit->getWeightTrack2()+1);
}
else
{
if(myHitCont->getRingTrack(k)== myHit->getTrack2())
{
myHit->setWeightTrack2(myHit->getWeightTrack2()+1);
}
else
{
if (myHit->getTrack3()==0)
{
myHit->setTrack3(myHitCont->getRingTrack(k));
myHit->setFlag3(myHitCont->getRingFlag(k));
myHit->setWeightTrack3(myHit->getWeightTrack3()+1);
}
else
{
myHit->setWeightTrack3(myHit->getWeightTrack3()+1);
}
}
}
}
}
k++;
}
hit=new (hit) HRichHitIPUSim(*myHit);
}
else
{
ERROR_msg(HMessageMgr::DET_TRIGGER,"No free slot in category HRichHitIPUSim!");
}
}
}
Int_t HRichAnalysisIPUSim::getPadsNTrack1(Int_t padx, Int_t pady,Int_t sec)
{
HLocation loc1;
loc1.set(3, sec, pady, padx);
pRichCalSim=NULL;
pRichCalSim = (HRichCalSim*)((HMatrixCategory*)getRawCat())->getObject(loc1);
if (pRichCalSim)
{
return pRichCalSim->getNTrack1();
}
return 0;
}
Int_t HRichAnalysisIPUSim::getPadsNTrack2(void)
{
if (pRichCalSim)
{
return pRichCalSim->getNTrack2();
}
return 0;
}
Int_t HRichAnalysisIPUSim::getFlag(Int_t index)
{
HRichTrack *t = (HRichTrack*)((HLinearCategory*)m_pTrackCat)->getObject(index);
Int_t i = -1;
if (t)
{
i=t->getFlag();
}
return i;
}
Int_t HRichAnalysisIPUSim::getTrack(Int_t index)
{
HRichTrack *trk = ((HRichTrack*)((HLinearCategory*)m_pTrackCat)->getObject(index));
Int_t track=-1;
if(trk)
{
track=trk->getTrack();
}
return track;
}
ClassImp(HRichAnalysisIPUSim)
Last change: Sat May 22 13:08:08 2010
Last generated: 2010-05-22 13:08
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.