#include "AliFastDetector.h"
#include "AliFastResponse.h"
#include "AliGeometry.h"
#include <TList.h>
#include <TIterator.h>
#include <TString.h>
ClassImp(AliFastDetector)
AliFastDetector::AliFastDetector():
fSubdetectors(0),
fResponses(0),
fLnkD(0),
fLnkR(0),
fEfficiency(0),
fResolution(0),
fGeometry(0)
{
fName = "FastDetector";
fTitle = "Fast Detector Base Class";
}
AliFastDetector::AliFastDetector(char* Name, char* Title):
TNamed(Name, Title),
fSubdetectors(new TList()),
fResponses(new TList()),
fLnkD(0),
fLnkR(0),
fEfficiency(0),
fResolution(0),
fGeometry(0)
{
}
AliFastDetector::AliFastDetector(const AliFastDetector & det)
:TNamed(det),
fSubdetectors(0),
fResponses(0),
fLnkD(0),
fLnkR(0),
fEfficiency(0),
fResolution(0),
fGeometry(0)
{
det.Copy(*this);
}
AliFastDetector::~AliFastDetector()
{
delete fSubdetectors;
delete fResponses;
}
void AliFastDetector::Init()
{
TIter nextRes(fResponses);
AliFastResponse *res;
while((res = (AliFastResponse*)nextRes())) {
res->Init();
}
TIter nextDet(fSubdetectors);
AliFastDetector *det;
while((det = (AliFastDetector*)nextDet())) {
det->Init();
}
TObject* obj;
if ((obj = fResponses->FindObject("Efficiency")))
{
fEfficiency = (AliFastResponse*) obj;
printf("Detector %s provides Efficiency: %s\n",
fName.Data(), fEfficiency->GetTitle());
}
if ((obj = fResponses->FindObject("Resolution")))
{
fResolution = (AliFastResponse*) obj;
printf("Detector %s provides Resolution: %s\n",
fName.Data(), fResolution->GetTitle());
}
}
Float_t AliFastDetector::EvaluateEfficiency(AliFastParticle* part)
{
TIter nextDet(fSubdetectors);
AliFastDetector *det;
Float_t eff = 1;
while((det = (AliFastDetector*)nextDet())) {
eff *= det->EvaluateEfficiency(part);
}
return eff;
}
Bool_t AliFastDetector::EvaluateAcceptance(AliFastParticle* part)
{
Bool_t acc = kFALSE;
if (fSubdetectors) {
TIter nextDet(fSubdetectors);
AliFastDetector *det;
while((det = (AliFastDetector*)nextDet()) && !acc) {
acc = (acc || det->EvaluateAcceptance(part));
}
} else {
if (fGeometry)
acc = fGeometry->Impact((TParticle*) part);
}
return acc;
}
void AliFastDetector::EvaluateResponse(AliFastParticle* )
{
;
}
void AliFastDetector::
AddSubdetector(AliFastDetector *Detector, char* )
{
fSubdetectors->Add(Detector);
}
void AliFastDetector::
AddResponse(AliFastResponse *Response)
{
fResponses->Add(Response);
}
AliFastDetector* AliFastDetector::FirstSubdetector()
{
fLnkD = fSubdetectors->FirstLink();
if (fLnkD) {
return (AliFastDetector*) (fLnkD->GetObject());
} else {
return 0;
}
}
AliFastDetector* AliFastDetector::NextSubdetector()
{
fLnkD = fLnkD->Next();
if (fLnkD) {
return (AliFastDetector*) (fLnkD->GetObject());
} else {
return 0;
}
}
AliFastResponse* AliFastDetector::FirstResponse()
{
fLnkR = fResponses->FirstLink();
if (fLnkR) {
return (AliFastResponse*) (fLnkR->GetObject());
} else {
return 0;
}
}
AliFastResponse* AliFastDetector::NextResponse()
{
fLnkR = fLnkR->Next();
if (fLnkR) {
return (AliFastResponse*) (fLnkR->GetObject());
} else {
return 0;
}
}
AliFastDetector& AliFastDetector::operator=(const AliFastDetector& rhs)
{
rhs.Copy(*this);
return *this;
}
void AliFastDetector::Copy(TObject&) const
{
Fatal("Copy","Not implemented!\n");
}