#include #include #include #include #include #include #include #include #include "AliHighPtDeDxData.h" #include "AliHighPtDeDxMc.h" #include "AliHighPtDeDxCalib.h" #include #include "DebugClasses.C" #include "my_tools.C" #include "my_functions.C" #include #include #include using namespace std; /* In this version the start step for calibrations is 2. We do not correct for the Ncl dependence as this is still uncertain of this should be done or not. It is good to make a small test first because the MIP peak might have to be adjusted. With pass0 the default 40-60 window should be good, but To run calibrations: ==================== Use AliRoot because of AliXRDPROOFtoolkit: gSystem->AddIncludePath("-I$ALICE_ROOT/TPC") gSystem->AddIncludePath("-I../lib") gSystem->AddIncludePath("-I../grid") gSystem->AddIncludePath("-I../macros") gROOT->SetMacroPath(".:../macros:../grid:../lib/") .L libMyDeDxAnalysis.so .L my_functions.C+ .L my_tools.C+ .L DebugClasses.C+ .L run_code.C+ // Step 1: create calibrations CreateCalib("7tev_b.dat", kFALSE, "7tev_b.root", 0, 2) // This function is not used anymore // CreateCalibV0("7tev_b_v0.dat", kFALSE, "7tev_b_v0_loose.root", 0) // Step 2 and 3 are found in calibrate_de_dx.C // Step 5: create data CreateOutput("7tev_b.dat", kFALSE, "7tev_b.root", 0, "fitparameters/7tev_b.root") CreateOutputV0("7tev_b_v0.dat", kFALSE, "7tev_b_v0_loose.root", 0, "fitparameters/7tev_b.root") // Test examples // Step 1 CreateCalib("7tev_b_test.dat", kFALSE, "7tev_b_test.root", 0, 2) // Step 5 CreateOutput("7tev_b_test.dat", kFALSE, "7tev_b_test.root", 0, "fitparameters/7tev_b_test.root") CreateOutputV0("7tev_b_test_v0.dat", kFALSE, "7tev_b_test_v0_loose.root", 0, "fitparameters/7tev_b_test.root") */ const Int_t nPtBins = 68; //Double_t xBins[nPtBins+1] = {0., 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1 , 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0}; Double_t xBins[nPtBins+1] = {0. , 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1 , 1.2, 1.3 , 1.4, 1.5 , 1.6, 1.7 , 1.8, 1.9 , 2.0, 2.2 , 2.4, 2.6 , 2.8, 3.0 , 3.2, 3.4 , 3.6, 3.8 , 4.0, 4.5 , 5.0, 5.5 , 6.0, 6.5 , 7.0, 8.0 , 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 40.0, 45.0, 50.0 }; TFile* dataOutFile = 0; TFile* mcOutFile = 0; TF1* piFunc = 0; TF1* kFunc = 0; TF1* pFunc = 0; TF1* eFunc = 0; TF1* sigmaFunc = 0; void CreateOutput(const Char_t* dataFileName, Bool_t isMc, const Char_t* outfilename, Int_t maxEvents, const Char_t* fitFileName=0); void AddObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run, Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE, Int_t etaLow=-8, Int_t etaHigh=8); void CreateOutputV0(const Char_t* dataFileName, Bool_t isMc, const Char_t* outFileName, Int_t maxEvents, const Char_t* fitFileName=0); void AddObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, Int_t run, Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE, Int_t etaLow=-8, Int_t etaHigh=8); void CreateCalib(const Char_t* dataFileName, Bool_t isMc, const Char_t* outfilename, Int_t maxEvents, Int_t startStep); void AddCalibObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run, Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE, Int_t etaLow=-8, Int_t etaHigh=8); void CreateCalibV0(const Char_t* dataFileName, Bool_t isMc, const Char_t* outFileName, Int_t maxEvents); void AddCalibObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, Int_t run, Bool_t analyzeMc); Int_t CalculateFilter(DeDxTrack* track); //____________________________________________________________________________ void CreateOutput(const Char_t* dataFileName, Bool_t isMc, const Char_t* outFileName, Int_t maxEvents, const Char_t* fitFileName) { TF1* fDeDxVsEtaNeg = 0; TF1* fDeDxVsEtaPos = 0; TF1* fDeDxVsNcl = 0; if(fitFileName) { TFile* fitFile = FindFileFresh(fitFileName); if(!fitFile) return; DeDxFitInfo* fitPar = (DeDxFitInfo*)fitFile->Get("fitInfo"); fitPar->Print(); if(!fitPar->calibFileName.IsNull()) { cout << "Setting calibFile: " << fitPar->calibFileName << endl; TFile* calibFile = FindFileFresh(fitPar->calibFileName); if(!calibFile) return; AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, 1, kTRUE, 0); calib->Print(); fDeDxVsEtaNeg = calib->GetDeDxVsEtaNeg(); fDeDxVsEtaPos = calib->GetDeDxVsEtaPos(); fDeDxVsNcl = calib->GetDeDxVsNcl(); } fixMIP = fitPar->MIP; fixPlateau = fitPar->plateau; Double_t dedxPar[6] = {0, 0, 0, 0, 0, 0}; Double_t sigmaPar[6] = {0, 0, 0, 0, 0, 0}; dedxPar[0] = fitPar->optionDeDx; for(Int_t i = 0; i < fitPar->nDeDxPar; i++) { dedxPar[i+1] = fitPar->parDeDx[i]; } sigmaPar[0] = fitPar->optionSigma; for(Int_t i = 0; i < fitPar->nSigmaPar; i++) { sigmaPar[i+1] = fitPar->parSigma[i]; } piFunc = new TF1("piFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1); piFunc->SetParameters(dedxPar); kFunc = new TF1("kFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1); kFunc->SetParameters(dedxPar); kFunc->SetParameter(0, kFunc->GetParameter(0)+10); pFunc = new TF1("pFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1); pFunc->SetParameters(dedxPar); pFunc->SetParameter(0, pFunc->GetParameter(0)+20); eFunc = new TF1("eFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1); eFunc->SetParameters(dedxPar); eFunc->SetParameter(0, eFunc->GetParameter(0)+30); sigmaFunc = new TF1("sigmaFunc", SigmaFunc, 0, 100, fitPar->nSigmaPar+1); sigmaFunc->SetParameters(sigmaPar); } CreateDir("data"); dataOutFile = new TFile(Form("data/%s", outFileName), "RECREATE"); if(isMc) { CreateDir("mc"); mcOutFile = new TFile(Form("mc/%s", outFileName), "RECREATE"); } // Create output objects dataOutFile->cd(); TList* runList = new TList(); runList->SetOwner(kTRUE); runList->SetBit(TObject::kSingleKey); TList* analysisList = new TList(); analysisList->SetOwner(kFALSE); // TList filter, phi cut, run, isMc AddObject(analysisList, 1, kTRUE, 0, isMc); if(kTRUE) { AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -8, -6); AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -6, -4); AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -4, -2); AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -2, 0); AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 0, 2); AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 2, 4); AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 4, 6); AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 6, 8); } AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -8, 0); AddObject(analysisList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 0, 8); AddObject(analysisList, 1, kTRUE, 0, isMc, kFALSE, kTRUE, 0, 4); AddObject(analysisList, 1, kTRUE, 0, isMc, kFALSE, kTRUE, 4, 8); AddObject(analysisList, 1, kFALSE, 0, isMc); AddObject(analysisList, 2, kTRUE, 0, isMc); AddObject(analysisList, 2, kFALSE, 0, isMc); TTree* Tree = 0; if(strstr(dataFileName, ".dat")) { AliXRDPROOFtoolkit tool; TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000); // chain->Lookup(); Tree = chain; } else { TFile* dataFile = FindFileFresh(dataFileName); if(!dataFile) return; Tree = (TTree*)dataFile->Get("tree"); } TClonesArray* trackArray = 0; TClonesArray* mcTrackArray = 0; DeDxEvent* event = 0; Tree->SetBranchAddress("event", &event); Tree->SetBranchAddress("trackGlobalPar" , &trackArray); if(isMc) Tree->SetBranchAddress("trackMC" , &mcTrackArray); Int_t nEvents = Tree->GetEntries(); cout << "Number of events: " << nEvents << endl; if(maxEvents>0 && maxEvents < nEvents) { nEvents = maxEvents; cout << "N events was reduced to: " << maxEvents << endl; } Int_t currentRun = 0; Int_t nBad = 0; TIter* iter = new TIter(analysisList); for(Int_t n = 0; n < nEvents; n++) { Tree->GetEntry(n); if((n+1)%1000000==0) cout << "Event: " << n+1 << "/" << nEvents << endl; // A few bad entries if(event->run == -1) { nBad++; continue; } if(event->run != currentRun) { cout << "New run: " << event->run << endl; currentRun = event->run; // Check if run objects exist TObjString* runString = new TObjString(Form("%d", currentRun)); if(!runList->FindObject(runString->GetString().Data())) { runList->Add(runString); // TList filter, phi cut, run, isMc AddObject(analysisList, 1, kTRUE, currentRun, isMc); AddObject(analysisList, 1, kFALSE, currentRun, isMc); // AddObject(analysisList, 2, kTRUE, currentRun, isMc); // AddObject(analysisList, 2, kFALSE, currentRun, isMc); // Is this really necessary? delete iter; iter = new TIter(analysisList); } else { delete runString; } } // iterate over analysis list iter->Reset(); AliHighPtDeDxBase* analysis = 0; while ((analysis = dynamic_cast (iter->Next()))) { // First we set the global properties // If I want to use a narrower vtx I have here to redefine my // vtxstatus according to the new vtx range analysis->SetEventRun(event->run); analysis->SetEventMag(event->mag); analysis->SetEventVtxStatus(event->vtxstatus); analysis->SetEventTrigger(event->trig); Int_t vtxstatusmc = 0; if(TMath::Abs(event->zvtxMC) < 10.0) vtxstatusmc = 1; analysis->SetEventVtxStatusMc(vtxstatusmc); if(!analysis->EventAccepted()) // only checks for runs currently continue; // There is a small prolem in making this really nice, because we need // also event info from events that are rejected by the vtx cut to // correct our data. That is why we for bnow only have the run cut there analysis->FillEventInfo(); // First we do the special MC part if(isMc) { AliHighPtDeDxMc* mcAnalysis = dynamic_cast (analysis); if(mcAnalysis) { if(vtxstatusmc) { // loop over mc tracks const Int_t nMcTracks = mcTrackArray->GetEntries(); for(Int_t i = 0; i < nMcTracks; i++) { DeDxTrackMC* trackMC = (DeDxTrackMC*)mcTrackArray->At(i); mcAnalysis->SetTrackPtMc(trackMC->ptMC); mcAnalysis->SetTrackEtaMc(trackMC->etaMC); mcAnalysis->SetTrackChargeMc(trackMC->qMC); mcAnalysis->SetTrackPidMc(trackMC->pidMC); if(mcAnalysis->TrackAcceptedMc()) { // if(trackMC->ptMC<2.0) // mcAnalysis->FillTrackInfoMc(100.0); // else mcAnalysis->FillTrackInfoMc(1.0); } } } } } // The trig==1 is always true for real data, but not for MC data if(!event->trig) continue; if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts continue; const Int_t nTracks = trackArray->GetEntries(); for(Int_t i = 0; i < nTracks; i++) { DeDxTrack* track = (DeDxTrack*)trackArray->At(i); Double_t eta = track->eta; Double_t dedx = track->dedx; Int_t ncl = track->ncl; if(fDeDxVsEtaNeg) { dedx *= 50.0 / fDeDxVsNcl->Eval(ncl); if(eta < 0) dedx *= 50.0 / fDeDxVsEtaNeg->Eval(eta); else dedx *= 50.0 / fDeDxVsEtaPos->Eval(eta); } analysis->SetTrackCharge(track->q); analysis->SetTrackP(track->p); analysis->SetTrackPt(track->pt); // Int_t filter = CalculateFilter(track); analysis->SetTrackFilter(filter); analysis->SetTrackPhi(track->phi); analysis->SetTrackDeDx(dedx); analysis->SetTrackNcl(ncl); analysis->SetTrackEta(eta); analysis->SetTrackPidMc(track->pid); if(analysis->TrackAccepted()) { // if(track->pt<2.0) // analysis->FillTrackInfo(100.0); // else analysis->FillTrackInfo(1.0); } } } } if(isMc) { TList* runListMc = (TList*)runList->Clone(); mcOutFile->cd(); runListMc->Write(); // I need to somehow specify autowrite, but I am not sure how, so for now // this a bit stupid workaround... iter->Reset(); AliHighPtDeDxBase* analysis = 0; while ((analysis = dynamic_cast (iter->Next()))) { AliHighPtDeDxMc* mcAnalysis = dynamic_cast (analysis); if(mcAnalysis) { mcAnalysis->Write(); } } mcOutFile->Close(); delete mcOutFile; mcOutFile = 0; } dataOutFile->cd(); runList->Write("runList"); iter->Reset(); AliHighPtDeDxBase* analysis = 0; while ((analysis = dynamic_cast (iter->Next()))) { AliHighPtDeDxData* dataAnalysis = dynamic_cast (analysis); if(dataAnalysis) { dataAnalysis->Write(); } } dataOutFile->Close(); delete dataOutFile; dataOutFile = 0; cout << "Nbad (runno == -1) : " << nBad << endl; } //___________________________________________________________________________ void AddObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run, Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs, Int_t etaLow, Int_t etaHigh) { if(etaCut && etaAbs) { Fatal("AddObject", "You cannot have a cut on both abs and signed eta"); return; } TString objectName("filter"); objectName += filter; if(phiCut) objectName += "phicut"; if(run) { objectName += "_"; objectName += run; } if(etaCut) { objectName += "eta"; objectName += etaLow; objectName += etaHigh; } if(etaAbs) { objectName += "etaabs"; objectName += etaLow; objectName += etaHigh; } dataOutFile->cd(); AliHighPtDeDxData* data = new AliHighPtDeDxData(objectName.Data(), "Analysis data"); if(run) { data->SetUseRunCut(kTRUE); data->SetRun(run); } list->Add(data); data->SetIsMc(analyzeMc); data->SetUseFilterCut(kTRUE); data->SetFilter(filter); data->SetUsePhiCut(phiCut); if(phiCut) { data->SetPhiCutLow(data->GetStandardPhiCutLow()); data->SetPhiCutHigh(data->GetStandardPhiCutHigh()); } if(etaCut) data->SetUseEtaCut(kTRUE); if(etaAbs) data->SetUseEtaCutAbs(kTRUE); if(etaCut || etaAbs) { data->SetEtaLow(Double_t(etaLow)/10.0); data->SetEtaHigh(Double_t(etaHigh)/10.0); } data->Init(nPtBins, xBins); data->Print(); if(piFunc && kFunc && pFunc && eFunc && sigmaFunc) { data->SetPionDeDxFunction(piFunc); data->SetKaonDeDxFunction(kFunc); data->SetProtonDeDxFunction(pFunc); data->SetElectronDeDxFunction(eFunc); data->SetSigmaDeDxFunction(sigmaFunc); } if(analyzeMc) { // create the correction class also mcOutFile->cd(); AliHighPtDeDxMc* mc = new AliHighPtDeDxMc(objectName.Data(), "Analysis mc"); if(run) { mc->SetUseRunCut(kTRUE); mc->SetRun(run); } list->Add(mc); mc->SetUseFilterCut(kTRUE); mc->SetFilter(filter); mc->SetUsePhiCut(phiCut); if(phiCut) { mc->SetPhiCutLow(mc->GetStandardPhiCutLow()); mc->SetPhiCutHigh(mc->GetStandardPhiCutHigh()); } mc->Init(nPtBins, xBins); mc->Print(); } } //____________________________________________________________________________ void CreateOutputV0(const Char_t* dataFileName, Bool_t isMc, const Char_t* outFileName, Int_t maxEvents, const Char_t* fitFileName) { TF1* fDeDxVsEtaNeg = 0; TF1* fDeDxVsEtaPos = 0; TF1* fDeDxVsNcl = 0; if(fitFileName) { TFile* fitFile = FindFileFresh(fitFileName); if(!fitFile) return; DeDxFitInfo* fitPar = (DeDxFitInfo*)fitFile->Get("fitInfo"); fitPar->Print(); if(!fitPar->calibFileName.IsNull()) { cout << "Setting calibFile: " << fitPar->calibFileName << endl; TFile* calibFile = FindFileFresh(fitPar->calibFileName); if(!calibFile) return; AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, 1, kTRUE, 0); calib->Print(); fDeDxVsEtaNeg = calib->GetDeDxVsEtaNeg(); fDeDxVsEtaPos = calib->GetDeDxVsEtaPos(); fDeDxVsNcl = calib->GetDeDxVsNcl(); } fixMIP = fitPar->MIP; fixPlateau = fitPar->plateau; Double_t dedxPar[6] = {0, 0, 0, 0, 0, 0}; Double_t sigmaPar[6] = {0, 0, 0, 0, 0, 0}; dedxPar[0] = fitPar->optionDeDx; for(Int_t i = 0; i < fitPar->nDeDxPar; i++) { dedxPar[i+1] = fitPar->parDeDx[i]; } sigmaPar[0] = fitPar->optionSigma; for(Int_t i = 0; i < fitPar->nSigmaPar; i++) { sigmaPar[i+1] = fitPar->parSigma[i]; } piFunc = new TF1("piFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1); piFunc->SetParameters(dedxPar); kFunc = new TF1("kFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1); kFunc->SetParameters(dedxPar); kFunc->SetParameter(0, kFunc->GetParameter(0)+10); pFunc = new TF1("pFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1); pFunc->SetParameters(dedxPar); pFunc->SetParameter(0, pFunc->GetParameter(0)+20); eFunc = new TF1("eFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1); eFunc->SetParameters(dedxPar); eFunc->SetParameter(0, eFunc->GetParameter(0)+30); sigmaFunc = new TF1("sigmaFunc", SigmaFunc, 0, 100, fitPar->nSigmaPar+1); sigmaFunc->SetParameters(sigmaPar); } CreateDir("data"); dataOutFile = new TFile(Form("data/%s", outFileName), "RECREATE"); // Create output objects dataOutFile->cd(); TList* runList = new TList(); runList->SetOwner(kTRUE); runList->SetBit(TObject::kSingleKey); TList* analysisList = new TList(); analysisList->SetOwner(kFALSE); // TList v0type, phi cut, run, isMc AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc); AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc, kTRUE, kFALSE, -8, 0); AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc, kTRUE, kFALSE, 0, 8); AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc, kFALSE, kTRUE, 0, 4); AddObjectV0(analysisList, "lambda", kTRUE, 0, isMc, kFALSE, kTRUE, 4, 8); AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc); AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc, kTRUE, kFALSE, -8, 0); AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc, kTRUE, kFALSE, 0, 8); AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc, kFALSE, kTRUE, 0, 4); AddObjectV0(analysisList, "kaon", kTRUE, 0, isMc, kFALSE, kTRUE, 4, 8); TTree* Tree = 0; if(strstr(dataFileName, ".dat")) { AliXRDPROOFtoolkit tool; TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000); // chain->Lookup(); Tree = chain; } else { TFile* dataFile = FindFileFresh(dataFileName); if(!dataFile) return; Tree = (TTree*)dataFile->Get("tree"); } TClonesArray* v0Array = 0; DeDxEvent* event = 0; Tree->SetBranchAddress("event", &event); Tree->SetBranchAddress("v0GlobalPar" , &v0Array); Int_t nEvents = Tree->GetEntries(); cout << "Number of events: " << nEvents << endl; if(maxEvents>0 && maxEvents < nEvents) { nEvents = maxEvents; cout << "N events was reduced to: " << maxEvents << endl; } Int_t currentRun = 0; Int_t nBad = 0; TIter* iter = new TIter(analysisList); for(Int_t n = 0; n < nEvents; n++) { Tree->GetEntry(n); if((n+1)%1000000==0) cout << "Event: " << n+1 << "/" << nEvents << endl; if(event->run == -1) { nBad++; continue; } // if(event->run == 126437) // continue; if(event->run != currentRun) { cout << "New run: " << event->run << endl; currentRun = event->run; // Check if run objects exist TObjString* runString = new TObjString(Form("%d", currentRun)); if(!runList->FindObject(runString->GetString().Data())) { runList->Add(runString); // TList v0type, phi cut, run, isMc AddObjectV0(analysisList, "lambda", kTRUE, currentRun, isMc); AddObjectV0(analysisList, "kaon", kTRUE, currentRun, isMc); // Is this really necessary? delete iter; iter = new TIter(analysisList); } else { delete runString; } } // iterate over analysis list iter->Reset(); AliHighPtDeDxBase* analysis = 0; while ((analysis = dynamic_cast (iter->Next()))) { // First we set the global properties // If I want to use a narrower vtx I have here to redefine my // vtxstatus according to the new vtx range analysis->SetEventRun(event->run); analysis->SetEventMag(event->mag); analysis->SetEventVtxStatus(event->vtxstatus); analysis->SetEventTrigger(event->trig); Int_t vtxstatusmc = 0; if(TMath::Abs(event->zvtxMC) < 10.0) vtxstatusmc = 1; analysis->SetEventVtxStatusMc(vtxstatusmc); if(!analysis->EventAccepted()) // only checks for runs currently continue; // There is a small prolem in making this really nice, because we need // also event info from events that are rejected by the vtx cut to // correct our data. That is why we for bnow only have the run cut there analysis->FillEventInfo(); // The trig==1 is always true for real data, but not for MC data if(!event->trig) continue; if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts continue; const Int_t nV0s = v0Array->GetEntries(); for(Int_t i = 0; i < nV0s; i++) { DeDxV0* v0 = (DeDxV0*)v0Array->At(i); // if(v0->ptrack.filter != 2) // continue; if(v0->status != 0) continue; if(v0->dmassG < 0.1) continue; // if(v0->decayr < 5.0) // continue; // if(v0->decayr > 40.0) // continue; const Double_t dmassK = TMath::Abs(v0->dmassK0); const Double_t dmassL = TMath::Abs(v0->dmassL); const Double_t dmassAL = TMath::Abs(v0->dmassAL); Bool_t fillPos = kFALSE; Bool_t fillNeg = kFALSE; if(strstr(analysis->GetName(), "lambda")) { if(dmassK<0.01) continue; if(dmassL<0.01&&dmassL>0.01) fillPos = kTRUE; if(dmassAL<0.01&&dmassL) fillNeg = kTRUE; } else { // kaons if(dmassL<0.01 || dmassAL<0.01) continue; if(dmassK<0.01) { fillPos = kTRUE; fillNeg = kTRUE; } } for(Int_t j = 0; j < 2; j++) { DeDxTrack* track = 0; if(j==0) { if(fillNeg) track = &(v0->ntrack); else continue; } else { if(fillPos) track = &(v0->ptrack); else continue; } Double_t eta = track->eta; Double_t dedx = track->dedx; Int_t ncl = track->ncl; if(fDeDxVsEtaNeg) { dedx *= 50.0 / fDeDxVsNcl->Eval(ncl); if(eta < 0) dedx *= 50.0 / fDeDxVsEtaNeg->Eval(eta); else dedx *= 50.0 / fDeDxVsEtaPos->Eval(eta); } analysis->SetTrackCharge(track->q); analysis->SetTrackP(track->p); analysis->SetTrackPt(track->pt); // NB! Not used analysis->SetTrackFilter(track->filter); analysis->SetTrackPhi(track->phi); analysis->SetTrackDeDx(dedx); analysis->SetTrackNcl(ncl); analysis->SetTrackBeta(track->beta); analysis->SetTrackPidMc(track->pid); analysis->SetTrackEta(eta); if(analysis->TrackAccepted()) { analysis->FillTrackInfo(1.0); } } } } } dataOutFile->cd(); runList->Write("runList"); iter->Reset(); AliHighPtDeDxBase* analysis = 0; while ((analysis = dynamic_cast (iter->Next()))) { AliHighPtDeDxData* dataAnalysis = dynamic_cast (analysis); if(dataAnalysis) { dataAnalysis->Write(); } } dataOutFile->Close(); delete dataOutFile; dataOutFile = 0; cout << "Nbad (runno == -1) : " << nBad << endl; } //___________________________________________________________________________ void AddObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, Int_t run, Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs, Int_t etaLow, Int_t etaHigh) { if(etaCut && etaAbs) { Fatal("AddObject", "You cannot have a cut on both abs and signed eta"); return; } TString objectName(baseName); if(phiCut) objectName += "phicut"; if(run) { objectName += "_"; objectName += run; } if(etaCut) { objectName += "eta"; objectName += etaLow; objectName += etaHigh; } if(etaAbs) { objectName += "etaabs"; objectName += etaLow; objectName += etaHigh; } dataOutFile->cd(); AliHighPtDeDxData* data = new AliHighPtDeDxData(objectName.Data(), "Analysis data"); if(run) { data->SetUseRunCut(kTRUE); data->SetRun(run); } list->Add(data); data->SetIsMc(analyzeMc); data->SetUseFilterCut(kFALSE); data->SetUsePhiCut(phiCut); if(phiCut) { data->SetPhiCutLow(data->GetStandardPhiCutLow()); data->SetPhiCutHigh(data->GetStandardPhiCutHigh()); } if(etaCut) data->SetUseEtaCut(kTRUE); if(etaAbs) data->SetUseEtaCutAbs(kTRUE); if(etaCut || etaAbs) { data->SetEtaLow(Double_t(etaLow)/10.0); data->SetEtaHigh(Double_t(etaHigh)/10.0); } data->Init(nPtBins, xBins); data->Print(); if(piFunc && kFunc && pFunc && eFunc && sigmaFunc) { data->SetPionDeDxFunction(piFunc); data->SetKaonDeDxFunction(kFunc); data->SetProtonDeDxFunction(pFunc); data->SetElectronDeDxFunction(eFunc); data->SetSigmaDeDxFunction(sigmaFunc); } } //____________________________________________________________________________ void CreateCalib(const Char_t* dataFileName, Bool_t isMc, const Char_t* outFileName, Int_t maxEvents, Int_t startStep) { if(startStep < 1 || startStep > 3) { cout << "Start step should be 1,2, or 3 - 2 is recommended" << endl; } if(startStep == 1) { for(Int_t i = 0; i < 10; i++) cout << "Step 1 calibration is depreceated! - 2 is recommended" << endl; } if(startStep<3) { CreateDir("calib_eta"); dataOutFile = new TFile(Form("calib_eta/%s", outFileName), "RECREATE"); } else { CreateDir("no_calib_eta"); dataOutFile = new TFile(Form("no_calib_eta/%s", outFileName), "RECREATE"); } // Create output objects dataOutFile->cd(); TList* runList = new TList(); runList->SetOwner(kTRUE); runList->SetBit(TObject::kSingleKey); TList* calibList = new TList(); calibList->SetOwner(kFALSE); // TList filter, phi cut, run, isMc AddCalibObject(calibList, 1, kTRUE, 0, isMc); AddCalibObject(calibList, 2, kTRUE, 0, isMc); AddCalibObject(calibList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, -8, 0); AddCalibObject(calibList, 1, kTRUE, 0, isMc, kTRUE, kFALSE, 0, 8); AddCalibObject(calibList, 1, kTRUE, 0, isMc, kFALSE, kTRUE, 0, 4); AddCalibObject(calibList, 1, kTRUE, 0, isMc, kFALSE, kTRUE, 4, 8); // AddCalibObject(calibList, 1, kFALSE, 0, isMc); // AddCalibObject(calibList, 2, kTRUE, 0, isMc); // AddCalibObject(calibList, 2, kFALSE, 0, isMc); TTree* Tree = 0; if(strstr(dataFileName, ".dat")) { AliXRDPROOFtoolkit tool; TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000); // chain->Lookup(); Tree = chain; } else { TFile* dataFile = FindFileFresh(dataFileName); if(!dataFile) return; Tree = (TTree*)dataFile->Get("tree"); } TClonesArray* trackArray = 0; TClonesArray* mcTrackArray = 0; DeDxEvent* event = 0; Tree->SetBranchAddress("event", &event); Tree->SetBranchAddress("trackGlobalPar" , &trackArray); if(isMc) Tree->SetBranchAddress("trackMC" , &mcTrackArray); Int_t nEvents = Tree->GetEntries(); cout << "Number of events: " << nEvents << endl; if(maxEvents>0 && maxEvents < nEvents) { nEvents = maxEvents; cout << "N events was reduced to: " << maxEvents << endl; } Int_t currentRun = 0; Int_t nBad = 0; TIter* iter = new TIter(calibList); AliHighPtDeDxCalib* calib = 0; for(Int_t step = startStep; step <= 3; step++) { iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { calib->SetStep(step); // Here you can set the MIP interval // default is 40-60 if(step==startStep) { calib->SetDeDxMIPMin(25); calib->SetDeDxMIPMax(55); } else { calib->SetDeDxMIPMin(40); calib->SetDeDxMIPMax(60); } calib->Init(step, nPtBins, xBins); } for(Int_t n = 0; n < nEvents; n++) { Tree->GetEntry(n); if((n+1)%1000000==0) cout << "Event: " << n+1 << "/" << nEvents << endl; if(event->run == -1) { nBad++; continue; } // if(event->run == 126437) // continue; if(event->run != currentRun) { cout << "New run: " << event->run << endl; currentRun = event->run; // Check if run objects exist TObjString* runString = new TObjString(Form("%d", currentRun)); if(!runList->FindObject(runString->GetString().Data())) { runList->Add(runString); // TList filter, phi cut, run, isMc AddCalibObject(calibList, 1, kTRUE, currentRun, isMc); // AddCalibObject(calibList, 1, kFALSE, currentRun, isMc); // AddCalibObject(calibList, 2, kTRUE, currentRun, isMc); // AddCalibObject(calibList, 2, kFALSE, currentRun, isMc); // Is this really necessary? delete iter; iter = new TIter(calibList); iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { calib->SetStep(step); if(step==startStep) { calib->SetDeDxMIPMin(25); calib->SetDeDxMIPMax(55); } else { calib->SetDeDxMIPMin(40); calib->SetDeDxMIPMax(60); } calib->Init(step, nPtBins, xBins); } } else { delete runString; } } // iterate over calib list iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { // First we set the global properties // If I want to use a narrower vtx I have here to redefine my // vtxstatus according to the new vtx range calib->SetEventRun(event->run); calib->SetEventMag(event->mag); calib->SetEventVtxStatus(event->vtxstatus); calib->SetEventTrigger(event->trig); if(!calib->EventAccepted()) // only checks for runs currently continue; calib->FillEventInfo(); // The trig==1 is always true for real data, but not for MC data if(!event->trig) continue; if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts continue; const Int_t nTracks = trackArray->GetEntries(); for(Int_t i = 0; i < nTracks; i++) { DeDxTrack* track = (DeDxTrack*)trackArray->At(i); calib->SetTrackCharge(track->q); calib->SetTrackP(track->p); calib->SetTrackPt(track->pt); Int_t filter = CalculateFilter(track); calib->SetTrackFilter(filter); calib->SetTrackPhi(track->phi); calib->SetTrackDeDx(track->dedx); calib->SetTrackNcl(track->ncl); calib->SetTrackBeta(track->beta); calib->SetTrackPidMc(track->pid); calib->SetTrackEta(track->eta); if(calib->TrackAccepted()) { // if(track->pt<2.0) // calib->FillTrackInfo(100.0); // else calib->FillTrackInfo(1.0); } } } } if(step == 2) { // perform eta calibration cout << "Starting Eta cal" << endl; iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { calib->PerformEtaCal(); } cout << "Finishing Eta cal" << endl; } else if(step == 1) { // perform ncl calibration cout << "Starting Ncl cal" << endl; iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { calib->PerformNclCal(); } cout << "Finished Ncl cal" << endl; } } cout << "Nbad (runno == -1) : " << nBad << endl; dataOutFile->cd(); runList->Write("runList"); iter->Reset(); cout << "Writing calibration data" << endl; while ((calib = dynamic_cast (iter->Next()))) { cout << "Writing calibration object " << calib->GetName() << endl; calib->Write(); } cout << "Finsihed writing calibration data" << endl; dataOutFile->Close(); delete dataOutFile; dataOutFile = 0; } //___________________________________________________________________________ void AddCalibObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run, Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs, Int_t etaLow, Int_t etaHigh) { if(etaCut && etaAbs) { Fatal("AddCalibObject", "You cannot have a cut on both abs and signed eta"); return; } TString objectName("filter"); objectName += filter; if(phiCut) objectName += "phicut"; if(run) { objectName += "_"; objectName += run; } if(etaCut) { objectName += "eta"; objectName += etaLow; objectName += etaHigh; } if(etaAbs) { objectName += "etaabs"; objectName += etaLow; objectName += etaHigh; } // dataOutFile->cd(); AliHighPtDeDxCalib* data = new AliHighPtDeDxCalib(objectName.Data(), "Calib data"); if(run) { data->SetUseRunCut(kTRUE); data->SetRun(run); } list->Add(data); data->SetIsMc(analyzeMc); data->SetUseFilterCut(kTRUE); data->SetFilter(filter); data->SetUsePhiCut(phiCut); if(phiCut) { data->SetPhiCutLow(data->GetStandardPhiCutLow()); data->SetPhiCutHigh(data->GetStandardPhiCutHigh()); } if(etaCut) data->SetUseEtaCut(kTRUE); if(etaAbs) data->SetUseEtaCutAbs(kTRUE); if(etaCut || etaAbs) { data->SetEtaLow(Double_t(etaLow)/10.0); data->SetEtaHigh(Double_t(etaHigh)/10.0); } if(run) { data->SetUseRunCut(kTRUE); data->SetRun(run); } data->Init(nPtBins, xBins); data->Print(); } //____________________________________________________________________________ void CreateCalibV0(const Char_t* dataFileName, Bool_t isMc, const Char_t* outFileName, Int_t maxEvents) { CreateDir("no_calib_eta"); dataOutFile = new TFile(Form("no_calib_eta/%s", outFileName), "RECREATE"); // Create output objects dataOutFile->cd(); TList* runList = new TList(); runList->SetOwner(kTRUE); runList->SetBit(TObject::kSingleKey); TList* calibList = new TList(); calibList->SetOwner(kFALSE); // TList filter, phi cut, run, isMc AddCalibObjectV0(calibList, "lambda", kTRUE, 0, isMc); // AddCalibObject(calibList, 1, kFALSE, 0, isMc); AddCalibObjectV0(calibList, "kaon", kTRUE, 0, isMc); // AddCalibObject(calibList, 2, kFALSE, 0, isMc); TTree* Tree = 0; if(strstr(dataFileName, ".dat")) { AliXRDPROOFtoolkit tool; TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000); // chain->Lookup(); Tree = chain; } else { TFile* dataFile = FindFileFresh(dataFileName); if(!dataFile) return; Tree = (TTree*)dataFile->Get("tree"); } TClonesArray* v0Array = 0; DeDxEvent* event = 0; Tree->SetBranchAddress("event", &event); Tree->SetBranchAddress("v0" , &v0Array); Int_t nEvents = Tree->GetEntries(); cout << "Number of events: " << nEvents << endl; if(maxEvents>0 && maxEvents < nEvents) { nEvents = maxEvents; cout << "N events was reduced to: " << maxEvents << endl; } Int_t currentRun = 0; Int_t nBad = 0; TIter* iter = new TIter(calibList); AliHighPtDeDxCalib* calib = 0; iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { calib->SetStep(3); } for(Int_t n = 0; n < nEvents; n++) { Tree->GetEntry(n); if((n+1)%1000000==0) cout << "Event: " << n+1 << "/" << nEvents << endl; if(event->run == -1) { nBad++; continue; } // if(event->run == 126437) // continue; if(event->run != currentRun) { cout << "New run: " << event->run << endl; currentRun = event->run; // Check if run objects exist TObjString* runString = new TObjString(Form("%d", currentRun)); if(!runList->FindObject(runString->GetString().Data())) { runList->Add(runString); // TList filter, phi cut, run, isMc AddCalibObjectV0(calibList, "lambda", kTRUE, currentRun, isMc); AddCalibObjectV0(calibList, "kaon", kTRUE, currentRun, isMc); // Is this really necessary? delete iter; iter = new TIter(calibList); iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { calib->SetStep(3); } } else { delete runString; } } // iterate over calib list iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { // First we set the global properties // If I want to use a narrower vtx I have here to redefine my // vtxstatus according to the new vtx range calib->SetEventRun(event->run); calib->SetEventMag(event->mag); calib->SetEventVtxStatus(event->vtxstatus); calib->SetEventTrigger(event->trig); if(!calib->EventAccepted()) // only checks for runs currently continue; calib->FillEventInfo(); // The trig==1 is always true for real data, but not for MC data if(!event->trig) continue; if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts continue; const Int_t nV0s = v0Array->GetEntries(); for(Int_t i = 0; i < nV0s; i++) { DeDxV0* v0 = (DeDxV0*)v0Array->At(i); // if(v0->ptrack.filter != 2) // continue; if(v0->status != 0) continue; if(v0->dmassG < 0.1) continue; // if(v0->decayr < 5.0) // continue; // if(v0->decayr > 40.0) // continue; const Double_t dmassK = TMath::Abs(v0->dmassK0); const Double_t dmassL = TMath::Abs(v0->dmassL); const Double_t dmassAL = TMath::Abs(v0->dmassAL); Bool_t fillPos = kFALSE; Bool_t fillNeg = kFALSE; if(strstr(calib->GetName(), "lambda")) { if(dmassK<0.01) continue; if(dmassL<0.01) fillPos = kTRUE; if(dmassAL<0.01) fillNeg = kTRUE; } else { // kaons if(dmassL<0.01 || dmassAL<0.01) continue; if(dmassK<0.01) { fillPos = kTRUE; fillNeg = kTRUE; } } for(Int_t j = 0; j < 2; j++) { DeDxTrack* track = 0; if(j==0) { if(fillNeg) track = &(v0->ntrack); else continue; } else { if(fillPos) track = &(v0->ptrack); else continue; } calib->SetTrackCharge(track->q); calib->SetTrackP(track->p); calib->SetTrackPt(track->pt); // NB! Filter is not used for these tracks! calib->SetTrackFilter(track->filter); calib->SetTrackPhi(track->phi); calib->SetTrackDeDx(track->dedx); calib->SetTrackNcl(track->ncl); calib->SetTrackBeta(track->beta); calib->SetTrackPidMc(track->pid); calib->SetTrackEta(track->eta); if(calib->TrackAccepted()) { calib->FillTrackInfo(1.0); } } } } } dataOutFile->cd(); runList->Write("runList"); iter->Reset(); while ((calib = dynamic_cast (iter->Next()))) { calib->Write(); } dataOutFile->Close(); delete dataOutFile; dataOutFile = 0; cout << "Nbad (runno == -1) : " << nBad << endl; } //___________________________________________________________________________ void AddCalibObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, Int_t run, Bool_t analyzeMc) { TString objectName(baseName); if(phiCut) objectName += "phicut"; if(run) { objectName += "_"; objectName += run; } dataOutFile->cd(); AliHighPtDeDxCalib* data = new AliHighPtDeDxCalib(objectName.Data(), "Calib data"); if(run) { data->SetUseRunCut(kTRUE); data->SetRun(run); } list->Add(data); data->SetIsMc(analyzeMc); data->SetUseFilterCut(kFALSE); data->SetUsePhiCut(phiCut); if(phiCut) { data->SetPhiCutLow(data->GetStandardPhiCutLow()); data->SetPhiCutHigh(data->GetStandardPhiCutHigh()); } data->Init(nPtBins, xBins); data->Print(); } //___________________________________________________________________________ Int_t CalculateFilter(DeDxTrack* track) { Int_t filter = 0; if(track->filterset3) filter += 1; if(track->filterset2 && !track->filterset3) filter += 2; if(track->filterset1) filter += 4; return filter; }