3 #include "VSDCreator.h"
5 #include <Reve/TTreeTools.h>
8 #include <AliITSLoader.h>
9 #include <AliTPCTrackHitsV2.h>
12 #include <AliSimDigits.h>
13 #include <AliKalmanTrack.h>
16 #include <AliTPCclusterMI.h>
17 #include <AliTPCClustersRow.h>
19 #include <AliITSclusterV2.h>
20 #include <AliTrackReference.h>
21 #include <AliESDkink.h>
24 #include <AliTPCParam.h>
30 using namespace Alieve;
34 //______________________________________________________________________
40 VSDCreator::VSDCreator(const Text_t* name, const Text_t* title) :
43 mKineType (KT_Standard),
55 // Particles not in ROOT's PDG database occuring in ALICE
56 AliPDG::AddParticlesToPdgDataBase();
58 TDatabasePDG *pdgDB = TDatabasePDG::Instance();
59 // const Int_t kspe=50000000;
60 const Int_t kion=10000000;
62 const Double_t kAu2Gev=0.9314943228;
63 const Double_t khSlash = 1.0545726663e-27;
64 const Double_t kErg2Gev = 1/1.6021773349e-3;
65 const Double_t khShGev = khSlash*kErg2Gev;
66 const Double_t kYear2Sec = 3600*24*365.25;
68 pdgDB->AddParticle("Deuteron","Deuteron",2*kAu2Gev+8.071e-3,kTRUE,
69 0,1,"Ion",kion+10020);
70 pdgDB->AddParticle("Triton","Triton",3*kAu2Gev+14.931e-3,kFALSE,
71 khShGev/(12.33*kYear2Sec),1,"Ion",kion+10030);
72 pdgDB->AddParticle("Alpha","Alpha",4*kAu2Gev+2.424e-3,kTRUE,
73 khShGev/(12.33*kYear2Sec),2,"Ion",kion+20040);
74 pdgDB->AddParticle("HE3","HE3",3*kAu2Gev+14.931e-3,kFALSE,
75 0,2,"Ion",kion+20030);
78 // AliKalmanTrack::SetConvConst(1);
81 /**************************************************************************/
83 void VSDCreator::CreateVSD(const Text_t* data_dir, Int_t event,
84 const Text_t* vsd_file)
86 static const Exc_t eH("VSDCreator::CreateVSD ");
91 string galice_file (Form("%s/galice.root", mDataDir.Data()));
94 printf("%s opening %s \n", eH.Data(), galice_file.c_str());
96 if(gSystem->AccessPathName(galice_file.c_str(), kReadPermission)) {
97 throw(eH + "Can not read file '" + galice_file + "'.");
99 pRunLoader = AliRunLoader::Open(galice_file.c_str());
101 throw(eH + "AliRunLoader::Open failed.");
103 pRunLoader->LoadgAlice();
104 Int_t status = pRunLoader->GetEvent(mEvent);
106 throw(eH + Form("GetEvent(%d) failed, exit code %s.", mEvent, status));
109 printf("%s open seems ok. Now loading sim data.\n", eH.Data());
111 pRunLoader->LoadHeader();
112 pRunLoader->LoadKinematics();
113 pRunLoader->LoadTrackRefs();
114 pRunLoader->LoadHits();
119 printf("%s opening output VSD.\n", eH.Data());
121 TFile* file = TFile::Open(vsd_file, "RECREATE", "ALICE VisualizationDataSummary");
122 mDirectory = new TDirectory("Event0", "");
125 printf("%s creating trees now ...\n", eH.Data());
130 printf("%s trees created, closing files.\n", eH.Data());
139 // clean after the VSD data was sucessfuly written
149 pRunLoader->UnloadAll();
152 delete gAlice; gAlice = 0;
157 printf("%s all done.\n", eH.Data());
160 void VSDCreator::CreateTrees()
162 static const Exc_t eH("VSDCreator::CreateTrees ");
165 throw(eH + "output directory not set.");
169 printf("%s ConvertKinematics.\n", eH.Data());
171 } catch(Exc_t& exc) { WarnCaller(exc); }
175 printf("%s ConvertHits.\n", eH.Data());
177 } catch(Exc_t& exc) { WarnCaller(exc); }
181 printf("%s ConvertClusters.\n", eH.Data());
183 } catch(Exc_t& exc) { WarnCaller(exc); }
187 printf("%s ConvertRecTracks.\n", eH.Data());
189 } catch(Exc_t& exc) {
190 WarnCaller(exc + " Skipping V0 extraction.");
191 goto end_esd_processing;
196 printf("%s ConvertV0.\n", eH.Data());
198 } catch(Exc_t& exc) { WarnCaller(exc); }
202 printf("%s ConvertKinks.\n", eH.Data());
204 } catch(Exc_t& exc) { WarnCaller(exc); }
210 printf("%s ConvertGenInfo.\n", eH.Data());
212 } catch(Exc_t& exc) { WarnCaller(exc); }
217 /**************************************************************************/
219 /**************************************************************************/
221 void VSDCreator::ConvertKinematics()
223 static const Exc_t eH("VSDCreator::ConvertKinematics ");
226 throw (eH + "kinematics already converted");
228 AliStack* stack = pRunLoader->Stack();
230 throw(eH + "stack is null.");
233 mTreeK = new TTree("Kinematics", "TParticles sorted by Label");
235 Int_t nentries = stack->GetNtrack();
236 vector<MCTrack> vmc(nentries);
237 for (Int_t idx=0; idx<nentries; idx++) {
238 TParticle* tp = stack->Particle(idx);
240 vmc[idx].label = idx;
243 // read track refrences
244 TTree* mTreeTR = pRunLoader->TreeTR();
247 WarnCaller(eH + "no TrackRefs; some data will not be available.");
249 TClonesArray* RunArrayTR = 0;
250 mTreeTR->SetBranchAddress("AliRun", &RunArrayTR);
252 Int_t nPrimaries = (Int_t) mTreeTR->GetEntries();
253 for (Int_t iPrimPart = 0; iPrimPart<nPrimaries; iPrimPart++) {
254 // printf("START mTreeTR->GetEntry(%d) \n",iPrimPart);
255 mTreeTR->GetEntry(iPrimPart);
256 // printf("END mTreeTR->GetEntry(%d) \n",iPrimPart);
258 for (Int_t iTrackRef = 0; iTrackRef < RunArrayTR->GetEntriesFast(); iTrackRef++) {
259 AliTrackReference *trackRef = (AliTrackReference*)RunArrayTR->At(iTrackRef);
260 Int_t track = trackRef->GetTrack();
261 if(track < nentries && track > 0){
262 MCTrack& mct = vmc[track];
263 if(trackRef->TestBit(kNotDeleted)) {
265 mct.t_decay = trackRef->GetTime();
266 mct.V_decay.x = trackRef->X();
267 mct.V_decay.y = trackRef->Y();
268 mct.V_decay.z = trackRef->Z();
269 mct.P_decay.x = trackRef->Px();
270 mct.P_decay.y = trackRef->Py();
271 mct.P_decay.z = trackRef->Pz();
272 if(TMath::Abs(mct.GetPdgCode()) == 11)
273 mct.decayed = false; // a bug in TreeTR
280 mTreeK->Branch("K", "Reve::MCTrack", &mpK, fBuffSize);
282 printf("sizeofvmc = %d\n", vmc.size());
283 for(vector<MCTrack>::iterator k=vmc.begin(); k!=vmc.end(); ++k) {
288 Int_t mi = mct.label;
290 while(m->GetMother(0) != -1) {
292 printf("cnt %d mi=%d, mo=%d\n", cnt, mi, m->GetMother(0));
294 mi = m->GetMother(0);
303 mTreeK->BuildIndex("label");
306 /**************************************************************************/
308 /**************************************************************************/
315 const char* hitbranch;
316 unsigned char detidx;
319 Detector detects[] = {
320 { "ITS", "AliITShit", 0 },
321 { "TPC", "AliTPCTrackHitsV2", 1 },
322 { "TRD", "AliTRDhit", 2 },
323 { "TOF", "AliTOFhit", 3 }
324 // { "RICH", "AliRICHhit", 4 },
329 /**************************************************************************/
331 void VSDCreator::ConvertHits()
333 static const Exc_t eH("VSDCreator::ConvertHits ");
336 throw(eH + "hits already converted.");
339 mTreeH = new TTree("Hits", "Combined detector hits.");
340 mTreeH->Branch("H", "Reve::Hit", &mpH, fBuffSize);
342 map<Int_t, Int_t> hmap;
343 // parameters for ITS, TPC hits filtering
344 Float_t x,y,z, x1,y1,z1;
345 Float_t tpc_sqr_res = mTPCHitRes*mTPCHitRes;
346 Float_t trd_sqr_res = mTRDHitRes*mTRDHitRes;
349 // load hits from the rest of detectors
350 while(detects[l].name != 0) {
351 Detector& det = detects[l++];
356 TTree* treeh = pRunLoader->GetTreeH(det.name, false);
358 WarnCaller(eH + "no hits for "+ det.name +".");
361 AliTPCTrackHitsV2 hv2, *_hv2=&hv2;
362 treeh->SetBranchAddress("TPC2", &_hv2);
363 Int_t np = treeh->GetEntries();
364 for(Int_t i=0; i<np; i++){
366 Int_t eva_idx = np -i -1;
367 if (hv2.First() == 0) continue;
370 AliHit* ah = hv2.GetHit();
371 x1=ah->X();y1=ah->Y();z1=ah->Z();
372 if((x-x1)*(x-x1)+(y-y1)*(y-y1)+(z-z1)*(z-z1) > tpc_sqr_res) {
373 mH.det_id = det.detidx;
375 mH.label = ah->Track();
376 mH.eva_label = eva_idx;
377 mH.V.x = x1; mH.V.y = y1; mH.V.z = z1;
380 x = x1; y = y1; z = z1;
383 } while (hv2.Next());
385 // printf("%d entries in TPChits \n",count);
389 TTree* treeh = pRunLoader->GetTreeH(det.name, false);
391 WarnCaller(eH + "no hits for "+ det.name +".");
394 TClonesArray *arr = new TClonesArray(det.hitbranch);
395 treeh->SetBranchAddress(det.name, &arr);
396 Int_t np = treeh->GetEntries();
397 // in TreeH files hits are grouped in clones arrays
398 // each eva particle has its own clone array
399 for (Int_t i=0; i<np; i++) {
401 Int_t eva_idx = np -i -1;
402 Int_t nh=arr->GetEntriesFast();
404 // printf("%d entry %d hits for primary %d \n", i, nh, eva_idx);
405 for (Int_t j=0; j<nh; j++) {
406 AliHit* ali_hit = (AliHit*)arr->UncheckedAt(j);
407 mH.det_id = det.detidx;
409 mH.label = ali_hit->GetTrack();
410 mH.eva_label = eva_idx;
411 mH.V.Set(ali_hit->X(), ali_hit->Y(), ali_hit->Z());
412 if(det.detidx == 2) {
413 x1=ali_hit->X();y1=ali_hit->Y();z1=ali_hit->Z();
414 if((x-x1)*(x-x1)+(y-y1)*(y-y1)+(z-z1)*(z-z1) < trd_sqr_res) continue;
429 for(map<Int_t, Int_t>::iterator j=hmap.begin(); j!=hmap.end(); ++j) {
430 GetGeninfo(j->first)->n_hits += j->second;
435 /**************************************************************************/
437 /**************************************************************************/
439 void VSDCreator::ConvertClusters()
441 static const Exc_t eH("VSDCreator::ConvertClusters ");
444 throw(eH + "clusters already converted.");
447 mTreeC = new TTree("Clusters", "rec clusters");
448 mTreeC->Branch("C", "Reve::Cluster", &mpC, fBuffSize);
451 ConvertITSClusters();
452 } catch(Exc_t& exc) { WarnCaller(exc); }
455 ConvertTPCClusters();
456 } catch(Exc_t& exc) { WarnCaller(exc); }
459 /**************************************************************************/
461 void VSDCreator::ConvertTPCClusters()
463 static const Exc_t eH("VSDCreator::ConvertTPCClusters ");
466 ( TFile::Open(Form("%s/TPC.RecPoints.root", mDataDir.Data())) );
468 throw(eH + "can not open 'TPC.RecPoints.root' file.");
470 auto_ptr<TDirectory> d
471 ( (TDirectory*) f->Get(Form("Event%d", mEvent)) );
473 throw(eH + Form("event directory '%d' not found.", 0));
475 auto_ptr<TTree> tree( (TTree*) d->Get("TreeR") );
477 throw(eH + "'TreeR' not found.");
479 auto_ptr<AliTPCParam> par( GetTpcParam(eH) );
481 AliTPCClustersRow clrow, *_clrow=&clrow;
483 _clrow->SetClass("AliTPCclusterMI");
484 tree->SetBranchAddress("Segment", &_clrow);
488 Int_t n_ent = tree->GetEntries();
489 for (Int_t n=0; n<n_ent; n++) {
491 nClusters += _clrow->GetArray()->GetEntriesFast();
494 // calculate xyz for a cluster and add it to container
497 map<Int_t, Int_t> cmap;
499 for (Int_t n=0; n<tree->GetEntries(); n++) {
501 Int_t ncl = _clrow->GetArray()->GetEntriesFast();
504 par->AdjustSectorRow(_clrow->GetID(),sec,row);
506 if(_clrow->GetArray()) {
507 // cl = new AliTPCclusterMI(*(AliTPCclusterMI*)_clrow->GetArray()->UncheckedAt(ncl));
508 cl = (AliTPCclusterMI*)_clrow->GetArray()->UncheckedAt(ncl);
509 if(cl->GetLabel(0) >= 0){
510 x = par->GetPadRowRadii(sec,row); y = cl->GetY(); z = cl->GetZ();
511 par->AdjustCosSin(sec,cs,sn);
512 tmp = x*cs-y*sn; y= x*sn+y*cs; x=tmp;
516 mC.label[0] = cl->GetLabel(0);
517 mC.label[1] = cl->GetLabel(1);
518 mC.label[2] = cl->GetLabel(2);
523 while(i < 3 && mC.label[i])
524 cmap[mC.label[i++]]++;
532 for(map<Int_t, Int_t>::iterator j=cmap.begin(); j!=cmap.end(); ++j) {
533 GetGeninfo(j->first)->n_clus += j->second;
537 /**************************************************************************/
539 void VSDCreator::ConvertITSClusters()
541 static const Exc_t eH("VSDCreator::ConvertITSClusters ");
544 ( TFile::Open(Form("%s/ITS.RecPoints.root", mDataDir.Data())) );
546 throw(eH + "can not open 'ITS.RecPoints.root' file.");
548 auto_ptr<TDirectory> d
549 ( (TDirectory*) f->Get(Form("Event%d", mEvent)) );
551 throw(eH + Form("event directory '%d' not found.", 0));
553 auto_ptr<TTree> tree( (TTree*) d->Get("TreeR") );
555 throw(eH + "'TreeR' not found.");
557 AliITSLoader* ITSld = (AliITSLoader*) pRunLoader->GetLoader("ITSLoader");
558 //AliITS* pITS = ITSld->GetITS();
559 AliITSgeom* geom = ITSld->GetITSgeom();
560 //AliITSgeom* geom = new AliITSgeom();
561 //geom->ReadNewFile("/home/aljam/ITSgeometry.det");
563 //printf("alice ITS geom %p \n",geom );
566 throw(eH + "can not find ITS geometry");
568 TClonesArray *arr = new TClonesArray("AliITSclusterV2");
569 tree->SetBranchAddress("Clusters", &arr);
570 Int_t nmods = tree->GetEntries();
572 map<Int_t, Int_t> cmap;
574 for (Int_t mod=0; mod<nmods; mod++) {
576 Int_t nc=arr->GetEntriesFast();
577 for (Int_t j=0; j<nc; j++) {
578 AliITSclusterV2* recp = (AliITSclusterV2*)arr->UncheckedAt(j);
581 geom->GetRotMatrix(mod,rot);
583 geom->GetModuleId(mod,lay,lad,det);
585 geom->GetTrans(lay,lad,det,tx,ty,tz);
587 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
588 Double_t phi1=TMath::Pi()/2+alpha;
589 if(lay==1) phi1+=TMath::Pi();
591 Float_t cp=TMath::Cos(phi1), sp=TMath::Sin(phi1);
592 Float_t r=tx*cp+ty*sp;
593 gc[0]= r*cp - recp->GetY()*sp;
594 gc[1]= r*sp + recp->GetY()*cp;
599 mC.label[0] = recp->GetLabel(0);
600 mC.label[1] = recp->GetLabel(1);
601 mC.label[2] = recp->GetLabel(2);
602 mC.V.x = r*cp - recp->GetY()*sp;
603 mC.V.y = r*sp + recp->GetY()*cp;
604 mC.V.z = recp->GetZ();
607 while(i < 3 && mC.label[i])
608 cmap[mC.label[i++]]++;
612 for(map<Int_t, Int_t>::iterator j=cmap.begin(); j!=cmap.end(); ++j) {
613 GetGeninfo(j->first)->n_clus += j->second;
619 /**************************************************************************/
621 /**************************************************************************/
623 void VSDCreator::ConvertRecTracks()
625 static const Exc_t eH("VSDCreator::ConvertRecTracks ");
628 throw(eH + "tracks already converted.");
631 mTreeR = new TTree("RecTracks", "rec tracks");
633 mTreeR->Branch("R", "Reve::RecTrack", &mpR, 512*1024,1);
635 TFile f(Form("%s/AliESDs.root", mDataDir.Data()));
637 throw(eH + "no AliESDs.root file.");
639 TTree* tree = (TTree*) f.Get("esdTree");
641 throw(eH + "no esdTree.");
645 tree->SetBranchAddress("ESD", &fEvent);
646 tree->GetEntry(mEvent);
649 // reconstructed tracks
652 for (Int_t n=0; n<fEvent->GetNumberOfTracks(); n++) {
653 esd_t = fEvent->GetTrack(n);
655 mR.label = esd_t->GetLabel();
656 mR.status = (Int_t) esd_t->GetStatus();
657 mR.sign = (Int_t) esd_t->GetSign();
658 esd_t->GetXYZ(dbuf); mR.V.Set(dbuf);
659 esd_t->GetPxPyPz(dbuf); mR.P.Set(dbuf);
660 Double_t ep = esd_t->GetP();
661 mR.beta = ep/TMath::Sqrt(ep*ep + TMath::C()*TMath::C()*esd_t->GetMass()*esd_t->GetMass());
664 mTreeR->BuildIndex("label");
667 /**************************************************************************/
669 void VSDCreator::ConvertV0()
671 static const Exc_t eH("VSDCreator::ConvertV0 ");
674 throw(eH + "V0 already converted.");
677 mTreeV0 = new TTree("V0", "V0 points");
679 mTreeV0->Branch("V0", "Reve::RecV0", &mpV0, 512*1024,1);
681 TFile f(Form("%s/AliESDs.root", mDataDir.Data()));
683 throw(eH + "no AliESDs.root file.");
686 TTree* tree = (TTree*) f.Get("esdTree");
688 throw(eH + "no esdTree.");
691 tree->SetBranchAddress("ESD", &fEvent);
692 tree->GetEntry(mEvent);
694 for (Int_t n =0; n< fEvent->GetNumberOfV0s(); n++) {
695 AliESDv0* av = fEvent->GetV0(n);
698 mV0.status = av->GetStatus();
699 // Point of closest approach
700 mV0.V_ca.x = av->GetXr(0);
701 mV0.V_ca.y = av->GetXr(1);
702 mV0.V_ca.z = av->GetXr(2);
703 // set birth vertex of neutral particle
705 av->GetXYZ(p[0], p[1], p[2]);
709 // momentum and position of negative particle
710 mV0.P_neg.Set(av->GetPMp());
711 av->GetParamM()->GetXYZ(pos);
714 // momentum and position of positive particle
715 mV0.P_pos.Set(av->GetPPp());
716 av->GetParamP()->GetXYZ(pos);
719 mV0.label = 0; // !!!! mother label unknown
720 mV0.pdg = av->GetPdgCode();
722 mV0.d_label[0] = av->GetLab(0);
723 mV0.d_label[1] = av->GetLab(1);
725 // printf("V0 convert labels(%d,%d) index(%d,%d)\n",
726 // av->GetLab(0), av->GetLab(1),
727 // av->GetIndex(0), av->GetIndex(1));
731 // if(fEvent->GetNumberOfV0MIs()) mTreeV0->BuildIndex("label");
734 /**************************************************************************/
736 void VSDCreator::ConvertKinks()
738 static const Exc_t eH("VSDCreator::ConvertKinks ");
741 throw(eH + "Kinks already converted.");
744 mTreeKK = new TTree("Kinks", "ESD Kinks");
746 mTreeKK->Branch("KK", "Reve::RecKink", &mpKK, fBuffSize);
748 TFile f(Form("%s/AliESDs.root", mDataDir.Data()));
750 throw(eH + "no AliESDs.root file.");
753 TTree* tree = (TTree*) f.Get("esdTree");
755 throw(eH + "no esdTree.");
758 tree->SetBranchAddress("ESD", &fEvent);
759 tree->GetEntry(mEvent);
761 // printf("CONVERT KINK Read %d entries in tree kinks \n", fEvent->GetNumberOfKinks());
762 for (Int_t n =0; n< fEvent->GetNumberOfKinks(); n++) {
763 AliESDkink* kk = fEvent->GetKink(n);
768 mKK.label = kk->GetLabel(0);
769 mKK.status = Int_t(kk->GetStatus(1) << 8 + kk->GetStatus(2));
771 // reconstructed kink position
772 mKK.label_sec = kk->GetLabel(1);
773 mKK.V_kink.Set(kk->GetPosition());
775 const AliExternalTrackParam& tp_mother = kk->RefParamMother();
776 // momentum and position of mother
777 tp_mother.GetPxPyPz(pos);
779 tp_mother.GetXYZ(pos);
781 const Double_t* par = tp_mother.GetParameter();
782 // printf("KINK Pt %f, %f \n",1/tp_mother.Pt(),par[4] );
783 mKK.sign = (par[4] < 0) ? -1 : 1;
785 const AliExternalTrackParam& tp_daughter = kk->RefParamDaughter();
786 // momentum and position of daughter
787 tp_daughter.GetPxPyPz(pos);
789 tp_daughter.GetXYZ(pos);
794 if(fEvent->GetNumberOfKinks()) mTreeKK->BuildIndex("label");
796 /**************************************************************************/
798 /**************************************************************************/
800 void VSDCreator::ConvertGenInfo()
802 static const Exc_t eH("VSDCreator::ConvertGenInfo ");
805 throw(eH + "GI already converted.");
808 mTreeGI = new TTree("GenInfo", "Objects prepared for cross querry");
810 GenInfo::Class()->IgnoreTObjectStreamer(true);
811 mTreeGI->Branch("GI", "Reve::GenInfo", &mpGI, fBuffSize);
812 mTreeGI->Branch("K.", "Reve::MCTrack", &mpK);
813 mTreeGI->Branch("R.", "Reve::RecTrack", &mpR);
815 for(map<Int_t, GenInfo*>::iterator j=mGenInfoMap.begin(); j!=mGenInfoMap.end(); ++j) {
817 mGI.label = j->first;
818 mTreeK->GetEntry(j->first);
821 Int_t re = mTreeR->GetEntryNumberWithIndex(j->first);
825 // Int_t has_v0 = mTreeV0->GetEntryNumberWithIndex(j->first);
827 // mGI.has_V0 = true;
829 Int_t has_kk = mTreeKK->GetEntryNumberWithIndex(j->first);
838 /**************************************************************************/
839 /**************************************************************************/
841 /**************************************************************************/
842 /**************************************************************************/
844 AliTPCParam* VSDCreator::GetTpcParam(const Exc_t& eh)
846 auto_ptr<TFile> fp( TFile::Open(Form("%s/galice.root", mDataDir.Data())) );
848 throw(eh + "can not open 'galice.root' file.");
849 AliTPCParam* par = (AliTPCParam *) fp->Get("75x40_100x60_150x60");
851 throw(eh + "TPC data not found.");
857 GenInfo* VSDCreator::GetGeninfo(Int_t label)
859 // printf("get_geninfo %d\n", label);
861 map<Int_t, GenInfo*>::iterator i = mGenInfoMap.find(label);
862 if(i == mGenInfoMap.end()) {
864 mGenInfoMap[label] = gi;