#include "TList.h"
#include "TRefArray.h"
#include <TNamed.h>
+#include <TROOT.h>
+#include <TInterpreter.h>
#include "AliESDEvent.h"
#include "AliESDfriend.h"
#include "AliESDPmdTrack.h"
#include "AliESDTrdTrack.h"
#include "AliESDVertex.h"
+#include "AliVertexerTracks.h"
#include "AliESDcascade.h"
#include "AliESDkink.h"
#include "AliESDtrack.h"
"AliMultiplicity",
"PHOSTrigger",
"EMCALTrigger",
+ "SPDPileupVertices",
+ "TrkPileupVertices",
"Tracks",
"MuonTracks",
"PmdTracks",
fPHOSTrigger(0),
fEMCALTrigger(0),
fESDACORDE(0),
+ fSPDPileupVertices(0),
+ fTrkPileupVertices(0),
fTracks(0),
fMuonTracks(0),
fPmdTracks(0),
fPHOSTrigger(new AliESDCaloTrigger(*esd.fPHOSTrigger)),
fEMCALTrigger(new AliESDCaloTrigger(*esd.fEMCALTrigger)),
fESDACORDE(new AliESDACORDE(*esd.fESDACORDE)),
+ fSPDPileupVertices(new TClonesArray(*esd.fSPDPileupVertices)),
+ fTrkPileupVertices(new TClonesArray(*esd.fTrkPileupVertices)),
fTracks(new TClonesArray(*esd.fTracks)),
fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
fEMCALCells(new AliESDCaloCells(*esd.fEMCALCells)),
fPHOSCells(new AliESDCaloCells(*esd.fPHOSCells)),
fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
- fESDOld(new AliESD(*esd.fESDOld)),
- fESDFriendOld(new AliESDfriend(*esd.fESDFriendOld)),
+ fESDOld(esd.fESDOld ? new AliESD(*esd.fESDOld) : 0),
+ fESDFriendOld(esd.fESDFriendOld ? new AliESDfriend(*esd.fESDFriendOld) : 0),
fConnected(esd.fConnected),
fUseOwnList(esd.fUseOwnList),
fEMCALClusters(esd.fEMCALClusters),
AddObject(fSPDMult);
AddObject(fPHOSTrigger);
AddObject(fEMCALTrigger);
+ AddObject(fSPDPileupVertices);
+ AddObject(fTrkPileupVertices);
AddObject(fTracks);
AddObject(fMuonTracks);
AddObject(fPmdTracks);
}
else if(mine->InheritsFrom("TCollection")){
if(mine->InheritsFrom("TClonesArray"))
- dynamic_cast<TClonesArray*>(mine)->SetClass(its->ClassName());
+ dynamic_cast<TClonesArray*>(mine)->SetClass(dynamic_cast<TClonesArray*>(its)->GetClass());
dynamic_cast<TCollection*>(mine)->SetName(name);
}
AliDebug(1, Form("adding object %s of type %s", mine->GetName(), mine->ClassName()));
}
if(fPHOSTrigger)fPHOSTrigger->Reset();
if(fEMCALTrigger)fEMCALTrigger->Reset();
+ if(fSPDPileupVertices)fSPDPileupVertices->Delete();
+ if(fTrkPileupVertices)fTrkPileupVertices->Delete();
if(fTracks)fTracks->Delete();
if(fMuonTracks)fMuonTracks->Delete();
if(fPmdTracks)fPmdTracks->Delete();
GetDiamondX(),GetDiamondY());
printf("SPD Multiplicity. Number of tracklets %d \n",
fSPDMult->GetNumberOfTracklets());
+ printf("Number of pileup primary vertices reconstructed with SPD %d\n",
+ GetNumberOfPileupVerticesSPD());
+ printf("Number of pileup primary vertices reconstructed using the tracks %d\n",
+ GetNumberOfPileupVerticesTracks());
printf("Number of tracks: \n");
printf(" charged %d\n", GetNumberOfTracks());
printf(" muon %d\n", GetNumberOfMuonTracks());
Int_t idx=cs->GetIndex();
if (rm==idx) return kFALSE;
if (idx==last) used++;
+
+ AliESDv0 *v0=cs;
+ 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 nkn=GetNumberOfKinks();
if (idx==last) used++;
}
+ // Check if this track is associated with a CaloCluster
+ Int_t ncl=GetNumberOfCaloClusters();
+ for (Int_t n=0; n<ncl; n++) {
+ AliESDCaloCluster *cluster=GetCaloCluster(n);
+ TArrayI *arr=cluster->GetTracksMatched();
+ Int_t s=arr->GetSize();
+ while (s--) {
+ Int_t idx=arr->At(s);
+ if (rm==idx) return kFALSE;
+ if (idx==last) used++;
+ }
+ }
+
+
//Replace the removed track with the last track
TClonesArray &a=*fTracks;
used--;
if (!used) return kTRUE;
}
+ AliESDv0 *v0=cs;
+ 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<nkn; n++) {
}
}
+ // Remap the indices of the tracks accosicated with CaloClusters
+ for (Int_t n=0; n<ncl; n++) {
+ AliESDCaloCluster *cluster=GetCaloCluster(n);
+ TArrayI *arr=cluster->GetTracksMatched();
+ Int_t s=arr->GetSize();
+ while (s--) {
+ Int_t idx=arr->At(s);
+ if (idx==last) {
+ arr->AddAt(rm,s);
+ used--;
+ if (!used) return kTRUE;
+ }
+ }
+ }
+
return kTRUE;
}
return rc;
}
+Char_t AliESDEvent::AddPileupVertexSPD(const AliESDVertex *vtx)
+{
+ // Add a pileup primary vertex reconstructed with SPD
+ TClonesArray &ftr = *fSPDPileupVertices;
+ Char_t n=Char_t(ftr.GetEntriesFast());
+ AliESDVertex *vertex = new(ftr[n]) AliESDVertex(*vtx);
+ vertex->SetID(n);
+ return n;
+}
+
+Char_t AliESDEvent::AddPileupVertexTracks(const AliESDVertex *vtx)
+{
+ // Add a pileup primary vertex reconstructed with SPD
+ TClonesArray &ftr = *fTrkPileupVertices;
+ Char_t n=Char_t(ftr.GetEntriesFast());
+ AliESDVertex *vertex = new(ftr[n]) AliESDVertex(*vtx);
+ vertex->SetID(n);
+ return n;
+}
+
Int_t AliESDEvent::AddTrack(const AliESDtrack *t)
{
// Add track
}
}
-void AliESDEvent::SetPrimaryVertex(const AliESDVertex *vertex)
+void AliESDEvent::SetPrimaryVertexTracks(const AliESDVertex *vertex)
{
- // Set the primary vertex
+ // Set the primary vertex reconstructed using he ESD tracks.
// use already allocated space
if(fPrimaryVertex){
*fPrimaryVertex = *vertex;
}
}
+const AliESDVertex * AliESDEvent::GetPrimaryVertex() const
+{
+ //
+ // Get the "best" available reconstructed primary vertex.
+ //
+ if(fPrimaryVertex){
+ if (fPrimaryVertex->GetStatus()) return fPrimaryVertex;
+ }
+ if(fSPDVertex){
+ if (fSPDVertex->GetStatus()) return fSPDVertex;
+ }
+ if(fTPCVertex) return fTPCVertex;
+
+ AliWarning("No primary vertex available. Returning the \"default\"...");
+ return fSPDVertex;
+}
+
+AliESDVertex * AliESDEvent::PrimaryVertexTracksUnconstrained() const
+{
+ //
+ // Removes diamond constraint from fPrimaryVertex (reconstructed with tracks)
+ // Returns a AliESDVertex which has to be deleted by the user
+ //
+ if(!fPrimaryVertex) {
+ AliWarning("No primary vertex from tracks available.");
+ return 0;
+ }
+ if(!fPrimaryVertex->GetStatus()) {
+ AliWarning("No primary vertex from tracks available.");
+ return 0;
+ }
+
+ AliVertexerTracks vertexer(GetMagneticField());
+ Float_t diamondxyz[3]={(Float_t)GetDiamondX(),(Float_t)GetDiamondY(),0.};
+ Float_t diamondcovxy[3]; GetDiamondCovXY(diamondcovxy);
+ Float_t diamondcov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,7.};
+ AliESDVertex *vertex =
+ (AliESDVertex*)vertexer.RemoveConstraintFromVertex(fPrimaryVertex,diamondxyz,diamondcov);
+
+ return vertex;
+}
+
void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul)
{
// Set the SPD Multiplicity
fSPDMult = (AliMultiplicity*)fESDObjects->FindObject(fgkESDListName[kSPDMult]);
fPHOSTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kPHOSTrigger]);
fEMCALTrigger = (AliESDCaloTrigger*)fESDObjects->FindObject(fgkESDListName[kEMCALTrigger]);
+ fSPDPileupVertices = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kSPDPileupVertices]);
+ fTrkPileupVertices = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrkPileupVertices]);
fTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTracks]);
fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
AddObject(new AliMultiplicity());
AddObject(new AliESDCaloTrigger());
AddObject(new AliESDCaloTrigger());
+ AddObject(new TClonesArray("AliESDVertex",0));
+ AddObject(new TClonesArray("AliESDVertex",0));
AddObject(new TClonesArray("AliESDtrack",0));
AddObject(new TClonesArray("AliESDMuonTrack",0));
AddObject(new TClonesArray("AliESDPmdTrack",0));
return clusters->GetEntriesFast();
}
-const void AliESDEvent::WriteToTree(TTree* tree) const {
+void AliESDEvent::WriteToTree(TTree* tree) const {
// Book the branches as in TTree::Branch(TCollection*)
// but add a "." at the end of top level branches which are
// not a TClonesArray
while ((obj = next())) {
branchname.Form("%s", obj->GetName());
+ if(branchname.CompareTo("AliESDfriend")==0)branchname = "ESDfriend.";
if ((kSplitlevel > 1) && !obj->InheritsFrom(TClonesArray::Class())) {
if(!branchname.EndsWith("."))branchname += ".";
}
}
-void AliESDEvent::ReadFromTree(TTree *tree, Option_t* /*opt*/){
+void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
//
// Connect the ESDEvent to a tree
//
if(fESDFriendOld)AddObject(fESDFriendOld);
// we are not owner of the list objects
// must not delete it
- fESDObjects->SetOwner(kFALSE);
+ fESDObjects->SetOwner(kTRUE);
fESDObjects->SetName("ESDObjectsConnectedToTree");
tree->GetUserInfo()->Add(fESDObjects);
fConnected = true;
esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
if(esdEvent){
// Check if already connected to tree
+ esdEvent->Reset();
TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
- if (connectedList) {
+
+
+ if (connectedList && (strcmp(opt, "reconnect"))) {
// If connected use the connected list if objects
fESDObjects->Delete();
fESDObjects = connectedList;
// Connect to tree
// prevent a memory leak when reading back the TList
-
+ if (!(strcmp(opt, "reconnect"))) fESDObjects->Delete();
+
if(!fUseOwnList){
- delete fESDObjects;
- fESDObjects = 0;
// create a new TList from the UserInfo TList...
// copy constructor does not work...
fESDObjects = (TList*)(esdEvent->GetList()->Clone());
- fESDObjects->SetOwner(kFALSE);
+ fESDObjects->SetOwner(kTRUE);
}
else if ( fESDObjects->GetEntries()==0){
// at least create the std content if we want to read to our list
GetStdContent();
// when reading back we are not owner of the list
// must not delete it
- fESDObjects->SetOwner(kFALSE);
+ fESDObjects->SetOwner(kTRUE);
fESDObjects->SetName("ESDObjectsConnectedToTree");
// we are not owner of the list objects
// must not delete it
tree->GetUserInfo()->Add(fESDObjects);
+ tree->GetUserInfo()->SetOwner(kFALSE);
fConnected = true;
- }// no esdEvent
+ }// no esdEvent -->
else {
// we can't get the list from the user data, create standard content
// and set it by hand (no ESDfriend at the moment
GetStdContent();
// when reading back we are not owner of the list
// must not delete it
- fESDObjects->SetOwner(kFALSE);
+ fESDObjects->SetOwner(kTRUE);
}
}
0,
fESDOld->GetZDCN2Energy(),
fESDOld->GetZDCP2Energy(),
- fESDOld->GetZDCParticipants());
+ fESDOld->GetZDCParticipants(),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0);
// FMD
if(fESDOld->GetVertex())SetPrimaryVertexSPD(fESDOld->GetVertex());
- if(fESDOld->GetPrimaryVertex())SetPrimaryVertex(fESDOld->GetPrimaryVertex());
+ if(fESDOld->GetPrimaryVertex())SetPrimaryVertexTracks(fESDOld->GetPrimaryVertex());
if(fESDOld->GetMultiplicity())SetMultiplicity(fESDOld->GetMultiplicity());
}// if fesdold
}
+Bool_t AliESDEvent::IsEventSelected(const char *trigExpr) const
+{
+ // Check if the event satisfies the trigger
+ // selection expression trigExpr.
+ // trigExpr can be any logical expression
+ // of the trigger classes defined in AliESDRun
+ // In case of wrong syntax return kTRUE.
+
+ TString expr(trigExpr);
+ if (expr.IsNull()) return kTRUE;
+
+ ULong64_t mask = GetTriggerMask();
+ for(Int_t itrig = 0; itrig < AliESDRun::kNTriggerClasses; itrig++) {
+ if (mask & (1ull << itrig)) {
+ expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"1");
+ }
+ else {
+ expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"0");
+ }
+ }
+
+ Int_t error;
+ if ((gROOT->ProcessLineFast(expr.Data(),&error) == 0) &&
+ (error == TInterpreter::kNoError)) {
+ return kFALSE;
+ }
+
+ return kTRUE;
+
+}
+
+TObject* AliESDEvent::GetHLTTriggerDecision() const
+{
+ // get the HLT trigger decission object
+
+ // cast away const'nes because the FindListObject method
+ // is not const
+ AliESDEvent* pNonConst=const_cast<AliESDEvent*>(this);
+ return pNonConst->FindListObject("HLTGlobalTrigger");
+}
+
+TString AliESDEvent::GetHLTTriggerDescription() const
+{
+ // get the HLT trigger decission description
+ TString description;
+ TObject* pDecision=GetHLTTriggerDecision();
+ if (pDecision) {
+ description=pDecision->GetTitle();
+ }
+
+ return description;
+}
+
+Bool_t AliESDEvent::IsHLTTriggerFired(const char* name) const
+{
+ // get the HLT trigger decission description
+ TObject* pDecision=GetHLTTriggerDecision();
+ if (!pDecision) return kFALSE;
+
+ Option_t* option=pDecision->GetOption();
+ if (option==NULL || *option!='1') return kFALSE;
+
+ if (name) {
+ TString description=GetHLTTriggerDescription();
+ Int_t index=description.Index(name);
+ if (index<0) return kFALSE;
+ index+=strlen(name);
+ if (index>=description.Length()) return kFALSE;
+ if (description[index]!=0 && description[index]!=' ') return kFALSE;
+ }
+ return kTRUE;
+}