1 /////////////////////////////////////////////////////////////////////////////
3 // AliFemtoShareQualityPairCut - a pair cut which checks for some pair //
4 // qualities that attempt to identify slit/doubly reconstructed tracks //
6 /////////////////////////////////////////////////////////////////////////////
7 /***************************************************************************
9 * $Id: AliFemtoShareQualityPairCut.cxx 50722 2011-07-21 15:18:38Z akisiel $
11 * Author: Adam Kisiel, Ohio State, kisiel@mps.ohio-state.edu
12 ***************************************************************************
14 * Description: part of STAR HBT Framework: AliFemtoMaker package
15 * a cut to remove "shared" and "split" pairs
17 ***************************************************************************
20 **************************************************************************/
22 #include "AliFemtoV0PairCut.h"
27 ClassImp(AliFemtoV0PairCut)
31 AliFemtoV0PairCut::AliFemtoV0PairCut():
35 fShareFractionMax(1.0),
45 // Default constructor
49 AliFemtoV0PairCut::~AliFemtoV0PairCut(){
53 AliFemtoV0PairCut& AliFemtoV0PairCut::operator=(const AliFemtoV0PairCut& cut)
57 AliFemtoPairCut::operator=(cut);
61 fShareFractionMax = 1.0;
77 bool AliFemtoV0PairCut::Pass(const AliFemtoPair* pair){
78 // Check for pairs that are possibly shared/double reconstruction
82 /*cout<<"pair->Track1(): "<<pair->Track1()<<endl;
83 cout<<"pair->Track2(): "<<pair->Track2()<<endl;
84 cout<<"pair->Track1()->V0(): "<<pair->Track1()->V0()<<endl;
85 cout<<"pair->Track2()->V0(): "<<pair->Track2()->V0()<<endl;
86 cout<<"pair->Track1()->V0()->IdNeg(): "<<pair->Track1()->V0()->IdNeg()<<endl;
87 cout<<"pair->Track2()->V0()->IdNeg(): "<<pair->Track2()->V0()->IdNeg()<<endl;
88 cout<<"pair->Track1()->V0()->IdPos(): "<<pair->Track1()->V0()->IdPos()<<endl;
89 cout<<"pair->Track2()->V0()->IdPos(): "<<pair->Track2()->V0()->IdPos()<<endl;*/
91 bool tempTPCEntrancePos = true;
92 bool tempTPCEntranceNeg = true;
93 bool tempTPCExitPos = true;
94 bool tempTPCExitNeg = true;
95 if(fDataType==kESD || fDataType==kAOD)
97 double distx = pair->Track1()->V0()->NominalTpcEntrancePointPos().x() - pair->Track2()->V0()->NominalTpcEntrancePointPos().x();
98 double disty = pair->Track1()->V0()->NominalTpcEntrancePointPos().y() - pair->Track2()->V0()->NominalTpcEntrancePointPos().y();
99 double distz = pair->Track1()->V0()->NominalTpcEntrancePointPos().z() - pair->Track2()->V0()->NominalTpcEntrancePointPos().z();
100 double distPos = sqrt(distx*distx + disty*disty + distz*distz);
102 distx = pair->Track1()->V0()->NominalTpcEntrancePointNeg().x() - pair->Track2()->V0()->NominalTpcEntrancePointNeg().x();
103 disty = pair->Track1()->V0()->NominalTpcEntrancePointNeg().y() - pair->Track2()->V0()->NominalTpcEntrancePointNeg().y();
104 distz = pair->Track1()->V0()->NominalTpcEntrancePointNeg().z() - pair->Track2()->V0()->NominalTpcEntrancePointNeg().z();
105 double distNeg = sqrt(distx*distx + disty*disty + distz*distz);
107 double distExitX = pair->Track1()->V0()->NominalTpcExitPointPos().x() - pair->Track2()->V0()->NominalTpcExitPointPos().x();
108 double distExitY = pair->Track1()->V0()->NominalTpcExitPointPos().y() - pair->Track2()->V0()->NominalTpcExitPointPos().y();
109 double distExitZ = pair->Track1()->V0()->NominalTpcExitPointPos().z() - pair->Track2()->V0()->NominalTpcExitPointPos().z();
110 double distExitPos = sqrt(distExitX*distExitX + distExitY*distExitY + distExitZ*distExitZ);
112 distExitX = pair->Track1()->V0()->NominalTpcExitPointNeg().x() - pair->Track2()->V0()->NominalTpcExitPointNeg().x();
113 distExitY = pair->Track1()->V0()->NominalTpcExitPointNeg().y() - pair->Track2()->V0()->NominalTpcExitPointNeg().y();
114 distExitZ = pair->Track1()->V0()->NominalTpcExitPointNeg().z() - pair->Track2()->V0()->NominalTpcExitPointNeg().z();
115 double distExitNeg = sqrt(distExitX*distExitX + distExitY*distExitY + distExitZ*distExitZ);
117 tempTPCEntrancePos = distPos > fDTPCMin;
118 tempTPCEntranceNeg = distNeg > fDTPCMin;
120 tempTPCExitPos = distExitPos > fDTPCExitMin;
121 tempTPCExitNeg = distExitNeg > fDTPCExitMin;
125 if(!(pair->Track1()->V0() && pair->Track2()->V0()))
129 if(pair->Track1()->V0()->IdNeg()==pair->Track2()->V0()->IdNeg() || pair->Track1()->V0()->IdPos()==pair->Track2()->V0()->IdPos())
135 if(!tempTPCEntrancePos || !tempTPCEntranceNeg || !tempTPCExitPos || !tempTPCExitNeg) return false;
138 AliFemtoThreeVector first, second, tmp;
139 for(int i=0; i<8 ;i++)
141 tmp = pair->Track1()->V0()->NominalTpcPointPos(i);
142 //cout<<"X pos: "<<tmp.x()<<endl;
143 first.SetX((double)(tmp.x()));
144 first.SetY((double)tmp.y());
145 first.SetZ((double)tmp.z());
147 tmp = pair->Track2()->V0()->NominalTpcPointPos(i);
148 second.SetX((double)tmp.x());
149 second.SetY((double)tmp.y());
150 second.SetZ((double)tmp.z());
152 avgSep += TMath::Sqrt(((double)first.x()-(double)second.x())*((double)first.x()-(double)second.x())+((double)first.y()-(double)second.y())*((double)first.y()-second.y())+((double)first.z()-(double)second.z())*((double)first.z()-(double)second.z()));
156 if(avgSep<fMinAvgSepPosPos) return false;
161 for(int i=0; i<8 ;i++)
163 tmp = pair->Track1()->V0()->NominalTpcPointPos(i);
164 first.SetX((double)(tmp.x()));
165 first.SetY((double)tmp.y());
166 first.SetZ((double)tmp.z());
168 tmp = pair->Track2()->V0()->NominalTpcPointNeg(i);
169 //cout<<"X neg: "<<tmp.x()<<endl;
170 second.SetX((double)tmp.x());
171 second.SetY((double)tmp.y());
172 second.SetZ((double)tmp.z());
174 avgSep += TMath::Sqrt(((double)first.x()-(double)second.x())*((double)first.x()-(double)second.x())+((double)first.y()-(double)second.y())*((double)first.y()-second.y())+((double)first.z()-(double)second.z())*((double)first.z()-(double)second.z()));
177 if(avgSep<fMinAvgSepPosNeg) return false;
181 for(int i=0; i<8 ;i++)
183 tmp = pair->Track1()->V0()->NominalTpcPointNeg(i);
184 first.SetX((double)(tmp.x()));
185 first.SetY((double)tmp.y());
186 first.SetZ((double)tmp.z());
188 tmp = pair->Track2()->V0()->NominalTpcPointPos(i);
189 second.SetX((double)tmp.x());
190 second.SetY((double)tmp.y());
191 second.SetZ((double)tmp.z());
193 avgSep += TMath::Sqrt(((double)first.x()-(double)second.x())*((double)first.x()-(double)second.x())+((double)first.y()-(double)second.y())*((double)first.y()-second.y())+((double)first.z()-(double)second.z())*((double)first.z()-(double)second.z()));
196 if(avgSep<fMinAvgSepNegPos) return false;
200 for(int i=0; i<8 ;i++)
202 tmp = pair->Track1()->V0()->NominalTpcPointNeg(i);
203 first.SetX((double)(tmp.x()));
204 first.SetY((double)tmp.y());
205 first.SetZ((double)tmp.z());
207 tmp = pair->Track2()->V0()->NominalTpcPointNeg(i);
208 second.SetX((double)tmp.x());
209 second.SetY((double)tmp.y());
210 second.SetZ((double)tmp.z());
212 avgSep += TMath::Sqrt(((double)first.x()-(double)second.x())*((double)first.x()-(double)second.x())+((double)first.y()-(double)second.y())*((double)first.y()-second.y())+((double)first.z()-(double)second.z())*((double)first.z()-(double)second.z()));
215 if(avgSep<fMinAvgSepNegNeg) return false;
223 AliFemtoString AliFemtoV0PairCut::Report(){
224 // Prepare the report from the execution
225 string stemp = "AliFemtoV0 Pair Cut - remove shared and split pairs\n"; char ctemp[100];
226 snprintf(ctemp , 100, "Number of pairs which passed:\t%ld Number which failed:\t%ld\n",fNPairsPassed,fNPairsFailed);
228 AliFemtoString returnThis = stemp;
232 void AliFemtoV0PairCut::SetV0Max(Double_t aV0Max) {
236 Double_t AliFemtoV0PairCut::GetAliFemtoV0Max() const {
241 TList *AliFemtoV0PairCut::ListSettings()
243 // return a list of settings in a writable form
244 TList *tListSetttings = new TList();
246 snprintf(buf, 200, "AliFemtoV0PairCut.sharequalitymax=%f", fV0Max);
247 snprintf(buf, 200, "AliFemtoV0PairCut.sharefractionmax=%f", fShareFractionMax);
248 tListSetttings->AddLast(new TObjString(buf));
250 return tListSetttings;
253 void AliFemtoV0PairCut::SetRemoveSameLabel(Bool_t aRemove)
255 fRemoveSameLabel = aRemove;
258 void AliFemtoV0PairCut::SetDataType(AliFemtoDataType type)
263 void AliFemtoV0PairCut::SetTPCEntranceSepMinimum(double dtpc)
268 void AliFemtoV0PairCut::SetTPCExitSepMinimum(double dtpc)
273 void AliFemtoV0PairCut::SetMinAvgSeparation(int type, double minSep)
275 if(type == 0) //Pos-Pos
276 fMinAvgSepPosPos = minSep;
277 else if(type == 1) //Pos-Neg
278 fMinAvgSepPosNeg = minSep;
279 else if(type == 2) //Neg-Pos
280 fMinAvgSepNegPos = minSep;
281 else if(type == 3) //Neg-Neg
282 fMinAvgSepNegNeg = minSep;