#include "hshowerhitdigitizer.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hshowerdetector.h"
#include "hcategory.h"
#include "hmatrixcategory.h"
#include "hlinearcategory.h"
#include "hlocation.h"
#include "hshowergeantwire.h"
#include "hshowerdigidetpar.h"
#include "hshowergeometry.h"
#include "hdebug.h"
#include "hades.h"
#include "showerdef.h"
#include <math.h>
#include <stdlib.h>
#include "TRandom.h"
ClassImp(HShowerHitDigitizer)
HShowerHitDigitizer::HShowerHitDigitizer(const Text_t *name,const Text_t *title,
Float_t unit) : HShowerDigitizer(name,title)
{
piconst = 2 * acos(0.);
fUnit = unit;
}
HShowerHitDigitizer::HShowerHitDigitizer()
{
piconst = 2*acos(0.);
fUnit = 10.;
}
HShowerHitDigitizer::~HShowerHitDigitizer(void)
{
}
Bool_t HShowerHitDigitizer::init() {
printf("initialization of shower hit digitizer \n");
HCategory *pCat;
HShowerDetector *pShowerDet = (HShowerDetector*)gHades->getSetup()
->getDetector("Shower");
pCat=gHades->getCurrentEvent()->getCategory(catShowerGeantRaw);
if( ! pCat)
{
pCat=pShowerDet->buildCategory(catShowerGeantRaw);
if( ! pCat)
return kFALSE;
else
gHades->getCurrentEvent()
->addCategory(catShowerGeantRaw, pCat, "Simul");
}
setInCat(pCat);
pCat=gHades->getCurrentEvent()->getCategory(catShowerGeantWire);
if( ! pCat)
{
pCat=pShowerDet->buildCategory(catShowerGeantWire);
if( ! pCat)
return kFALSE;
else
gHades->getCurrentEvent()
->addCategory(catShowerGeantWire, pCat, "Shower");
}
setOutCat(pCat);
return HShowerDigitizer::init();
}
HShowerHitDigitizer& HShowerHitDigitizer::operator=(HShowerHitDigitizer &c)
{
return c;
}
Bool_t HShowerHitDigitizer::digitize(TObject *pHit)
{
HLocation fLoc;
Bool_t nResult = kFALSE;
#if DEBUG_LEVEL>2
gDebuger->enterFunc("HShowerHitDigitizer::execute");
gDebuger->message("category points to %p", pHit);
#endif
HGeantShower *pGeantHit = (HGeantShower*)pHit;
HShowerDigiDetPar *pDetPar = (HShowerDigiDetPar*) getDigiParSet();
if( ! getGeometry())
{
Error("HShowerHitDigitizer::digitize",
"Shower geometry not initialized");
return kFALSE;
}
if( ! pDetPar)
{
Error("HShowerHitDigitizer::digitize",
"Digitization parameters not initialized");
return kFALSE;
}
if (pGeantHit)
{
nResult = digiHits(pGeantHit);
}
#if DEBUG_LEVEL>2
gDebuger->leaveFunc("HShowerHitDigitizer::execute");
#endif
return nResult;
}
Bool_t HShowerHitDigitizer::digiHits(HGeantShower *simhit)
{
HLocation fLoc;
HShowerGeantWire *pGeantWire = NULL;
Float_t x_exit, y_exit;
Int_t nDet, nSector;
Int_t nFiredWire, nFiredWireIn, nFiredWireOut;
Float_t fE, fTheta, fPhi, fBeta;
Float_t fX, fY;
Float_t fNewX, fNewY;
Float_t fQ, fThick;
Float_t fTan;
Int_t i;
Float_t fY0, fY1;
const HShowerDigiDetPar *pDigiDetPar = (HShowerDigiDetPar*)getDigiParSet();
nDet = simhit->getModule();
nSector = simhit->getSector();
simhit->getHit(fE, fX, fY, fBeta);
simhit->getIncidence(fTheta, fPhi);
if( nDet==0 && ! pDigiDetPar->checkEfficiency(fBeta))
return kFALSE;
fX /= fUnit;
fY /= fUnit;
fTheta = (TMath::Pi()/180.0) * fTheta;
fPhi = (TMath::Pi()/180.0) * fPhi;
HShowerWireTab *phWires = ((HShowerGeometry*)getGeometry())->
getWireTab(nDet);
fThick = pDigiDetPar->getThickDet();
fTan = tan(fTheta);
x_exit = fX + fThick* fTan * cos(fPhi);
y_exit = fY + fThick* fTan * sin(fPhi);
nFiredWireIn = phWires->lookupWire(fY);
if(nFiredWireIn == -1)
return kFALSE;
nFiredWireOut = phWires->lookupWire(y_exit);
if(nFiredWireOut == -1)
return kFALSE;
if(nFiredWireIn > nFiredWireOut) {
i = nFiredWireIn;
nFiredWireIn = nFiredWireOut;
nFiredWireOut = i;
}
for(nFiredWire = nFiredWireIn; nFiredWire <= nFiredWireOut; nFiredWire++)
{
fNewY = phWires->getWire(nFiredWire)->getYWire();
if(nFiredWireOut == nFiredWireIn)
{
fNewX = 0.5 * (fX + x_exit);
}
else
{
if(nFiredWire == nFiredWireIn)
fY0 = fY;
else
{
fY0 = 0.5 * (phWires->getWire(nFiredWire - 1)->getYWire()
+ fNewY);
}
if(nFiredWire == nFiredWireOut)
fY1 = y_exit;
else
{
fY1 = 0.5 * (fNewY
+ phWires->getWire(nFiredWire + 1)->getYWire());
}
fNewX = fX + 0.5 * (x_exit - fX) * (fY1 + fY0 - 2 * fY)
/ (y_exit - fY);
}
if((fQ = pDigiDetPar->getCharge(fBeta)) > 0.0f)
{
pGeantWire = (HShowerGeantWire*)((HLinearCategory*)getOutCat())
->getNewSlot(fLoc);
if(pGeantWire != NULL)
{
pGeantWire = new(pGeantWire) HShowerGeantWire;
pGeantWire->setWireNr(nFiredWire);
pGeantWire->setXY(fNewX, fNewY);
pGeantWire->setCharge(fQ);
pGeantWire->setModule(nDet);
pGeantWire->setSector(nSector);
pGeantWire->setTrack(simhit->getTrack());
}
}
}
return kTRUE;
}
Last change: Sat May 22 13:13:39 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.