ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/
//
// QA class for Bayes PID
// Plot likelihoods vs various observables
// combined likelihood as well as indiv. detector response
// also plot mass spectrum using TOF for prior determination
//
// Author:
//   Yvonne Pachmayer <Y.Pachmayer@gsi.de>
//
#include <TBrowser.h>
#include <TClass.h>
#include <TH2.h>
#include <THnSparse.h>
#include <TString.h>

#include "AliAODTrack.h"
#include "AliESDtrack.h"
#include "AliLog.h"
#include "AliPID.h"
#include "AliPIDResponse.h"

#include "AliHFEcollection.h"
#include "AliHFEpidBase.h"
#include "AliHFEpidQAmanager.h"
#include "AliHFEpidTPC.h"
#include "AliHFEpidTOF.h"
#include "AliHFEpidTRD.h"
#include "AliHFEpidBayes.h"
#include "AliHFEtools.h"
#include "AliHFEbayesPIDqa.h"
#include "AliHFEdetPIDqa.h"

ClassImp(AliHFEbayesPIDqa)

//_________________________________________________________
AliHFEbayesPIDqa::AliHFEbayesPIDqa():
    AliHFEdetPIDqa()
  , fHistos(NULL)
{
  //
  // Dummy constructor
  //
}

//_________________________________________________________
AliHFEbayesPIDqa::AliHFEbayesPIDqa(const char* name):
    AliHFEdetPIDqa(name, "QA for Bayes")
  , fHistos(NULL)
{
  //
  // Default constructor
  //
}

//____________________________________________________________
AliHFEbayesPIDqa::AliHFEbayesPIDqa(const AliHFEbayesPIDqa &o):
    AliHFEdetPIDqa(o),
    fHistos(NULL)
{
  //
  // Copy constructor
  //
}

//____________________________________________________________
AliHFEbayesPIDqa &AliHFEbayesPIDqa::operator=(const AliHFEbayesPIDqa &o){
  //
  // Make assignment
  //
  if(this != &o){
    AliHFEdetPIDqa::operator=(o);
    fHistos = o.fHistos;
  }
  return *this;
}


//_________________________________________________________
AliHFEbayesPIDqa::~AliHFEbayesPIDqa(){
  //
  // Destructor
  //
  if(fHistos) delete fHistos;
}
//_________________________________________________________
void AliHFEbayesPIDqa::Copy(TObject &o) const {
  //
  // Make copy
  //
  AliHFEbayesPIDqa &target = dynamic_cast<AliHFEbayesPIDqa &>(o);
  if(target.fHistos){
    delete target.fHistos;
    target.fHistos = NULL;
  }
  if(fHistos) target.fHistos = new AliHFEcollection(*fHistos);

}

//_________________________________________________________
Long64_t AliHFEbayesPIDqa::Merge(TCollection *coll){
  //
  // Merge with other objects
  //
  if(!coll) return 0;
  if(coll->IsEmpty()) return 1;

  TIter it(coll);
  AliHFEbayesPIDqa *refQA = NULL;
  TObject *o = NULL;
  Long64_t count = 0;
  TList listHistos;
  while((o = it())){
    refQA = dynamic_cast<AliHFEbayesPIDqa *>(o);
    if(!refQA) continue;

    listHistos.Add(refQA->fHistos);
    count++; 
  }
  fHistos->Merge(&listHistos);
  return count + 1;
}
//_________________________________________________________
void AliHFEbayesPIDqa::Initialize(){
  //
  // Define Histograms
  //

  fHistos = new AliHFEcollection("BAYESqahistos", "Collection of Bayes QA histograms");

  CreateDetectorSignalHistograms();

//  fBAYESpid = new AliHFEpidBayes("QAbayesPID");

}


void AliHFEbayesPIDqa::CreateDetectorSignalHistograms(){
  //
  // Create Histogram for Probability Studies
    //

    Int_t kPbins = 1000;  //fQAmanager->HasHighResolutionHistos() ? 1000 : 100;
    Int_t kSigmaBins = 300; //fQAmanager->HasHighResolutionHistos() ? 600 : 150;
    Int_t trdLikelihoodBins = 100; // fQAmanager->HasHighResolutionHistos() ? 200 : 100;
    const Int_t kPIDbins = AliPID::kSPECIES + 1;
    const Int_t kProbbins = 100;
    const Int_t kSteps = 2;
    const Int_t kCentralityBins = 11;
    const Double_t kMinPID = -1;
    const Double_t kMinP = 0.;
    const Double_t kMaxPID = (Double_t)AliPID::kSPECIES;
    const Double_t kMaxP = 10.;

    Int_t nBinsContr[8] =  {kPIDbins, kPbins, kProbbins, kSigmaBins, kSigmaBins, trdLikelihoodBins, kSteps, kCentralityBins};
    Double_t minContr[8] = {kMinPID, kMinP, 0,  -10., -7., 0., 0., 0.};
    Double_t maxContr[8] = {kMaxPID, kMaxP, 1,    5.,   8., 1., 2., 11.};
    fHistos->CreateTHnSparse("control", "Control; species; p [GeV/c]; Comb prob; TPC sigma; TOF sigma; TRD electron Likelihood; selection step; centrality", 8, nBinsContr, minContr,maxContr);



    Int_t nBinsTOFmass[5] = {kPIDbins, kPbins, 150, kSteps, kCentralityBins};
    Double_t minTOFmass[5] = {kMinPID, kMinP, 0., 0., 0.};
    Double_t maxTOFmass[5] = {kMaxPID, kMaxP, 1.5, 2., 11.};
    fHistos->CreateTHnSparse("tofmass", "TOF mass; species; p [GeV/c]; TOF mass; selection step", 5, nBinsTOFmass, minTOFmass, maxTOFmass);


}
//_________________________________________________________
void AliHFEbayesPIDqa::ProcessTrack(const AliHFEpidObject *track, AliHFEdetPIDqa::EStep_t step){
  //
  // Fill TPC histograms
  //
  AliDebug(1, Form("QA started for BAYES PID for step %d", (Int_t)step));
  AliHFEpidObject::AnalysisType_t anatype = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis : AliHFEpidObject::kAODanalysis;
  Float_t centrality = track->GetCentrality();
  Int_t species = track->GetAbInitioPID();
  if(species >= AliPID::kSPECIES) species = -1;

  Double_t probComb[AliPID::kSPECIES]={0.};
  AliHFEpidBayes *bayespid = dynamic_cast<AliHFEpidBayes *>(fQAmanager->GetDetectorPID(AliHFEpid::kBAYESpid));
  const AliPIDResponse *pidResponseBayes = bayespid ? bayespid->GetPIDResponse() : NULL;
  if(!pidResponseBayes){
    AliError("No PID Response available");
    return;
  }
  bayespid->CalcCombProb(track,pidResponseBayes, probComb);

  Double_t contentSignal[8];
  contentSignal[0] = species;
  contentSignal[1] = track->GetRecTrack()->P();
  contentSignal[2] = probComb[AliPID::kElectron];
//  contentSignal[2] = contentSignal[2] = pidResponse ? pidResponse->NumberOfSigmasTPC(track->GetRecTrack(), AliPID::kElectron) : 0.;

  AliHFEpidTOF *tofpid = dynamic_cast<AliHFEpidTOF *>(fQAmanager->GetDetectorPID(AliHFEpid::kTOFpid));
  const AliPIDResponse *pidResponseTOF = tofpid ? tofpid->GetPIDResponse() : NULL;
  if(!pidResponseTOF){
    AliError("No PID response available");
    return;
  }
  contentSignal[4] = pidResponseTOF->NumberOfSigmasTOF(track->GetRecTrack(), AliPID::kElectron);

  AliHFEpidTPC *tpcpid = dynamic_cast<AliHFEpidTPC *>(fQAmanager->GetDetectorPID(AliHFEpid::kTPCpid));
  const AliPIDResponse *pidResponse = tpcpid ? tpcpid->GetPIDResponse() : NULL;
  if(!pidResponse){
    AliError("No PID response available");
    return;
  }
  contentSignal[3] = pidResponse->NumberOfSigmasTPC(track->GetRecTrack(), AliPID::kElectron);

  AliHFEpidTRD *trdpid = dynamic_cast<AliHFEpidTRD *>(fQAmanager->GetDetectorPID(AliHFEpid::kTRDpid));
  contentSignal[5] = trdpid ? trdpid->GetElectronLikelihood(static_cast<const AliVTrack*>(track->GetRecTrack()), anatype) : -10;

  contentSignal[6] = step;
  contentSignal[7] = centrality;
  fHistos->Fill("control", contentSignal);

  Double_t contentFill[5];
  contentFill[0]=contentSignal[0];
  contentFill[1]=contentSignal[1];
  contentFill[3]=contentSignal[6];
  contentFill[4]=contentSignal[7];

  Double_t masscalcfromtof=CalcTOFMass(track);
  contentFill[2]=masscalcfromtof;
  fHistos->Fill("tofmass", contentFill);
}

Double_t AliHFEbayesPIDqa::CalcTOFMass(const AliHFEpidObject *track){
    //
    // Calc TOF mass
    //

   Double_t mass=-99; //GeV
   Double_t length=((AliESDtrack*)track->GetRecTrack())->GetIntegratedLength();
   if (length<=0) return mass;
   Double_t tofTime=((AliESDtrack*)track->GetRecTrack())->GetTOFsignal();//in ps
   Double_t tof= tofTime*1E-3; // ns, average T0 fill subtracted, no info from T0detector
   if (tof<=0) return mass;
   Double_t c=TMath::C()*1.E-9;// m/ns
   length =length*0.01; // in meters
   tof=tof*c;
   Double_t fact= (tof/length)*(tof/length) -1.;
   Double_t mom=track->GetRecTrack()->P();
   if(mom==0) return mass;

   if(fact<=0) {
       mass = -mom*TMath::Sqrt(-fact);
   }else{
       mass = mom*TMath::Sqrt(fact);
   }

   return mass;
}

 AliHFEbayesPIDqa.cxx:1
 AliHFEbayesPIDqa.cxx:2
 AliHFEbayesPIDqa.cxx:3
 AliHFEbayesPIDqa.cxx:4
 AliHFEbayesPIDqa.cxx:5
 AliHFEbayesPIDqa.cxx:6
 AliHFEbayesPIDqa.cxx:7
 AliHFEbayesPIDqa.cxx:8
 AliHFEbayesPIDqa.cxx:9
 AliHFEbayesPIDqa.cxx:10
 AliHFEbayesPIDqa.cxx:11
 AliHFEbayesPIDqa.cxx:12
 AliHFEbayesPIDqa.cxx:13
 AliHFEbayesPIDqa.cxx:14
 AliHFEbayesPIDqa.cxx:15
 AliHFEbayesPIDqa.cxx:16
 AliHFEbayesPIDqa.cxx:17
 AliHFEbayesPIDqa.cxx:18
 AliHFEbayesPIDqa.cxx:19
 AliHFEbayesPIDqa.cxx:20
 AliHFEbayesPIDqa.cxx:21
 AliHFEbayesPIDqa.cxx:22
 AliHFEbayesPIDqa.cxx:23
 AliHFEbayesPIDqa.cxx:24
 AliHFEbayesPIDqa.cxx:25
 AliHFEbayesPIDqa.cxx:26
 AliHFEbayesPIDqa.cxx:27
 AliHFEbayesPIDqa.cxx:28
 AliHFEbayesPIDqa.cxx:29
 AliHFEbayesPIDqa.cxx:30
 AliHFEbayesPIDqa.cxx:31
 AliHFEbayesPIDqa.cxx:32
 AliHFEbayesPIDqa.cxx:33
 AliHFEbayesPIDqa.cxx:34
 AliHFEbayesPIDqa.cxx:35
 AliHFEbayesPIDqa.cxx:36
 AliHFEbayesPIDqa.cxx:37
 AliHFEbayesPIDqa.cxx:38
 AliHFEbayesPIDqa.cxx:39
 AliHFEbayesPIDqa.cxx:40
 AliHFEbayesPIDqa.cxx:41
 AliHFEbayesPIDqa.cxx:42
 AliHFEbayesPIDqa.cxx:43
 AliHFEbayesPIDqa.cxx:44
 AliHFEbayesPIDqa.cxx:45
 AliHFEbayesPIDqa.cxx:46
 AliHFEbayesPIDqa.cxx:47
 AliHFEbayesPIDqa.cxx:48
 AliHFEbayesPIDqa.cxx:49
 AliHFEbayesPIDqa.cxx:50
 AliHFEbayesPIDqa.cxx:51
 AliHFEbayesPIDqa.cxx:52
 AliHFEbayesPIDqa.cxx:53
 AliHFEbayesPIDqa.cxx:54
 AliHFEbayesPIDqa.cxx:55
 AliHFEbayesPIDqa.cxx:56
 AliHFEbayesPIDqa.cxx:57
 AliHFEbayesPIDqa.cxx:58
 AliHFEbayesPIDqa.cxx:59
 AliHFEbayesPIDqa.cxx:60
 AliHFEbayesPIDqa.cxx:61
 AliHFEbayesPIDqa.cxx:62
 AliHFEbayesPIDqa.cxx:63
 AliHFEbayesPIDqa.cxx:64
 AliHFEbayesPIDqa.cxx:65
 AliHFEbayesPIDqa.cxx:66
 AliHFEbayesPIDqa.cxx:67
 AliHFEbayesPIDqa.cxx:68
 AliHFEbayesPIDqa.cxx:69
 AliHFEbayesPIDqa.cxx:70
 AliHFEbayesPIDqa.cxx:71
 AliHFEbayesPIDqa.cxx:72
 AliHFEbayesPIDqa.cxx:73
 AliHFEbayesPIDqa.cxx:74
 AliHFEbayesPIDqa.cxx:75
 AliHFEbayesPIDqa.cxx:76
 AliHFEbayesPIDqa.cxx:77
 AliHFEbayesPIDqa.cxx:78
 AliHFEbayesPIDqa.cxx:79
 AliHFEbayesPIDqa.cxx:80
 AliHFEbayesPIDqa.cxx:81
 AliHFEbayesPIDqa.cxx:82
 AliHFEbayesPIDqa.cxx:83
 AliHFEbayesPIDqa.cxx:84
 AliHFEbayesPIDqa.cxx:85
 AliHFEbayesPIDqa.cxx:86
 AliHFEbayesPIDqa.cxx:87
 AliHFEbayesPIDqa.cxx:88
 AliHFEbayesPIDqa.cxx:89
 AliHFEbayesPIDqa.cxx:90
 AliHFEbayesPIDqa.cxx:91
 AliHFEbayesPIDqa.cxx:92
 AliHFEbayesPIDqa.cxx:93
 AliHFEbayesPIDqa.cxx:94
 AliHFEbayesPIDqa.cxx:95
 AliHFEbayesPIDqa.cxx:96
 AliHFEbayesPIDqa.cxx:97
 AliHFEbayesPIDqa.cxx:98
 AliHFEbayesPIDqa.cxx:99
 AliHFEbayesPIDqa.cxx:100
 AliHFEbayesPIDqa.cxx:101
 AliHFEbayesPIDqa.cxx:102
 AliHFEbayesPIDqa.cxx:103
 AliHFEbayesPIDqa.cxx:104
 AliHFEbayesPIDqa.cxx:105
 AliHFEbayesPIDqa.cxx:106
 AliHFEbayesPIDqa.cxx:107
 AliHFEbayesPIDqa.cxx:108
 AliHFEbayesPIDqa.cxx:109
 AliHFEbayesPIDqa.cxx:110
 AliHFEbayesPIDqa.cxx:111
 AliHFEbayesPIDqa.cxx:112
 AliHFEbayesPIDqa.cxx:113
 AliHFEbayesPIDqa.cxx:114
 AliHFEbayesPIDqa.cxx:115
 AliHFEbayesPIDqa.cxx:116
 AliHFEbayesPIDqa.cxx:117
 AliHFEbayesPIDqa.cxx:118
 AliHFEbayesPIDqa.cxx:119
 AliHFEbayesPIDqa.cxx:120
 AliHFEbayesPIDqa.cxx:121
 AliHFEbayesPIDqa.cxx:122
 AliHFEbayesPIDqa.cxx:123
 AliHFEbayesPIDqa.cxx:124
 AliHFEbayesPIDqa.cxx:125
 AliHFEbayesPIDqa.cxx:126
 AliHFEbayesPIDqa.cxx:127
 AliHFEbayesPIDqa.cxx:128
 AliHFEbayesPIDqa.cxx:129
 AliHFEbayesPIDqa.cxx:130
 AliHFEbayesPIDqa.cxx:131
 AliHFEbayesPIDqa.cxx:132
 AliHFEbayesPIDqa.cxx:133
 AliHFEbayesPIDqa.cxx:134
 AliHFEbayesPIDqa.cxx:135
 AliHFEbayesPIDqa.cxx:136
 AliHFEbayesPIDqa.cxx:137
 AliHFEbayesPIDqa.cxx:138
 AliHFEbayesPIDqa.cxx:139
 AliHFEbayesPIDqa.cxx:140
 AliHFEbayesPIDqa.cxx:141
 AliHFEbayesPIDqa.cxx:142
 AliHFEbayesPIDqa.cxx:143
 AliHFEbayesPIDqa.cxx:144
 AliHFEbayesPIDqa.cxx:145
 AliHFEbayesPIDqa.cxx:146
 AliHFEbayesPIDqa.cxx:147
 AliHFEbayesPIDqa.cxx:148
 AliHFEbayesPIDqa.cxx:149
 AliHFEbayesPIDqa.cxx:150
 AliHFEbayesPIDqa.cxx:151
 AliHFEbayesPIDqa.cxx:152
 AliHFEbayesPIDqa.cxx:153
 AliHFEbayesPIDqa.cxx:154
 AliHFEbayesPIDqa.cxx:155
 AliHFEbayesPIDqa.cxx:156
 AliHFEbayesPIDqa.cxx:157
 AliHFEbayesPIDqa.cxx:158
 AliHFEbayesPIDqa.cxx:159
 AliHFEbayesPIDqa.cxx:160
 AliHFEbayesPIDqa.cxx:161
 AliHFEbayesPIDqa.cxx:162
 AliHFEbayesPIDqa.cxx:163
 AliHFEbayesPIDqa.cxx:164
 AliHFEbayesPIDqa.cxx:165
 AliHFEbayesPIDqa.cxx:166
 AliHFEbayesPIDqa.cxx:167
 AliHFEbayesPIDqa.cxx:168
 AliHFEbayesPIDqa.cxx:169
 AliHFEbayesPIDqa.cxx:170
 AliHFEbayesPIDqa.cxx:171
 AliHFEbayesPIDqa.cxx:172
 AliHFEbayesPIDqa.cxx:173
 AliHFEbayesPIDqa.cxx:174
 AliHFEbayesPIDqa.cxx:175
 AliHFEbayesPIDqa.cxx:176
 AliHFEbayesPIDqa.cxx:177
 AliHFEbayesPIDqa.cxx:178
 AliHFEbayesPIDqa.cxx:179
 AliHFEbayesPIDqa.cxx:180
 AliHFEbayesPIDqa.cxx:181
 AliHFEbayesPIDqa.cxx:182
 AliHFEbayesPIDqa.cxx:183
 AliHFEbayesPIDqa.cxx:184
 AliHFEbayesPIDqa.cxx:185
 AliHFEbayesPIDqa.cxx:186
 AliHFEbayesPIDqa.cxx:187
 AliHFEbayesPIDqa.cxx:188
 AliHFEbayesPIDqa.cxx:189
 AliHFEbayesPIDqa.cxx:190
 AliHFEbayesPIDqa.cxx:191
 AliHFEbayesPIDqa.cxx:192
 AliHFEbayesPIDqa.cxx:193
 AliHFEbayesPIDqa.cxx:194
 AliHFEbayesPIDqa.cxx:195
 AliHFEbayesPIDqa.cxx:196
 AliHFEbayesPIDqa.cxx:197
 AliHFEbayesPIDqa.cxx:198
 AliHFEbayesPIDqa.cxx:199
 AliHFEbayesPIDqa.cxx:200
 AliHFEbayesPIDqa.cxx:201
 AliHFEbayesPIDqa.cxx:202
 AliHFEbayesPIDqa.cxx:203
 AliHFEbayesPIDqa.cxx:204
 AliHFEbayesPIDqa.cxx:205
 AliHFEbayesPIDqa.cxx:206
 AliHFEbayesPIDqa.cxx:207
 AliHFEbayesPIDqa.cxx:208
 AliHFEbayesPIDqa.cxx:209
 AliHFEbayesPIDqa.cxx:210
 AliHFEbayesPIDqa.cxx:211
 AliHFEbayesPIDqa.cxx:212
 AliHFEbayesPIDqa.cxx:213
 AliHFEbayesPIDqa.cxx:214
 AliHFEbayesPIDqa.cxx:215
 AliHFEbayesPIDqa.cxx:216
 AliHFEbayesPIDqa.cxx:217
 AliHFEbayesPIDqa.cxx:218
 AliHFEbayesPIDqa.cxx:219
 AliHFEbayesPIDqa.cxx:220
 AliHFEbayesPIDqa.cxx:221
 AliHFEbayesPIDqa.cxx:222
 AliHFEbayesPIDqa.cxx:223
 AliHFEbayesPIDqa.cxx:224
 AliHFEbayesPIDqa.cxx:225
 AliHFEbayesPIDqa.cxx:226
 AliHFEbayesPIDqa.cxx:227
 AliHFEbayesPIDqa.cxx:228
 AliHFEbayesPIDqa.cxx:229
 AliHFEbayesPIDqa.cxx:230
 AliHFEbayesPIDqa.cxx:231
 AliHFEbayesPIDqa.cxx:232
 AliHFEbayesPIDqa.cxx:233
 AliHFEbayesPIDqa.cxx:234
 AliHFEbayesPIDqa.cxx:235
 AliHFEbayesPIDqa.cxx:236
 AliHFEbayesPIDqa.cxx:237
 AliHFEbayesPIDqa.cxx:238
 AliHFEbayesPIDqa.cxx:239
 AliHFEbayesPIDqa.cxx:240
 AliHFEbayesPIDqa.cxx:241
 AliHFEbayesPIDqa.cxx:242
 AliHFEbayesPIDqa.cxx:243
 AliHFEbayesPIDqa.cxx:244
 AliHFEbayesPIDqa.cxx:245
 AliHFEbayesPIDqa.cxx:246
 AliHFEbayesPIDqa.cxx:247
 AliHFEbayesPIDqa.cxx:248
 AliHFEbayesPIDqa.cxx:249
 AliHFEbayesPIDqa.cxx:250
 AliHFEbayesPIDqa.cxx:251
 AliHFEbayesPIDqa.cxx:252
 AliHFEbayesPIDqa.cxx:253
 AliHFEbayesPIDqa.cxx:254
 AliHFEbayesPIDqa.cxx:255
 AliHFEbayesPIDqa.cxx:256
 AliHFEbayesPIDqa.cxx:257
 AliHFEbayesPIDqa.cxx:258
 AliHFEbayesPIDqa.cxx:259
 AliHFEbayesPIDqa.cxx:260
 AliHFEbayesPIDqa.cxx:261
 AliHFEbayesPIDqa.cxx:262
 AliHFEbayesPIDqa.cxx:263
 AliHFEbayesPIDqa.cxx:264
 AliHFEbayesPIDqa.cxx:265
 AliHFEbayesPIDqa.cxx:266
 AliHFEbayesPIDqa.cxx:267
 AliHFEbayesPIDqa.cxx:268