1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 //_________________________________________________________________________
18 // Class for reading data (Kinematics) in order to do prompt gamma
19 // or other particle identification and correlations
20 // Separates generated particles into charged (CTS)
21 // and neutral (PHOS or EMCAL acceptance)
23 //*-- Author: Gustavo Conesa (LNF-INFN)
24 //////////////////////////////////////////////////////////////////////////////
27 // --- ROOT system ---
29 #include <TParticle.h>
30 #include <TDatabasePDG.h>
33 #include "TParticle.h"
34 //#include "Riostream.h"
36 //---- ANALYSIS system ----
37 #include "AliCaloTrackMCReader.h"
38 #include "AliGenEventHeader.h"
40 #include "AliVCluster.h"
41 #include "AliAODTrack.h"
42 #include "AliAODEvent.h"
43 #include "AliFiducialCut.h"
44 #include "AliMCAnalysisUtils.h"
46 ClassImp(AliCaloTrackMCReader)
48 //____________________________________________________________________________
49 AliCaloTrackMCReader::AliCaloTrackMCReader() :
50 AliCaloTrackReader(), fDecayPi0(0),
51 fNeutralParticlesArray(0x0), fChargedParticlesArray(0x0),
52 fStatusArray(0x0), fKeepAllStatus(0), fCheckOverlap(0),
53 fEMCALOverlapAngle(0),fPHOSOverlapAngle(0), fIndex2ndPhoton(0)
57 //Initialize parameters
60 //_________________________________
61 AliCaloTrackMCReader::~AliCaloTrackMCReader() {
64 if(fChargedParticlesArray) delete fChargedParticlesArray ;
65 if(fNeutralParticlesArray) delete fNeutralParticlesArray ;
66 if(fStatusArray) delete fStatusArray ;
70 //____________________________________________________________________________
71 void AliCaloTrackMCReader::GetVertex(Double_t v[3]) const {
72 //Return vertex position
75 GetGenEventHeader()->PrimaryVertex(pv);
82 //_______________________________________________________________
83 void AliCaloTrackMCReader::InitParameters()
86 //Initialize the parameters of the analysis.
90 fChargedParticlesArray = new TArrayI(1);
91 fChargedParticlesArray->SetAt(11,0);
92 //Int_t pdgarray[]={12,14,16};// skip neutrinos
93 //fNeutralParticlesArray = new TArrayI(3, pdgarray);
94 fNeutralParticlesArray = new TArrayI(3);
95 fNeutralParticlesArray->SetAt(12,0); fNeutralParticlesArray->SetAt(14,1); fNeutralParticlesArray->SetAt(16,2);
96 fStatusArray = new TArrayI(1);
97 fStatusArray->SetAt(1,0);
99 fKeepAllStatus = kTRUE;
101 fCheckOverlap = kFALSE;
102 fEMCALOverlapAngle = 2.5 * TMath::DegToRad();
103 fPHOSOverlapAngle = 0.5 * TMath::DegToRad();
104 fIndex2ndPhoton = -1;
108 fReadAODMCParticles = kFALSE;
110 //For this reader we own the objects of the arrays
111 fAODCTS->SetOwner(kTRUE);
112 fAODEMCAL->SetOwner(kTRUE);
113 fAODPHOS->SetOwner(kTRUE);
117 //____________________________________________________________________________
118 void AliCaloTrackMCReader::CheckOverlap(const Float_t anglethres, const Int_t imom, Int_t & iPrimary, Int_t & index, TLorentzVector & mom, Int_t & pdg) {
119 //Check overlap of decay photons
120 if( fIndex2ndPhoton==iPrimary ){
124 else fIndex2ndPhoton=-1;
129 TLorentzVector ph1, ph2;
130 TParticle *meson = GetStack()->Particle(imom);
131 Int_t mepdg = meson->GetPdgCode();
132 Int_t idaug1 = meson->GetFirstDaughter();
133 if((mepdg == 111 || mepdg == 221 ) && meson->GetNDaughters() == 2){ //Check only decay in 2 photons
134 TParticle * d1 = GetStack()->Particle(idaug1);
135 TParticle *d2 = GetStack()->Particle(idaug1+1);
136 if(d1->GetPdgCode() == 22 && d2->GetPdgCode() == 22 ){
139 //printf("angle %2.2f\n",ph1.Angle(ph2.Vect()));
141 if(anglethres > ph1.Angle(ph2.Vect())){
145 meson->Momentum(mom);
146 //printf("Overlap:: pt %2.2f, phi %2.2f, eta %2.2f\n",mom.Pt(),mom.Phi(),mom.Eta());
147 if(iPrimary == idaug1) iPrimary++; //skip next photon in list
150 //Do not check overlapping for next decay photon from same meson
151 if(iPrimary == idaug1) {fIndex2ndPhoton = idaug1+1;
156 }//Meson Decay with 2 photon daughters
159 //____________________________________________________________________________
160 void AliCaloTrackMCReader::FillCalorimeters(Int_t & iParticle, TParticle* particle, TLorentzVector &momentum) {
161 //Fill AODCaloClusters or TParticles lists of PHOS or EMCAL
163 if(fFillPHOS && momentum.Pt() > fPHOSPtMin){
165 if(fCheckFidCut && !fFiducialCut->IsInFiducialCut(momentum,"PHOS")) return;
167 Int_t index = iParticle ;
168 Int_t pdg = TMath::Abs(particle->GetPdgCode());
170 CheckOverlap(fPHOSOverlapAngle,particle->GetFirstMother(),index, iParticle, momentum, pdg);
172 Char_t ttype= AliVCluster::kPHOSNeutral;
173 Int_t labels[] = {index};
174 Float_t x[] = {momentum.X(), momentum.Y(), momentum.Z()};
175 //Create object and write it to file
176 AliAODCaloCluster *calo = new AliAODCaloCluster(index,1,labels,momentum.E(), x, NULL, ttype, 0);
178 SetCaloClusterPID(pdg,calo) ;
179 if(fDebug > 3 && momentum.Pt() > 0.2)
180 printf("AliCaloTrackMCReader::FillCalorimeters() - PHOS : Selected cluster %s E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
181 particle->GetName(),momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
182 fAODPHOS->Add(calo);//reference the selected object to the list
186 if(fFillEMCAL && momentum.Pt() > fEMCALPtMin){
188 if(fCheckFidCut && !fFiducialCut->IsInFiducialCut(momentum,"EMCAL")) return;
190 Int_t index = iParticle ;
191 Int_t pdg = TMath::Abs(particle->GetPdgCode());
194 CheckOverlap(fEMCALOverlapAngle,particle->GetFirstMother(),iParticle, index, momentum, pdg);
196 Char_t ttype= AliVCluster::kEMCALClusterv1;
197 Int_t labels[] = {index};
198 Float_t x[] = {momentum.X(), momentum.Y(), momentum.Z()};
199 //Create object and write it to file
200 AliAODCaloCluster *calo = new AliAODCaloCluster(iParticle,1,labels,momentum.E(), x, NULL, ttype, 0);
202 SetCaloClusterPID(pdg,calo) ;
203 if(fDebug > 3 && momentum.Pt() > 0.2)
204 printf("AliCaloTrackMCReader::FillCalorimeters() - EMCAL : Selected cluster %s E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
205 particle->GetName(),momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
206 fAODEMCAL->Add(calo);//reference the selected object to the list
210 //____________________________________________________________________________
211 Bool_t AliCaloTrackMCReader::FillInputEvent(const Int_t iEntry, const char * currentFileName){
212 //Fill the event counter and input lists that are needed, called by the analysis maker.
214 fEventNumber = iEntry;
215 fCurrentFileName = TString(currentFileName);
217 //In case of analysis of events with jets, skip those with jet pt > 5 pt hard
218 if(fComparePtHardAndJetPt && GetStack()) {
219 if(!ComparePtHardAndJetPt()) return kFALSE ;
225 Int_t iParticle = 0 ;
226 Double_t charge = 0.;
228 for (iParticle = 0 ; iParticle < GetStack()->GetNtrack() ; iParticle++) {
229 TParticle * particle = GetStack()->Particle(iParticle);
230 TLorentzVector momentum;
233 Int_t pdg = particle->GetPdgCode();
235 //Keep particles with a given status
236 if(KeepParticleWithStatus(particle->GetStatusCode()) && (particle->Pt() > 0) ){
238 //Skip bizarre particles, they crash when charge is calculated
239 // if(TMath::Abs(pdg) == 3124 || TMath::Abs(pdg) > 10000000) continue ;
241 charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge();
242 particle->Momentum(momentum);
243 //---------- Charged particles ----------------------
246 if(TMath::Abs(momentum.Eta())< fTrackMultEtaCut) fTrackMult++;
248 if(fFillCTS && (momentum.Pt() > fCTSPtMin)){
249 //Particles in CTS acceptance
251 if(fCheckFidCut && !fFiducialCut->IsInFiducialCut(momentum,"CTS")) continue;
253 if(TMath::Abs(pdg) == 11 && GetStack()->Particle(particle->GetFirstMother())->GetPdgCode()==22) continue ;
255 if(fDebug > 3 && momentum.Pt() > 0.2)
256 printf("AliCaloTrackMCReader::FillInputEvent() - CTS : Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
257 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
259 x[0] = particle->Vx(); x[1] = particle->Vy(); x[2] = particle->Vz();
260 p[0] = particle->Px(); p[1] = particle->Py(); p[2] = particle->Pz();
261 //Create object and write it to file
262 AliAODTrack *aodTrack = new AliAODTrack(0, iParticle, p, kTRUE, x, kFALSE,NULL, 0, 0,
265 kFALSE, // No fit performed
266 kFALSE, // No fit performed
267 AliAODTrack::kPrimary,
269 SetTrackChargeAndPID(pdg, aodTrack);
270 fAODCTS->Add(aodTrack);//reference the selected object to the list
272 //Keep some charged particles in calorimeters lists
273 if((fFillPHOS || fFillEMCAL) && KeepChargedParticles(pdg)) FillCalorimeters(iParticle, particle, momentum);
277 //-------------Neutral particles ----------------------
278 else if(charge == 0 && (fFillPHOS || fFillEMCAL)){
279 //Skip neutrinos or other neutral particles
280 //if(SkipNeutralParticles(pdg) || particle->IsPrimary()) continue ; // protection added (MG)
281 if(SkipNeutralParticles(pdg)) continue ;
282 //Fill particle/calocluster arrays
284 FillCalorimeters(iParticle, particle, momentum);
287 //Sometimes pi0 are stable for the generator, if needed decay it by hand
289 if(momentum.Pt() > fPHOSPtMin || momentum.Pt() > fEMCALPtMin){
290 TLorentzVector lvGamma1, lvGamma2 ;
291 //Double_t angle = 0;
294 MakePi0Decay(momentum,lvGamma1,lvGamma2);//,angle);
296 //Check if Pi0 is in the acceptance of the calorimeters, if aperture angle is small, keep it
297 TParticle * pPhoton1 = new TParticle(22,1,iParticle,0,0,0,lvGamma1.Px(),lvGamma1.Py(),
298 lvGamma1.Pz(),lvGamma1.E(),0,0,0,0);
299 TParticle * pPhoton2 = new TParticle(22,1,iParticle,0,0,0,lvGamma2.Px(),lvGamma2.Py(),
300 lvGamma2.Pz(),lvGamma2.E(),0,0,0,0);
301 //Fill particle/calocluster arrays
302 FillCalorimeters(iParticle,pPhoton1,lvGamma1);
303 FillCalorimeters(iParticle,pPhoton2,lvGamma2);
306 else FillCalorimeters(iParticle,particle, momentum); //Add the rest
309 } //particle with correct status
312 fIndex2ndPhoton = -1; //In case of overlapping studies, reset for each event
318 //________________________________________________________________
319 Bool_t AliCaloTrackMCReader::KeepParticleWithStatus(Int_t status) const {
320 //Check if status is equal to one of the list
321 //These particles will be used in analysis.
323 for(Int_t i= 0; i < fStatusArray->GetSize(); i++)
324 if(status == fStatusArray->At(i)) return kTRUE ;
333 //________________________________________________________________
334 Bool_t AliCaloTrackMCReader::KeepChargedParticles(Int_t pdg) const {
335 //Check if pdg is equal to one of the charged particles list
336 //These particles will be added to the calorimeters lists.
338 for(Int_t i= 0; i < fChargedParticlesArray->GetSize(); i++)
339 if(TMath::Abs(pdg) == fChargedParticlesArray->At(i)) return kTRUE ;
345 //________________________________________________________________
346 void AliCaloTrackMCReader::Print(const Option_t * opt) const
348 //Print some relevant parameters set for the analysis
352 AliCaloTrackReader::Print(opt);
354 printf("**** Print **** %s %s ****\n", GetName(), GetTitle() ) ;
356 printf("Decay Pi0? : %d\n", fDecayPi0) ;
357 printf("Check Overlap in Calo? : %d\n", fCheckOverlap) ;
358 printf("Keep all status? : %d\n", fKeepAllStatus) ;
360 if(!fKeepAllStatus) printf("Keep particles with status : ");
361 for(Int_t i= 0; i < fStatusArray->GetSize(); i++)
362 printf(" %d ; ", fStatusArray->At(i));
365 printf("Skip neutral particles in calo : ");
366 for(Int_t i= 0; i < fNeutralParticlesArray->GetSize(); i++)
367 printf(" %d ; ", fNeutralParticlesArray->At(i));
370 printf("Keep charged particles in calo : ");
371 for(Int_t i= 0; i < fChargedParticlesArray->GetSize(); i++)
372 printf(" %d ; ", fChargedParticlesArray->At(i));
377 //____________________________________________________________________________
378 void AliCaloTrackMCReader::MakePi0Decay(TLorentzVector &p0, TLorentzVector &p1,
379 TLorentzVector &p2) const {//, Double_t &angle) {
380 // Perform isotropic decay pi0 -> 2 photons
381 // p0 is pi0 4-momentum (inut)
382 // p1 and p2 are photon 4-momenta (output)
383 // cout<<"Boost vector"<<endl;
384 Double_t mPi0 = TDatabasePDG::Instance()->GetParticle(111)->Mass();
385 TVector3 b = p0.BoostVector();
386 //cout<<"Parameters"<<endl;
387 //Double_t mPi0 = p0.M();
388 Double_t phi = TMath::TwoPi() * gRandom->Rndm();
389 Double_t cosThe = 2 * gRandom->Rndm() - 1;
390 Double_t cosPhi = TMath::Cos(phi);
391 Double_t sinPhi = TMath::Sin(phi);
392 Double_t sinThe = TMath::Sqrt(1-cosThe*cosThe);
393 Double_t ePi0 = mPi0/2.;
394 //cout<<"ePi0 "<<ePi0<<endl;
395 //cout<<"Components"<<endl;
396 p1.SetPx(+ePi0*cosPhi*sinThe);
397 p1.SetPy(+ePi0*sinPhi*sinThe);
398 p1.SetPz(+ePi0*cosThe);
400 //cout<<"p1: "<<p1.Px()<<" "<<p1.Py()<<" "<<p1.Pz()<<" "<<p1.E()<<endl;
401 //cout<<"p1 Mass: "<<p1.Px()*p1.Px()+p1.Py()*p1.Py()+p1.Pz()*p1.Pz()-p1.E()*p1.E()<<endl;
402 p2.SetPx(-ePi0*cosPhi*sinThe);
403 p2.SetPy(-ePi0*sinPhi*sinThe);
404 p2.SetPz(-ePi0*cosThe);
406 //cout<<"p2: "<<p2.Px()<<" "<<p2.Py()<<" "<<p2.Pz()<<" "<<p2.E()<<endl;
407 //cout<<"p2 Mass: "<<p2.Px()*p2.Px()+p2.Py()*p2.Py()+p2.Pz()*p2.Pz()-p2.E()*p2.E()<<endl;
408 //cout<<"Boost "<<b.X()<<" "<<b.Y()<<" "<<b.Z()<<endl;
410 //cout<<"p1: "<<p1.Px()<<" "<<p1.Py()<<" "<<p1.Pz()<<" "<<p1.E()<<endl;
412 //cout<<"p2: "<<p2.Px()<<" "<<p2.Py()<<" "<<p2.Pz()<<" "<<p2.E()<<endl;
413 //cout<<"angle"<<endl;
414 //angle = p1.Angle(p2.Vect());
418 //____________________________________________________________________________
419 void AliCaloTrackMCReader::SetInputOutputMCEvent(AliVEvent* /*esd*/, AliAODEvent* aod, AliMCEvent* mc) {
420 // Connect the data pointer
426 //________________________________________________________________
427 Bool_t AliCaloTrackMCReader::SkipNeutralParticles(Int_t pdg) const {
428 //Check if pdg is equal to one of the neutral particles list
429 //These particles will be skipped from analysis.
431 for(Int_t i= 0; i < fNeutralParticlesArray->GetSize(); i++)
432 if(TMath::Abs(pdg) == fNeutralParticlesArray->At(i)) return kTRUE ;
439 //____________________________________________________________________
440 void AliCaloTrackMCReader::SetTrackChargeAndPID(const Int_t pdgCode, AliAODTrack *track) const {
441 //Give a PID weight for tracks equal to 1 depending on the particle type
443 Float_t pid[10] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
449 pid[AliAODTrack::kUnknown] = 1.;
454 track->SetCharge(-1);
455 pid[AliAODTrack::kElectron] = 1.;
460 track->SetCharge(+1);
461 pid[AliAODTrack::kElectron] = 1.;
466 track->SetCharge(-1);
467 pid[AliAODTrack::kMuon] = 1.;
472 track->SetCharge(+1);
473 pid[AliAODTrack::kMuon] = 1.;
479 pid[AliAODTrack::kUnknown] = 1.;
484 track->SetCharge(+1);
485 pid[AliAODTrack::kPion] = 1.;
490 track->SetCharge(-1);
491 pid[AliAODTrack::kPion] = 1.;
497 pid[AliAODTrack::kUnknown] = 1.;
502 track->SetCharge(+1);
503 pid[AliAODTrack::kKaon] = 1.;
508 track->SetCharge(-1);
509 pid[AliAODTrack::kKaon] = 1.;
515 pid[AliAODTrack::kUnknown] = 1.;
520 track->SetCharge(+1);
521 pid[AliAODTrack::kProton] = 1.;
525 case -2212: // anti-p
526 track->SetCharge(-1);
527 pid[AliAODTrack::kProton] = 1.;
533 pid[AliAODTrack::kUnknown] = 1.;
539 pid[AliAODTrack::kUnknown] = 1.;
543 case -311: // anti-K0
545 pid[AliAODTrack::kUnknown] = 1.;
551 pid[AliAODTrack::kUnknown] = 1.;
557 pid[AliAODTrack::kUnknown] = 1.;
562 track->SetCharge(+1);
563 pid[AliAODTrack::kUnknown] = 1.;
568 track->SetCharge(-1);
569 pid[AliAODTrack::kUnknown] = 1.;
574 track->SetCharge(-1);
575 pid[AliAODTrack::kUnknown] = 1.;
581 pid[AliAODTrack::kUnknown] = 1.;
586 track->SetCharge(-1);
587 pid[AliAODTrack::kUnknown] = 1.;
592 track->SetCharge(-1);
593 pid[AliAODTrack::kUnknown] = 1.;
599 pid[AliAODTrack::kUnknown] = 1.;
603 case -3122: // anti-Lambda
605 pid[AliAODTrack::kUnknown] = 1.;
609 case -3222: // anti-Sigma-
610 track->SetCharge(-1);
611 pid[AliAODTrack::kUnknown] = 1.;
615 case -3212: // anti-Sigma0
617 pid[AliAODTrack::kUnknown] = 1.;
621 case -3112: // anti-Sigma+
622 track->SetCharge(+1);
623 pid[AliAODTrack::kUnknown] = 1.;
627 case -3322: // anti-Xi0
629 pid[AliAODTrack::kUnknown] = 1.;
633 case -3312: // anti-Xi+
634 track->SetCharge(+1);
637 case -3334: // anti-Omega+
638 track->SetCharge(+1);
639 pid[AliAODTrack::kUnknown] = 1.;
644 track->SetCharge(+1);
645 pid[AliAODTrack::kUnknown] = 1.;
650 track->SetCharge(-1);
651 pid[AliAODTrack::kUnknown] = 1.;
657 pid[AliAODTrack::kUnknown] = 1.;
661 case -421: // anti-D0
663 pid[AliAODTrack::kUnknown] = 1.;
668 track->SetCharge(-99);
669 pid[AliAODTrack::kUnknown] = 1.;
678 //____________________________________________________________________
679 void AliCaloTrackMCReader::SetCaloClusterPID(const Int_t pdgCode, AliVCluster *calo) const {
680 //Give a PID weight for CaloClusters equal to 1 depending on the particle type
682 Float_t pid[13] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
687 pid[AliVCluster::kPhoton] = 1.;
692 pid[AliVCluster::kElectron] = 1.;
697 pid[AliVCluster::kElectron] = 1.;
702 pid[AliVCluster::kCharged] = 1.;
707 pid[AliVCluster::kCharged] = 1.;
712 pid[AliVCluster::kPi0] = 1.;
717 pid[AliVCluster::kCharged] = 1.;
722 pid[AliVCluster::kCharged] = 1.;
727 pid[AliVCluster::kKaon0] = 1.;
728 pid[AliVCluster::kNeutral] = 1;
733 pid[AliVCluster::kCharged] = 1.;
738 pid[AliVCluster::kCharged] = 1.;
743 pid[AliVCluster::kNeutron] = 1.;
744 pid[AliVCluster::kNeutral] = 1.;
749 pid[AliVCluster::kCharged] = 1.;
753 case -2212: // anti-p
754 pid[AliVCluster::kCharged] = 1.;
759 pid[AliVCluster::kKaon0] = 1.;
760 pid[AliVCluster::kNeutral] = 1.;
765 pid[AliVCluster::kKaon0] = 1.;
766 pid[AliVCluster::kNeutral] = 1.;
770 case -311: // anti-K0
771 pid[AliVCluster::kKaon0] = 1.;
772 pid[AliVCluster::kNeutral] = 1.;
777 pid[AliVCluster::kNeutral] = 1.;
782 pid[AliVCluster::kUnknown] = 1.;
787 pid[AliVCluster::kUnknown] = 1.;
792 pid[AliVCluster::kUnknown] = 1.;
797 pid[AliVCluster::kUnknown] = 1.;
802 pid[AliVCluster::kUnknown] = 1.;
807 pid[AliVCluster::kUnknown] = 1.;
812 pid[AliVCluster::kUnknown] = 1.;
817 pid[AliVCluster::kNeutron] = 1.;
818 pid[AliVCluster::kNeutral] = 1.;
822 case -3122: // anti-Lambda
823 pid[AliVCluster::kUnknown] = 1.;
827 case -3222: // anti-Sigma-
828 pid[AliVCluster::kUnknown] = 1.;
832 case -3212: // anti-Sigma0
833 pid[AliVCluster::kUnknown] = 1.;
837 case -3112: // anti-Sigma+
838 pid[AliVCluster::kUnknown] = 1.;
842 case -3322: // anti-Xi0
843 pid[AliVCluster::kUnknown] = 1.;
847 case -3312: // anti-Xi+
848 pid[AliVCluster::kUnknown] = 1.;
852 case -3334: // anti-Omega+
853 pid[AliVCluster::kUnknown] = 1.;
858 pid[AliVCluster::kUnknown] = 1.;
863 pid[AliVCluster::kUnknown] = 1.;
868 pid[AliVCluster::kUnknown] = 1.;
872 case -421: // anti-D0
873 pid[AliVCluster::kUnknown] = 1.;
878 pid[AliVCluster::kUnknown] = 1.;