void cloneAODTreeAndAddObject(const char *newFileName = "AliAOD_new.root", const char *orgFileName = "AliAOD.root") {
// This little macro takes an already created AOD file and clones it.
// After adding a new brach, the new TTree is written to a new file.
//
// To read back this data (including the newly updated branch), have
// a look at $ALICE_ROOT/STEER/ReadAOD.C and add one line
// TClonesArray *esdTracks =
// (TClonesArray*)ev->GetList()->FindObject("esdTracks");
// after
// ev->ReadFromTree(aodTree);
//
// esdTracks will be 'filled' correctly after each call of
// aodTree->GetEvent(nEv);
//
// open input file and get the TTree
TFile orgFile(orgFileName, "READ");
// get original TTree
TTree *orgAodTree = (TTree*)orgFile.Get("aodTree");
// open new output file
TFile *newFile = new TFile(newFileName, "RECREATE");
// clone old TTree
TTree *newAodTree = orgAodTree->CloneTree();
// do your gymnastics with the new TTree
AliAODEvent *evNew = new AliAODEvent();
evNew->ReadFromTree(newAodTree);
// add new information to the list (we use AliESDtracks as an example)
TClonesArray *tracks = new TClonesArray("AliESDtrack", 0);
evNew->AddObject(tracks); // add new object to the list
// define a unique name
const char *name = "esdTracks";
tracks->SetName(name); // set this name to be the name of the TClonesArray
// create the new branch
TBranch *newBranch = newAodTree->Branch(name, &tracks); // the branch gets the same name
// loop over events
Int_t nEvent = newAodTree->GetEntries();
for(Int_t iEv = 0; iEv < nEvent; iEv++) {
/*
// read events (only necessary if you want to access the old data)
newAodTree->GetEvent(iEv);
*/
tracks->Delete(); // for each event delete old entries of new TClonesArray
Int_t nTracks = gRandom->Rndm() * 50; // randomize size of TClonesArray (just for this example)
tracks->Expand(nTracks); // expand container (just for speed)
// fill TClonesArray
TClonesArray &rTracks = *tracks;
for (Int_t iTr = 0; iTr< nTracks; iTr++) {
new(rTracks[iTr]) AliESDtrack();
}
// fill the new branch
newBranch->Fill();
}
// delete old and write new UserInfo
newAodTree->GetUserInfo()->Clear();
newAodTree->GetUserInfo()->Add(evNew);
// write new TTree to file
newAodTree->Write();
// close files
newFile->Close();
delete newFile;
orgFile.Close();
}
cloneAODTreeAndAddObject.C:1 cloneAODTreeAndAddObject.C:2 cloneAODTreeAndAddObject.C:3 cloneAODTreeAndAddObject.C:4 cloneAODTreeAndAddObject.C:5 cloneAODTreeAndAddObject.C:6 cloneAODTreeAndAddObject.C:7 cloneAODTreeAndAddObject.C:8 cloneAODTreeAndAddObject.C:9 cloneAODTreeAndAddObject.C:10 cloneAODTreeAndAddObject.C:11 cloneAODTreeAndAddObject.C:12 cloneAODTreeAndAddObject.C:13 cloneAODTreeAndAddObject.C:14 cloneAODTreeAndAddObject.C:15 cloneAODTreeAndAddObject.C:16 cloneAODTreeAndAddObject.C:17 cloneAODTreeAndAddObject.C:18 cloneAODTreeAndAddObject.C:19 cloneAODTreeAndAddObject.C:20 cloneAODTreeAndAddObject.C:21 cloneAODTreeAndAddObject.C:22 cloneAODTreeAndAddObject.C:23 cloneAODTreeAndAddObject.C:24 cloneAODTreeAndAddObject.C:25 cloneAODTreeAndAddObject.C:26 cloneAODTreeAndAddObject.C:27 cloneAODTreeAndAddObject.C:28 cloneAODTreeAndAddObject.C:29 cloneAODTreeAndAddObject.C:30 cloneAODTreeAndAddObject.C:31 cloneAODTreeAndAddObject.C:32 cloneAODTreeAndAddObject.C:33 cloneAODTreeAndAddObject.C:34 cloneAODTreeAndAddObject.C:35 cloneAODTreeAndAddObject.C:36 cloneAODTreeAndAddObject.C:37 cloneAODTreeAndAddObject.C:38 cloneAODTreeAndAddObject.C:39 cloneAODTreeAndAddObject.C:40 cloneAODTreeAndAddObject.C:41 cloneAODTreeAndAddObject.C:42 cloneAODTreeAndAddObject.C:43 cloneAODTreeAndAddObject.C:44 cloneAODTreeAndAddObject.C:45 cloneAODTreeAndAddObject.C:46 cloneAODTreeAndAddObject.C:47 cloneAODTreeAndAddObject.C:48 cloneAODTreeAndAddObject.C:49 cloneAODTreeAndAddObject.C:50 cloneAODTreeAndAddObject.C:51 cloneAODTreeAndAddObject.C:52 cloneAODTreeAndAddObject.C:53 cloneAODTreeAndAddObject.C:54 cloneAODTreeAndAddObject.C:55 cloneAODTreeAndAddObject.C:56 cloneAODTreeAndAddObject.C:57 cloneAODTreeAndAddObject.C:58 cloneAODTreeAndAddObject.C:59 cloneAODTreeAndAddObject.C:60 cloneAODTreeAndAddObject.C:61 cloneAODTreeAndAddObject.C:62 cloneAODTreeAndAddObject.C:63 cloneAODTreeAndAddObject.C:64 cloneAODTreeAndAddObject.C:65 cloneAODTreeAndAddObject.C:66 cloneAODTreeAndAddObject.C:67 cloneAODTreeAndAddObject.C:68 cloneAODTreeAndAddObject.C:69 cloneAODTreeAndAddObject.C:70 cloneAODTreeAndAddObject.C:71 cloneAODTreeAndAddObject.C:72 cloneAODTreeAndAddObject.C:73 cloneAODTreeAndAddObject.C:74 cloneAODTreeAndAddObject.C:75 cloneAODTreeAndAddObject.C:76 cloneAODTreeAndAddObject.C:77 cloneAODTreeAndAddObject.C:78 cloneAODTreeAndAddObject.C:79