///////////////////////////////////////////////////////////////////////////// // // // AliFemtoShareQualityPairCut - a pair cut which checks for some pair // // qualities that attempt to identify slit/doubly reconstructed tracks // // // ///////////////////////////////////////////////////////////////////////////// /*************************************************************************** * * $Id: AliFemtoShareQualityPairCut.cxx 50722 2011-07-21 15:18:38Z akisiel $ * * Author: Adam Kisiel, Ohio State, kisiel@mps.ohio-state.edu *************************************************************************** * * Description: part of STAR HBT Framework: AliFemtoMaker package * a cut to remove "shared" and "split" pairs * *************************************************************************** * * **************************************************************************/ #include "AliFemtoV0TrackPairCut.h" #include #include #ifdef __ROOT__ ClassImp(AliFemtoV0TrackPairCut) #endif //__________________ AliFemtoV0TrackPairCut::AliFemtoV0TrackPairCut(): fNPairsPassed(0), fNPairsFailed(0), fV0Max(1.0), fShareQualityMax(1.0), fShareFractionMax(1.0), fRemoveSameLabel(0), fTrackTPCOnly(0), fDataType(kAOD), fDTPCMin(0), fDTPCExitMin(0), fKstarCut(0), fFirstParticleType(kLambda), fSecondParticleType(kProton) { // Default constructor // Nothing to do } //__________________ AliFemtoV0TrackPairCut::~AliFemtoV0TrackPairCut(){ /* no-op */ } AliFemtoV0TrackPairCut& AliFemtoV0TrackPairCut::operator=(const AliFemtoV0TrackPairCut& cut) { if (this != &cut) { AliFemtoPairCut::operator=(cut); fNPairsPassed = 0; fNPairsFailed =0; fV0Max = 1.0; fShareQualityMax = 1.0; fShareFractionMax = 1.0; fRemoveSameLabel = 0; fTrackTPCOnly = 0; fDataType = kAOD; fDTPCMin = 0; fDTPCExitMin = 0; } return *this; } //__________________ bool AliFemtoV0TrackPairCut::Pass(const AliFemtoPair* pair){ // Check for pairs that are possibly shared/double reconstruction bool temp = true; //Track1 - V0 //Track2 - track if(!(pair->Track1()->V0() && pair->Track2()->Track())) { return false; } if(fTrackTPCOnly) { if( (-(pair->Track1()->V0()->IdNeg()+1)) ==pair->Track2()->TrackId() || (-(pair->Track1()->V0()->IdPos()+1)) ==pair->Track2()->TrackId()) { return false; } } else { if(pair->Track1()->V0()->IdNeg()==pair->Track2()->TrackId() || pair->Track1()->V0()->IdPos()==pair->Track2()->TrackId()) { return false; } } bool tempTPCEntrancePos = true; bool tempTPCEntranceNeg = true; bool tempTPCExitPos = true; bool tempTPCExitNeg = true; if(fDataType==kESD || fDataType==kAOD) { double distx = pair->Track1()->V0()->NominalTpcEntrancePointPos().x() - pair->Track2()->Track()->NominalTpcEntrancePoint().x(); double disty = pair->Track1()->V0()->NominalTpcEntrancePointPos().y() - pair->Track2()->Track()->NominalTpcEntrancePoint().y(); double distz = pair->Track1()->V0()->NominalTpcEntrancePointPos().z() - pair->Track2()->Track()->NominalTpcEntrancePoint().z(); double distPos = sqrt(distx*distx + disty*disty + distz*distz); distx = pair->Track1()->V0()->NominalTpcEntrancePointNeg().x() - pair->Track2()->Track()->NominalTpcEntrancePoint().x(); disty = pair->Track1()->V0()->NominalTpcEntrancePointNeg().y() - pair->Track2()->Track()->NominalTpcEntrancePoint().y(); distz = pair->Track1()->V0()->NominalTpcEntrancePointNeg().z() - pair->Track2()->Track()->NominalTpcEntrancePoint().z(); double distNeg = sqrt(distx*distx + disty*disty + distz*distz); double distExitX = pair->Track1()->V0()->NominalTpcExitPointPos().x() - pair->Track2()->Track()->NominalTpcExitPoint().x(); double distExitY = pair->Track1()->V0()->NominalTpcExitPointPos().y() - pair->Track2()->Track()->NominalTpcExitPoint().y(); double distExitZ = pair->Track1()->V0()->NominalTpcExitPointPos().z() - pair->Track2()->Track()->NominalTpcExitPoint().z(); double distExitPos = sqrt(distExitX*distExitX + distExitY*distExitY + distExitZ*distExitZ); distExitX = pair->Track1()->V0()->NominalTpcExitPointNeg().x() - pair->Track2()->Track()->NominalTpcExitPoint().x(); distExitY = pair->Track1()->V0()->NominalTpcExitPointNeg().y() - pair->Track2()->Track()->NominalTpcExitPoint().y(); distExitZ = pair->Track1()->V0()->NominalTpcExitPointNeg().z() - pair->Track2()->Track()->NominalTpcExitPoint().z(); double distExitNeg = sqrt(distExitX*distExitX + distExitY*distExitY + distExitZ*distExitZ); tempTPCEntrancePos = distPos > fDTPCMin; tempTPCEntranceNeg = distNeg > fDTPCMin; tempTPCExitPos = distExitPos > fDTPCExitMin; tempTPCExitNeg = distExitNeg > fDTPCExitMin; } if(!tempTPCEntrancePos || !tempTPCEntranceNeg || !tempTPCExitPos || !tempTPCExitNeg) return false; //reject merged trakcs in TPC //temp = dist > fDTPCMin; //koniec kopii //if(!temp) //return false; //kopia z AliFemtoShareQualityPairCut.cxx Int_t nh = 0; Int_t an = 0; Int_t ns = 0; if ((fShareFractionMax < 1.0) && ( fShareQualityMax < 1.0)) { for (unsigned int imap=0; imapTrack1()->V0()->TPCclustersPos().GetNbits(); imap++) { // If both have clusters in the same row if (pair->Track1()->V0()->TPCclustersPos().TestBitNumber(imap) && pair->Track2()->Track()->TPCclusters().TestBitNumber(imap)) { // Do they share it ? if (pair->Track1()->V0()->TPCsharingPos().TestBitNumber(imap) && pair->Track2()->Track()->TPCsharing().TestBitNumber(imap)) { // cout << "A shared cluster !!!" << endl; // cout << "imap idx1 idx2 " // << imap << " " // << tP1idx[imap] << " " << tP2idx[imap] << endl; an++; nh+=2; ns+=2; } // Different hits on the same padrow else { an--; nh+=2; } } else if (pair->Track1()->V0()->TPCclustersPos().TestBitNumber(imap) || pair->Track2()->Track()->TPCclusters().TestBitNumber(imap)) { // One track has a hit, the other does not an++; nh++; } } Float_t hsmval = 0.0; Float_t hsfval = 0.0; if (nh >0) { hsmval = an*1.0/nh; hsfval = ns*1.0/nh; } // if (hsmval > -0.4) { // cout << "Pair quality: " << hsmval << " " << an << " " << nh << " " // << (pair->Track1()->Track()) << " " // << (pair->Track2()->Track()) << endl; // cout << "Bits: " << pair->Track1()->Track()->TPCclusters().GetNbits() << endl; // } // if (hsfval > 0.0) { // cout << "Pair sharity: " << hsfval << " " << ns << " " << nh << " " << hsmval << " " << an << " " << nh << endl; // } temp = (hsmval < fShareQualityMax) && (hsfval < fShareFractionMax); if(!temp) return false; nh = 0; an = 0; ns = 0; for (unsigned int imap=0; imapTrack1()->V0()->TPCclustersNeg().GetNbits(); imap++) { // If both have clusters in the same row if (pair->Track1()->V0()->TPCclustersNeg().TestBitNumber(imap) && pair->Track2()->Track()->TPCclusters().TestBitNumber(imap)) { // Do they share it ? if (pair->Track1()->V0()->TPCsharingNeg().TestBitNumber(imap) && pair->Track2()->Track()->TPCsharing().TestBitNumber(imap)) { // cout << "A shared cluster !!!" << endl; // cout << "imap idx1 idx2 " // << imap << " " // << tP1idx[imap] << " " << tP2idx[imap] << endl; an++; nh+=2; ns+=2; } // Different hits on the same padrow else { an--; nh+=2; } } else if (pair->Track1()->V0()->TPCclustersNeg().TestBitNumber(imap) || pair->Track2()->Track()->TPCclusters().TestBitNumber(imap)) { // One track has a hit, the other does not an++; nh++; } } hsmval = 0.0; hsfval = 0.0; if (nh >0) { hsmval = an*1.0/nh; hsfval = ns*1.0/nh; } // if (hsmval > -0.4) { // cout << "Pair quality: " << hsmval << " " << an << " " << nh << " " // << (pair->Track1()->Track()) << " " // << (pair->Track2()->Track()) << endl; // cout << "Bits: " << pair->Track1()->Track()->TPCclusters().GetNbits() << endl; // } // if (hsfval > 0.0) { // cout << "Pair sharity: " << hsfval << " " << ns << " " << nh << " " << hsmval << " " << an << " " << nh << endl; // } temp = (hsmval < fShareQualityMax) && (hsfval < fShareFractionMax); } else temp = true; //koniec kopii //Qinv cut (we are trying to get rid of antiresidual correlation between primary protons) if(fKstarCut > 0) { //2 daughters of first V0 double mom1PosX = pair->Track1()->V0()->MomPosX(); double mom1PosY = pair->Track1()->V0()->MomPosY(); double mom1PosZ = pair->Track1()->V0()->MomPosZ(); double mom1NegX = pair->Track1()->V0()->MomNegX(); double mom1NegY = pair->Track1()->V0()->MomNegY(); double mom1NegZ = pair->Track1()->V0()->MomNegZ(); //double PionMass = 0.13956995; //double KaonMass = 0.493677; double ProtonMass = 0.938272; //double LambdaMass = 1.115683; AliFemtoLorentzVector fFourMomentum1; // Particle momentum AliFemtoLorentzVector fFourMomentum2; // Particle momentum AliFemtoThreeVector temp1; double ener1=0; if(fFirstParticleType == 0) //lambda { if(fSecondParticleType == 2) //proton { //temp1 = ::sqrt(mom1PosX*mom1PosX+mom1PosY*mom1PosY+mom1PosZ*mom1PosZ); temp1.SetX(mom1PosX); temp1.SetY(mom1PosY); temp1.SetZ(mom1PosZ); ener1 = ::sqrt(temp1.Mag2()+ProtonMass*ProtonMass); } } else if(fFirstParticleType == 1) //antilambda { if(fSecondParticleType == 3) //antiproton { //temp1 = ::sqrt(mom1NegX*mom1NegX+mom1NegY*mom1NegY+mom1NegZ*mom1NegZ); temp1.SetX(mom1NegX); temp1.SetY(mom1NegY); temp1.SetZ(mom1NegZ); ener1 = ::sqrt(temp1.Mag2()+ProtonMass*ProtonMass); } } fFourMomentum1.SetVect(temp1); fFourMomentum1.SetE(ener1); //AliFemtoLorentzVector fFourMomentum2; // Particle momentum AliFemtoThreeVector temp2; double ener2=0; //2 daughters of second V0 temp2 = pair->Track2()->Track()->P(); if(fSecondParticleType == 2 || fSecondParticleType == 3) //proton { ener2 = ::sqrt(temp2.Mag2()+ProtonMass*ProtonMass); } fFourMomentum2.SetVect(temp2); fFourMomentum2.SetE(ener2); //QInv calculation AliFemtoLorentzVector tDiff = (fFourMomentum1-fFourMomentum2); double tQinv = fabs(-1.*tDiff.m()); // note - qInv() will be negative for identical pairs... //cout<<"tQinv/2: "<AddLast(new TObjString(buf)); return tListSetttings; } void AliFemtoV0TrackPairCut::SetRemoveSameLabel(Bool_t aRemove) { fRemoveSameLabel = aRemove; } void AliFemtoV0TrackPairCut::SetTPCOnly(Bool_t tpconly) { fTrackTPCOnly = tpconly; } void AliFemtoV0TrackPairCut::SetShareQualityMax(Double_t aShareQualityMax) { fShareQualityMax = aShareQualityMax; } void AliFemtoV0TrackPairCut::SetShareFractionMax(Double_t aShareFractionMax) { fShareFractionMax = aShareFractionMax; } void AliFemtoV0TrackPairCut::SetDataType(AliFemtoDataType type) { fDataType = type; } void AliFemtoV0TrackPairCut::SetTPCEntranceSepMinimum(double dtpc) { fDTPCMin = dtpc; } void AliFemtoV0TrackPairCut::SetTPCExitSepMinimum(double dtpc) { fDTPCExitMin = dtpc; } void AliFemtoV0TrackPairCut::SetKstarCut(double kstar, AliFemtoParticleType firstParticle, AliFemtoParticleType secondParticle) { fKstarCut = kstar; fFirstParticleType = firstParticle; //for kstar - first particle type (V0 type) fSecondParticleType = secondParticle; }