#if !defined(__CINT__) || defined(__MAKECINT__)
#include <stdio.h>
#include "Rtypes.h"
#include "TClonesArray.h"
#include "TDatabasePDG.h"
#include "AliTrackReference.h"
#include "AliMCInfo.h"
#include "AliMathBase.h"
#endif
ClassImp(AliTPCdigitRow)
ClassImp(AliMCInfo)
AliMCInfo::AliMCInfo():
fTrackRef(),
fTrackRefOut(),
fTRdecay(),
fPrimPart(0),
fParticle(),
fMass(0),
fCharge(0),
fLabel(0),
fEventNr(),
fMCtracks(),
fPdg(0),
fTPCdecay(0),
fRowsWithDigitsInn(0),
fRowsWithDigits(0),
fRowsTrackLength(0),
fTPCtrackLength(-1),
fPrim(0),
fTPCRow(),
fNTPCRef(0),
fNITSRef(0),
fNTRDRef(0),
fNTOFRef(0),
fNTPCRefOut(0),
fNITSRefOut(0),
fNTRDRefOut(0),
fNTOFRefOut(0),
fTPCReferences(0),
fITSReferences(0),
fTRDReferences(0),
fTOFReferences(0)
{
fTPCReferences = new TClonesArray("AliTrackReference",10);
fITSReferences = new TClonesArray("AliTrackReference",10);
fTRDReferences = new TClonesArray("AliTrackReference",10);
fTOFReferences = new TClonesArray("AliTrackReference",10);
fTRdecay.SetTrack(-1);
for (Int_t i=0;i<4;i++) fVDist[i]=0;
for (Int_t i=0;i<3;i++) fDecayCoord[i]=0;
fCharge = 0;
}
AliMCInfo::AliMCInfo(const AliMCInfo& info):
TObject(),
fTrackRef(info.fTrackRef),
fTrackRefOut(info.fTrackRefOut),
fTRdecay(info.GetTRdecay()),
fPrimPart(info.fPrimPart),
fParticle(info.fParticle),
fMass(info.GetMass()),
fCharge(info.fCharge),
fLabel(info.fLabel),
fEventNr(info.fEventNr),
fMCtracks(info.fMCtracks),
fPdg(info.fPdg),
fTPCdecay(info.fTPCdecay),
fRowsWithDigitsInn(info.fRowsWithDigitsInn),
fRowsWithDigits(info.fRowsWithDigits),
fRowsTrackLength(info.fRowsTrackLength),
fTPCtrackLength(info.fTPCtrackLength),
fPrim(info.fPrim),
fTPCRow(info.fTPCRow),
fNTPCRef(info.fNTPCRef),
fNITSRef(info.fNITSRef),
fNTRDRef(info.fNTRDRef),
fNTOFRef(info.fNTOFRef),
fNTPCRefOut(info.fNTPCRefOut),
fNITSRefOut(info.fNITSRefOut),
fNTRDRefOut(info.fNTRDRefOut),
fNTOFRefOut(info.fNTOFRefOut),
fTPCReferences(0),
fITSReferences(0),
fTRDReferences(0),
fTOFReferences(0)
{
fTPCReferences = (TClonesArray*)info.fTPCReferences->Clone();
fITSReferences = (TClonesArray*)info.fITSReferences->Clone();
fTRDReferences = (TClonesArray*)info.fTRDReferences->Clone();
fTOFReferences = (TClonesArray*)info.fTOFReferences->Clone();
for (Int_t i=0;i<4;i++) fVDist[i]=info.fVDist[i];
for (Int_t i=0;i<3;i++) fDecayCoord[i]=info.fDecayCoord[i];
}
AliMCInfo& AliMCInfo::operator=(const AliMCInfo& info) {
this->~AliMCInfo();
new (this) AliMCInfo(info);
return *this;
}
AliMCInfo::~AliMCInfo()
{
if (fTPCReferences) {
delete fTPCReferences;
}
if (fITSReferences){
delete fITSReferences;
}
if (fTRDReferences){
delete fTRDReferences;
}
if (fTOFReferences){
delete fTOFReferences;
}
}
void AliMCInfo::Update()
{
fMCtracks =1;
fTPCdecay=kFALSE;
if (fTRdecay.GetTrack()>0){
fDecayCoord[0] = fTRdecay.X();
fDecayCoord[1] = fTRdecay.Y();
fDecayCoord[2] = fTRdecay.Z();
if ( (fTRdecay.R()<250)&&(fTRdecay.R()>85) && (TMath::Abs(fTRdecay.Z())<250) ){
fTPCdecay=kTRUE;
}
else{
fDecayCoord[0] = 0;
fDecayCoord[1] = 0;
fDecayCoord[2] = 0;
}
}
fRowsWithDigits = fTPCRow.RowsOn();
fRowsWithDigitsInn = fTPCRow.RowsOn(63);
fRowsTrackLength = fTPCRow.Last() - fTPCRow.First();
if (fParticle.GetPDG()){
fMass = fParticle.GetMass();
fCharge = fParticle.GetPDG()->Charge();
if (fTPCReferences->GetEntriesFast()>0){
fTrackRef = *((AliTrackReference*)fTPCReferences->At(0));
}
if (fMass>0){
Float_t p = TMath::Sqrt(fTrackRef.Px()*fTrackRef.Px()+
fTrackRef.Py()*fTrackRef.Py()+
fTrackRef.Pz()*fTrackRef.Pz());
if (p>0.001){
Float_t betagama = p /fMass;
fPrim = AliMathBase::BetheBlochAleph(betagama);
}else fPrim=0;
}
}else{
fMass =0;
fPrim =0;
}
}
AliTPCdigitRow::AliTPCdigitRow()
{
for (Int_t i = 0; i<32; i++) { fDig[i] = 0; }
Reset();
}
AliTPCdigitRow & AliTPCdigitRow::operator=(const AliTPCdigitRow &digOld)
{
for (Int_t i = 0; i<32; i++) fDig[i] = digOld.fDig[i];
return (*this);
}
void AliTPCdigitRow::SetRow(Int_t row)
{
if (row >= 8*32) {
return;
}
Int_t iC = row/8;
Int_t iB = row%8;
SETBIT(fDig[iC],iB);
}
Bool_t AliTPCdigitRow::TestRow(Int_t row) const
{
Int_t iC = row/8;
Int_t iB = row%8;
return TESTBIT(fDig[iC],iB);
}
Int_t AliTPCdigitRow::RowsOn(Int_t upto) const
{
Int_t total = 0;
for (Int_t i = 0; i<32; i++) {
for (Int_t j = 0; j < 8; j++) {
if (i*8+j > upto) return total;
if (TESTBIT(fDig[i],j)) total++;
}
}
return total;
}
void AliTPCdigitRow::Reset()
{
for (Int_t i = 0; i<32; i++) {
fDig[i] = 0;
}
}
Int_t AliTPCdigitRow::Last() const
{
for (Int_t i = 32-1; i>=0; i--) {
for (Int_t j = 7; j >= 0; j--) {
if TESTBIT(fDig[i],j) return i*8+j;
}
}
return -1;
}
Int_t AliTPCdigitRow::First() const
{
for (Int_t i = 0; i<32; i++) {
for (Int_t j = 0; j < 8; j++) {
if (TESTBIT(fDig[i],j)) return i*8+j;
}
}
return -1;
}
void AliMCInfo::Clear(Option_t* ){
if (fTPCReferences) fTPCReferences->Clear();
if (fITSReferences) fITSReferences->Clear();
if (fTRDReferences) fTRDReferences->Clear();
if (fTOFReferences) fTOFReferences->Clear();
for (Int_t i=0;i<4;i++) fVDist[i]=0;
for (Int_t i=0;i<3;i++) fDecayCoord[i]=0;
fTRdecay.SetTrack(-1);
fCharge = 0;
fEventNr=-1;
fPrimPart=-1;
fMass=0;
fCharge=0;
fLabel=0;
fEventNr=0;
fMCtracks=0;
fPdg=0;
fTPCdecay=0;
fRowsWithDigitsInn=0;
fRowsWithDigits=0;
fRowsTrackLength=0;
fTPCtrackLength=0;
fPrim=0;
fNTPCRef=0;
fNITSRef=0;
fNTRDRef=0;
fNTOFRef=0;
fNTPCRefOut=0;
fNITSRefOut=0;
fNTRDRefOut=0;
fNTOFRefOut=0;
}
void AliMCInfo::CalcTPCrows(TClonesArray * runArrayTR){
fNTPCRef = 0;
fNITSRef = 0;
fNTRDRef = 0;
fNTOFRef = 0;
fNTPCRefOut = 0;
fNITSRefOut = 0;
fNTRDRefOut = 0;
fNTOFRefOut = 0;
Float_t tpcminRadius=TMath::Max(90., fParticle.R());
Float_t tpcmaxRadius=TMath::Min(250.,fParticle.R());
Int_t nover=-1;
if (runArrayTR->GetEntriesFast()>0){
nover=0;
AliTrackReference *ref0 = (AliTrackReference*)runArrayTR->At(0);
Float_t dir = ((ref0->X()*ref0->Px()+ref0->Y()*ref0->Py())>0)? 1.:-1.;
for (Int_t iTrackRef = 0; iTrackRef < runArrayTR->GetEntriesFast(); iTrackRef++) {
AliTrackReference *ref = (AliTrackReference*)runArrayTR->At(iTrackRef);
Float_t newdirection = ((ref->X()*ref->Px()+ref->Y()*ref->Py())>0)? 1.:-1.;
if (dir*newdirection<0.0) {
nover++;
dir = newdirection;
}
if (ref->DetectorId()== AliTrackReference::kTRD){
if (nover==0) {
tpcmaxRadius =250;
fNTRDRefOut++;
}
fNTRDRef++;
}
if (ref->DetectorId()== AliTrackReference::kITS){
if (nover==0) {
fNITSRefOut++;
tpcminRadius =90;
}
fNITSRef++;
}
if (ref->DetectorId()== AliTrackReference::kTOF){
fNTOFRef++;
if (nover==0) {
fNTOFRefOut++;
tpcmaxRadius =250;
}
}
if (ref->DetectorId()== AliTrackReference::kTPC){
fNTPCRef++;
if (nover==0) {
fNTPCRefOut++;
fTrackRefOut = (*ref);
if (ref->R()>tpcmaxRadius) tpcmaxRadius = ref->R();
if (ref->R()<tpcminRadius) tpcminRadius = ref->R();
}
}
if (ref->DetectorId()== AliTrackReference::kDisappeared){
if (nover==0 &&TMath::Abs(ref->Z())<250){
tpcmaxRadius = TMath::Min(Float_t(250.),ref->R());
}
}
}
}
fTPCtrackLength = tpcmaxRadius-tpcminRadius;
fMCtracks=nover+1;
}
void AliMCInfo::Update(TParticle * part, TClonesArray * runArrayTR, Double_t pvertex[4], Int_t label){
Clear();
fLabel=label;
fParticle=(*part);
AliMCInfo *info = this;
fVDist[0]=part->Vx()-pvertex[0];
fVDist[1]=part->Vy()-pvertex[1];
fVDist[2]=part->Vz()-pvertex[2];
fVDist[3]=part->R()-pvertex[3];
for (Int_t iTrackRef = 0; iTrackRef < runArrayTR->GetEntriesFast(); iTrackRef++) {
AliTrackReference *trackRef = (AliTrackReference*)runArrayTR->At(iTrackRef);
if (trackRef->DetectorId()== AliTrackReference::kTPC){
TClonesArray & arr = *(info->fTPCReferences);
new (arr[arr.GetEntriesFast()]) AliTrackReference(*trackRef);
}
if (trackRef->DetectorId()== AliTrackReference::kITS){
TClonesArray & arr = *(info->fITSReferences);
new (arr[arr.GetEntriesFast()]) AliTrackReference(*trackRef);
}
if (trackRef->DetectorId()== AliTrackReference::kTRD){
TClonesArray & arr = *(info->fTRDReferences);
new (arr[arr.GetEntriesFast()]) AliTrackReference(*trackRef);
}
if (trackRef->DetectorId()== AliTrackReference::kTOF){
TClonesArray & arr = *(info->fTOFReferences);
new (arr[arr.GetEntriesFast()]) AliTrackReference(*trackRef);
}
if (trackRef->DetectorId()== AliTrackReference::kDisappeared){
info->fTRdecay = *trackRef;
}
}
Update();
CalcTPCrows(runArrayTR);
}