for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=0.;
}
+
//______________________________________________________________________________
AliESD::AliESD(const AliESD& esd):
TObject(esd),
for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
}
-//______________________________________________________________________________
-AliESD & AliESD::operator=(const AliESD& source) {
-
- // Assignment operator
-
- if(&source == this) return *this;
-
- fEventNumberInFile = source.fEventNumberInFile;
- fBunchCrossNumber = source.fBunchCrossNumber;
- fOrbitNumber = source.fOrbitNumber;
- fPeriodNumber = source.fPeriodNumber;
- fRunNumber = source.fRunNumber;
- fTimeStamp = source.fTimeStamp;
- fEventType = source.fEventType;
- fTriggerMask = source.fTriggerMask;
- fTriggerCluster = source.fTriggerCluster;
- fRecoVersion = source.fRecoVersion;
- fMagneticField = source.fMagneticField;
- fZDCN1Energy = source.fZDCN1Energy;
- fZDCP1Energy = source.fZDCP1Energy;
- fZDCN2Energy = source.fZDCN2Energy;
- fZDCP2Energy = source.fZDCP2Energy;
- fZDCEMEnergy = source.fZDCEMEnergy;
- fZDCParticipants = source.fZDCParticipants;
- fT0zVertex = source.fT0zVertex;
- fSPDVertex = source.fSPDVertex;
- fPrimaryVertex = source.fPrimaryVertex;
- fSPDMult = source.fSPDMult;
- fT0timeStart = source.fT0timeStart;
- fTracks = *((TClonesArray*)source.fTracks.Clone());
- fHLTConfMapTracks = *((TClonesArray*)source.fHLTConfMapTracks.Clone());
- fHLTHoughTracks = *((TClonesArray*)source.fHLTHoughTracks.Clone());
- fMuonTracks = *((TClonesArray*)source.fMuonTracks.Clone());
- fPmdTracks = *((TClonesArray*)source.fPmdTracks.Clone());
- fTrdTracks = *((TClonesArray*)source.fTrdTracks.Clone());
- fV0s = *((TClonesArray*)source.fV0s.Clone());
- fCascades = *((TClonesArray*)source.fCascades.Clone());
- fKinks = *((TClonesArray*)source.fKinks.Clone());
- fCaloClusters = *((TClonesArray*)source.fCaloClusters.Clone());
- fEMCALClusters = source.fEMCALClusters;
- fFirstEMCALCluster = source.fFirstEMCALCluster;
- fPHOSClusters = source.fPHOSClusters;
- fFirstPHOSCluster = source.fFirstPHOSCluster;
- fESDFMD = source.fESDFMD;
- fESDVZERO = source.fESDVZERO;
- fEMCALTriggerPosition=source. fEMCALTriggerPosition;
- fEMCALTriggerAmplitudes=source.fEMCALTriggerAmplitudes;
- fPHOSTriggerPosition=source.fPHOSTriggerPosition;
- fPHOSTriggerAmplitudes=source.fPHOSTriggerAmplitudes;
- fErrorLogs = *((TClonesArray*)source.fErrorLogs.Clone());
-
- for (Int_t i=0; i<24; i++) {
- fT0time[i] = source.fT0time[i];
- fT0amplitude[i] = source.fT0amplitude[i];
- }
- for (Int_t i=0; i<2; i++) fDiamondXY[i]=source.fDiamondXY[i];
- for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=source.fDiamondCovXY[i];
-
- return *this;
-
-}
-
-
//______________________________________________________________________________
AliESD::~AliESD()
{
fErrorLogs.Clear();
}
+Bool_t AliESD::RemoveTrack(Int_t rm) {
+ // ---------------------------------------------------------
+ // Remove a track and references to it from ESD,
+ // if this track does not come from a reconstructed decay
+ // ---------------------------------------------------------
+ Int_t last=GetNumberOfTracks()-1;
+ if ((rm<0)||(rm>last)) return kFALSE;
+
+ Int_t used=0;
+
+ // Check if this track comes from a reconstructed decay
+ Int_t nv0=GetNumberOfV0s();
+ for (Int_t n=0; n<nv0; n++) {
+ AliESDv0 *v0=GetV0(n);
+
+ Int_t idx=v0->GetNindex();
+ if (rm==idx) return kFALSE;
+ if (idx==last) used++;
+
+ idx=v0->GetPindex();
+ if (rm==idx) return kFALSE;
+ if (idx==last) used++;
+ }
+
+ Int_t ncs=GetNumberOfCascades();
+ for (Int_t n=0; n<ncs; n++) {
+ AliESDcascade *cs=GetCascade(n);
+
+ Int_t idx=cs->GetIndex();
+ if (rm==idx) return kFALSE;
+ if (idx==last) used++;
+ }
+
+ Int_t nkn=GetNumberOfKinks();
+ for (Int_t n=0; n<nkn; n++) {
+ AliESDkink *kn=GetKink(n);
+
+ Int_t idx=kn->GetIndex(0);
+ if (rm==idx) return kFALSE;
+ if (idx==last) used++;
+
+ idx=kn->GetIndex(1);
+ if (rm==idx) return kFALSE;
+ if (idx==last) used++;
+ }
+
+
+ //Replace the removed track with the last track
+ TClonesArray &a=fTracks;
+ delete a.RemoveAt(rm);
+
+ if (rm==last) return kTRUE;
+
+ AliESDtrack *t=GetTrack(last);
+ t->SetID(rm);
+ new (a[rm]) AliESDtrack(*t);
+ delete a.RemoveAt(last);
+
+ if (!used) return kTRUE;
+
+
+ // Remap the indices of the daughters of reconstructed decays
+ for (Int_t n=0; n<nv0; n++) {
+ AliESDv0 *v0=GetV0(n);
+ if (v0->GetIndex(0)==last) {
+ v0->SetIndex(0,rm);
+ used--;
+ if (!used) return kTRUE;
+ }
+ if (v0->GetIndex(1)==last) {
+ v0->SetIndex(1,rm);
+ used--;
+ if (!used) return kTRUE;
+ }
+ }
+
+ for (Int_t n=0; n<ncs; n++) {
+ AliESDcascade *cs=GetCascade(n);
+ if (cs->GetIndex()==last) {
+ cs->SetIndex(rm);
+ used--;
+ if (!used) return kTRUE;
+ }
+ }
+
+ for (Int_t n=0; n<nkn; n++) {
+ AliESDkink *kn=GetKink(n);
+ if (kn->GetIndex(0)==last) {
+ kn->SetIndex(rm,0);
+ used--;
+ if (!used) return kTRUE;
+ }
+ if (kn->GetIndex(1)==last) {
+ kn->SetIndex(rm,1);
+ used--;
+ if (!used) return kTRUE;
+ }
+ }
+
+ return kTRUE;
+}
+
+Bool_t AliESD::Clean(Float_t *cleanPars) {
+ //
+ // Remove the data which are not needed for the physics analysis.
+ //
+ // If track's transverse parameter is larger than dmax
+ // OR
+ // track's longitudinal parameter is larger than zmax
+ // an attempt to remove this track from ESD is made.
+ //
+ // The track gets removed if it does not come
+ // from a reconstructed decay
+ //
+
+ Float_t dmax=cleanPars[0], zmax=cleanPars[1];
+
+ const AliESDVertex *vertex=GetVertex();
+ Bool_t vtxOK=vertex->GetStatus(), rc=kFALSE;
+
+ Int_t nTracks=GetNumberOfTracks();
+ for (Int_t i=nTracks-1; i>=0; i--) {
+ AliESDtrack *track=GetTrack(i);
+ Float_t xy,z; track->GetImpactParameters(xy,z);
+ if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
+ if (RemoveTrack(i)) rc=kTRUE;
+ }
+ }
+
+ return rc;
+}
+
Int_t AliESD::AddV0(const AliESDv0 *v) {
//
// Add V0
Int_t ntrk=GetNumberOfTracks();
for (Int_t i=0; i<ntrk; i++) {
- const AliESDtrack *t=GetTrack(i);
+ AliESDtrack *t=GetTrack(i);
const AliESDfriendTrack *f=t->GetFriendTrack();
ev->AddTrack(f);
+
+ t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"
+
}
}