ROOT logo
/**
 * >> Testing Macro to fill FlatESDEvent from ALiESDEvent <<
 **
 * Primary Authors : Sergey Gorbunov, Jochen Thaeder, Chiara Zampolli
 *
 * Usage:
 *  aliroot -b -l -q LoadLibs.C FlatESDConverter.C++
 *
 **************************************************************************/

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "AliESDEvent.h"
#include "AliESD.h"
#include "AliESDfriend.h"
#include "AliESDfriendTrack.h"
#include "../TPC/Rec/AliTPCseed.h"
#include <TFile.h>
#include <TTree.h>
#include <TSystem.h>
#include "./AliFlatESDEvent.h"
#include "./AliFlatESDTrack.h"
#include "./AliFlatESDTrigger.h"
#include "./AliFlatTPCCluster.h"
#include "./AliFlatExternalTrackParam.h"
#include "Riostream.h"
#include "AliSysInfo.h"
#endif   

void FlatESDConverter(const char* filename="AliESDs.root", const char* filenameFriends="AliESDfriends.root",const char* filenameOut="out.dat", Bool_t useESDFriends = kTRUE, Bool_t useHLTtree = kFALSE,Int_t verbose = 0) {

	if(useESDFriends) Printf("using friends");
	if(useHLTtree) Printf("using HLT tree");
	
	
  // -- Convert AliESDEvent to AliFlatESDEvent
/*
  if ( access( filename, F_OK ) == -1 ){
	Printf("input file not readable!");
	return;
  }
*/

  TFile *file    = new TFile(Form("%s", filename));
	
	
  ofstream outFile(Form("%s",filenameOut), std::ifstream::binary | std::ifstream::out);
  //ofstream outFile("outFlatESD.dat");

  
  TTree *esdTree = useHLTtree? dynamic_cast<TTree*>(file->Get("HLTesdTree")) : dynamic_cast<TTree*>(file->Get("esdTree"));
  
  // -- Connect ESD
  AliESDEvent *esd = new AliESDEvent;
  esd->ReadFromTree(esdTree);
  
  // -- Connect ESD friend
  AliESDfriend *esdFriend = NULL; 
  if (useESDFriends && !esdTree->FindBranch("ESDfriend.")) {
    esdTree->AddFriend("esdFriendTree", Form("%s", filenameFriends));
    esdTree->SetBranchStatus("ESDfriend.", 1);
    esdFriend = (AliESDfriend*)esd->FindListObject("AliESDfriend");
    if (esdFriend)
      esdTree->SetBranchAddress("ESDfriend.", &esdFriend);
  } // if (!esdTree->FindBranch("ESDfriend.")) {
  ;
  AliFlatESDEvent *flatEsd = NULL;

  // -- Event Loop
  for (Int_t idxEvent = 0; idxEvent < esdTree->GetEntries(); idxEvent++) {
    Printf("Processing event nr %d", idxEvent);
  //  esd->SaveAs("esdTemp.root");
   // TFile  fTmp = TFile("esdTemp.root");
    Int_t sizeIn = 1;//fTmp.GetSize();

    AliSysInfo::AddStamp("getEntry",0,0,idxEvent);

    esdTree->GetEntry(idxEvent);
    // -- Book memory for AliFlatESDEvent
    // -- TEST >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

	Int_t size = AliFlatESDEvent::EstimateSize(esd, kTRUE);
    Byte_t *mem = new Byte_t[size];

    flatEsd = reinterpret_cast<AliFlatESDEvent*>(mem);
    new (flatEsd) AliFlatESDEvent;
	
	
	
    AliSysInfo::AddStamp("DoEvent.Start",0,0,idxEvent);
    // -- Fill AliFlatESDEvent

  Int_t err=  flatEsd->SetFromESD( size,  esd, kTRUE ); 
  
  if(err) Printf("!!! Error while filling flatESD event  %d!!!", err);
  Printf("trigger classes: %d size: %d , = %d",flatEsd->GetNumberOfTriggerClasses(), sizeof(AliFlatESDTrigger) , flatEsd->GetNumberOfTriggerClasses() *sizeof(AliFlatESDTrigger) );      
    AliSysInfo::AddStamp("DoEvent.Stop",sizeIn,flatEsd->GetSize(),idxEvent);

		if(useESDFriends){
      Printf("ESD : Event %d || V0s %d || Tracks %d | FRIEND Tracks %d || estimated size %llu", 
	     idxEvent, esd->GetNumberOfV0s(),esd->GetNumberOfTracks(), esdFriend->GetNumberOfTracks(), 
	     AliFlatESDEvent::EstimateSize(esd, useESDFriends));
      Printf("FLAT: Event %d || V0s %d || Tracks %d | FRIEND Tracks %d || estimated size %llu", 
	     idxEvent, flatEsd->GetNumberOfV0s(),flatEsd->GetNumberOfTracks(), esdFriend->GetNumberOfTracks(), flatEsd->GetSize());
		}
		else{
      Printf("ESD : Event %d || V0s %d || Tracks %d || estimated size %llu ", 
	     idxEvent,esd->GetNumberOfV0s(), esd->GetNumberOfTracks(), 
	     AliFlatESDEvent::EstimateSize(esd, useESDFriends) );
      Printf("FLAT: Event %d || V0s %d || Tracks %d || estimated size %llu ", 
	     idxEvent, flatEsd->GetNumberOfV0s(),flatEsd->GetNumberOfTracks(),  flatEsd->GetSize());
		}
      AliFlatESDTrack *track = const_cast<AliFlatESDTrack*> (flatEsd->GetTracks());
      for (Int_t idxTrack = 0; idxTrack < flatEsd->GetNumberOfTracks(); ++idxTrack) {      
	AliESDtrack *esdTrack = esd->GetTrack(idxTrack);      
	AliESDfriendTrack *friendTrack = useESDFriends ?  esdFriend->GetTrack(idxTrack) :NULL;
       	if (track && !esdTrack) {
	  Printf("ERROR THIS SHOULD NOT HAPPEN AT ALL !!! TRACK %d HAS NO ESD TRACK!!!", idxTrack);
	  return;
	}
    if (verbose) {
	if (track) {
	  const AliFlatExternalTrackParam* exp1 = track->GetFlatTrackParamCp();
	   const AliFlatExternalTrackParam* exp2 = track->GetFlatTrackParamIp();
	   const AliFlatExternalTrackParam* exp3 = track->GetFlatTrackParamTPCInner();
	   const AliFlatExternalTrackParam* exp4 = track->GetFlatTrackParamOp();

	  Float_t alphaFLAT[4] = {0., 0., 0., 0.};
	  if (exp1) alphaFLAT[0] = exp1->GetAlpha();
	  if (exp2) alphaFLAT[1] = exp2->GetAlpha();
	  if (exp3) alphaFLAT[2] = exp3->GetAlpha();
	  if (exp4) alphaFLAT[3] = exp4->GetAlpha();

	  Float_t alphaOLD[4]  = {0., 0., 0., 0.};
	  if (esdTrack->GetConstrainedParam())  alphaOLD[0] = esdTrack->GetConstrainedParam()->GetAlpha();
	  if (esdTrack->GetInnerParam())        alphaOLD[1] = esdTrack->GetInnerParam()->GetAlpha();
	  if (esdTrack->GetTPCInnerParam())     alphaOLD[2] = esdTrack->GetTPCInnerParam()->GetAlpha();
	  if (esdTrack->GetOuterParam())        alphaOLD[3] = esdTrack->GetOuterParam()->GetAlpha();

	  Printf("TEST: FlatTrack %d > FlatExternalTrackParam > %p %p %p %p", idxTrack, exp1, exp2, exp3, exp4);
	  Printf("TEST: FlatTrack %d > Alpha %f %f %f %f", idxTrack, alphaFLAT[0], alphaFLAT[1], alphaFLAT[2], alphaFLAT[3]);
	  Printf("TEST: Old Track %d > Alpha %f %f %f %f", idxTrack, alphaOLD[0], alphaOLD[1], alphaOLD[2], alphaOLD[3]);
	  Printf("TEST: Diff      %d > Alpha %f %f %f %f", idxTrack, 
		 alphaFLAT[0]-alphaOLD[0], alphaFLAT[1]-alphaOLD[1], alphaFLAT[2]-alphaOLD[2], alphaFLAT[3]-alphaOLD[3]);

	  Int_t nCl = track->GetNumberOfTPCClusters();
	  Printf("TEST: FlatTrack %d has %d FlatClusters", idxTrack, nCl);
	  
#if 0
	  if(nCl && useESDFriends && verbose > 1){
	    TObject* calibObject = NULL;
	    AliTPCseed* seed = NULL;
	    for (Int_t idx = 0; (calibObject = friendTrack->GetCalibObject(idx)); ++idx) {
	      if ((seed = dynamic_cast<AliTPCseed*>(calibObject))) break;
	    }
	    // -- Fill cluster
	    if (seed) {
    	      Int_t idxRow2=0;
	      for (Int_t idxRow = 0; idxRow <  nCl; idxRow++){
		AliFlatTPCCluster * cl = track->GetTPCCluster(idxRow);
		cout << " idx fX fY fZ  fSigmaY2 fSigmaZ2 fCharge fQMax fPadRow" << endl;
		if(cl){
		  cout << idxRow << " " << cl->GetX() << " " << cl->GetY() << " " << cl->GetZ() << " " << cl->GetSigmaY2() << " " << cl->GetSigmaZ2() << " " << cl->GetCharge() << " " << cl->GetQMax() << " " << cl->GetPadRow() << endl;
		}
		else{
		  cout << idxRow << "---------------------------------" << endl << endl;		
		}
		AliTPCclusterMI* cl2 = NULL; 
		while(!cl2 && idxRow2<160){
		  cl2 = seed->GetClusterPointer(idxRow2++);
		}
		if (cl2) {
		  //cout<<" normalCl fX fY fZ fPadRow fSigmaY2 fSigmaZ2 fCharge fQMax" <<endl;
		  cout << idxRow << " " << cl2->GetX() << " " << cl2->GetY() << " " << cl2->GetZ() << " " << cl2->GetSigmaY2() << " " << cl2->GetSigmaZ2() << " " << cl2->GetQ() << " " << cl2->GetMax() << " " << cl2->GetRow() << endl << endl;
		}
		else
		  cout << idxRow << "---------------------------------" << endl << endl;	
	      }
	    }
	  }
#endif

	}
	track = const_cast<AliFlatESDTrack*> (track->GetNextTrack() );
      }
    }

    outFile.write(reinterpret_cast<char*>(mem), flatEsd->GetSize());
    delete[] mem; 

  } // for (Int_t idxEvent = 1; idxEvent < 2; idxEvent++) {

  outFile.close();

  return;
}    
 FlatESDConverter.C:1
 FlatESDConverter.C:2
 FlatESDConverter.C:3
 FlatESDConverter.C:4
 FlatESDConverter.C:5
 FlatESDConverter.C:6
 FlatESDConverter.C:7
 FlatESDConverter.C:8
 FlatESDConverter.C:9
 FlatESDConverter.C:10
 FlatESDConverter.C:11
 FlatESDConverter.C:12
 FlatESDConverter.C:13
 FlatESDConverter.C:14
 FlatESDConverter.C:15
 FlatESDConverter.C:16
 FlatESDConverter.C:17
 FlatESDConverter.C:18
 FlatESDConverter.C:19
 FlatESDConverter.C:20
 FlatESDConverter.C:21
 FlatESDConverter.C:22
 FlatESDConverter.C:23
 FlatESDConverter.C:24
 FlatESDConverter.C:25
 FlatESDConverter.C:26
 FlatESDConverter.C:27
 FlatESDConverter.C:28
 FlatESDConverter.C:29
 FlatESDConverter.C:30
 FlatESDConverter.C:31
 FlatESDConverter.C:32
 FlatESDConverter.C:33
 FlatESDConverter.C:34
 FlatESDConverter.C:35
 FlatESDConverter.C:36
 FlatESDConverter.C:37
 FlatESDConverter.C:38
 FlatESDConverter.C:39
 FlatESDConverter.C:40
 FlatESDConverter.C:41
 FlatESDConverter.C:42
 FlatESDConverter.C:43
 FlatESDConverter.C:44
 FlatESDConverter.C:45
 FlatESDConverter.C:46
 FlatESDConverter.C:47
 FlatESDConverter.C:48
 FlatESDConverter.C:49
 FlatESDConverter.C:50
 FlatESDConverter.C:51
 FlatESDConverter.C:52
 FlatESDConverter.C:53
 FlatESDConverter.C:54
 FlatESDConverter.C:55
 FlatESDConverter.C:56
 FlatESDConverter.C:57
 FlatESDConverter.C:58
 FlatESDConverter.C:59
 FlatESDConverter.C:60
 FlatESDConverter.C:61
 FlatESDConverter.C:62
 FlatESDConverter.C:63
 FlatESDConverter.C:64
 FlatESDConverter.C:65
 FlatESDConverter.C:66
 FlatESDConverter.C:67
 FlatESDConverter.C:68
 FlatESDConverter.C:69
 FlatESDConverter.C:70
 FlatESDConverter.C:71
 FlatESDConverter.C:72
 FlatESDConverter.C:73
 FlatESDConverter.C:74
 FlatESDConverter.C:75
 FlatESDConverter.C:76
 FlatESDConverter.C:77
 FlatESDConverter.C:78
 FlatESDConverter.C:79
 FlatESDConverter.C:80
 FlatESDConverter.C:81
 FlatESDConverter.C:82
 FlatESDConverter.C:83
 FlatESDConverter.C:84
 FlatESDConverter.C:85
 FlatESDConverter.C:86
 FlatESDConverter.C:87
 FlatESDConverter.C:88
 FlatESDConverter.C:89
 FlatESDConverter.C:90
 FlatESDConverter.C:91
 FlatESDConverter.C:92
 FlatESDConverter.C:93
 FlatESDConverter.C:94
 FlatESDConverter.C:95
 FlatESDConverter.C:96
 FlatESDConverter.C:97
 FlatESDConverter.C:98
 FlatESDConverter.C:99
 FlatESDConverter.C:100
 FlatESDConverter.C:101
 FlatESDConverter.C:102
 FlatESDConverter.C:103
 FlatESDConverter.C:104
 FlatESDConverter.C:105
 FlatESDConverter.C:106
 FlatESDConverter.C:107
 FlatESDConverter.C:108
 FlatESDConverter.C:109
 FlatESDConverter.C:110
 FlatESDConverter.C:111
 FlatESDConverter.C:112
 FlatESDConverter.C:113
 FlatESDConverter.C:114
 FlatESDConverter.C:115
 FlatESDConverter.C:116
 FlatESDConverter.C:117
 FlatESDConverter.C:118
 FlatESDConverter.C:119
 FlatESDConverter.C:120
 FlatESDConverter.C:121
 FlatESDConverter.C:122
 FlatESDConverter.C:123
 FlatESDConverter.C:124
 FlatESDConverter.C:125
 FlatESDConverter.C:126
 FlatESDConverter.C:127
 FlatESDConverter.C:128
 FlatESDConverter.C:129
 FlatESDConverter.C:130
 FlatESDConverter.C:131
 FlatESDConverter.C:132
 FlatESDConverter.C:133
 FlatESDConverter.C:134
 FlatESDConverter.C:135
 FlatESDConverter.C:136
 FlatESDConverter.C:137
 FlatESDConverter.C:138
 FlatESDConverter.C:139
 FlatESDConverter.C:140
 FlatESDConverter.C:141
 FlatESDConverter.C:142
 FlatESDConverter.C:143
 FlatESDConverter.C:144
 FlatESDConverter.C:145
 FlatESDConverter.C:146
 FlatESDConverter.C:147
 FlatESDConverter.C:148
 FlatESDConverter.C:149
 FlatESDConverter.C:150
 FlatESDConverter.C:151
 FlatESDConverter.C:152
 FlatESDConverter.C:153
 FlatESDConverter.C:154
 FlatESDConverter.C:155
 FlatESDConverter.C:156
 FlatESDConverter.C:157
 FlatESDConverter.C:158
 FlatESDConverter.C:159
 FlatESDConverter.C:160
 FlatESDConverter.C:161
 FlatESDConverter.C:162
 FlatESDConverter.C:163
 FlatESDConverter.C:164
 FlatESDConverter.C:165
 FlatESDConverter.C:166
 FlatESDConverter.C:167
 FlatESDConverter.C:168
 FlatESDConverter.C:169
 FlatESDConverter.C:170
 FlatESDConverter.C:171
 FlatESDConverter.C:172
 FlatESDConverter.C:173
 FlatESDConverter.C:174
 FlatESDConverter.C:175
 FlatESDConverter.C:176
 FlatESDConverter.C:177
 FlatESDConverter.C:178
 FlatESDConverter.C:179
 FlatESDConverter.C:180
 FlatESDConverter.C:181
 FlatESDConverter.C:182
 FlatESDConverter.C:183
 FlatESDConverter.C:184
 FlatESDConverter.C:185
 FlatESDConverter.C:186
 FlatESDConverter.C:187
 FlatESDConverter.C:188
 FlatESDConverter.C:189
 FlatESDConverter.C:190
 FlatESDConverter.C:191
 FlatESDConverter.C:192
 FlatESDConverter.C:193
 FlatESDConverter.C:194
 FlatESDConverter.C:195
 FlatESDConverter.C:196