#include <TDirectory.h>
#include <TH2F.h>
#include <TF1.h>
+#include <TBits.h>
//____________________________________________________________________
ClassImp(AliESDtrackCuts)
"missing ITS points",
"#Chi^{2} TPC constrained vs. global",
"require TOF out",
- "TOF Distance cut"
+ "TOF Distance cut",
+ "min length in active volume TPC"
};
AliESDtrackCuts* AliESDtrackCuts::fgMultEstTrackCuts[AliESDtrackCuts::kNMultEstTrackCuts] = { 0, 0, 0, 0 };
fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
f1CutMinNClustersTPCPtDep(0x0),
fCutMaxPtDepNClustersTPC(0),
+ fCutMinLengthActiveVolumeTPC(0),
fCutMaxChi2PerClusterTPC(0),
fCutMaxChi2PerClusterITS(0),
fCutMaxChi2TPCConstrainedVsGlobal(0),
fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
f1CutMinNClustersTPCPtDep(0x0),
fCutMaxPtDepNClustersTPC(0),
+ fCutMinLengthActiveVolumeTPC(0),
fCutMaxChi2PerClusterTPC(0),
fCutMaxChi2PerClusterITS(0),
fCutMaxChi2TPCConstrainedVsGlobal(0),
target.f1CutMinNClustersTPCPtDep = (TFormula*) f1CutMinNClustersTPCPtDep->Clone("f1CutMinNClustersTPCPtDep");
}
target.fCutMaxPtDepNClustersTPC = fCutMaxPtDepNClustersTPC;
-
+ target.fCutMinLengthActiveVolumeTPC = fCutMinLengthActiveVolumeTPC;
+
target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
target.fCutMaxChi2TPCConstrainedVsGlobal = fCutMaxChi2TPCConstrainedVsGlobal;
else {
nClustersTPC = esdTrack->GetTPCclusters(0);
}
-
+
//Pt dependent NClusters Cut
if(f1CutMinNClustersTPCPtDep) {
if(esdTrack->Pt()<fCutMaxPtDepNClustersTPC)
if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
cuts[27] = kTRUE;
- for (Int_t i = 0; i < 3; i++)
- cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
+ for (Int_t i = 0; i < 3; i++) {
+ if(!(esdTrack->GetStatus()&AliESDtrack::kITSupg)) { // current ITS
+ cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
+ } else { // upgraded ITS (7 layers)
+ // at the moment, for L012 the layers 12 are considered together
+ if(i==0) { // L012
+ cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(0), (esdTrack->HasPointOnITSLayer(1))&(esdTrack->HasPointOnITSLayer(2)));
+ } else { // L34 or L56
+ cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2+1), esdTrack->HasPointOnITSLayer(i*2+2));
+ }
+ }
+ }
if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
cut = kTRUE;
}
}
+
+ // max length in active volume
+ Float_t lengthInActiveZoneTPC = -1;
+ if (fCutMinLengthActiveVolumeTPC > 1.) { // do the calculation only if needed to save cpu-time
+ if (esdTrack->GetESDEvent()) {
+ lengthInActiveZoneTPC = esdTrack->GetLengthInActiveZone(1, 1.8, 220, esdTrack->GetESDEvent()->GetMagneticField());
+ //
+ if (lengthInActiveZoneTPC < fCutMinLengthActiveVolumeTPC ) {
+ cuts[42] = kTRUE;
+ cut = kTRUE;
+ }
+ }
+ }
+
+
}
//########################################################################
Int_t trackletsITSSA_complementary = 0; //number of SPD tracklets complementary to ITSSA tracks for a given event
const Int_t nESDTracks = esd->GetNumberOfTracks();
- Int_t highestID = 0;
// flags for secondary and rejected tracks
const Int_t kRejBit = BIT(15); // set this bit in global tracks if it is rejected by a cut
const Int_t kSecBit = BIT(16); // set this bit in global tracks if it is secondary according to a cut
for(Int_t itracks=0; itracks < nESDTracks; itracks++) {
- if(esd->GetTrack(itracks)->GetLabel() > highestID) highestID = esd->GetTrack(itracks)->GetLabel();
esd->GetTrack(itracks)->ResetBit(kSecBit|kRejBit); //reset bits used for flagging secondaries and rejected tracks in case they were changed before this analysis
}
- const Int_t maxid = highestID+1; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
+ const Int_t maxid = nESDTracks+1; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
// bit mask for esd tracks, to check if multiple tracklets are associated to it
- Bool_t globalBits[maxid], pureITSBits[maxid];
- for(Int_t i=0; i<maxid; i++){ // set all bools to false
- globalBits[i]=kFALSE;
- pureITSBits[i]=kFALSE;
- }
+ TBits globalBits(maxid), pureITSBits(maxid);
+ // why labels are used with the data? RS
+ // Bool_t globalBits[maxid], pureITSBits[maxid];
+ // for(Int_t i=0; i<maxid; i++){ // set all bools to false
+ // globalBits[i]=kFALSE;
+ // pureITSBits[i]=kFALSE;
+ // }
//*******************************************************************************************************
// get multiplicity from global tracks
track->SetBit(kSecBit);
continue;
}
-
+ /* done via proper DCA cut
//secondary?
if (track->IsOn(AliESDtrack::kMultSec)) {
track->SetBit(kSecBit);
continue;
}
-
+ */
// check tracks with ITS part
//*******************************************************************************************************
if (track->IsOn(AliESDtrack::kITSin) && !track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSTPC) { // track has ITS part but is not an ITS_SA
if (fgMultEstTrackCuts[kMultEstTrackCutGlobal]->AcceptTrack(track)) { // good ITSTPC track
if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
tracksITSTPC++; //global track counted
- globalBits[itracks] = kTRUE;
+ globalBits.SetBitNumber(itracks);
}
else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
}
else if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITS complementary track
if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
tracksITSTPCSA_complementary++;
- globalBits[itracks] = kTRUE;
+ globalBits.SetBitNumber(itracks);
}
else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
}
if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITSSA track
if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
tracksITSSA++;
- pureITSBits[itracks] = kTRUE;
+ pureITSBits.SetBitNumber(itracks);
}
else track->SetBit(kRejBit);
}
// are both clusters from the same tracks? If not, skip the tracklet (shouldn't change things much)
if ((id1!=id2 && id1>=0 && id2>=0) || (id3!=id4 && id3>=0 && id4>=0)) continue;
- Bool_t bUsedInGlobal = (id1 != -1) ? globalBits[id1] : 0;// has associated global track been associated to a previous tracklet?
- Bool_t bUsedInPureITS = (id3 != -1) ? pureITSBits[id3] : 0;// has associated pure ITS track been associated to a previous tracklet?
+ Bool_t bUsedInGlobal = (id1 != -1) ? globalBits.TestBitNumber(id1) : 0;// has associated global track been associated to a previous tracklet?
+ Bool_t bUsedInPureITS = (id3 != -1) ? pureITSBits.TestBitNumber(id3) : 0;// has associated pure ITS track been associated to a previous tracklet?
//*******************************************************************************************************
if (trackType == kTrackletsITSTPC) {
// count tracklets towards global+complementary tracks
(tr1 && tr1->TestBit(kRejBit)) ) { // count tracklet as bad quality track
if(!bUsedInGlobal){
++trackletsITSTPC_complementary;
- if(id1>0) globalBits[id1] = kTRUE; // mark global track linked to this tracklet as "associated"
+ if(id1>0) globalBits.SetBitNumber(id1); // mark global track linked to this tracklet as "associated"
}
}
else if(id1<0) {
(tr3 && tr3->TestBit(kRejBit)) ) { // count tracklet as bad quality track
if(!bUsedInPureITS) {
++trackletsITSSA_complementary;
- if(id3>0) pureITSBits[id3] = kTRUE; // mark global track linked to this tracklet as "associated"
+ if(id3>0) pureITSBits.SetBitNumber(id3); // mark global track linked to this tracklet as "associated"
}
}
else if(id3<0) {