ROOT logo
//
// This macro generates a simple TTree containing
// all true matches collected from one event.
//
// For each match it is stored:
//  - label ID of the track
//  - label ID of the EMCAL cluster
//  - momentum (3D) of the track
//  - vertex (3D) of the track
//
// All tracks which come from kinks are excluded 
// from this computation, and fake tracks are collected.
// If desired, it is possible to change these settings 
// operating on the Bool_t variables listed below.
//  

Bool_t rejectKinks = kTRUE;     // switch to TRUE to include kinks in computation
Bool_t rejectFakes = kFALSE;    // switch to TRUE to include fake tracks in computation

class match_t
{
	public:
	
	Int_t    label;       // GEANT label of particle
	Int_t    indexT;      // index of track in ESD collection
	Int_t    indexC;      // index of cluster in ESD collection
	Double_t p[3];        // track momentum
	Double_t v[3];        // track vertex
};

//
// Read AliESDs.root file and saves all true pairs of trak-cluster.
//
void SaveTrueMatchesSimple(const char *outFileName="true-matches.root")
{
	//
	// open ESD file, retrieve tree and link to branch cursor
	//
	TFile *srcFile = TFile::Open("AliESDs.root");
	if (!srcFile) return;
	TTree *srcTree = (TTree*)srcFile->Get("esdTree");
	if (!srcTree) return;
	
	AliESDEvent* esd = new AliESDEvent();
	esd->ReadFromTree(srcTree);	
	Long64_t nEvents = srcTree->GetEntries();
	
	//
	// Open output file and create output tree
	//
	TFile *outFile = new TFile(outFileName, "RECREATE");
	match_t match;

	//
	// Loop on events and store true matches
	//
	Bool_t isKink;
	Int_t label, count, nTracks, firstCluster, lastCluster;
	for (Long64_t iev = 0; iev < nEvents; iev++) {

		srcTree->GetEntry(iev);
		cout << "Event " << iev + 1 << " of " << nEvents << ": " << endl;
		
		nTracks = esd->GetNumberOfTracks();
		firstCluster = 0;
		lastCluster  = esd->GetNumberOfCaloClusters();
		cout << "Tracks found      : " << nTracks << endl;
		cout << "EMC clusters found: " << lastCluster - firstCluster << endl;
		
		// create new matches tree
		TTree *outTree = new TTree(Form("tm_%d", iev), Form("True matches from event %d", iev));
		outTree->Branch("matches", &match, "label/I:indexT/I:indexC/I:p[3]/D:v[3]/D");
		
		// external loop on tracks
		for (Int_t it = 0; it < nTracks; it++) {
			AliESDtrack *esdTrack = esd->GetTrack(it);
			// start check to reject kinks
			if (rejectKinks) {
				isKink = kFALSE;
				for (Int_t i = 0; i < 3; i++) {
					if (esdTrack->GetKinkIndex(i) > 0) isKink = kTRUE;
				}
				if (isKink) continue;
			}
			// get track GEANT label (to be checked for match)
			label = esdTrack->GetLabel();
			if (rejectFakes) {
				if (label < 0) continue;
			}
			else {
				label = TMath::Abs(label);
			}
			// store track data into candidate match variable
			// anyway, it will be stored in the tree only
			// if it matches a cluster
			match.indexT = it;
			esdTrack->GetPxPyPz(match.p);
			esdTrack->GetXYZ(match.v);
			// internal loop on clusters
			// a counter counts how many true matches are
			// generated for the same track
			count = 0;
			for (Int_t ic = firstCluster; ic < lastCluster; ic++) {
				AliESDCaloCluster *cl = esd->GetCaloCluster(ic);
				if (!cl->IsEMCAL()) continue;
				if (cl->GetLabel() != label) continue;
				// if the method reaches this point, we
				// have found a match to be stored
				match.label = label;
				match.indexC = ic;
				outTree->Fill();
				count++;
			}
			// alert for multiple matches
			if (count > 0) {
				cout << "Found " << count << " clusters which match track " << it << " in ESD";
				if (count > 1) cout << " --> MULTIPLE MATCH";
				cout << endl;
			}
		} // end loop on tracks
		
		outFile->cd();
		outTree->Write();
		delete outTree;
	}
	
	outFile->Close();
}
 SaveTrueMatchesSimple.C:1
 SaveTrueMatchesSimple.C:2
 SaveTrueMatchesSimple.C:3
 SaveTrueMatchesSimple.C:4
 SaveTrueMatchesSimple.C:5
 SaveTrueMatchesSimple.C:6
 SaveTrueMatchesSimple.C:7
 SaveTrueMatchesSimple.C:8
 SaveTrueMatchesSimple.C:9
 SaveTrueMatchesSimple.C:10
 SaveTrueMatchesSimple.C:11
 SaveTrueMatchesSimple.C:12
 SaveTrueMatchesSimple.C:13
 SaveTrueMatchesSimple.C:14
 SaveTrueMatchesSimple.C:15
 SaveTrueMatchesSimple.C:16
 SaveTrueMatchesSimple.C:17
 SaveTrueMatchesSimple.C:18
 SaveTrueMatchesSimple.C:19
 SaveTrueMatchesSimple.C:20
 SaveTrueMatchesSimple.C:21
 SaveTrueMatchesSimple.C:22
 SaveTrueMatchesSimple.C:23
 SaveTrueMatchesSimple.C:24
 SaveTrueMatchesSimple.C:25
 SaveTrueMatchesSimple.C:26
 SaveTrueMatchesSimple.C:27
 SaveTrueMatchesSimple.C:28
 SaveTrueMatchesSimple.C:29
 SaveTrueMatchesSimple.C:30
 SaveTrueMatchesSimple.C:31
 SaveTrueMatchesSimple.C:32
 SaveTrueMatchesSimple.C:33
 SaveTrueMatchesSimple.C:34
 SaveTrueMatchesSimple.C:35
 SaveTrueMatchesSimple.C:36
 SaveTrueMatchesSimple.C:37
 SaveTrueMatchesSimple.C:38
 SaveTrueMatchesSimple.C:39
 SaveTrueMatchesSimple.C:40
 SaveTrueMatchesSimple.C:41
 SaveTrueMatchesSimple.C:42
 SaveTrueMatchesSimple.C:43
 SaveTrueMatchesSimple.C:44
 SaveTrueMatchesSimple.C:45
 SaveTrueMatchesSimple.C:46
 SaveTrueMatchesSimple.C:47
 SaveTrueMatchesSimple.C:48
 SaveTrueMatchesSimple.C:49
 SaveTrueMatchesSimple.C:50
 SaveTrueMatchesSimple.C:51
 SaveTrueMatchesSimple.C:52
 SaveTrueMatchesSimple.C:53
 SaveTrueMatchesSimple.C:54
 SaveTrueMatchesSimple.C:55
 SaveTrueMatchesSimple.C:56
 SaveTrueMatchesSimple.C:57
 SaveTrueMatchesSimple.C:58
 SaveTrueMatchesSimple.C:59
 SaveTrueMatchesSimple.C:60
 SaveTrueMatchesSimple.C:61
 SaveTrueMatchesSimple.C:62
 SaveTrueMatchesSimple.C:63
 SaveTrueMatchesSimple.C:64
 SaveTrueMatchesSimple.C:65
 SaveTrueMatchesSimple.C:66
 SaveTrueMatchesSimple.C:67
 SaveTrueMatchesSimple.C:68
 SaveTrueMatchesSimple.C:69
 SaveTrueMatchesSimple.C:70
 SaveTrueMatchesSimple.C:71
 SaveTrueMatchesSimple.C:72
 SaveTrueMatchesSimple.C:73
 SaveTrueMatchesSimple.C:74
 SaveTrueMatchesSimple.C:75
 SaveTrueMatchesSimple.C:76
 SaveTrueMatchesSimple.C:77
 SaveTrueMatchesSimple.C:78
 SaveTrueMatchesSimple.C:79
 SaveTrueMatchesSimple.C:80
 SaveTrueMatchesSimple.C:81
 SaveTrueMatchesSimple.C:82
 SaveTrueMatchesSimple.C:83
 SaveTrueMatchesSimple.C:84
 SaveTrueMatchesSimple.C:85
 SaveTrueMatchesSimple.C:86
 SaveTrueMatchesSimple.C:87
 SaveTrueMatchesSimple.C:88
 SaveTrueMatchesSimple.C:89
 SaveTrueMatchesSimple.C:90
 SaveTrueMatchesSimple.C:91
 SaveTrueMatchesSimple.C:92
 SaveTrueMatchesSimple.C:93
 SaveTrueMatchesSimple.C:94
 SaveTrueMatchesSimple.C:95
 SaveTrueMatchesSimple.C:96
 SaveTrueMatchesSimple.C:97
 SaveTrueMatchesSimple.C:98
 SaveTrueMatchesSimple.C:99
 SaveTrueMatchesSimple.C:100
 SaveTrueMatchesSimple.C:101
 SaveTrueMatchesSimple.C:102
 SaveTrueMatchesSimple.C:103
 SaveTrueMatchesSimple.C:104
 SaveTrueMatchesSimple.C:105
 SaveTrueMatchesSimple.C:106
 SaveTrueMatchesSimple.C:107
 SaveTrueMatchesSimple.C:108
 SaveTrueMatchesSimple.C:109
 SaveTrueMatchesSimple.C:110
 SaveTrueMatchesSimple.C:111
 SaveTrueMatchesSimple.C:112
 SaveTrueMatchesSimple.C:113
 SaveTrueMatchesSimple.C:114
 SaveTrueMatchesSimple.C:115
 SaveTrueMatchesSimple.C:116
 SaveTrueMatchesSimple.C:117
 SaveTrueMatchesSimple.C:118
 SaveTrueMatchesSimple.C:119
 SaveTrueMatchesSimple.C:120
 SaveTrueMatchesSimple.C:121
 SaveTrueMatchesSimple.C:122
 SaveTrueMatchesSimple.C:123
 SaveTrueMatchesSimple.C:124
 SaveTrueMatchesSimple.C:125
 SaveTrueMatchesSimple.C:126
 SaveTrueMatchesSimple.C:127
 SaveTrueMatchesSimple.C:128
 SaveTrueMatchesSimple.C:129