ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, 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 on the Event at generator level: for the moment just 
// the requirements on the MB process type, number of tracks and on 
// the 3-D vertex position are implemented
// The argument of IsSelected member function (passed object) is cast into 
// an AliMCEvent. In the future may be modified to use AliVEvent interface
// and include more cut variables.
// The class derives from AliCFCutBase
// Author:S.Arcelli Silvia.Arcelli@cern.ch

#include "TBits.h"
#include "TList.h"
#include "AliLog.h"
#include "AliMCEvent.h"
#include <AliGenEventHeader.h>
#include <AliGenPythiaEventHeader.h>
#include <AliGenCocktailEventHeader.h>
#include "AliCFEventGenCuts.h"

ClassImp(AliCFEventGenCuts) 
//____________________________________________________________________
AliCFEventGenCuts::AliCFEventGenCuts() : 
  AliCFCutBase(),
  fMBProcType(-1),
  fNTracksMin(-1),
  fNTracksMax(100000),
  fRequireVtxCuts(kFALSE),
  fVtxXMax(1.e99),
  fVtxYMax(1.e99),
  fVtxZMax(1.e99),
  fVtxXMin(-1.e99),
  fVtxYMin(-1.e99),
  fVtxZMin(-1.e99),
  fBitMap(0x0)
{
  //
  //ctor
  //
  fBitMap=new TBits(0);
}
//____________________________________________________________________
AliCFEventGenCuts::AliCFEventGenCuts(Char_t* name, Char_t* title) : 
  AliCFCutBase(name,title),
  fMBProcType(-1),
  fNTracksMin(-1),
  fNTracksMax(100000),
  fRequireVtxCuts(kFALSE),
  fVtxXMax(1.e99),
  fVtxYMax(1.e99),
  fVtxZMax(1.e99),
  fVtxXMin(-1.e99),
  fVtxYMin(-1.e99),
  fVtxZMin(-1.e99),
  fBitMap(0x0)
 {
  //
  //ctor
  //
  fBitMap=new TBits(0);
 }
//____________________________________________________________________
AliCFEventGenCuts::AliCFEventGenCuts(const AliCFEventGenCuts& c) : 
  AliCFCutBase(c),
  fMBProcType(c.fMBProcType),
  fNTracksMin(c.fNTracksMin),
  fNTracksMax(c.fNTracksMax),
  fRequireVtxCuts(c.fRequireVtxCuts),
  fVtxXMax(c.fVtxXMax),
  fVtxYMax(c.fVtxYMax),
  fVtxZMax(c.fVtxZMax),
  fVtxXMin(c.fVtxXMin),
  fVtxYMin(c.fVtxYMin),
  fVtxZMin(c.fVtxZMin),
  fBitMap(c.fBitMap)
 
{
  //
  //copy constructor
  //
}
//____________________________________________________________________
AliCFEventGenCuts::~AliCFEventGenCuts() {
  //
  //dtor
  //

  if(fBitMap)delete fBitMap;
}
//____________________________________________________________________
AliCFEventGenCuts& AliCFEventGenCuts::operator=(const AliCFEventGenCuts& c)
{
  //
  // Assignment operator
  //
  if (this != &c) {
    AliCFCutBase::operator=(c) ;
    fMBProcType=c.fMBProcType;
    fNTracksMin=c.fNTracksMin;
    fNTracksMax=c.fNTracksMax;
    fRequireVtxCuts=c.fRequireVtxCuts;
    fVtxXMax=c.fVtxXMax;
    fVtxYMax=c.fVtxYMax;
    fVtxZMax=c.fVtxZMax;
    fVtxXMin=c.fVtxXMin;
    fVtxYMin=c.fVtxYMin;
    fVtxZMin=c.fVtxZMin;
    fBitMap=c.fBitMap;
  }
  return *this ;
}
//____________________________________________________________________
Bool_t AliCFEventGenCuts::IsSelected(TObject* obj) {
  //
  //Check if the requested cuts are passed
  //

  SelectionBitMap(obj);

  Bool_t isSelected = kTRUE;

  for (UInt_t icut=0; icut<fBitMap->GetNbits();icut++)
	if(!fBitMap->TestBitNumber(icut)) isSelected = kFALSE;

  return isSelected;

}

//____________________________________________________________________
void AliCFEventGenCuts::SelectionBitMap(TObject* obj){
  //
  //cut on the MB process type, the number of charged and neutral 
  //tracks and on the event vertex. So far specific to AliMCEvents
  //

  //Check if the requested cuts are passed and return a bitmap
  for(Int_t j=0;j<kNCuts;j++)fBitMap->SetBitNumber(j,kFALSE);
  AliMCEvent* ev = dynamic_cast<AliMCEvent *>(obj);
  if ( !ev ) return;
  AliGenEventHeader*genHeader = ev->GenEventHeader();  


  fBitMap->SetBitNumber(0,kTRUE);
  if(fMBProcType>-1){
    Int_t process=ProcType(genHeader);
    if(process==-1){
      AliInfo(Form(" not a pythia event, not checking on the process type"));
    }else{

      switch (fMBProcType)  {
      case kND:
	{
	  if (!( process!=92 && process!=93 && process!=94))
	    fBitMap->SetBitNumber(0,kFALSE);
	  break;
	}
      case kSD:
	{
	  if (!( process==92 || process==93))
	    fBitMap->SetBitNumber(0,kFALSE);
	  break;
	}
      case kDD:
	{
	  if (!( process==94))
	    fBitMap->SetBitNumber(0,kFALSE);
	  break;
	}
      }
    }
  }


  //Number of charged+neutral tracks:
  Int_t nTracks = ev->GetNumberOfTracks();
  fBitMap->SetBitNumber(1,kTRUE); //assume it is ok...
  if(nTracks<fNTracksMin || nTracks>fNTracksMax)
    fBitMap->SetBitNumber(1,kFALSE); 

  //now check the vertex cuts
  for(Int_t j=2;j<kNCuts;j++)fBitMap->SetBitNumber(j,kTRUE);

  TArrayF vtxPos(3);
  genHeader->PrimaryVertex(vtxPos);    

  if(fRequireVtxCuts){
    // Apply the cut
    if (vtxPos[0]>fVtxXMax || vtxPos[0]<fVtxXMin)
      fBitMap->SetBitNumber(2,kFALSE); 
    if (vtxPos[1]>fVtxYMax || vtxPos[1]<fVtxYMin)
      fBitMap->SetBitNumber(3,kFALSE); 
    if (vtxPos[2]>fVtxZMax || vtxPos[2]<fVtxZMin)
      fBitMap->SetBitNumber(4,kFALSE); 
  }  
  return;
}

 //______________________________________________________________________
Bool_t AliCFEventGenCuts::IsMBProcType(AliMCEvent *ev, PrType iproc){
  //
  //returns the type of MB process (if pythia events)
  //

  if ( !ev ) return kFALSE ;

  AliGenEventHeader*genHeader = ev->GenEventHeader();  

  Int_t process=ProcType(genHeader);

  switch (iproc)  {
  case kND: //Non Diffractive: Actually what is checked is ALL - SD - DD
    {
      if ( process!=92 && process!=93 && process!=94)
	return kTRUE;
    }
    break;
  case kSD: //Single Diffractive
    {
      if ( process==92 || process==93)
	return kTRUE;
    }
    break;
  case kDD: //Double Diffractive
    {
      if ( process==94)
	return kTRUE;
    }
    break;
  default: return kFALSE; break;
  }
  
  return kFALSE;
}
 //____________________________________________________________________________
Int_t AliCFEventGenCuts::ProcType(AliGenEventHeader *genHeader) {

  //get the Pythia process type: if we are not dealing with pythia stuff, 
  //return -1 and we do not apply the cut
  //

  // can only read pythia headers, either directly or from cocktalil header
  AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);

  if (!pythiaGenHeader) {

    AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
    if (!genCocktailHeader) {
      return -1;
    }

    TList* headerList = genCocktailHeader->GetHeaders();
    if (!headerList) {
      return -1;
    }

    for (Int_t i=0; i<headerList->GetEntries(); i++) {
      pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
      if (pythiaGenHeader)
        break;
    }

    if (!pythiaGenHeader) {
      return -1;
    }
  }
  
  Int_t process=pythiaGenHeader->ProcessType();
  return process;
}

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