Index: /fact/tools/pyscripts/pyfact/calfactfits.h
===================================================================
--- /fact/tools/pyscripts/pyfact/calfactfits.h	(revision 13550)
+++ /fact/tools/pyscripts/pyfact/calfactfits.h	(revision 13551)
@@ -70,4 +70,13 @@
 	float* calib_gainmean;
 	float* calib_triggeroffsetmean;
+    // The same variables as above, but this time
+    // they are doubled in memory, so the modulo operation is not necessary.
+    // idea by TPK again
+    // since we like to work with doubles for some reason, I don't know yet
+    // I cast the float to double already in this stage.
+    
+    double* baseline;
+    double* gain;
+    double* trigger_offset;
 	//Using <vector> instead of arrays makes no visible difference
 	//ToDo: use arrays of size 1440x1024 (x2 for wrap-arounds) and read all variables into those
@@ -86,4 +95,5 @@
 			npcaldata(NULL)
 	{
+        //cout << "Constructor called" << endl;
 		//Read basic parameters of the two files
 //		std::cout << "...Reading basic file parameters..." << std::endl;
@@ -120,10 +130,36 @@
 //		std::cout << "...Reading calibration data..." << std::endl;
 		calib_baselinemean = new float[calibfile.GetN("BaselineMean")];
-		calibfile.SetPtrAddress("BaselineMean", calib_baselinemean, calibfile.GetN("BaselineMean"));
+        calibfile.SetPtrAddress("BaselineMean", calib_baselinemean, calibfile.GetN("BaselineMean"));
+        baseline = new double[calibfile.GetN("BaselineMean")*2];
+        
 		calib_gainmean = new float[calibfile.GetN("GainMean")];
 		calibfile.SetPtrAddress("GainMean", calib_gainmean, calibfile.GetN("GainMean"));
+        gain = new double[calibfile.GetN("GainMean")*2];
+        
 		calib_triggeroffsetmean = new float[calibfile.GetN("TriggerOffsetMean")];
 		calibfile.SetPtrAddress("TriggerOffsetMean", calib_triggeroffsetmean, calibfile.GetN("TriggerOffsetMean"));
-		calibfile.GetRow(0);
+		trigger_offset = new double[calibfile.GetN("TriggerOffsetMean")];
+        
+        calibfile.GetRow(0);
+        
+        for (int i = 0; i < (int)calibfile.GetN("BaselineMean"); ++i)
+        {
+            baseline[i] = double(calib_baselinemean[i]) *4096./2000.;
+            baseline[i+(int)calibfile.GetN("BaselineMean")] = double(calib_baselinemean[i]) *4096./2000.; 
+        }
+        
+        for (int i = 0; i < (int)calibfile.GetN("GainMean"); ++i)
+        {
+            gain[i] = double(calib_gainmean[i]) * 1907.35;
+            gain[i+(int)calibfile.GetN("GainMean")] = double(calib_gainmean[i]) * 1907.35 *4096. /2000.;            
+        }
+        
+        for (int i = 0; i < (int)calibfile.GetN("TriggerOffsetMean"); ++i)
+        {
+            trigger_offset[i] = double(calib_triggeroffsetmean[i])*4096./2000.;
+            trigger_offset[i+(int)calibfile.GetN("TriggerOffsetMean")] = double(calib_triggeroffsetmean[i])*4096./2000.;
+        }
+        
+        
 		
 		//Set the event pointers
@@ -144,10 +180,24 @@
 	~CalFactFits() //Standard destructor
 	{
+        //cout << "Destructor called       " << endl;
+        //cout << "calib_baselinemean      " << calib_baselinemean << endl;
+		//cout << "calib_gainmean          " << calib_gainmean << endl;
+		//cout << "calib_triggeroffsetmean " << calib_triggeroffsetmean << endl;
+		//cout << "event_data              " << event_data << endl;
+		//cout << "event_offset            " << event_offset << endl;
+		//cout << "event_boardtimes        " << event_boardtimes << endl;
+		//cout << "baseline                " << baseline << endl;
+		//cout << "gain                    " << gain << endl;
+		//cout << "trigger_offset          " << trigger_offset << endl;
+		
 		delete[] calib_baselinemean;
 		delete[] calib_gainmean;
-		delete[] calib_triggeroffsetmean;
+		//delete[] calib_triggeroffsetmean;
 		delete[] event_data;
 		delete[] event_offset;
 		delete[] event_boardtimes;
+        delete[] baseline;
+        //delete[] gain;
+        delete[] trigger_offset;
 	}
 	
@@ -170,8 +220,15 @@
 		else {
 			UInt_t drs_calib_offset;
-			for(UInt_t pixel=0;pixel<data_npix;pixel++) {
-				for(UInt_t slice=0;slice<data_nroi;slice++) {
-					drs_calib_offset = (slice+event_offset[pixel])%calib_blm_size;
-					npcaldata[pixel*data_nroi+slice] = double((event_data[pixel*data_nroi+slice]*2000./4096.-calib_baselinemean[pixel*calib_blm_size+drs_calib_offset]-calib_triggeroffsetmean[pixel*data_nroi+slice])/calib_gainmean[pixel*calib_blm_size+drs_calib_offset]*1907.35);
+            double raw, raw_bsl, shifted;
+			for(UInt_t pixel = 0; pixel < data_npix; pixel++)
+            {
+				for(UInt_t slice = 0; slice < data_nroi; slice++)
+                {
+					drs_calib_offset = slice + event_offset[pixel];
+                    raw = (double)event_data[pixel*data_nroi+slice];
+                    raw_bsl = raw - baseline[pixel*calib_blm_size+drs_calib_offset];
+                    shifted = raw_bsl - trigger_offset[pixel*data_nroi+slice];
+					npcaldata[pixel*data_nroi+slice] = shifted / gain[pixel*calib_blm_size+drs_calib_offset];
+                    //npcaldata[pixel*data_nroi+slice] = double((event_data[pixel*data_nroi+slice]*2000./4096.-calib_baselinemean[pixel*calib_blm_size+drs_calib_offset]-calib_triggeroffsetmean[pixel*data_nroi+slice])/calib_gainmean[pixel*calib_blm_size+drs_calib_offset]*1907.35);
 					//Note: data_nroi=calib_nroi, calib_blm_size=calib_gm_size
 				}
