1 /**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 /// This class provides ITS SSD data handling
22 // Author: Oleksandr Borysov
24 ///////////////////////////////////////////////////////////////////////////////
26 #include <Riostream.h>
27 #include "AliITSHandleDaSSD.h"
33 #include "TObjArray.h"
35 #include "AliITSNoiseSSD.h"
36 #include "AliITSPedestalSSD.h"
37 #include "AliITSBadChannelsSSD.h"
38 #include "AliITSRawStreamSSD.h"
39 #include "AliRawReaderDate.h"
40 #include "AliITSRawStreamSSD.h"
41 #include "AliITSChannelDaSSD.h"
44 ClassImp(AliITSHandleDaSSD)
49 const Int_t AliITSHandleDaSSD::fgkNumberOfSSDModules = 1698; // Number of SSD modules in ITS
50 const Int_t AliITSHandleDaSSD::fgkNumberOfSSDModulesPerDdl = 108; // Number of SSD modules in DDL
51 const Int_t AliITSHandleDaSSD::fgkNumberOfSSDModulesPerSlot = 12; // Number of SSD modules in Slot
52 const Int_t AliITSHandleDaSSD::fgkNumberOfSSDDDLs = 16; // Number of SSD modules in Slot
53 const Float_t AliITSHandleDaSSD::fgkPedestalThresholdFactor = 3.0; // Defalt value for fPedestalThresholdFactor
54 const Float_t AliITSHandleDaSSD::fgkCmThresholdFactor = 3.0; // Defalt value for fCmThresholdFactor
56 //______________________________________________________________________________
57 AliITSHandleDaSSD::AliITSHandleDaSSD() :
58 fRawDataFileName(NULL),
65 fStaticBadChannelsMap(NULL),
69 fPedestalThresholdFactor(fgkPedestalThresholdFactor),
70 fCmThresholdFactor(fgkCmThresholdFactor)
72 // Default constructor
76 //______________________________________________________________________________
77 AliITSHandleDaSSD::AliITSHandleDaSSD(Char_t *rdfname) :
78 fRawDataFileName(NULL),
85 fStaticBadChannelsMap(NULL),
89 fPedestalThresholdFactor(fgkPedestalThresholdFactor) ,
90 fCmThresholdFactor(fgkCmThresholdFactor)
92 if (!Init(rdfname)) AliError("AliITSHandleDaSSD::AliITSHandleDaSSD() initialization error!");
96 //______________________________________________________________________________
97 AliITSHandleDaSSD::AliITSHandleDaSSD(const AliITSHandleDaSSD& ssdadldc) :
99 fRawDataFileName(ssdadldc.fRawDataFileName),
100 fNumberOfModules(ssdadldc.fNumberOfModules),
102 fModIndProcessed(ssdadldc.fModIndProcessed),
103 fModIndRead(ssdadldc.fModIndRead),
105 fNumberOfEvents(ssdadldc.fNumberOfEvents),
106 fStaticBadChannelsMap(ssdadldc.fStaticBadChannelsMap),
107 fDDLModuleMap(ssdadldc.fDDLModuleMap),
108 fLdcId(ssdadldc.fLdcId),
109 fRunId(ssdadldc.fRunId),
110 fPedestalThresholdFactor(ssdadldc.fPedestalThresholdFactor),
111 fCmThresholdFactor(ssdadldc.fCmThresholdFactor)
114 if ((ssdadldc.fNumberOfModules > 0) && (ssdadldc.fModules)) {
115 fModules = new (nothrow) AliITSModuleDaSSD* [ssdadldc.fNumberOfModules];
117 for (Int_t modind = 0; modind < ssdadldc.fNumberOfModules; modind++) {
118 if (ssdadldc.fModules[modind]) {
119 fModules[modind] = new AliITSModuleDaSSD(*(ssdadldc.fModules[modind]));
120 if (!fModules[modind]) {
121 AliError("AliITSHandleDaSSD: Error copy constructor");
122 for (Int_t i = (modind - 1); i >= 0; i--) delete fModules[modind];
127 } else fModules[modind] = NULL;
130 AliError(Form("AliITSHandleDaSSD: Error allocating memory for %i AliITSModulesDaSSD* objects!", ssdadldc.fNumberOfModules));
131 fNumberOfModules = 0;
138 //______________________________________________________________________________
139 AliITSHandleDaSSD& AliITSHandleDaSSD::operator = (const AliITSHandleDaSSD& ssdadldc)
141 // assignment operator
142 if (this == &ssdadldc) return *this;
144 for (Int_t i = 0; i < fNumberOfModules; i++) if (fModules[i]) delete fModules[i];
148 if (fModIndex) { delete [] fModIndex; fModIndex = NULL; }
149 if ((ssdadldc.fNumberOfModules > 0) && (ssdadldc.fModules)) {
150 fModules = new (nothrow) AliITSModuleDaSSD* [ssdadldc.fNumberOfModules];
152 for (Int_t modind = 0; modind < ssdadldc.fNumberOfModules; modind++) {
153 if (ssdadldc.fModules[modind]) {
154 fModules[modind] = new AliITSModuleDaSSD(*(ssdadldc.fModules[modind]));
155 if (!fModules[modind]) {
156 AliError("AliITSHandleDaSSD: Error assignment operator");
157 for (Int_t i = (modind - 1); i >= 0; i--) delete fModules[modind];
162 } else fModules[modind] = NULL;
165 AliError(Form("AliITSHandleDaSSD: Error allocating memory for %i AliITSModulesDaSSD* objects!", ssdadldc.fNumberOfModules));
166 fNumberOfModules = 0;
174 //______________________________________________________________________________
175 AliITSHandleDaSSD::~AliITSHandleDaSSD()
177 // Default destructor
180 for (Int_t i = 0; i < fNumberOfModules; i++)
182 if (fModules[i]) delete fModules[i];
186 if (fModIndex) delete [] fModIndex;
187 if (fStaticBadChannelsMap) { fStaticBadChannelsMap->Delete(); delete fStaticBadChannelsMap; }
188 if (fDDLModuleMap) delete [] fDDLModuleMap;
193 //______________________________________________________________________________
194 void AliITSHandleDaSSD::Reset()
196 // Delete array of AliITSModuleDaSSD* objects.
198 for (Int_t i = 0; i < fNumberOfModules; i++) if (fModules[i]) delete fModules[i];
202 if (fModIndex) { delete [] fModIndex; fModIndex = NULL; }
204 if (fStaticBadChannelsMap) {
205 fStaticBadChannelsMap->Delete();
206 delete fStaticBadChannelsMap;
207 fStaticBadChannelsMap = NULL;
209 if (fDDLModuleMap) { delete [] fDDLModuleMap; fDDLModuleMap = NULL; }
211 fRawDataFileName = NULL;
212 fModIndProcessed = fModIndRead = 0;
215 fPedestalThresholdFactor = fgkPedestalThresholdFactor;
216 fCmThresholdFactor = fgkCmThresholdFactor;
221 //______________________________________________________________________________
222 Bool_t AliITSHandleDaSSD::Init(Char_t *rdfname, const Char_t *configfname)
224 // Read raw data file and set initial and configuration parameters
225 Long_t physeventind = 0, strn = 0, nofstripsev, nofstrips = 0;
226 Int_t nofeqipmentev, nofeqipment = 0, eqn = 0;
227 AliRawReaderDate *rawreaderdate = NULL;
228 UChar_t *data = NULL;
229 Long_t datasize = 0, eqbelsize = 1;
231 if (configfname) ReadConfigurationFile(configfname);
232 rawreaderdate = new AliRawReaderDate(rdfname, 0);
233 if (!(rawreaderdate->GetAttributes() || rawreaderdate->GetEventId())) {
234 AliError(Form("AliITSHandleDaSSD: Error reading raw data file %s by RawReaderDate", rdfname));
238 if (rawreaderdate->NextEvent()) {
239 fRunId = rawreaderdate->GetRunNumber();
240 rawreaderdate->RewindEvents();
241 } else { MakeZombie(); return kFALSE; }
242 if (fModules) Reset();
243 rawreaderdate->SelectEvents(-1);
244 rawreaderdate->Select("ITSSSD");
246 while (rawreaderdate->NextEvent()) {
247 if ((rawreaderdate->GetType() != PHYSICS_EVENT) && (rawreaderdate->GetType() != CALIBRATION_EVENT)) continue;
250 while (rawreaderdate->ReadNextData(data)) {
251 fLdcId = rawreaderdate->GetLDCId();
253 datasize = rawreaderdate->GetDataSize();
254 eqbelsize = rawreaderdate->GetEquipmentElementSize();
255 if ( datasize % eqbelsize ) {
256 AliError(Form("AliITSHandleDaSSD: Error Init(%s): event data size %i is not an integer of equipment data size %i",
257 rdfname, datasize, eqbelsize));
261 nofstripsev += (Int_t) (datasize / eqbelsize);
263 if (physeventind++) {
264 if (nofstrips != nofstripsev) AliWarning(Form("AliITSHandleDaSSD: number of strips varies from event to event, ev = %i, %i",
265 physeventind, nofstripsev));
266 if (nofeqipment != nofeqipmentev) AliWarning("AliITSHandleDaSSD: number of DDLs varies from event to event");
268 nofstrips = nofstripsev;
269 nofeqipment = nofeqipmentev;
270 if (strn < nofstrips) strn = nofstrips;
271 if (eqn < nofeqipment) eqn = nofeqipment;
273 delete rawreaderdate;
274 if ((physeventind > 0) && (strn > 0))
276 fNumberOfEvents = physeventind;
277 fRawDataFileName = rdfname;
278 fModIndex = new (nothrow) Int_t [fgkNumberOfSSDModulesPerDdl * eqn];
280 for (Int_t i = 0; i < fgkNumberOfSSDModulesPerDdl * eqn; i++) fModIndex[i] = -1;
281 else AliWarning(Form("AliITSHandleDaSSD: Error Init(%s): Index array for %i modules was not created",
282 rdfname, fgkNumberOfSSDModulesPerDdl * eqn));
283 if (SetNumberOfModules(fgkNumberOfSSDModulesPerDdl * eqn)) {
284 TString str = TString::Format("Max number of equipment: %i, max number of channels: %i\n", eqn, strn);
285 DumpInitData(str.Data());
294 //______________________________________________________________________________
295 Bool_t AliITSHandleDaSSD::ReadConfigurationFile(const Char_t * /* configfname */)
297 // Dowload configuration parameters from configuration file or database
303 //______________________________________________________________________________
304 AliITSModuleDaSSD* AliITSHandleDaSSD::GetModule (const UChar_t ddlID, const UChar_t ad, const UChar_t adc) const
306 // Retrieve AliITSModuleDaSSD object from the array
307 if (!fModules) return NULL;
308 for (Int_t i = 0; i < fNumberOfModules; i++) {
310 if ( (fModules[i]->GetDdlId() == ddlID)
311 && (fModules[i]->GetAD() == ad)
312 && (fModules[i]->GetADC() == adc))
320 Int_t AliITSHandleDaSSD::GetModuleIndex (const UChar_t ddlID, const UChar_t ad, const UChar_t adc) const
322 // Retrieve the position of AliITSModuleDaSSD object in the array
323 if (!fModules) return -1;
324 for (Int_t i = 0; i < fNumberOfModules; i++) {
326 if ( (fModules[i]->GetDdlId() == ddlID)
327 && (fModules[i]->GetAD() == ad)
328 && (fModules[i]->GetADC() == adc))
337 //______________________________________________________________________________
338 AliITSChannelDaSSD* AliITSHandleDaSSD::GetStrip (const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const UShort_t stripID) const
340 // Retrieve AliITSChannalDaSSD object from the array
341 for (Int_t modind = 0; modind < fNumberOfModules; modind++) {
342 if ( (fModules[modind]->GetDdlId() == ddlID)
343 && (fModules[modind]->GetAD() == ad)
344 && (fModules[modind]->GetADC() == adc) )
346 return fModules[modind]->GetStrip(stripID);
349 AliError(Form("AliITSHandleDaSSD: Error GetStrip (%i, %i, %i, %i), strip not found, returns NULL!",
350 ddlID, ad, adc, stripID));
356 //______________________________________________________________________________
357 Bool_t AliITSHandleDaSSD::SetModule(AliITSModuleDaSSD *const module, const Int_t index)
359 // Assign array element with AliITSModuleDaSSD object
360 if ((index < fNumberOfModules) && (index >= 0))
362 if (fModules[index]) delete fModules[index];
363 fModules[index] = module;
371 //______________________________________________________________________________
372 Bool_t AliITSHandleDaSSD::SetNumberOfModules (const Int_t numberofmodules)
374 // Allocates memory for AliITSModuleDaSSD objects
375 if (numberofmodules > fgkNumberOfSSDModules)
376 AliWarning(Form("AliITSHandleDaSSD: the number of modules %i you use exceeds the maximum %i for ALICE ITS SSD",
377 numberofmodules, fgkNumberOfSSDModules));
379 for (Int_t i = 0; i < fNumberOfModules; i++) if (fModules[i]) delete fModules[i];
383 fModules = new (nothrow) AliITSModuleDaSSD* [numberofmodules];
385 fNumberOfModules = numberofmodules;
386 memset(fModules, 0, sizeof(AliITSModuleDaSSD*) * numberofmodules);
389 AliError(Form("AliITSHandleDaSSD: Error allocating memory for %i AliITSModulesDaSSD* objects!", numberofmodules));
390 fNumberOfModules = 0;
398 //______________________________________________________________________________
399 Bool_t AliITSHandleDaSSD::ReadStaticBadChannelsMap(const Char_t *filename)
401 // Reads Static Bad Channels Map from the file
404 AliWarning("No file name is specified for Static Bad Channels Map!");
407 bcfile = new TFile(filename, "READ");
408 if (bcfile->IsZombie()) {
409 AliWarning(Form("Error reading file %s with Static Bad Channels Map!", filename));
412 bcfile->GetObject("BadChannels;1", fStaticBadChannelsMap);
413 if (!fStaticBadChannelsMap) {
414 AliWarning("Error fStaticBadChannelsMap == NULL!");
426 Bool_t AliITSHandleDaSSD::ReadDDLModuleMap(const Char_t *filename)
428 // Reads the SSD DDL Map from the file
430 AliRawReaderDate *rwr = NULL;
431 AliITSRawStreamSSD *rsm = NULL;
433 if (fDDLModuleMap) { delete [] fDDLModuleMap; fDDLModuleMap = NULL;}
434 fDDLModuleMap = new (nothrow) Int_t [fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl];
435 if (!fDDLModuleMap) {
436 AliWarning("Error allocation memory for DDL Map!");
440 AliWarning("No file name is specified for SSD DDL Map, using the one from AliITSRawStreamSSD!");
441 rwr = new AliRawReaderDate(event);
442 rsm = new AliITSRawStreamSSD(rwr);
443 rsm->Setv11HybridDDLMapping();
444 for (Int_t ddli = 0; ddli < fgkNumberOfSSDDDLs; ddli++)
445 for (Int_t mi = 0; mi < fgkNumberOfSSDModulesPerDdl; mi++)
446 fDDLModuleMap[(ddli * fgkNumberOfSSDModulesPerDdl + mi)] = rsm->GetModuleNumber(ddli, mi);
451 ddlmfile.open(filename, ios::in);
452 if (!ddlmfile.is_open()) {
453 AliWarning(Form("Error reading file %s with SSD DDL Map!", filename));
454 if (fDDLModuleMap) { delete [] fDDLModuleMap; fDDLModuleMap = NULL;}
458 while((!ddlmfile.eof()) && (ind < (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl))) {
459 ddlmfile >> fDDLModuleMap[ind++];
461 if (ind != (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl))
462 AliWarning(Form("Only %i (< %i) entries were read from DDL Map!", ind, (fgkNumberOfSSDDDLs * fgkNumberOfSSDModulesPerDdl)));
469 //______________________________________________________________________________
470 Int_t AliITSHandleDaSSD::ReadCalibrationDataFile (char* fileName, const Long_t eventsnumber)
472 // Reads raw data from file
473 if (!Init(fileName)){
474 AliError("AliITSHandleDaSSD: Error ReadCalibrationDataFile");
477 fNumberOfEvents = eventsnumber;
478 return ReadModuleRawData (fNumberOfModules);
483 //______________________________________________________________________________
484 Int_t AliITSHandleDaSSD::ReadModuleRawData (const Int_t modulesnumber)
486 // Reads raw data from file
487 AliRawReader *rawreaderdate = NULL;
488 AliITSRawStreamSSD *stream = NULL;
489 AliITSModuleDaSSD *module;
490 AliITSChannelDaSSD *strip;
492 Int_t nofeqipmentev, equipid, prequipid;
494 if (!(rawreaderdate = new AliRawReaderDate(fRawDataFileName, 0))) return 0;
496 AliError("AliITSHandleDaSSD: Error ReadModuleRawData: no structure was allocated for data");
499 if (!fDDLModuleMap) if (!ReadDDLModuleMap()) AliWarning("DDL map is not defined, ModuleID will be set to 0!");
500 stream = new AliITSRawStreamSSD(rawreaderdate);
501 stream->Setv11HybridDDLMapping();
502 rawreaderdate->SelectEvents(-1);
504 while (rawreaderdate->NextEvent()) {
505 if ((rawreaderdate->GetType() != PHYSICS_EVENT) && (rawreaderdate->GetType() != CALIBRATION_EVENT)) continue;
508 while (stream->Next()) {
509 equipid = rawreaderdate->GetEquipmentId();
510 if ((equipid != prequipid) && (prequipid >= 0)) nofeqipmentev += 1;
512 Int_t equiptype = rawreaderdate->GetEquipmentType();
513 UChar_t ddlID = (UChar_t)rawreaderdate->GetDDLID();
514 UChar_t ad = stream->GetAD();
515 UChar_t adc = stream->GetADC();
516 UShort_t stripID = stream->GetSideFlag() ? AliITSChannelDaSSD::GetMaxStripIdConst() - stream->GetStrip() : stream->GetStrip();
517 Short_t signal = stream->GetSignal();
519 Int_t indpos = (nofeqipmentev * fgkNumberOfSSDModulesPerDdl)
520 + ((ad - 1) * fgkNumberOfSSDModulesPerSlot) + (adc < 6 ? adc : (adc - 2));
521 Int_t modpos = fModIndex[indpos];
522 if (((modpos > 0) && (modpos < fModIndRead)) || ((modpos < 0) && (modind == modulesnumber))) continue;
523 if ((modpos < 0) && (modind < modulesnumber)) {
524 module = new AliITSModuleDaSSD(AliITSModuleDaSSD::GetStripsPerModuleConst());
526 if (fDDLModuleMap) mddli = RetrieveModuleId(ddlID, ad, adc);
528 if (!module->SetModuleIdData (ddlID, ad, adc, mddli)) return 0;
529 // if (!module->SetModuleIdData (ddlID, ad, adc, RetrieveModuleId(ddlID, ad, adc))) return 0;
530 module->SetModuleRorcId (equipid, equiptype);
531 module->SetCMFeromEventsNumber(fNumberOfEvents);
532 modpos = fModIndRead + modind;
534 fModules[modpos] = module;
535 fModIndex[indpos] = modpos;
537 if (stripID < AliITSModuleDaSSD::GetStripsPerModuleConst()) {
538 if (!(strip = fModules[modpos]->GetStrip(stripID))) {
539 strip = new AliITSChannelDaSSD(stripID, fNumberOfEvents);
540 fModules[modpos]->SetStrip(strip, stripID);
542 strip->SetSignal(eventind, signal);
543 } else fModules[modpos]->SetCMFerom(signal, (stripID - AliITSModuleDaSSD::GetStripsPerModuleConst()), eventind);
545 if (++eventind > fNumberOfEvents) break;
548 delete rawreaderdate;
549 if (modind) cout << "The memory was allocated for " << modind << " modules." << endl;
550 fModIndRead += modind;
551 if (modind < modulesnumber) RelocateModules();
557 //______________________________________________________________________________
558 Bool_t AliITSHandleDaSSD::RelocateModules()
560 // Relocate memory for AliITSModuleDaSSD object array
562 AliITSModuleDaSSD **marray = NULL;
563 for (Int_t modind = 0; modind < fNumberOfModules; modind++)
564 if (fModules[modind]) nm += 1;
565 if (nm == fNumberOfModules) return kTRUE;
566 marray = new (nothrow) AliITSModuleDaSSD* [nm];
568 AliError(Form("AliITSHandleDaSSD: Error relocating memory for %i AliITSModuleDaSSD* objects!", nm));
572 for (Int_t modind = 0; modind < fNumberOfModules; modind++)
573 if (fModules[modind]) marray[nm++] = fModules[modind];
576 fNumberOfModules = fModIndRead = nm;
582 //______________________________________________________________________________
583 Bool_t AliITSHandleDaSSD::AddFeromCm(AliITSModuleDaSSD *const module)
584 // Restore the original signal value adding CM calculated and subtracted in ferom
586 AliITSChannelDaSSD *strip;
587 Short_t *signal, *cmferom;
589 if (!module) return kFALSE;
590 for (Int_t chipind = 0; chipind < AliITSModuleDaSSD::GetChipsPerModuleConst(); chipind++) {
591 if (!(cmferom = module->GetCMFerom(chipind))) {
592 AliWarning(Form("AliITSHandleDaSSD: There is no Ferom CM values for chip %i, module %i!", chipind, module->GetModuleId()));
595 for (Int_t strind = (chipind * AliITSModuleDaSSD::GetStripsPerChip());
596 strind < ((chipind + 1) * AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
597 if (!(strip = module->GetStrip(strind))) continue;
598 if (!(signal = strip->GetSignal())) continue;
599 // if (strip->GetEventsNumber() != module->GetEventsNumber()) return kFALSE;
601 for (Long_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
602 if (SignalOutOfRange(signal[ev]) || SignalOutOfRange(cmferom[ev])) ovev += 1;
604 Short_t signal1 = signal[ev] + cmferom[ev];
605 strip->SetSignal(ev, signal1);
615 //______________________________________________________________________________
616 Bool_t AliITSHandleDaSSD::CalculatePedestal(AliITSModuleDaSSD *const module)
618 // Calculates Pedestal
619 AliITSChannelDaSSD *strip;
620 Float_t pedestal, noise;
623 if (!module) return kFALSE;
624 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
625 if (!(strip = module->GetStrip(strind))) continue;
626 if (!(signal = strip->GetSignal())) {
627 AliError(Form("AliITSHandleDaSSD: Error CalculatePedestal(): there are no events data for module[%i] strip[%i]->GetSignal()",
628 module->GetModuleId(), strind));
631 //************* pedestal first pass ****************
634 for (ev = 0; ev < strip->GetEventsNumber(); ev++)
635 if (SignalOutOfRange(signal[ev])) ovev += 1;
636 else pedestal = ((ev - ovev)) ? pedestal + (signal[ev] - pedestal) / static_cast<Float_t>(ev - ovev + 1) : signal[ev];
637 if (ev == ovev) pedestal = AliITSChannelDaSSD::GetUndefinedValue();
638 strip->SetPedestal(pedestal);
639 //************* noise *******************************
640 Double_t nsum = 0.0L;
642 for (ev = 0; ev < strip->GetEventsNumber(); ev++) {
643 if (SignalOutOfRange(signal[ev])) ovev += 1;
644 else nsum += pow((signal[ev] - strip->GetPedestal()), 2);
646 if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
647 else noise = AliITSChannelDaSSD::GetUndefinedValue();
648 strip->SetNoise(noise);
649 //************* pedestal second pass ****************
652 for (ev = 0; ev < strip->GetEventsNumber(); ev++)
653 if ( SignalOutOfRange(signal[ev])
654 || TMath::Abs(signal[ev] - strip->GetPedestal()) > (fPedestalThresholdFactor * strip->GetNoise())) ovev += 1;
655 else pedestal = ((ev - ovev)) ? pedestal + (signal[ev] - pedestal) / static_cast<Float_t>(ev - ovev + 1) : signal[ev];
656 if (ev == ovev) pedestal = AliITSChannelDaSSD::GetUndefinedValue();
657 strip->SetPedestal(pedestal);
658 strip->SetOverflowNumber(ovev);
664 //______________________________________________________________________________
665 Bool_t AliITSHandleDaSSD::CalculateNoise(AliITSModuleDaSSD *const module)
668 AliITSChannelDaSSD *strip;
672 if (!module) return kFALSE;
673 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
674 if (!(strip = module->GetStrip(strind))) continue;
675 if (!(signal = strip->GetSignal())) {
676 strip->SetNoise(AliITSChannelDaSSD::GetUndefinedValue());
677 AliError(Form("AliITSHandleDaSSD: Error CalculateNoise(): there are no events data for module[%i] strip[%i]->GetSignal()",
678 module->GetModuleId(), strind));
681 Double_t nsum = 0.0L;
683 for (Long_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
684 if (SignalOutOfRange(signal[ev])) ovev += 1;
685 else nsum += pow((signal[ev] - strip->GetPedestal()), 2);
687 if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
688 else noise = AliITSChannelDaSSD::GetUndefinedValue();
689 strip->SetNoise(noise);
696 //______________________________________________________________________________
697 Bool_t AliITSHandleDaSSD::CalculateNoiseCM(AliITSModuleDaSSD *const module)
699 // Calculates Noise with CM correction
700 AliITSChannelDaSSD *strip = NULL;
704 if (!CalculateCM(module)) {
705 AliError("Error: AliITSHandleDaSSD::CalculateCM() returned kFALSE");
708 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
709 if (!(strip = module->GetStrip(strind))) continue; //return kFALSE;
710 if (!(signal = strip->GetSignal())) {
711 strip->SetNoiseCM(AliITSChannelDaSSD::GetUndefinedValue());
712 AliError(Form("SSDDAModule: Error CalculateNoiseWithoutCM(): there are no events data for module[%i] strip[%i]->GetSignal()",
713 module->GetModuleId(), strind));
714 continue; //return kFALSE;
716 Int_t chipind = strind / AliITSModuleDaSSD::GetStripsPerChip();
717 Double_t nsum = 0.0L;
719 for (Long_t ev = 0; ev < strip->GetEventsNumber(); ev++) {
720 if (SignalOutOfRange(signal[ev])) ovev += 1;
721 else nsum += pow((signal[ev] - strip->GetPedestal() - module->GetCM(chipind, ev)), 2);
723 if ((n = strip->GetEventsNumber() - ovev - 1) > 0) noise = sqrt(nsum / (Float_t)(n));
724 else noise = AliITSChannelDaSSD::GetUndefinedValue();
725 strip->SetNoiseCM(noise);
732 //______________________________________________________________________________
733 Bool_t AliITSHandleDaSSD::CalculateCM(AliITSModuleDaSSD *const module)
736 AliITSChannelDaSSD *strip = NULL;
740 module->SetNumberOfChips(AliITSModuleDaSSD::GetChipsPerModuleConst());
741 for (Int_t chipind = 0; chipind < module->GetNumberOfChips(); chipind++) {
742 stripind = chipind * module->GetStripsPerChip();
743 module->GetCM()[chipind].Set(fNumberOfEvents);
744 module->GetCM()[chipind].Reset(0.0f);
745 for (Long_t ev = 0; ev < fNumberOfEvents; ev++) {
746 // calculate firs approximation of CM.
749 for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
750 if (!(strip = module->GetStrip(strind))) continue; //return kFALSE;
751 if (!(signal = strip->GetSignal())) {
752 AliError(Form("AliITSHandleDaSSD: Error CalculateCM: there are no events data for module[%i] strip[%i]->GetSignal()",
753 module->GetModuleId(), strind));
756 if ((signal[ev] >= AliITSChannelDaSSD::GetOverflowConst()) ||
757 (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())) ovstr += 1;
758 else cm0 += (signal[ev] - strip->GetPedestal());
760 if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cm0 /= (Float_t)(n);
761 else { module->SetCM(0.0f, chipind, ev); continue; }
762 // calculate avarage (cm - (signal - pedestal)) over the chip
763 Double_t cmsigma = 0.0L;
765 for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
766 if (!(strip = module->GetStrip(strind))) continue;
767 if (!(signal = strip->GetSignal())) {
768 AliError(Form("AliITSHandleDaSSD: Error CalculateCM: there are no events data for module[%i] strip[%i]->GetSignal()\n",
769 module->GetModuleId(), strind));
772 if ((signal[ev] >= AliITSChannelDaSSD::GetOverflowConst()) ||
773 (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())) ovstr += 1;
774 else cmsigma += pow((cm0 - (signal[ev] - strip->GetPedestal())), 2);
776 if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cmsigma = sqrt(cmsigma / (Float_t)(n));
777 else { module->SetCM(0.0f, chipind, ev); continue; }
778 // calculate cm with threshold
779 Double_t cmsum = 0.0L;
781 for (Int_t strind = stripind; strind < (stripind + AliITSModuleDaSSD::GetStripsPerChip()); strind++) {
782 if (!(strip = module->GetStrip(strind))) continue;
783 signal = strip->GetSignal();
784 if ( (signal[ev] >= AliITSChannelDaSSD::GetOverflowConst())
785 || (strip->GetPedestal() == AliITSChannelDaSSD::GetUndefinedValue())
786 || (TMath::Abs(cm0 - (signal[ev] - strip->GetPedestal())) > (fCmThresholdFactor * cmsigma)) ) ovstr += 1;
787 else cmsum += (signal[ev] - strip->GetPedestal());
789 if ((n = AliITSModuleDaSSD::GetStripsPerChip() - ovstr)) cmsum /= (Float_t)(n);
791 if (!module->SetCM(cmsum, chipind, ev));
798 //______________________________________________________________________________
799 Bool_t AliITSHandleDaSSD::ProcessRawData(const Int_t nmread)
801 // Performs calculation of calibration parameters (pedestal, noise, ...)
803 if (nmread <= 0) return kFALSE;
804 if (!fModules) return kFALSE;
805 while ((nm = ReadModuleRawData(nmread)) > 0) {
806 cout << "Processing next " << nm << " modules;" << endl;
807 for (Int_t modind = fModIndProcessed; modind < fModIndRead; modind++) {
808 if (!fModules[modind]) {
809 AliError(Form("AliITSHandleDaSSD: Error ProcessRawData(): No AliITSModuleDaSSD object with index %i is allocated in AliITSHandleDaSSD\n",
813 AddFeromCm(fModules[modind]);
814 CalculatePedestal(fModules[modind]);
815 CalculateNoise(fModules[modind]);
816 CalculateNoiseCM(fModules[modind]);
821 fModIndProcessed = fModIndRead;
822 cout << fModIndProcessed << " - done" << endl;
828 //______________________________________________________________________________
829 Short_t AliITSHandleDaSSD::RetrieveModuleId(const UChar_t ddlID, const UChar_t ad, const UChar_t adc) const
831 // Retrieve ModuleId from the DDL map which is defined in AliITSRawStreamSSD class
832 if (!fDDLModuleMap) return 0;
833 Int_t mddli = ((ad - 1) * fgkNumberOfSSDModulesPerSlot) + (adc < 6 ? adc : (adc - 2));
834 if ((ddlID < fgkNumberOfSSDDDLs) && (mddli < fgkNumberOfSSDModulesPerDdl)) {
835 mddli = fDDLModuleMap[ddlID * fgkNumberOfSSDModulesPerDdl + mddli];
838 AliWarning(Form("Module index = %d or ddlID = %d is out of range 0 is rturned", ddlID, mddli));
841 if (mddli > SHRT_MAX) return SHRT_MAX;
842 else return (Short_t)mddli;
847 //______________________________________________________________________________
848 TObjArray* AliITSHandleDaSSD::GetCalibrationSSDLDC() const
850 // Fill in the array for OCDB
852 TObject *modcalibobj;
853 if (!fModules) return NULL;
854 ldcc = new TObjArray(fNumberOfModules, 0);
855 for (Int_t i = 0; i < fNumberOfModules; i++) {
860 modcalibobj = dynamic_cast<TObject*>(fModules[i]->GetCalibrationNoise());
861 ldcc->AddAt(modcalibobj, i);
868 //______________________________________________________________________________
869 Bool_t AliITSHandleDaSSD::SaveCalibrationSSDLDC(Char_t*& dafname) const
871 // Save Calibration data locally
872 TObjArray *ldcn, *ldcp, *ldcbc;
873 TObject *modobjn, *modobjp, *modobjbc;
875 TString dadatafilename("");
876 if (!fModules) return kFALSE;
877 ldcn = new TObjArray(fNumberOfModules, 0);
878 ldcn->SetName("Noise");
879 ldcp = new TObjArray(fNumberOfModules, 0);
880 ldcp->SetName("Pedestal");
881 ldcbc = new TObjArray(fNumberOfModules, 0);
882 ldcbc->SetName("BadChannels");
883 for (Int_t i = 0; i < fNumberOfModules; i++) {
888 modobjn = dynamic_cast<TObject*>(fModules[i]->GetCalibrationNoise());
889 modobjp = dynamic_cast<TObject*>(fModules[i]->GetCalibrationPedestal());
890 modobjbc = dynamic_cast<TObject*>(fModules[i]->GetCalibrationBadChannels());
891 ldcn->AddAt(modobjn, i);
892 ldcp->AddAt(modobjp, i);
893 ldcbc->AddAt(modobjbc, i);
898 if (dafname) dadatafilename.Form("%s/", dafname);
899 dadatafilename += TString::Format("ITSSSDda_%i.root", fLdcId);
900 tmpfname = new Char_t[dadatafilename.Length()+1];
901 dafname = strcpy(tmpfname, dadatafilename.Data());
902 TFile *fileRun = new TFile (dadatafilename.Data(),"RECREATE");
903 if (fileRun->IsZombie()) {
904 AliError(Form("AliITSHandleDaSSD: SaveCalibrationSSDLDC() error open file %s", dadatafilename.Data()));
912 fileRun->WriteTObject(ldcn);
913 fileRun->WriteTObject(ldcp);
914 if (fStaticBadChannelsMap) fileRun->WriteTObject(fStaticBadChannelsMap);
915 else fileRun->WriteTObject(ldcbc);
927 //______________________________________________________________________________
928 Bool_t AliITSHandleDaSSD::DumpModInfo(const Float_t meannosethreshold) const
930 // Dump calibration parameters
931 AliITSModuleDaSSD *mod;
932 AliITSChannelDaSSD *strip;
934 cout << "SSDDALDC::DumpModInfo(): Error, no modules are allocated!" << endl;
937 cout << "Modules with MeanNoise > " << meannosethreshold << endl;
938 for (Int_t i = 0; i < fNumberOfModules; i++) {
939 if (!(mod = fModules[i])) continue;
940 Float_t maxnoise = 0.0f, meannoise = 0.0f, maxped = 0.0f;
941 Int_t maxstrind = 0, novfstr = 0;
942 for (Int_t strind = 0; strind < mod->GetNumberOfStrips(); strind++) {
943 if (!(strip = mod->GetStrip(strind))) {novfstr++; continue; }
944 if (strip->GetNoiseCM() >= AliITSChannelDaSSD::GetUndefinedValue() ) {novfstr++; continue; }
945 if (maxnoise < strip->GetNoiseCM()) {
946 maxnoise = strip->GetNoiseCM();
949 meannoise = (strind - novfstr) ? meannoise + (strip->GetNoiseCM() - meannoise) / static_cast<Float_t>(strind - novfstr + 1)
950 : strip->GetNoiseCM();
951 if (TMath::Abs(maxped) < TMath::Abs(strip->GetPedestal())) maxped = strip->GetPedestal();
953 if (meannoise > meannosethreshold)
954 cout << "Mod: " << i << "; DDl: " << (int)mod->GetDdlId() << "; AD: " << (int)mod->GetAD()
955 << "; ADC: " << (int)mod->GetADC() << "; MaxPed = " << maxped
956 << "; MeanNoise = " << meannoise
957 << "; NOfStrips = " << (mod->GetNumberOfStrips() - novfstr) << endl;
964 //______________________________________________________________________________
965 Bool_t AliITSHandleDaSSD::PrintModCalibrationData(const UChar_t ddlID, const UChar_t ad, const UChar_t adc, const Char_t *fname) const
967 // Print Module calibration data whether in file on in cout
968 AliITSChannelDaSSD *strip;
971 if (!fname) { outputfile = &cout; }
973 datafile.open(fname, ios::out);
974 if (datafile.fail()) return kFALSE;
975 outputfile = dynamic_cast<ostream*>(&datafile);
977 *outputfile << "DDL = " << (int)ddlID << "; AD = " << (int)ad << "; ADC = " << (int)adc << endl;
978 for (Int_t strind = 0; strind < AliITSModuleDaSSD::GetStripsPerModuleConst(); strind++) {
979 if ( (strip = GetStrip(ddlID, ad, adc, strind)) ) {
980 *outputfile << "Str = " << strind << "; ped = " << strip->GetPedestal()
981 << "; noise = " << strip->GetNoiseCM() << endl;
985 if (datafile.is_open()) datafile.close();
991 //______________________________________________________________________________
992 void AliITSHandleDaSSD::DumpInitData(const Char_t *str) const
994 // Print general information retrieved from raw data file
995 cout << "Raw data file: " << fRawDataFileName << endl
996 << "LDC: " << (Int_t)fLdcId << "; RunId: " << fRunId << endl
997 << "Number of physics events: " << fNumberOfEvents << endl
1002 //______________________________________________________________________________
1003 Bool_t AliITSHandleDaSSD::AllocateSimulatedModules(const Int_t copymodind)
1005 // Used to allocate simulated modules to test the performance
1006 AliITSModuleDaSSD *module;
1007 UChar_t ad, adc, ddlID;
1008 ad = adc = ddlID = 0;
1009 if (!(fModules[copymodind])) return kFALSE;
1010 for (Int_t modind = 0; modind < fNumberOfModules; modind++) {
1011 if (!fModules[modind]) {
1012 module = new AliITSModuleDaSSD(AliITSModuleDaSSD::GetStripsPerModuleConst());
1013 if ((adc < 5) || ((adc > 7) && (adc < 13)) ) adc += 1;
1014 else if (adc == 5) adc = 8;
1015 else if (adc == 13) {
1017 if (ad < 8) ad += 1;
1023 if (!module->SetModuleIdData (ddlID, ad, adc, modind)) return kFALSE;
1024 fModules[modind] = module;
1025 for (Int_t strind = 0; strind < module->GetNumberOfStrips(); strind++) {
1026 AliITSChannelDaSSD *cstrip = fModules[copymodind]->GetStrip(strind);
1027 Long_t eventsnumber = cstrip->GetEventsNumber();
1028 AliITSChannelDaSSD *strip = new AliITSChannelDaSSD(strind, eventsnumber);
1029 for (Long_t evind = 0; evind < eventsnumber; evind++) {
1030 Short_t sign = *cstrip->GetSignal(evind);
1031 if (!strip->SetSignal(evind, sign)) AliError(Form("AliITSHandleDaSSD: Copy events error! mod = %i, str = %i", modind, strind));
1033 module->SetStrip(strip, strind);
1037 ddlID = fModules[modind]->GetDdlId();
1038 ad = fModules[modind]->GetAD();
1039 adc = fModules[modind]->GetADC();
1042 for (UShort_t modind = 0; modind < fNumberOfModules; modind++) fModules[modind]->SetModuleId(modind + 1080);