ROOT logo
//
// Class AliRsnCutPrimaryVertex
//
// This cut implementation checks the quality of event primary vertex.
// It currently works only with ESD events (not AOD).
//
// authors: Martin Vala (martin.vala@cern.ch)
//          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
//

#include "AliRsnCutPrimaryVertex.h"
#include "AliAnalysisUtils.h"

ClassImp(AliRsnCutPrimaryVertex)

//_________________________________________________________________________________________________
AliRsnCutPrimaryVertex::AliRsnCutPrimaryVertex
(const char *name, Double_t maxVz, Int_t nContributors, Bool_t acceptTPC, Bool_t acceptSPD) :
   AliRsnCut(name, AliRsnCut::kEvent, 0, nContributors - 1, -maxVz, maxVz + 1E-6),
   fAcceptTPC(acceptTPC),
   fAcceptSPD(acceptSPD),
   fCheckPileUp(kFALSE)
{
//
// Main constructor.
// Defines the cut range between 0 and
// the minimum required number of contributors.
// The cut will be passed when if the event has a
// primary vertex with number of contributors outside this interval.
// ---
// If the 'acceptTPC' argument is true, events with TPC
// primary vertex will be checked, otherwise they will be
// rejected by default.
// ---
// Since the range check uses the '>=' and '<=', the high edge
// must be decreased by 1 to get the right behaviour, since this is integer.
//
}

//_________________________________________________________________________________________________
Bool_t AliRsnCutPrimaryVertex::IsSelected(TObject *object)
{
//
// Cut checker
//
   // coherence check
   // which also fills data member objects
   if (!TargetOK(object)) return kFALSE;

   // retrieve ESD event
   AliESDEvent *esd = dynamic_cast<AliESDEvent *>(fEvent->GetRef());
   AliAODEvent *aod = dynamic_cast<AliAODEvent *>(fEvent->GetRef());
   AliVEvent *vevt = dynamic_cast<AliVEvent *>(fEvent->GetRef());
   // pile-up check
   if (fCheckPileUp) {
     AliAnalysisUtils * utils = new AliAnalysisUtils();
     if (utils->IsPileUpSPD(vevt)) return kFALSE;
   }
   
   if (esd) {
      // get the best primary vertex:
      // first try the one with tracks
      const AliESDVertex *vTrk  = esd->GetPrimaryVertexTracks();
      const AliESDVertex *vSPD  = esd->GetPrimaryVertexSPD();
      const AliESDVertex *vTPC  = esd->GetPrimaryVertexTPC();
      Int_t               ncTrk = -1;
      Int_t               ncSPD = -1;
      Int_t               ncTPC = -1;
      Double_t            vzTrk = 1000000.0;
      Double_t            vzSPD = 1000000.0;
      Double_t            vzTPC = 1000000.0;
      if (vTrk) vzTrk = TMath::Abs(vTrk->GetZ());
      if (vSPD) vzSPD = TMath::Abs(vSPD->GetZ());
      if (vTPC) vzTPC = TMath::Abs(vTPC->GetZ());
      if (vTrk) ncTrk = (Int_t)vTrk->GetNContributors();
      if (vSPD) ncSPD = (Int_t)vSPD->GetNContributors();
      if (vTPC) ncTPC = (Int_t)vTPC->GetNContributors();
      if (vTrk && ncTrk > 0) {
         fCutValueI = ncTrk;
         fCutValueD = vzTrk;
      } else if (vSPD && ncSPD > 0) {
         if (!fAcceptSPD)
            return kFALSE;
         else {
         fCutValueI = ncSPD;
         fCutValueD = vzSPD;
	 }
      } else if (vTPC && ncTPC > 0) {
         if (!fAcceptTPC)
            return kFALSE;
         else {
            fCutValueI = ncTPC;
            fCutValueD = vzTPC;
         }
      } else
         return kFALSE;
   } else if (aod) {
      // in this case, as suggested by Andrea Dainese,
      // we first check if the SPD primary vertex is there
      // if it is not, then the only available is the TPC
      // stand-alone primary vertex, which is rejected
      
      if(fAcceptSPD){
      	AliAODVertex *aodv = aod->GetPrimaryVertexSPD();
      	if (!aodv) {
         	AliDebugClass(1, "Not found SPD vertex --> TPC only available, skipped");
         	return kFALSE;
      	}
      	// now check primary vertex
      	aodv = (AliAODVertex *)aod->GetPrimaryVertex();
      	if (CheckVertex(aodv)) {
         	AliDebugClass(1, "Vertex TRK is OK");
         	fCutValueD = aodv->GetZ();
         	fCutValueI = aodv->GetNDaughters(); //aodv->GetNContributors();
      	}
      	else {
         	aodv = aod->GetPrimaryVertexSPD();
         	if (CheckVertex(aodv)) {
            	AliDebugClass(1, "Vertex TRK is BAD, but vertex SPD is OK");
            	fCutValueD = aodv->GetZ();
            	fCutValueI = aodv->GetNDaughters(); //aodv->GetNContributors();
         	} else {
            	AliDebugClass(1, "Vertex TRK is BAD, and vertex SPD is BAD");
            	return kFALSE;
         	}
	 
	 	} 
     }
     else{     
 	 const AliVVertex *vertex = aod->GetPrimaryVertex();
  	 if(!vertex) return kFALSE;
  	 else{
    	 TString title=vertex->GetTitle();
    	 if(title.Contains("Z") ) return kFALSE;
    	 else if(title.Contains("3D") ) return kFALSE;
	 fCutValueI = vertex->GetNContributors();
	 fCutValueD = TMath::Abs(vertex->GetZ());
 	 }
     }
     
     } else
       return kFALSE;

   // output
   Bool_t result = ((!OkRangeI()) && OkRangeD());
   return result;
}

//_________________________________________________________________________________________________
void AliRsnCutPrimaryVertex::Print(const Option_t *) const
{
//
// Print information on this cut
//

   AliInfo(Form("Cut name                     : %s", GetName()));
   AliInfo(Form("Accepting TPC primary vertex : %s", (fAcceptTPC ? "YES" : "NO")));
   AliInfo(Form("Accepting SPD primary vertex : %s", (fAcceptSPD ? "YES" : "NO")));
   AliInfo(Form("Contributors range (outside) : %d - %d", fMinI, fMaxI));
   AliInfo(Form("Z-vertex     range (inside)  : %f - %f", fMinD, fMaxD));
}

//__________________________________________________________________________________________________
Bool_t AliRsnCutPrimaryVertex::CheckVertex(AliVVertex *vertex)
{
//
// Checks if a candidate primary vertex is good,
// which is true if it is not null and has at
// least one contributor
//

   if (!vertex) return kFALSE;
   if (vertex->GetNContributors() < 1) return kFALSE;
   return kTRUE;
}
 AliRsnCutPrimaryVertex.cxx:1
 AliRsnCutPrimaryVertex.cxx:2
 AliRsnCutPrimaryVertex.cxx:3
 AliRsnCutPrimaryVertex.cxx:4
 AliRsnCutPrimaryVertex.cxx:5
 AliRsnCutPrimaryVertex.cxx:6
 AliRsnCutPrimaryVertex.cxx:7
 AliRsnCutPrimaryVertex.cxx:8
 AliRsnCutPrimaryVertex.cxx:9
 AliRsnCutPrimaryVertex.cxx:10
 AliRsnCutPrimaryVertex.cxx:11
 AliRsnCutPrimaryVertex.cxx:12
 AliRsnCutPrimaryVertex.cxx:13
 AliRsnCutPrimaryVertex.cxx:14
 AliRsnCutPrimaryVertex.cxx:15
 AliRsnCutPrimaryVertex.cxx:16
 AliRsnCutPrimaryVertex.cxx:17
 AliRsnCutPrimaryVertex.cxx:18
 AliRsnCutPrimaryVertex.cxx:19
 AliRsnCutPrimaryVertex.cxx:20
 AliRsnCutPrimaryVertex.cxx:21
 AliRsnCutPrimaryVertex.cxx:22
 AliRsnCutPrimaryVertex.cxx:23
 AliRsnCutPrimaryVertex.cxx:24
 AliRsnCutPrimaryVertex.cxx:25
 AliRsnCutPrimaryVertex.cxx:26
 AliRsnCutPrimaryVertex.cxx:27
 AliRsnCutPrimaryVertex.cxx:28
 AliRsnCutPrimaryVertex.cxx:29
 AliRsnCutPrimaryVertex.cxx:30
 AliRsnCutPrimaryVertex.cxx:31
 AliRsnCutPrimaryVertex.cxx:32
 AliRsnCutPrimaryVertex.cxx:33
 AliRsnCutPrimaryVertex.cxx:34
 AliRsnCutPrimaryVertex.cxx:35
 AliRsnCutPrimaryVertex.cxx:36
 AliRsnCutPrimaryVertex.cxx:37
 AliRsnCutPrimaryVertex.cxx:38
 AliRsnCutPrimaryVertex.cxx:39
 AliRsnCutPrimaryVertex.cxx:40
 AliRsnCutPrimaryVertex.cxx:41
 AliRsnCutPrimaryVertex.cxx:42
 AliRsnCutPrimaryVertex.cxx:43
 AliRsnCutPrimaryVertex.cxx:44
 AliRsnCutPrimaryVertex.cxx:45
 AliRsnCutPrimaryVertex.cxx:46
 AliRsnCutPrimaryVertex.cxx:47
 AliRsnCutPrimaryVertex.cxx:48
 AliRsnCutPrimaryVertex.cxx:49
 AliRsnCutPrimaryVertex.cxx:50
 AliRsnCutPrimaryVertex.cxx:51
 AliRsnCutPrimaryVertex.cxx:52
 AliRsnCutPrimaryVertex.cxx:53
 AliRsnCutPrimaryVertex.cxx:54
 AliRsnCutPrimaryVertex.cxx:55
 AliRsnCutPrimaryVertex.cxx:56
 AliRsnCutPrimaryVertex.cxx:57
 AliRsnCutPrimaryVertex.cxx:58
 AliRsnCutPrimaryVertex.cxx:59
 AliRsnCutPrimaryVertex.cxx:60
 AliRsnCutPrimaryVertex.cxx:61
 AliRsnCutPrimaryVertex.cxx:62
 AliRsnCutPrimaryVertex.cxx:63
 AliRsnCutPrimaryVertex.cxx:64
 AliRsnCutPrimaryVertex.cxx:65
 AliRsnCutPrimaryVertex.cxx:66
 AliRsnCutPrimaryVertex.cxx:67
 AliRsnCutPrimaryVertex.cxx:68
 AliRsnCutPrimaryVertex.cxx:69
 AliRsnCutPrimaryVertex.cxx:70
 AliRsnCutPrimaryVertex.cxx:71
 AliRsnCutPrimaryVertex.cxx:72
 AliRsnCutPrimaryVertex.cxx:73
 AliRsnCutPrimaryVertex.cxx:74
 AliRsnCutPrimaryVertex.cxx:75
 AliRsnCutPrimaryVertex.cxx:76
 AliRsnCutPrimaryVertex.cxx:77
 AliRsnCutPrimaryVertex.cxx:78
 AliRsnCutPrimaryVertex.cxx:79
 AliRsnCutPrimaryVertex.cxx:80
 AliRsnCutPrimaryVertex.cxx:81
 AliRsnCutPrimaryVertex.cxx:82
 AliRsnCutPrimaryVertex.cxx:83
 AliRsnCutPrimaryVertex.cxx:84
 AliRsnCutPrimaryVertex.cxx:85
 AliRsnCutPrimaryVertex.cxx:86
 AliRsnCutPrimaryVertex.cxx:87
 AliRsnCutPrimaryVertex.cxx:88
 AliRsnCutPrimaryVertex.cxx:89
 AliRsnCutPrimaryVertex.cxx:90
 AliRsnCutPrimaryVertex.cxx:91
 AliRsnCutPrimaryVertex.cxx:92
 AliRsnCutPrimaryVertex.cxx:93
 AliRsnCutPrimaryVertex.cxx:94
 AliRsnCutPrimaryVertex.cxx:95
 AliRsnCutPrimaryVertex.cxx:96
 AliRsnCutPrimaryVertex.cxx:97
 AliRsnCutPrimaryVertex.cxx:98
 AliRsnCutPrimaryVertex.cxx:99
 AliRsnCutPrimaryVertex.cxx:100
 AliRsnCutPrimaryVertex.cxx:101
 AliRsnCutPrimaryVertex.cxx:102
 AliRsnCutPrimaryVertex.cxx:103
 AliRsnCutPrimaryVertex.cxx:104
 AliRsnCutPrimaryVertex.cxx:105
 AliRsnCutPrimaryVertex.cxx:106
 AliRsnCutPrimaryVertex.cxx:107
 AliRsnCutPrimaryVertex.cxx:108
 AliRsnCutPrimaryVertex.cxx:109
 AliRsnCutPrimaryVertex.cxx:110
 AliRsnCutPrimaryVertex.cxx:111
 AliRsnCutPrimaryVertex.cxx:112
 AliRsnCutPrimaryVertex.cxx:113
 AliRsnCutPrimaryVertex.cxx:114
 AliRsnCutPrimaryVertex.cxx:115
 AliRsnCutPrimaryVertex.cxx:116
 AliRsnCutPrimaryVertex.cxx:117
 AliRsnCutPrimaryVertex.cxx:118
 AliRsnCutPrimaryVertex.cxx:119
 AliRsnCutPrimaryVertex.cxx:120
 AliRsnCutPrimaryVertex.cxx:121
 AliRsnCutPrimaryVertex.cxx:122
 AliRsnCutPrimaryVertex.cxx:123
 AliRsnCutPrimaryVertex.cxx:124
 AliRsnCutPrimaryVertex.cxx:125
 AliRsnCutPrimaryVertex.cxx:126
 AliRsnCutPrimaryVertex.cxx:127
 AliRsnCutPrimaryVertex.cxx:128
 AliRsnCutPrimaryVertex.cxx:129
 AliRsnCutPrimaryVertex.cxx:130
 AliRsnCutPrimaryVertex.cxx:131
 AliRsnCutPrimaryVertex.cxx:132
 AliRsnCutPrimaryVertex.cxx:133
 AliRsnCutPrimaryVertex.cxx:134
 AliRsnCutPrimaryVertex.cxx:135
 AliRsnCutPrimaryVertex.cxx:136
 AliRsnCutPrimaryVertex.cxx:137
 AliRsnCutPrimaryVertex.cxx:138
 AliRsnCutPrimaryVertex.cxx:139
 AliRsnCutPrimaryVertex.cxx:140
 AliRsnCutPrimaryVertex.cxx:141
 AliRsnCutPrimaryVertex.cxx:142
 AliRsnCutPrimaryVertex.cxx:143
 AliRsnCutPrimaryVertex.cxx:144
 AliRsnCutPrimaryVertex.cxx:145
 AliRsnCutPrimaryVertex.cxx:146
 AliRsnCutPrimaryVertex.cxx:147
 AliRsnCutPrimaryVertex.cxx:148
 AliRsnCutPrimaryVertex.cxx:149
 AliRsnCutPrimaryVertex.cxx:150
 AliRsnCutPrimaryVertex.cxx:151
 AliRsnCutPrimaryVertex.cxx:152
 AliRsnCutPrimaryVertex.cxx:153
 AliRsnCutPrimaryVertex.cxx:154
 AliRsnCutPrimaryVertex.cxx:155
 AliRsnCutPrimaryVertex.cxx:156
 AliRsnCutPrimaryVertex.cxx:157
 AliRsnCutPrimaryVertex.cxx:158
 AliRsnCutPrimaryVertex.cxx:159
 AliRsnCutPrimaryVertex.cxx:160
 AliRsnCutPrimaryVertex.cxx:161
 AliRsnCutPrimaryVertex.cxx:162
 AliRsnCutPrimaryVertex.cxx:163
 AliRsnCutPrimaryVertex.cxx:164
 AliRsnCutPrimaryVertex.cxx:165
 AliRsnCutPrimaryVertex.cxx:166
 AliRsnCutPrimaryVertex.cxx:167
 AliRsnCutPrimaryVertex.cxx:168
 AliRsnCutPrimaryVertex.cxx:169
 AliRsnCutPrimaryVertex.cxx:170
 AliRsnCutPrimaryVertex.cxx:171
 AliRsnCutPrimaryVertex.cxx:172
 AliRsnCutPrimaryVertex.cxx:173
 AliRsnCutPrimaryVertex.cxx:174
 AliRsnCutPrimaryVertex.cxx:175