ROOT logo
//
// This macro translate original Tracks Reference tree 
// into new tree sorted according to track label.
//
// TClonesArray connected to a branch, is filled
// with Track References from one track only.
//
// Algorithm:
// 
// 1) Open files and initialise trees
// 2) Create and initialise Look Up Table
// 3) Loop over entries in References tree
//    - store entry number in a LUT
//    - store first and last array index of references for one track 
// 4) Check LUT's consistancy.
// 5) Fill up new tree with references ordered acording to label.
//
//
// Sylwester Radomski (S.Radomski@gsi.de)
// GSI, Jan 20, 2003
//

void CopyReference () {

  // create output file
  const char *outFileName = "trackRef.root";
  TFile *outFile = new TFile(outFileName, "RECREATE");

  // connect to gAlice object in input file
  const char *inFileName = "galice.root";
  TFile *inFile = new TFile(inFileName, "READ");
  
  gAlice = (AliRun*)inFile->Get("gAlice");
  gAlice->GetEvent(0);

  // declare detectors to translate
  const Int_t nDet = 4;
  const char *detectors[nDet] = {"ITS","TPC", "TRD", "TOF"};

  // Create LUT's
  
  Int_t nPart = gAlice->GetNtrack();
  Int_t *lutTrack = new Int_t[nPart * nDet];
  Int_t *lutStart = new Int_t[nPart * nDet];
  Int_t *lutStop = new Int_t[nPart * nDet];

  // clean LUT
  
  for(Int_t i=0; i<nPart; i++)
	 for (Int_t j=0; j<nDet; j++)
		lutTrack[i*nDet+j] = lutStart[i*nDet+j] = lutStop[i*nDet+j] = -1;
  

  // Declare tree, branches and CloneArrays

  TTree *refTree = (TTree*)inFile->Get("TreeTR0");
  TBranch *refBranch[nDet];
  TClonesArray *refArray[nDet];

  // Connect branches with arrays

  for (Int_t j=0; j<nDet; j++) {
	 refBranch[j] = refTree->GetBranch(detectors[j]);
	 refArray[j] = new TClonesArray("AliTrackReference", 100);
	 refBranch[j]->SetAddress(&(refArray+j));
  }

  Int_t nTracks = refBranch[0]->GetEntries();

  cout << "N Particles\t" << nPart << endl
		 << "N Tracks\t" << nTracks << endl;

  cout << "Filling Look Up Tables ..." << endl;

  for (Int_t i=0; i<nTracks; i++) {

	 cout << i << "\r"; 

	 for (Int_t j=0; j<nDet; j++) {
		
		Int_t lab, start;
		AliTrackReference *ref = 0;
		refBranch[j]->GetEvent(i);
		Int_t nObj = refArray[j]->GetEntries();
		
		if (!nObj) continue;
		
		lab = ((AliTrackReference*)refArray[j]->At(0))->GetTrack();
		start = 0;
		
		for (Int_t e=0; e<nObj-1; e++) {
		  
		  ref = (AliTrackReference*)refArray[j]->At(e+1);
		  
		  if (ref->GetTrack() != lab) {
			 lutTrack[lab*nDet + j] = i;
			 lutStart[lab*nDet + j] = start;
			 lutStop[lab*nDet + j] = e+1;
			 
			 start = e+1;
			 lab = ref->GetTrack(); 		  
		  }
		}
		
		lutTrack[lab*nDet + j] = i;
		lutStart[lab*nDet + j] = start;
		lutStop[lab*nDet + j] = nObj;
	 }
  }
  
  cout << endl << "done" << endl;
  cout << "Checking consistancy of LUTs ..." << endl;

  // check consistancy
  
  for(Int_t i=0; i<nPart; i++) {
	 
	 cout << i << "\r";
	 Int_t ctrlTrack = -1;
	 
	 for(Int_t j=0; j<nDet; j++) { 

		if (ctrlTrack == -1 && lutTrack[i*nDet+j] != -1) 
		  ctrlTrack = lutTrack[i*nDet+j];

		if (lutTrack[i*nDet+j] != -1 && lutTrack[i*nDet+j] != ctrlTrack)
		  cout << "Error: " <<  i << " " << j << endl;
	 }
  }
  
  cout << endl <<  "done" << endl;
  cout << "Writing to a new Tree ..." << endl;

  // Create a Tree

  outFile->cd();
  TTree *outTree = new TTree("TreeTR0_Sorted", "Sorted Tracks References");
  TBranch *outBranch[nDet];
  TClonesArray *outArray[nDet];

  // Create Branches 

  for(Int_t j=0; j<nDet; j++) {
	 outArray[j] = new TClonesArray("AliTrackReference", 200);
	 outBranch[j] = outTree->Branch(detectors[j], &(outArray+j), 64000, 3);
  }

  // Loop over particles
  // Fill Tree if entries exists

  for(Int_t i=0; i<nPart; i++) {
	 
	 cout << i << "\r"; 

	 for(Int_t j=0; j<nDet; j++) {
		
		outArray[j]->Clear();

		if (lutTrack[i*nDet+j] != -1) {
		  
		  refBranch[j]->GetEvent(lutTrack[i*nDet+j]);

		  // rewrite objects in clonearrays
		  for(Int_t k = lutStart[i*nDet+j], en = 0; k<lutStop[i*nDet+j]; k++ ) {		  
			 AliTrackReference *ref = (AliTrackReference*)refArray[j]->At(k);
			 new( (*(outArray[j]))[en++] ) AliTrackReference(*ref);
		  }
		}
	 }

	 outTree->Fill();
  }

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