+ if(!tree->GetTree())tree->LoadTree(0);
+
+ // Try to find AliAODEvent
+ AliAODEvent *aodEvent = 0;
+ aodEvent = (AliAODEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliAODEvent");
+ if(aodEvent){
+ // Check if already connected to tree
+ TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("AODObjectsConnectedToTree"));
+ if (connectedList && (strcmp(opt, "reconnect"))) {
+ // If connected use the connected list of objects
+ printf("Delete and reconnect \n");
+
+ fAODObjects->Delete();
+ fAODObjects = connectedList;
+ GetStdContent();
+ fConnected = kTRUE;
+ return;
+ }
+ // Connect to tree
+ // prevent a memory leak when reading back the TList
+ if (!(strcmp(opt, "reconnect"))) fAODObjects->Delete();
+ delete fAODObjects;
+ fAODObjects = 0;
+ // create a new TList from the UserInfo TList...
+ // copy constructor does not work...
+ fAODObjects = (TList*)(aodEvent->GetList()->Clone());
+ fAODObjects->SetOwner(kFALSE);
+ if(fAODObjects->GetEntries()<kAODListN){
+ printf("%s %d AliAODEvent::ReadFromTree() TList contains less than the standard contents %d < %d \n",
+ (char*)__FILE__,__LINE__,fAODObjects->GetEntries(),kAODListN);
+ }
+ //
+ // Let's find out whether we have friends
+ TList* friendL = tree->GetTree()->GetListOfFriends();
+ if (friendL)
+ {
+ TIter next(friendL);
+ TFriendElement* fe;
+ while ((fe = (TFriendElement*)next())){
+ aodEvent = (AliAODEvent*)(fe->GetTree()->GetUserInfo()->FindObject("AliAODEvent"));
+ if (!aodEvent) {
+ printf("No UserInfo on tree \n");
+ } else {
+
+ TList* objL = (TList*)(aodEvent->GetList()->Clone());
+ printf("Get list of object from tree %d !!\n", objL->GetEntries());
+ TIter nextobject(objL);
+ TObject* obj = 0;
+ while((obj = nextobject()))
+ {
+ printf("Adding object from friend %s !\n", obj->GetName());
+ fAODObjects->Add(obj);
+ } // object "branch" loop
+ } // has userinfo
+ } // friend loop
+ } // has friends
+
+
+// set the branch addresses
+ TIter next(fAODObjects);
+ TNamed *el;
+ while((el=(TNamed*)next())){
+ TString bname(el->GetName());
+ // check if branch exists under this Name
+ TBranch *br = tree->GetTree()->GetBranch(bname.Data());
+ if(br){
+ tree->SetBranchAddress(bname.Data(),fAODObjects->GetObjectRef(el));
+ } else {
+ br = tree->GetBranch(Form("%s.",bname.Data()));
+ if(br){
+ tree->SetBranchAddress(Form("%s.",bname.Data()),fAODObjects->GetObjectRef(el));
+ }
+ else{
+ printf("%s %d AliAODEvent::ReadFromTree() No Branch found with Name %s. \n",
+ (char*)__FILE__,__LINE__,bname.Data());
+ }
+ }
+ }
+ GetStdContent();
+ // when reading back we are not owner of the list
+ // must not delete it
+ fAODObjects->SetOwner(kFALSE);
+ fAODObjects->SetName("AODObjectsConnectedToTree");
+ // we are not owner of the list objects
+ // must not delete it
+ tree->GetUserInfo()->Add(fAODObjects);
+ fConnected = kTRUE;
+ }// no aodEvent
+ else {
+ // we can't get the list from the user data, create standard content
+ // and set it by hand
+ CreateStdContent();
+ TIter next(fAODObjects);
+ TNamed *el;
+ while((el=(TNamed*)next())){
+ TString bname(el->GetName());
+ tree->SetBranchAddress(bname.Data(),fAODObjects->GetObjectRef(el));
+ }
+ GetStdContent();
+ // when reading back we are not owner of the list
+ // must not delete it
+ fAODObjects->SetOwner(kFALSE);