L1phase shift corrected
[u/mrichter/AliRoot.git] / CORRFW / AliCFEventGenCuts.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, 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 // Cut on the Event at generator level: for the moment just 
16 // the requirements on the MB process type, number of tracks and on 
17 // the 3-D vertex position are implemented
18 // The argument of IsSelected member function (passed object) is cast into 
19 // an AliMCEvent. In the future may be modified to use AliVEvent interface
20 // and include more cut variables.
21 // The class derives from AliCFCutBase
22 // Author:S.Arcelli Silvia.Arcelli@cern.ch
23
24 #include "TBits.h"
25 #include "TList.h"
26 #include "AliLog.h"
27 #include "AliMCEvent.h"
28 #include <AliGenEventHeader.h>
29 #include <AliGenPythiaEventHeader.h>
30 #include <AliGenCocktailEventHeader.h>
31 #include "AliCFEventGenCuts.h"
32
33 ClassImp(AliCFEventGenCuts) 
34 //____________________________________________________________________
35 AliCFEventGenCuts::AliCFEventGenCuts() : 
36   AliCFCutBase(),
37   fMBProcType(-1),
38   fNTracksMin(-1),
39   fNTracksMax(100000),
40   fRequireVtxCuts(kFALSE),
41   fVtxXMax(1.e99),
42   fVtxYMax(1.e99),
43   fVtxZMax(1.e99),
44   fVtxXMin(-1.e99),
45   fVtxYMin(-1.e99),
46   fVtxZMin(-1.e99),
47   fBitMap(0x0)
48 {
49   //
50   //ctor
51   //
52   fBitMap=new TBits(0);
53 }
54 //____________________________________________________________________
55 AliCFEventGenCuts::AliCFEventGenCuts(Char_t* name, Char_t* title) : 
56   AliCFCutBase(name,title),
57   fMBProcType(-1),
58   fNTracksMin(-1),
59   fNTracksMax(100000),
60   fRequireVtxCuts(kFALSE),
61   fVtxXMax(1.e99),
62   fVtxYMax(1.e99),
63   fVtxZMax(1.e99),
64   fVtxXMin(-1.e99),
65   fVtxYMin(-1.e99),
66   fVtxZMin(-1.e99),
67   fBitMap(0x0)
68  {
69   //
70   //ctor
71   //
72   fBitMap=new TBits(0);
73  }
74 //____________________________________________________________________
75 AliCFEventGenCuts::AliCFEventGenCuts(const AliCFEventGenCuts& c) : 
76   AliCFCutBase(c),
77   fMBProcType(c.fMBProcType),
78   fNTracksMin(c.fNTracksMin),
79   fNTracksMax(c.fNTracksMax),
80   fRequireVtxCuts(c.fRequireVtxCuts),
81   fVtxXMax(c.fVtxXMax),
82   fVtxYMax(c.fVtxYMax),
83   fVtxZMax(c.fVtxZMax),
84   fVtxXMin(c.fVtxXMin),
85   fVtxYMin(c.fVtxYMin),
86   fVtxZMin(c.fVtxZMin),
87   fBitMap(c.fBitMap)
88  
89 {
90   //
91   //copy constructor
92   //
93 }
94 //____________________________________________________________________
95 AliCFEventGenCuts::~AliCFEventGenCuts() {
96   //
97   //dtor
98   //
99
100   if(fBitMap)delete fBitMap;
101 }
102 //____________________________________________________________________
103 AliCFEventGenCuts& AliCFEventGenCuts::operator=(const AliCFEventGenCuts& c)
104 {
105   //
106   // Assignment operator
107   //
108   if (this != &c) {
109     AliCFCutBase::operator=(c) ;
110     fMBProcType=c.fMBProcType;
111     fNTracksMin=c.fNTracksMin;
112     fNTracksMax=c.fNTracksMax;
113     fRequireVtxCuts=c.fRequireVtxCuts;
114     fVtxXMax=c.fVtxXMax;
115     fVtxYMax=c.fVtxYMax;
116     fVtxZMax=c.fVtxZMax;
117     fVtxXMin=c.fVtxXMin;
118     fVtxYMin=c.fVtxYMin;
119     fVtxZMin=c.fVtxZMin;
120     fBitMap=c.fBitMap;
121   }
122   return *this ;
123 }
124 //____________________________________________________________________
125 Bool_t AliCFEventGenCuts::IsSelected(TObject* obj) {
126   //
127   //Check if the requested cuts are passed
128   //
129
130   SelectionBitMap(obj);
131
132   Bool_t isSelected = kTRUE;
133
134   for (UInt_t icut=0; icut<fBitMap->GetNbits();icut++)
135         if(!fBitMap->TestBitNumber(icut)) isSelected = kFALSE;
136
137   return isSelected;
138
139 }
140
141 //____________________________________________________________________
142 void AliCFEventGenCuts::SelectionBitMap(TObject* obj){
143   //
144   //cut on the MB process type, the number of charged and neutral 
145   //tracks and on the event vertex. So far specific to AliMCEvents
146   //
147
148   //Check if the requested cuts are passed and return a bitmap
149   for(Int_t j=0;j<kNCuts;j++)fBitMap->SetBitNumber(j,kFALSE);
150   AliMCEvent* ev = dynamic_cast<AliMCEvent *>(obj);
151   if ( !ev ) return;
152   AliGenEventHeader*genHeader = ev->GenEventHeader();  
153
154
155   fBitMap->SetBitNumber(0,kTRUE);
156   if(fMBProcType>-1){
157     Int_t process=ProcType(genHeader);
158     if(process==-1){
159       AliInfo(Form(" not a pythia event, not checking on the process type"));
160     }else{
161
162       switch (fMBProcType)  {
163       case kND:
164         {
165           if (!( process!=92 && process!=93 && process!=94))
166             fBitMap->SetBitNumber(0,kFALSE);
167           break;
168         }
169       case kSD:
170         {
171           if (!( process==92 || process==93))
172             fBitMap->SetBitNumber(0,kFALSE);
173           break;
174         }
175       case kDD:
176         {
177           if (!( process==94))
178             fBitMap->SetBitNumber(0,kFALSE);
179           break;
180         }
181       }
182     }
183   }
184
185
186   //Number of charged+neutral tracks:
187   Int_t nTracks = ev->GetNumberOfTracks();
188   fBitMap->SetBitNumber(1,kTRUE); //assume it is ok...
189   if(nTracks<fNTracksMin || nTracks>fNTracksMax)
190     fBitMap->SetBitNumber(1,kFALSE); 
191
192   //now check the vertex cuts
193   for(Int_t j=2;j<kNCuts;j++)fBitMap->SetBitNumber(j,kTRUE);
194
195   TArrayF vtxPos(3);
196   genHeader->PrimaryVertex(vtxPos);    
197
198   if(fRequireVtxCuts){
199     // Apply the cut
200     if (vtxPos[0]>fVtxXMax || vtxPos[0]<fVtxXMin)
201       fBitMap->SetBitNumber(2,kFALSE); 
202     if (vtxPos[1]>fVtxYMax || vtxPos[1]<fVtxYMin)
203       fBitMap->SetBitNumber(3,kFALSE); 
204     if (vtxPos[2]>fVtxZMax || vtxPos[2]<fVtxZMin)
205       fBitMap->SetBitNumber(4,kFALSE); 
206   }  
207   return;
208 }
209
210  //______________________________________________________________________
211 Bool_t AliCFEventGenCuts::IsMBProcType(AliMCEvent *ev, PrType iproc){
212   //
213   //returns the type of MB process (if pythia events)
214   //
215
216   if ( !ev ) return kFALSE ;
217
218   AliGenEventHeader*genHeader = ev->GenEventHeader();  
219
220   Int_t process=ProcType(genHeader);
221
222   switch (iproc)  {
223   case kND: //Non Diffractive: Actually what is checked is ALL - SD - DD
224     {
225       if ( process!=92 && process!=93 && process!=94)
226         return kTRUE;
227     }
228     break;
229   case kSD: //Single Diffractive
230     {
231       if ( process==92 || process==93)
232         return kTRUE;
233     }
234     break;
235   case kDD: //Double Diffractive
236     {
237       if ( process==94)
238         return kTRUE;
239     }
240     break;
241   default: return kFALSE; break;
242   }
243   
244   return kFALSE;
245 }
246  //____________________________________________________________________________
247 Int_t AliCFEventGenCuts::ProcType(AliGenEventHeader *genHeader) {
248
249   //get the Pythia process type: if we are not dealing with pythia stuff, 
250   //return -1 and we do not apply the cut
251   //
252
253   // can only read pythia headers, either directly or from cocktalil header
254   AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
255
256   if (!pythiaGenHeader) {
257
258     AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
259     if (!genCocktailHeader) {
260       return -1;
261     }
262
263     TList* headerList = genCocktailHeader->GetHeaders();
264     if (!headerList) {
265       return -1;
266     }
267
268     for (Int_t i=0; i<headerList->GetEntries(); i++) {
269       pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
270       if (pythiaGenHeader)
271         break;
272     }
273
274     if (!pythiaGenHeader) {
275       return -1;
276     }
277   }
278   
279   Int_t process=pythiaGenHeader->ProcessType();
280   return process;
281 }
282