/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id:  */

//_________________________________________________________________________
//  A singleton 
//                  
//*-- Author: Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
//////////////////////////////////////////////////////////////////////////////


// --- ROOT system ---

#include "TFile.h"
#include "TTree.h"
#include "TROOT.h"
#include "TObjString.h"

// --- Standard library ---
#include <iostream.h>

// --- AliRoot header files ---

#include "AliRun.h"
#include "AliPHOSIndexToObject.h"
#include "AliPHOSDigitizer.h"
#include "AliPHOSClusterizer.h"
#include "AliPHOSTrackSegmentMaker.h"
#include "AliPHOSPID.h" 

ClassImp(AliPHOSIndexToObject)
  
  AliPHOSIndexToObject * AliPHOSIndexToObject::fgObjGetter = 0 ; 

//____________________________________________________________________________ 
 AliPHOSIndexToObject::AliPHOSIndexToObject(char* headerFile,char* branch,char* branchFileName )
{
  //Initiate all lists
  fEvent = 0 ;

  fDigits = new TClonesArray("AliPHOSDigit",100) ;
  fEmcRecPoints = new TObjArray(100) ;
  fCpvRecPoints = new TObjArray(100) ;
  fTS = new TClonesArray("AliPHOSTrackSegment",100) ;
  fRecParticles = new TClonesArray("AliPHOSRecParticle",100) ;
  fPrimaries = new TObjArray(1) ;

  fDigitizer = 0 ;
  fClusterizer = 0 ;
  fTSMaker = 0 ;
  fPID = 0 ;

  //open headers file
  fHeaderFile = headerFile ;
  TFile * file = (TFile*) gROOT->GetFile(fHeaderFile.Data() ) ;

  if(file == 0){
    file = new TFile(fHeaderFile.Data(),"update") ;
    gAlice = (AliRun *) file->Get("gAlice") ;
    cout << "Read gAlice" << gAlice << endl ;
  }

  fMaxEvent = (Int_t) gAlice->TreeE()->GetEntries() ;

  char * branchFile ;
  if(branchFileName && strlen(branchFileName)){
    branchFile = new char[strlen(gAlice->GetBaseFile())+2+strlen(branchFileName)];
    sprintf(branchFile,"%s/%s",gAlice->GetBaseFile(),branchFileName);
  }
  else
    branchFile = 0 ;

  char * dummyfile = 0 ;

  gAlice->GetEvent(fEvent) ;

  Bool_t isRead = kFALSE;
  //now read branches 
  if((strcmp(branch,"PHOSRP")==0) || (strcmp(branch,"PHOSPID")==0)){
    ReadRecParticles(branchFile) ;  //first read RecPartcles and branche TS from which they are made
    ReadTS(dummyfile);              //read TS from which made RecParticles above
    ReadRecPoints(dummyfile) ;     //RecPoints from which TS above made
    ReadDigits(dummyfile) ;         //digits. from whic RecPoints made
    isRead= kTRUE ;
  }
  
  if((strcmp(branch,"PHOSTS")==0) || (strcmp(branch,"PHOSTSMaker")==0)){
    ReadTS(branchFile);            //read TS and branch of RecPoints from which they are made
    ReadRecPoints(dummyfile) ;     //recpoints abd branch of digits
    ReadDigits(dummyfile) ;       //digits and branch of Primaries
    ReadRecParticles(dummyfile) ;  //posiible completion of TS
    isRead= kTRUE ;
  }

  if((strcmp(branch,"PHOSEmcRP")==0)|| (strcmp(branch,"PHOSCpvRP")==0) || 
     (strcmp(branch,"PHOSClusterizer")==0)){
    ReadRecPoints(branchFile) ;    //RecPoints and Digits branch filename
    ReadDigits(dummyfile) ;        //digits and primary file name
    ReadTS(dummyfile);             //possible completion of RecPoints
    ReadRecParticles(dummyfile) ;  //possible completion of TS
    isRead= kTRUE ;
  }

  if((strcmp(branch,"PHOS")==0) || (strcmp(branch,"PHOSDigitizer")==0)){
    ReadDigits(branchFile) ;
    ReadRecPoints(dummyfile) ;
    ReadTS(dummyfile);
    ReadRecParticles(dummyfile) ;
    isRead= kTRUE ;
  }

  if(!isRead){
    cout << "AliPHOSIndexToObject: wrong branch name specified: " << branch << endl ;
    cout << "   avalilable names are `PHOSRP', `PHOSPID'"<<endl ;
    cout << "                        `PHOSTS', `PHOSTSMaker'"<<endl ;
    cout << "                        `PHOSEmcRP', `PHOSCpvRP', `PHOSClusterizer'"<< endl ;
    cout << "                        `PHOS' and `PHOSDigitizer'"<< endl ;
  }
  ReadPrimaries() ; // should be called when digits are already read 

}
//____________________________________________________________________________ 
 AliPHOSIndexToObject * AliPHOSIndexToObject::GetInstance()
{
  // Returns the pointer of the unique instance already defined
  
  AliPHOSIndexToObject * rv = 0 ;
  if ( fgObjGetter )
    rv = fgObjGetter ;
  else
    cout << "AliPHOSIndexToObject::GetInstance ERROR: not yet initialized" << endl ;

  return rv ;
}

//____________________________________________________________________________ 
 AliPHOSIndexToObject * AliPHOSIndexToObject::GetInstance(char* headerFile,char* branch,char* branchFile)
{
  // Creates and returns the pointer of the unique instance
  // Must be called only when the environment has changed 

  if ( fgObjGetter )      // delete it if already exists
    delete fgObjGetter ; 

  fgObjGetter = new AliPHOSIndexToObject(headerFile,branch,branchFile) ; 
  
  return fgObjGetter ; 
  
}

//____________________________________________________________________________ 
 TParticle * AliPHOSIndexToObject::GimePrimary(Int_t index)
{
  
  
  Int_t primaryList = (Int_t) (TMath::Ceil(index/10000000.) ) - 1 ;
  Int_t primaryIndex = index - primaryList*10000000 ; 
  
  if ( primaryList > 0  ) {
    cout << " IndexToObject does not support currently Mixing of primary " << endl ;
    cout << "   can not return primary: " << index<< " (list "<< primaryList<< " primary # " << primaryIndex << " )"<<endl ;
    return 0;
  }
  
  return gAlice->Particle(primaryIndex) ;
  
}

//____________________________________________________________________________ 
 Bool_t AliPHOSIndexToObject::ReadRecParticles(char * branchFile){

  cout << "In ReadRecPart " << endl ;
  if(gAlice->TreeR()==0)
    return kFALSE ;
  cout << "TreeR OK " << fPID<< endl ;

  
  if(fPID) // already read
    branchFile = fPID->GetRecParticlesBranch() ;

  cout << "brf " << branchFile << endl ;

  if(branchFile){ // we should read a specific branch
    TBranch * pidBranch = 0;
    TBranch * rpBranch = 0;
    
    TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
    Int_t ibranch;
    Bool_t pidNotFound = kTRUE ;
    Bool_t rpNotFound = kTRUE ;
    
    for(ibranch = 0;(ibranch <branches->GetEntries())&&(pidNotFound||rpNotFound);ibranch++){
      cout <<  " ibranch " << ibranch << " " << branches->At(ibranch)->GetName() <<  " " << branches->At(ibranch)->GetTitle() << endl ;

      cout << " file " << branchFile << endl ;
      if(pidNotFound){
	pidBranch=(TBranch *) branches->At(ibranch) ;
	if( (strcmp(branchFile,pidBranch->GetTitle())==0 ) &&
	    (strcmp(pidBranch->GetName(),"AliPHOSPID") == 0) ){
	  pidNotFound = kFALSE ;
	  cout << "1 " << endl ;
	}
      }
      if(rpNotFound){
	rpBranch=(TBranch *) branches->At(ibranch) ;
	if( (strcmp(branchFile,rpBranch->GetTitle())==0 ) &&
	    (strcmp(rpBranch->GetName(),"PHOSRP") == 0) ){
	  cout << "2"<< endl ;
	  rpNotFound = kFALSE ;
	}
      }
    }
    
    if(pidNotFound ||rpNotFound ){
      cout << "AliPHOSIndexToObject error" << endl ;
      cout << "     Can't find Branch with PID and RecParticles " ;
      return kFALSE ;
    }
    
    pidBranch->SetAddress(&fPID) ;
    rpBranch->SetAddress(&fRecParticles) ;
    gAlice->TreeR()->GetEvent(0) ;    
  }
  else{ //we Should read any branch and print warning if there are other possibilities
    if(fTSMaker){//if TrackSegments already read, we should read RecParticles Made from it
      TBranch * pidBranch = 0;
      TBranch * rpBranch = 0;
    
      TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
      cout << " # of br " << branches->GetEntries() << endl ;

      Int_t branchRead = 0;
      Bool_t allNotFound = kTRUE ;
      while(allNotFound){
	Bool_t pidNotFound = kTRUE ;
	Bool_t rpNotFound = kTRUE ;
	Int_t ibranch ;
	for(ibranch = branchRead;(ibranch <branches->GetEntries() )&& pidNotFound;ibranch++){
	  pidBranch=(TBranch *) branches->At(ibranch) ;

	  cout <<  " ibranch1 " << ibranch << " " << branches->At(ibranch)->GetName() <<  " " << branches->At(ibranch)->GetTitle() << endl ;


	  if(strcmp(pidBranch->GetName(),"AliPHOSPID") == 0) 
	    pidNotFound = kFALSE ;
	}
	branchRead = ibranch +1 ; 
	for(ibranch = 0 ;(ibranch <branches->GetEntries() )&& rpNotFound;ibranch++){

	  cout <<  " ibranch2 " << ibranch << " " << branches->At(ibranch)->GetName() <<  " " << branches->At(ibranch)->GetTitle() << " " <<pidBranch->GetTitle()<<  endl ;

	  rpBranch=(TBranch *) branches->At(ibranch) ;
	  if( (strcmp(pidBranch->GetTitle(),rpBranch->GetTitle())==0 ) &&
	      (strcmp(rpBranch->GetName(),"PHOSRP") == 0) )
	    rpNotFound = kFALSE ;
	}
	
	if(pidNotFound ||rpNotFound ){
	  cout << "AliPHOSIndexToObject error" << endl ;
	  cout << "     Can't find Branch with PID and RecParticles " ;
	  return kFALSE ;
	}
    
	pidBranch->SetAddress(&fPID) ;
	rpBranch->SetAddress(&fRecParticles) ;
	gAlice->TreeR()->GetEvent(0) ;    
	
	if(strcmp(fTSMaker->GetTrackSegmentsBranch(),fPID->GetTrackSegmentsBranch()) == 0)
	  allNotFound = kFALSE ;
      }
    }
    else{//we read any (first) recparticles
      TBranch * pidBranch = 0;
      TBranch * rpBranch = 0;
      TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;

      cout << " # of br " << branches->GetEntries() << endl ;

      Bool_t pidNotFound = kTRUE ;
      Bool_t rpNotFound = kTRUE ;
      Int_t ibranch ;
      for(ibranch = 0;(ibranch <branches->GetEntries() )&& pidNotFound;ibranch++){
	pidBranch=(TBranch *) branches->At(ibranch) ;
	  cout <<  " ibranch3 " << ibranch << " " << branches->At(ibranch)->GetName() <<  " " << branches->At(ibranch)->GetTitle() << endl ;

	if(strcmp(pidBranch->GetName(),"AliPHOSPID") == 0) 
	  pidNotFound = kFALSE ;
      }
      for(ibranch = 0 ;(ibranch <branches->GetEntries() )&& rpNotFound;ibranch++){
	rpBranch=(TBranch *) branches->At(ibranch) ;
	  cout <<  " ibranch2 " << ibranch << " " << branches->At(ibranch)->GetName() <<  " " << branches->At(ibranch)->GetTitle() << " " <<pidBranch->GetTitle()<<  endl ;


	if( (strcmp(pidBranch->GetTitle(),rpBranch->GetTitle())==0 ) &&
	    (strcmp(rpBranch->GetName(),"PHOSRP") == 0) )
	  rpNotFound = kFALSE ;
      }
      
      if(pidNotFound ||rpNotFound ){
	cout << "AliPHOSIndexToObject worning: " << endl ;
	cout << "     Can't find Branch with PID and RecParticles " << endl;
	return kFALSE ;
      }
      
      pidBranch->SetAddress(&fPID) ;
      rpBranch->SetAddress(&fRecParticles) ;
      gAlice->TreeR()->GetEvent(0) ;    
      
    }
  }
  return kTRUE ;
}
//____________________________________________________________________________ 
 Bool_t AliPHOSIndexToObject::ReadTS(char * branchFile){

  if(gAlice->TreeR()==0)
    return kFALSE ;

  if(fPID)//if RecParticles already read, we should read TS from which they are made
    branchFile= fPID->GetTrackSegmentsBranch() ;
  
  if(branchFile){   // we should read a specific branch
    
    TBranch * tsMakerBranch = 0;
    TBranch * tsBranch = 0;
    
    TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
    Int_t ibranch;
    Bool_t tsMakerNotFound = kTRUE ;
    Bool_t tsNotFound = kTRUE ;
    
    for(ibranch = 0;(ibranch <branches->GetEntries())&&(tsMakerNotFound||tsNotFound);ibranch++){
      if(tsMakerNotFound){
	tsMakerBranch=(TBranch *) branches->At(ibranch) ;
	if( strcmp(branchFile,tsMakerBranch->GetTitle())==0 )
	  if( strcmp(tsMakerBranch->GetName(),"AliPHOSTrackSegmentMaker") == 0) 
	    tsMakerNotFound = kFALSE ;
      }
      if(tsNotFound){
	tsBranch=(TBranch *) branches->At(ibranch) ;
	if( strcmp(branchFile,tsBranch->GetTitle())==0 )
	  if( strcmp(tsBranch->GetName(),"PHOSTS") == 0) 
	    tsNotFound = kFALSE ;
      }
    }
    
    if(tsMakerNotFound ||tsNotFound ){
      cout << "AliPHOSIndexToObject error" << endl ;
      cout << "Can't find Branch with TrackSegmentMaker and TrackSegments " ;
      cout << "Do nothing" <<endl  ;
      return kFALSE ;
    }
    
    tsMakerBranch->SetAddress(&fTSMaker) ;
    tsBranch->SetAddress(&fTS) ;
    gAlice->TreeR()->GetEvent(0) ;
    
  }
  else{ 
    if(fClusterizer){//Clusterizer aready read, 
                     //we should read TrackSegments made from these RecPoints

      Int_t branchRead = 0 ; 
      TBranch * tsMakerBranch = 0;
      TBranch * tsBranch = 0;
    
      TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
      Int_t ibranch;
      Bool_t allNotFound = kTRUE ;
      while(allNotFound){
	Bool_t tsMakerNotFound = kTRUE ;
	Bool_t tsNotFound = kTRUE ;
	
	for(ibranch = branchRead;(ibranch <branches->GetEntries())&&(tsMakerNotFound);ibranch++){
	  tsMakerBranch=(TBranch *) branches->At(ibranch) ;
	  if( strcmp(tsMakerBranch->GetName(),"AliPHOSTrackSegmentMaker") == 0) 
	    tsMakerNotFound = kFALSE ;
	}
	branchRead = ibranch++ ;
	for(ibranch = 0 ;(ibranch <branches->GetEntries())&&(tsNotFound);ibranch++){
	  tsBranch=(TBranch *) branches->At(ibranch) ;
	  if( (strcmp(tsBranch->GetName(),"PHOSTS") == 0) && 
	      (strcmp(tsBranch->GetName(),tsMakerBranch->GetTitle())==0))
	    tsNotFound = kFALSE ;
	}
	
	branchRead = ibranch++ ;
	
	if(tsMakerNotFound ||tsNotFound ){
	  cout << "AliPHOSIndexToObject error" << endl ;
	  cout << "Can't find Branch with TrackSegmentMaker and TrackSegments " ;
	  cout << "Do nothing" <<endl  ;
	  return kFALSE ;
	}
	
	tsMakerBranch->SetAddress(&fTSMaker) ;
	tsBranch->SetAddress(&fTS) ;
	gAlice->TreeR()->GetEvent(0) ;
	
	if(strcmp(fTSMaker->GetRecPointsBranch(),fClusterizer->GetRecPointsBranch()) == 0)
	  allNotFound = kFALSE ;
      }
      
    }
    else{//Neither FileName,neither fPID, neither fClusterizer: we read any (first) occurence
      TBranch * tsMakerBranch = 0;
      TBranch * tsBranch = 0;    
      TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
      Bool_t tsMakerNotFound = kTRUE ;
      Bool_t tsNotFound = kTRUE ;
      Int_t ibranch ;
      for(ibranch =  0;(ibranch <branches->GetEntries())&& tsMakerNotFound;ibranch++){
	tsMakerBranch=(TBranch *) branches->At(ibranch) ;
	if( strcmp(tsMakerBranch->GetName(),"AliPHOSTrackSegmentMaker") == 0) 
	  tsMakerNotFound = kFALSE ;
      }
      for(ibranch = 0 ;(ibranch <branches->GetEntries())&&(tsNotFound);ibranch++){
	tsBranch=(TBranch *) branches->At(ibranch) ;
	if( (strcmp(tsBranch->GetName(),"PHOSTS") == 0) && 
	    (strcmp(tsBranch->GetName(),tsMakerBranch->GetTitle())==0))
	  tsNotFound = kFALSE ;
      }	
      if(tsMakerNotFound ||tsNotFound ){
	cout << "AliPHOSIndexToObject error" << endl ;
	cout << "Can't find Branch with TrackSegmentMaker and TrackSegments " ;
	cout << "Do nothing" <<endl  ;
	return kFALSE ;
      }
      
      tsMakerBranch->SetAddress(&fTSMaker) ;
      tsBranch->SetAddress(&fTS) ;
      gAlice->TreeR()->GetEvent(0) ;     
    }
  }

  return kTRUE ;  
}
//____________________________________________________________________________ 
 Bool_t AliPHOSIndexToObject::ReadRecPoints(char * branchFile){
  
  if(gAlice->TreeR() == 0)
    return kFALSE ;

  if(fTSMaker) //if TrackSegment maker already read, read corresponding branches
    branchFile = fTSMaker->GetRecPointsBranch() ;

  if(branchFile){ // we should read a specific branch
    TBranch * emcBranch = 0;
    TBranch * cpvBranch = 0;
    TBranch * clusterizerBranch = 0;
    
    TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
    Int_t ibranch;
    Bool_t emcNotFound = kTRUE ;
    Bool_t cpvNotFound = kTRUE ;  
    Bool_t clusterizerNotFound = kTRUE ;
    
    for(ibranch = 0;((ibranch < branches->GetEntries())&&(emcNotFound ||cpvNotFound || clusterizerNotFound)) ;ibranch++){
      if(emcNotFound){
	emcBranch=(TBranch *) branches->At(ibranch) ;
	if( (strcmp(emcBranch->GetTitle(),branchFile) == 0) && 
	    (strcmp(emcBranch->GetName(),"PHOSEmcRP") == 0) )
	  emcNotFound = kFALSE ;
      }
      if(cpvNotFound){
	cpvBranch=(TBranch *) branches->At(ibranch) ;
	if( (strcmp(cpvBranch->GetTitle(),branchFile) == 0) &&
	    (strcmp(cpvBranch->GetName(),"PHOSCpvRP") == 0) )
	  cpvNotFound = kFALSE ;
      }
      if(clusterizerNotFound){
	clusterizerBranch = (TBranch *) branches->At(ibranch) ;
	if( (strcmp(clusterizerBranch->GetTitle(),branchFile) == 0) &&
	    (strcmp(clusterizerBranch->GetName(),"AliPHOSClusterizer") == 0) )
	  clusterizerNotFound = kFALSE ;
      }
      
    }
    
    if(clusterizerNotFound || emcNotFound || cpvNotFound){
      cout << "AliPHOSIndexToObject error" << endl ;
      cout << "    Can't find Branch with RecPoints or Clusterizer " << endl ;
      return kFALSE ;
    }
    
    emcBranch->SetAddress(&fEmcRecPoints) ;
    cpvBranch->SetAddress(&fCpvRecPoints) ;
    clusterizerBranch->SetAddress(&fClusterizer) ;
    gAlice->TreeR()->GetEvent(0) ;
  }
  else{ //no specific branch
    if(fDigitizer){//Digitizer aready read, 
                   //we should read RecPoints made from these Digits
      TBranch * emcBranch = 0;
      TBranch * cpvBranch = 0;
      TBranch * clusterizerBranch = 0;
      
      TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
      Int_t branchRead = 0;
      Bool_t allNotFound = kTRUE ;
      while(allNotFound){
	Bool_t emcNotFound = kTRUE ;
	Bool_t cpvNotFound = kTRUE ;  
	Bool_t clusterizerNotFound = kTRUE ;
	Int_t ibranch ;
	for(ibranch = branchRead;ibranch < branches->GetEntries();ibranch++){
	  emcBranch=(TBranch *) branches->At(ibranch) ;
	  if( strcmp(emcBranch->GetName(),"PHOSEmcRP") == 0)
	    emcNotFound = kFALSE ;
	}
	branchRead = ibranch + 1 ;
	for(ibranch =  0 ;ibranch < branches->GetEntries();ibranch++){
	  cpvBranch=(TBranch *) branches->At(ibranch) ;
	  if( (strcmp(cpvBranch->GetTitle(),emcBranch->GetTitle()) == 0) &&
	      (strcmp(cpvBranch->GetName(),"PHOSCpvRP") == 0) )
	    cpvNotFound = kFALSE ;
	}
	for(ibranch = 0 ;ibranch < branches->GetEntries();ibranch++){
	  clusterizerBranch = (TBranch *) branches->At(ibranch) ;
	  if( (strcmp(clusterizerBranch->GetTitle(),emcBranch->GetTitle()) == 0) &&
	      (strcmp(clusterizerBranch->GetName(),"AliPHOSClusterizer") == 0) )
	    clusterizerNotFound = kFALSE ;
	}
	
	if(clusterizerNotFound || emcNotFound || cpvNotFound){
	  cout << "AliPHOSIndexToObject error" << endl ;
	  cout << "    Can't find Branch with RecPoints or Clusterizer " << endl ;
	  return kFALSE ;
	}
    
	emcBranch->SetAddress(&fEmcRecPoints) ;
	cpvBranch->SetAddress(&fCpvRecPoints) ;
	clusterizerBranch->SetAddress(&fClusterizer) ;
	gAlice->TreeR()->GetEvent(0) ;
	
	if(strcmp(fClusterizer->GetDigitsBranch(),fDigitizer->GetDigitsBranch())== 0)
	  allNotFound = kFALSE ;
      }
    }
    else{//Neither FileName, Neither TSMaker, Neither Digits: we read any (first) RecPoints
      TBranch * emcBranch = 0;
      TBranch * cpvBranch = 0;
      TBranch * clusterizerBranch = 0;
      TObjArray * branches = gAlice->TreeR()->GetListOfBranches() ;
      Bool_t emcNotFound = kTRUE ;
      Bool_t cpvNotFound = kTRUE ;  
      Bool_t clusterizerNotFound = kTRUE ;
      Int_t ibranch ;
      for(ibranch = 0 ;ibranch < branches->GetEntries();ibranch++){
	emcBranch=(TBranch *) branches->At(ibranch) ;
	if( strcmp(emcBranch->GetName(),"PHOSEmcRP") == 0)
	  emcNotFound = kFALSE ;
      }
      for(ibranch = 0 ;ibranch < branches->GetEntries();ibranch++){
	cpvBranch=(TBranch *) branches->At(ibranch) ;
	if( (strcmp(cpvBranch->GetTitle(),emcBranch->GetTitle()) == 0) &&
	    (strcmp(cpvBranch->GetName(),"PHOSCpvRP") == 0) )
	  cpvNotFound = kFALSE ;
      }
      for(ibranch = 0;ibranch < branches->GetEntries();ibranch++){
	clusterizerBranch = (TBranch *) branches->At(ibranch) ;
	if( (strcmp(clusterizerBranch->GetTitle(),emcBranch->GetTitle()) == 0) &&
	    (strcmp(clusterizerBranch->GetName(),"AliPHOSClusterizer") == 0) )
	  clusterizerNotFound = kFALSE ;
      }
      
      if(clusterizerNotFound || emcNotFound || cpvNotFound){
	cout << "AliPHOSIndexToObject error" << endl ;
	cout << "    Can't find Branch with RecPoints or Clusterizer " << endl ;
	return kFALSE ;
      }
      
      emcBranch->SetAddress(&fEmcRecPoints) ;
      cpvBranch->SetAddress(&fCpvRecPoints) ;
      clusterizerBranch->SetAddress(&fClusterizer) ;
      gAlice->TreeR()->GetEvent(0) ;
    }
  }

  return kTRUE ;
}
//____________________________________________________________________________ 
 Bool_t AliPHOSIndexToObject::ReadDigits(char * branchFile){

  if(gAlice->TreeD()== 0)
    return kFALSE ;
  
  //if RecPoints are already read, we should read Digits from which they are made
  if(fClusterizer)
    branchFile = fClusterizer->GetDigitsBranch() ;
  
  if(branchFile){ // we should read a specific branch
    TBranch * digitsBranch = 0;
    TBranch * digitizerBranch = 0;

    TObjArray * branches = gAlice->TreeD()->GetListOfBranches() ;
    Int_t ibranch;
    Bool_t phosNotFound = kTRUE ;
    Bool_t digitizerNotFound = kTRUE ;
    
    for(ibranch = 0;ibranch <branches->GetEntries();ibranch++){
      
      if(phosNotFound){
	digitsBranch=(TBranch *) branches->At(ibranch) ;
	if( (strcmp(digitsBranch->GetTitle(),branchFile)==0 ) &&
	    (strcmp(digitsBranch->GetName(),"PHOS") == 0) )
	  phosNotFound = kFALSE ;
      }
      if(digitizerNotFound){
	digitizerBranch = (TBranch *) branches->At(ibranch) ;
	if( (strcmp(digitizerBranch->GetTitle(),branchFile) == 0) && 
	    (strcmp(digitizerBranch->GetName(),"AliPHOSDigitizer") == 0) )
	  digitizerNotFound = kFALSE ;
      } 
    }
    
    if(digitizerNotFound || phosNotFound){
      cout << "ERROR in AliPHOSIndexToObject : " << endl ;
      cout << "      Can't find Branch with Digits or Digitizer "<< endl ; ;
      return kFALSE ;
    }
    
    digitsBranch->SetAddress(&fDigits) ;
    digitizerBranch->SetAddress(&fDigitizer) ;
  
    gAlice->TreeD()->GetEvent(0) ;
  }
  else{ //we should read any branch and print warning if there are other possibilities
    TBranch * digitsBranch = 0;
    TBranch * digitizerBranch = 0;
    
    TObjArray * branches = gAlice->TreeD()->GetListOfBranches() ;
    Int_t ibranch;
    Bool_t phosNotFound = kTRUE ;
    Bool_t digitizerNotFound = kTRUE ;
    
    for(ibranch = 0;(ibranch <branches->GetEntries())&& phosNotFound ;ibranch++){
      digitsBranch=(TBranch *) branches->At(ibranch) ;
      if(strcmp(digitsBranch->GetName(),"PHOS") == 0) 
	phosNotFound = kFALSE ;
    }
    for(ibranch = 0;(ibranch <branches->GetEntries())&& digitizerNotFound ;ibranch++){
      digitizerBranch = (TBranch *) branches->At(ibranch) ;
      if( (strcmp(digitizerBranch->GetTitle(),digitsBranch->GetTitle()) == 0) && 
	  (strcmp(digitizerBranch->GetName(),"AliPHOSDigitizer") == 0) )
	digitizerNotFound = kFALSE ;
    } 
    
    if(digitizerNotFound || phosNotFound){
      cout << "ERROR in AliPHOSIndexToObject : " << endl ;
      cout << "      Can't find Branch with Digits or Digitizer "<< endl ; ;
      return kFALSE ;
    }
    
    digitsBranch->SetAddress(&fDigits) ;
    digitizerBranch->SetAddress(&fDigitizer) ;
    
    gAlice->TreeD()->GetEvent(0) ;
    
  }

  return kTRUE ;
}
//____________________________________________________________________________ 
 Bool_t AliPHOSIndexToObject::ReadPrimaries(){
  //read specific branches of primaries

//   //Check, is it necessary to open new files
//   TArrayI* events = fDigitizer->GetCurrentEvents() ; 
//   TClonesArray * filenames = fDigitizer->GetHeadersFiles() ;
//   Int_t input ;
//   for(input = 0; input < filenames->GetEntriesFast(); input++){

//     TObjString * filename = (TObjString *) filenames->At(input) ;

//     //Test, if this file already open
//     TFile *file = (TFile*) gROOT->GetFile( filename->GetString() ) ;
//     if(file == 0)
//       file = new TFile( filename->GetString()) ;
//     file->cd() ;
    
//     // Get Kine Tree from file
// //     char treeName[20];
// //     sprintf(treeName,"TreeK%d",events->At(input));
// //     TTree * treeK = (TTree*)gDirectory->Get(treeName);
// //     if (treeK) 
// //       treeK->SetBranchAddress("Particles", &fParticleBuffer);
// //     else    
// //       cout << "AliPHOSIndexToObject: cannot find Kine Tree for event:" << events->At(input) << endl;

// //     // Create the particle stack
// //     if(!fParticles) fParticles = new TClonesArray("TParticle",1000);
// //     // Build the pointer list
// //     if(fParticleMap) {     <----
// //       fParticleMap->Clear();
// //       fParticleMap->Expand(treeK->GetEntries());
// //     } else
// //       fParticleMap = new TObjArray(treeK->GetEntries());
    
//     // From gAlice->Particle(i) 


// //   if(!(*fParticleMap)[i]) {
// //     Int_t nentries = fParticles->GetEntries();
    
// //     // algorithmic way of getting entry index
// //     // (primary particles are filled after secondaries)
// //     Int_t entry;
// //     if (i<fHeader.GetNprimary())
// //       entry = i+fHeader.GetNsecondary();
// //     else 
// //       entry = i-fHeader.GetNprimary();
      
// //     // only check the algorithmic way and give
// //     // the fatal error if it is wrong
// //     if (entry != fParticleFileMap[i]) {
// //       Fatal("Particle",
// //         "!!!! The algorithmic way is WRONG: !!!n entry: %d map: %d",
// // 	entry, fParticleFileMap[i]); 
// //     }  
      
// //     fTreeK->GetEntry(fParticleFileMap[i]);
// //     new ((*fParticles)[nentries]) TParticle(*fParticleBuffer);
// //     fParticleMap->AddAt((*fParticles)[nentries],i);
// //   }
// //   return (TParticle *) (*fParticleMap)[i];

   
    
//   }


//   //scan over opened files and read corresponding TreeK##

  return kTRUE ;
}
//____________________________________________________________________________ 
 void AliPHOSIndexToObject::GetEvent(Int_t event){
  if(event == fEvent) // do nothing
    return ;
    
  fEvent = event ;
  gAlice->GetEvent(fEvent) ;
  
  ReadRecParticles(fPID->GetRecParticlesBranch()) ;
  ReadTS(fTSMaker->GetTrackSegmentsBranch()) ;
  ReadRecPoints(fClusterizer->GetRecPointsBranch()) ;
  ReadDigits(fDigitizer->GetDigitsBranch()) ;
  ReadPrimaries() ;
}



ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.