ROOT logo
/**************************************************************************
 * 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.                  *
 **************************************************************************/
//
// Container class for the reference distributions for TRD PID
// The class contains the reference distributions and the momentum steps
// the references are taken at. Mapping is done inside. To derive references,
// the functions GetUpperReference and GetLowerReference return the next
// reference distribution object and the momentum step above respectively below
// the tracklet momentum.
//
// Authors:
//    Markus Fasel <M.Fasel@gsi.de>
//
#include "TObjArray.h"

#include "AliLog.h"

#include "AliTRDPIDReference.h"

ClassImp(AliTRDPIDReference)

//____________________________________________________________
AliTRDPIDReference::AliTRDPIDReference():
TNamed(),
fRefContainer(NULL),
fMomentumBins()
{
	//
	// Dummy constructor
	//
	SetBit(kIsOwner, kTRUE);
}

//____________________________________________________________
AliTRDPIDReference::AliTRDPIDReference(const Char_t *name):
		  TNamed(name, "TRD PID References"),
		  fRefContainer(NULL),
		  fMomentumBins()
{
	//
	// Default constructor
	//
	SetBit(kIsOwner, kTRUE);
}

//____________________________________________________________
AliTRDPIDReference::AliTRDPIDReference(const AliTRDPIDReference &ref):
		  TNamed(ref),
		  fRefContainer(NULL),
		  fMomentumBins(ref.fMomentumBins)
{
    //
    // Copy constructor
    //
    fRefContainer = new TObjArray(fMomentumBins.GetSize() * AliPID::kSPECIES);
    fRefContainer->SetOwner();

    for(Int_t ip = 0; ip < GetNumberOfMomentumBins(); ip++){
	for(Int_t is = 0; is < 5; is++){
	    Int_t ent=is * fMomentumBins.GetSize() + ip;
	    TObject *obj=ref.fRefContainer->At(ent);
	    if(obj){
		fRefContainer->AddAt(obj->Clone(),ent);
	    }
	}
    }

    SetBit(kIsOwner, kTRUE);
}

//____________________________________________________________
AliTRDPIDReference &AliTRDPIDReference::operator=(const AliTRDPIDReference &ref){
	//
	// Assginment operator
	// Only copies poiters, object is not the owner of the references
	//
	if(this != &ref){
		TNamed::operator=(ref);
		if(TestBit(kIsOwner) && fRefContainer) delete fRefContainer;
		fRefContainer = ref.fRefContainer;
		fMomentumBins = ref.fMomentumBins;
		SetBit(kIsOwner, kFALSE);
	}
	return *this;
}

//____________________________________________________________
AliTRDPIDReference::~AliTRDPIDReference(){
	//
	// Destructor
	// references are deleted if the object is the owner
	//
	if(fRefContainer && TestBit(kIsOwner)) delete fRefContainer;
}

//____________________________________________________________
void AliTRDPIDReference::SetNumberOfMomentumBins(Int_t nBins, Float_t *momenta){
	//
	// Set the momentum binning
	//
	if(fRefContainer) fRefContainer->Clear();
	else{
		fRefContainer = new TObjArray;
		fRefContainer->SetOwner();
	}
	fRefContainer->Expand(nBins * AliPID::kSPECIES);
	fMomentumBins.Set(nBins,momenta);
}

//____________________________________________________________
void AliTRDPIDReference::AddReference(TObject *ref, AliPID::EParticleType spec, Int_t pbin){
	//
	// Add a new reference distribution for a given species and a givem
	// momentum value to the reference container
	// The reference distribution is associated with the momentum value defined for the
	// given momentum bin
	//
	if(!fRefContainer){
		AliError("Reference Container not initialized");
		return;
	}
	if(pbin > fMomentumBins.GetSize()){
		AliError("Pbin overflow");
		return;
	}
	AliDebug(1, Form("Adding object with address %p to position %d", ref, spec * fMomentumBins.GetSize() + pbin));
	fRefContainer->AddAt(ref->Clone(), spec * fMomentumBins.GetSize() + pbin);
}

//____________________________________________________________
TObject *AliTRDPIDReference::GetUpperReference(AliPID::EParticleType spec, Float_t p, Float_t &pUpper) const{
	//
	// Get the next reference associated with a momentum larger than the requested momentum
	// In case no next upper reference is found, NULL is returned
	// The momentum value the reference is associated to is stored in the reference pUpper
	//
	Int_t bin = -1;
	pUpper = 20;
	for(Int_t ip = 0; ip < fMomentumBins.GetSize(); ip++){
		AliDebug(10, Form("Bin %d, p = %.1f", ip, fMomentumBins[ip]));
		if(p < fMomentumBins[ip]){
			AliDebug(10, "Bin found");
			bin = ip;
			break;
		}
	}
	AliDebug(2, Form("p = %.1f, bin = %d\n", p, bin));
	if(bin >= 0) {
		pUpper = fMomentumBins[bin];
		return fRefContainer->At(spec * fMomentumBins.GetSize() + bin);
	}
	else return NULL;
}

//____________________________________________________________
TObject *AliTRDPIDReference::GetLowerReference(AliPID::EParticleType spec, Float_t p, Float_t &pLower) const{
	//
	// Get the next reference associated with a momentum smaller than the requested momentum
	// In case no next lower reference is found, NULL is returned
	// The momentum value the reference is associated to is stored in the reference pLower
	//
	Int_t bin = -1;
	pLower = 0;
	for(Int_t ip = fMomentumBins.GetSize() - 1; ip >= 0; ip--){
		AliDebug(10, Form("Bin %d, p = %.1f", ip, fMomentumBins[ip]));
		if(p > fMomentumBins[ip]){
			AliDebug(10, "Bin found");
			bin = ip;
			break;
		}
	}
	AliDebug(2, Form("p = %.1f, bin = %d\n", p, bin));
	if(bin >= 0){
		pLower = fMomentumBins[bin];
		return fRefContainer->At(spec * fMomentumBins.GetSize() + bin);
	}
	else return NULL;
}

//____________________________________________________________
void AliTRDPIDReference::Print(const Option_t*) const{
	//
	// Print content of the PID reference container
	//
	printf("Number of Momentum Bins: %d\n", GetNumberOfMomentumBins());
	printf("=====================================\n");
	for(Int_t ip = 0; ip < GetNumberOfMomentumBins(); ip++){
		printf("Bin %d: p = %.1f\n", ip, fMomentumBins[ip]);
	}
	printf("=====================================\n");
	if(fRefContainer){
		printf("Content of the reference container:\n");
		for(Int_t ip = 0; ip < GetNumberOfMomentumBins(); ip++){
			printf("[");
			for(Int_t is = 0; is < 5; is++) printf("%p|", fRefContainer->At(is * fMomentumBins.GetSize() + ip));
			printf("]\n");
		}
	}
}
 AliTRDPIDReference.cxx:1
 AliTRDPIDReference.cxx:2
 AliTRDPIDReference.cxx:3
 AliTRDPIDReference.cxx:4
 AliTRDPIDReference.cxx:5
 AliTRDPIDReference.cxx:6
 AliTRDPIDReference.cxx:7
 AliTRDPIDReference.cxx:8
 AliTRDPIDReference.cxx:9
 AliTRDPIDReference.cxx:10
 AliTRDPIDReference.cxx:11
 AliTRDPIDReference.cxx:12
 AliTRDPIDReference.cxx:13
 AliTRDPIDReference.cxx:14
 AliTRDPIDReference.cxx:15
 AliTRDPIDReference.cxx:16
 AliTRDPIDReference.cxx:17
 AliTRDPIDReference.cxx:18
 AliTRDPIDReference.cxx:19
 AliTRDPIDReference.cxx:20
 AliTRDPIDReference.cxx:21
 AliTRDPIDReference.cxx:22
 AliTRDPIDReference.cxx:23
 AliTRDPIDReference.cxx:24
 AliTRDPIDReference.cxx:25
 AliTRDPIDReference.cxx:26
 AliTRDPIDReference.cxx:27
 AliTRDPIDReference.cxx:28
 AliTRDPIDReference.cxx:29
 AliTRDPIDReference.cxx:30
 AliTRDPIDReference.cxx:31
 AliTRDPIDReference.cxx:32
 AliTRDPIDReference.cxx:33
 AliTRDPIDReference.cxx:34
 AliTRDPIDReference.cxx:35
 AliTRDPIDReference.cxx:36
 AliTRDPIDReference.cxx:37
 AliTRDPIDReference.cxx:38
 AliTRDPIDReference.cxx:39
 AliTRDPIDReference.cxx:40
 AliTRDPIDReference.cxx:41
 AliTRDPIDReference.cxx:42
 AliTRDPIDReference.cxx:43
 AliTRDPIDReference.cxx:44
 AliTRDPIDReference.cxx:45
 AliTRDPIDReference.cxx:46
 AliTRDPIDReference.cxx:47
 AliTRDPIDReference.cxx:48
 AliTRDPIDReference.cxx:49
 AliTRDPIDReference.cxx:50
 AliTRDPIDReference.cxx:51
 AliTRDPIDReference.cxx:52
 AliTRDPIDReference.cxx:53
 AliTRDPIDReference.cxx:54
 AliTRDPIDReference.cxx:55
 AliTRDPIDReference.cxx:56
 AliTRDPIDReference.cxx:57
 AliTRDPIDReference.cxx:58
 AliTRDPIDReference.cxx:59
 AliTRDPIDReference.cxx:60
 AliTRDPIDReference.cxx:61
 AliTRDPIDReference.cxx:62
 AliTRDPIDReference.cxx:63
 AliTRDPIDReference.cxx:64
 AliTRDPIDReference.cxx:65
 AliTRDPIDReference.cxx:66
 AliTRDPIDReference.cxx:67
 AliTRDPIDReference.cxx:68
 AliTRDPIDReference.cxx:69
 AliTRDPIDReference.cxx:70
 AliTRDPIDReference.cxx:71
 AliTRDPIDReference.cxx:72
 AliTRDPIDReference.cxx:73
 AliTRDPIDReference.cxx:74
 AliTRDPIDReference.cxx:75
 AliTRDPIDReference.cxx:76
 AliTRDPIDReference.cxx:77
 AliTRDPIDReference.cxx:78
 AliTRDPIDReference.cxx:79
 AliTRDPIDReference.cxx:80
 AliTRDPIDReference.cxx:81
 AliTRDPIDReference.cxx:82
 AliTRDPIDReference.cxx:83
 AliTRDPIDReference.cxx:84
 AliTRDPIDReference.cxx:85
 AliTRDPIDReference.cxx:86
 AliTRDPIDReference.cxx:87
 AliTRDPIDReference.cxx:88
 AliTRDPIDReference.cxx:89
 AliTRDPIDReference.cxx:90
 AliTRDPIDReference.cxx:91
 AliTRDPIDReference.cxx:92
 AliTRDPIDReference.cxx:93
 AliTRDPIDReference.cxx:94
 AliTRDPIDReference.cxx:95
 AliTRDPIDReference.cxx:96
 AliTRDPIDReference.cxx:97
 AliTRDPIDReference.cxx:98
 AliTRDPIDReference.cxx:99
 AliTRDPIDReference.cxx:100
 AliTRDPIDReference.cxx:101
 AliTRDPIDReference.cxx:102
 AliTRDPIDReference.cxx:103
 AliTRDPIDReference.cxx:104
 AliTRDPIDReference.cxx:105
 AliTRDPIDReference.cxx:106
 AliTRDPIDReference.cxx:107
 AliTRDPIDReference.cxx:108
 AliTRDPIDReference.cxx:109
 AliTRDPIDReference.cxx:110
 AliTRDPIDReference.cxx:111
 AliTRDPIDReference.cxx:112
 AliTRDPIDReference.cxx:113
 AliTRDPIDReference.cxx:114
 AliTRDPIDReference.cxx:115
 AliTRDPIDReference.cxx:116
 AliTRDPIDReference.cxx:117
 AliTRDPIDReference.cxx:118
 AliTRDPIDReference.cxx:119
 AliTRDPIDReference.cxx:120
 AliTRDPIDReference.cxx:121
 AliTRDPIDReference.cxx:122
 AliTRDPIDReference.cxx:123
 AliTRDPIDReference.cxx:124
 AliTRDPIDReference.cxx:125
 AliTRDPIDReference.cxx:126
 AliTRDPIDReference.cxx:127
 AliTRDPIDReference.cxx:128
 AliTRDPIDReference.cxx:129
 AliTRDPIDReference.cxx:130
 AliTRDPIDReference.cxx:131
 AliTRDPIDReference.cxx:132
 AliTRDPIDReference.cxx:133
 AliTRDPIDReference.cxx:134
 AliTRDPIDReference.cxx:135
 AliTRDPIDReference.cxx:136
 AliTRDPIDReference.cxx:137
 AliTRDPIDReference.cxx:138
 AliTRDPIDReference.cxx:139
 AliTRDPIDReference.cxx:140
 AliTRDPIDReference.cxx:141
 AliTRDPIDReference.cxx:142
 AliTRDPIDReference.cxx:143
 AliTRDPIDReference.cxx:144
 AliTRDPIDReference.cxx:145
 AliTRDPIDReference.cxx:146
 AliTRDPIDReference.cxx:147
 AliTRDPIDReference.cxx:148
 AliTRDPIDReference.cxx:149
 AliTRDPIDReference.cxx:150
 AliTRDPIDReference.cxx:151
 AliTRDPIDReference.cxx:152
 AliTRDPIDReference.cxx:153
 AliTRDPIDReference.cxx:154
 AliTRDPIDReference.cxx:155
 AliTRDPIDReference.cxx:156
 AliTRDPIDReference.cxx:157
 AliTRDPIDReference.cxx:158
 AliTRDPIDReference.cxx:159
 AliTRDPIDReference.cxx:160
 AliTRDPIDReference.cxx:161
 AliTRDPIDReference.cxx:162
 AliTRDPIDReference.cxx:163
 AliTRDPIDReference.cxx:164
 AliTRDPIDReference.cxx:165
 AliTRDPIDReference.cxx:166
 AliTRDPIDReference.cxx:167
 AliTRDPIDReference.cxx:168
 AliTRDPIDReference.cxx:169
 AliTRDPIDReference.cxx:170
 AliTRDPIDReference.cxx:171
 AliTRDPIDReference.cxx:172
 AliTRDPIDReference.cxx:173
 AliTRDPIDReference.cxx:174
 AliTRDPIDReference.cxx:175
 AliTRDPIDReference.cxx:176
 AliTRDPIDReference.cxx:177
 AliTRDPIDReference.cxx:178
 AliTRDPIDReference.cxx:179
 AliTRDPIDReference.cxx:180
 AliTRDPIDReference.cxx:181
 AliTRDPIDReference.cxx:182
 AliTRDPIDReference.cxx:183
 AliTRDPIDReference.cxx:184
 AliTRDPIDReference.cxx:185
 AliTRDPIDReference.cxx:186
 AliTRDPIDReference.cxx:187
 AliTRDPIDReference.cxx:188
 AliTRDPIDReference.cxx:189
 AliTRDPIDReference.cxx:190
 AliTRDPIDReference.cxx:191
 AliTRDPIDReference.cxx:192
 AliTRDPIDReference.cxx:193
 AliTRDPIDReference.cxx:194
 AliTRDPIDReference.cxx:195
 AliTRDPIDReference.cxx:196
 AliTRDPIDReference.cxx:197
 AliTRDPIDReference.cxx:198
 AliTRDPIDReference.cxx:199
 AliTRDPIDReference.cxx:200
 AliTRDPIDReference.cxx:201
 AliTRDPIDReference.cxx:202
 AliTRDPIDReference.cxx:203
 AliTRDPIDReference.cxx:204
 AliTRDPIDReference.cxx:205
 AliTRDPIDReference.cxx:206
 AliTRDPIDReference.cxx:207
 AliTRDPIDReference.cxx:208
 AliTRDPIDReference.cxx:209
 AliTRDPIDReference.cxx:210
 AliTRDPIDReference.cxx:211