ROOT logo
//____________________________________________________________________
//
// $Id$
//
// Script that contains a class to get the media where a certain track
// was created.   This is used for background studies. 
//
// Use the script `Compile.C' to compile this class using ACLic. 
//
#include <TH2D.h>
#include <AliFMDHit.h>
#include <AliFMDInput.h>
#include <iostream>
#include <TStyle.h>
#include <TArrayF.h>
#include <TArrayI.h>
#include <AliRun.h>
#include <TNtuple.h>
#include <AliDetector.h>
#include <TFile.h>
#include <TGeoManager.h>
#include <TGeoVolume.h>
#include <TGeoMedium.h>
#include <TParticle.h>
#include <THStack.h>
/** @class Media 
    @brief Media description 
    @ingroup FMD_script
 */
struct Media : public TNamed
{
  TArrayI         fMeds;
  TNtuple*        fCount;
  TH1D*           fHist;
  Media(const char* name, const char* title) 
    : TNamed(name, title), fMeds(0) 
  {
    fHist  = new TH1D(Form("h%s",name), title, 120, -6, 6);
    // fHist->SetFillStyle(3001);
    fCount = new TNtuple(GetName(), GetTitle(), 
			 "E:DET:RNG:SEC:STR:X:Y:Z:EDEP:PDG");
  }
  Media(const char* name, TArrayI* a) 
    : TNamed(name, "Media information"), fMeds(a->fN, a->fArray)
  {
    fHist  = new TH1D(Form("h%s",name), GetTitle(), 120, -6, 6);
    fHist->SetFillStyle(3001);
    fHist->SetFillColor(fMeds.fN > 0 ? fMeds[0] : 0);
    fCount = new TNtuple(GetName(), GetTitle(), 
			 "E:DET:RNG:SEC:STR:X:Y:Z:EDEP:PDG");
    std::cout << "Media list " << name << ":" << std::endl;
    for (Int_t i = 0; i < fMeds.fN; i++) {
      std::cout << " " << fMeds[i] << std::flush;
      if (fMeds[i] == 0 && i > 0) break;
    }
    std::cout << std::endl;
  }
  Bool_t HasMedia(Int_t id) 
  {
    if (fMeds.fN <= 0) return kFALSE;
    for (Int_t i = 0; i < fMeds.fN; i++) {
      if (fMeds[i] == id) return kTRUE;
      if (fMeds[i] == 0 && i > 0) break;
    }
    return kFALSE;
  }
  void Fill(Int_t ev, AliFMDHit* hit) 
  {
    Float_t x[10];
    x[0] = ev;
    x[1] = hit->Detector();
    x[2] = Int_t(hit->Ring());
    x[3] = hit->Sector();
    x[4] = hit->Strip();
    x[5] = hit->X();
    x[6] = hit->Y();
    x[7] = hit->Z();
    x[8] = hit->Edep();
    x[9] = hit->Pdg();
    // return;
    fCount->Fill(x);    
    // r = TMath::Sqrt(hit->X() * hit->X() + hit->Y() * hit->Y());
    // if(r!=0) Float_t wgt=1./(2. * 3.1415*r);
    Double_t r = TMath::Sqrt(hit->X()*hit->X()+hit->Y()*hit->Y());
    Double_t t = TMath::ATan2(r, hit->Z());
    Double_t e = -TMath::Log(TMath::Tan(t/2));
    fHist->Fill(e);
  }
};


//____________________________________________________________________
/** @class GetMedia
    @brief Get media where a particle is produced
    @code 
    aliroot
    Root> gAlice->Init("$ALICE_ROOT/FMD/Config.C");
    Root> .x $ALICE_ROOT/FMD/scriptsWriteMedArrays.C
    Root> gAlice->Run();
    Root> .q
    aliroot
    Root> .L Compile.C
    Root> Compile("GetMedia.C")
    Root> GetMedia c
    Root> c.Run();
    @endcode
    @ingroup FMD_script
 */
class GetMedia : public AliFMDInput
{
private:
  TString    fModList;
  TObjArray  fMedia;
  Media*     fOther;
  Media*     fAll;
  Media*     fPrim;
  Int_t      fEv;
  THStack*   fStack;
  TFile*     fOutput;
public:
  //__________________________________________________________________
  GetMedia(const char* modlist="FMD:ITS:BODY:ABSO:T0:PIPE", 
	   const char* output="media.root") 
    :  fModList(modlist)
  { 
    AddLoad(kGeometry);
    AddLoad(kHits);
    AddLoad(kKinematics);

    fOutput = TFile::Open(output, "RECREATE");
    fStack  = new THStack("summed", "Summed hits");
    fOther  = AddMedia("other", "Unknown media");
    fAll    = AddMedia("All", "All media");
    fPrim   = AddMedia("Primary", "Primary particles");
    fEv     = 0;

    
    fAll->fHist->SetFillColor(0);
    fAll->fHist->SetFillStyle(3004);
    fPrim->fHist->SetFillColor(1);
    fPrim->fHist->SetFillStyle(3001);
    fStack->Add(fPrim->fHist);
  }
  //__________________________________________________________________
  Media* AddMedia(const char* name, const char* title, TArrayI* a=0)
  {
    Media* media = 0;
    if (!a) media = new Media(name, title);
    else    media = new Media(name, a);
    if (a)  {
      fMedia.Add(media);
      fStack->Add(media->fHist);
    }
    return media;
  }
  //__________________________________________________________________
  Media* FindMedia(Int_t med) 
  {
    for (Int_t i = 0; i < fMedia.GetEntries(); i++) {
      Media* media = static_cast<Media*>(fMedia.At(i));
      if (!media) continue;
      if (media->HasMedia(med)) return media;
    }
    return 0;
  }
  //__________________________________________________________________
  Bool_t Init()
  {
    Bool_t ret = AliFMDInputHits::Init();
    if (!gGeoManager) {
      Error("Init", "No geometry defined - make sure you have that");
      return kFALSE;
    }
    if (!fRun) {
      Error("Init", "gAlice not defined");
      return kFALSE;
    }
    Int_t now = 0;
    Int_t colon;
    TFile* file = TFile::Open("medid.root", "READ");
    if (!file) {
      Error("Init", "couldn't open medid.root");
      return kFALSE;
    }
    fOutput->cd();
    while ((colon = fModList.Index(":", now)) >= 0) {
      TString d(fModList(now, colon-now));
      now = colon+1;
      TArrayI* a = 0;
      file->GetObject(d.Data(), a);
      if (!a) {
	Warning("Init", "No medium array for %s", d.Data());
	continue;
      }
      AddMedia(d.Data(),0, a);
    }
    if (now < fModList.Length()) {
      colon = fModList.Length();
      TString d(fModList(now, colon-now));
      TArrayI* a = 0;
      file->GetObject(d.Data(), a);
      if (!a) 
	Warning("Init", "No medium array for %s", d.Data());
      else 
	AddMedia(d.Data(),0, a);
    }
    file->Close();
    if (fMedia.GetEntries() <= 0) return kFALSE;
    return ret;
  }  
  //__________________________________________________________________
  /** Begining of event
      @param ev Event number
      @return @c false on error */
  Bool_t Begin(Int_t ev) 
  {
    fEv = ev;
    return AliFMDInputHits::Begin(ev);
  }
  //__________________________________________________________________
  Bool_t ProcessHit(AliFMDHit* hit, TParticle* track) 
  {
    if (!hit || !track) {
      std::cout << "No hit or track (hit: " << hit << ", track: " 
		<< track << ")" << std::endl;
      return kFALSE;
    }
    fAll->Fill(fEv, hit);
    if (track->IsPrimary()) { 
      fPrim->Fill(fEv, hit);
      return kTRUE;
    }
      
    // Get production vertex 
    Double_t vx = track->Vx();
    Double_t vy = track->Vy();
    Double_t vz = track->Vz();
    // Get node 
    TGeoNode* prodNode = gGeoManager->FindNode(vx,vy,vz);
    if (!prodNode) { 
      Warning("ProcessHit", "didn't find a node for production vertex");
      return kTRUE;
    }
    //Info("ProcessHit", "Production vertex in node %s", prodNode->GetName());

    // Get volume 
    TGeoVolume* prodVol = prodNode->GetVolume();
    if (!prodVol) { 
      Warning("ProcessHit", "didn't find a volume for production vertex");
      return kTRUE;
    }
    //Info("ProcessHit", "Production vertex in volume %s",prodVol->GetName());
    
    // Med medium 
    TGeoMedium* prodMed = prodVol->GetMedium();
    if (!prodMed) { 
      Warning("ProcessHit", "didn't find a medium for production vertex");
      return kTRUE;
    }
    // Info("ProcessHit", "Production vertex in medium %s %d", 
    //      prodMed->GetName(), prodMed->GetId());
    
    
    Media* media = FindMedia(prodMed->GetId());
    if (!media) { 
      Warning("ProcessHit", "Media not found %s (%d)", 
	      prodMed->GetName(), prodMed->GetId());
      media = fOther; 
    }
    // Info("ProcessHit", "Adding to %s", media->GetName());
    media->Fill(fEv, hit);
    return kTRUE;
  }
  //__________________________________________________________________
  Bool_t Finish()
  {
    fOutput->cd();
    fStack->Write();
    fStack->Draw();
    fOutput->Write();
    fOutput->Close();
    fOutput = 0;
    fMedia.Delete();
    return kTRUE;
  }
};

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