]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/vertexingHF/AliRDHFCuts.cxx
Small change to get info on rejection reason
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliRDHFCuts.cxx
CommitLineData
650b3ced 1/**************************************************************************
2 * Copyright(c) 1998-2010, 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/////////////////////////////////////////////////////////////
17//
18// Base class for cuts on AOD reconstructed heavy-flavour decay
19//
20// Author: A.Dainese, andrea.dainese@pd.infn.it
21/////////////////////////////////////////////////////////////
22#include <Riostream.h>
23
24#include "AliVEvent.h"
25#include "AliESDEvent.h"
26#include "AliAODEvent.h"
27#include "AliVVertex.h"
28#include "AliESDVertex.h"
29#include "AliAODVertex.h"
3cbc09cd 30#include "AliESDtrack.h"
31#include "AliAODTrack.h"
650b3ced 32#include "AliESDtrackCuts.h"
33#include "AliAODRecoDecayHF.h"
34#include "AliRDHFCuts.h"
35
36ClassImp(AliRDHFCuts)
37
38//--------------------------------------------------------------------------
39AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) :
40AliAnalysisCuts(name,title),
41fMinVtxType(3),
42fMinVtxContr(1),
43fMaxVtxRedChi2(1e6),
44fMinSPDMultiplicity(0),
45fTriggerMask(0),
46fTrackCuts(0),
47fnPtBins(1),
48fnPtBinLimits(1),
49fPtBinLimits(0),
50fnVars(1),
51fVarNames(0),
52fnVarsForOpt(0),
53fVarsForOpt(0),
54fGlobalIndex(1),
55fCutsRD(0),
c96634a2 56fIsUpperCut(0),
fa144fd0 57fUsePID(kFALSE),
58fPidHF(0),
918b6831 59fWhyRejection(0),
e4f44447 60fRemoveDaughtersFromPrimary(kFALSE),
61fOptPileup(0),
62fMinContrPileup(3),
63fMinDzPileup(0.6)
650b3ced 64{
65 //
66 // Default Constructor
67 //
68}
69//--------------------------------------------------------------------------
70AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
71 AliAnalysisCuts(source),
72 fMinVtxType(source.fMinVtxType),
73 fMinVtxContr(source.fMinVtxContr),
74 fMaxVtxRedChi2(source.fMaxVtxRedChi2),
75 fMinSPDMultiplicity(source.fMinSPDMultiplicity),
76 fTriggerMask(source.fTriggerMask),
77 fTrackCuts(0),
78 fnPtBins(source.fnPtBins),
79 fnPtBinLimits(source.fnPtBinLimits),
80 fPtBinLimits(0),
81 fnVars(source.fnVars),
82 fVarNames(0),
83 fnVarsForOpt(source.fnVarsForOpt),
84 fVarsForOpt(0),
85 fGlobalIndex(source.fGlobalIndex),
86 fCutsRD(0),
c96634a2 87 fIsUpperCut(0),
fa144fd0 88 fUsePID(source.fUsePID),
89 fPidHF(0),
918b6831 90 fWhyRejection(source.fWhyRejection),
e4f44447 91 fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
92 fOptPileup(source.fOptPileup),
93 fMinContrPileup(source.fMinContrPileup),
94 fMinDzPileup(source.fMinDzPileup)
650b3ced 95{
96 //
97 // Copy constructor
98 //
99 cout<<"Copy constructor"<<endl;
100 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
650b3ced 101 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
102 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
103 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
104 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
fa144fd0 105 if(source.fPidHF) SetPidHF(source.fPidHF);
650b3ced 106 PrintAll();
650b3ced 107
108}
109//--------------------------------------------------------------------------
110AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
111{
112 //
113 // assignment operator
114 //
115 if(&source == this) return *this;
116
117 AliAnalysisCuts::operator=(source);
118
119 fMinVtxType=source.fMinVtxType;
120 fMinVtxContr=source.fMinVtxContr;
121 fMaxVtxRedChi2=source.fMaxVtxRedChi2;
122 fMinSPDMultiplicity=source.fMinSPDMultiplicity;
123 fTriggerMask=source.fTriggerMask;
124 fnPtBins=source.fnPtBins;
125 fnVars=source.fnVars;
126 fGlobalIndex=source.fGlobalIndex;
127 fnVarsForOpt=source.fnVarsForOpt;
c96634a2 128 fUsePID=source.fUsePID;
fa144fd0 129 SetPidHF(source.GetPidHF());
130 fWhyRejection=source.fWhyRejection;
918b6831 131 fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
e4f44447 132 fOptPileup=source.fOptPileup;
133 fMinContrPileup=source.fMinContrPileup;
134 fMinDzPileup=source.fMinDzPileup;
650b3ced 135
bbbf8c32 136 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
650b3ced 137 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
138 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
139 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
140 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
141 PrintAll();
142
650b3ced 143 return *this;
144}
145//--------------------------------------------------------------------------
146AliRDHFCuts::~AliRDHFCuts() {
147 //
148 // Default Destructor
149 //
150 if(fPtBinLimits) {delete [] fPtBinLimits; fPtBinLimits=0;}
151 if(fVarNames) {delete [] fVarNames; fVarNames=0;}
152 if(fVarsForOpt) {delete [] fVarsForOpt; fVarsForOpt=0;}
153 if(fCutsRD) {
154 delete [] fCutsRD;
155 fCutsRD=0;
156 }
157 if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
fa144fd0 158 if(fPidHF){
159 delete fPidHF;
160 fPidHF=0;
161 }
650b3ced 162}
163//---------------------------------------------------------------------------
fb38b6dc 164Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
650b3ced 165 //
166 // Event selection
167 //
3cbc09cd 168 //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
650b3ced 169
fb38b6dc 170 fWhyRejection=0;
171
650b3ced 172 // multiplicity cuts no implemented yet
173
fb38b6dc 174
175
650b3ced 176 const AliVVertex *vertex = event->GetPrimaryVertex();
177
178 if(!vertex) return kFALSE;
179
180 TString title=vertex->GetTitle();
181 if(title.Contains("Z") && fMinVtxType>1) return kFALSE;
182 if(title.Contains("3D") && fMinVtxType>2) return kFALSE;
183
184 if(vertex->GetNContributors()<fMinVtxContr) return kFALSE;
e4f44447 185 if(fOptPileup==kRejectPileupEvent){
186 Int_t cutc=(Int_t)fMinContrPileup;
187 Double_t cutz=(Double_t)fMinDzPileup;
fb38b6dc 188 if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
189 fWhyRejection=1;
190 return kFALSE;
191 }
e4f44447 192 }
650b3ced 193
194 return kTRUE;
195}
196//---------------------------------------------------------------------------
3cbc09cd 197Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
198 //
199 // Daughter tracks selection
200 //
85d335a7 201 if(!fTrackCuts) return kTRUE;
202
3cbc09cd 203 Int_t ndaughters = d->GetNDaughters();
85d335a7 204 AliAODVertex *vAOD = d->GetPrimaryVtx();
205 Double_t pos[3],cov[6];
206 vAOD->GetXYZ(pos);
207 vAOD->GetCovarianceMatrix(cov);
da6fefc3 208 const AliESDVertex vESD(pos,cov,100.,100);
85d335a7 209
210 Bool_t retval=kTRUE;
3cbc09cd 211
212 for(Int_t idg=0; idg<ndaughters; idg++) {
213 AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);
85d335a7 214 if(!dgTrack) retval = kFALSE;
3cbc09cd 215 //printf("charge %d\n",dgTrack->Charge());
216 if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
85d335a7 217
da6fefc3 218 if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
219 }
85d335a7 220
221 return retval;
3cbc09cd 222}
223//---------------------------------------------------------------------------
da6fefc3 224Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
225 //
226 // Convert to ESDtrack, relate to vertex and check cuts
227 //
228 if(!cuts) return kTRUE;
229
230 Bool_t retval=kTRUE;
231
232 // convert to ESD track here
233 AliESDtrack esdTrack(track);
234 // needed to calculate the impact parameters
235 esdTrack.RelateToVertex(primary,0.,3.);
236 if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
237
e4f44447 238 if(fOptPileup==kRejectTracksFromPileupVertex){
239 // to be implemented
240 // we need either to have here the AOD Event,
241 // or to have the pileup vertex object
242 }
da6fefc3 243 return retval;
244}
245//---------------------------------------------------------------------------
650b3ced 246void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
247 // Set the pt bins
248
249 if(fPtBinLimits) {
250 delete [] fPtBinLimits;
251 fPtBinLimits = NULL;
252 printf("Changing the pt bins\n");
253 }
254
255 if(nPtBinLimits != fnPtBins+1){
256 cout<<"Warning: ptBinLimits dimention "<<nPtBinLimits<<" != nPtBins+1 ("<<fnPtBins+1<<")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;
257 SetNPtBins(nPtBinLimits-1);
258 }
259
260 fnPtBinLimits = nPtBinLimits;
261 SetGlobalIndex();
6e0903f0 262 //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
650b3ced 263 fPtBinLimits = new Float_t[fnPtBinLimits];
264 for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
265
266 return;
267}
268//---------------------------------------------------------------------------
269void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){
270 // Set the variable names
271
272 if(fVarNames) {
273 delete [] fVarNames;
274 fVarNames = NULL;
6e0903f0 275 //printf("Changing the variable names\n");
650b3ced 276 }
277 if(nVars!=fnVars){
278 printf("Wrong number of variables: it has to be %d\n",fnVars);
279 return;
280 }
281 //fnVars=nVars;
282 fVarNames = new TString[nVars];
283 fIsUpperCut = new Bool_t[nVars];
284 for(Int_t iv=0; iv<nVars; iv++) {
285 fVarNames[iv] = varNames[iv];
286 fIsUpperCut[iv] = isUpperCut[iv];
287 }
288
289 return;
290}
291//---------------------------------------------------------------------------
292void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {
293 // Set the variables to be used for cuts optimization
294
295 if(fVarsForOpt) {
296 delete [] fVarsForOpt;
297 fVarsForOpt = NULL;
6e0903f0 298 //printf("Changing the variables for cut optimization\n");
650b3ced 299 }
300
301 if(nVars==0){//!=fnVars) {
302 printf("%d not accepted as number of variables: it has to be %d\n",nVars,fnVars);
303 return;
304 }
305
306 fnVarsForOpt = 0;
307 fVarsForOpt = new Bool_t[fnVars];
308 for(Int_t iv=0; iv<fnVars; iv++) {
309 fVarsForOpt[iv]=forOpt[iv];
310 if(fVarsForOpt[iv]) fnVarsForOpt++;
311 }
312
313 return;
314}
315//---------------------------------------------------------------------------
316void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) {
4edfaee0 317 //
318 // store the cuts
319 //
650b3ced 320 if(nVars!=fnVars) {
321 printf("Wrong number of variables: it has to be %d\n",fnVars);
322 return;
323 }
324 if(nPtBins!=fnPtBins) {
325 printf("Wrong number of pt bins: it has to be %d\n",fnPtBins);
326 return;
327 }
328
329 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
330
4edfaee0 331
650b3ced 332 for(Int_t iv=0; iv<fnVars; iv++) {
333
334 for(Int_t ib=0; ib<fnPtBins; ib++) {
335
650b3ced 336 //check
4edfaee0 337 if(GetGlobalIndex(iv,ib)>=fGlobalIndex) {
650b3ced 338 cout<<"Overflow, exit..."<<endl;
339 return;
340 }
4edfaee0 341
342 fCutsRD[GetGlobalIndex(iv,ib)] = cutsRD[iv][ib];
343
650b3ced 344 }
345 }
650b3ced 346 return;
347}
348//---------------------------------------------------------------------------
349void AliRDHFCuts::SetCuts(Int_t glIndex,Float_t* cutsRDGlob){
4edfaee0 350 //
351 // store the cuts
352 //
650b3ced 353 if(glIndex != fGlobalIndex){
354 cout<<"Wrong array size: it has to be "<<fGlobalIndex<<endl;
355 return;
356 }
357 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
358
359 for(Int_t iGl=0;iGl<fGlobalIndex;iGl++){
360 fCutsRD[iGl] = cutsRDGlob[iGl];
361 }
650b3ced 362 return;
650b3ced 363}
650b3ced 364//---------------------------------------------------------------------------
4edfaee0 365void AliRDHFCuts::PrintAll() const {
366 //
367 // print all cuts values
368 //
0198f78c 369
370 printf("Minimum vtx type %d\n",fMinVtxType);
371 printf("Minimum vtx contr %d\n",fMinVtxContr);
372 printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
373 printf("Min SPD mult %d\n",fMinSPDMultiplicity);
374 printf("Use PID %d\n",(Int_t)fUsePID);
375 printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
376
650b3ced 377 if(fVarNames){
378 cout<<"Array of variables"<<endl;
379 for(Int_t iv=0;iv<fnVars;iv++){
380 cout<<fVarNames[iv]<<"\t";
381 }
382 cout<<endl;
383 }
384 if(fVarsForOpt){
385 cout<<"Array of optimization"<<endl;
386 for(Int_t iv=0;iv<fnVars;iv++){
387 cout<<fVarsForOpt[iv]<<"\t";
388 }
389 cout<<endl;
390 }
391 if(fIsUpperCut){
392 cout<<"Array of upper/lower cut"<<endl;
393 for(Int_t iv=0;iv<fnVars;iv++){
394 cout<<fIsUpperCut[iv]<<"\t";
395 }
396 cout<<endl;
397 }
398 if(fPtBinLimits){
399 cout<<"Array of ptbin limits"<<endl;
400 for(Int_t ib=0;ib<fnPtBinLimits;ib++){
401 cout<<fPtBinLimits[ib]<<"\t";
402 }
403 cout<<endl;
404 }
405 if(fCutsRD){
406 cout<<"Matrix of cuts"<<endl;
407 for(Int_t iv=0;iv<fnVars;iv++){
408 for(Int_t ib=0;ib<fnPtBins;ib++){
409 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";
410 }
411 cout<<endl;
412 }
413 cout<<endl;
414 }
4edfaee0 415 return;
650b3ced 416}
650b3ced 417//---------------------------------------------------------------------------
418void AliRDHFCuts::GetCuts(Float_t**& cutsRD) const{
4edfaee0 419 //
650b3ced 420 // get the cuts
4edfaee0 421 //
650b3ced 422
4edfaee0 423 //cout<<"Give back a "<<fnVars<<"x"<<fnPtBins<<" matrix."<<endl;
650b3ced 424
650b3ced 425
4edfaee0 426 Int_t iv,ib;
650b3ced 427 if(!cutsRD) {
4edfaee0 428 //cout<<"Initialization..."<<endl;
650b3ced 429 cutsRD=new Float_t*[fnVars];
4edfaee0 430 for(iv=0; iv<fnVars; iv++) {
650b3ced 431 cutsRD[iv] = new Float_t[fnPtBins];
432 }
433 }
434
4edfaee0 435 for(Int_t iGlobal=0; iGlobal<fGlobalIndex; iGlobal++) {
436 GetVarPtIndex(iGlobal,iv,ib);
437 cutsRD[iv][ib] = fCutsRD[iGlobal];
650b3ced 438 }
439
4edfaee0 440 return;
650b3ced 441}
442
443//---------------------------------------------------------------------------
444Int_t AliRDHFCuts::GetGlobalIndex(Int_t iVar,Int_t iPtBin) const{
4edfaee0 445 //
3cbc09cd 446 // give the global index from variable and pt bin
4edfaee0 447 //
650b3ced 448 return iPtBin*fnVars+iVar;
449}
450
451//---------------------------------------------------------------------------
452void AliRDHFCuts::GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const {
4edfaee0 453 //
650b3ced 454 //give the index of the variable and of the pt bin from the global index
4edfaee0 455 //
650b3ced 456 iPtBin=(Int_t)iGlob/fnVars;
457 iVar=iGlob%fnVars;
458
4edfaee0 459 return;
650b3ced 460}
461
462//---------------------------------------------------------------------------
463Int_t AliRDHFCuts::PtBin(Double_t pt) const {
4edfaee0 464 //
650b3ced 465 //give the pt bin where the pt lies.
4edfaee0 466 //
eaa73e44 467 Int_t ptbin=-1;
650b3ced 468 for (Int_t i=0;i<fnPtBins;i++){
469 if(pt<fPtBinLimits[i+1]) {
470 ptbin=i;
471 break;
472 }
473 }
474 return ptbin;
475}
aaf4e30f 476//-------------------------------------------------------------------
477Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {
478 //
479 // Give the value of cut set for the variable iVar and the pt bin iPtBin
480 //
481 if(!fCutsRD){
482 cout<<"Cuts not iniziaisez yet"<<endl;
483 return 0;
484 }
485 return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
486}
0198f78c 487//-------------------------------------------------------------------
488Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
489 //
490 // Compare two cuts objects
491 //
492
493 Bool_t areEqual=kTRUE;
494
495 if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
496
497 if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
498
499 if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) { printf("Max vtx red chi2 %f %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
500
501 if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) { printf("Min SPD mult %d\n %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
502
503 if(fUsePID!=obj->fUsePID) { printf("Use PID %d %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
aaf4e30f 504
0198f78c 505 if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
e6ee9709 506 if(fTrackCuts){
507 if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
0198f78c 508
e6ee9709 509 if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
0198f78c 510
e6ee9709 511 if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
0198f78c 512
e6ee9709 513 if(fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)!=obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)) {printf("ClusterReq SPD %d %d\n",fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD),obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)); areEqual=kFALSE;}
514 }
0198f78c 515
516 if(fCutsRD) {
517 for(Int_t iv=0;iv<fnVars;iv++) {
518 for(Int_t ib=0;ib<fnPtBins;ib++) {
519 if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
520 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<" "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
521 areEqual=kFALSE;
522 }
523 }
524 }
525 }
526
527 return areEqual;
528}