1 //-----------------------------------------------------//
3 // Source File : PMDDigitization.cxx, Version 00 //
5 // Date : September 20 2002 //
7 //-----------------------------------------------------//
12 #include <TGeometry.h>
13 #include <TObjArray.h>
14 #include <TClonesArray.h>
17 #include <TParticle.h>
22 #include "AliDetector.h"
23 #include "AliRunLoader.h"
24 #include "AliLoader.h"
25 #include "AliConfig.h"
27 #include "AliRunDigitizer.h"
28 #include "AliHeader.h"
30 #include "AliPMDcell.h"
31 #include "AliPMDsdigit.h"
32 #include "AliPMDdigit.h"
33 #include "AliPMDDigitizer.h"
34 #include "AliPMDClustering.h"
36 ClassImp(AliPMDDigitizer)
40 AliPMDDigitizer::AliPMDDigitizer()
42 if (!fSDigits) fSDigits = new TClonesArray("AliPMDsdigit", 1000);
44 if (!fDigits) fDigits = new TClonesArray("AliPMDdigit", 1000);
47 for (Int_t i = 0; i < fTotSM; i++)
49 for (Int_t j = 0; j < fNCell; j++)
51 for (Int_t k = 0; k < fNCell; k++)
59 if (!fCell) fCell = new TObjArray();
61 fZPos = 361.5; // in units of cm, This is the default position of PMD
64 AliPMDDigitizer::~AliPMDDigitizer()
73 void AliPMDDigitizer::OpengAliceFile(Char_t *file, Option_t *option)
76 fRunLoader = AliRunLoader::Open(file,AliConfig::fgkDefaultEventFolderName,
81 Error("Open","Can not open session for file %s.",file);
84 fRunLoader->LoadgAlice();
85 fRunLoader->LoadHeader();
86 fRunLoader->LoadKinematics();
88 gAlice = fRunLoader->GetAliRun();
92 printf("<AliPMDdigitizer::Open> ");
93 printf("AliRun object found on file.\n");
97 printf("<AliPMDdigitizer::Open> ");
98 printf("Could not find AliRun object.\n");
101 PMD = (AliPMD*)gAlice->GetDetector("PMD");
102 pmdloader = fRunLoader->GetLoader("PMDLoader");
103 if (pmdloader == 0x0)
105 cerr<<"Hits2Digits : Can not find PMD or PMDLoader\n";
108 const char *cHS = strstr(option,"HS");
109 const char *cHD = strstr(option,"HD");
110 const char *cSD = strstr(option,"SD");
114 pmdloader->LoadHits("READ");
115 pmdloader->LoadSDigits("recreate");
119 pmdloader->LoadHits("READ");
120 pmdloader->LoadDigits("recreate");
124 pmdloader->LoadSDigits("READ");
125 pmdloader->LoadDigits("recreate");
129 void AliPMDDigitizer::Hits2SDigits(Int_t ievt)
131 cout << " -------- Beginning of Hits2SDigits ----------- " << endl;
144 Float_t xPos, yPos, zPos;
147 Float_t vx = -999.0, vy = -999.0, vz = -999.0;
152 printf("Event Number = %d \n",ievt);
153 Int_t nparticles = fRunLoader->GetHeader()->GetNtrack();
154 printf("Number of Particles = %d \n", nparticles);
155 fRunLoader->GetEvent(ievt);
156 Particles = gAlice->Particles();
157 // ------------------------------------------------------- //
158 // Pointer to specific detector hits.
159 // Get pointers to Alice detectors and Hits containers
161 treeH = pmdloader->TreeH();
163 Int_t ntracks = (Int_t) treeH->GetEntries();
164 printf("Number of Tracks in the TreeH = %d \n", ntracks);
166 treeS = pmdloader->TreeS();
169 pmdloader->MakeTree("S");
170 treeS = pmdloader->TreeS();
172 Int_t bufsize = 16000;
173 treeS->Branch("PMDSDigit", &fSDigits, bufsize);
175 if (PMD) PMDhits = PMD->Hits();
177 // Start loop on tracks in the hits containers
180 for (Int_t track=0; track<ntracks;track++)
183 treeH->GetEvent(track);
187 npmd = PMDhits->GetEntriesFast();
188 for (int ipmd = 0; ipmd < npmd; ipmd++)
190 pmdHit = (AliPMDhit*) PMDhits->UncheckedAt(ipmd);
191 trackno = pmdHit->GetTrack();
193 // get kinematics of the particles
195 particle = gAlice->Particle(trackno);
196 trackpid = particle->GetPdgCode();
204 TParticle* mparticle = particle;
206 while((imo = mparticle->GetFirstMother()) >= 0)
209 mparticle = gAlice->Particle(imo);
210 id_mo = mparticle->GetPdgCode();
212 vx = mparticle->Vx();
213 vy = mparticle->Vy();
214 vz = mparticle->Vz();
216 //printf("==> Mother ID %5d %5d %5d Vertex: %13.3f %13.3f %13.3f\n", igen, imo, id_mo, vx, vy, vz);
217 //fprintf(ftest1,"==> Mother ID %5d %5d %5d Vertex: %13.3f %13.3f %13.3f\n", igen, imo, id_mo, vx, vy, vz);
219 if (id_mo == kGamma && vx == 0. && vy == 0. && vz == 0.)
226 if (id_mo == kPi0 && vx == 0. && vy == 0. && vz == 0.)
240 cellnumber = pmdHit->fVolume[1];
241 smnumber1 = pmdHit->fVolume[4];
242 edep = pmdHit->fEnergy;
244 if (smnumber1 > 3 && smnumber1 <= 6)
246 Int_t ny = (cellnumber-1)/48 + 1;
247 Int_t nx = cellnumber - (ny-1)*48;
250 Int_t ncell1 = (ny1 - 1)* 72 + nx1;
253 smnumber = Convert2RealSMNumber(smnumber1);
254 ypad = (cellnumber - 1)/fNCell + 1;
255 xpad = cellnumber - (ypad-1)*fNCell;
257 //cout << "-zpos = " << -zPos << endl;
264 else if (-zPos > fZPos)
272 fPMD[smnumber-1][xpad-1][ypad-1] += edep;
273 fPMDCounter[smnumber-1][xpad-1][ypad-1]++;
274 Int_t smn = smnumber - 1;
275 Int_t ixx = xpad - 1;
276 Int_t iyy = ypad - 1;
278 pmdcell = new AliPMDcell(mtrackno,smn,ixx,iyy,edep);
284 fCPV[smnumber-1][xpad-1][ypad-1] += edep;
285 fCPVTrackNo[smnumber-1][xpad-1][ypad-1] = mtrackno;
289 } // Track Loop ended
292 TrackAssignment2Cell();
298 Int_t count_digit = 0;
302 for (Int_t idet = 0; idet < 2; idet++)
304 for (Int_t ism = 0; ism < fTotSM; ism++)
306 for (Int_t jrow = 0; jrow < fNCell; jrow++)
308 for (Int_t kcol = 0; kcol < fNCell; kcol++)
310 cellno = jrow + kcol*fNCell;
313 deltaE = fPMD[ism][jrow][kcol];
314 trno = fPMDTrackNo[ism][jrow][kcol];
319 deltaE = fCPV[ism][jrow][kcol];
320 trno = fCPVTrackNo[ism][jrow][kcol];
326 AddSDigit(trno,detno,ism,cellno,deltaE);
334 pmdloader->WriteSDigits("OVERWRITE");
338 // cout << " -------- End of Hits2SDigit ----------- " << endl;
341 void AliPMDDigitizer::Hits2Digits(Int_t ievt)
354 Float_t xPos, yPos, zPos;
357 Float_t vx = -999.0, vy = -999.0, vz = -999.0;
362 printf("Event Number = %d \n",ievt);
364 Int_t nparticles = fRunLoader->GetHeader()->GetNtrack();
365 printf("Number of Particles = %d \n", nparticles);
366 fRunLoader->GetEvent(ievt);
367 Particles = gAlice->Particles();
368 // ------------------------------------------------------- //
369 // Pointer to specific detector hits.
370 // Get pointers to Alice detectors and Hits containers
372 PMD = (AliPMD*)gAlice->GetDetector("PMD");
373 pmdloader = fRunLoader->GetLoader("PMDLoader");
375 if (pmdloader == 0x0)
377 cerr<<"Hits2Digits method : Can not find PMD or PMDLoader\n";
379 treeH = pmdloader->TreeH();
380 Int_t ntracks = (Int_t) treeH->GetEntries();
381 printf("Number of Tracks in the TreeH = %d \n", ntracks);
382 pmdloader->LoadDigits("recreate");
383 treeD = pmdloader->TreeD();
386 pmdloader->MakeTree("D");
387 treeD = pmdloader->TreeD();
389 Int_t bufsize = 16000;
390 treeD->Branch("PMDDigit", &fDigits, bufsize);
392 if (PMD) PMDhits = PMD->Hits();
394 // Start loop on tracks in the hits containers
396 for (Int_t track=0; track<ntracks;track++)
399 treeH->GetEvent(track);
403 npmd = PMDhits->GetEntriesFast();
404 for (int ipmd = 0; ipmd < npmd; ipmd++)
406 pmdHit = (AliPMDhit*) PMDhits->UncheckedAt(ipmd);
407 trackno = pmdHit->GetTrack();
409 // get kinematics of the particles
411 particle = gAlice->Particle(trackno);
412 trackpid = particle->GetPdgCode();
420 TParticle* mparticle = particle;
422 while((imo = mparticle->GetFirstMother()) >= 0)
425 mparticle = gAlice->Particle(imo);
426 id_mo = mparticle->GetPdgCode();
428 vx = mparticle->Vx();
429 vy = mparticle->Vy();
430 vz = mparticle->Vz();
432 //printf("==> Mother ID %5d %5d %5d Vertex: %13.3f %13.3f %13.3f\n", igen, imo, id_mo, vx, vy, vz);
433 //fprintf(ftest1,"==> Mother ID %5d %5d %5d Vertex: %13.3f %13.3f %13.3f\n", igen, imo, id_mo, vx, vy, vz);
435 if (id_mo == kGamma && vx == 0. && vy == 0. && vz == 0.)
442 if (id_mo == kPi0 && vx == 0. && vy == 0. && vz == 0.)
456 cellnumber = pmdHit->fVolume[1];
457 smnumber1 = pmdHit->fVolume[4];
458 edep = pmdHit->fEnergy;
460 if (smnumber1 > 3 && smnumber1 <= 6)
462 Int_t ny = (cellnumber-1)/48 + 1;
463 Int_t nx = cellnumber - (ny-1)*48;
466 Int_t ncell1 = (ny1 - 1)* 72 + nx1;
470 smnumber = Convert2RealSMNumber(smnumber1);
471 ypad = (cellnumber - 1)/fNCell + 1;
472 xpad = cellnumber - (ypad-1)*fNCell;
474 //cout << "-zpos = " << -zPos << endl;
480 else if (-zPos > fZPos)
488 fCPV[smnumber-1][xpad-1][ypad-1] += edep;
490 else if (fDetNo == 0)
492 fPMD[smnumber-1][xpad-1][ypad-1] += edep;
493 fPMDCounter[smnumber-1][xpad-1][ypad-1]++;
497 } // Track Loop ended
499 TrackAssignment2Cell();
504 Int_t count_digit = 0;
508 for (Int_t idet = 0; idet < 2; idet++)
510 for (Int_t ism = 0; ism < fTotSM; ism++)
512 for (Int_t jrow = 0; jrow < fNCell; jrow++)
514 for (Int_t kcol = 0; kcol < fNCell; kcol++)
516 cellno = jrow + kcol*fNCell;
519 deltaE = fPMD[ism][jrow][kcol];
524 deltaE = fCPV[ism][jrow][kcol];
530 AddDigit(trno,detno,ism,cellno,deltaE);
534 } // supermodule loop
539 pmdloader->WriteDigits("OVERWRITE");
543 // cout << " -------- End of Hits2Digit ----------- " << endl;
547 void AliPMDDigitizer::SDigits2Digits(Int_t ievt)
549 // cout << " -------- Beginning of SDigits2Digit ----------- " << endl;
550 fRunLoader->GetEvent(ievt);
552 treeS = pmdloader->TreeS();
553 AliPMDsdigit *pmdsdigit;
554 TBranch *branch = treeS->GetBranch("PMDSDigit");
555 branch->SetAddress(&fSDigits);
557 treeD = pmdloader->TreeD();
560 pmdloader->MakeTree("D");
561 treeD = pmdloader->TreeD();
563 Int_t bufsize = 16000;
564 treeD->Branch("PMDDigit", &fDigits, bufsize);
566 Int_t trno, det, smn;
570 Int_t nmodules = (Int_t) treeS->GetEntries();
572 for (Int_t imodule = 0; imodule < nmodules; imodule++)
574 treeS->GetEntry(imodule);
575 Int_t nentries = fSDigits->GetLast();
576 //cout << " nentries = " << nentries << endl;
577 for (Int_t ient = 0; ient < nentries+1; ient++)
579 pmdsdigit = (AliPMDsdigit*)fSDigits->UncheckedAt(ient);
580 trno = pmdsdigit->GetTrackNumber();
581 det = pmdsdigit->GetDetector();
582 smn = pmdsdigit->GetSMNumber();
583 cellno = pmdsdigit->GetCellNumber();
584 edep = pmdsdigit->GetCellEdep();
588 AddDigit(trno,det,smn,cellno,adc);
593 pmdloader->WriteDigits("OVERWRITE");
594 // cout << " -------- End of SDigits2Digit ----------- " << endl;
597 void AliPMDDigitizer::TrackAssignment2Cell()
599 // To be checked again
601 // This blocks assign the cell id when there is
602 // multiple tracks in a cell according to the
614 PMDTrack = new Int_t ***[27];
615 PMDEdep = new Float_t ***[27];
616 for (i=0; i<fTotSM; i++)
618 PMDTrack[i] = new Int_t **[72];
619 PMDEdep[i] = new Float_t **[72];
622 for (i = 0; i < fTotSM; i++)
624 for (j = 0; j < fNCell; j++)
626 PMDTrack[i][j] = new Int_t *[72];
627 PMDEdep[i][j] = new Float_t *[72];
631 for (i = 0; i < fTotSM; i++)
633 for (j = 0; j < fNCell; j++)
635 for (k = 0; k < fNCell; k++)
637 Int_t nn = fPMDCounter[i][j][k];
640 PMDTrack[i][j][k] = new Int_t[nn];
641 PMDEdep[i][j][k] = new Float_t[nn];
646 PMDTrack[i][j][k] = new Int_t[nn];
647 PMDEdep[i][j][k] = new Float_t[nn];
649 fPMDCounter[i][j][k] = 0;
655 Int_t nentries = fCell->GetEntries();
657 Int_t mtrackno, ism, ixp, iyp;
660 for (i = 0; i < nentries; i++)
662 pmdcell = (AliPMDcell*)fCell->UncheckedAt(i);
664 mtrackno = pmdcell->GetTrackNumber();
665 ism = pmdcell->GetSMNumber();
666 ixp = pmdcell->GetX();
667 iyp = pmdcell->GetY();
668 edep = pmdcell->GetEdep();
670 Int_t nn = fPMDCounter[ism][ixp][iyp];
672 // cout << " nn = " << nn << endl;
674 PMDTrack[ism][ixp][iyp][nn] = (Int_t) mtrackno;
675 PMDEdep[ism][ixp][iyp][nn] = edep;
676 fPMDCounter[ism][ixp][iyp]++;
683 for (im=0; im<27; im++)
685 for (ix=0; ix<72; ix++)
687 for (iy=0; iy<72; iy++)
689 nn = fPMDCounter[im][ix][iy];
692 // This block handles if a cell is fired
693 // many times by many tracks
695 status = new Int_t[nn];
696 for (iz = 0; iz < nn; iz++)
698 status[iz] = PMDTrack[im][ix][iy][iz];
700 sort(status,status+nn);
701 Int_t track_old = -99999;
702 Int_t track, tr_count = 0;
703 for (iz = 0; iz < nn; iz++)
706 if (track_old != track)
709 vjunkTRN.push_back(track);
714 Float_t tot_edp = 0.;
715 tr_edp = new Float_t[tr_count];
716 frac_edp = new Float_t[tr_count];
717 for (il = 0; il < tr_count; il++)
720 track = vjunkTRN[il];
721 for (iz = 0; iz < nn; iz++)
723 if (track == PMDTrack[im][ix][iy][iz])
725 tr_edp[il] += PMDEdep[im][ix][iy][iz];
728 tot_edp += tr_edp[il];
732 Float_t frac_old = 0.;
734 for (il = 0; il < tr_count; il++)
736 frac_edp[il] = tr_edp[il]/tot_edp;
737 if (frac_old < frac_edp[il])
739 frac_old = frac_edp[il];
746 fPMDTrackNo[im][ix][iy] = vjunkTRN[il_old];
750 // This only handles if a cell is fired
753 fPMDTrackNo[im][ix][iy] = PMDTrack[im][ix][iy][0];
758 // This is if no cell is fired
759 fPMDTrackNo[im][ix][iy] = -999;
765 // Delete all the pointers
767 for (i = 0; i < fTotSM; i++)
769 for (j = 0; j < fNCell; j++)
771 for (k = 0; k < fNCell; k++)
773 delete [] PMDTrack[i][j][k];
774 delete [] PMDEdep[i][j][k];
779 for (i = 0; i < fTotSM; i++)
781 for (j = 0; j < fNCell; j++)
783 delete [] PMDTrack[i][j];
784 delete [] PMDEdep[i][j];
788 for (i = 0; i < fTotSM; i++)
790 delete [] PMDTrack[i];
791 delete [] PMDEdep[i];
796 // End of the cell id assignment
801 void AliPMDDigitizer::MeV2ADC(Float_t mev, Float_t & adc)
807 void AliPMDDigitizer::AddSDigit(Int_t trnumber, Int_t det, Int_t smnumber,
808 Int_t cellnumber, Float_t adc)
810 TClonesArray &lsdigits = *fSDigits;
811 AliPMDsdigit *newcell;
812 newcell = new AliPMDsdigit(trnumber,det,smnumber,cellnumber,adc);
813 new(lsdigits[fNsdigit++]) AliPMDsdigit(newcell);
817 void AliPMDDigitizer::AddDigit(Int_t trnumber, Int_t det, Int_t smnumber,
818 Int_t cellnumber, Float_t adc)
820 TClonesArray &ldigits = *fDigits;
821 AliPMDdigit *newcell;
822 newcell = new AliPMDdigit(trnumber,det,smnumber,cellnumber,adc);
823 new(ldigits[fNdigit++]) AliPMDdigit(newcell);
827 Int_t AliPMDDigitizer::Convert2RealSMNumber(Int_t smnumber1)
829 Int_t smnumber = -999;
831 if (smnumber1==1) smnumber = 1;
832 if (smnumber1==2) smnumber = 10;
833 if (smnumber1==3) smnumber = 19;
834 if (smnumber1==4) smnumber = 1;
835 if (smnumber1==5) smnumber = 10;
836 if (smnumber1==6) smnumber = 19;
837 if (smnumber1==7) smnumber = 2;
838 if (smnumber1==8) smnumber = 3;
839 if (smnumber1==9) smnumber = 4;
840 if (smnumber1==10) smnumber = 5;
841 if (smnumber1==11) smnumber = 6;
842 if (smnumber1==12) smnumber = 7;
843 if (smnumber1==13) smnumber = 8;
844 if (smnumber1==14) smnumber = 9;
845 if (smnumber1==15) smnumber = 11;
846 if (smnumber1==16) smnumber = 12;
847 if (smnumber1==17) smnumber = 13;
848 if (smnumber1==18) smnumber = 14;
849 if (smnumber1==19) smnumber = 15;
850 if (smnumber1==20) smnumber = 16;
851 if (smnumber1==21) smnumber = 17;
852 if (smnumber1==22) smnumber = 18;
853 if (smnumber1==23) smnumber = 20;
854 if (smnumber1==24) smnumber = 21;
855 if (smnumber1==25) smnumber = 22;
856 if (smnumber1==26) smnumber = 23;
857 if (smnumber1==27) smnumber = 24;
858 if (smnumber1==28) smnumber = 25;
859 if (smnumber1==29) smnumber = 26;
860 if (smnumber1==30) smnumber = 27;
864 void AliPMDDigitizer::SetZPosition(Float_t zpos)
868 Float_t AliPMDDigitizer::GetZPosition() const
873 void AliPMDDigitizer::ResetCell()
876 for (Int_t i = 0; i < fTotSM; i++)
878 for (Int_t j = 0; j < fNCell; j++)
880 for (Int_t k = 0; k < fNCell; k++)
882 fPMDCounter[i][j][k] = 0;
887 void AliPMDDigitizer::ResetSDigit()
890 if (fSDigits) fSDigits->Clear();
892 void AliPMDDigitizer::ResetDigit()
895 if (fDigits) fDigits->Clear();
898 void AliPMDDigitizer::ResetCellADC()
900 for (Int_t i = 0; i < fTotSM; i++)
902 for (Int_t j = 0; j < fNCell; j++)
904 for (Int_t k = 0; k < fNCell; k++)
913 void AliPMDDigitizer::UnLoad(Option_t *option)
915 const char *cS = strstr(option,"S");
916 const char *cD = strstr(option,"D");
918 fRunLoader->UnloadgAlice();
919 fRunLoader->UnloadHeader();
920 fRunLoader->UnloadKinematics();
924 pmdloader->UnloadHits();
928 pmdloader->UnloadHits();
929 pmdloader->UnloadSDigits();