//ALIROOT includes
#include "AliTrackReference.h"
#include "AliMCInfo.h"
+#include "AliMathBase.h"
#endif
//
fNITSRef(0), // ITS references counter
fNTRDRef(0), // TRD references counter
fNTOFRef(0), // TOF references counter
+ fNTPCRefOut(0), // tpc references counter
+ fNITSRefOut(0), // ITS references counter
+ fNTRDRefOut(0), // TRD references counter
+ fNTOFRefOut(0), // TOF references counter
fTPCReferences(0),
fITSReferences(0),
fTRDReferences(0),
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;
}
fNITSRef(info.fNITSRef), // ITS references counter
fNTRDRef(info.fNTRDRef), // TRD references counter
fNTOFRef(info.fNTOFRef), // TOF references counter
+ fNTPCRefOut(info.fNTPCRefOut), // tpc references counter
+ fNITSRefOut(info.fNITSRefOut), // ITS references counter
+ fNTRDRefOut(info.fNTRDRefOut), // TRD references counter
+ fNTOFRefOut(info.fNTOFRefOut), // TOF references counter
fTPCReferences(0),
fITSReferences(0),
fTRDReferences(0),
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];
+
}
+
void AliMCInfo::Update()
{
//
fTrackRef.Pz()*fTrackRef.Pz());
if (p>0.001){
Float_t betagama = p /fMass;
- fPrim = TPCBetheBloch(betagama);
+ fPrim = AliMathBase::BetheBlochAleph(betagama);
}else fPrim=0;
}
}else{
fMass =0;
fPrim =0;
}
+
+
+
}
}
-//_____________________________________________________________________________
-Float_t AliMCInfo::TPCBetheBloch(Float_t bg)
-{
+void AliMCInfo::Clear(Option_t* ){
//
- // Bethe-Bloch energy loss formula
+ // clear the content
//
- const Double_t kp1=0.76176e-1;
- const Double_t kp2=10.632;
- const Double_t kp3=0.13279e-4;
- const Double_t kp4=1.8631;
- const Double_t kp5=1.9479;
-
- Double_t dbg = (Double_t) bg;
-
- Double_t beta = dbg/TMath::Sqrt(1.+dbg*dbg);
-
- Double_t aa = TMath::Power(beta,kp4);
- Double_t bb = TMath::Power(1./dbg,kp5);
-
- bb=TMath::Log(kp3+bb);
-
- return ((Float_t)((kp2-aa-bb)*kp1/aa));
+ 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; // index of primary particle in TreeH
+ fMass=0; // mass of the particle
+ fCharge=0; // charge of the particle
+ fLabel=0; // track label
+ fEventNr=0; // event number
+ fMCtracks=0; // indication of how many times the track is retuturned back
+ fPdg=0; //pdg code
+ fTPCdecay=0; //indicates decay in TPC
+ fRowsWithDigitsInn=0; // number of rows with digits in the inner sectors
+ fRowsWithDigits=0; // number of rows with digits in the outer sectors
+ fRowsTrackLength=0; // last - first row with digit
+ fTPCtrackLength=0; // distance between first and last track reference
+ fPrim=0; // theoretical dedx in tpc according particle momenta and mass
+ fNTPCRef=0; // tpc references counter
+ fNITSRef=0; // ITS references counter
+ fNTRDRef=0; // TRD references counter
+ fNTOFRef=0; // TOF references counter
+ //
+ fNTPCRefOut=0; // tpc references counter - out
+ fNITSRefOut=0; // ITS references counter - out
+ fNTRDRefOut=0; // TRD references counter - out
+ fNTOFRefOut=0; // TOF references counter - out
}
+
void AliMCInfo::CalcTPCrows(TClonesArray * runArrayTR){
//
// Calculates the numebr of the track references for detectors
fNITSRef = 0;
fNTRDRef = 0;
fNTOFRef = 0;
- Float_t tpcminRadius=250;
- Float_t tpcmaxRadius=80;
- Float_t dir=0;
- Int_t nover=0;
-
- for (Int_t iTrackRef = 0; iTrackRef < runArrayTR->GetEntriesFast(); iTrackRef++) {
+ 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.; //inside or outside
//
- AliTrackReference *ref = (AliTrackReference*)runArrayTR->At(iTrackRef);
- Float_t newdirection = (ref->X()*ref->Px()+ref->Y()*ref->Py()>0)? 1.:-1.; //inside or outside
- if (dir*newdirection<0.5) {
- nover++;
- dir = newdirection;
+ //
+ 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.; //inside or outside
+ //
+ //
+ 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());
+ }
+ }
}
- //
- if (ref->DetectorId()== AliTrackReference::kTRD){
- tpcmaxRadius =250;
- fNTRDRef++;
+ } // if we have track refs
+ 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);
+ Int_t label = trackRef->GetTrack();
+ if (trackRef->DetectorId()== AliTrackReference::kTPC){
+ TClonesArray & arr = *(info->fTPCReferences);
+ new (arr[arr.GetEntriesFast()]) AliTrackReference(*trackRef);
}
- if (ref->DetectorId()== AliTrackReference::kITS){
- fNITSRef++;
- tpcminRadius =90;
+ if (trackRef->DetectorId()== AliTrackReference::kITS){
+ TClonesArray & arr = *(info->fITSReferences);
+ new (arr[arr.GetEntriesFast()]) AliTrackReference(*trackRef);
}
- if (ref->DetectorId()== AliTrackReference::kITS){
- fNTOFRef++;
- tpcmaxRadius =250;
+ if (trackRef->DetectorId()== AliTrackReference::kTRD){
+ TClonesArray & arr = *(info->fTRDReferences);
+ new (arr[arr.GetEntriesFast()]) AliTrackReference(*trackRef);
}
- //
- if (ref->DetectorId()== AliTrackReference::kTPC){
- fNTPCRef++;
- if (ref->R()>tpcmaxRadius) tpcmaxRadius = ref->R();
- if (ref->R()<tpcminRadius) tpcminRadius = ref->R();
+ if (trackRef->DetectorId()== AliTrackReference::kTOF){
+ TClonesArray & arr = *(info->fTOFReferences);
+ new (arr[arr.GetEntriesFast()]) AliTrackReference(*trackRef);
}
- if (ref->DetectorId()== AliTrackReference::kDisappeared){
- if (TMath::Abs(ref->Z())<250 && TMath::Abs(ref->R()<250))
- tpcmaxRadius = ref->R();
+ //
+ // decay case
+ //
+ if (trackRef->DetectorId()== AliTrackReference::kDisappeared){
+ info->fTRdecay = *trackRef;
}
}
- fTPCtrackLength = tpcmaxRadius-tpcminRadius;
- fMCtracks=nover;
+ //
+ Update();
+ CalcTPCrows(runArrayTR);
}
+