1 //____________________________________________________________________
5 // Script that contains a class to get the media where a certain track
6 // was created. This is used for background studies.
8 // Use the script `Compile.C' to compile this class using ACLic.
11 #include <AliFMDHit.h>
12 #include <AliFMDInput.h>
19 #include <AliDetector.h>
21 #include <TGeoManager.h>
22 #include <TGeoVolume.h>
23 #include <TGeoMedium.h>
24 #include <TParticle.h>
27 @brief Media description
30 struct Media : public TNamed
35 Media(const char* name, const char* title)
36 : TNamed(name, title), fMeds(0)
38 fHist = new TH1D(Form("h%s",name), title, 120, -6, 6);
39 // fHist->SetFillStyle(3001);
40 fCount = new TNtuple(GetName(), GetTitle(),
41 "E:DET:RNG:SEC:STR:X:Y:Z:EDEP:PDG");
43 Media(const char* name, TArrayI* a)
44 : TNamed(name, "Media information"), fMeds(a->fN, a->fArray)
46 fHist = new TH1D(Form("h%s",name), GetTitle(), 120, -6, 6);
47 fHist->SetFillStyle(3001);
48 fHist->SetFillColor(fMeds.fN > 0 ? fMeds[0] : 0);
49 fCount = new TNtuple(GetName(), GetTitle(),
50 "E:DET:RNG:SEC:STR:X:Y:Z:EDEP:PDG");
51 std::cout << "Media list " << name << ":" << std::endl;
52 for (Int_t i = 0; i < fMeds.fN; i++) {
53 std::cout << " " << fMeds[i] << std::flush;
54 if (fMeds[i] == 0 && i > 0) break;
56 std::cout << std::endl;
58 Bool_t HasMedia(Int_t id)
60 if (fMeds.fN <= 0) return kFALSE;
61 for (Int_t i = 0; i < fMeds.fN; i++) {
62 if (fMeds[i] == id) return kTRUE;
63 if (fMeds[i] == 0 && i > 0) break;
67 void Fill(Int_t ev, AliFMDHit* hit)
71 x[1] = hit->Detector();
72 x[2] = Int_t(hit->Ring());
82 // r = TMath::Sqrt(hit->X() * hit->X() + hit->Y() * hit->Y());
83 // if(r!=0) Float_t wgt=1./(2. * 3.1415*r);
84 Double_t r = TMath::Sqrt(hit->X()*hit->X()+hit->Y()*hit->Y());
85 Double_t t = TMath::ATan2(r, hit->Z());
86 Double_t e = -TMath::Log(TMath::Tan(t/2));
92 //____________________________________________________________________
94 @brief Get media where a particle is produced
97 Root> gAlice->Init("$ALICE_ROOT/FMD/Config.C");
98 Root> .x $ALICE_ROOT/FMD/scriptsWriteMedArrays.C
103 Root> Compile("GetMedia.C")
109 class GetMedia : public AliFMDInput
121 //__________________________________________________________________
122 GetMedia(const char* modlist="FMD:ITS:BODY:ABSO:T0:PIPE",
123 const char* output="media.root")
128 AddLoad(kKinematics);
130 fOutput = TFile::Open(output, "RECREATE");
131 fStack = new THStack("summed", "Summed hits");
132 fOther = AddMedia("other", "Unknown media");
133 fAll = AddMedia("All", "All media");
134 fPrim = AddMedia("Primary", "Primary particles");
138 fAll->fHist->SetFillColor(0);
139 fAll->fHist->SetFillStyle(3004);
140 fPrim->fHist->SetFillColor(1);
141 fPrim->fHist->SetFillStyle(3001);
142 fStack->Add(fPrim->fHist);
144 //__________________________________________________________________
145 Media* AddMedia(const char* name, const char* title, TArrayI* a=0)
148 if (!a) media = new Media(name, title);
149 else media = new Media(name, a);
152 fStack->Add(media->fHist);
156 //__________________________________________________________________
157 Media* FindMedia(Int_t med)
159 for (Int_t i = 0; i < fMedia.GetEntries(); i++) {
160 Media* media = static_cast<Media*>(fMedia.At(i));
161 if (!media) continue;
162 if (media->HasMedia(med)) return media;
166 //__________________________________________________________________
169 Bool_t ret = AliFMDInputHits::Init();
171 Error("Init", "No geometry defined - make sure you have that");
175 Error("Init", "gAlice not defined");
180 TFile* file = TFile::Open("medid.root", "READ");
182 Error("Init", "couldn't open medid.root");
186 while ((colon = fModList.Index(":", now)) >= 0) {
187 TString d(fModList(now, colon-now));
190 file->GetObject(d.Data(), a);
192 Warning("Init", "No medium array for %s", d.Data());
195 AddMedia(d.Data(),0, a);
197 if (now < fModList.Length()) {
198 colon = fModList.Length();
199 TString d(fModList(now, colon-now));
201 file->GetObject(d.Data(), a);
203 Warning("Init", "No medium array for %s", d.Data());
205 AddMedia(d.Data(),0, a);
208 if (fMedia.GetEntries() <= 0) return kFALSE;
211 //__________________________________________________________________
212 /** Begining of event
213 @param ev Event number
214 @return @c false on error */
215 Bool_t Begin(Int_t ev)
218 return AliFMDInputHits::Begin(ev);
220 //__________________________________________________________________
221 Bool_t ProcessHit(AliFMDHit* hit, TParticle* track)
223 if (!hit || !track) {
224 std::cout << "No hit or track (hit: " << hit << ", track: "
225 << track << ")" << std::endl;
228 fAll->Fill(fEv, hit);
229 if (track->IsPrimary()) {
230 fPrim->Fill(fEv, hit);
234 // Get production vertex
235 Double_t vx = track->Vx();
236 Double_t vy = track->Vy();
237 Double_t vz = track->Vz();
239 TGeoNode* prodNode = gGeoManager->FindNode(vx,vy,vz);
241 Warning("ProcessHit", "didn't find a node for production vertex");
244 //Info("ProcessHit", "Production vertex in node %s", prodNode->GetName());
247 TGeoVolume* prodVol = prodNode->GetVolume();
249 Warning("ProcessHit", "didn't find a volume for production vertex");
252 //Info("ProcessHit", "Production vertex in volume %s",prodVol->GetName());
255 TGeoMedium* prodMed = prodVol->GetMedium();
257 Warning("ProcessHit", "didn't find a medium for production vertex");
260 // Info("ProcessHit", "Production vertex in medium %s %d",
261 // prodMed->GetName(), prodMed->GetId());
264 Media* media = FindMedia(prodMed->GetId());
266 Warning("ProcessHit", "Media not found %s (%d)",
267 prodMed->GetName(), prodMed->GetId());
270 // Info("ProcessHit", "Adding to %s", media->GetName());
271 media->Fill(fEv, hit);
274 //__________________________________________________________________
288 //____________________________________________________________________