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)
32 fCuts = new AliHbtBasePairCut*[fgkMaxCuts];
35 fFirstPartCut = (AliHBTParticleCut*)in.fFirstPartCut->Clone();
36 fSecondPartCut = (AliHBTParticleCut*)in.fSecondPartCut->Clone();
38 for (Int_t i = 0;i<fNCuts;i++)
40 fCuts[i] = (AliHbtBasePairCut*)in.fCuts[i]->Clone();//create new object (clone) and rember pointer to it
43 /**********************************************************/
45 AliHBTPairCut& AliHBTPairCut::operator=(const AliHBTPairCut& in)
48 fCuts = new AliHbtBasePairCut*[fgkMaxCuts];
51 fFirstPartCut = (AliHBTParticleCut*)in.fFirstPartCut->Clone();
52 fSecondPartCut = (AliHBTParticleCut*)in.fSecondPartCut->Clone();
54 for (Int_t i = 0;i<fNCuts;i++)
56 fCuts[i] = (AliHbtBasePairCut*)in.fCuts[i]->Clone();//create new object (clone) and rember pointer to it
60 /**********************************************************/
62 AliHBTPairCut::~AliHBTPairCut()
65 if (fFirstPartCut != fSecondPartCut)
67 delete fSecondPartCut;
70 for (Int_t i = 0;i<fNCuts;i++)
76 /**********************************************************/
78 /**********************************************************/
80 void AliHBTPairCut::AddBasePairCut(AliHbtBasePairCut* basecut)
82 //adds the base pair cut (cut on one value)
85 if( fNCuts == (fgkMaxCuts-1) )
87 Warning("AddBasePairCut","Not enough place for another cut");
90 fCuts[fNCuts++]=basecut;
92 /**********************************************************/
94 Bool_t AliHBTPairCut::Pass(AliHBTPair* pair) const
96 //methods which checks if given pair meets all criteria of the cut
97 //if it meets returns FALSE
101 Warning("Pass","No Pasaran! We never accept NULL pointers");
105 //check particle's cuts
106 if( ( fFirstPartCut->Pass( pair->Particle1()) ) ||
107 ( fSecondPartCut->Pass(pair->Particle2()) ) )
111 return PassPairProp(pair);
113 /**********************************************************/
115 Bool_t AliHBTPairCut::PassPairProp(AliHBTPair* pair) const
117 //methods which checks if given pair meets all criteria of the cut
118 //if it meets returns FALSE
119 //if NOT returns TRUE
120 //examine all base pair cuts
121 for (Int_t i = 0;i<fNCuts;i++)
123 if ( (fCuts[i]->Pass(pair)) ) return kTRUE; //if one of the cuts reject, then reject
127 /**********************************************************/
129 void AliHBTPairCut::SetFirstPartCut(AliHBTParticleCut* cut)
131 // set cut for the first particle
134 Error("SetFirstPartCut","argument is NULL");
137 delete fFirstPartCut;
138 fFirstPartCut = (AliHBTParticleCut*)cut->Clone();
141 /**********************************************************/
143 void AliHBTPairCut::SetSecondPartCut(AliHBTParticleCut* cut)
145 // set cut for the second particle
148 Error("SetSecondPartCut","argument is NULL");
151 delete fSecondPartCut;
152 fSecondPartCut = (AliHBTParticleCut*)cut->Clone();
154 /**********************************************************/
156 void AliHBTPairCut::SetPartCut(AliHBTParticleCut* cut)
158 //sets the the same cut on both particles
161 Error("SetFirstPartCut","argument is NULL");
164 delete fFirstPartCut;
165 fFirstPartCut = (AliHBTParticleCut*)cut->Clone();
167 delete fSecondPartCut; //even if null should not be harmful
168 fSecondPartCut = fFirstPartCut;
170 /**********************************************************/
172 void AliHBTPairCut::SetQInvRange(Double_t min, Double_t max)
174 // set range of accepted invariant masses
175 AliHBTQInvCut* cut= (AliHBTQInvCut*)FindCut(kHbtPairCutPropQInv);
176 if(cut) cut->SetRange(min,max);
177 else fCuts[fNCuts++] = new AliHBTQInvCut(min,max);
179 /**********************************************************/
180 void AliHBTPairCut::SetQOutCMSLRange(Double_t min, Double_t max)
182 // set range of accepted QOut in CMS
183 AliHBTQOutCMSLCCut* cut= (AliHBTQOutCMSLCCut*)FindCut(kHbtPairCutPropQOutCMSLC);
184 if(cut) cut->SetRange(min,max);
185 else fCuts[fNCuts++] = new AliHBTQOutCMSLCCut(min,max);
188 /**********************************************************/
189 void AliHBTPairCut::SetQSideCMSLRange(Double_t min, Double_t max)
191 // set range of accepted QSide in CMS
192 AliHBTQSideCMSLCCut* cut= (AliHBTQSideCMSLCCut*)FindCut(kHbtPairCutPropQSideCMSLC);
193 if(cut) cut->SetRange(min,max);
194 else fCuts[fNCuts++] = new AliHBTQSideCMSLCCut(min,max);
197 /**********************************************************/
198 void AliHBTPairCut::SetQLongCMSLRange(Double_t min, Double_t max)
200 // set range of accepted QLong in CMS
201 AliHBTQLongCMSLCCut* cut= (AliHBTQLongCMSLCCut*)FindCut(kHbtPairCutPropQLongCMSLC);
202 if(cut) cut->SetRange(min,max);
203 else fCuts[fNCuts++] = new AliHBTQLongCMSLCCut(min,max);
206 /**********************************************************/
208 void AliHBTPairCut::SetKtRange(Double_t min, Double_t max)
210 // set range of accepted Kt (?)
211 AliHBTKtCut* cut= (AliHBTKtCut*)FindCut(kHbtPairCutPropKt);
212 if(cut) cut->SetRange(min,max);
213 else fCuts[fNCuts++] = new AliHBTKtCut(min,max);
215 /**********************************************************/
217 void AliHBTPairCut::SetKStarRange(Double_t min, Double_t max)
219 // set range of accepted KStar (?)
220 AliHBTKStarCut* cut= (AliHBTKStarCut*)FindCut(kHbtPairCutPropKStar);
221 if(cut) cut->SetRange(min,max);
222 else fCuts[fNCuts++] = new AliHBTKStarCut(min,max);
224 /**********************************************************/
226 AliHbtBasePairCut* AliHBTPairCut::FindCut(AliHBTPairCutProperty property)
228 // Find the cut corresponding to "property"
229 for (Int_t i = 0;i<fNCuts;i++)
231 if (fCuts[i]->GetProperty() == property)
232 return fCuts[i]; //we found the cut we were searching for
235 return 0x0; //we did not found this cut
238 /**********************************************************/
240 void AliHBTPairCut::Streamer(TBuffer &b)
242 // Stream all objects in the array to or from the I/O buffer.
247 Version_t v = b.ReadVersion(&R__s, &R__c);
250 delete fFirstPartCut;
251 delete fSecondPartCut;
253 fSecondPartCut = 0x0;
254 TObject::Streamer(b);
258 for (Int_t i = 0;i<fNCuts;i++)
263 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 AliHBTPairCut::Streamer(b);
288 ClassImp(AliHbtBasePairCut)
290 ClassImp(AliHBTQInvCut)
292 ClassImp(AliHBTKtCut)
294 ClassImp(AliHBTQSideCMSLCCut)
295 ClassImp(AliHBTQOutCMSLCCut)
296 ClassImp(AliHBTQLongCMSLCCut)