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

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// Event cut class for the TRD Performance Train                          //
//                                                                        //
// Encapsulation of events cuts for usage with TRD performance train      //
// - reconstructed vertex                                                 //
// - vertex Z position                                                    //
// - vertex number of contributors                                        //
// - trigger selection list                                               //
//                                                                        //
// *) see constructor for default values                                  //
//                                                                        //
// author                                                                 //
// Markus Fasel <m.fasel@gsi.de>                                          //
//                                                                        //
////////////////////////////////////////////////////////////////////////////


#include <TIterator.h>
#include <TMath.h>
#include <TObjArray.h>
#include <TObjString.h>
#include <TString.h>

#include "AliLog.h"
#include "AliESDEvent.h"
#include "AliESDVertex.h"

#include "AliTRDeventInfo.h"
#include "AliTRDeventCuts.h"

ClassImp(AliTRDeventCuts)

//______________________________________________________________
AliTRDeventCuts::AliTRDeventCuts()
  :TNamed("trdEventCuts", "")
  ,fTriggerNames(NULL)
  ,fBunches(NULL)
  ,fEventType(7)
  ,fVertexN(1)
  ,fVertexZ(15.)
{
  //
  // Dummy Constructor
  //
  
}

//______________________________________________________________
AliTRDeventCuts::AliTRDeventCuts(const Char_t *name)
  :TNamed(name, "")
  ,fTriggerNames(NULL)
  ,fBunches(NULL)
  ,fEventType(7)
  ,fVertexN(1)
  ,fVertexZ(15.)
{
  //
  // Default Constructor
  //
}

//______________________________________________________________
AliTRDeventCuts::AliTRDeventCuts(const AliTRDeventCuts &ref)
  :TNamed((TNamed&)ref)
  ,fTriggerNames(NULL)
  ,fBunches(NULL)
  ,fEventType(ref.fEventType)
  ,fVertexN(ref.fVertexN)
  ,fVertexZ(ref.fVertexZ)
{
// Copy constructor
  if(ref.fTriggerNames){
    for(Int_t it(0); it<ref.fTriggerNames->GetEntriesFast(); it++) AddTrigger(((TObjString*)(*ref.fTriggerNames)[it])->GetName());
  }
  if(ref.fBunches) SetBunchSelection(AliTRDeventInfo::kLHCbunches, ref.fBunches);
}

//______________________________________________________________
AliTRDeventCuts::~AliTRDeventCuts()
{
// Destructor

  if(fTriggerNames) fTriggerNames->Delete();
  delete fTriggerNames;
  if(fBunches) delete [] fBunches;
}

//______________________________________________________________
Bool_t AliTRDeventCuts::IsSelected(AliESDEvent *ev, Bool_t col)
{
// Apply cuts

  Bool_t select = kTRUE;
  if(fTriggerNames){
    Bool_t passTrigger = kFALSE; 
    TString trgname = ev->GetFiredTriggerClasses();
    TObjArray *triggers = trgname.Tokenize(" ");
    TIterator *trgIter = triggers->MakeIterator(); 
    TObjString *trg(NULL);
    while((trg = dynamic_cast<TObjString *>(trgIter->Next())))
      passTrigger = passTrigger || CheckTrigger(trg->String().Data());
    triggers->Delete(); delete triggers; delete trgIter;
    select = select && passTrigger;
  }
  if(!select){
    AliDebug(1, Form("Reject Ev[%d] for trigger[%s]", ev->GetEventNumberInFile(), ev->GetFiredTriggerClasses().Data()));
    return select;
  }
  // select only physical events
  select = select && (ev->GetEventType() == fEventType);
  if(!select){
    AliDebug(1, Form("Reject Ev[%d] for EvType[%d]", ev->GetEventNumberInFile(), ev->GetEventType()));
    return select;
  }

  if(!col) return select;

  // vertex selection
  const AliESDVertex *primVtx = ev->GetPrimaryVertex();
  if(fVertexN > 0)
    select = select && (primVtx && primVtx->GetNContributors() >= fVertexN);
  if(fVertexZ >= 0.)
    select = select && (primVtx && TMath::Abs(primVtx->GetZ()) <= fVertexZ);
  if(!select){
    AliDebug(1, Form("Reject Ev[%d] for Vertex[%p][%d %6.2f]", ev->GetEventNumberInFile(), (void*)primVtx, primVtx?primVtx->GetNContributors():0, primVtx?TMath::Abs(primVtx->GetZ()):0));
    return select;
  }

  // bunch cross selection
  if(fBunches){
    Int_t evBC(ev->GetBunchCrossNumber()), ibc(0);
    Bool_t kFOUND(kFALSE);
    while(fBunches[ibc]>0){
      if(evBC==fBunches[ibc]){
        kFOUND = kTRUE;
        break;
      }
      ibc++;
    }
    select = select && kFOUND;
  }
  if(!select){
    AliDebug(1, Form("Reject Ev[%d] for BunchCross[%d]", ev->GetEventNumberInFile(), ev->GetBunchCrossNumber()));
    return select;
  }
  return select;
}

//______________________________________________________________
void AliTRDeventCuts::AddTrigger(const Char_t *name)
{
// Add trigger name according to the logbook

  if(!fTriggerNames) fTriggerNames = new TObjArray;
  if(CheckTrigger(name)) return;
  fTriggerNames->Add(new TObjString(name));
}

//______________________________________________________________
Bool_t AliTRDeventCuts::CheckTrigger(const Char_t *name)
{
// check if trigger with id "name" is on the accepted trigger list

  if(!fTriggerNames) return kFALSE;
  Bool_t kExists(kFALSE);
  for(Int_t it(0); it<fTriggerNames->GetEntriesFast(); it++){
    if(((TObjString*)(*fTriggerNames)[it])->String().CompareTo(name)==0){
      kExists = kTRUE;
      break;
    }
  }
  return kExists;
}


//______________________________________________________________
void AliTRDeventCuts::Print(Option_t */*opt*/) const
{
// Print content of event cuts
  printf("Event Type       : %2d\n", fEventType);
  printf("Vertex  selection: N[%2d] Z[cm]=%6.2f\n", fVertexN, fVertexZ);
  if(fTriggerNames){
    printf("Trigger selection: ");
    for(Int_t it(0); it<fTriggerNames->GetEntriesFast(); it++) printf("\"%s\" ", ((TObjString*)(*fTriggerNames)[it])->GetName());
    printf("\n");
  }
  if(fBunches){
    printf("Bunches selection: ");
    for(Int_t ibc(0); ibc<AliTRDeventInfo::kLHCbunches; ibc++){
      if(fBunches[ibc]<0) break;
      printf("%4d ", fBunches[ibc]);
    }
    printf("\n");
  }
}

//______________________________________________________________
void AliTRDeventCuts::SetBunchSelection(Int_t n, Int_t bunches[])
{
// Set Bunch selection for run
  if(!fBunches) fBunches = new Int_t[AliTRDeventInfo::kLHCbunches];
  for(Int_t ibc(0); ibc<AliTRDeventInfo::kLHCbunches; ibc++) fBunches[ibc] = ibc<n?bunches[ibc]:-1;
}

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