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.                  *
 **************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                           CutQA                                      //
//                                                                      //
/*
   Allow to monitor how many tracks,pair,events pass the selection criterion 
   in any of the cuts added to the corresponding filters. All you need to 
   add to your config is the following:

   dielectron->SetCutQA();


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

#include "AliDielectronCutQA.h"

#include <TList.h>
#include <TCollection.h>

#include "AliDielectronCutGroup.h"
#include "AliAnalysisCuts.h"

#include "AliVEvent.h"
#include "AliVParticle.h"
#include "AliVTrack.h"
#include "AliDielectronPair.h"


ClassImp(AliDielectronCutQA)


AliDielectronCutQA::AliDielectronCutQA() :
  TNamed(),
  fQAHistArray()
{
  //
  // Default constructor
  //
  for(Int_t itype=0; itype<kNtypes; itype++) {
    fCutQA[itype]=0x0;
    fNCuts[itype]=1;
    for(Int_t i=0; i<20; i++) {
      fCutNames[i][itype]="";
    }
  }
  fTypeKeys[kTrack] = "Track";
  fTypeKeys[kPair]  = "Pair";
  fTypeKeys[kEvent] = "Event";
  fQAHistArray.SetOwner();
}

//_____________________________________________________________________
AliDielectronCutQA::AliDielectronCutQA(const char* name, const char* title) :
  TNamed(name, title),
  fQAHistArray()
{
  //
  // Named Constructor
  //
  for(Int_t itype=0; itype<kNtypes; itype++) {
    fCutQA[itype]=0x0;
    fNCuts[itype]=1;
    for(Int_t i=0; i<20; i++) {
      fCutNames[i][itype]="";
    }
  }
  fTypeKeys[kTrack] = "Track";
  fTypeKeys[kPair]  = "Pair";
  fTypeKeys[kEvent] = "Event";
  fQAHistArray.SetOwner();
}

//_____________________________________________________________________
AliDielectronCutQA::~AliDielectronCutQA() 
{
  //
  //Default Destructor
  //
  fQAHistArray.Delete();
}

//_____________________________________________________________________
void AliDielectronCutQA::Init()
{

  fQAHistArray.SetName(Form("%s",GetName()));

  // loop over all types
  for(Int_t itype=0; itype<kNtypes; itype++) {
    //    printf("\n type: %d\n",itype);
    fCutNames[0][itype]="no cuts";

    // create histogram based on added cuts
    fCutQA[itype] = new TH1F(fTypeKeys[itype],
			     Form("%sQA;cuts;# passed %ss",fTypeKeys[itype],fTypeKeys[itype]),
			     fNCuts[itype],0,fNCuts[itype]);
    // loop over all cuts
    for(Int_t i=0; i<fNCuts[itype]; i++) {
      fCutQA[itype]->GetXaxis()->SetBinLabel(i+1,fCutNames[i][itype]);
      //      printf(" %s \n",fCutNames[i][itype]);
    }
    fQAHistArray.AddLast(fCutQA[itype]);
  }

}

//_____________________________________________________________________
void AliDielectronCutQA::AddTrackFilter(AliAnalysisFilter *trackFilter)
{
  //
  // add track filter cuts to the qa histogram
  //


  TIter listIterator(trackFilter->GetCuts());
  while (AliAnalysisCuts *thisCut = (AliAnalysisCuts*) listIterator()) {
    Bool_t addCut=kTRUE;

    // add new cut class to the array
    if(addCut) {
      fCutNames[fNCuts[kTrack]][kTrack]=thisCut->GetTitle();
      //      printf("add cut %s to %d \n",thisCut->GetTitle(),fNCuts[kTrack]);
      fNCuts[kTrack]++;
    }

  } // pair filter loop

}


//_____________________________________________________________________
void AliDielectronCutQA::AddPairFilter(AliAnalysisFilter *pairFilter)
{
  //
  // add track filter cuts to the qa histogram
  //


  TIter listIterator(pairFilter->GetCuts());
  while (AliAnalysisCuts *thisCut = (AliAnalysisCuts*) listIterator()) {
    Bool_t addCut=kTRUE;

    // add new cut class to the array
    if(addCut) {
      fCutNames[fNCuts[kPair]][kPair]=thisCut->GetTitle();
      //  printf("add cut %s to %d \n",thisCut->GetTitle(),fNCuts[kPair]);
      fNCuts[kPair]++;
    }

  } // trk filter loop

}

//_____________________________________________________________________
void AliDielectronCutQA::AddEventFilter(AliAnalysisFilter *eventFilter)
{
  //
  // add track filter cuts to the qa histogram
  //


  TIter listIterator(eventFilter->GetCuts());
  while (AliAnalysisCuts *thisCut = (AliAnalysisCuts*) listIterator()) {
    Bool_t addCut=kTRUE;

    // add new cut class to the array
    if(addCut) {
      fCutNames[fNCuts[kEvent]][kEvent]=thisCut->GetTitle();
      //      printf("add cut %s to %d \n",thisCut->GetTitle(),fNCuts[kEvent]);
      fNCuts[kEvent]++;
    }

  } // trk filter loop

}

//_____________________________________________________________________
void AliDielectronCutQA::Fill(UInt_t mask, TObject *obj)
{
  //
  // fill the corresponding step in the qa histogram
  //

  UInt_t idx = GetObjIndex(obj);

  Int_t cutstep=1;
  for (Int_t iCut=0; iCut<fNCuts[idx]-1;++iCut) {
    //    UInt_t cutMask=1<<iCut;         // for each cut
    UInt_t cutMask=(1<<(iCut+1))-1; // increasing cut match

    if ((mask&cutMask)==cutMask) {
      fCutQA[idx]->Fill(cutstep);
      ++cutstep;
    }

  }

}

//_____________________________________________________________________
void AliDielectronCutQA::FillAll(TObject *obj)
{
  //
  // fill the corresponding step in the qa histogram
  //

  UInt_t idx = GetObjIndex(obj);
  fCutQA[idx]->Fill(0);

}

//______________________________________________________________________
UInt_t AliDielectronCutQA::GetObjIndex(TObject *obj)
{
  //
  // return the corresponding idex
  //
  //  printf("INFO: object type is a %s \n", obj->IsA()->GetName());
  if(obj->InheritsFrom(AliDielectronPair::Class())) return kPair;
  if(obj->InheritsFrom(AliVTrack::Class())        ) return kTrack;
  if(obj->InheritsFrom(AliVParticle::Class())     ) return kTrack;
  if(obj->InheritsFrom(AliVEvent::Class())        ) return kEvent;
  printf("FATAL: object type %s not yet supported, please let the author know\n", obj->IsA()->GetName());
  return -1;
  //TODO complete

}




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