#include <TClonesArray.h>
#include <TVirtualMC.h>
#include <TTree.h>
#include "AliPHOSGeometry.h"
#include "AliPHOSImpact.h"
#include "AliPHOSvImpacts.h"
#include "AliRun.h"
#include "AliLoader.h"
#include "AliMC.h"
#include "AliLog.h"
ClassImp(AliPHOSvImpacts)
AliPHOSvImpacts::AliPHOSvImpacts():
fEMCImpacts(new TList),
fCPVImpacts(new TList),
fPPSDImpacts(new TList),
fNEMCImpacts(),
fNCPVImpacts(),
fNPPSDImpacts()
{
}
AliPHOSvImpacts::AliPHOSvImpacts(const char *name, const char *title):
AliPHOSv1(name,title),
fEMCImpacts(new TList),
fCPVImpacts(new TList),
fPPSDImpacts(0),
fNEMCImpacts(),
fNCPVImpacts(),
fNPPSDImpacts()
{
Int_t nPHOSModules = GetGeometry()->GetNModules();
Int_t nCPVModules = GetGeometry()->GetNModules();
Int_t iPHOSModule;
TClonesArray * impacts;
for (iPHOSModule=0; iPHOSModule<nPHOSModules; iPHOSModule++) {
fEMCImpacts->Add(new TClonesArray("AliPHOSImpact",200)) ;
fNEMCImpacts[iPHOSModule] = 0;
impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(iPHOSModule));
}
for (iPHOSModule=0; iPHOSModule<nCPVModules; iPHOSModule++) {
fCPVImpacts->Add(new TClonesArray("AliPHOSImpact",200)) ;
fNCPVImpacts[iPHOSModule] = 0;
impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(iPHOSModule));
}
}
AliPHOSvImpacts::~AliPHOSvImpacts()
{
if ( fHits ) {
fHits->Delete() ;
delete fHits ;
fHits = 0 ;
}
if ( fEMCImpacts ) {
fEMCImpacts->Delete() ;
delete fEMCImpacts ;
fEMCImpacts = 0 ;
}
if ( fCPVImpacts ) {
fCPVImpacts->Delete() ;
delete fCPVImpacts ;
fCPVImpacts = 0 ;
}
}
void AliPHOSvImpacts::AddImpact(const char* det, Int_t shunt, Int_t primary, Int_t track, Int_t module,
Int_t pid, TLorentzVector p, Float_t *xyz)
{
TClonesArray * impacts = 0;
Int_t nImpacts = 0;
if (strcmp(det,"EMC ")==0) {
impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(module));
nImpacts= fNEMCImpacts[module];
fNEMCImpacts[module]++ ;
}
else if (strcmp(det,"CPV ")==0) {
impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(module));
nImpacts= fNCPVImpacts[module];
fNCPVImpacts[module]++ ;
}
else
AliFatal(Form("Wrong PHOS configuration: det=%s",det));
new((*impacts)[nImpacts]) AliPHOSImpact(shunt,primary,track,pid,p,xyz) ;
AliDebugClass(1,Form("Module %d %s: ",module,det));
if (AliLog::GetGlobalDebugLevel()>0)
(static_cast<AliPHOSImpact*>((impacts->At(nImpacts))))->Print();
}
void AliPHOSvImpacts::MakeBranch(Option_t *opt)
{
AliDetector::MakeBranch(opt);
Int_t bufferSize = 32000 ;
Int_t splitlevel = 0 ;
fLoader->TreeH()->Branch("PHOSEmcImpacts" , "TList", &fEMCImpacts , bufferSize, splitlevel);
fLoader->TreeH()->Branch("PHOSCpvImpacts" , "TList", &fCPVImpacts , bufferSize, splitlevel);
}
void AliPHOSvImpacts::ResetHits()
{
AliDetector::ResetHits();
Int_t i;
for (i=0; i<GetGeometry()->GetNModules(); i++) {
(static_cast<TClonesArray*>(fEMCImpacts->At(i))) -> Clear();
fNEMCImpacts[i] = 0 ;
}
for (i=0; i<GetGeometry()->GetNModules(); i++) {
(static_cast<TClonesArray*>(fCPVImpacts->At(i))) -> Clear();
fNCPVImpacts[i] = 0 ;
}
}
void AliPHOSvImpacts::StepManager(void)
{
AliPHOSv1::StepManager();
Float_t xyzm[3], xyzd[3], pm[3], pd[3];
TLorentzVector pmom ;
TLorentzVector pos ;
Int_t copy ;
Int_t tracknumber = gAlice->GetMCApp()->GetCurrentTrackNumber() ;
Int_t primary = gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() );
TString name = GetGeometry()->GetName() ;
static Int_t idPXTL = TVirtualMC::GetMC()->VolId("PXTL");
if( TVirtualMC::GetMC()->CurrentVolID(copy) == idPXTL &&
TVirtualMC::GetMC()->IsTrackEntering() ) {
TVirtualMC::GetMC()->TrackMomentum(pmom);
TVirtualMC::GetMC()->TrackPosition(pos) ;
Int_t i;
for (i=0; i<3; i++) xyzm[i] = pos[i];
for (i=0; i<3; i++) {
xyzm[i] = pos[i] ;
pm[i] = pmom[i];
}
TVirtualMC::GetMC() -> Gmtod (xyzm, xyzd, 1);
TVirtualMC::GetMC() -> Gmtod (pm, pd, 2);
if ((pd[1]<0 && xyzd[1] > GetGeometry()->GetCrystalSize(1)/2-0.1) ||
(pd[1]>0 && xyzd[1] < -GetGeometry()->GetCrystalSize(1)/2+0.1)) {
Int_t pid = TVirtualMC::GetMC()->TrackPid();
Int_t module;
TVirtualMC::GetMC()->CurrentVolOffID(10,module);
module--;
AddImpact("EMC ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);
}
}
static Int_t idPCPQ = TVirtualMC::GetMC()->VolId("PCPQ");
if( TVirtualMC::GetMC()->CurrentVolID(copy) == idPCPQ &&
TVirtualMC::GetMC()->IsTrackEntering() ) {
TVirtualMC::GetMC()->TrackMomentum(pmom);
TVirtualMC::GetMC()->TrackPosition(pos) ;
Int_t i;
for (i=0; i<3; i++) xyzm[i] = pos[i];
for (i=0; i<3; i++) {
xyzm[i] = pos[i] ;
pm[i] = pmom[i];
}
Int_t pid = TVirtualMC::GetMC()->TrackPid();
Int_t module;
TVirtualMC::GetMC()->CurrentVolOffID(3,module);
module--;
AddImpact("CPV ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);
}
}