ROOT logo
Bool_t needRecPoints = kTRUE;

void AnalysisSPDClustTask
(
 TString dataset="/alice/sim/LHC11d2_000119161",
 TString outFName = "trbg.root",
 Int_t   nEvents   = -1,
 Float_t etaMin     =-1.5,        // min eta range to fill in histos
 Float_t etaMax     = 1.5,        // max eta range to fill in histos
 Float_t zMin       = -5,         // process events with Z vertex min
 Float_t zMax       =  5,         //                     max positions
 Float_t cutSigNStd  = 1.,        // cut on weighed distance used to extract signal
 Float_t cutSigDPhiS = -1,        // cut on dPhi-phiBent used to extract signal (if negative -> dphi*sqrt(cutSigNStd)
 Bool_t  useMC  = kTRUE,          // fill MC info (doRec=kTRUE)
 // specific parameters for reconstruction
 Bool_t scaleDTheta = kTRUE,       // scale dTheta by 1/sin^2(theta) in trackleting
 float  nStdDev     = 1.,         // number of st.dev. for tracklet cut to keep
 float  dphi        = 0.06,        // dphi window (sigma of tracklet cut)
 float  dtht        = 0.025,       // dtheta .... (if negative, abs will be used with additional cut on |dthetaX|, apart from w.distance
 float  phishift    = 0.0045,      // bending shift
 Bool_t remOvl      = kTRUE,       
 float  ovlPhiCut   = 0.005, 
 float  ovlZetaCut  = 0.05,
 Int_t  nEventsSkip = 0
 )
{
  //  
  if (cutSigDPhiS<0) cutSigDPhiS = TMath::Sqrt(cutSigNStd)*dphi;
  //
  printf("Start Analysis for %s, max %d Events skipping %d, Event Cuts: %.1f<eta<%.1f, %.2f<Zv<%.2f\n",
	 dataset.Data(),nEvents,nEventsSkip,etaMin,etaMax,zMin,zMax);
  printf("Tracklet cuts: dPhi:%.3f dTheta:%.3f phiShift:%.4f | Keep %.1f NstDev\n"
	 "Scale dTheta: %s | Signal Selection: NstDev:%.1f, dPhiS: %.3f\n", 
	 dphi,dtht,phishift,nStdDev,scaleDTheta ? "ON":"OFF",
	 cutSigNStd,cutSigDPhiS);
  //
  if (nEvents<0) nEvents = int(1e9);
  TString format = GetFormatFromDataSet(dataset);
  //
  // ALICE stuff
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) mgr = new AliAnalysisManager("Test train");
  //
  InputHandlerSetup(format,useMC);
  // compile our task
  gProof->Load("AliSPDClustTask.cxx++");
  //
  // load and run AddTask macro
  //  gROOT->LoadMacro("AddMultTaskTrackletMulti.C");
  //
  // create our task
  
  AliSPDClustTask *task = new AliSPDClustTask("AliSPDClustTask");
  // create output container
  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("clist", TList::Class(),AliAnalysisManager::kOutputContainer,outFName);
  //  coutput1->SetSpecialOutput();
  // add our task to the manager
  mgr->AddTask(task);

  // finaly connect input and output
  mgr->ConnectInput(task, 0,  mgr->GetCommonInputContainer());
  mgr->ConnectOutput(task,1,coutput1);
  //  mgr->SetSpecialOutputLocation("root://alicers01.cern.ch//tmp/output/");
  //
  //
  task->SetUseMC(useMC);
  //
  task->SetEtaMin(etaMin);
  task->SetEtaMax(etaMax);
  task->SetZVertexMin(zMin);
  task->SetZVertexMax(zMax);
  //
  task->SetDPhiSCut(cutSigDPhiS);
  task->SetNStdCut(cutSigNStd);
  //
  task->SetScaleDThetaBySin2T(scaleDTheta);
  task->SetNStdDev(nStdDev);
  task->SetPhiWindow(dphi);
  task->SetThetaWindow(dtht);
  task->SetPhiShift(phishift);
  task->SetPhiOverlapCut(ovlPhiCut);
  task->SetZetaOverlapCut(ovlZetaCut);
  task->SetRemoveOverlaps(remOvl);
  //
  task->SetInput("spectraCombine.root");
  //
  printf("Requesting physics selection in %s mode\n",useMC ? "MC":"Data");
  gROOT->ProcessLine(".L $ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
  //  /*
  //gROOT->ProcessLine(".L AddTaskPhysicsSelection.C");
  AliPhysicsSelectionTask* physicsSelectionTask = AddTaskPhysicsSelection(useMC);
  task->SelectCollisionCandidates();//AliVEvent::kMB);
  //
  //  */
  // Run analysis
  mgr->InitAnalysis();
  // process dataset  
  mgr->StartAnalysis("proof", dataset.Data(), nEvents, nEventsSkip); 
  //
  TString evstCmd = "if [ -e event_stat.root ]; then \nmv event_stat.root evstat_"; 
  evstCmd += outFName;  evstCmd += " \nfi";
  gSystem->Exec( evstCmd.Data() );
  
}


TString GetFormatFromDataSet(TString dataset) {
  
//   Info("runAAF.C","Detecting format from dataset (may take while, depends on network connection)...");
  TString dsTreeName;
  if (dataset.Contains("#")) {
    Info("runAAF.C",Form("Detecting format from dataset name '%s' ...",dataset.Data()));
    dsTreeName=dataset(dataset.Last('#'),dataset.Length());
  } else {
    Info("runAAF.C",Form("Detecting format from dataset '%s' (may take while, depends on network connection) ...",dataset.Data()));
    TFileCollection *ds = gProof->GetDataSet(dataset.Data());
    if (!ds) {
      Error(Form("Dataset %s doesn't exist on proof cluster!!!!",dataset.Data()));
      return "";
    }
    dsTreeName = ds->GetDefaultTreeName();
  }

  if (dsTreeName.Contains("esdTree")) {
    Info("runAAF.C","ESD input format detected ...");
    return "ESD";
  } else if (dsTreeName.Contains("aodTree"))  {
    Info("runAAF.C","AOD input format detected ...");
    return "AOD";
  } else {
    Error("runAAF.C",Form("Tree %s is not supported !!!",dsTreeName.Data()));
    Error("runAAF.C",Form("Maybe set your DS to %s#esdTree or %s#aodTree",dataset.Data(),dataset.Data()));
  }
  
  return "";
}

Bool_t InputHandlerSetup(TString format = "esd", Bool_t useKine = kTRUE)
{
  format.ToLower();

  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();

  AliAnalysisDataContainer *cin = mgr->GetCommonInputContainer();

  if (cin) return;

  if (!format.CompareTo("esd"))
  {
    AliESDInputHandler *esdInputHandler = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());

    if (!esdInputHandler)
    {
      Info("CustomAnalysisTaskInputSetup", "Creating esdInputHandler ...");
      if (needRecPoints)
	esdInputHandler = new AliESDInputHandlerRP();
      else 
	esdInputHandler = new AliESDInputHandler();
      //
      mgr->SetInputEventHandler(esdInputHandler);
    }
    //
    if (useKine)
    {
      AliMCEventHandler* mcInputHandler = dynamic_cast<AliMCEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());

      if (!mcInputHandler)
      {
        Info("CustomAnalysisTaskInputSetup", "Creating mcInputHandler ...");
        AliMCEventHandler* mcInputHandler = new AliMCEventHandler();
        mgr->SetMCtruthEventHandler(mcInputHandler);
      }
    }

  }
  else if (!format.CompareTo("aod"))
  {
    AliAODInputHandler *aodInputHandler = dynamic_cast<AliAODInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());

    if (!aodInputHandler)
    {
      Info("CustomAnalysisTaskInputSetup", "Creating aodInputHandler ...");
      aodInputHandler = new AliAODInputHandler();
      mgr->SetInputEventHandler(aodInputHandler);
    }
  }
  else
  {
    Info("Wrong input format!!! Only ESD and AOD are supported. Skipping Task ...");
    return kFALSE;
  }

  return kTRUE;
}

void MixHandlerSetup(float ntMin,float ntMax,float ntMixBinSz,
		     float zMin, float zMax, float zMixBinSz)
{
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) return;
  int bufferSize = 1;
  AliESDInputHandlerRP *esdH = dynamic_cast<AliESDInputHandlerRP*>(mgr->GetInputEventHandler());
  if (!esdH) return;
  //
  AliMixEventInputHandler *esdMixH = new AliMixEventInputHandler(bufferSize);
  esdMixH->SetInputHandlerForMixing(esdH);
  AliMixEventPool *evPool = new AliMixEventPool("Pool");
  AliMixEventCutObj *tracklets = new AliMixEventCutObj(AliMixEventCutObj::kNumberTracklets, ntMin,ntMax,ntMixBinSz);
  AliMixEventCutObj *zvertex = new AliMixEventCutObj(AliMixEventCutObj::kZVertex, zMin,zMax, zMixBinSz);
  //  evPool->AddCut(tracklets);
  evPool->AddCut(zvertex);
  //evPool->Init();
  evPool->Print();
  esdMixH->SetEventPool(evPool);
  esdH->SetMixingHandler(esdMixH);
}

void AddPhysicsSelection(Bool_t isMC)
{
  // physics selection a la Michele
  if(!isMC) {
    //AliPhysicsSelection * physSel = physicsSelectionTask->GetPhysicsSelection();
    //    physSel->AddCollisionTriggerClass("+CMBAC-B-NOPF-ALL");
    /*
    physSel->AddCollisionTriggerClass("+CMBS1C-B-NOPF-ALL");
    physSel->AddCollisionTriggerClass("+CMBS1A-B-NOPF-ALL");
    */
    //
    //    physSel->AddCollisionTriggerClass("+CMBS2C-B-NOPF-ALL");
    //    physSel->AddCollisionTriggerClass("+CMBS2A-B-NOPF-ALL");
    //
    // This are needed only to fill the statistics tables
    //    physSel->AddBGTriggerClass("+CMBAC-C-NOPF-ALL");
    //    physSel->AddBGTriggerClass("+CMBAC-A-NOPF-ALL");
    //    physSel->AddBGTriggerClass("+CMBAC-E-NOPF-ALL");
    //
    /*
    physSel->AddBGTriggerClass("+CMBS1C-C-NOPF-ALL");
    physSel->AddBGTriggerClass("+CMBS1C-A-NOPF-ALL");
    physSel->AddBGTriggerClass("+CMBS1C-E-NOPF-ALL");
    //
    physSel->AddBGTriggerClass("+CMBS1A-C-NOPF-ALL");
    physSel->AddBGTriggerClass("+CMBS1A-A-NOPF-ALL");
    physSel->AddBGTriggerClass("+CMBS1A-E-NOPF-ALL");
    //
    */
    /*
    //
    physSel->AddBGTriggerClass("+CMBS2C-C-NOPF-ALL");
    physSel->AddBGTriggerClass("+CMBS2C-A-NOPF-ALL");
    physSel->AddBGTriggerClass("+CMBS2C-E-NOPF-ALL");
    //
    physSel->AddBGTriggerClass("+CMBS2A-C-NOPF-ALL");
    physSel->AddBGTriggerClass("+CMBS2A-A-NOPF-ALL");
    physSel->AddBGTriggerClass("+CMBS2A-E-NOPF-ALL");
    */
  } 
  // if you use the following line, your task only gets the selected events
  //  task->SelectCollisionCandidates(AliVEvent::kUserDefined);
  //  task->SelectCollisionCandidates();
  //
  //Alternatively, in the UserExec of your task:
  //Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kUserDefined);
  //
}
 AnalysisSPDClustTask.C:1
 AnalysisSPDClustTask.C:2
 AnalysisSPDClustTask.C:3
 AnalysisSPDClustTask.C:4
 AnalysisSPDClustTask.C:5
 AnalysisSPDClustTask.C:6
 AnalysisSPDClustTask.C:7
 AnalysisSPDClustTask.C:8
 AnalysisSPDClustTask.C:9
 AnalysisSPDClustTask.C:10
 AnalysisSPDClustTask.C:11
 AnalysisSPDClustTask.C:12
 AnalysisSPDClustTask.C:13
 AnalysisSPDClustTask.C:14
 AnalysisSPDClustTask.C:15
 AnalysisSPDClustTask.C:16
 AnalysisSPDClustTask.C:17
 AnalysisSPDClustTask.C:18
 AnalysisSPDClustTask.C:19
 AnalysisSPDClustTask.C:20
 AnalysisSPDClustTask.C:21
 AnalysisSPDClustTask.C:22
 AnalysisSPDClustTask.C:23
 AnalysisSPDClustTask.C:24
 AnalysisSPDClustTask.C:25
 AnalysisSPDClustTask.C:26
 AnalysisSPDClustTask.C:27
 AnalysisSPDClustTask.C:28
 AnalysisSPDClustTask.C:29
 AnalysisSPDClustTask.C:30
 AnalysisSPDClustTask.C:31
 AnalysisSPDClustTask.C:32
 AnalysisSPDClustTask.C:33
 AnalysisSPDClustTask.C:34
 AnalysisSPDClustTask.C:35
 AnalysisSPDClustTask.C:36
 AnalysisSPDClustTask.C:37
 AnalysisSPDClustTask.C:38
 AnalysisSPDClustTask.C:39
 AnalysisSPDClustTask.C:40
 AnalysisSPDClustTask.C:41
 AnalysisSPDClustTask.C:42
 AnalysisSPDClustTask.C:43
 AnalysisSPDClustTask.C:44
 AnalysisSPDClustTask.C:45
 AnalysisSPDClustTask.C:46
 AnalysisSPDClustTask.C:47
 AnalysisSPDClustTask.C:48
 AnalysisSPDClustTask.C:49
 AnalysisSPDClustTask.C:50
 AnalysisSPDClustTask.C:51
 AnalysisSPDClustTask.C:52
 AnalysisSPDClustTask.C:53
 AnalysisSPDClustTask.C:54
 AnalysisSPDClustTask.C:55
 AnalysisSPDClustTask.C:56
 AnalysisSPDClustTask.C:57
 AnalysisSPDClustTask.C:58
 AnalysisSPDClustTask.C:59
 AnalysisSPDClustTask.C:60
 AnalysisSPDClustTask.C:61
 AnalysisSPDClustTask.C:62
 AnalysisSPDClustTask.C:63
 AnalysisSPDClustTask.C:64
 AnalysisSPDClustTask.C:65
 AnalysisSPDClustTask.C:66
 AnalysisSPDClustTask.C:67
 AnalysisSPDClustTask.C:68
 AnalysisSPDClustTask.C:69
 AnalysisSPDClustTask.C:70
 AnalysisSPDClustTask.C:71
 AnalysisSPDClustTask.C:72
 AnalysisSPDClustTask.C:73
 AnalysisSPDClustTask.C:74
 AnalysisSPDClustTask.C:75
 AnalysisSPDClustTask.C:76
 AnalysisSPDClustTask.C:77
 AnalysisSPDClustTask.C:78
 AnalysisSPDClustTask.C:79
 AnalysisSPDClustTask.C:80
 AnalysisSPDClustTask.C:81
 AnalysisSPDClustTask.C:82
 AnalysisSPDClustTask.C:83
 AnalysisSPDClustTask.C:84
 AnalysisSPDClustTask.C:85
 AnalysisSPDClustTask.C:86
 AnalysisSPDClustTask.C:87
 AnalysisSPDClustTask.C:88
 AnalysisSPDClustTask.C:89
 AnalysisSPDClustTask.C:90
 AnalysisSPDClustTask.C:91
 AnalysisSPDClustTask.C:92
 AnalysisSPDClustTask.C:93
 AnalysisSPDClustTask.C:94
 AnalysisSPDClustTask.C:95
 AnalysisSPDClustTask.C:96
 AnalysisSPDClustTask.C:97
 AnalysisSPDClustTask.C:98
 AnalysisSPDClustTask.C:99
 AnalysisSPDClustTask.C:100
 AnalysisSPDClustTask.C:101
 AnalysisSPDClustTask.C:102
 AnalysisSPDClustTask.C:103
 AnalysisSPDClustTask.C:104
 AnalysisSPDClustTask.C:105
 AnalysisSPDClustTask.C:106
 AnalysisSPDClustTask.C:107
 AnalysisSPDClustTask.C:108
 AnalysisSPDClustTask.C:109
 AnalysisSPDClustTask.C:110
 AnalysisSPDClustTask.C:111
 AnalysisSPDClustTask.C:112
 AnalysisSPDClustTask.C:113
 AnalysisSPDClustTask.C:114
 AnalysisSPDClustTask.C:115
 AnalysisSPDClustTask.C:116
 AnalysisSPDClustTask.C:117
 AnalysisSPDClustTask.C:118
 AnalysisSPDClustTask.C:119
 AnalysisSPDClustTask.C:120
 AnalysisSPDClustTask.C:121
 AnalysisSPDClustTask.C:122
 AnalysisSPDClustTask.C:123
 AnalysisSPDClustTask.C:124
 AnalysisSPDClustTask.C:125
 AnalysisSPDClustTask.C:126
 AnalysisSPDClustTask.C:127
 AnalysisSPDClustTask.C:128
 AnalysisSPDClustTask.C:129
 AnalysisSPDClustTask.C:130
 AnalysisSPDClustTask.C:131
 AnalysisSPDClustTask.C:132
 AnalysisSPDClustTask.C:133
 AnalysisSPDClustTask.C:134
 AnalysisSPDClustTask.C:135
 AnalysisSPDClustTask.C:136
 AnalysisSPDClustTask.C:137
 AnalysisSPDClustTask.C:138
 AnalysisSPDClustTask.C:139
 AnalysisSPDClustTask.C:140
 AnalysisSPDClustTask.C:141
 AnalysisSPDClustTask.C:142
 AnalysisSPDClustTask.C:143
 AnalysisSPDClustTask.C:144
 AnalysisSPDClustTask.C:145
 AnalysisSPDClustTask.C:146
 AnalysisSPDClustTask.C:147
 AnalysisSPDClustTask.C:148
 AnalysisSPDClustTask.C:149
 AnalysisSPDClustTask.C:150
 AnalysisSPDClustTask.C:151
 AnalysisSPDClustTask.C:152
 AnalysisSPDClustTask.C:153
 AnalysisSPDClustTask.C:154
 AnalysisSPDClustTask.C:155
 AnalysisSPDClustTask.C:156
 AnalysisSPDClustTask.C:157
 AnalysisSPDClustTask.C:158
 AnalysisSPDClustTask.C:159
 AnalysisSPDClustTask.C:160
 AnalysisSPDClustTask.C:161
 AnalysisSPDClustTask.C:162
 AnalysisSPDClustTask.C:163
 AnalysisSPDClustTask.C:164
 AnalysisSPDClustTask.C:165
 AnalysisSPDClustTask.C:166
 AnalysisSPDClustTask.C:167
 AnalysisSPDClustTask.C:168
 AnalysisSPDClustTask.C:169
 AnalysisSPDClustTask.C:170
 AnalysisSPDClustTask.C:171
 AnalysisSPDClustTask.C:172
 AnalysisSPDClustTask.C:173
 AnalysisSPDClustTask.C:174
 AnalysisSPDClustTask.C:175
 AnalysisSPDClustTask.C:176
 AnalysisSPDClustTask.C:177
 AnalysisSPDClustTask.C:178
 AnalysisSPDClustTask.C:179
 AnalysisSPDClustTask.C:180
 AnalysisSPDClustTask.C:181
 AnalysisSPDClustTask.C:182
 AnalysisSPDClustTask.C:183
 AnalysisSPDClustTask.C:184
 AnalysisSPDClustTask.C:185
 AnalysisSPDClustTask.C:186
 AnalysisSPDClustTask.C:187
 AnalysisSPDClustTask.C:188
 AnalysisSPDClustTask.C:189
 AnalysisSPDClustTask.C:190
 AnalysisSPDClustTask.C:191
 AnalysisSPDClustTask.C:192
 AnalysisSPDClustTask.C:193
 AnalysisSPDClustTask.C:194
 AnalysisSPDClustTask.C:195
 AnalysisSPDClustTask.C:196
 AnalysisSPDClustTask.C:197
 AnalysisSPDClustTask.C:198
 AnalysisSPDClustTask.C:199
 AnalysisSPDClustTask.C:200
 AnalysisSPDClustTask.C:201
 AnalysisSPDClustTask.C:202
 AnalysisSPDClustTask.C:203
 AnalysisSPDClustTask.C:204
 AnalysisSPDClustTask.C:205
 AnalysisSPDClustTask.C:206
 AnalysisSPDClustTask.C:207
 AnalysisSPDClustTask.C:208
 AnalysisSPDClustTask.C:209
 AnalysisSPDClustTask.C:210
 AnalysisSPDClustTask.C:211
 AnalysisSPDClustTask.C:212
 AnalysisSPDClustTask.C:213
 AnalysisSPDClustTask.C:214
 AnalysisSPDClustTask.C:215
 AnalysisSPDClustTask.C:216
 AnalysisSPDClustTask.C:217
 AnalysisSPDClustTask.C:218
 AnalysisSPDClustTask.C:219
 AnalysisSPDClustTask.C:220
 AnalysisSPDClustTask.C:221
 AnalysisSPDClustTask.C:222
 AnalysisSPDClustTask.C:223
 AnalysisSPDClustTask.C:224
 AnalysisSPDClustTask.C:225
 AnalysisSPDClustTask.C:226
 AnalysisSPDClustTask.C:227
 AnalysisSPDClustTask.C:228
 AnalysisSPDClustTask.C:229
 AnalysisSPDClustTask.C:230
 AnalysisSPDClustTask.C:231
 AnalysisSPDClustTask.C:232
 AnalysisSPDClustTask.C:233
 AnalysisSPDClustTask.C:234
 AnalysisSPDClustTask.C:235
 AnalysisSPDClustTask.C:236
 AnalysisSPDClustTask.C:237
 AnalysisSPDClustTask.C:238
 AnalysisSPDClustTask.C:239
 AnalysisSPDClustTask.C:240
 AnalysisSPDClustTask.C:241
 AnalysisSPDClustTask.C:242
 AnalysisSPDClustTask.C:243
 AnalysisSPDClustTask.C:244
 AnalysisSPDClustTask.C:245
 AnalysisSPDClustTask.C:246
 AnalysisSPDClustTask.C:247
 AnalysisSPDClustTask.C:248
 AnalysisSPDClustTask.C:249
 AnalysisSPDClustTask.C:250
 AnalysisSPDClustTask.C:251
 AnalysisSPDClustTask.C:252
 AnalysisSPDClustTask.C:253
 AnalysisSPDClustTask.C:254
 AnalysisSPDClustTask.C:255
 AnalysisSPDClustTask.C:256
 AnalysisSPDClustTask.C:257
 AnalysisSPDClustTask.C:258
 AnalysisSPDClustTask.C:259
 AnalysisSPDClustTask.C:260
 AnalysisSPDClustTask.C:261
 AnalysisSPDClustTask.C:262
 AnalysisSPDClustTask.C:263
 AnalysisSPDClustTask.C:264
 AnalysisSPDClustTask.C:265
 AnalysisSPDClustTask.C:266