ROOT logo
/*****************************************************************
 
 General utility class for doing pp vs multiplicity studies
 
 --- Functionality being added on demand.
 
 --- Please report any bugs, comments, suggestions to:
 david.dobrigkeit.chinellato@cern.ch
 
 *****************************************************************/

#include "AliVEvent.h"
#include "AliESDEvent.h"
#include "AliAODEvent.h"
#include "AliVVertex.h"
#include "AliLog.h"
#include "AliAODVertex.h"
#include "AliVTrack.h"
#include "AliVEvent.h"
#include <TMatrixDSym.h>
#include <TMath.h>
#include "AliESDUtils.h"
#include "AliPPVsMultUtils.h"
#include <TFile.h>


ClassImp(AliPPVsMultUtils)

//______________________________________________________________________
AliPPVsMultUtils::AliPPVsMultUtils():TObject(),
fRunNumber(0),
fCalibrationLoaded(0),
fBoundaryHisto_V0M(0),
fBoundaryHisto_V0A(0),
fBoundaryHisto_V0C(0),
fBoundaryHisto_V0MEq(0),
fBoundaryHisto_V0AEq(0),
fBoundaryHisto_V0CEq(0)
{
    // Default contructor
}


//_____________________________________________________________________________
AliPPVsMultUtils::AliPPVsMultUtils(const AliPPVsMultUtils &c) : TObject(c),
fRunNumber(0),
fCalibrationLoaded(0),
fBoundaryHisto_V0M(0),
fBoundaryHisto_V0A(0),
fBoundaryHisto_V0C(0),
fBoundaryHisto_V0MEq(0),
fBoundaryHisto_V0AEq(0),
fBoundaryHisto_V0CEq(0)
{
    //
    // copy constructor - untested
    //
    ((AliPPVsMultUtils &) c).Copy(*this);
}

//_____________________________________________________________________________
AliPPVsMultUtils &AliPPVsMultUtils::operator=(const AliPPVsMultUtils &c)
{
    //
    // Assignment operator - untested
    //
    
    if (this != &c) ((AliPPVsMultUtils &) c).Copy(*this);
    return *this;
}

//______________________________________________________________________
Float_t AliPPVsMultUtils::GetMultiplicityPercentile(AliVEvent *event, TString lMethod)
// Function to get multiplicity quantiles
{
    Int_t lRequestedRunNumber = event->GetRunNumber();
    if( lRequestedRunNumber != fRunNumber ) fCalibrationLoaded = LoadCalibration( lRequestedRunNumber );
    
    if ( !fCalibrationLoaded ){
        return -1000; //Return absurd value (hopefully noone will use this...)
    }
    if ( !fBoundaryHisto_V0M   || !fBoundaryHisto_V0A   || !fBoundaryHisto_V0C ||
        !fBoundaryHisto_V0MEq || !fBoundaryHisto_V0AEq || !fBoundaryHisto_V0CEq ){
        return -1000; //Return absurd value (hopefully noone will use this...)
    }
    
    Float_t lreturnval = -1;
    
    //Get VZERO Information for multiplicity later
    AliVVZERO* esdV0 = event->GetVZEROData();
    if (!esdV0) {
        AliError("AliVVZERO not available");
        return -1;
    }
    
    // VZERO PART
    Float_t  multV0A  = 0;            //  multiplicity from V0 reco side A
    Float_t  multV0C  = 0;            //  multiplicity from V0 reco side C
    Float_t  multV0AEq  = 0;          //  multiplicity from V0 reco side A
    Float_t  multV0CEq  = 0;          //  multiplicity from V0 reco side C
    Float_t  multV0ACorr  = 0;            //  multiplicity from V0 reco side A
    Float_t  multV0CCorr  = 0;            //  multiplicity from V0 reco side C
    
    //Non-Equalized Signal: copy of multV0ACorr and multV0CCorr from AliCentralitySelectionTask
    //Getters for uncorrected multiplicity
    multV0A=esdV0->GetMTotV0A();
    multV0C=esdV0->GetMTotV0C();
    
    //Getting around to the SPD vertex -> typecast to ESD/AOD
    const AliVVertex *lPrimarySPDVtx = NULL;
    /* get ESD vertex SPD */
    if (event->InheritsFrom("AliESDEvent")) {
        AliESDEvent *esdevent = dynamic_cast<AliESDEvent *>(event);
        if (!esdevent) return kFALSE;
        lPrimarySPDVtx = esdevent->GetPrimaryVertexSPD();
    }
    /* get AOD vertex SPD */
    else if (event->InheritsFrom("AliAODEvent")) {
        AliAODEvent *aodevent = dynamic_cast<AliAODEvent *>(event);
        if (!aodevent) return kFALSE;
        lPrimarySPDVtx = aodevent->GetPrimaryVertexSPD();
    }
    
    //Get Z vertex position of SPD vertex (why not Tracking if available?)
    Float_t zvtx = lPrimarySPDVtx->GetZ();
    
    //Acquire Corrected multV0A
    multV0ACorr = AliESDUtils::GetCorrV0A(multV0A,zvtx);
    multV0CCorr = AliESDUtils::GetCorrV0C(multV0C,zvtx);
    
    // Equalized signals // From AliCentralitySelectionTask // Updated
    for(Int_t iCh = 32; iCh < 64; ++iCh) {
        Double_t mult = event->GetVZEROEqMultiplicity(iCh);
        multV0AEq += mult;
    }
    for(Int_t iCh = 0; iCh < 32; ++iCh) {
        Double_t mult = event->GetVZEROEqMultiplicity(iCh);
        multV0CEq += mult;
    }
    
    if ( lMethod == "V0M" ) lreturnval =
        fBoundaryHisto_V0M -> GetBinContent( fBoundaryHisto_V0M->FindBin(multV0ACorr+multV0CCorr) );
    if ( lMethod == "V0A" ) lreturnval =
        fBoundaryHisto_V0A -> GetBinContent( fBoundaryHisto_V0A->FindBin(multV0ACorr) );
    if ( lMethod == "V0C" ) lreturnval =
        fBoundaryHisto_V0C -> GetBinContent( fBoundaryHisto_V0C->FindBin(multV0CCorr) );
    //equalized
    if ( lMethod == "V0MEq" ) lreturnval =
        fBoundaryHisto_V0MEq -> GetBinContent( fBoundaryHisto_V0MEq->FindBin(multV0AEq+multV0CEq) );
    if ( lMethod == "V0AEq" ) lreturnval =
        fBoundaryHisto_V0AEq -> GetBinContent( fBoundaryHisto_V0AEq->FindBin(multV0AEq) );
    if ( lMethod == "V0CEq" ) lreturnval =
        fBoundaryHisto_V0CEq -> GetBinContent( fBoundaryHisto_V0CEq->FindBin(multV0CEq) );
    
    return lreturnval;
}

//______________________________________________________________________
Bool_t AliPPVsMultUtils::LoadCalibration(Int_t lLoadThisCalibration)
//To be called if starting analysis on a new run
{
    //If Histograms exist, de-allocate to prevent memory leakage
    if( fBoundaryHisto_V0M ) {fBoundaryHisto_V0M->Delete(); fBoundaryHisto_V0M = 0x0; }
    if( fBoundaryHisto_V0A ) {fBoundaryHisto_V0A->Delete(); fBoundaryHisto_V0A = 0x0; }
    if( fBoundaryHisto_V0C ) {fBoundaryHisto_V0C->Delete(); fBoundaryHisto_V0C = 0x0; }
    if( fBoundaryHisto_V0MEq ) {fBoundaryHisto_V0MEq->Delete(); fBoundaryHisto_V0MEq = 0x0; }
    if( fBoundaryHisto_V0AEq ) {fBoundaryHisto_V0AEq->Delete(); fBoundaryHisto_V0AEq = 0x0; }
    if( fBoundaryHisto_V0CEq ) {fBoundaryHisto_V0CEq->Delete(); fBoundaryHisto_V0CEq = 0x0; }
    
    AliInfo(Form( "Loading calibration file for run %i",lLoadThisCalibration) );
    TFile *lCalibFile_V0M = 0x0;
    TFile *lCalibFile_V0A = 0x0;
    TFile *lCalibFile_V0C = 0x0;
    TFile *lCalibFile_V0MEq = 0x0;
    TFile *lCalibFile_V0AEq = 0x0;
    TFile *lCalibFile_V0CEq = 0x0;
    
    //AliInfo("Calling TFile::Open");
    lCalibFile_V0M = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0M.root");
    lCalibFile_V0A = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0A.root");
    lCalibFile_V0C = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0C.root");
    lCalibFile_V0MEq = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0MEq.root");
    lCalibFile_V0AEq = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0AEq.root");
    lCalibFile_V0CEq = TFile::Open("$ALICE_ROOT/PWGLF/STRANGENESS/Cascades/corrections/calibration_V0CEq.root");
    
    //AliInfo("Casting");
    fBoundaryHisto_V0M   = dynamic_cast<TH1F *>(lCalibFile_V0M  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
    fBoundaryHisto_V0A   = dynamic_cast<TH1F *>(lCalibFile_V0A  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
    fBoundaryHisto_V0C   = dynamic_cast<TH1F *>(lCalibFile_V0C  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
    fBoundaryHisto_V0MEq   = dynamic_cast<TH1F *>(lCalibFile_V0MEq  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
    fBoundaryHisto_V0AEq   = dynamic_cast<TH1F *>(lCalibFile_V0AEq  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
    fBoundaryHisto_V0CEq   = dynamic_cast<TH1F *>(lCalibFile_V0CEq  -> Get(Form("histocalib%i",lLoadThisCalibration)) );
    
    if ( !fBoundaryHisto_V0M   || !fBoundaryHisto_V0A   || !fBoundaryHisto_V0C ||
        !fBoundaryHisto_V0MEq || !fBoundaryHisto_V0AEq || !fBoundaryHisto_V0CEq ){
        AliInfo(Form("No calibration for run %i exists at the moment!",lLoadThisCalibration));
        if( lCalibFile_V0M ) {lCalibFile_V0M->Close(); lCalibFile_V0M->Delete(); delete lCalibFile_V0M; }
        if( lCalibFile_V0A ) {lCalibFile_V0A->Close(); lCalibFile_V0A->Delete(); delete lCalibFile_V0A; }
        if( lCalibFile_V0C ) {lCalibFile_V0C->Close(); lCalibFile_V0C->Delete(); delete lCalibFile_V0C; }
        if( lCalibFile_V0MEq ) {lCalibFile_V0MEq->Close(); lCalibFile_V0MEq->Delete(); delete lCalibFile_V0MEq; }
        if( lCalibFile_V0AEq ) {lCalibFile_V0AEq->Close(); lCalibFile_V0AEq->Delete(); delete lCalibFile_V0AEq; }
        if( lCalibFile_V0CEq ) {lCalibFile_V0CEq->Close(); lCalibFile_V0CEq->Delete(); delete lCalibFile_V0CEq; }
        fRunNumber = lLoadThisCalibration;
        return kFALSE; //return denial
    }
    
    //Careful with manual cleanup if needed: to be implemented
    fBoundaryHisto_V0M->SetDirectory(0);
    fBoundaryHisto_V0A->SetDirectory(0);
    fBoundaryHisto_V0C->SetDirectory(0);
    fBoundaryHisto_V0MEq->SetDirectory(0);
    fBoundaryHisto_V0AEq->SetDirectory(0);
    fBoundaryHisto_V0CEq->SetDirectory(0);
    
    //AliInfo("Closing");
    if( lCalibFile_V0M ) {lCalibFile_V0M->Close(); lCalibFile_V0M->Delete(); delete lCalibFile_V0M; }
    if( lCalibFile_V0A ) {lCalibFile_V0A->Close(); lCalibFile_V0A->Delete(); delete lCalibFile_V0A; }
    if( lCalibFile_V0C ) {lCalibFile_V0C->Close(); lCalibFile_V0C->Delete(); delete lCalibFile_V0C; }
    if( lCalibFile_V0MEq ) {lCalibFile_V0MEq->Close(); lCalibFile_V0MEq->Delete(); delete lCalibFile_V0MEq; }
    if( lCalibFile_V0AEq ) {lCalibFile_V0AEq->Close(); lCalibFile_V0AEq->Delete(); delete lCalibFile_V0AEq; }
    if( lCalibFile_V0CEq ) {lCalibFile_V0CEq->Close(); lCalibFile_V0CEq->Delete(); delete lCalibFile_V0CEq; }
    
    fRunNumber = lLoadThisCalibration; //Loaded!
    AliInfo(Form("Finished loading calibration for run %i",lLoadThisCalibration));
    return kTRUE;
}
 AliPPVsMultUtils.cxx:1
 AliPPVsMultUtils.cxx:2
 AliPPVsMultUtils.cxx:3
 AliPPVsMultUtils.cxx:4
 AliPPVsMultUtils.cxx:5
 AliPPVsMultUtils.cxx:6
 AliPPVsMultUtils.cxx:7
 AliPPVsMultUtils.cxx:8
 AliPPVsMultUtils.cxx:9
 AliPPVsMultUtils.cxx:10
 AliPPVsMultUtils.cxx:11
 AliPPVsMultUtils.cxx:12
 AliPPVsMultUtils.cxx:13
 AliPPVsMultUtils.cxx:14
 AliPPVsMultUtils.cxx:15
 AliPPVsMultUtils.cxx:16
 AliPPVsMultUtils.cxx:17
 AliPPVsMultUtils.cxx:18
 AliPPVsMultUtils.cxx:19
 AliPPVsMultUtils.cxx:20
 AliPPVsMultUtils.cxx:21
 AliPPVsMultUtils.cxx:22
 AliPPVsMultUtils.cxx:23
 AliPPVsMultUtils.cxx:24
 AliPPVsMultUtils.cxx:25
 AliPPVsMultUtils.cxx:26
 AliPPVsMultUtils.cxx:27
 AliPPVsMultUtils.cxx:28
 AliPPVsMultUtils.cxx:29
 AliPPVsMultUtils.cxx:30
 AliPPVsMultUtils.cxx:31
 AliPPVsMultUtils.cxx:32
 AliPPVsMultUtils.cxx:33
 AliPPVsMultUtils.cxx:34
 AliPPVsMultUtils.cxx:35
 AliPPVsMultUtils.cxx:36
 AliPPVsMultUtils.cxx:37
 AliPPVsMultUtils.cxx:38
 AliPPVsMultUtils.cxx:39
 AliPPVsMultUtils.cxx:40
 AliPPVsMultUtils.cxx:41
 AliPPVsMultUtils.cxx:42
 AliPPVsMultUtils.cxx:43
 AliPPVsMultUtils.cxx:44
 AliPPVsMultUtils.cxx:45
 AliPPVsMultUtils.cxx:46
 AliPPVsMultUtils.cxx:47
 AliPPVsMultUtils.cxx:48
 AliPPVsMultUtils.cxx:49
 AliPPVsMultUtils.cxx:50
 AliPPVsMultUtils.cxx:51
 AliPPVsMultUtils.cxx:52
 AliPPVsMultUtils.cxx:53
 AliPPVsMultUtils.cxx:54
 AliPPVsMultUtils.cxx:55
 AliPPVsMultUtils.cxx:56
 AliPPVsMultUtils.cxx:57
 AliPPVsMultUtils.cxx:58
 AliPPVsMultUtils.cxx:59
 AliPPVsMultUtils.cxx:60
 AliPPVsMultUtils.cxx:61
 AliPPVsMultUtils.cxx:62
 AliPPVsMultUtils.cxx:63
 AliPPVsMultUtils.cxx:64
 AliPPVsMultUtils.cxx:65
 AliPPVsMultUtils.cxx:66
 AliPPVsMultUtils.cxx:67
 AliPPVsMultUtils.cxx:68
 AliPPVsMultUtils.cxx:69
 AliPPVsMultUtils.cxx:70
 AliPPVsMultUtils.cxx:71
 AliPPVsMultUtils.cxx:72
 AliPPVsMultUtils.cxx:73
 AliPPVsMultUtils.cxx:74
 AliPPVsMultUtils.cxx:75
 AliPPVsMultUtils.cxx:76
 AliPPVsMultUtils.cxx:77
 AliPPVsMultUtils.cxx:78
 AliPPVsMultUtils.cxx:79
 AliPPVsMultUtils.cxx:80
 AliPPVsMultUtils.cxx:81
 AliPPVsMultUtils.cxx:82
 AliPPVsMultUtils.cxx:83
 AliPPVsMultUtils.cxx:84
 AliPPVsMultUtils.cxx:85
 AliPPVsMultUtils.cxx:86
 AliPPVsMultUtils.cxx:87
 AliPPVsMultUtils.cxx:88
 AliPPVsMultUtils.cxx:89
 AliPPVsMultUtils.cxx:90
 AliPPVsMultUtils.cxx:91
 AliPPVsMultUtils.cxx:92
 AliPPVsMultUtils.cxx:93
 AliPPVsMultUtils.cxx:94
 AliPPVsMultUtils.cxx:95
 AliPPVsMultUtils.cxx:96
 AliPPVsMultUtils.cxx:97
 AliPPVsMultUtils.cxx:98
 AliPPVsMultUtils.cxx:99
 AliPPVsMultUtils.cxx:100
 AliPPVsMultUtils.cxx:101
 AliPPVsMultUtils.cxx:102
 AliPPVsMultUtils.cxx:103
 AliPPVsMultUtils.cxx:104
 AliPPVsMultUtils.cxx:105
 AliPPVsMultUtils.cxx:106
 AliPPVsMultUtils.cxx:107
 AliPPVsMultUtils.cxx:108
 AliPPVsMultUtils.cxx:109
 AliPPVsMultUtils.cxx:110
 AliPPVsMultUtils.cxx:111
 AliPPVsMultUtils.cxx:112
 AliPPVsMultUtils.cxx:113
 AliPPVsMultUtils.cxx:114
 AliPPVsMultUtils.cxx:115
 AliPPVsMultUtils.cxx:116
 AliPPVsMultUtils.cxx:117
 AliPPVsMultUtils.cxx:118
 AliPPVsMultUtils.cxx:119
 AliPPVsMultUtils.cxx:120
 AliPPVsMultUtils.cxx:121
 AliPPVsMultUtils.cxx:122
 AliPPVsMultUtils.cxx:123
 AliPPVsMultUtils.cxx:124
 AliPPVsMultUtils.cxx:125
 AliPPVsMultUtils.cxx:126
 AliPPVsMultUtils.cxx:127
 AliPPVsMultUtils.cxx:128
 AliPPVsMultUtils.cxx:129
 AliPPVsMultUtils.cxx:130
 AliPPVsMultUtils.cxx:131
 AliPPVsMultUtils.cxx:132
 AliPPVsMultUtils.cxx:133
 AliPPVsMultUtils.cxx:134
 AliPPVsMultUtils.cxx:135
 AliPPVsMultUtils.cxx:136
 AliPPVsMultUtils.cxx:137
 AliPPVsMultUtils.cxx:138
 AliPPVsMultUtils.cxx:139
 AliPPVsMultUtils.cxx:140
 AliPPVsMultUtils.cxx:141
 AliPPVsMultUtils.cxx:142
 AliPPVsMultUtils.cxx:143
 AliPPVsMultUtils.cxx:144
 AliPPVsMultUtils.cxx:145
 AliPPVsMultUtils.cxx:146
 AliPPVsMultUtils.cxx:147
 AliPPVsMultUtils.cxx:148
 AliPPVsMultUtils.cxx:149
 AliPPVsMultUtils.cxx:150
 AliPPVsMultUtils.cxx:151
 AliPPVsMultUtils.cxx:152
 AliPPVsMultUtils.cxx:153
 AliPPVsMultUtils.cxx:154
 AliPPVsMultUtils.cxx:155
 AliPPVsMultUtils.cxx:156
 AliPPVsMultUtils.cxx:157
 AliPPVsMultUtils.cxx:158
 AliPPVsMultUtils.cxx:159
 AliPPVsMultUtils.cxx:160
 AliPPVsMultUtils.cxx:161
 AliPPVsMultUtils.cxx:162
 AliPPVsMultUtils.cxx:163
 AliPPVsMultUtils.cxx:164
 AliPPVsMultUtils.cxx:165
 AliPPVsMultUtils.cxx:166
 AliPPVsMultUtils.cxx:167
 AliPPVsMultUtils.cxx:168
 AliPPVsMultUtils.cxx:169
 AliPPVsMultUtils.cxx:170
 AliPPVsMultUtils.cxx:171
 AliPPVsMultUtils.cxx:172
 AliPPVsMultUtils.cxx:173
 AliPPVsMultUtils.cxx:174
 AliPPVsMultUtils.cxx:175
 AliPPVsMultUtils.cxx:176
 AliPPVsMultUtils.cxx:177
 AliPPVsMultUtils.cxx:178
 AliPPVsMultUtils.cxx:179
 AliPPVsMultUtils.cxx:180
 AliPPVsMultUtils.cxx:181
 AliPPVsMultUtils.cxx:182
 AliPPVsMultUtils.cxx:183
 AliPPVsMultUtils.cxx:184
 AliPPVsMultUtils.cxx:185
 AliPPVsMultUtils.cxx:186
 AliPPVsMultUtils.cxx:187
 AliPPVsMultUtils.cxx:188
 AliPPVsMultUtils.cxx:189
 AliPPVsMultUtils.cxx:190
 AliPPVsMultUtils.cxx:191
 AliPPVsMultUtils.cxx:192
 AliPPVsMultUtils.cxx:193
 AliPPVsMultUtils.cxx:194
 AliPPVsMultUtils.cxx:195
 AliPPVsMultUtils.cxx:196
 AliPPVsMultUtils.cxx:197
 AliPPVsMultUtils.cxx:198
 AliPPVsMultUtils.cxx:199
 AliPPVsMultUtils.cxx:200
 AliPPVsMultUtils.cxx:201
 AliPPVsMultUtils.cxx:202
 AliPPVsMultUtils.cxx:203
 AliPPVsMultUtils.cxx:204
 AliPPVsMultUtils.cxx:205
 AliPPVsMultUtils.cxx:206
 AliPPVsMultUtils.cxx:207
 AliPPVsMultUtils.cxx:208
 AliPPVsMultUtils.cxx:209
 AliPPVsMultUtils.cxx:210
 AliPPVsMultUtils.cxx:211
 AliPPVsMultUtils.cxx:212
 AliPPVsMultUtils.cxx:213
 AliPPVsMultUtils.cxx:214
 AliPPVsMultUtils.cxx:215
 AliPPVsMultUtils.cxx:216
 AliPPVsMultUtils.cxx:217
 AliPPVsMultUtils.cxx:218
 AliPPVsMultUtils.cxx:219
 AliPPVsMultUtils.cxx:220
 AliPPVsMultUtils.cxx:221
 AliPPVsMultUtils.cxx:222
 AliPPVsMultUtils.cxx:223
 AliPPVsMultUtils.cxx:224
 AliPPVsMultUtils.cxx:225
 AliPPVsMultUtils.cxx:226