ROOT logo
/*************************************************************************
* Copyright(c) 1998-2009, 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.                  *
**************************************************************************/

///////////////////////////////////////////////////////////////////////////
//   Cut class providing cuts to all infomation                          //
//     available for the AliVParticle interface                          //                                                     //
//                                                                       //
// Authors:                                                              //
//   Jens Wiechula <Jens.Wiechula@cern.ch>                               //
//   Julian Book   <Julian.Book@cern.ch>                                 //
/*



*/
//                                                                       //
///////////////////////////////////////////////////////////////////////////


#include <THnBase.h>

#include "AliDielectronVarCuts.h"
#include "AliDielectronMC.h"

ClassImp(AliDielectronVarCuts)


AliDielectronVarCuts::AliDielectronVarCuts() :
  AliAnalysisCuts(),
  fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
  fNActiveCuts(0),
  fActiveCutsMask(0),
  fSelectedCutsMask(0),
  fCutOnMCtruth(kFALSE),
  fCutType(kAll)
{
  //
  // Default costructor
  //
  for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
    fActiveCuts[i]=0;
    fCutMin[i]=0;
    fCutMax[i]=0;
    fCutExclude[i]=kFALSE;
    fBitCut[i]=kFALSE;
    fUpperCut[i]=0x0;
  }
}

//________________________________________________________________________
AliDielectronVarCuts::AliDielectronVarCuts(const char* name, const char* title) :
  AliAnalysisCuts(name,title),
  fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
  fNActiveCuts(0),
  fActiveCutsMask(0),
  fSelectedCutsMask(0),
  fCutOnMCtruth(kFALSE),
  fCutType(kAll)
{
  //
  // Named contructor
  //
  for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues; ++i){
    fActiveCuts[i]=0;
    fCutMin[i]=0;
    fCutMax[i]=0;
    fCutExclude[i]=kFALSE;
    fBitCut[i]=kFALSE;
    fUpperCut[i]=0x0;
  }
}

//________________________________________________________________________
AliDielectronVarCuts::~AliDielectronVarCuts()
{
  //
  // Destructor
  //
  if (fUsedVars) delete fUsedVars;
}

//________________________________________________________________________
Bool_t AliDielectronVarCuts::IsSelected(TObject* track)
{
  //
  // Make cut decision
  //

  //reset
  fSelectedCutsMask=0;
  SetSelected(kFALSE);

  if (!track) return kFALSE;

  //If MC cut, get MC truth
  if (fCutOnMCtruth){
    AliVParticle *part=static_cast<AliVParticle*>(track);
    track=AliDielectronMC::Instance()->GetMCTrackFromMCEvent(part->GetLabel());
    if (!track) return kFALSE;
  }

  //Fill values
  Double_t values[AliDielectronVarManager::kNMaxValues];
  AliDielectronVarManager::SetFillMap(fUsedVars);
  AliDielectronVarManager::Fill(track,values);

  for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
    Int_t cut=fActiveCuts[iCut];
    SETBIT(fSelectedCutsMask,iCut);

    // apply 'bit cut'
    if(fBitCut[iCut]) {
      if ( (TESTBIT((UInt_t)values[cut],(UInt_t)fCutMin[iCut]))^(!fCutExclude[iCut]) )  CLRBIT(fSelectedCutsMask,iCut);
    }
    else {
      // standard var cuts
      if ( !fUpperCut[iCut] && ((values[cut]<fCutMin[iCut]) || (values[cut]>fCutMax[iCut]))^fCutExclude[iCut] ) {
	CLRBIT(fSelectedCutsMask,iCut);
      }
      else if ( fUpperCut[iCut]) {
	/// use a THnBase inherited cut object //
	Double_t *vals = new Double_t[fUpperCut[iCut]->GetNdimensions()];//={-1};
	// get array of values for the corresponding dimensions using axis names
	for(Int_t idim=0; idim<fUpperCut[iCut]->GetNdimensions(); idim++) {
	  vals[idim] = values[AliDielectronVarManager::GetValueType(fUpperCut[iCut]->GetAxis(idim)->GetName())];
	  // printf(" \t %s %.3f ",fUpperCut[iCut]->GetAxis(idim)->GetName(),vals[idim]);
	}
	// find bin for values (w/o creating it in case it is not filled)
	Long_t bin = fUpperCut[iCut]->GetBin(vals,kFALSE);
	Double_t cutMax = (bin>0 ? fUpperCut[iCut]->GetBinContent(bin) : -999. );
	if ( ((values[cut]<fCutMin[iCut]) || (values[cut]>cutMax))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
	delete [] vals;
      }
    }
    // cut type and decision
    if ( fCutType==kAll && !TESTBIT(fSelectedCutsMask,iCut) ) return kFALSE; // option to (minor) speed improvement
  }

  Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
  if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
  SetSelected(isSelected);
  return isSelected;
}

//________________________________________________________________________
void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max, Bool_t excludeRange)
{
  //
  // Set cut range and activate it
  //
  if (min>max){
    Double_t tmp=min;
    min=max;
    max=tmp;
  }
  fCutMin[fNActiveCuts]=min;
  fCutMax[fNActiveCuts]=max;
  fCutExclude[fNActiveCuts]=excludeRange;
  SETBIT(fActiveCutsMask,fNActiveCuts);
  fActiveCuts[fNActiveCuts]=(UShort_t)type;
  fUsedVars->SetBitNumber(type,kTRUE);
  ++fNActiveCuts;
}

//________________________________________________________________________
void AliDielectronVarCuts::AddBitCut(AliDielectronVarManager::ValueTypes type, UInt_t bit, Bool_t excludeRange)
{
  //
  // Set cut range and activate it
  //
  fCutMin[fNActiveCuts]=bit;
  fCutExclude[fNActiveCuts]=excludeRange;
  fBitCut[fNActiveCuts]=kTRUE;
  SETBIT(fActiveCutsMask,fNActiveCuts);
  fActiveCuts[fNActiveCuts]=(UShort_t)type;
  fUsedVars->SetBitNumber(type,kTRUE);
  ++fNActiveCuts;
}

//________________________________________________________________________
void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, THnBase * const max,  Bool_t excludeRange)
{
  //
  // Set cut range and activate it
  //
  fCutMin[fNActiveCuts]=min;
  fCutMax[fNActiveCuts]=0.0;
  fCutExclude[fNActiveCuts]=excludeRange;
  SETBIT(fActiveCutsMask,fNActiveCuts);
  fActiveCuts[fNActiveCuts]=(UShort_t)type;
  fUsedVars->SetBitNumber(type,kTRUE);

  fUpperCut[fNActiveCuts]=max;
  // fill used variables into map
  for(Int_t idim=0; idim<fUpperCut[fNActiveCuts]->GetNdimensions(); idim++) {
    TString var(fUpperCut[fNActiveCuts]->GetAxis(idim)->GetName());
    fUsedVars->SetBitNumber(AliDielectronVarManager::GetValueType(var.Data()), kTRUE);
  }
  ++fNActiveCuts;
}

//________________________________________________________________________
void AliDielectronVarCuts::Print(const Option_t* /*option*/) const
{
  //
  // Print cuts and the range
  //
  printf("cut ranges for '%s'\n",GetTitle());
  if (fCutType==kAll){
    printf("All Cuts have to be fulfilled\n");
  } else {
    printf("Any Cut has to be fulfilled\n");
  }
  for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
    Int_t cut=(Int_t)fActiveCuts[iCut];
    Bool_t inverse=fCutExclude[iCut];
    Bool_t bitcut=fBitCut[iCut];
    Bool_t objcut=fUpperCut[iCut];

    if(!bitcut && !objcut) {
      // standard cut
      if (!inverse){
	printf("Cut %02d: %f < %s < %f\n", iCut,
	       fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);
      } else {
	printf("Cut %02d: !(%f < %s < %f)\n", iCut,
	       fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), fCutMax[iCut]);
      }
    }
    else if(bitcut) {
      // bit cut
      if (!inverse){
	printf("Cut %02d: %s & (1ULL<<%d) \n", iCut,
	       AliDielectronVarManager::GetValueName((Int_t)cut), (UInt_t)fCutMin[iCut]);
      } else {
	printf("Cut %02d: !(%s & (1ULL<<%d)) \n", iCut,
	       AliDielectronVarManager::GetValueName((Int_t)cut), (UInt_t)fCutMin[iCut]);
      }
    }
    else if(objcut) {
      // upper cut limit provided by object depending on 'dep'
      TString dep="";
      for(Int_t idim=0; idim<fUpperCut[iCut]->GetNdimensions(); idim++)
	dep+=Form("%s%s",(idim?",":""),fUpperCut[iCut]->GetAxis(idim)->GetName());

      if (!inverse){
	printf("Cut %02d: %f < %s < obj(%s)\n", iCut,
	       fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), dep.Data());
      } else {
	printf("Cut %02d: !(%f < %s < obj(%s))\n", iCut,
	       fCutMin[iCut], AliDielectronVarManager::GetValueName((Int_t)cut), dep.Data());
      }
    }
  } //loop over cuts
}
 AliDielectronVarCuts.cxx:1
 AliDielectronVarCuts.cxx:2
 AliDielectronVarCuts.cxx:3
 AliDielectronVarCuts.cxx:4
 AliDielectronVarCuts.cxx:5
 AliDielectronVarCuts.cxx:6
 AliDielectronVarCuts.cxx:7
 AliDielectronVarCuts.cxx:8
 AliDielectronVarCuts.cxx:9
 AliDielectronVarCuts.cxx:10
 AliDielectronVarCuts.cxx:11
 AliDielectronVarCuts.cxx:12
 AliDielectronVarCuts.cxx:13
 AliDielectronVarCuts.cxx:14
 AliDielectronVarCuts.cxx:15
 AliDielectronVarCuts.cxx:16
 AliDielectronVarCuts.cxx:17
 AliDielectronVarCuts.cxx:18
 AliDielectronVarCuts.cxx:19
 AliDielectronVarCuts.cxx:20
 AliDielectronVarCuts.cxx:21
 AliDielectronVarCuts.cxx:22
 AliDielectronVarCuts.cxx:23
 AliDielectronVarCuts.cxx:24
 AliDielectronVarCuts.cxx:25
 AliDielectronVarCuts.cxx:26
 AliDielectronVarCuts.cxx:27
 AliDielectronVarCuts.cxx:28
 AliDielectronVarCuts.cxx:29
 AliDielectronVarCuts.cxx:30
 AliDielectronVarCuts.cxx:31
 AliDielectronVarCuts.cxx:32
 AliDielectronVarCuts.cxx:33
 AliDielectronVarCuts.cxx:34
 AliDielectronVarCuts.cxx:35
 AliDielectronVarCuts.cxx:36
 AliDielectronVarCuts.cxx:37
 AliDielectronVarCuts.cxx:38
 AliDielectronVarCuts.cxx:39
 AliDielectronVarCuts.cxx:40
 AliDielectronVarCuts.cxx:41
 AliDielectronVarCuts.cxx:42
 AliDielectronVarCuts.cxx:43
 AliDielectronVarCuts.cxx:44
 AliDielectronVarCuts.cxx:45
 AliDielectronVarCuts.cxx:46
 AliDielectronVarCuts.cxx:47
 AliDielectronVarCuts.cxx:48
 AliDielectronVarCuts.cxx:49
 AliDielectronVarCuts.cxx:50
 AliDielectronVarCuts.cxx:51
 AliDielectronVarCuts.cxx:52
 AliDielectronVarCuts.cxx:53
 AliDielectronVarCuts.cxx:54
 AliDielectronVarCuts.cxx:55
 AliDielectronVarCuts.cxx:56
 AliDielectronVarCuts.cxx:57
 AliDielectronVarCuts.cxx:58
 AliDielectronVarCuts.cxx:59
 AliDielectronVarCuts.cxx:60
 AliDielectronVarCuts.cxx:61
 AliDielectronVarCuts.cxx:62
 AliDielectronVarCuts.cxx:63
 AliDielectronVarCuts.cxx:64
 AliDielectronVarCuts.cxx:65
 AliDielectronVarCuts.cxx:66
 AliDielectronVarCuts.cxx:67
 AliDielectronVarCuts.cxx:68
 AliDielectronVarCuts.cxx:69
 AliDielectronVarCuts.cxx:70
 AliDielectronVarCuts.cxx:71
 AliDielectronVarCuts.cxx:72
 AliDielectronVarCuts.cxx:73
 AliDielectronVarCuts.cxx:74
 AliDielectronVarCuts.cxx:75
 AliDielectronVarCuts.cxx:76
 AliDielectronVarCuts.cxx:77
 AliDielectronVarCuts.cxx:78
 AliDielectronVarCuts.cxx:79
 AliDielectronVarCuts.cxx:80
 AliDielectronVarCuts.cxx:81
 AliDielectronVarCuts.cxx:82
 AliDielectronVarCuts.cxx:83
 AliDielectronVarCuts.cxx:84
 AliDielectronVarCuts.cxx:85
 AliDielectronVarCuts.cxx:86
 AliDielectronVarCuts.cxx:87
 AliDielectronVarCuts.cxx:88
 AliDielectronVarCuts.cxx:89
 AliDielectronVarCuts.cxx:90
 AliDielectronVarCuts.cxx:91
 AliDielectronVarCuts.cxx:92
 AliDielectronVarCuts.cxx:93
 AliDielectronVarCuts.cxx:94
 AliDielectronVarCuts.cxx:95
 AliDielectronVarCuts.cxx:96
 AliDielectronVarCuts.cxx:97
 AliDielectronVarCuts.cxx:98
 AliDielectronVarCuts.cxx:99
 AliDielectronVarCuts.cxx:100
 AliDielectronVarCuts.cxx:101
 AliDielectronVarCuts.cxx:102
 AliDielectronVarCuts.cxx:103
 AliDielectronVarCuts.cxx:104
 AliDielectronVarCuts.cxx:105
 AliDielectronVarCuts.cxx:106
 AliDielectronVarCuts.cxx:107
 AliDielectronVarCuts.cxx:108
 AliDielectronVarCuts.cxx:109
 AliDielectronVarCuts.cxx:110
 AliDielectronVarCuts.cxx:111
 AliDielectronVarCuts.cxx:112
 AliDielectronVarCuts.cxx:113
 AliDielectronVarCuts.cxx:114
 AliDielectronVarCuts.cxx:115
 AliDielectronVarCuts.cxx:116
 AliDielectronVarCuts.cxx:117
 AliDielectronVarCuts.cxx:118
 AliDielectronVarCuts.cxx:119
 AliDielectronVarCuts.cxx:120
 AliDielectronVarCuts.cxx:121
 AliDielectronVarCuts.cxx:122
 AliDielectronVarCuts.cxx:123
 AliDielectronVarCuts.cxx:124
 AliDielectronVarCuts.cxx:125
 AliDielectronVarCuts.cxx:126
 AliDielectronVarCuts.cxx:127
 AliDielectronVarCuts.cxx:128
 AliDielectronVarCuts.cxx:129
 AliDielectronVarCuts.cxx:130
 AliDielectronVarCuts.cxx:131
 AliDielectronVarCuts.cxx:132
 AliDielectronVarCuts.cxx:133
 AliDielectronVarCuts.cxx:134
 AliDielectronVarCuts.cxx:135
 AliDielectronVarCuts.cxx:136
 AliDielectronVarCuts.cxx:137
 AliDielectronVarCuts.cxx:138
 AliDielectronVarCuts.cxx:139
 AliDielectronVarCuts.cxx:140
 AliDielectronVarCuts.cxx:141
 AliDielectronVarCuts.cxx:142
 AliDielectronVarCuts.cxx:143
 AliDielectronVarCuts.cxx:144
 AliDielectronVarCuts.cxx:145
 AliDielectronVarCuts.cxx:146
 AliDielectronVarCuts.cxx:147
 AliDielectronVarCuts.cxx:148
 AliDielectronVarCuts.cxx:149
 AliDielectronVarCuts.cxx:150
 AliDielectronVarCuts.cxx:151
 AliDielectronVarCuts.cxx:152
 AliDielectronVarCuts.cxx:153
 AliDielectronVarCuts.cxx:154
 AliDielectronVarCuts.cxx:155
 AliDielectronVarCuts.cxx:156
 AliDielectronVarCuts.cxx:157
 AliDielectronVarCuts.cxx:158
 AliDielectronVarCuts.cxx:159
 AliDielectronVarCuts.cxx:160
 AliDielectronVarCuts.cxx:161
 AliDielectronVarCuts.cxx:162
 AliDielectronVarCuts.cxx:163
 AliDielectronVarCuts.cxx:164
 AliDielectronVarCuts.cxx:165
 AliDielectronVarCuts.cxx:166
 AliDielectronVarCuts.cxx:167
 AliDielectronVarCuts.cxx:168
 AliDielectronVarCuts.cxx:169
 AliDielectronVarCuts.cxx:170
 AliDielectronVarCuts.cxx:171
 AliDielectronVarCuts.cxx:172
 AliDielectronVarCuts.cxx:173
 AliDielectronVarCuts.cxx:174
 AliDielectronVarCuts.cxx:175
 AliDielectronVarCuts.cxx:176
 AliDielectronVarCuts.cxx:177
 AliDielectronVarCuts.cxx:178
 AliDielectronVarCuts.cxx:179
 AliDielectronVarCuts.cxx:180
 AliDielectronVarCuts.cxx:181
 AliDielectronVarCuts.cxx:182
 AliDielectronVarCuts.cxx:183
 AliDielectronVarCuts.cxx:184
 AliDielectronVarCuts.cxx:185
 AliDielectronVarCuts.cxx:186
 AliDielectronVarCuts.cxx:187
 AliDielectronVarCuts.cxx:188
 AliDielectronVarCuts.cxx:189
 AliDielectronVarCuts.cxx:190
 AliDielectronVarCuts.cxx:191
 AliDielectronVarCuts.cxx:192
 AliDielectronVarCuts.cxx:193
 AliDielectronVarCuts.cxx:194
 AliDielectronVarCuts.cxx:195
 AliDielectronVarCuts.cxx:196
 AliDielectronVarCuts.cxx:197
 AliDielectronVarCuts.cxx:198
 AliDielectronVarCuts.cxx:199
 AliDielectronVarCuts.cxx:200
 AliDielectronVarCuts.cxx:201
 AliDielectronVarCuts.cxx:202
 AliDielectronVarCuts.cxx:203
 AliDielectronVarCuts.cxx:204
 AliDielectronVarCuts.cxx:205
 AliDielectronVarCuts.cxx:206
 AliDielectronVarCuts.cxx:207
 AliDielectronVarCuts.cxx:208
 AliDielectronVarCuts.cxx:209
 AliDielectronVarCuts.cxx:210
 AliDielectronVarCuts.cxx:211
 AliDielectronVarCuts.cxx:212
 AliDielectronVarCuts.cxx:213
 AliDielectronVarCuts.cxx:214
 AliDielectronVarCuts.cxx:215
 AliDielectronVarCuts.cxx:216
 AliDielectronVarCuts.cxx:217
 AliDielectronVarCuts.cxx:218
 AliDielectronVarCuts.cxx:219
 AliDielectronVarCuts.cxx:220
 AliDielectronVarCuts.cxx:221
 AliDielectronVarCuts.cxx:222
 AliDielectronVarCuts.cxx:223
 AliDielectronVarCuts.cxx:224
 AliDielectronVarCuts.cxx:225
 AliDielectronVarCuts.cxx:226
 AliDielectronVarCuts.cxx:227
 AliDielectronVarCuts.cxx:228
 AliDielectronVarCuts.cxx:229
 AliDielectronVarCuts.cxx:230
 AliDielectronVarCuts.cxx:231
 AliDielectronVarCuts.cxx:232
 AliDielectronVarCuts.cxx:233
 AliDielectronVarCuts.cxx:234
 AliDielectronVarCuts.cxx:235
 AliDielectronVarCuts.cxx:236
 AliDielectronVarCuts.cxx:237
 AliDielectronVarCuts.cxx:238
 AliDielectronVarCuts.cxx:239
 AliDielectronVarCuts.cxx:240
 AliDielectronVarCuts.cxx:241
 AliDielectronVarCuts.cxx:242
 AliDielectronVarCuts.cxx:243
 AliDielectronVarCuts.cxx:244
 AliDielectronVarCuts.cxx:245
 AliDielectronVarCuts.cxx:246
 AliDielectronVarCuts.cxx:247
 AliDielectronVarCuts.cxx:248
 AliDielectronVarCuts.cxx:249
 AliDielectronVarCuts.cxx:250
 AliDielectronVarCuts.cxx:251
 AliDielectronVarCuts.cxx:252
 AliDielectronVarCuts.cxx:253
 AliDielectronVarCuts.cxx:254
 AliDielectronVarCuts.cxx:255
 AliDielectronVarCuts.cxx:256
 AliDielectronVarCuts.cxx:257
 AliDielectronVarCuts.cxx:258
 AliDielectronVarCuts.cxx:259
 AliDielectronVarCuts.cxx:260
 AliDielectronVarCuts.cxx:261
 AliDielectronVarCuts.cxx:262
 AliDielectronVarCuts.cxx:263
 AliDielectronVarCuts.cxx:264
 AliDielectronVarCuts.cxx:265
 AliDielectronVarCuts.cxx:266
 AliDielectronVarCuts.cxx:267