]>
Commit | Line | Data |
---|---|---|
51a0ce25 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | // | |
16 | // Container class for the reference distributions for TRD PID | |
17 | // The class contains the reference distributions and the momentum steps | |
18 | // the references are taken at. Mapping is done inside. To derive references, | |
19 | // the functions GetUpperReference and GetLowerReference return the next | |
20 | // reference distribution object and the momentum step above respectively below | |
21 | // the tracklet momentum. | |
22 | // | |
23 | // Authors: | |
24 | // Markus Fasel <M.Fasel@gsi.de> | |
25 | // | |
26 | #include "TObjArray.h" | |
27 | ||
28 | #include "AliLog.h" | |
29 | ||
30 | #include "AliTRDPIDReference.h" | |
31 | ||
32 | ClassImp(AliTRDPIDReference) | |
33 | ||
34 | //____________________________________________________________ | |
35 | AliTRDPIDReference::AliTRDPIDReference(): | |
36 | TNamed(), | |
37 | fRefContainer(NULL), | |
38 | fMomentumBins() | |
39 | { | |
40 | // | |
41 | // Dummy constructor | |
42 | // | |
43 | SetBit(kIsOwner, kTRUE); | |
44 | } | |
45 | ||
46 | //____________________________________________________________ | |
47 | AliTRDPIDReference::AliTRDPIDReference(const Char_t *name): | |
48 | TNamed(name, "TRD PID References"), | |
49 | fRefContainer(NULL), | |
50 | fMomentumBins() | |
51 | { | |
52 | // | |
53 | // Default constructor | |
54 | // | |
55 | SetBit(kIsOwner, kTRUE); | |
56 | } | |
57 | ||
58 | //____________________________________________________________ | |
59 | AliTRDPIDReference::AliTRDPIDReference(const AliTRDPIDReference &ref): | |
60 | TNamed(ref), | |
db0e2c5f | 61 | fRefContainer(NULL), |
51a0ce25 | 62 | fMomentumBins(ref.fMomentumBins) |
63 | { | |
db0e2c5f | 64 | // |
65 | // Copy constructor | |
66 | // | |
67 | fRefContainer = new TObjArray(fMomentumBins.GetSize() * AliPID::kSPECIES); | |
68 | fRefContainer->SetOwner(); | |
69 | ||
70 | for(Int_t ip = 0; ip < GetNumberOfMomentumBins(); ip++){ | |
71 | for(Int_t is = 0; is < 5; is++){ | |
72 | Int_t ent=is * fMomentumBins.GetSize() + ip; | |
73 | TObject *obj=ref.fRefContainer->At(ent); | |
74 | if(obj){ | |
75 | fRefContainer->AddAt(obj->Clone(),ent); | |
76 | } | |
77 | } | |
78 | } | |
79 | ||
80 | SetBit(kIsOwner, kTRUE); | |
51a0ce25 | 81 | } |
82 | ||
83 | //____________________________________________________________ | |
84 | AliTRDPIDReference &AliTRDPIDReference::operator=(const AliTRDPIDReference &ref){ | |
85 | // | |
86 | // Assginment operator | |
87 | // Only copies poiters, object is not the owner of the references | |
88 | // | |
89 | if(this != &ref){ | |
90 | TNamed::operator=(ref); | |
91 | if(TestBit(kIsOwner) && fRefContainer) delete fRefContainer; | |
92 | fRefContainer = ref.fRefContainer; | |
93 | fMomentumBins = ref.fMomentumBins; | |
94 | SetBit(kIsOwner, kFALSE); | |
95 | } | |
96 | return *this; | |
97 | } | |
98 | ||
99 | //____________________________________________________________ | |
100 | AliTRDPIDReference::~AliTRDPIDReference(){ | |
101 | // | |
102 | // Destructor | |
103 | // references are deleted if the object is the owner | |
104 | // | |
105 | if(fRefContainer && TestBit(kIsOwner)) delete fRefContainer; | |
106 | } | |
107 | ||
108 | //____________________________________________________________ | |
109 | void AliTRDPIDReference::SetNumberOfMomentumBins(Int_t nBins, Float_t *momenta){ | |
110 | // | |
111 | // Set the momentum binning | |
112 | // | |
113 | if(fRefContainer) fRefContainer->Clear(); | |
114 | else{ | |
115 | fRefContainer = new TObjArray; | |
116 | fRefContainer->SetOwner(); | |
117 | } | |
118 | fRefContainer->Expand(nBins * AliPID::kSPECIES); | |
119 | fMomentumBins.Set(nBins,momenta); | |
120 | } | |
121 | ||
122 | //____________________________________________________________ | |
123 | void AliTRDPIDReference::AddReference(TObject *ref, AliPID::EParticleType spec, Int_t pbin){ | |
124 | // | |
125 | // Add a new reference distribution for a given species and a givem | |
126 | // momentum value to the reference container | |
127 | // The reference distribution is associated with the momentum value defined for the | |
128 | // given momentum bin | |
129 | // | |
130 | if(!fRefContainer){ | |
131 | AliError("Reference Container not initialized"); | |
132 | return; | |
133 | } | |
134 | if(pbin > fMomentumBins.GetSize()){ | |
135 | AliError("Pbin overflow"); | |
136 | return; | |
137 | } | |
138 | AliDebug(1, Form("Adding object with address %p to position %d", ref, spec * fMomentumBins.GetSize() + pbin)); | |
db0e2c5f | 139 | fRefContainer->AddAt(ref->Clone(), spec * fMomentumBins.GetSize() + pbin); |
51a0ce25 | 140 | } |
141 | ||
142 | //____________________________________________________________ | |
143 | TObject *AliTRDPIDReference::GetUpperReference(AliPID::EParticleType spec, Float_t p, Float_t &pUpper) const{ | |
144 | // | |
145 | // Get the next reference associated with a momentum larger than the requested momentum | |
146 | // In case no next upper reference is found, NULL is returned | |
147 | // The momentum value the reference is associated to is stored in the reference pUpper | |
148 | // | |
149 | Int_t bin = -1; | |
150 | pUpper = 20; | |
151 | for(Int_t ip = 0; ip < fMomentumBins.GetSize(); ip++){ | |
152 | AliDebug(10, Form("Bin %d, p = %.1f", ip, fMomentumBins[ip])); | |
153 | if(p < fMomentumBins[ip]){ | |
154 | AliDebug(10, "Bin found"); | |
155 | bin = ip; | |
156 | break; | |
157 | } | |
158 | } | |
159 | AliDebug(2, Form("p = %.1f, bin = %d\n", p, bin)); | |
160 | if(bin >= 0) { | |
161 | pUpper = fMomentumBins[bin]; | |
162 | return fRefContainer->At(spec * fMomentumBins.GetSize() + bin); | |
163 | } | |
164 | else return NULL; | |
165 | } | |
166 | ||
167 | //____________________________________________________________ | |
168 | TObject *AliTRDPIDReference::GetLowerReference(AliPID::EParticleType spec, Float_t p, Float_t &pLower) const{ | |
169 | // | |
170 | // Get the next reference associated with a momentum smaller than the requested momentum | |
171 | // In case no next lower reference is found, NULL is returned | |
172 | // The momentum value the reference is associated to is stored in the reference pLower | |
173 | // | |
174 | Int_t bin = -1; | |
175 | pLower = 0; | |
176 | for(Int_t ip = fMomentumBins.GetSize() - 1; ip >= 0; ip--){ | |
177 | AliDebug(10, Form("Bin %d, p = %.1f", ip, fMomentumBins[ip])); | |
178 | if(p > fMomentumBins[ip]){ | |
179 | AliDebug(10, "Bin found"); | |
180 | bin = ip; | |
181 | break; | |
182 | } | |
183 | } | |
184 | AliDebug(2, Form("p = %.1f, bin = %d\n", p, bin)); | |
185 | if(bin >= 0){ | |
186 | pLower = fMomentumBins[bin]; | |
187 | return fRefContainer->At(spec * fMomentumBins.GetSize() + bin); | |
188 | } | |
189 | else return NULL; | |
190 | } | |
191 | ||
192 | //____________________________________________________________ | |
193 | void AliTRDPIDReference::Print(const Option_t*) const{ | |
194 | // | |
195 | // Print content of the PID reference container | |
196 | // | |
197 | printf("Number of Momentum Bins: %d\n", GetNumberOfMomentumBins()); | |
198 | printf("=====================================\n"); | |
199 | for(Int_t ip = 0; ip < GetNumberOfMomentumBins(); ip++){ | |
200 | printf("Bin %d: p = %.1f\n", ip, fMomentumBins[ip]); | |
201 | } | |
202 | printf("=====================================\n"); | |
203 | if(fRefContainer){ | |
204 | printf("Content of the reference container:\n"); | |
205 | for(Int_t ip = 0; ip < GetNumberOfMomentumBins(); ip++){ | |
206 | printf("["); | |
207 | for(Int_t is = 0; is < 5; is++) printf("%p|", fRefContainer->At(is * fMomentumBins.GetSize() + ip)); | |
208 | printf("]\n"); | |
209 | } | |
210 | } | |
211 | } |