1 #include "AliConversionSelection.h"
2 #include "AliAODHeader.h"
4 #include "AliMultiplicity.h"
8 // Author Daniel Lohner (Daniel.Lohner@cern.ch)
12 ClassImp(AliConversionSelection)
15 //________________________________________________________________________
16 AliConversionSelection::AliConversionSelection(AliConversionCuts *convCut) : TObject(),
19 fConversionCut(convCut),
31 fCurrentEventNumber(0)
34 fInvMassRange=new Double_t[2];
35 fInvMassRange[0]=0.05;
38 //________________________________________________________________________
39 AliConversionSelection::~AliConversionSelection(){
54 delete fPi0Candidates;
67 //________________________________________________________________________
68 Bool_t AliConversionSelection::ProcessEvent(TClonesArray *photons,AliVEvent *inputEvent,AliMCEvent *mcEvent){
69 fInputEvent=inputEvent;
73 Int_t eventnumber=GetEventNumber(inputEvent);
74 if(eventnumber==fCurrentEventNumber){
75 AliWarning("Event already analyzed! Return.");
79 fCurrentEventNumber=eventnumber;
82 // Initialize and Reset Arrays
83 if(fGoodGammas == NULL){
84 fGoodGammas=new TObjArray(30);
88 if(fPi0Candidates == NULL){
89 fPi0Candidates = new TClonesArray("AliAODConversionMother",100);
91 fPi0Candidates->Delete();
94 fBGPi0s = new TClonesArray("AliAODConversionMother",100);
99 if(!photons||!fInputEvent)return kFALSE;
101 if(!fConversionCut->EventIsSelected(fInputEvent,fMCEvent))return kFALSE;
104 for(Int_t i = 0; i < photons->GetEntriesFast(); i++) {
105 AliAODConversionPhoton* gamma =dynamic_cast<AliAODConversionPhoton*>(photons->At(i));
107 if(!fConversionCut->PhotonIsSelected(gamma,fInputEvent))continue;
108 fGoodGammas->Add(gamma);
112 if(fConversionCut->UseMCPSmearing() && fMCEvent){
113 fUnsmearedPx = new Double_t[fGoodGammas->GetEntries()]; // Store unsmeared Momenta
114 fUnsmearedPy = new Double_t[fGoodGammas->GetEntries()];
115 fUnsmearedPz = new Double_t[fGoodGammas->GetEntries()];
116 fUnsmearedE = new Double_t[fGoodGammas->GetEntries()];
118 for(Int_t gamma=0;gamma<fGoodGammas->GetEntries();gamma++){ // Smear the AODPhotons in MC
119 fUnsmearedPx[gamma] = ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->Px();
120 fUnsmearedPy[gamma] = ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->Py();
121 fUnsmearedPz[gamma] = ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->Pz();
122 fUnsmearedE[gamma] = ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->E();
123 fConversionCut->SmearParticle(dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(gamma)));
127 // Reconstruct Pi0 and BG
128 CalculatePi0Candidates();
129 CalculateBackground();
130 if(fBGHandler)fBGHandler->AddEvent(fGoodGammas,fInputEvent);
133 if(fConversionCut->UseMCPSmearing() && fMCEvent){
134 for(Int_t gamma=0;gamma<fGoodGammas->GetEntries();gamma++){ // Smear the AODPhotons in MC
135 ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->SetPx(fUnsmearedPx[gamma]); // Reset Unsmeared Momenta
136 ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->SetPy(fUnsmearedPy[gamma]);
137 ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->SetPz(fUnsmearedPz[gamma]);
138 ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->SetE(fUnsmearedE[gamma]);
140 delete[] fUnsmearedPx; fUnsmearedPx = 0x0;
141 delete[] fUnsmearedPy; fUnsmearedPy = 0x0;
142 delete[] fUnsmearedPz; fUnsmearedPz = 0x0;
143 delete[] fUnsmearedE; fUnsmearedE = 0x0;
149 //________________________________________________________________________
150 AliAODConversionMother* AliConversionSelection::GetPi0(Int_t index){
152 if(index>=0&&index<GetNumberOfPi0s()){
153 return dynamic_cast<AliAODConversionMother*>(fPi0Candidates->At(index));
158 //________________________________________________________________________
159 AliAODConversionMother* AliConversionSelection::GetBG(Int_t index){
161 if(index>=0&&index<GetNumberOfBGs()){
162 return dynamic_cast<AliAODConversionMother*>(fBGPi0s->At(index));
167 //________________________________________________________________________
168 AliAODConversionPhoton* AliConversionSelection::GetPhoton(Int_t index){
170 if(index>=0&&index<GetNumberOfPhotons()){
171 return dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(index));
176 //________________________________________________________________________
177 void AliConversionSelection::CalculatePi0Candidates(){
180 if(fGoodGammas->GetEntriesFast()>1){
182 for(Int_t firstGammaIndex=0;firstGammaIndex<fGoodGammas->GetEntriesFast()-1;firstGammaIndex++){
184 AliAODConversionPhoton *gamma0=dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(firstGammaIndex));
188 for(Int_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fGoodGammas->GetEntriesFast();secondGammaIndex++){
190 AliAODConversionPhoton *gamma1=dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(secondGammaIndex));
192 //Check for same Electron ID
193 if(gamma0->GetTrackLabelPositive()==gamma1->GetTrackLabelPositive()||gamma0->GetTrackLabelNegative()==gamma1->GetTrackLabelNegative()
194 ||gamma0->GetTrackLabelNegative()==gamma1->GetTrackLabelPositive()||gamma0->GetTrackLabelPositive()==gamma1->GetTrackLabelNegative())continue;
196 AliAODConversionMother pi0cand(gamma0,gamma1);
197 pi0cand.SetLabels(firstGammaIndex,secondGammaIndex);
203 TParticle *mcgam0=gamma0->GetMCParticle(fMCEvent->Stack());
204 TParticle *mcgam1=gamma1->GetMCParticle(fMCEvent->Stack());
209 if(mcgam0->GetMother(0)==mcgam1->GetMother(0)){
211 pi0cand.SetMCLabel(mcgam0->GetMother(0));
216 if((fConversionCut->MesonIsSelected(&pi0cand))){
217 if(MesonInMassWindow(&pi0cand)){
220 new((*fPi0Candidates)[fPi0Candidates->GetEntriesFast()]) AliAODConversionMother(pi0cand);
228 //________________________________________________________________________
229 Bool_t AliConversionSelection::MesonInMassWindow(AliAODConversionMother *pi0cand)
231 if (pi0cand->M() > fInvMassRange[0] && pi0cand->M() < fInvMassRange[1] ){
237 //________________________________________________________________________
238 void AliConversionSelection::RotateParticle(AliAODConversionPhoton *gamma,Int_t nDegreesPMBackground){
241 fRandomizer=new TRandom3();
242 fRandomizer->SetSeed(0);
244 Double_t nRadiansPM = nDegreesPMBackground*TMath::Pi()/180;
245 Double_t rotationValue = fRandomizer->Rndm()*2*nRadiansPM + TMath::Pi()-nRadiansPM;
246 gamma->RotateZ(rotationValue);
249 //________________________________________________________________________
251 void AliConversionSelection::CalculateBackground(){
254 if(fConversionCut->UseRotationMethod()){
256 // Correct for the number of rotations
257 // BG is for rotation the same, except for factor NRotations
258 Double_t weight=1./Double_t(fConversionCut->NumberOfRotationEvents());
260 for(Int_t firstGammaIndex=0;firstGammaIndex<fGoodGammas->GetEntriesFast();firstGammaIndex++){
262 AliAODConversionPhoton *gamma0=dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(firstGammaIndex));
264 for(Int_t secondGammaIndex=firstGammaIndex+1;secondGammaIndex<fGoodGammas->GetEntriesFast();secondGammaIndex++){
265 AliAODConversionPhoton *gamma1=dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(secondGammaIndex));
266 if(!fConversionCut->PhotonIsSelected(gamma1,fInputEvent))continue;
267 for(Int_t nRandom=0;nRandom<fConversionCut->NumberOfRotationEvents();nRandom++){
269 RotateParticle(gamma1,fConversionCut->NDegreesRotation());
271 AliAODConversionMother BGcandidate(gamma0,gamma1);
273 if(fConversionCut->MesonIsSelected(&BGcandidate,kFALSE)){
274 if(MesonInMassWindow(&BGcandidate)){
276 new((*fBGPi0s)[fBGPi0s->GetEntriesFast()]) AliAODConversionMother(BGcandidate);
278 dynamic_cast<AliAODConversionMother*>(fBGPi0s->At(fBGPi0s->GetEntriesFast()-1))->SetWeight(weight);
289 if(fBGHandler==NULL){
290 fBGHandler=new AliConversionAODBGHandlerRP(fConversionCut->IsHeavyIon(),fConversionCut->UseTrackMultiplicity());
293 for(Int_t nEventsInBG=0;nEventsInBG <fBGHandler->GetNBGEvents(fGoodGammas,fInputEvent);nEventsInBG++){
295 AliGammaConversionPhotonVector *previousEventGammas = fBGHandler->GetBGGoodGammas(fGoodGammas,fInputEvent,nEventsInBG);
297 if(previousEventGammas){
299 // test weighted background
301 // Correct for the number of eventmixing:
302 // N gammas -> (N-1) + (N-2) +(N-3) ...+ (N-(N-1)) using sum formula sum(i)=N*(N-1)/2 -> N*(N-1)/2
303 // real combinations (since you cannot combine a photon with its own)
304 // but BG leads to N_{a}*N_{b} combinations
305 weight*=0.5*(Double_t(fGoodGammas->GetEntriesFast()-1))/Double_t(previousEventGammas->size());
307 for(Int_t iCurrent=0;iCurrent<fGoodGammas->GetEntriesFast();iCurrent++){
309 AliAODConversionPhoton *gamma0 = (AliAODConversionPhoton*)(fGoodGammas->At(iCurrent));
311 for(UInt_t iPrevious=0;iPrevious<previousEventGammas->size();iPrevious++){
313 AliAODConversionPhoton *gamma1 = (AliAODConversionPhoton*)(previousEventGammas->at(iPrevious));
315 AliAODConversionMother BGcandidate(gamma0,gamma1);
317 if(fConversionCut->MesonIsSelected(&BGcandidate,kFALSE)){
318 if(MesonInMassWindow(&BGcandidate)){
320 new((*fBGPi0s)[fBGPi0s->GetEntriesFast()]) AliAODConversionMother(BGcandidate);
321 dynamic_cast<AliAODConversionMother*>(fBGPi0s->At(fBGPi0s->GetEntriesFast()-1))->SetWeight(weight);
330 //________________________________________________________________________
331 Double_t AliConversionSelection::GetMultiplicity(AliVEvent *inputEvent){
333 switch(fConversionCut->GetMultiplicityMethod())
336 return Double_t(GetNumberOfPhotons());
338 return Double_t(GetNumberOfChargedTracks(inputEvent));
340 return GetVZEROMult(inputEvent);
342 return GetSPDMult(inputEvent);
344 return 1; // if mult is used as a weight, this number can be used to switch off weighting
350 //________________________________________________________________________
351 Int_t AliConversionSelection::GetNumberOfChargedTracks(AliVEvent *inputEvent){
355 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(inputEvent);
358 fESDTrackCuts= AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE);
359 fESDTrackCuts->SetMaxDCAToVertexZ(2);
360 Double_t etamax=fConversionCut->GetEtaCut();
361 fESDTrackCuts->SetEtaRange(-etamax, etamax);
362 fESDTrackCuts->SetPtRange(0.15);
364 for(Int_t iTracks = 0; iTracks < inputEvent->GetNumberOfTracks(); iTracks++){
365 AliESDtrack* currentTrack = esdEvent->GetTrack(iTracks);
366 if(!currentTrack) continue;
367 if(fESDTrackCuts->AcceptTrack(currentTrack))ntracks++;
370 for(Int_t ii=0; ii<inputEvent->GetNumberOfTracks(); ii++) {
371 AliVTrack * track = dynamic_cast<AliVTrack*>(inputEvent->GetTrack(ii));
372 if(TMath::Abs(track->Eta())>fConversionCut->GetEtaCut())continue;
380 //________________________________________________________________________
381 Double_t AliConversionSelection::GetVZEROMult(AliVEvent *inputEvent){
383 AliVVZERO *vzero=inputEvent->GetVZEROData();
384 Double_t multV0A=vzero->GetMTotV0A();
385 Double_t multV0C=vzero->GetMTotV0C();
386 Double_t mult=multV0A+multV0C;
391 //________________________________________________________________________
392 Double_t AliConversionSelection::GetSPDMult(AliVEvent *inputEvent){
394 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(inputEvent);
396 const AliMultiplicity *esdmult=esdEvent->GetMultiplicity();
397 return esdmult->GetNumberOfITSClusters(1);
399 // AOD implementation
400 AliAODHeader *header=(AliAODHeader*)inputEvent->GetHeader();
401 return header->GetNumberOfITSClusters(1);
406 //________________________________________________________________________
407 Int_t AliConversionSelection::GetEventNumber(AliVEvent *inputEvent){
409 AliESDEvent * esdEvent = dynamic_cast<AliESDEvent*>(inputEvent);
411 return esdEvent->GetEventNumberInFile();
414 AliAODHeader *header=(AliAODHeader*)inputEvent->GetHeader();
415 return header->GetEventNumberESDFile();