3 //-------------------------------------------------------------------
4 // Class AliHBTPairCut:
5 // implements cut on the pair of particles
6 // more info: http://alisoft.cern.ch/people/skowron/analyzer/index.html
7 // Author: Piotr.Skowronski@cern.ch
8 //-------------------------------------------------------------------
10 #include "AliHBTPairCut.h"
11 #include "AliHBTPair.h"
12 #include "AliHBTParticleCut.h"
14 ClassImp(AliHBTPairCut)
15 const Int_t AliHBTPairCut::fgkMaxCuts = 50;
16 /**********************************************************/
18 AliHBTPairCut::AliHBTPairCut():
22 fFirstPartCut = new AliHBTEmptyParticleCut(); //empty cuts
23 fSecondPartCut= new AliHBTEmptyParticleCut(); //empty cuts
25 fCuts = new AliHbtBasePairCut*[fgkMaxCuts];
27 /**********************************************************/
29 AliHBTPairCut::AliHBTPairCut(const AliHBTPairCut& in):
33 fCuts = new AliHbtBasePairCut*[fgkMaxCuts];
36 fFirstPartCut = (AliHBTParticleCut*)in.fFirstPartCut->Clone();
37 fSecondPartCut = (AliHBTParticleCut*)in.fSecondPartCut->Clone();
39 for (Int_t i = 0;i<fNCuts;i++)
41 fCuts[i] = (AliHbtBasePairCut*)in.fCuts[i]->Clone();//create new object (clone) and rember pointer to it
44 /**********************************************************/
46 AliHBTPairCut& AliHBTPairCut::operator=(const AliHBTPairCut& in)
49 fCuts = new AliHbtBasePairCut*[fgkMaxCuts];
52 fFirstPartCut = (AliHBTParticleCut*)in.fFirstPartCut->Clone();
53 fSecondPartCut = (AliHBTParticleCut*)in.fSecondPartCut->Clone();
55 for (Int_t i = 0;i<fNCuts;i++)
57 fCuts[i] = (AliHbtBasePairCut*)in.fCuts[i]->Clone();//create new object (clone) and rember pointer to it
61 /**********************************************************/
63 AliHBTPairCut::~AliHBTPairCut()
66 if (fFirstPartCut != fSecondPartCut)
68 delete fSecondPartCut;
71 for (Int_t i = 0;i<fNCuts;i++)
77 /**********************************************************/
79 /**********************************************************/
81 void AliHBTPairCut::AddBasePairCut(AliHbtBasePairCut* basecut)
83 //adds the base pair cut (cut on one value)
86 if( fNCuts == (fgkMaxCuts-1) )
88 Warning("AddBasePairCut","Not enough place for another cut");
91 fCuts[fNCuts++]=basecut;
93 /**********************************************************/
95 Bool_t AliHBTPairCut::Pass(AliHBTPair* pair) const
97 //methods which checks if given pair meets all criteria of the cut
98 //if it meets returns FALSE
102 Warning("Pass","No Pasaran! We never accept NULL pointers");
106 //check particle's cuts
107 if( ( fFirstPartCut->Pass( pair->Particle1()) ) ||
108 ( fSecondPartCut->Pass(pair->Particle2()) ) )
112 return PassPairProp(pair);
114 /**********************************************************/
116 Bool_t AliHBTPairCut::PassPairProp(AliHBTPair* pair) const
118 //methods which checks if given pair meets all criteria of the cut
119 //if it meets returns FALSE
120 //if NOT returns TRUE
121 //examine all base pair cuts
122 for (Int_t i = 0;i<fNCuts;i++)
124 if ( (fCuts[i]->Pass(pair)) ) return kTRUE; //if one of the cuts reject, then reject
128 /**********************************************************/
130 void AliHBTPairCut::SetFirstPartCut(AliHBTParticleCut* cut)
132 // set cut for the first particle
135 Error("SetFirstPartCut","argument is NULL");
138 delete fFirstPartCut;
139 fFirstPartCut = (AliHBTParticleCut*)cut->Clone();
142 /**********************************************************/
144 void AliHBTPairCut::SetSecondPartCut(AliHBTParticleCut* cut)
146 // set cut for the second particle
149 Error("SetSecondPartCut","argument is NULL");
152 delete fSecondPartCut;
153 fSecondPartCut = (AliHBTParticleCut*)cut->Clone();
155 /**********************************************************/
157 void AliHBTPairCut::SetPartCut(AliHBTParticleCut* cut)
159 //sets the the same cut on both particles
162 Error("SetFirstPartCut","argument is NULL");
165 delete fFirstPartCut;
166 fFirstPartCut = (AliHBTParticleCut*)cut->Clone();
168 delete fSecondPartCut; //even if null should not be harmful
169 fSecondPartCut = fFirstPartCut;
171 /**********************************************************/
173 void AliHBTPairCut::SetQInvRange(Double_t min, Double_t max)
175 // set range of accepted invariant masses
176 AliHBTQInvCut* cut= (AliHBTQInvCut*)FindCut(kHbtPairCutPropQInv);
177 if(cut) cut->SetRange(min,max);
178 else fCuts[fNCuts++] = new AliHBTQInvCut(min,max);
180 /**********************************************************/
181 void AliHBTPairCut::SetQOutCMSLRange(Double_t min, Double_t max)
183 // set range of accepted QOut in CMS
184 AliHBTQOutCMSLCCut* cut= (AliHBTQOutCMSLCCut*)FindCut(kHbtPairCutPropQOutCMSLC);
185 if(cut) cut->SetRange(min,max);
186 else fCuts[fNCuts++] = new AliHBTQOutCMSLCCut(min,max);
189 /**********************************************************/
190 void AliHBTPairCut::SetQSideCMSLRange(Double_t min, Double_t max)
192 // set range of accepted QSide in CMS
193 AliHBTQSideCMSLCCut* cut= (AliHBTQSideCMSLCCut*)FindCut(kHbtPairCutPropQSideCMSLC);
194 if(cut) cut->SetRange(min,max);
195 else fCuts[fNCuts++] = new AliHBTQSideCMSLCCut(min,max);
198 /**********************************************************/
199 void AliHBTPairCut::SetQLongCMSLRange(Double_t min, Double_t max)
201 // set range of accepted QLong in CMS
202 AliHBTQLongCMSLCCut* cut= (AliHBTQLongCMSLCCut*)FindCut(kHbtPairCutPropQLongCMSLC);
203 if(cut) cut->SetRange(min,max);
204 else fCuts[fNCuts++] = new AliHBTQLongCMSLCCut(min,max);
207 /**********************************************************/
209 void AliHBTPairCut::SetKtRange(Double_t min, Double_t max)
211 // set range of accepted Kt (?)
212 AliHBTKtCut* cut= (AliHBTKtCut*)FindCut(kHbtPairCutPropKt);
213 if(cut) cut->SetRange(min,max);
214 else fCuts[fNCuts++] = new AliHBTKtCut(min,max);
216 /**********************************************************/
218 void AliHBTPairCut::SetKStarRange(Double_t min, Double_t max)
220 // set range of accepted KStar (?)
221 AliHBTKStarCut* cut= (AliHBTKStarCut*)FindCut(kHbtPairCutPropKStar);
222 if(cut) cut->SetRange(min,max);
223 else fCuts[fNCuts++] = new AliHBTKStarCut(min,max);
225 /**********************************************************/
227 AliHbtBasePairCut* AliHBTPairCut::FindCut(AliHBTPairCutProperty property)
229 // Find the cut corresponding to "property"
230 for (Int_t i = 0;i<fNCuts;i++)
232 if (fCuts[i]->GetProperty() == property)
233 return fCuts[i]; //we found the cut we were searching for
236 return 0x0; //we did not found this cut
239 /**********************************************************/
241 void AliHBTPairCut::Streamer(TBuffer &b)
243 // Stream all objects in the array to or from the I/O buffer.
248 Version_t v = b.ReadVersion(&R__s, &R__c);
251 delete fFirstPartCut;
252 delete fSecondPartCut;
254 fSecondPartCut = 0x0;
255 TObject::Streamer(b);
259 for (Int_t i = 0;i<fNCuts;i++)
264 b.CheckByteCount(R__s, R__c,AliHBTPairCut::IsA());
268 R__c = b.WriteVersion(AliHBTPairCut::IsA(), kTRUE);
269 TObject::Streamer(b);
273 for (Int_t i = 0;i<fNCuts;i++)
277 b.SetByteCount(R__c, kTRUE);
281 ClassImp(AliHBTEmptyPairCut)
283 void AliHBTEmptyPairCut::Streamer(TBuffer &b)
285 //streamer for empty pair cut
286 AliHBTPairCut::Streamer(b);
289 ClassImp(AliHbtBasePairCut)
290 ClassImp(AliHBTQInvCut)
291 ClassImp(AliHBTKtCut)
292 ClassImp(AliHBTQSideCMSLCCut)
293 ClassImp(AliHBTQOutCMSLCCut)
294 ClassImp(AliHBTQLongCMSLCCut)